diff --git a/.idea/.name b/.idea/.name
index ea3e61b..ca48adf 100644
--- a/.idea/.name
+++ b/.idea/.name
@@ -1 +1 @@
-support (jetpack)
\ No newline at end of file
+support (master)
\ No newline at end of file
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 7b2174e..7dc4050 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -46,6 +46,8 @@
 
 $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/android-support-v*)
 $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/support.aidl)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/android-support-customtabs_intermediates/src/)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/android-support-annotations_intermediates)
 
 # ************************************************
 # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
diff --git a/OWNERS b/OWNERS
index 0de3634..3126105 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1,6 +1,7 @@
 adamp@google.com
 alanv@google.com
 aurimas@google.com
+chet@google.com
 ccraik@google.com
 clarabayarri@google.com
 ilake@google.com
diff --git a/README.md b/README.md
index d34ea7e..f6cdb65 100644
--- a/README.md
+++ b/README.md
@@ -29,12 +29,19 @@
 
 If you see any warnings (red underlines) run `Build > Clean Project`.
 
-## Optional - Full Build
+## Builds
+### Full Build (Optional)
 You can do most of your work from Android Studio, however you can also build the full support library from command line:
 
     cd path/to/checkout/frameworks/support/
     ./gradlew createArchive
 
+### Building Support Library as part of your App build
+If you intend to repeatedly make changes to Support Library and to wish to see
+the results in your app, and you don't want to have to repeatedly build them as
+separate Gradle projects, you can
+[configure your app build to build Support Library too](adding-support-library-as-included-build.md)
+
 ## Running Tests
 
 ### Single Test Class or Method
diff --git a/adding-support-library-as-included-build.md b/adding-support-library-as-included-build.md
new file mode 100644
index 0000000..136929f
--- /dev/null
+++ b/adding-support-library-as-included-build.md
@@ -0,0 +1,32 @@
+# Adding the Support Library Build Within Another Build
+
+Would you like to make a change in Support Library and have it be propagated to
+your downstream Gradle build (generally an app) without having to separately
+build Support Library and then build your application?
+
+## To build Support Library as part of your existing Gradle build
+*   To add the Support Library build
+    *   Add `apply(from: '<support-lib-repo-root>/frameworks/support/include-support-library.gradle')`
+        to your settings.gradle
+        *   See [include-support-library.gradle](include-support-library.gradle)
+            for more information
+*   If your project is an Android app, also update some dependencies:
+    *   Open your local.properties file and update the value of `sdk.dir` .
+        *   It should point to `<support-lib-repo-root>/prebuilts/fullsdk-<platform>` .
+        *   For example, `~/support-library/prebuilts/fullsdk-linux` .
+    *   In your build.gradle, update any versions that refer to previous versions of
+        Support Library.
+        *   To determine the correct version, find the SDK with the highest
+            number among SDKs in the Support Library repo.
+
+                echo <support-lib-repo-root>/prebuilts/fullsdk-linux/platforms/android* | xargs -n 1 echo | sed 's/.*android-//' | tail -n 1
+
+            This should output, for example, "28"
+
+        *   Update dependency versions
+            *   For example, you may want to replace
+                `com.android.support:app-compat-v7:26.0.2` with
+                `com.android.support:app-compat-v7:28.0.2`
+        *   Update configuration given to the Android Gradle plugin
+            *   Check `compileSdkVersion` and make sure its version is correct
+
diff --git a/annotations/Android.mk b/annotations/Android.mk
deleted file mode 100644
index 684a77a..0000000
--- a/annotations/Android.mk
+++ /dev/null
@@ -1,23 +0,0 @@
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-annotations
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/app-toolkit/.idea/.name b/app-toolkit/.idea/.name
index 47bffed..3a1feaa 100644
--- a/app-toolkit/.idea/.name
+++ b/app-toolkit/.idea/.name
@@ -1 +1 @@
-app-toolkit (jetpack)
\ No newline at end of file
+app-toolkit (master)
\ No newline at end of file
diff --git a/app-toolkit/settings.gradle b/app-toolkit/settings.gradle
index 43237a4..18176de 100644
--- a/app-toolkit/settings.gradle
+++ b/app-toolkit/settings.gradle
@@ -113,10 +113,5 @@
 // External
 //
 /////////////////////////////
-if (inAppToolkitProject) {
-    File externalRoot = new File(supportRoot, '../../external')
 
-    includeBuild new File(externalRoot, 'doclava')
-
-    includeBuild new File(externalRoot, 'jdiff')
-}
+apply(from: new File(supportRoot, 'include-composite-deps.gradle'))
diff --git a/build.gradle b/build.gradle
index 84753dd..0307507 100644
--- a/build.gradle
+++ b/build.gradle
@@ -49,6 +49,8 @@
 
 init.setupRelease()
 
+apply from: 'buildSrc/jetify.gradle'
+
 init.enableDoclavaAndJDiff(this, new DacOptions("android/support", "SUPPORT_DATA"))
 
 ///// FLATFOOT START
diff --git a/buildSrc/build_dependencies.gradle b/buildSrc/build_dependencies.gradle
index f693884..73cdf37 100644
--- a/buildSrc/build_dependencies.gradle
+++ b/buildSrc/build_dependencies.gradle
@@ -16,7 +16,7 @@
 
 def build_versions = [:]
 
-build_versions.kotlin = '1.2.0'
+build_versions.kotlin = '1.2.20'
 
 rootProject.ext['build_versions'] = build_versions
 
diff --git a/buildSrc/dependencies.gradle b/buildSrc/dependencies.gradle
index fe664e0..baf1ba0 100644
--- a/buildSrc/dependencies.gradle
+++ b/buildSrc/dependencies.gradle
@@ -17,12 +17,7 @@
 def libs = [:]
 
 libs.exclude_annotations_transitive = {
-    exclude module: 'support-annotations'
-    transitive = true
-}
-
-libs.exclude_annotations_transitive = {
-    exclude module: 'support-annotations'
+    exclude group: 'com.android.support'
     transitive = true
 }
 
diff --git a/buildSrc/jetify.gradle b/buildSrc/jetify.gradle
new file mode 100644
index 0000000..6fdc5eb
--- /dev/null
+++ b/buildSrc/jetify.gradle
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 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.
+ */
+def standaloneProject = project(":jetifier-standalone")
+def jetifierBin = file("${standaloneProject.buildDir}/install/jetifier-standalone/bin/jetifier-standalone")
+
+task jetifyArchive(type: Exec) {
+    description "Produces a zip of jetified artifacts by running Jetifier against top-of-tree*.zip" +
+            " This task only exists to enable dejetifyArchive to have a realistic archive to test " +
+            " with. This task should be deleted once Jetpack exists."
+
+    dependsOn tasks['createArchive']
+    dependsOn ':jetifier-standalone:installDist'
+    inputs.file project.tasks['createArchive'].archivePath
+
+    outputs.file "${buildDir}/top-of-tree-m2-repository-jetified-${project.ext.buildNumber}.zip"
+
+    commandLine ("bash", "-c",
+        "if ${jetifierBin} -s -outputfile ${outputs.files.singleFile} -i ${inputs.files.singleFile}; then\n" +
+        "  echo success;\n" +
+        "else\n" +
+        "  echo jetifyArchive was not expected to work anyway. Ask jeffrygaston@ or pavlis@ to make it work.\n" +
+        "  exit 1\n" +
+        "fi")
+}
+
+task dejetifyArchive(type: Exec) {
+    description "Produces a zip of dejetified artifacts by running Dejetifier against jetified" +
+            " artifacts, for temporary usage by external clients that haven't upgraded to Jetpack" +
+            " yet."
+
+    dependsOn tasks['jetifyArchive']
+    inputs.file project.tasks['jetifyArchive'].outputs.files.singleFile
+
+    outputs.file "${buildDir}/top-of-tree-m2-repository-dejetified-${project.ext.buildNumber}.zip"
+
+
+    commandLine ("${jetifierBin}", "-s", "-outputfile", "${outputs.files.singleFile}",  "-i", "${inputs.files.singleFile}")
+}
+
diff --git a/buildSrc/src/main/kotlin/android/support/LibraryGroups.kt b/buildSrc/src/main/kotlin/android/support/LibraryGroups.kt
index 9c983bb..170462d 100644
--- a/buildSrc/src/main/kotlin/android/support/LibraryGroups.kt
+++ b/buildSrc/src/main/kotlin/android/support/LibraryGroups.kt
@@ -27,4 +27,6 @@
     const val ARCH_CORE = "android.arch.core"
     const val PAGING = "android.arch.paging"
     const val NAVIGATION = "android.arch.navigation"
+    const val SLICES = "androidx.app.slice"
+    const val JETIFIER = "com.android.support.jetifier"
 }
diff --git a/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt b/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt
index a7dd4c4..1d091e1 100644
--- a/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt
@@ -23,7 +23,7 @@
     /**
      * Version code of the support library components.
      */
-    val SUPPORT_LIBRARY = Version("27.1.0-SNAPSHOT")
+    val SUPPORT_LIBRARY = Version("28.0.0-SNAPSHOT")
 
     /**
      * Version code for Room
@@ -76,4 +76,9 @@
      * Version code for shared testing code of flatfoot
      */
     val ARCH_CORE_TESTING = ARCH_CORE
+
+    /**
+     * Version code for Jetifier
+     */
+    val JETIFIER = Version("0.2.0")
 }
diff --git a/buildSrc/src/main/kotlin/android/support/SupportConfig.kt b/buildSrc/src/main/kotlin/android/support/SupportConfig.kt
index b3f0bb0..42b298c 100644
--- a/buildSrc/src/main/kotlin/android/support/SupportConfig.kt
+++ b/buildSrc/src/main/kotlin/android/support/SupportConfig.kt
@@ -24,7 +24,7 @@
     const val DEFAULT_MIN_SDK_VERSION = 14
     const val INSTRUMENTATION_RUNNER = "android.support.test.runner.AndroidJUnitRunner"
     const val BUILD_TOOLS_VERSION = "27.0.3"
-    const val CURRENT_SDK_VERSION = 27
+    const val CURRENT_SDK_VERSION = 28
 
     fun getKeystore(project: Project): File {
         val supportRoot = (project.rootProject.property("ext") as ExtraPropertiesExtension)
diff --git a/buildSrc/src/main/kotlin/android/support/dependencies/Dependencies.kt b/buildSrc/src/main/kotlin/android/support/dependencies/Dependencies.kt
index ea9edf9..76a1e7f 100644
--- a/buildSrc/src/main/kotlin/android/support/dependencies/Dependencies.kt
+++ b/buildSrc/src/main/kotlin/android/support/dependencies/Dependencies.kt
@@ -30,7 +30,8 @@
 const val JAVAPOET = "com.squareup:javapoet:1.8.0"
 const val JSR250 = "javax.annotation:javax.annotation-api:1.2"
 const val JUNIT = "junit:junit:4.12"
-const val KOTLIN_STDLIB = "org.jetbrains.kotlin:kotlin-stdlib:1.2.0"
+const val KOTLIN_STDLIB = "org.jetbrains.kotlin:kotlin-stdlib:1.2.20"
+const val KOTLIN_METADATA = "me.eugeniomarletti:kotlin-metadata:1.2.1"
 const val LINT = "com.android.tools.lint:lint:26.0.0"
 const val MOCKITO_CORE = "org.mockito:mockito-core:2.7.6"
 const val MULTIDEX = "com.android.support:multidex:1.0.1"
diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/SupportKotlinLibraryPlugin.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/SupportKotlinLibraryPlugin.properties
new file mode 100644
index 0000000..d93c20a
--- /dev/null
+++ b/buildSrc/src/main/resources/META-INF/gradle-plugins/SupportKotlinLibraryPlugin.properties
@@ -0,0 +1 @@
+implementation-class=android.support.SupportKotlinLibraryPlugin
diff --git a/car/Android.mk b/car/Android.mk
index d96733d..6e9eb05 100644
--- a/car/Android.mk
+++ b/car/Android.mk
@@ -18,12 +18,7 @@
 # Applications that use this library must specify
 #
 #   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-car\
-#       android-support-design \
-#       android-support-v4 \
-#       android-support-v7-appcompat \
-#       android-support-v7-cardview \
-#       android-support-v7-recyclerview
+#       $(ANDROID_SUPPORT_CAR_TARGETS)
 #
 # in their makefiles to include the resources and their dependencies in their package.
 include $(CLEAR_VARS)
@@ -34,13 +29,11 @@
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
 LOCAL_JAVA_LIBRARIES := \
-        android-support-annotations
+    android-support-annotations
 LOCAL_SHARED_ANDROID_LIBRARIES := \
-        android-support-design \
-        android-support-v4 \
-        android-support-v7-appcompat \
-        android-support-v7-cardview \
-        android-support-v7-recyclerview
+    $(ANDROID_SUPPORT_DESIGN_TARGETS) \
+    android-support-media-compat \
+    android-support-v7-cardview
 LOCAL_JAR_EXCLUDE_FILES := none
 LOCAL_JAVA_LANGUAGE_VERSION := 1.8
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
diff --git a/car/build.gradle b/car/build.gradle
index 90d68f9..163300d 100644
--- a/car/build.gradle
+++ b/car/build.gradle
@@ -9,7 +9,7 @@
 dependencies {
     api project(':appcompat-v7')
     api project(':cardview-v7')
-    api project(':design')
+    api("com.android.support:design:28.0.0-SNAPSHOT", { transitive = false })
     api project(':support-annotations')
     api project(':support-v4')
     api project(':recyclerview-v7')
diff --git a/car/res/drawable/car_card_ripple_background.xml b/car/res/drawable/car_card_ripple_background.xml
index 6d3ad3e..ca20e0f 100644
--- a/car/res/drawable/car_card_ripple_background.xml
+++ b/car/res/drawable/car_card_ripple_background.xml
@@ -16,4 +16,8 @@
   -->
 <ripple
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="@color/car_card_ripple_background" />
\ No newline at end of file
+    android:color="@color/car_card_ripple_background">
+    <item
+        android:id="@android:id/mask"
+        android:drawable="@android:color/white" />
+</ripple>
diff --git a/car/res/drawable/car_card_ripple_background_day.xml b/car/res/drawable/car_card_ripple_background_day.xml
index a4370e9..880ff7a 100644
--- a/car/res/drawable/car_card_ripple_background_day.xml
+++ b/car/res/drawable/car_card_ripple_background_day.xml
@@ -16,4 +16,8 @@
   -->
 <ripple
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="@color/car_card_ripple_background_dark" />
\ No newline at end of file
+    android:color="@color/car_card_ripple_background_dark">
+    <item
+        android:id="@android:id/mask"
+        android:drawable="@android:color/white" />
+</ripple>
diff --git a/car/res/drawable/car_card_ripple_background_inverse.xml b/car/res/drawable/car_card_ripple_background_inverse.xml
index 3c07ecf..e063e2c 100644
--- a/car/res/drawable/car_card_ripple_background_inverse.xml
+++ b/car/res/drawable/car_card_ripple_background_inverse.xml
@@ -16,4 +16,8 @@
   -->
 <ripple
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="@color/car_card_ripple_background_inverse" />
\ No newline at end of file
+    android:color="@color/car_card_ripple_background_inverse" >
+    <item
+        android:id="@android:id/mask"
+        android:drawable="@android:color/white" />
+</ripple>
diff --git a/car/res/drawable/car_card_ripple_background_night.xml b/car/res/drawable/car_card_ripple_background_night.xml
index c1b03c1..5d4f2c6 100644
--- a/car/res/drawable/car_card_ripple_background_night.xml
+++ b/car/res/drawable/car_card_ripple_background_night.xml
@@ -16,4 +16,8 @@
   -->
 <ripple
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="@color/car_card_ripple_background_light" />
\ No newline at end of file
+    android:color="@color/car_card_ripple_background_light">
+    <item
+        android:id="@android:id/mask"
+        android:drawable="@android:color/white" />
+</ripple>
diff --git a/car/res/layout/car_alert_dialog.xml b/car/res/layout/car_alert_dialog.xml
new file mode 100644
index 0000000..63dc70c
--- /dev/null
+++ b/car/res/layout/car_alert_dialog.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 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.
+-->
+
+<!-- Note: the width is 0dp because ColumnCardView will automatically set a width based
+     on the number of columns it should take up. See ColumnCardView for more details. -->
+<androidx.car.widget.ColumnCardView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_gravity="center"
+    android:layout_width="0dp"
+    android:layout_height="wrap_content"
+    android:elevation="@dimen/car_dialog_elevation"
+    app:cardBackgroundColor="@color/car_card"
+    app:cardCornerRadius="@dimen/car_radius_3">
+
+    <LinearLayout
+        android:id="@+id/content_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/car_keyline_1"
+        android:layout_marginEnd="@dimen/car_keyline_1"
+        android:paddingTop="@dimen/car_padding_4"
+        android:paddingBottom="@dimen/car_padding_4"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/car_dialog_header_height"
+            android:textAppearance="@style/CarTitle2"
+            android:gravity="center_vertical|start"
+            android:maxLines="1"
+            android:ellipsize="end"
+            android:visibility="gone" />
+
+        <TextView
+            android:id="@+id/body"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textAppearance="@style/CarBody2"
+            android:visibility="gone" />
+
+        <LinearLayout
+            android:id="@+id/button_panel"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/car_dialog_action_bar_height"
+            android:layout_marginTop="@dimen/car_padding_2"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:visibility="gone">
+
+            <Button
+                android:id="@+id/positive_button"
+                android:layout_marginEnd="@dimen/car_padding_4"
+                android:layout_width="wrap_content"
+                android:minWidth="0dp"
+                android:padding="0dp"
+                android:textColor="@color/car_accent"
+                android:visibility="gone"
+                style="@style/Widget.Car.Button.Borderless.Colored" />
+
+            <Button
+                android:id="@+id/negative_button"
+                android:layout_width="wrap_content"
+                android:minWidth="0dp"
+                android:padding="0dp"
+                android:textColor="@color/car_accent"
+                android:visibility="gone"
+                style="@style/Widget.Car.Button.Borderless.Colored" />
+        </LinearLayout>
+    </LinearLayout>
+</androidx.car.widget.ColumnCardView>
diff --git a/car/res/layout/car_list_item_text_content.xml b/car/res/layout/car_list_item_text_content.xml
index 943c489..d560ffe 100644
--- a/car/res/layout/car_list_item_text_content.xml
+++ b/car/res/layout/car_list_item_text_content.xml
@@ -19,7 +19,7 @@
     android:id="@+id/container"
     android:layout_width="wrap_content"
     android:layout_height="match_parent"
-    android:foreground="@drawable/car_card_ripple_background">
+    android:background="@drawable/car_card_ripple_background">
     <!-- Primary Action. -->
     <ImageView
         android:id="@+id/primary_icon"
diff --git a/car/res/values/dimens.xml b/car/res/values/dimens.xml
index d397df0..389bed9 100644
--- a/car/res/values/dimens.xml
+++ b/car/res/values/dimens.xml
@@ -103,6 +103,7 @@
     <!-- Dialogs -->
     <dimen name="car_dialog_header_height">@dimen/car_card_header_height</dimen>
     <dimen name="car_dialog_action_bar_height">@dimen/car_card_action_bar_height</dimen>
+    <dimen name="car_dialog_elevation">16dp</dimen>
 
     <!-- Slide Up Menu -->
     <dimen name="car_slide_up_menu_initial_height">76dp</dimen>
diff --git a/car/src/androidTest/java/androidx/car/widget/PagedListViewTest.java b/car/src/androidTest/java/androidx/car/widget/PagedListViewTest.java
index fe56a71..cbb1e1b 100644
--- a/car/src/androidTest/java/androidx/car/widget/PagedListViewTest.java
+++ b/car/src/androidTest/java/androidx/car/widget/PagedListViewTest.java
@@ -89,11 +89,14 @@
 
     private PagedListViewTestActivity mActivity;
     private PagedListView mPagedListView;
+    private ViewGroup.MarginLayoutParams mRecyclerViewLayoutParams;
 
     @Before
     public void setUp() {
         mActivity = mActivityRule.getActivity();
         mPagedListView = mActivity.findViewById(R.id.paged_list_view);
+        mRecyclerViewLayoutParams =
+                (ViewGroup.MarginLayoutParams) mPagedListView.getRecyclerView().getLayoutParams();
 
         // Using deprecated Espresso methods instead of calling it on the IdlingRegistry because
         // the latter does not seem to work as reliably. Specifically, on the latter, it does
@@ -382,6 +385,23 @@
     }
 
     @Test
+    public void testSwipingScrollbarDoesNotScrollList() {
+        if (!isAutoDevice()) {
+            return;
+        }
+
+        // Just need enough items to ensure the scroll bar is showing.
+        setUpPagedListView(ITEMS_PER_PAGE * 10);
+
+        // Swipe on the filler instead of the whole scrollbar because buttons at top/bottom set
+        // OnLongClickListener and thus eat the motion event.
+        onView(withId(R.id.filler)).perform(swipeUp());
+        assertThat(((LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager())
+                        .findFirstCompletelyVisibleItemPosition(),
+                is(equalTo(0)));
+    }
+
+    @Test
     public void testSetGutterNone() {
         if (!isAutoDevice()) {
             return;
@@ -392,8 +412,8 @@
 
         mPagedListView.setGutter(PagedListView.Gutter.NONE);
 
-        assertThat(mPagedListView.getRecyclerView().getPaddingStart(), is(equalTo(0)));
-        assertThat(mPagedListView.getRecyclerView().getPaddingEnd(), is(equalTo(0)));
+        assertThat(mRecyclerViewLayoutParams.getMarginStart(), is(equalTo(0)));
+        assertThat(mRecyclerViewLayoutParams.getMarginEnd(), is(equalTo(0)));
     }
 
     @Test
@@ -410,8 +430,8 @@
         Resources res = InstrumentationRegistry.getContext().getResources();
         int gutterSize = res.getDimensionPixelSize(R.dimen.car_margin);
 
-        assertThat(mPagedListView.getRecyclerView().getPaddingStart(), is(equalTo(gutterSize)));
-        assertThat(mPagedListView.getRecyclerView().getPaddingEnd(), is(equalTo(0)));
+        assertThat(mRecyclerViewLayoutParams.getMarginStart(), is(equalTo(gutterSize)));
+        assertThat(mRecyclerViewLayoutParams.getMarginEnd(), is(equalTo(0)));
     }
 
     @Test
@@ -428,8 +448,8 @@
         Resources res = InstrumentationRegistry.getContext().getResources();
         int gutterSize = res.getDimensionPixelSize(R.dimen.car_margin);
 
-        assertThat(mPagedListView.getRecyclerView().getPaddingStart(), is(equalTo(0)));
-        assertThat(mPagedListView.getRecyclerView().getPaddingEnd(), is(equalTo(gutterSize)));
+        assertThat(mRecyclerViewLayoutParams.getMarginStart(), is(equalTo(0)));
+        assertThat(mRecyclerViewLayoutParams.getMarginEnd(), is(equalTo(gutterSize)));
     }
 
     @Test
@@ -446,8 +466,8 @@
         Resources res = InstrumentationRegistry.getContext().getResources();
         int gutterSize = res.getDimensionPixelSize(R.dimen.car_margin);
 
-        assertThat(mPagedListView.getRecyclerView().getPaddingStart(), is(equalTo(gutterSize)));
-        assertThat(mPagedListView.getRecyclerView().getPaddingEnd(), is(equalTo(gutterSize)));
+        assertThat(mRecyclerViewLayoutParams.getMarginStart(), is(equalTo(gutterSize)));
+        assertThat(mRecyclerViewLayoutParams.getMarginEnd(), is(equalTo(gutterSize)));
     }
 
     @Test
@@ -462,8 +482,8 @@
         mPagedListView.setGutter(PagedListView.Gutter.NONE);
         mPagedListView.setGutterSize(120);
 
-        assertThat(mPagedListView.getRecyclerView().getPaddingStart(), is(equalTo(0)));
-        assertThat(mPagedListView.getRecyclerView().getPaddingEnd(), is(equalTo(0)));
+        assertThat(mRecyclerViewLayoutParams.getMarginStart(), is(equalTo(0)));
+        assertThat(mRecyclerViewLayoutParams.getMarginEnd(), is(equalTo(0)));
     }
 
     @Test
@@ -480,8 +500,8 @@
         int gutterSize = 120;
         mPagedListView.setGutterSize(gutterSize);
 
-        assertThat(mPagedListView.getRecyclerView().getPaddingStart(), is(equalTo(gutterSize)));
-        assertThat(mPagedListView.getRecyclerView().getPaddingEnd(), is(equalTo(0)));
+        assertThat(mRecyclerViewLayoutParams.getMarginStart(), is(equalTo(gutterSize)));
+        assertThat(mRecyclerViewLayoutParams.getMarginEnd(), is(equalTo(0)));
     }
 
     @Test
@@ -498,8 +518,8 @@
         int gutterSize = 120;
         mPagedListView.setGutterSize(gutterSize);
 
-        assertThat(mPagedListView.getRecyclerView().getPaddingStart(), is(equalTo(0)));
-        assertThat(mPagedListView.getRecyclerView().getPaddingEnd(), is(equalTo(gutterSize)));
+        assertThat(mRecyclerViewLayoutParams.getMarginStart(), is(equalTo(0)));
+        assertThat(mRecyclerViewLayoutParams.getMarginEnd(), is(equalTo(gutterSize)));
     }
 
     @Test
@@ -516,8 +536,8 @@
         int gutterSize = 120;
         mPagedListView.setGutterSize(gutterSize);
 
-        assertThat(mPagedListView.getRecyclerView().getPaddingStart(), is(equalTo(gutterSize)));
-        assertThat(mPagedListView.getRecyclerView().getPaddingEnd(), is(equalTo(gutterSize)));
+        assertThat(mRecyclerViewLayoutParams.getMarginStart(), is(equalTo(gutterSize)));
+        assertThat(mRecyclerViewLayoutParams.getMarginEnd(), is(equalTo(gutterSize)));
     }
 
     @Test
diff --git a/car/src/main/java/androidx/car/app/CarAlertDialog.java b/car/src/main/java/androidx/car/app/CarAlertDialog.java
new file mode 100644
index 0000000..6a85546
--- /dev/null
+++ b/car/src/main/java/androidx/car/app/CarAlertDialog.java
@@ -0,0 +1,546 @@
+/*
+ * Copyright (C) 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.car.app;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
+import android.text.TextUtils;
+import android.view.MotionEvent;
+import android.view.TouchDelegate;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.widget.Button;
+import android.widget.TextView;
+
+import androidx.car.R;
+
+/**
+ * A subclass of {@link Dialog} that is tailored for the car environment. This dialog can display a
+ * title text, body text, and up to two buttons -- a positive and negative button. There is no
+ * affordance for displaying a custom view or list of content, differentiating it from a regular
+ * {@code AlertDialog}.
+ */
+public class CarAlertDialog extends Dialog {
+    private final DialogData mData;
+
+    private final int mTopPadding;
+    private final int mBottomPadding;
+    private final int mButtonMinWidth;
+    private final int mButtonSpacing;
+
+    private View mContentView;
+    private TextView mTitleView;
+    private TextView mBodyView;
+
+    private View mButtonPanel;
+    private Button mPositiveButton;
+    private Button mNegativeButton;
+    private ButtonPanelTouchDelegate mButtonPanelTouchDelegate;
+
+    private CarAlertDialog(Context context, DialogData data) {
+        super(context);
+        mData = data;
+
+        Resources res = context.getResources();
+        mTopPadding = res.getDimensionPixelSize(R.dimen.car_padding_4);
+        mBottomPadding = res.getDimensionPixelSize(R.dimen.car_padding_4);
+        mButtonMinWidth = res.getDimensionPixelSize(R.dimen.car_button_min_width);
+        mButtonSpacing = res.getDimensionPixelSize(R.dimen.car_padding_4);
+    }
+
+    @Override
+    public void setTitle(CharSequence title) {
+        // Ideally this method should be private; the dialog should only be modifiable through the
+        // Builder. Unfortunately, this method is defined with the Dialog itself and is public.
+        // So, throw an error if this method is ever called. setTitleInternal() should be used
+        // to set the title within this class.
+        throw new UnsupportedOperationException("Title should only be set from the Builder");
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        Window window = getWindow();
+        window.setContentView(R.layout.car_alert_dialog);
+
+        // By default, the decor background is white. Set this to be transparent so that
+        // the dialog can have rounded corners and will show the background.
+        window.getDecorView().setBackgroundColor(Color.TRANSPARENT);
+
+        initializeViews();
+        initializeDialogWithData();
+    }
+
+    private void setTitleInternal(CharSequence title) {
+        boolean hasTitle = !TextUtils.isEmpty(title);
+
+        mTitleView.setText(title);
+        mTitleView.setVisibility(hasTitle ? View.VISIBLE : View.GONE);
+
+        // If there's a title, then remove the padding at the top of the content view.
+        int topPadding = hasTitle ? 0 : mTopPadding;
+        mContentView.setPaddingRelative(
+                mContentView.getPaddingStart(),
+                topPadding,
+                mContentView.getPaddingEnd(),
+                mContentView.getPaddingBottom());
+    }
+
+    private void setBody(CharSequence body) {
+        mBodyView.setText(body);
+        mBodyView.setVisibility(TextUtils.isEmpty(body) ? View.GONE : View.VISIBLE);
+    }
+
+    private void setPositiveButton(CharSequence text) {
+        boolean showButton = !TextUtils.isEmpty(text);
+
+        mPositiveButton.setText(text);
+        mPositiveButton.setVisibility(showButton ? View.VISIBLE : View.GONE);
+
+        updateTargetTargetForButton(mPositiveButton);
+        updateButtonPanelVisibility();
+        updateButtonSpacing();
+    }
+
+    private void setNegativeButton(CharSequence text) {
+        mNegativeButton.setText(text);
+        mNegativeButton.setVisibility(TextUtils.isEmpty(text) ? View.GONE : View.VISIBLE);
+
+        updateTargetTargetForButton(mNegativeButton);
+        updateButtonPanelVisibility();
+        updateButtonSpacing();
+    }
+
+    /**
+     * Checks if the given view that represents a positive or negative button currently meets the
+     * minimum touch target size that is dictated by {@link #mButtonMinWidth}. If it does not, then
+     * this method will utilize a {@link TouchDelegate} to expand the touch target size of that
+     * button.
+     *
+     * @param button One of {@link #mPositiveButton} or {@link #mNegativeButton}.
+     */
+    private void updateTargetTargetForButton(View button) {
+        if (button != mPositiveButton && button != mNegativeButton) {
+            throw new IllegalArgumentException("Method must be passed one of mPositiveButton or "
+                    + "mNegativeButton");
+        }
+
+        if (button.getVisibility() != View.VISIBLE) {
+            return;
+        }
+
+        // The TouchDelegate needs to be set after the panel has been laid out in order to get the
+        // hit Rect.
+        mButtonPanel.post(() -> {
+            Rect rect = new Rect();
+            button.getHitRect(rect);
+
+            int hitWidth = Math.abs(rect.right - rect.left);
+
+            TouchDelegate touchDelegate = null;
+
+            // If the button does not meet the minimum requirements for touch target size, then
+            // expand its hit area with a TouchDelegate.
+            if (hitWidth < mButtonMinWidth) {
+                int amountToIncrease = (mButtonMinWidth - hitWidth) / 2;
+                rect.left -= amountToIncrease;
+                rect.right += amountToIncrease;
+
+                touchDelegate = new TouchDelegate(rect, button);
+            }
+
+            if (button == mPositiveButton) {
+                mButtonPanelTouchDelegate.setPositiveButtonDelegate(touchDelegate);
+            } else {
+                mButtonPanelTouchDelegate.setNegativeButtonDelegate(touchDelegate);
+            }
+        });
+    }
+
+    /**
+     * Checks if spacing should be added between the positive and negative button. The spacing is
+     * only needed if both buttons are visible.
+     */
+    private void updateButtonSpacing() {
+        int marginEnd;
+
+        // If both buttons are visible, then there needs to be spacing between them.
+        if ((mPositiveButton.getVisibility() == View.VISIBLE
+                && mNegativeButton.getVisibility() == View.VISIBLE)) {
+            marginEnd = mButtonSpacing;
+        } else {
+            marginEnd = 0;
+        }
+
+        ViewGroup.MarginLayoutParams layoutParams =
+                (ViewGroup.MarginLayoutParams) mPositiveButton.getLayoutParams();
+        layoutParams.setMarginEnd(marginEnd);
+        mPositiveButton.requestLayout();
+    }
+
+    /**
+     * Toggles whether or not the panel containing the action buttons are visible depending on if
+     * a button should be shown.
+     */
+    private void updateButtonPanelVisibility() {
+        boolean hasButtons = mPositiveButton.getVisibility() == View.VISIBLE
+                || mNegativeButton.getVisibility() == View.VISIBLE;
+
+        int visibility = hasButtons ? View.VISIBLE : View.GONE;
+
+        // Visibility is already correct, so nothing further needs to be done.
+        if (mButtonPanel.getVisibility() == visibility) {
+            return;
+        }
+
+        mButtonPanel.setVisibility(visibility);
+
+        // If there are buttons, then remove the padding at the bottom of the content view.
+        int buttonPadding = hasButtons ? 0 : mBottomPadding;
+        mContentView.setPaddingRelative(
+                mContentView.getPaddingStart(),
+                mContentView.getPaddingTop(),
+                mContentView.getPaddingEnd(),
+                buttonPadding);
+    }
+
+    /**
+     * Looks through the {@link DialogData} that was passed to this dialog and initialize its
+     * contents based on what data is present.
+     */
+    private void initializeDialogWithData() {
+        setTitleInternal(mData.mTitle);
+        setBody(mData.mBody);
+        setPositiveButton(mData.mPositiveButtonText);
+        setNegativeButton(mData.mNegativeButtonText);
+    }
+
+    /**
+     * Initializes the views within the dialog that are modifiable based on the data that has been
+     * set on it. Also responsible for hooking up listeners for button clicks.
+     */
+    private void initializeViews() {
+        Window window = getWindow();
+
+        mContentView = window.findViewById(R.id.content_view);
+        mTitleView = window.findViewById(R.id.title);
+        mBodyView = window.findViewById(R.id.body);
+
+        mButtonPanel = window.findViewById(R.id.button_panel);
+        mButtonPanelTouchDelegate = new ButtonPanelTouchDelegate(mButtonPanel);
+        mButtonPanel.setTouchDelegate(mButtonPanelTouchDelegate);
+
+        mPositiveButton = window.findViewById(R.id.positive_button);
+        mNegativeButton = window.findViewById(R.id.negative_button);
+
+        mPositiveButton.setOnClickListener(v -> onPositiveButtonClick());
+        mNegativeButton.setOnClickListener(v -> onNegativeButtonClick());
+    }
+
+    /** Delegates to a listener on the positive button if it exists or dismisses the dialog. */
+    private void onPositiveButtonClick() {
+        if (mData.mPositiveButtonListener != null) {
+            mData.mPositiveButtonListener.onClick(this /* dialog */, BUTTON_POSITIVE);
+        } else {
+            dismiss();
+        }
+    }
+
+    /** Delegates to a listener on the negative button if it exists or dismisses the dialog. */
+    private void onNegativeButtonClick() {
+        if (mData.mNegativeButtonListener != null) {
+            mData.mNegativeButtonListener.onClick(this /* dialog */, BUTTON_NEGATIVE);
+        } else {
+            dismiss();
+        }
+    }
+
+    /**
+     * A composite {@link TouchDelegate} for a button panel that has two buttons. It can hold
+     * multiple {@code TouchDelegate}s and will delegate out touch events to each.
+     */
+    private static final class ButtonPanelTouchDelegate extends TouchDelegate {
+        @Nullable private TouchDelegate mPositiveButtonDelegate;
+        @Nullable private TouchDelegate mNegativeButtonDelegate;
+
+        ButtonPanelTouchDelegate(View view) {
+            super(new Rect(), view);
+        }
+
+        public void setPositiveButtonDelegate(@Nullable TouchDelegate delegate) {
+            mPositiveButtonDelegate = delegate;
+        }
+
+        public void setNegativeButtonDelegate(@Nullable TouchDelegate delegate) {
+            mNegativeButtonDelegate = delegate;
+        }
+
+        @Override
+        public boolean onTouchEvent(MotionEvent event) {
+            boolean result = false;
+            float x = event.getX();
+            float y = event.getY();
+            event.setLocation(x, y);
+
+            if (mPositiveButtonDelegate != null) {
+                result = mPositiveButtonDelegate.onTouchEvent(event);
+            }
+
+            if (mNegativeButtonDelegate != null) {
+                result |= mNegativeButtonDelegate.onTouchEvent(event);
+            }
+
+            return result;
+        }
+    }
+
+    /**
+     * A class that holds the data that is settable by the {@link Builder} and should be displayed
+     * in the {@link CarAlertDialog}.
+     */
+    private static class DialogData {
+        private CharSequence mTitle;
+        private CharSequence mBody;
+        private CharSequence mPositiveButtonText;
+        private OnClickListener mPositiveButtonListener;
+        private CharSequence mNegativeButtonText;
+        private OnClickListener mNegativeButtonListener;
+    }
+
+    /**
+     * Builder class that can be used to create a {@link CarAlertDialog} by configuring the options
+     * for what shows up in the resulting dialog.
+     */
+    public static class Builder {
+        private final Context mContext;
+        private final DialogData mDialogData;
+
+        private boolean mCancelable = true;
+        private OnCancelListener mOnCancelListener;
+        private OnDismissListener mOnDismissListener;
+
+        /**
+         * Creates a new instance of the {@code Builder}.
+         *
+         * @param context The {@code Context} that the dialog is to be created in.
+         */
+        public Builder(Context context) {
+            mContext = context;
+            mDialogData = new DialogData();
+        }
+
+        /**
+         * Sets the main title of the dialog to be the given string resource.
+         *
+         * @param titleId The resource id of the string to be used as the title.
+         * @return This {@code Builder} object to allow for chaining of calls.
+         */
+        public Builder setTitle(@StringRes int titleId) {
+            mDialogData.mTitle = mContext.getString(titleId);
+            return this;
+        }
+
+        /**
+         * Sets the main title of the dialog for be the given string.
+         *
+         * @param title The string to be used as the title.
+         * @return This {@code Builder} object to allow for chaining of calls.
+         */
+        public Builder setTitle(CharSequence title) {
+            mDialogData.mTitle = title;
+            return this;
+        }
+
+        /**
+         * Sets the body text of the dialog to be the given string resource.
+         *
+         * @param bodyId The resource id of the string to be used as the body text.
+         * @return This {@code Builder} object to allow for chaining of calls.
+         */
+        public Builder setBody(@StringRes int bodyId) {
+            mDialogData.mBody = mContext.getString(bodyId);
+            return this;
+        }
+
+        /**
+         * Sets the body text of the dialog to be the given string.
+         *
+         * @param body The string to be used as the body text.
+         * @return This {@code Builder} object to allow for chaining of calls.
+         */
+        public Builder setBody(CharSequence body) {
+            mDialogData.mBody = body;
+            return this;
+        }
+
+        /**
+         * Sets the text of the positive button and the listener that will be invoked when the
+         * button is pressed. If a listener is not provided, then the dialog will dismiss itself
+         * when the positive button is clicked.
+         *
+         * <p>The positive button should be used to accept and continue with the action (e.g.
+         * an "OK" action).
+         *
+         * @param textId The resource id of the string to be used for the positive button text.
+         * @param listener A {@link OnClickListener} to be invoked when the button is clicked. Can
+         *                 be {@code null} to represent no listener.
+         * @return This {@code Builder} object to allow for chaining of calls.
+         */
+        public Builder setPositiveButton(@StringRes int textId,
+                @Nullable OnClickListener listener) {
+            mDialogData.mPositiveButtonText = mContext.getString(textId);
+            mDialogData.mPositiveButtonListener = listener;
+            return this;
+        }
+
+        /**
+         * Sets the text of the positive button and the listener that will be invoked when the
+         * button is pressed. If a listener is not provided, then the dialog will dismiss itself
+         * when the positive button is clicked.
+         *
+         * <p>The positive button should be used to accept and continue with the action (e.g.
+         * an "OK" action).
+         *
+         * @param text The string to be used for the positive button text.
+         * @param listener A {@link OnClickListener} to be invoked when the button is clicked. Can
+         *                 be {@code null} to represent no listener.
+         * @return This {@code Builder} object to allow for chaining of calls.
+         */
+        public Builder setPositiveButton(CharSequence text, @Nullable OnClickListener listener) {
+            mDialogData.mPositiveButtonText = text;
+            mDialogData.mPositiveButtonListener = listener;
+            return this;
+        }
+
+        /**
+         * Sets the text of the negative button and the listener that will be invoked when the
+         * button is pressed. If a listener is not provided, then the dialog will dismiss itself
+         * when the negative button is clicked.
+         *
+         * <p>The negative button should be used to cancel any actions the dialog represents.
+         *
+         * @param textId The resource id of the string to be used for the negative button text.
+         * @param listener A {@link OnClickListener} to be invoked when the button is clicked. Can
+         *                 be {@code null} to represent no listener.
+         * @return This {@code Builder} object to allow for chaining of calls.
+         */
+        public Builder setNegativeButton(@StringRes int textId,
+                @Nullable OnClickListener listener) {
+            mDialogData.mNegativeButtonText = mContext.getString(textId);
+            mDialogData.mNegativeButtonListener = listener;
+            return this;
+        }
+
+        /**
+         * Sets the text of the negative button and the listener that will be invoked when the
+         * button is pressed. If a listener is not provided, then the dialog will dismiss itself
+         * when the negative button is clicked.
+         *
+         * <p>The negative button should be used to cancel any actions the dialog represents.
+         *
+         * @param text The string to be used for the negative button text.
+         * @param listener A {@link OnClickListener} to be invoked when the button is clicked. Can
+         *                 be {@code null} to represent no listener.
+         * @return This {@code Builder} object to allow for chaining of calls.
+         */
+        public Builder setNegativeButton(CharSequence text, @Nullable OnClickListener listener) {
+            mDialogData.mNegativeButtonText = text;
+            mDialogData.mNegativeButtonListener = listener;
+            return this;
+        }
+
+        /**
+         * Sets whether the dialog is cancelable or not. Default is {@code true}.
+         *
+         * @return This {@code Builder} object to allow for chaining of calls.
+         */
+        public Builder setCancelable(boolean cancelable) {
+            mCancelable = cancelable;
+            return this;
+        }
+
+        /**
+         * Sets the callback that will be called if the dialog is canceled.
+         *
+         * <p>Even in a cancelable dialog, the dialog may be dismissed for reasons other than
+         * being canceled or one of the supplied choices being selected.
+         * If you are interested in listening for all cases where the dialog is dismissed
+         * and not just when it is canceled, see {@link #setOnDismissListener(OnDismissListener)}.
+         *
+         * @param onCancelListener The listener to be invoked when this dialog is canceled.
+         * @return This {@code Builder} object to allow for chaining of calls.
+         *
+         * @see #setCancelable(boolean)
+         * @see #setOnDismissListener(OnDismissListener)
+         */
+        public Builder setOnCancelListener(OnCancelListener onCancelListener) {
+            mOnCancelListener = onCancelListener;
+            return this;
+        }
+
+        /**
+         * Sets the callback that will be called when the dialog is dismissed for any reason.
+         *
+         * @return This {@code Builder} object to allow for chaining of calls.
+         */
+        public Builder setOnDismissListener(OnDismissListener onDismissListener) {
+            mOnDismissListener = onDismissListener;
+            return this;
+        }
+
+        /**
+         * Creates an {@link CarAlertDialog} with the arguments supplied to this {@code Builder}.
+         *
+         * <p>Calling this method does not display the dialog. If no additional processing is
+         * needed, {@link #show()} may be called instead to both create and display the dialog.
+         */
+        public CarAlertDialog create() {
+            CarAlertDialog dialog = new CarAlertDialog(mContext, mDialogData);
+
+            dialog.setCancelable(mCancelable);
+            dialog.setCanceledOnTouchOutside(mCancelable);
+            dialog.setOnCancelListener(mOnCancelListener);
+            dialog.setOnDismissListener(mOnDismissListener);
+
+            return dialog;
+        }
+
+        /**
+         * Creates an {@link CarAlertDialog} with the arguments supplied to this {@code Builder}
+         * and immediately displays the dialog.
+         *
+         * <p>Calling this method is functionally identical to:
+         * <pre>
+         *     CarAlertDialog dialog = new CarAlertDialog.Builder().create();
+         *     dialog.show();
+         * </pre>
+         */
+        public CarAlertDialog show() {
+            CarAlertDialog dialog = create();
+            dialog.show();
+            return dialog;
+        }
+    }
+}
diff --git a/car/src/main/java/androidx/car/widget/PagedListView.java b/car/src/main/java/androidx/car/widget/PagedListView.java
index 654cba9..1f0f9df 100644
--- a/car/src/main/java/androidx/car/widget/PagedListView.java
+++ b/car/src/main/java/androidx/car/widget/PagedListView.java
@@ -296,12 +296,6 @@
             mRecyclerView.addItemDecoration(new TopOffsetDecoration(listContentTopMargin));
         }
 
-        // Set this to true so that this view consumes clicks events and views underneath
-        // don't receive this click event. Without this it's possible to click places in the
-        // view that don't capture the event, and as a result, elements visually hidden consume
-        // the event.
-        setClickable(true);
-
         // Set focusable false explicitly to handle the behavior change in Android O where
         // clickable view becomes focusable by default.
         setFocusable(false);
@@ -391,19 +385,24 @@
     public void setGutter(@Gutter int gutter) {
         mGutter = gutter;
 
-        int startPadding = 0;
-        int endPadding = 0;
+        int startMargin = 0;
+        int endMargin = 0;
         if ((mGutter & Gutter.START) != 0) {
-            startPadding = mGutterSize;
+            startMargin = mGutterSize;
         }
         if ((mGutter & Gutter.END) != 0) {
-            endPadding = mGutterSize;
+            endMargin = mGutterSize;
         }
-        mRecyclerView.setPaddingRelative(startPadding, 0, endPadding, 0);
+        MarginLayoutParams layoutParams = (MarginLayoutParams) mRecyclerView.getLayoutParams();
+        layoutParams.setMarginStart(startMargin);
+        layoutParams.setMarginEnd(endMargin);
+        // requestLayout() isn't sufficient because we also need to resolveLayoutParams().
+        mRecyclerView.setLayoutParams(layoutParams);
 
         // If there's a gutter, set ClipToPadding to false so that CardView's shadow will still
         // appear outside of the padding.
-        mRecyclerView.setClipToPadding(startPadding == 0 && endPadding == 0);
+        mRecyclerView.setClipToPadding(startMargin == 0 && endMargin == 0);
+
     }
 
     /**
diff --git a/compat/Android.mk b/compat/Android.mk
deleted file mode 100644
index 720a1eb..0000000
--- a/compat/Android.mk
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (C) 2011 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-compat
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-compat
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/src/main/java
-LOCAL_SRC_FILES := \
-    $(call all-java-files-under,src/main/java) \
-    $(call all-Iaidl-files-under,src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_STATIC_JAVA_LIBRARIES := \
-    apptoolkit-arch-core-common \
-    apptoolkit-lifecycle-common \
-    apptoolkit-lifecycle-runtime
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/compat/api/27.1.0.txt b/compat/api/27.1.0.txt
new file mode 100644
index 0000000..81a85b8
--- /dev/null
+++ b/compat/api/27.1.0.txt
@@ -0,0 +1,2421 @@
+package android.support.v13.view {
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View, android.support.v13.view.DragStartHelper.OnDragStartListener);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point);
+    method public boolean onLongClick(android.view.View);
+    method public boolean onTouch(android.view.View, android.view.MotionEvent);
+  }
+
+  public static abstract interface DragStartHelper.OnDragStartListener {
+    method public abstract boolean onDragStart(android.view.View, android.support.v13.view.DragStartHelper);
+  }
+
+}
+
+package android.support.v13.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor public EditorInfoCompat();
+    method public static java.lang.String[] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, java.lang.String[]);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, android.support.v13.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, android.support.v13.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    field public static int INPUT_CONTENT_GRANT_READ_URI_PERMISSION;
+  }
+
+  public static abstract interface InputConnectionCompat.OnCommitContentListener {
+    method public abstract boolean onCommitContent(android.support.v13.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public java.lang.Object unwrap();
+    method public static android.support.v13.view.inputmethod.InputContentInfoCompat wrap(java.lang.Object);
+  }
+
+}
+
+package android.support.v4.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static java.lang.String capabilityToString(int);
+    method public static java.lang.String feedbackTypeToString(int);
+    method public static java.lang.String flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static java.lang.String loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package android.support.v4.app {
+
+  public class ActivityCompat extends android.support.v4.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public static android.net.Uri getReferrer(android.app.Activity);
+    method public static deprecated boolean invalidateOptionsMenu(android.app.Activity);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static android.support.v13.view.DragAndDropPermissionsCompat requestDragAndDropPermissions(android.app.Activity, android.view.DragEvent);
+    method public static void requestPermissions(android.app.Activity, java.lang.String[], int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
+    method public static void setExitSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
+    method public static void setPermissionCompatDelegate(android.support.v4.app.ActivityCompat.PermissionCompatDelegate);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, java.lang.String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static abstract interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
+  }
+
+  public static abstract interface ActivityCompat.PermissionCompatDelegate {
+    method public abstract boolean onActivityResult(android.app.Activity, int, int, android.content.Intent);
+    method public abstract boolean requestPermissions(android.app.Activity, java.lang.String[], int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect getLaunchBounds();
+    method public static android.support.v4.app.ActivityOptionsCompat makeBasic();
+    method public static android.support.v4.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static android.support.v4.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static android.support.v4.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
+    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.support.v4.util.Pair<android.view.View, java.lang.String>...);
+    method public static android.support.v4.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static android.support.v4.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public android.support.v4.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect);
+    method public android.os.Bundle toBundle();
+    method public void update(android.support.v4.app.ActivityOptionsCompat);
+    field public static final java.lang.String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final java.lang.String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int noteOp(android.content.Context, java.lang.String, int, java.lang.String);
+    method public static int noteOpNoThrow(android.content.Context, java.lang.String, int, java.lang.String);
+    method public static int noteProxyOp(android.content.Context, java.lang.String, java.lang.String);
+    method public static int noteProxyOpNoThrow(android.content.Context, java.lang.String, java.lang.String);
+    method public static java.lang.String permissionToOp(java.lang.String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder getBinder(android.os.Bundle, java.lang.String);
+    method public static void putBinder(android.os.Bundle, java.lang.String, android.os.IBinder);
+  }
+
+  public abstract class JobIntentService extends android.app.Service {
+    ctor public JobIntentService();
+    method public static void enqueueWork(android.content.Context, java.lang.Class, int, android.content.Intent);
+    method public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method public boolean isStopped();
+    method public android.os.IBinder onBind(android.content.Intent);
+    method protected abstract void onHandleWork(android.content.Intent);
+    method public boolean onStopCurrentWork();
+    method public void setInterruptIfStopped(boolean);
+  }
+
+  public class NotificationCompat {
+    ctor public NotificationCompat();
+    method public static android.support.v4.app.NotificationCompat.Action getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static int getBadgeIconType(android.app.Notification);
+    method public static java.lang.String getCategory(android.app.Notification);
+    method public static java.lang.String getChannelId(android.app.Notification);
+    method public static android.os.Bundle getExtras(android.app.Notification);
+    method public static java.lang.String getGroup(android.app.Notification);
+    method public static int getGroupAlertBehavior(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static java.lang.String getShortcutId(android.app.Notification);
+    method public static java.lang.String getSortKey(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final java.lang.String CATEGORY_ALARM = "alarm";
+    field public static final java.lang.String CATEGORY_CALL = "call";
+    field public static final java.lang.String CATEGORY_EMAIL = "email";
+    field public static final java.lang.String CATEGORY_ERROR = "err";
+    field public static final java.lang.String CATEGORY_EVENT = "event";
+    field public static final java.lang.String CATEGORY_MESSAGE = "msg";
+    field public static final java.lang.String CATEGORY_PROGRESS = "progress";
+    field public static final java.lang.String CATEGORY_PROMO = "promo";
+    field public static final java.lang.String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final java.lang.String CATEGORY_REMINDER = "reminder";
+    field public static final java.lang.String CATEGORY_SERVICE = "service";
+    field public static final java.lang.String CATEGORY_SOCIAL = "social";
+    field public static final java.lang.String CATEGORY_STATUS = "status";
+    field public static final java.lang.String CATEGORY_SYSTEM = "sys";
+    field public static final java.lang.String CATEGORY_TRANSPORT = "transport";
+    field public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final java.lang.String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final java.lang.String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final java.lang.String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final java.lang.String EXTRA_MESSAGES = "android.messages";
+    field public static final java.lang.String EXTRA_PEOPLE = "android.people";
+    field public static final java.lang.String EXTRA_PICTURE = "android.picture";
+    field public static final java.lang.String EXTRA_PROGRESS = "android.progress";
+    field public static final java.lang.String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final java.lang.String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final java.lang.String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final java.lang.String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final java.lang.String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final java.lang.String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final java.lang.String EXTRA_SMALL_ICON = "android.icon";
+    field public static final java.lang.String EXTRA_SUB_TEXT = "android.subText";
+    field public static final java.lang.String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final java.lang.String EXTRA_TEMPLATE = "android.template";
+    field public static final java.lang.String EXTRA_TEXT = "android.text";
+    field public static final java.lang.String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final java.lang.String EXTRA_TITLE = "android.title";
+    field public static final java.lang.String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field public static final deprecated int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, java.lang.CharSequence, android.app.PendingIntent);
+    method public android.app.PendingIntent getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public android.support.v4.app.RemoteInput[] getDataOnlyRemoteInputs();
+    method public android.os.Bundle getExtras();
+    method public int getIcon();
+    method public android.support.v4.app.RemoteInput[] getRemoteInputs();
+    method public java.lang.CharSequence getTitle();
+    field public android.app.PendingIntent actionIntent;
+    field public int icon;
+    field public java.lang.CharSequence title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent);
+    ctor public NotificationCompat.Action.Builder(android.support.v4.app.NotificationCompat.Action);
+    method public android.support.v4.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle);
+    method public android.support.v4.app.NotificationCompat.Action.Builder addRemoteInput(android.support.v4.app.RemoteInput);
+    method public android.support.v4.app.NotificationCompat.Action build();
+    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Extender);
+    method public android.os.Bundle getExtras();
+    method public android.support.v4.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+  }
+
+  public static abstract interface NotificationCompat.Action.Extender {
+    method public abstract android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements android.support.v4.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(android.support.v4.app.NotificationCompat.Action);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender clone();
+    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
+    method public java.lang.CharSequence getCancelLabel();
+    method public java.lang.CharSequence getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method public java.lang.CharSequence getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(android.support.v4.app.NotificationCompat.Builder);
+    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.BigPictureStyle setBigContentTitle(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.BigPictureStyle setSummaryText(java.lang.CharSequence);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(android.support.v4.app.NotificationCompat.Builder);
+    method public android.support.v4.app.NotificationCompat.BigTextStyle bigText(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.BigTextStyle setBigContentTitle(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.BigTextStyle setSummaryText(java.lang.CharSequence);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor public NotificationCompat.Builder(android.content.Context, java.lang.String);
+    ctor public deprecated NotificationCompat.Builder(android.content.Context);
+    method public android.support.v4.app.NotificationCompat.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.Builder addAction(android.support.v4.app.NotificationCompat.Action);
+    method public android.support.v4.app.NotificationCompat.Builder addExtras(android.os.Bundle);
+    method public android.support.v4.app.NotificationCompat.Builder addPerson(java.lang.String);
+    method public android.app.Notification build();
+    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Extender);
+    method public android.os.Bundle getExtras();
+    method public deprecated android.app.Notification getNotification();
+    method protected static java.lang.CharSequence limitCharSequenceLength(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setBadgeIconType(int);
+    method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setChannelId(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setColor(int);
+    method public android.support.v4.app.NotificationCompat.Builder setColorized(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setContent(android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setContentInfo(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.Builder setContentText(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setContentTitle(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setDefaults(int);
+    method public android.support.v4.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.Builder setExtras(android.os.Bundle);
+    method public android.support.v4.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setGroup(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setGroupAlertBehavior(int);
+    method public android.support.v4.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.Builder setLights(int, int, int);
+    method public android.support.v4.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setNumber(int);
+    method public android.support.v4.app.NotificationCompat.Builder setOngoing(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setPriority(int);
+    method public android.support.v4.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setPublicVersion(android.app.Notification);
+    method public android.support.v4.app.NotificationCompat.Builder setRemoteInputHistory(java.lang.CharSequence[]);
+    method public android.support.v4.app.NotificationCompat.Builder setShortcutId(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int);
+    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public android.support.v4.app.NotificationCompat.Builder setSortKey(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri);
+    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri, int);
+    method public android.support.v4.app.NotificationCompat.Builder setStyle(android.support.v4.app.NotificationCompat.Style);
+    method public android.support.v4.app.NotificationCompat.Builder setSubText(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setTimeoutAfter(long);
+    method public android.support.v4.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setVibrate(long[]);
+    method public android.support.v4.app.NotificationCompat.Builder setVisibility(int);
+    method public android.support.v4.app.NotificationCompat.Builder setWhen(long);
+    field public deprecated java.util.ArrayList<java.lang.String> mPeople;
+  }
+
+  public static final class NotificationCompat.CarExtender implements android.support.v4.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
+    method public int getColor();
+    method public android.graphics.Bitmap getLargeIcon();
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation getUnreadConversation();
+    method public android.support.v4.app.NotificationCompat.CarExtender setColor(int);
+    method public android.support.v4.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.CarExtender setUnreadConversation(android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation);
+  }
+
+  public static class NotificationCompat.CarExtender.UnreadConversation {
+    method public long getLatestTimestamp();
+    method public java.lang.String[] getMessages();
+    method public java.lang.String getParticipant();
+    method public java.lang.String[] getParticipants();
+    method public android.app.PendingIntent getReadPendingIntent();
+    method public android.support.v4.app.RemoteInput getRemoteInput();
+    method public android.app.PendingIntent getReplyPendingIntent();
+  }
+
+  public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor public NotificationCompat.CarExtender.UnreadConversation.Builder(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent, android.support.v4.app.RemoteInput);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static abstract interface NotificationCompat.Extender {
+    method public abstract android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
+  }
+
+  public static class NotificationCompat.InboxStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(android.support.v4.app.NotificationCompat.Builder);
+    method public android.support.v4.app.NotificationCompat.InboxStyle addLine(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.InboxStyle setBigContentTitle(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.InboxStyle setSummaryText(java.lang.CharSequence);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.MessagingStyle(java.lang.CharSequence);
+    method public void addCompatExtras(android.os.Bundle);
+    method public android.support.v4.app.NotificationCompat.MessagingStyle addMessage(java.lang.CharSequence, long, java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.MessagingStyle addMessage(android.support.v4.app.NotificationCompat.MessagingStyle.Message);
+    method public static android.support.v4.app.NotificationCompat.MessagingStyle extractMessagingStyleFromNotification(android.app.Notification);
+    method public java.lang.CharSequence getConversationTitle();
+    method public java.util.List<android.support.v4.app.NotificationCompat.MessagingStyle.Message> getMessages();
+    method public java.lang.CharSequence getUserDisplayName();
+    method public android.support.v4.app.NotificationCompat.MessagingStyle setConversationTitle(java.lang.CharSequence);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(java.lang.CharSequence, long, java.lang.CharSequence);
+    method public java.lang.String getDataMimeType();
+    method public android.net.Uri getDataUri();
+    method public android.os.Bundle getExtras();
+    method public java.lang.CharSequence getSender();
+    method public java.lang.CharSequence getText();
+    method public long getTimestamp();
+    method public android.support.v4.app.NotificationCompat.MessagingStyle.Message setData(java.lang.String, android.net.Uri);
+  }
+
+  public static abstract class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method public android.app.Notification build();
+    method public void setBuilder(android.support.v4.app.NotificationCompat.Builder);
+  }
+
+  public static final class NotificationCompat.WearableExtender implements android.support.v4.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public android.support.v4.app.NotificationCompat.WearableExtender addAction(android.support.v4.app.NotificationCompat.Action);
+    method public android.support.v4.app.NotificationCompat.WearableExtender addActions(java.util.List<android.support.v4.app.NotificationCompat.Action>);
+    method public android.support.v4.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method public android.support.v4.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification>);
+    method public android.support.v4.app.NotificationCompat.WearableExtender clearActions();
+    method public android.support.v4.app.NotificationCompat.WearableExtender clearPages();
+    method public android.support.v4.app.NotificationCompat.WearableExtender clone();
+    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
+    method public java.util.List<android.support.v4.app.NotificationCompat.Action> getActions();
+    method public android.graphics.Bitmap getBackground();
+    method public java.lang.String getBridgeTag();
+    method public int getContentAction();
+    method public int getContentIcon();
+    method public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method public int getCustomContentHeight();
+    method public int getCustomSizePreset();
+    method public java.lang.String getDismissalId();
+    method public android.app.PendingIntent getDisplayIntent();
+    method public int getGravity();
+    method public boolean getHintAmbientBigPicture();
+    method public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method public boolean getHintHideIcon();
+    method public int getHintScreenTimeout();
+    method public boolean getHintShowBackgroundOnly();
+    method public java.util.List<android.app.Notification> getPages();
+    method public boolean getStartScrollBottom();
+    method public android.support.v4.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setBridgeTag(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setContentAction(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setDismissalId(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setGravity(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field public static final int SIZE_DEFAULT = 0; // 0x0
+    field public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field public static final int SIZE_LARGE = 4; // 0x4
+    field public static final int SIZE_MEDIUM = 3; // 0x3
+    field public static final int SIZE_SMALL = 2; // 0x2
+    field public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final java.lang.String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final java.lang.String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final java.lang.String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final java.lang.String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final java.lang.String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final java.lang.String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(java.lang.String, int, java.lang.String);
+    method public abstract void cancelAll(java.lang.String);
+    method public abstract void notify(java.lang.String, int, java.lang.String, android.app.Notification);
+    method public android.os.IBinder onBind(android.content.Intent);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(java.lang.String, int);
+    method public void cancelAll();
+    method public static android.support.v4.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public void notify(int, android.app.Notification);
+    method public void notify(java.lang.String, int, android.app.Notification);
+    field public static final java.lang.String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final java.lang.String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(android.support.v4.app.RemoteInput, android.content.Intent, java.util.Map<java.lang.String, android.net.Uri>);
+    method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String> getAllowedDataTypes();
+    method public java.lang.CharSequence[] getChoices();
+    method public static java.util.Map<java.lang.String, android.net.Uri> getDataResultsFromIntent(android.content.Intent, java.lang.String);
+    method public android.os.Bundle getExtras();
+    method public java.lang.CharSequence getLabel();
+    method public java.lang.String getResultKey();
+    method public static android.os.Bundle getResultsFromIntent(android.content.Intent);
+    method public boolean isDataOnly();
+    field public static final java.lang.String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final java.lang.String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(java.lang.String);
+    method public android.support.v4.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public android.support.v4.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public android.support.v4.app.RemoteInput.Builder setAllowDataType(java.lang.String, boolean);
+    method public android.support.v4.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public android.support.v4.app.RemoteInput.Builder setChoices(java.lang.CharSequence[]);
+    method public android.support.v4.app.RemoteInput.Builder setLabel(java.lang.CharSequence);
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  public final class ShareCompat {
+    method public static void configureMenuItem(android.view.MenuItem, android.support.v4.app.ShareCompat.IntentBuilder);
+    method public static void configureMenuItem(android.view.Menu, int, android.support.v4.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName getCallingActivity(android.app.Activity);
+    method public static java.lang.String getCallingPackage(android.app.Activity);
+    field public static final java.lang.String EXTRA_CALLING_ACTIVITY = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final java.lang.String EXTRA_CALLING_PACKAGE = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method public static android.support.v4.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(java.lang.CharSequence);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(int);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailBcc(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailCc(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailTo(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setHtmlText(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setStream(android.net.Uri);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setSubject(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setText(java.lang.CharSequence);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setType(java.lang.String);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    method public static android.support.v4.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName getCallingActivity();
+    method public android.graphics.drawable.Drawable getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable getCallingApplicationIcon();
+    method public java.lang.CharSequence getCallingApplicationLabel();
+    method public java.lang.String getCallingPackage();
+    method public java.lang.String[] getEmailBcc();
+    method public java.lang.String[] getEmailCc();
+    method public java.lang.String[] getEmailTo();
+    method public java.lang.String getHtmlText();
+    method public android.net.Uri getStream();
+    method public android.net.Uri getStream(int);
+    method public int getStreamCount();
+    method public java.lang.String getSubject();
+    method public java.lang.CharSequence getText();
+    method public java.lang.String getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
+    method public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
+    method public void onMapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String, android.view.View>);
+    method public void onRejectSharedElements(java.util.List<android.view.View>);
+    method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
+    method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String>, java.util.List<android.view.View>, android.support.v4.app.SharedElementCallback.OnSharedElementsReadyListener);
+  }
+
+  public static abstract interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public abstract void onSharedElementsReady();
+  }
+
+}
+
+package android.support.v4.content {
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.support.v4.os.CancellationSignal);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, java.lang.String);
+    method public static android.content.Context createDeviceProtectedStorageContext(android.content.Context);
+    method public static java.io.File getCodeCacheDir(android.content.Context);
+    method public static int getColor(android.content.Context, int);
+    method public static android.content.res.ColorStateList getColorStateList(android.content.Context, int);
+    method public static java.io.File getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable getDrawable(android.content.Context, int);
+    method public static java.io.File[] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File[] getExternalFilesDirs(android.content.Context, java.lang.String);
+    method public static java.io.File getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File[] getObbDirs(android.content.Context);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent[]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent[], android.os.Bundle);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
+    field public static final java.lang.String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final java.lang.String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+  }
+
+  public final deprecated class SharedPreferencesCompat {
+  }
+
+  public static final deprecated class SharedPreferencesCompat.EditorCompat {
+    method public deprecated void apply(android.content.SharedPreferences.Editor);
+    method public static deprecated android.support.v4.content.SharedPreferencesCompat.EditorCompat getInstance();
+  }
+
+}
+
+package android.support.v4.content.pm {
+
+  public final deprecated class ActivityInfoCompat {
+    field public static final deprecated int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName getActivity();
+    method public java.lang.CharSequence getDisabledMessage();
+    method public java.lang.String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent[] getIntents();
+    method public java.lang.CharSequence getLongLabel();
+    method public java.lang.CharSequence getShortLabel();
+    method public android.content.pm.ShortcutInfo toShortcutInfo();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, java.lang.String);
+    method public android.support.v4.content.pm.ShortcutInfoCompat build();
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(java.lang.CharSequence);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIcon(android.support.v4.graphics.drawable.IconCompat);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent[]);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setLongLabel(java.lang.CharSequence);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setShortLabel(java.lang.CharSequence);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, android.support.v4.content.pm.ShortcutInfoCompat);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean requestPinShortcut(android.content.Context, android.support.v4.content.pm.ShortcutInfoCompat, android.content.IntentSender);
+  }
+
+}
+
+package android.support.v4.content.res {
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  public final class ResourcesCompat {
+    method public static int getColor(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList getColorStateList(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable getDrawable(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable getDrawableForDensity(android.content.res.Resources, int, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.Typeface getFont(android.content.Context, int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, int, android.support.v4.content.res.ResourcesCompat.FontCallback, android.os.Handler) throws android.content.res.Resources.NotFoundException;
+  }
+
+  public static abstract class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method public abstract void onFontRetrievalFailed(int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+}
+
+package android.support.v4.database {
+
+  public final deprecated class DatabaseUtilsCompat {
+    method public static deprecated java.lang.String[] appendSelectionArgs(java.lang.String[], java.lang.String[]);
+    method public static deprecated java.lang.String concatenateWhere(java.lang.String, java.lang.String);
+  }
+
+}
+
+package android.support.v4.graphics {
+
+  public final class BitmapCompat {
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, java.lang.String);
+  }
+
+}
+
+package android.support.v4.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, 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 static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method public static deprecated void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+    method public static <T extends android.graphics.drawable.Drawable> T unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
+  }
+
+  public class IconCompat {
+    method public static android.support.v4.graphics.drawable.IconCompat createWithAdaptiveBitmap(android.graphics.Bitmap);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithBitmap(android.graphics.Bitmap);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithContentUri(java.lang.String);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithContentUri(android.net.Uri);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithData(byte[], int, int);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithResource(android.content.Context, int);
+    method public android.graphics.drawable.Icon toIcon();
+  }
+
+}
+
+package android.support.v4.hardware.display {
+
+  public abstract class DisplayManagerCompat {
+    method public abstract android.view.Display getDisplay(int);
+    method public abstract android.view.Display[] getDisplays();
+    method public abstract android.view.Display[] getDisplays(java.lang.String);
+    method public static android.support.v4.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package android.support.v4.hardware.fingerprint {
+
+  public final class FingerprintManagerCompat {
+    method public void authenticate(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject, int, android.support.v4.os.CancellationSignal, android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler);
+    method public static android.support.v4.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method public boolean hasEnrolledFingerprints();
+    method public boolean isHardwareDetected();
+  }
+
+  public static abstract class FingerprintManagerCompat.AuthenticationCallback {
+    ctor public FingerprintManagerCompat.AuthenticationCallback();
+    method public void onAuthenticationError(int, java.lang.CharSequence);
+    method public void onAuthenticationFailed();
+    method public void onAuthenticationHelp(int, java.lang.CharSequence);
+    method public void onAuthenticationSucceeded(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult);
+  }
+
+  public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor public FingerprintManagerCompat.AuthenticationResult(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject);
+    method public android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject getCryptoObject();
+  }
+
+  public static class FingerprintManagerCompat.CryptoObject {
+    ctor public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method public javax.crypto.Cipher getCipher();
+    method public javax.crypto.Mac getMac();
+    method public java.security.Signature getSignature();
+  }
+
+}
+
+package android.support.v4.net {
+
+  public final class ConnectivityManagerCompat {
+    method public static android.net.NetworkInfo getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  public final class TrafficStatsCompat {
+    method public static deprecated void clearThreadStatsTag();
+    method public static deprecated int getThreadStatsTag();
+    method public static deprecated void incrementOperationCount(int);
+    method public static deprecated void incrementOperationCount(int, int);
+    method public static deprecated void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method public static deprecated void tagSocket(java.net.Socket) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method public static deprecated void untagSocket(java.net.Socket) throws java.net.SocketException;
+  }
+
+}
+
+package android.support.v4.os {
+
+  public class BuildCompat {
+    method public static deprecated boolean isAtLeastN();
+    method public static deprecated boolean isAtLeastNMR1();
+    method public static deprecated boolean isAtLeastO();
+    method public static deprecated boolean isAtLeastOMR1();
+    method public static boolean isAtLeastP();
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public java.lang.Object getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(android.support.v4.os.CancellationSignal.OnCancelListener);
+    method public void throwIfCanceled();
+  }
+
+  public static abstract interface CancellationSignal.OnCancelListener {
+    method public abstract void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static android.support.v4.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static java.lang.String getStorageState(java.io.File);
+    field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class LocaleListCompat {
+    method public static android.support.v4.os.LocaleListCompat create(java.util.Locale...);
+    method public static android.support.v4.os.LocaleListCompat forLanguageTags(java.lang.String);
+    method public java.util.Locale get(int);
+    method public static android.support.v4.os.LocaleListCompat getAdjustedDefault();
+    method public static android.support.v4.os.LocaleListCompat getDefault();
+    method public static android.support.v4.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale getFirstMatch(java.lang.String[]);
+    method public int indexOf(java.util.Locale);
+    method public boolean isEmpty();
+    method public int size();
+    method public java.lang.String toLanguageTags();
+    method public java.lang.Object unwrap();
+    method public static android.support.v4.os.LocaleListCompat wrap(java.lang.Object);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(java.lang.String);
+  }
+
+  public final deprecated class ParcelableCompat {
+    method public static deprecated <T> android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
+  }
+
+  public abstract deprecated interface ParcelableCompatCreatorCallbacks<T> {
+    method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
+    method public abstract T[] newArray(int);
+  }
+
+  public final class TraceCompat {
+    method public static void beginSection(java.lang.String);
+    method public static void endSection();
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package android.support.v4.provider {
+
+  public final class FontRequest {
+    ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, java.util.List<java.util.List<byte[]>>);
+    ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, int);
+    method public java.util.List<java.util.List<byte[]>> getCertificates();
+    method public int getCertificatesArrayResId();
+    method public java.lang.String getProviderAuthority();
+    method public java.lang.String getProviderPackage();
+    method public java.lang.String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface buildTypeface(android.content.Context, android.os.CancellationSignal, android.support.v4.provider.FontsContractCompat.FontInfo[]);
+    method public static android.support.v4.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal, android.support.v4.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void requestFont(android.content.Context, android.support.v4.provider.FontRequest, android.support.v4.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final java.lang.String FILE_ID = "file_id";
+    field public static final java.lang.String ITALIC = "font_italic";
+    field public static final java.lang.String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final java.lang.String TTC_INDEX = "font_ttc_index";
+    field public static final java.lang.String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final java.lang.String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    method public android.support.v4.provider.FontsContractCompat.FontInfo[] getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    method public int getResultCode();
+    method public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+  }
+
+}
+
+package android.support.v4.text {
+
+  public final class BidiFormatter {
+    method public static android.support.v4.text.BidiFormatter getInstance();
+    method public static android.support.v4.text.BidiFormatter getInstance(boolean);
+    method public static android.support.v4.text.BidiFormatter getInstance(java.util.Locale);
+    method public boolean getStereoReset();
+    method public boolean isRtl(java.lang.String);
+    method public boolean isRtl(java.lang.CharSequence);
+    method public boolean isRtlContext();
+    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
+    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
+    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat);
+    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, android.support.v4.text.TextDirectionHeuristicCompat);
+    method public java.lang.String unicodeWrap(java.lang.String, boolean);
+    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, boolean);
+    method public java.lang.String unicodeWrap(java.lang.String);
+    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale);
+    method public android.support.v4.text.BidiFormatter build();
+    method public android.support.v4.text.BidiFormatter.Builder setTextDirectionHeuristic(android.support.v4.text.TextDirectionHeuristicCompat);
+    method public android.support.v4.text.BidiFormatter.Builder stereoReset(boolean);
+  }
+
+  public final class ICUCompat {
+    method public static java.lang.String maximizeAndGetScript(java.util.Locale);
+  }
+
+  public abstract interface TextDirectionHeuristicCompat {
+    method public abstract boolean isRtl(char[], int, int);
+    method public abstract boolean isRtl(java.lang.CharSequence, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat ANYRTL_LTR;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_LTR;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_RTL;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat LOCALE;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat LTR;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale);
+    method public static java.lang.String htmlEncode(java.lang.String);
+  }
+
+}
+
+package android.support.v4.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, int);
+    method public static boolean addLinks(android.widget.TextView, int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+  }
+
+}
+
+package android.support.v4.util {
+
+  public class ArrayMap<K, V> extends android.support.v4.util.SimpleArrayMap implements java.util.Map {
+    ctor public ArrayMap();
+    ctor public ArrayMap(int);
+    ctor public ArrayMap(android.support.v4.util.SimpleArrayMap);
+    method public boolean containsAll(java.util.Collection<?>);
+    method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+    method public java.util.Set<K> keySet();
+    method public void putAll(java.util.Map<? extends K, ? extends V>);
+    method public boolean removeAll(java.util.Collection<?>);
+    method public boolean retainAll(java.util.Collection<?>);
+    method public java.util.Collection<V> values();
+  }
+
+  public final class ArraySet<E> implements java.util.Collection java.util.Set {
+    ctor public ArraySet();
+    ctor public ArraySet(int);
+    ctor public ArraySet(android.support.v4.util.ArraySet<E>);
+    ctor public ArraySet(java.util.Collection<E>);
+    method public boolean add(E);
+    method public void addAll(android.support.v4.util.ArraySet<? extends E>);
+    method public boolean addAll(java.util.Collection<? extends E>);
+    method public void clear();
+    method public boolean contains(java.lang.Object);
+    method public boolean containsAll(java.util.Collection<?>);
+    method public void ensureCapacity(int);
+    method public int indexOf(java.lang.Object);
+    method public boolean isEmpty();
+    method public java.util.Iterator<E> iterator();
+    method public boolean remove(java.lang.Object);
+    method public boolean removeAll(android.support.v4.util.ArraySet<? extends E>);
+    method public boolean removeAll(java.util.Collection<?>);
+    method public E removeAt(int);
+    method public boolean retainAll(java.util.Collection<?>);
+    method public int size();
+    method public java.lang.Object[] toArray();
+    method public <T> T[] toArray(T[]);
+    method public E valueAt(int);
+  }
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream);
+    method public void finishWrite(java.io.FileOutputStream);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public final class CircularArray<E> {
+    ctor public CircularArray();
+    ctor public CircularArray(int);
+    method public void addFirst(E);
+    method public void addLast(E);
+    method public void clear();
+    method public E get(int);
+    method public E getFirst();
+    method public E getLast();
+    method public boolean isEmpty();
+    method public E popFirst();
+    method public E popLast();
+    method public void removeFromEnd(int);
+    method public void removeFromStart(int);
+    method public int size();
+  }
+
+  public final class CircularIntArray {
+    ctor public CircularIntArray();
+    ctor public CircularIntArray(int);
+    method public void addFirst(int);
+    method public void addLast(int);
+    method public void clear();
+    method public int get(int);
+    method public int getFirst();
+    method public int getLast();
+    method public boolean isEmpty();
+    method public int popFirst();
+    method public int popLast();
+    method public void removeFromEnd(int);
+    method public void removeFromStart(int);
+    method public int size();
+  }
+
+  public class LongSparseArray<E> implements java.lang.Cloneable {
+    ctor public LongSparseArray();
+    ctor public LongSparseArray(int);
+    method public void append(long, E);
+    method public void clear();
+    method public android.support.v4.util.LongSparseArray<E> clone();
+    method public void delete(long);
+    method public E get(long);
+    method public E get(long, E);
+    method public int indexOfKey(long);
+    method public int indexOfValue(E);
+    method public long keyAt(int);
+    method public void put(long, E);
+    method public void remove(long);
+    method public void removeAt(int);
+    method public void setValueAt(int, E);
+    method public int size();
+    method public E valueAt(int);
+  }
+
+  public class LruCache<K, V> {
+    ctor public LruCache(int);
+    method protected V create(K);
+    method public final synchronized int createCount();
+    method protected void entryRemoved(boolean, K, V, V);
+    method public final void evictAll();
+    method public final synchronized int evictionCount();
+    method public final V get(K);
+    method public final synchronized int hitCount();
+    method public final synchronized int maxSize();
+    method public final synchronized int missCount();
+    method public final V put(K, V);
+    method public final synchronized int putCount();
+    method public final V remove(K);
+    method public void resize(int);
+    method public final synchronized int size();
+    method protected int sizeOf(K, V);
+    method public final synchronized java.util.Map<K, V> snapshot();
+    method public final synchronized java.lang.String toString();
+    method public void trimToSize(int);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(java.lang.Object, java.lang.Object);
+    method public static int hash(java.lang.Object...);
+    method public static int hashCode(java.lang.Object);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F, S);
+    method public static <A, B> android.support.v4.util.Pair<A, B> create(A, B);
+    field public final F first;
+    field public final S second;
+  }
+
+  public final class PatternsCompat {
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static abstract interface Pools.Pool<T> {
+    method public abstract T acquire();
+    method public abstract boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements android.support.v4.util.Pools.Pool {
+    ctor public Pools.SimplePool(int);
+    method public T acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends android.support.v4.util.Pools.SimplePool {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public class SimpleArrayMap<K, V> {
+    ctor public SimpleArrayMap();
+    ctor public SimpleArrayMap(int);
+    ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap<K, V>);
+    method public void clear();
+    method public boolean containsKey(java.lang.Object);
+    method public boolean containsValue(java.lang.Object);
+    method public void ensureCapacity(int);
+    method public V get(java.lang.Object);
+    method public int indexOfKey(java.lang.Object);
+    method public boolean isEmpty();
+    method public K keyAt(int);
+    method public V put(K, V);
+    method public void putAll(android.support.v4.util.SimpleArrayMap<? extends K, ? extends V>);
+    method public V remove(java.lang.Object);
+    method public V removeAt(int);
+    method public V setValueAt(int, V);
+    method public int size();
+    method public V valueAt(int);
+  }
+
+  public class SparseArrayCompat<E> implements java.lang.Cloneable {
+    ctor public SparseArrayCompat();
+    ctor public SparseArrayCompat(int);
+    method public void append(int, E);
+    method public void clear();
+    method public android.support.v4.util.SparseArrayCompat<E> clone();
+    method public void delete(int);
+    method public E get(int);
+    method public E get(int, E);
+    method public int indexOfKey(int);
+    method public int indexOfValue(E);
+    method public int keyAt(int);
+    method public void put(int, E);
+    method public void remove(int);
+    method public void removeAt(int);
+    method public void removeAtRange(int, int);
+    method public void setValueAt(int, E);
+    method public int size();
+    method public E valueAt(int);
+  }
+
+}
+
+package android.support.v4.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
+    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
+    method public void sendAccessibilityEvent(android.view.View, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context);
+    method public android.content.Context getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View onCreateActionView();
+    method public android.view.View onCreateActionView(android.view.MenuItem);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method public void setVisibilityListener(android.support.v4.view.ActionProvider.VisibilityListener);
+  }
+
+  public static abstract interface ActionProvider.VisibilityListener {
+    method public abstract void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
+    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
+    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
+    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  public final class LayoutInflaterCompat {
+    method public static deprecated android.support.v4.view.LayoutInflaterFactory getFactory(android.view.LayoutInflater);
+    method public static deprecated void setFactory(android.view.LayoutInflater, android.support.v4.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  public abstract deprecated interface LayoutInflaterFactory {
+    method public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
+  }
+
+  public final class MenuCompat {
+    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
+  }
+
+  public final class MenuItemCompat {
+    method public static deprecated boolean collapseActionView(android.view.MenuItem);
+    method public static deprecated boolean expandActionView(android.view.MenuItem);
+    method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
+    method public static deprecated android.view.View getActionView(android.view.MenuItem);
+    method public static int getAlphabeticModifiers(android.view.MenuItem);
+    method public static java.lang.CharSequence getContentDescription(android.view.MenuItem);
+    method public static android.content.res.ColorStateList getIconTintList(android.view.MenuItem);
+    method public static android.graphics.PorterDuff.Mode getIconTintMode(android.view.MenuItem);
+    method public static int getNumericModifiers(android.view.MenuItem);
+    method public static java.lang.CharSequence getTooltipText(android.view.MenuItem);
+    method public static deprecated boolean isActionViewExpanded(android.view.MenuItem);
+    method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
+    method public static deprecated android.view.MenuItem setActionView(android.view.MenuItem, android.view.View);
+    method public static deprecated android.view.MenuItem setActionView(android.view.MenuItem, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem, char, int);
+    method public static void setContentDescription(android.view.MenuItem, java.lang.CharSequence);
+    method public static void setIconTintList(android.view.MenuItem, android.content.res.ColorStateList);
+    method public static void setIconTintMode(android.view.MenuItem, android.graphics.PorterDuff.Mode);
+    method public static void setNumericShortcut(android.view.MenuItem, char, int);
+    method public static deprecated android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
+    method public static void setShortcut(android.view.MenuItem, char, char, int, int);
+    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
+    method public static void setTooltipText(android.view.MenuItem, java.lang.CharSequence);
+    field public static final deprecated int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field public static final deprecated int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field public static final deprecated int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field public static final deprecated int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field public static final deprecated int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  public static abstract deprecated interface MenuItemCompat.OnActionExpandListener {
+    method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
+    method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
+  }
+
+  public final class MotionEventCompat {
+    method public static deprecated int findPointerIndex(android.view.MotionEvent, int);
+    method public static deprecated int getActionIndex(android.view.MotionEvent);
+    method public static deprecated int getActionMasked(android.view.MotionEvent);
+    method public static deprecated float getAxisValue(android.view.MotionEvent, int);
+    method public static deprecated float getAxisValue(android.view.MotionEvent, int, int);
+    method public static deprecated int getButtonState(android.view.MotionEvent);
+    method public static deprecated int getPointerCount(android.view.MotionEvent);
+    method public static deprecated int getPointerId(android.view.MotionEvent, int);
+    method public static deprecated int getSource(android.view.MotionEvent);
+    method public static deprecated float getX(android.view.MotionEvent, int);
+    method public static deprecated float getY(android.view.MotionEvent, int);
+    method public static boolean isFromSource(android.view.MotionEvent, int);
+    field public static final deprecated int ACTION_HOVER_ENTER = 9; // 0x9
+    field public static final deprecated int ACTION_HOVER_EXIT = 10; // 0xa
+    field public static final deprecated int ACTION_HOVER_MOVE = 7; // 0x7
+    field public static final deprecated int ACTION_MASK = 255; // 0xff
+    field public static final deprecated int ACTION_POINTER_DOWN = 5; // 0x5
+    field public static final deprecated int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field public static final deprecated int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field public static final deprecated int ACTION_POINTER_UP = 6; // 0x6
+    field public static final deprecated int ACTION_SCROLL = 8; // 0x8
+    field public static final deprecated int AXIS_BRAKE = 23; // 0x17
+    field public static final deprecated int AXIS_DISTANCE = 24; // 0x18
+    field public static final deprecated int AXIS_GAS = 22; // 0x16
+    field public static final deprecated int AXIS_GENERIC_1 = 32; // 0x20
+    field public static final deprecated int AXIS_GENERIC_10 = 41; // 0x29
+    field public static final deprecated int AXIS_GENERIC_11 = 42; // 0x2a
+    field public static final deprecated int AXIS_GENERIC_12 = 43; // 0x2b
+    field public static final deprecated int AXIS_GENERIC_13 = 44; // 0x2c
+    field public static final deprecated int AXIS_GENERIC_14 = 45; // 0x2d
+    field public static final deprecated int AXIS_GENERIC_15 = 46; // 0x2e
+    field public static final deprecated int AXIS_GENERIC_16 = 47; // 0x2f
+    field public static final deprecated int AXIS_GENERIC_2 = 33; // 0x21
+    field public static final deprecated int AXIS_GENERIC_3 = 34; // 0x22
+    field public static final deprecated int AXIS_GENERIC_4 = 35; // 0x23
+    field public static final deprecated int AXIS_GENERIC_5 = 36; // 0x24
+    field public static final deprecated int AXIS_GENERIC_6 = 37; // 0x25
+    field public static final deprecated int AXIS_GENERIC_7 = 38; // 0x26
+    field public static final deprecated int AXIS_GENERIC_8 = 39; // 0x27
+    field public static final deprecated int AXIS_GENERIC_9 = 40; // 0x28
+    field public static final deprecated int AXIS_HAT_X = 15; // 0xf
+    field public static final deprecated int AXIS_HAT_Y = 16; // 0x10
+    field public static final deprecated int AXIS_HSCROLL = 10; // 0xa
+    field public static final deprecated int AXIS_LTRIGGER = 17; // 0x11
+    field public static final deprecated int AXIS_ORIENTATION = 8; // 0x8
+    field public static final deprecated int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field public static final deprecated int AXIS_RTRIGGER = 18; // 0x12
+    field public static final deprecated int AXIS_RUDDER = 20; // 0x14
+    field public static final deprecated int AXIS_RX = 12; // 0xc
+    field public static final deprecated int AXIS_RY = 13; // 0xd
+    field public static final deprecated int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field public static final deprecated int AXIS_SIZE = 3; // 0x3
+    field public static final deprecated int AXIS_THROTTLE = 19; // 0x13
+    field public static final deprecated int AXIS_TILT = 25; // 0x19
+    field public static final deprecated int AXIS_TOOL_MAJOR = 6; // 0x6
+    field public static final deprecated int AXIS_TOOL_MINOR = 7; // 0x7
+    field public static final deprecated int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field public static final deprecated int AXIS_TOUCH_MINOR = 5; // 0x5
+    field public static final deprecated int AXIS_VSCROLL = 9; // 0x9
+    field public static final deprecated int AXIS_WHEEL = 21; // 0x15
+    field public static final deprecated int AXIS_X = 0; // 0x0
+    field public static final deprecated int AXIS_Y = 1; // 0x1
+    field public static final deprecated int AXIS_Z = 11; // 0xb
+    field public static final deprecated int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public abstract interface NestedScrollingChild {
+    method public abstract boolean dispatchNestedFling(float, float, boolean);
+    method public abstract boolean dispatchNestedPreFling(float, float);
+    method public abstract boolean dispatchNestedPreScroll(int, int, int[], int[]);
+    method public abstract boolean dispatchNestedScroll(int, int, int, int, int[]);
+    method public abstract boolean hasNestedScrollingParent();
+    method public abstract boolean isNestedScrollingEnabled();
+    method public abstract void setNestedScrollingEnabled(boolean);
+    method public abstract boolean startNestedScroll(int);
+    method public abstract void stopNestedScroll();
+  }
+
+  public abstract interface NestedScrollingChild2 implements android.support.v4.view.NestedScrollingChild {
+    method public abstract boolean dispatchNestedPreScroll(int, int, int[], int[], int);
+    method public abstract boolean dispatchNestedScroll(int, int, int, int, int[], int);
+    method public abstract boolean hasNestedScrollingParent(int);
+    method public abstract boolean startNestedScroll(int, int);
+    method public abstract void stopNestedScroll(int);
+  }
+
+  public abstract interface NestedScrollingParent {
+    method public abstract int getNestedScrollAxes();
+    method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
+    method public abstract boolean onNestedPreFling(android.view.View, float, float);
+    method public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public abstract void onNestedScroll(android.view.View, int, int, int, int);
+    method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int);
+    method public abstract void onStopNestedScroll(android.view.View);
+  }
+
+  public abstract interface NestedScrollingParent2 implements android.support.v4.view.NestedScrollingParent {
+    method public abstract void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public abstract void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public abstract void onStopNestedScroll(android.view.View, int);
+  }
+
+  public abstract interface OnApplyWindowInsetsListener {
+    method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
+  }
+
+  public final class PointerIconCompat {
+    method public static android.support.v4.view.PointerIconCompat create(android.graphics.Bitmap, float, float);
+    method public static android.support.v4.view.PointerIconCompat getSystemIcon(android.content.Context, int);
+    method public static android.support.v4.view.PointerIconCompat load(android.content.res.Resources, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method public static deprecated boolean isQuickScaleEnabled(java.lang.Object);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector);
+    method public static deprecated void setQuickScaleEnabled(java.lang.Object, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector, boolean);
+  }
+
+  public abstract interface ScrollingView {
+    method public abstract int computeHorizontalScrollExtent();
+    method public abstract int computeHorizontalScrollOffset();
+    method public abstract int computeHorizontalScrollRange();
+    method public abstract int computeVerticalScrollExtent();
+    method public abstract int computeVerticalScrollOffset();
+    method public abstract int computeVerticalScrollRange();
+  }
+
+  public abstract interface TintableBackgroundView {
+    method public abstract android.content.res.ColorStateList getSupportBackgroundTintList();
+    method public abstract android.graphics.PorterDuff.Mode getSupportBackgroundTintMode();
+    method public abstract void setSupportBackgroundTintList(android.content.res.ColorStateList);
+    method public abstract void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final deprecated class VelocityTrackerCompat {
+    method public static deprecated float getXVelocity(android.view.VelocityTracker, int);
+    method public static deprecated float getYVelocity(android.view.VelocityTracker, int);
+  }
+
+  public class ViewCompat {
+    ctor protected ViewCompat();
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View>, int);
+    method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method public static deprecated boolean canScrollHorizontally(android.view.View, int);
+    method public static deprecated boolean canScrollVertically(android.view.View, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method public static deprecated int combineMeasuredStates(int, int);
+    method public static android.support.v4.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[], int[]);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[], int[], int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[], int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static int generateViewId();
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
+    method public static deprecated float getAlpha(android.view.View);
+    method public static android.content.res.ColorStateList getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect getClipBounds(android.view.View);
+    method public static android.view.Display getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method public static deprecated int getLayerType(android.view.View);
+    method public static int getLayoutDirection(android.view.View);
+    method public static deprecated android.graphics.Matrix getMatrix(android.view.View);
+    method public static deprecated int getMeasuredHeightAndState(android.view.View);
+    method public static deprecated int getMeasuredState(android.view.View);
+    method public static deprecated int getMeasuredWidthAndState(android.view.View);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method public static deprecated int getOverScrollMode(android.view.View);
+    method public static int getPaddingEnd(android.view.View);
+    method public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent getParentForAccessibility(android.view.View);
+    method public static deprecated float getPivotX(android.view.View);
+    method public static deprecated float getPivotY(android.view.View);
+    method public static deprecated float getRotation(android.view.View);
+    method public static deprecated float getRotationX(android.view.View);
+    method public static deprecated float getRotationY(android.view.View);
+    method public static deprecated float getScaleX(android.view.View);
+    method public static deprecated float getScaleY(android.view.View);
+    method public static int getScrollIndicators(android.view.View);
+    method public static java.lang.String getTransitionName(android.view.View);
+    method public static deprecated float getTranslationX(android.view.View);
+    method public static deprecated float getTranslationY(android.view.View);
+    method public static float getTranslationZ(android.view.View);
+    method public static int getWindowSystemUiVisibility(android.view.View);
+    method public static deprecated float getX(android.view.View);
+    method public static deprecated float getY(android.view.View);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method public static deprecated boolean isOpaque(android.view.View);
+    method public static boolean isPaddingRelative(android.view.View);
+    method public static deprecated void jumpDrawablesToCurrentState(android.view.View);
+    method public static android.view.View keyboardNavigationClusterSearch(android.view.View, android.view.View, int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
+    method public static deprecated void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public static deprecated void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, java.lang.Runnable);
+    method public static void postOnAnimationDelayed(android.view.View, java.lang.Runnable, long);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, int);
+    method public static deprecated int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void setAccessibilityDelegate(android.view.View, android.support.v4.view.AccessibilityDelegateCompat);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method public static deprecated void setActivated(android.view.View, boolean);
+    method public static deprecated void setAlpha(android.view.View, float);
+    method public static void setAutofillHints(android.view.View, java.lang.String...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode);
+    method public static deprecated void setChildrenDrawingOrderEnabled(android.view.ViewGroup, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect);
+    method public static void setElevation(android.view.View, float);
+    method public static deprecated void setFitsSystemWindows(android.view.View, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint);
+    method public static deprecated void setLayerType(android.view.View, int, android.graphics.Paint);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, android.support.v4.view.OnApplyWindowInsetsListener);
+    method public static deprecated void setOverScrollMode(android.view.View, int);
+    method public static void setPaddingRelative(android.view.View, int, int, int, int);
+    method public static deprecated void setPivotX(android.view.View, float);
+    method public static deprecated void setPivotY(android.view.View, float);
+    method public static void setPointerIcon(android.view.View, android.support.v4.view.PointerIconCompat);
+    method public static deprecated void setRotation(android.view.View, float);
+    method public static deprecated void setRotationX(android.view.View, float);
+    method public static deprecated void setRotationY(android.view.View, float);
+    method public static deprecated void setSaveFromParentEnabled(android.view.View, boolean);
+    method public static deprecated void setScaleX(android.view.View, float);
+    method public static deprecated void setScaleY(android.view.View, float);
+    method public static void setScrollIndicators(android.view.View, int);
+    method public static void setScrollIndicators(android.view.View, int, int);
+    method public static void setTooltipText(android.view.View, java.lang.CharSequence);
+    method public static void setTransitionName(android.view.View, java.lang.String);
+    method public static deprecated void setTranslationX(android.view.View, float);
+    method public static deprecated void setTranslationY(android.view.View, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static deprecated void setX(android.view.View, float);
+    method public static deprecated void setY(android.view.View, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static boolean startNestedScroll(android.view.View, int, int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field public static final deprecated int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field public static final deprecated int LAYER_TYPE_NONE = 0; // 0x0
+    field public static final deprecated int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field public static final deprecated int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field public static final deprecated int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field public static final deprecated int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field public static final deprecated int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field public static final deprecated int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field public static final deprecated int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field public static final deprecated int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static deprecated int getScaledPagingTouchSlop(android.view.ViewConfiguration);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static deprecated boolean hasPermanentMenuKey(android.view.ViewConfiguration);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method public static deprecated boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method public static deprecated void setMotionEventSplittingEnabled(android.view.ViewGroup, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
+    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[], int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
+    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View, int);
+    method public static deprecated boolean requestSendAccessibilityEvent(android.view.ViewParent, android.view.View, android.view.accessibility.AccessibilityEvent);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public android.support.v4.view.ViewPropertyAnimatorCompat alpha(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator getInterpolator();
+    method public long getStartDelay();
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotation(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationX(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationXBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationY(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationYBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleX(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleXBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleY(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleYBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setDuration(long);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setListener(android.support.v4.view.ViewPropertyAnimatorListener);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setStartDelay(long);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setUpdateListener(android.support.v4.view.ViewPropertyAnimatorUpdateListener);
+    method public void start();
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationX(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationXBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationY(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationYBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZ(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat withEndAction(java.lang.Runnable);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat withLayer();
+    method public android.support.v4.view.ViewPropertyAnimatorCompat withStartAction(java.lang.Runnable);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat x(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat xBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat y(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat yBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat z(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat zBy(float);
+  }
+
+  public abstract interface ViewPropertyAnimatorListener {
+    method public abstract void onAnimationCancel(android.view.View);
+    method public abstract void onAnimationEnd(android.view.View);
+    method public abstract void onAnimationStart(android.view.View);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements android.support.v4.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View);
+    method public void onAnimationEnd(android.view.View);
+    method public void onAnimationStart(android.view.View);
+  }
+
+  public abstract interface ViewPropertyAnimatorUpdateListener {
+    method public abstract void onAnimationUpdate(android.view.View);
+  }
+
+  public final class WindowCompat {
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, int);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(android.support.v4.view.WindowInsetsCompat);
+    method public android.support.v4.view.WindowInsetsCompat consumeStableInsets();
+    method public android.support.v4.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public int getStableInsetBottom();
+    method public int getStableInsetLeft();
+    method public int getStableInsetRight();
+    method public int getStableInsetTop();
+    method public int getSystemWindowInsetBottom();
+    method public int getSystemWindowInsetLeft();
+    method public int getSystemWindowInsetRight();
+    method public int getSystemWindowInsetTop();
+    method public boolean hasInsets();
+    method public boolean hasStableInsets();
+    method public boolean hasSystemWindowInsets();
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+  }
+
+}
+
+package android.support.v4.view.accessibility {
+
+  public final class AccessibilityEventCompat {
+    method public static deprecated void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
+    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent);
+    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
+    method public static deprecated int getRecordCount(android.view.accessibility.AccessibilityEvent);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field public static final deprecated int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field public static final deprecated int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field public static final deprecated int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field public static final deprecated int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field public static final deprecated int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field public static final deprecated int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field public static final deprecated int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method public static deprecated boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
+    method public static deprecated java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
+    method public static deprecated java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
+    method public static deprecated boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
+    method public static deprecated boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
+  }
+
+  public static abstract deprecated interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method public abstract deprecated void onAccessibilityStateChanged(boolean);
+  }
+
+  public static abstract deprecated class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static abstract interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public abstract void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor public deprecated AccessibilityNodeInfoCompat(java.lang.Object);
+    method public void addAction(int);
+    method public void addAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
+    method public void addChild(android.view.View);
+    method public void addChild(android.view.View, int);
+    method public boolean canOpenPopup();
+    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String);
+    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(java.lang.String);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat focusSearch(int);
+    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat> getActionList();
+    method public int getActions();
+    method public void getBoundsInParent(android.graphics.Rect);
+    method public void getBoundsInScreen(android.graphics.Rect);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getChild(int);
+    method public int getChildCount();
+    method public java.lang.CharSequence getClassName();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat getCollectionInfo();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat getCollectionItemInfo();
+    method public java.lang.CharSequence getContentDescription();
+    method public int getDrawingOrder();
+    method public java.lang.CharSequence getError();
+    method public android.os.Bundle getExtras();
+    method public deprecated java.lang.Object getInfo();
+    method public int getInputType();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getLabelFor();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public java.lang.CharSequence getPackageName();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getParent();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat getRangeInfo();
+    method public java.lang.CharSequence getRoleDescription();
+    method public java.lang.CharSequence getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getTraversalAfter();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getTraversalBefore();
+    method public java.lang.String getViewIdResourceName();
+    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isVisibleToUser();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View, int);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
+    method public boolean removeChild(android.view.View);
+    method public boolean removeChild(android.view.View, int);
+    method public void setAccessibilityFocused(boolean);
+    method public void setBoundsInParent(android.graphics.Rect);
+    method public void setBoundsInScreen(android.graphics.Rect);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(java.lang.CharSequence);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(java.lang.Object);
+    method public void setCollectionItemInfo(java.lang.Object);
+    method public void setContentDescription(java.lang.CharSequence);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(java.lang.CharSequence);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View);
+    method public void setLabelFor(android.view.View, int);
+    method public void setLabeledBy(android.view.View);
+    method public void setLabeledBy(android.view.View, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(java.lang.CharSequence);
+    method public void setParent(android.view.View);
+    method public void setParent(android.view.View, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat);
+    method public void setRoleDescription(java.lang.CharSequence);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setSource(android.view.View);
+    method public void setSource(android.view.View, int);
+    method public void setText(java.lang.CharSequence);
+    method public void setTextSelection(int, int);
+    method public void setTraversalAfter(android.view.View);
+    method public void setTraversalAfter(android.view.View, int);
+    method public void setTraversalBefore(android.view.View);
+    method public void setTraversalBefore(android.view.View, int);
+    method public void setViewIdResourceName(java.lang.String);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo unwrap();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final java.lang.String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final java.lang.String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final java.lang.String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, java.lang.CharSequence);
+    method public int getId();
+    method public java.lang.CharSequence getLabel();
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_ACCESSIBILITY_FOCUS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_FOCUS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_SELECTION;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLICK;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_COLLAPSE;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CONTEXT_CLICK;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_COPY;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CUT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DISMISS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_EXPAND;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_FOCUS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_LONG_CLICK;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_NEXT_HTML_ELEMENT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PASTE;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_BACKWARD;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_DOWN;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_FORWARD;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_LEFT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_RIGHT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_TO_POSITION;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_UP;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SELECT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_PROGRESS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_SELECTION;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_TEXT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SHOW_ON_SCREEN;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean, int);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method public boolean isHeading();
+    method public boolean isSelected();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean, boolean);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(java.lang.Object);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int);
+    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String, int);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
+    method public java.lang.Object getProvider();
+    method public boolean performAction(int, int, android.os.Bundle);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor public deprecated AccessibilityRecordCompat(java.lang.Object);
+    method public deprecated boolean equals(java.lang.Object);
+    method public deprecated int getAddedCount();
+    method public deprecated java.lang.CharSequence getBeforeText();
+    method public deprecated java.lang.CharSequence getClassName();
+    method public deprecated java.lang.CharSequence getContentDescription();
+    method public deprecated int getCurrentItemIndex();
+    method public deprecated int getFromIndex();
+    method public deprecated java.lang.Object getImpl();
+    method public deprecated int getItemCount();
+    method public deprecated int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord);
+    method public deprecated int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord);
+    method public deprecated android.os.Parcelable getParcelableData();
+    method public deprecated int getRemovedCount();
+    method public deprecated int getScrollX();
+    method public deprecated int getScrollY();
+    method public deprecated android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getSource();
+    method public deprecated java.util.List<java.lang.CharSequence> getText();
+    method public deprecated int getToIndex();
+    method public deprecated int getWindowId();
+    method public deprecated int hashCode();
+    method public deprecated boolean isChecked();
+    method public deprecated boolean isEnabled();
+    method public deprecated boolean isFullScreen();
+    method public deprecated boolean isPassword();
+    method public deprecated boolean isScrollable();
+    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat obtain(android.support.v4.view.accessibility.AccessibilityRecordCompat);
+    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat obtain();
+    method public deprecated void recycle();
+    method public deprecated void setAddedCount(int);
+    method public deprecated void setBeforeText(java.lang.CharSequence);
+    method public deprecated void setChecked(boolean);
+    method public deprecated void setClassName(java.lang.CharSequence);
+    method public deprecated void setContentDescription(java.lang.CharSequence);
+    method public deprecated void setCurrentItemIndex(int);
+    method public deprecated void setEnabled(boolean);
+    method public deprecated void setFromIndex(int);
+    method public deprecated void setFullScreen(boolean);
+    method public deprecated void setItemCount(int);
+    method public deprecated void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord, int);
+    method public deprecated void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord, int);
+    method public deprecated void setParcelableData(android.os.Parcelable);
+    method public deprecated void setPassword(boolean);
+    method public deprecated void setRemovedCount(int);
+    method public deprecated void setScrollX(int);
+    method public deprecated void setScrollY(int);
+    method public deprecated void setScrollable(boolean);
+    method public deprecated void setSource(android.view.View);
+    method public deprecated void setSource(android.view.View, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View, int);
+    method public deprecated void setToIndex(int);
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect);
+    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getParent();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getRoot();
+    method public java.lang.CharSequence getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static android.support.v4.view.accessibility.AccessibilityWindowInfoCompat obtain();
+    method public static android.support.v4.view.accessibility.AccessibilityWindowInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityWindowInfoCompat);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package android.support.v4.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator create(android.graphics.Path);
+    method public static android.view.animation.Interpolator create(float, float);
+    method public static android.view.animation.Interpolator create(float, float, float, float);
+  }
+
+}
+
+package android.support.v4.widget {
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode);
+  }
+
+  public final class EdgeEffectCompat {
+    ctor public deprecated EdgeEffectCompat(android.content.Context);
+    method public deprecated boolean draw(android.graphics.Canvas);
+    method public deprecated void finish();
+    method public deprecated boolean isFinished();
+    method public deprecated boolean onAbsorb(int);
+    method public deprecated boolean onPull(float);
+    method public deprecated boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method public deprecated boolean onRelease();
+    method public deprecated void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode);
+  }
+
+  public final class ListPopupWindowCompat {
+    method public static deprecated android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
+    method public static android.view.View.OnTouchListener createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  public final deprecated class ScrollerCompat {
+    method public deprecated void abortAnimation();
+    method public deprecated boolean computeScrollOffset();
+    method public static deprecated android.support.v4.widget.ScrollerCompat create(android.content.Context);
+    method public static deprecated android.support.v4.widget.ScrollerCompat create(android.content.Context, android.view.animation.Interpolator);
+    method public deprecated void fling(int, int, int, int, int, int, int, int);
+    method public deprecated void fling(int, int, int, int, int, int, int, int, int, int);
+    method public deprecated float getCurrVelocity();
+    method public deprecated int getCurrX();
+    method public deprecated int getCurrY();
+    method public deprecated int getFinalX();
+    method public deprecated int getFinalY();
+    method public deprecated boolean isFinished();
+    method public deprecated boolean isOverScrolled();
+    method public deprecated void notifyHorizontalEdgeReached(int, int, int);
+    method public deprecated void notifyVerticalEdgeReached(int, int, int);
+    method public deprecated boolean springBack(int, int, int, int, int, int);
+    method public deprecated void startScroll(int, int, int, int);
+    method public deprecated void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable[] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, int, int, int, int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setTextAppearance(android.widget.TextView, int);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  public abstract interface TintableCompoundButton {
+    method public abstract android.content.res.ColorStateList getSupportButtonTintList();
+    method public abstract android.graphics.PorterDuff.Mode getSupportButtonTintMode();
+    method public abstract void setSupportButtonTintList(android.content.res.ColorStateList);
+    method public abstract void setSupportButtonTintMode(android.graphics.PorterDuff.Mode);
+  }
+
+}
+
diff --git a/compat/api/current.txt b/compat/api/current.txt
index 81a85b8..e97db8c 100644
--- a/compat/api/current.txt
+++ b/compat/api/current.txt
@@ -174,6 +174,7 @@
     method public static android.os.Bundle getExtras(android.app.Notification);
     method public static java.lang.String getGroup(android.app.Notification);
     method public static int getGroupAlertBehavior(android.app.Notification);
+    method public static java.util.List<android.support.v4.app.NotificationCompat.Action> getInvisibleActions(android.app.Notification);
     method public static boolean getLocalOnly(android.app.Notification);
     method public static java.lang.String getShortcutId(android.app.Notification);
     method public static java.lang.String getSortKey(android.app.Notification);
@@ -208,6 +209,7 @@
     field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions";
     field public static final java.lang.String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
     field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final java.lang.String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
     field public static final java.lang.String EXTRA_LARGE_ICON = "android.largeIcon";
     field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
     field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession";
@@ -261,7 +263,19 @@
     method public android.os.Bundle getExtras();
     method public int getIcon();
     method public android.support.v4.app.RemoteInput[] getRemoteInputs();
+    method public int getSemanticAction();
+    method public boolean getShowsUserInterface();
     method public java.lang.CharSequence getTitle();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
     field public android.app.PendingIntent actionIntent;
     field public int icon;
     field public java.lang.CharSequence title;
@@ -276,12 +290,17 @@
     method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Extender);
     method public android.os.Bundle getExtras();
     method public android.support.v4.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+    method public android.support.v4.app.NotificationCompat.Action.Builder setSemanticAction(int);
+    method public android.support.v4.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
   }
 
   public static abstract interface NotificationCompat.Action.Extender {
     method public abstract android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
   }
 
+  public static abstract class NotificationCompat.Action.SemanticAction implements java.lang.annotation.Annotation {
+  }
+
   public static final class NotificationCompat.Action.WearableExtender implements android.support.v4.app.NotificationCompat.Action.Extender {
     ctor public NotificationCompat.Action.WearableExtender();
     ctor public NotificationCompat.Action.WearableExtender(android.support.v4.app.NotificationCompat.Action);
@@ -324,6 +343,8 @@
     method public android.support.v4.app.NotificationCompat.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
     method public android.support.v4.app.NotificationCompat.Builder addAction(android.support.v4.app.NotificationCompat.Action);
     method public android.support.v4.app.NotificationCompat.Builder addExtras(android.os.Bundle);
+    method public android.support.v4.app.NotificationCompat.Builder addInvisibleAction(int, java.lang.CharSequence, android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.Builder addInvisibleAction(android.support.v4.app.NotificationCompat.Action);
     method public android.support.v4.app.NotificationCompat.Builder addPerson(java.lang.String);
     method public android.app.Notification build();
     method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Extender);
@@ -436,7 +457,9 @@
     method public java.lang.CharSequence getConversationTitle();
     method public java.util.List<android.support.v4.app.NotificationCompat.MessagingStyle.Message> getMessages();
     method public java.lang.CharSequence getUserDisplayName();
+    method public boolean isGroupConversation();
     method public android.support.v4.app.NotificationCompat.MessagingStyle setConversationTitle(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
     field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
   }
 
@@ -1195,6 +1218,7 @@
     method public E get(long, E);
     method public int indexOfKey(long);
     method public int indexOfValue(E);
+    method public boolean isEmpty();
     method public long keyAt(int);
     method public void put(long, E);
     method public void remove(long);
@@ -1296,6 +1320,7 @@
     method public E get(int, E);
     method public int indexOfKey(int);
     method public int indexOfValue(E);
+    method public boolean isEmpty();
     method public int keyAt(int);
     method public void put(int, E);
     method public void remove(int);
@@ -1797,6 +1822,7 @@
 
   public final class ViewConfigurationCompat {
     method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration);
     method public static deprecated int getScaledPagingTouchSlop(android.view.ViewConfiguration);
     method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
     method public static deprecated boolean hasPermanentMenuKey(android.view.ViewConfiguration);
diff --git a/compat/res-public/values/public_attrs.xml b/compat/res-public/values/public_attrs.xml
index e45f8c2..38d858e 100644
--- a/compat/res-public/values/public_attrs.xml
+++ b/compat/res-public/values/public_attrs.xml
@@ -26,4 +26,6 @@
      <public type="attr" name="fontStyle"/>
      <public type="attr" name="font"/>
      <public type="attr" name="fontWeight"/>
+     <public type="attr" name="fontVariationSettings"/>
+     <public type="attr" name="ttcIndex"/>
 </resources>
diff --git a/compat/res/values/attrs.xml b/compat/res/values/attrs.xml
index 04d7690..1a721a8 100644
--- a/compat/res/values/attrs.xml
+++ b/compat/res/values/attrs.xml
@@ -79,10 +79,19 @@
          common values are 400 for regular weight and 700 for bold weight. If unspecified, the value
          in the font's header tables will be used. -->
         <attr name="fontWeight" format="integer" />
-
+        <!-- The variation settings to be applied to the font. The string should be in the following
+         format: "'tag1' value1, 'tag2' value2, ...". If the default variation settings should be
+         used, or the font used does not support variation settings, this attribute needs not be
+         specified. -->
+        <attr name="fontVariationSettings" format="string" />
+        <!-- The index of the font in the tcc font file. If the font file referenced is not in the
+        tcc format, this attribute needs not be specified. -->
+        <attr name="ttcIndex" format="integer" />
         <!-- References to the framework attrs -->
         <attr name="android:fontStyle" />
         <attr name="android:font" />
         <attr name="android:fontWeight" />
+        <attr name="android:fontVariationSettings" />
+        <attr name="android:ttcIndex" />
     </declare-styleable>
 </resources>
diff --git a/compat/src/main/java/android/support/v4/app/NotificationCompat.java b/compat/src/main/java/android/support/v4/app/NotificationCompat.java
index b3f0d32..1e2f317 100644
--- a/compat/src/main/java/android/support/v4/app/NotificationCompat.java
+++ b/compat/src/main/java/android/support/v4/app/NotificationCompat.java
@@ -17,7 +17,6 @@
 package android.support.v4.app;
 
 import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
 import static java.lang.annotation.RetentionPolicy.SOURCE;
 
 import android.app.Activity;
@@ -404,6 +403,12 @@
     public static final String EXTRA_MESSAGES = "android.messages";
 
     /**
+     * Notification key: whether the {@link NotificationCompat.MessagingStyle} notification
+     * represents a group conversation.
+     */
+    public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+
+    /**
      * Keys into the {@link #getExtras} Bundle: the audio contents of this notification.
      *
      * This is for use when rendering the notification on an audio-focused interface;
@@ -651,6 +656,11 @@
         @RestrictTo(LIBRARY_GROUP)
         public ArrayList<Action> mActions = new ArrayList<>();
 
+        // Invisible actions are stored in the CarExtender bundle without actually being owned by
+        // CarExtender. This is to comply with an optimization of the Android OS which removes
+        // Actions from the Notification if there are no listeners for those Actions.
+        ArrayList<Action> mInvisibleActions = new ArrayList<>();
+
         CharSequence mContentTitle;
         CharSequence mContentText;
         PendingIntent mContentIntent;
@@ -1325,6 +1335,35 @@
         }
 
         /**
+         * Add an invisible action to this notification. Invisible actions are never displayed by
+         * the system, but can be retrieved and used by other application listening to
+         * system notifications. Invisible actions are supported from Android 4.4.4 (API 20) and can
+         * be retrieved using {@link NotificationCompat#getInvisibleActions(Notification)}.
+         *
+         * @param icon Resource ID of a drawable that represents the action.
+         * @param title Text describing the action.
+         * @param intent {@link android.app.PendingIntent} to be fired when the action is invoked.
+         */
+        @RequiresApi(21)
+        public Builder addInvisibleAction(int icon, CharSequence title, PendingIntent intent) {
+            return addInvisibleAction(new Action(icon, title, intent));
+        }
+
+        /**
+         * Add an invisible action to this notification. Invisible actions are never displayed by
+         * the system, but can be retrieved and used by other application listening to
+         * system notifications. Invisible actions are supported from Android 4.4.4 (API 20) and can
+         * be retrieved using {@link NotificationCompat#getInvisibleActions(Notification)}.
+         *
+         * @param action The action to add.
+         */
+        @RequiresApi(21)
+        public Builder addInvisibleAction(Action action) {
+            mInvisibleActions.add(action);
+            return this;
+        }
+
+        /**
          * Add a rich notification style to be applied at build time.
          * <br>
          * If the platform does not provide rich notification styles, this method has no effect. The
@@ -2083,8 +2122,9 @@
         public static final int MAXIMUM_RETAINED_MESSAGES = 25;
 
         CharSequence mUserDisplayName;
-        CharSequence mConversationTitle;
+        @Nullable CharSequence mConversationTitle;
         List<Message> mMessages = new ArrayList<>();
+        boolean mIsGroupConversation;
 
         MessagingStyle() {
         }
@@ -2107,20 +2147,27 @@
         }
 
         /**
-         * Sets the title to be displayed on this conversation. This should only be used for
-         * group messaging and left unset for one-on-one conversations.
-         * @param conversationTitle Title displayed for this conversation.
-         * @return this object for method chaining.
+         * Sets the title to be displayed on this conversation. May be set to {@code null}.
+         *
+         * <p>This API's behavior was changed in SDK version {@link Build.VERSION_CODES#P}. If your
+         * application's target version is less than {@link Build.VERSION_CODES#P}, setting a
+         * conversation title to a non-null value will make {@link #isGroupConversation()} return
+         * {@code true} and passing {@code null} will make it return {@code false}. In
+         * {@link Build.VERSION_CODES#P} and beyond, use {@link #setGroupConversation(boolean)}
+         * to set group conversation status.
+         *
+         * @param conversationTitle Title displayed for this conversation
+         * @return this object for method chaining
          */
-        public MessagingStyle setConversationTitle(CharSequence conversationTitle) {
+        public MessagingStyle setConversationTitle(@Nullable CharSequence conversationTitle) {
             mConversationTitle = conversationTitle;
             return this;
         }
 
         /**
-         * Return the title to be displayed on this conversation. Can be <code>null</code> and
-         * should be for one-on-one conversations
+         * Return the title to be displayed on this conversation. Can be {@code null}.
          */
+        @Nullable
         public CharSequence getConversationTitle() {
             return mConversationTitle;
         }
@@ -2169,6 +2216,42 @@
         }
 
         /**
+         * Sets whether this conversation notification represents a group.
+         * @param isGroupConversation {@code true} if the conversation represents a group,
+         * {@code false} otherwise.
+         * @return this object for method chaining
+         */
+        public MessagingStyle setGroupConversation(boolean isGroupConversation) {
+            mIsGroupConversation = isGroupConversation;
+            return this;
+        }
+
+        /**
+         * Returns {@code true} if this notification represents a group conversation, otherwise
+         * {@code false}.
+         *
+         * <p> If the application that generated this {@link MessagingStyle} targets an SDK version
+         * less than {@link Build.VERSION_CODES#P}, this method becomes dependent on whether or
+         * not the conversation title is set; returning {@code true} if the conversation title is
+         * a non-null value, or {@code false} otherwise. From {@link Build.VERSION_CODES#P} forward,
+         * this method returns what's set by {@link #setGroupConversation(boolean)} allowing for
+         * named, non-group conversations.
+         *
+         * @see #setConversationTitle(CharSequence)
+         */
+        public boolean isGroupConversation() {
+            // When target SDK version is < P, a non-null conversation title dictates if this is
+            // as group conversation.
+            if (mBuilder != null
+                    && mBuilder.mContext.getApplicationInfo().targetSdkVersion
+                    < Build.VERSION_CODES.P) {
+                return mConversationTitle != null;
+            }
+
+            return mIsGroupConversation;
+        }
+
+        /**
          * Retrieves a {@link MessagingStyle} from a {@link Notification}, enabling an application
          * that has set a {@link MessagingStyle} using {@link NotificationCompat} or
          * {@link android.app.Notification.Builder} to send messaging information to another
@@ -2316,6 +2399,7 @@
             if (!mMessages.isEmpty()) { extras.putParcelableArray(EXTRA_MESSAGES,
                     Message.getBundleArrayForMessages(mMessages));
             }
+            extras.putBoolean(EXTRA_IS_GROUP_CONVERSATION, mIsGroupConversation);
         }
 
         /**
@@ -2331,6 +2415,7 @@
             if (parcelables != null) {
                 mMessages = Message.getMessagesFromBundleArray(parcelables);
             }
+            mIsGroupConversation = extras.getBoolean(EXTRA_IS_GROUP_CONVERSATION);
         }
 
         public static final class Message {
@@ -2744,6 +2829,66 @@
      * to attach actions.
      */
     public static class Action {
+        /**
+         * {@link SemanticAction}: No semantic action defined.
+         */
+        public static final int SEMANTIC_ACTION_NONE = 0;
+
+        /**
+         * {@link SemanticAction}: Reply to a conversation, chat, group, or wherever replies
+         * may be appropriate.
+         */
+        public static final int SEMANTIC_ACTION_REPLY = 1;
+
+        /**
+         * {@link SemanticAction}: Mark content as read.
+         */
+        public static final int SEMANTIC_ACTION_MARK_AS_READ = 2;
+
+        /**
+         * {@link SemanticAction}: Mark content as unread.
+         */
+        public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3;
+
+        /**
+         * {@link SemanticAction}: Delete the content associated with the notification. This
+         * could mean deleting an email, message, etc.
+         */
+        public static final int SEMANTIC_ACTION_DELETE = 4;
+
+        /**
+         * {@link SemanticAction}: Archive the content associated with the notification. This
+         * could mean archiving an email, message, etc.
+         */
+        public static final int SEMANTIC_ACTION_ARCHIVE = 5;
+
+        /**
+         * {@link SemanticAction}: Mute the content associated with the notification. This could
+         * mean silencing a conversation or currently playing media.
+         */
+        public static final int SEMANTIC_ACTION_MUTE = 6;
+
+        /**
+         * {@link SemanticAction}: Unmute the content associated with the notification. This could
+         * mean un-silencing a conversation or currently playing media.
+         */
+        public static final int SEMANTIC_ACTION_UNMUTE = 7;
+
+        /**
+         * {@link SemanticAction}: Mark content with a thumbs up.
+         */
+        public static final int SEMANTIC_ACTION_THUMBS_UP = 8;
+
+        /**
+         * {@link SemanticAction}: Mark content with a thumbs down.
+         */
+        public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9;
+
+        static final String EXTRA_SHOWS_USER_INTERFACE =
+                "android.support.action.showsUserInterface";
+
+        static final String EXTRA_SEMANTIC_ACTION = "android.support.action.semanticAction";
+
         final Bundle mExtras;
         private final RemoteInput[] mRemoteInputs;
 
@@ -2760,6 +2905,9 @@
         private final RemoteInput[] mDataOnlyRemoteInputs;
 
         private boolean mAllowGeneratedReplies;
+        private boolean mShowsUserInterface = true;
+
+        private final @SemanticAction int mSemanticAction;
 
         /**
          * Small icon representing the action.
@@ -2776,12 +2924,13 @@
         public PendingIntent actionIntent;
 
         public Action(int icon, CharSequence title, PendingIntent intent) {
-            this(icon, title, intent, new Bundle(), null, null, true);
+            this(icon, title, intent, new Bundle(), null, null, true, SEMANTIC_ACTION_NONE, true);
         }
 
         Action(int icon, CharSequence title, PendingIntent intent, Bundle extras,
                 RemoteInput[] remoteInputs, RemoteInput[] dataOnlyRemoteInputs,
-                boolean allowGeneratedReplies) {
+                boolean allowGeneratedReplies, @SemanticAction int semanticAction,
+                boolean showsUserInterface) {
             this.icon = icon;
             this.title = NotificationCompat.Builder.limitCharSequenceLength(title);
             this.actionIntent = intent;
@@ -2789,6 +2938,8 @@
             this.mRemoteInputs = remoteInputs;
             this.mDataOnlyRemoteInputs = dataOnlyRemoteInputs;
             this.mAllowGeneratedReplies = allowGeneratedReplies;
+            this.mSemanticAction = semanticAction;
+            this.mShowsUserInterface = showsUserInterface;
         }
 
         public int getIcon() {
@@ -2828,6 +2979,17 @@
         }
 
         /**
+         * Returns the {@link SemanticAction} associated with this {@link Action}. A
+         * {@link SemanticAction} denotes what an {@link Action}'s {@link PendingIntent} will do
+         * (eg. reply, mark as read, delete, etc).
+         *
+         * @see SemanticAction
+         */
+        public @SemanticAction int getSemanticAction() {
+            return mSemanticAction;
+        }
+
+        /**
          * Get the list of inputs to be collected from the user that ONLY accept data when this
          * action is sent. These remote inputs are guaranteed to return true on a call to
          * {@link RemoteInput#isDataOnly}.
@@ -2842,6 +3004,14 @@
         }
 
         /**
+         * Return whether or not triggering this {@link Action}'s {@link PendingIntent} will open a
+         * user interface.
+         */
+        public boolean getShowsUserInterface() {
+            return mShowsUserInterface;
+        }
+
+        /**
          * Builder class for {@link Action} objects.
          */
         public static final class Builder {
@@ -2851,6 +3021,8 @@
             private boolean mAllowGeneratedReplies = true;
             private final Bundle mExtras;
             private ArrayList<RemoteInput> mRemoteInputs;
+            private @SemanticAction int mSemanticAction;
+            private boolean mShowsUserInterface = true;
 
             /**
              * Construct a new builder for {@link Action} object.
@@ -2859,7 +3031,7 @@
              * @param intent the {@link PendingIntent} to fire when users trigger this action
              */
             public Builder(int icon, CharSequence title, PendingIntent intent) {
-                this(icon, title, intent, new Bundle(), null, true);
+                this(icon, title, intent, new Bundle(), null, true, SEMANTIC_ACTION_NONE, true);
             }
 
             /**
@@ -2869,11 +3041,13 @@
              */
             public Builder(Action action) {
                 this(action.icon, action.title, action.actionIntent, new Bundle(action.mExtras),
-                        action.getRemoteInputs(), action.getAllowGeneratedReplies());
+                        action.getRemoteInputs(), action.getAllowGeneratedReplies(),
+                        action.getSemanticAction(), action.mShowsUserInterface);
             }
 
             private Builder(int icon, CharSequence title, PendingIntent intent, Bundle extras,
-                    RemoteInput[] remoteInputs, boolean allowGeneratedReplies) {
+                    RemoteInput[] remoteInputs, boolean allowGeneratedReplies,
+                    @SemanticAction int semanticAction, boolean showsUserInterface) {
                 mIcon = icon;
                 mTitle = NotificationCompat.Builder.limitCharSequenceLength(title);
                 mIntent = intent;
@@ -2881,6 +3055,8 @@
                 mRemoteInputs = remoteInputs == null ? null : new ArrayList<>(
                         Arrays.asList(remoteInputs));
                 mAllowGeneratedReplies = allowGeneratedReplies;
+                mSemanticAction = semanticAction;
+                mShowsUserInterface = showsUserInterface;
             }
 
             /**
@@ -2936,6 +3112,32 @@
             }
 
             /**
+             * Sets the {@link SemanticAction} for this {@link Action}. A {@link SemanticAction}
+             * denotes what an {@link Action}'s {@link PendingIntent} will do (eg. reply, mark
+             * as read, delete, etc).
+             * @param semanticAction a {@link SemanticAction} defined within {@link Action} with
+             * {@code SEMANTIC_ACTION_} prefixes
+             * @return this object for method chaining
+             */
+            public Builder setSemanticAction(@SemanticAction int semanticAction) {
+                mSemanticAction = semanticAction;
+                return this;
+            }
+
+            /**
+             * Set whether or not this {@link Action}'s {@link PendingIntent} will open a user
+             * interface.
+             * @param showsUserInterface {@code true} if this {@link Action}'s {@link PendingIntent}
+             * will open a user interface, otherwise {@code false}
+             * @return this object for method chaining
+             * The default value is {@code true}
+             */
+            public Builder setShowsUserInterface(boolean showsUserInterface) {
+                mShowsUserInterface = showsUserInterface;
+                return this;
+            }
+
+            /**
              * Apply an extender to this action builder. Extenders may be used to add
              * metadata or change options on this builder.
              */
@@ -2966,7 +3168,8 @@
                 RemoteInput[] textInputsArr = textInputs.isEmpty()
                         ? null : textInputs.toArray(new RemoteInput[textInputs.size()]);
                 return new Action(mIcon, mTitle, mIntent, mExtras, textInputsArr,
-                        dataOnlyInputsArr, mAllowGeneratedReplies);
+                        dataOnlyInputsArr, mAllowGeneratedReplies, mSemanticAction,
+                        mShowsUserInterface);
             }
         }
 
@@ -3226,6 +3429,27 @@
                 return (mFlags & FLAG_HINT_DISPLAY_INLINE) != 0;
             }
         }
+
+        /**
+         * Provides meaning to an {@link Action} that hints at what the associated
+         * {@link PendingIntent} will do. For example, an {@link Action} with a
+         * {@link PendingIntent} that replies to a text message notification may have the
+         * {@link #SEMANTIC_ACTION_REPLY} {@link SemanticAction} set within it.
+         */
+        @IntDef({
+                SEMANTIC_ACTION_NONE,
+                SEMANTIC_ACTION_REPLY,
+                SEMANTIC_ACTION_MARK_AS_READ,
+                SEMANTIC_ACTION_MARK_AS_UNREAD,
+                SEMANTIC_ACTION_DELETE,
+                SEMANTIC_ACTION_ARCHIVE,
+                SEMANTIC_ACTION_MUTE,
+                SEMANTIC_ACTION_UNMUTE,
+                SEMANTIC_ACTION_THUMBS_UP,
+                SEMANTIC_ACTION_THUMBS_DOWN
+        })
+        @Retention(RetentionPolicy.SOURCE)
+        public @interface SemanticAction {}
     }
 
 
@@ -4135,10 +4359,15 @@
      * to access values.
      */
     public static final class CarExtender implements Extender {
-        private static final String EXTRA_CAR_EXTENDER = "android.car.EXTENSIONS";
+        /** @hide **/
+        @RestrictTo(LIBRARY_GROUP)
+        static final String EXTRA_CAR_EXTENDER = "android.car.EXTENSIONS";
         private static final String EXTRA_LARGE_ICON = "large_icon";
         private static final String EXTRA_CONVERSATION = "car_conversation";
         private static final String EXTRA_COLOR = "app_color";
+        /** @hide **/
+        @RestrictTo(LIBRARY_GROUP)
+        static final String EXTRA_INVISIBLE_ACTIONS = "invisible_actions";
 
         private static final String KEY_AUTHOR = "author";
         private static final String KEY_TEXT = "text";
@@ -4626,8 +4855,41 @@
             allowGeneratedReplies = action.getExtras().getBoolean(
                     NotificationCompatJellybean.EXTRA_ALLOW_GENERATED_REPLIES);
         }
+
+        final boolean showsUserInterface =
+                action.getExtras().getBoolean(Action.EXTRA_SHOWS_USER_INTERFACE, true);
+
+        final @Action.SemanticAction int semanticAction;
+        if (Build.VERSION.SDK_INT >= 28) {
+            semanticAction = action.getSemanticAction();
+        } else {
+            semanticAction = action.getExtras().getInt(
+                    Action.EXTRA_SEMANTIC_ACTION, Action.SEMANTIC_ACTION_NONE);
+        }
+
         return new Action(action.icon, action.title, action.actionIntent,
-                action.getExtras(), remoteInputs, null, allowGeneratedReplies);
+                action.getExtras(), remoteInputs, null, allowGeneratedReplies,
+                semanticAction, showsUserInterface);
+    }
+
+    /** Returns the invisible actions contained within the given notification. */
+    @RequiresApi(21)
+    public static List<Action> getInvisibleActions(Notification notification) {
+        ArrayList<Action> result = new ArrayList<>();
+
+        Bundle carExtenderBundle = notification.extras.getBundle(CarExtender.EXTRA_CAR_EXTENDER);
+        if (carExtenderBundle == null) {
+            return result;
+        }
+
+        Bundle listBundle = carExtenderBundle.getBundle(CarExtender.EXTRA_INVISIBLE_ACTIONS);
+        if (listBundle != null) {
+            for (int i = 0; i < listBundle.size(); i++) {
+                result.add(NotificationCompatJellybean.getActionFromBundle(
+                        listBundle.getBundle(Integer.toString(i))));
+            }
+        }
+        return result;
     }
 
     /**
diff --git a/compat/src/main/java/android/support/v4/app/NotificationCompatBuilder.java b/compat/src/main/java/android/support/v4/app/NotificationCompatBuilder.java
index db775a5..35960d2 100644
--- a/compat/src/main/java/android/support/v4/app/NotificationCompatBuilder.java
+++ b/compat/src/main/java/android/support/v4/app/NotificationCompatBuilder.java
@@ -151,6 +151,26 @@
                 mBuilder.addPerson(person);
             }
             mHeadsUpContentView = b.mHeadsUpContentView;
+
+            // Invisible actions should be stored in the extender so we need to check if one exists
+            // already.
+            Bundle carExtenderBundle =
+                    b.getExtras().getBundle(NotificationCompat.CarExtender.EXTRA_CAR_EXTENDER);
+            if (carExtenderBundle == null) {
+                carExtenderBundle = new Bundle();
+            }
+            Bundle listBundle = new Bundle();
+            for (int i = 0; i < b.mInvisibleActions.size(); i++) {
+                listBundle.putBundle(
+                        Integer.toString(i),
+                        NotificationCompatJellybean.getBundleForAction(b.mInvisibleActions.get(i)));
+            }
+            carExtenderBundle.putBundle(
+                    NotificationCompat.CarExtender.EXTRA_INVISIBLE_ACTIONS, listBundle);
+            b.getExtras().putBundle(
+                    NotificationCompat.CarExtender.EXTRA_CAR_EXTENDER, carExtenderBundle);
+            mExtras.putBundle(
+                    NotificationCompat.CarExtender.EXTRA_CAR_EXTENDER, carExtenderBundle);
         }
         if (Build.VERSION.SDK_INT >= 24) {
             mBuilder.setExtras(b.mExtras)
@@ -248,6 +268,15 @@
             if (Build.VERSION.SDK_INT >= 24) {
                 actionBuilder.setAllowGeneratedReplies(action.getAllowGeneratedReplies());
             }
+
+            actionExtras.putInt(NotificationCompat.Action.EXTRA_SEMANTIC_ACTION,
+                    action.getSemanticAction());
+            if (Build.VERSION.SDK_INT >= 28) {
+                actionBuilder.setSemanticAction(action.getSemanticAction());
+            }
+
+            actionExtras.putBoolean(NotificationCompat.Action.EXTRA_SHOWS_USER_INTERFACE,
+                    action.getShowsUserInterface());
             actionBuilder.addExtras(actionExtras);
             mBuilder.addAction(actionBuilder.build());
         } else if (Build.VERSION.SDK_INT >= 16) {
diff --git a/compat/src/main/java/android/support/v4/app/NotificationCompatJellybean.java b/compat/src/main/java/android/support/v4/app/NotificationCompatJellybean.java
index 9cdd2e9..82f8941 100644
--- a/compat/src/main/java/android/support/v4/app/NotificationCompatJellybean.java
+++ b/compat/src/main/java/android/support/v4/app/NotificationCompatJellybean.java
@@ -129,7 +129,8 @@
             allowGeneratedReplies = extras.getBoolean(EXTRA_ALLOW_GENERATED_REPLIES);
         }
         return new NotificationCompat.Action(icon, title, actionIntent, extras, remoteInputs,
-                dataOnlyRemoteInputs, allowGeneratedReplies);
+                dataOnlyRemoteInputs, allowGeneratedReplies,
+                NotificationCompat.Action.SEMANTIC_ACTION_NONE, true);
     }
 
     public static Bundle writeActionAndGetExtras(
@@ -236,7 +237,9 @@
                 bundle.getBundle(KEY_EXTRAS),
                 fromBundleArray(getBundleArrayFromBundle(bundle, KEY_REMOTE_INPUTS)),
                 fromBundleArray(getBundleArrayFromBundle(bundle, KEY_DATA_ONLY_REMOTE_INPUTS)),
-                allowGeneratedReplies);
+                allowGeneratedReplies,
+                NotificationCompat.Action.SEMANTIC_ACTION_NONE,
+                true);
     }
 
     static Bundle getBundleForAction(NotificationCompat.Action action) {
diff --git a/compat/src/main/java/android/support/v4/content/pm/ShortcutInfoCompat.java b/compat/src/main/java/android/support/v4/content/pm/ShortcutInfoCompat.java
index 63585e1..bbfc805 100644
--- a/compat/src/main/java/android/support/v4/content/pm/ShortcutInfoCompat.java
+++ b/compat/src/main/java/android/support/v4/content/pm/ShortcutInfoCompat.java
@@ -301,10 +301,10 @@
         public ShortcutInfoCompat build() {
             // Verify the arguments
             if (TextUtils.isEmpty(mInfo.mLabel)) {
-                throw new IllegalArgumentException("Shortcut much have a non-empty label");
+                throw new IllegalArgumentException("Shortcut must have a non-empty label");
             }
             if (mInfo.mIntents == null || mInfo.mIntents.length == 0) {
-                throw new IllegalArgumentException("Shortcut much have an intent");
+                throw new IllegalArgumentException("Shortcut must have an intent");
             }
             return mInfo;
         }
diff --git a/compat/src/main/java/android/support/v4/content/res/FontResourcesParserCompat.java b/compat/src/main/java/android/support/v4/content/res/FontResourcesParserCompat.java
index 8ad07d3..f597e68 100644
--- a/compat/src/main/java/android/support/v4/content/res/FontResourcesParserCompat.java
+++ b/compat/src/main/java/android/support/v4/content/res/FontResourcesParserCompat.java
@@ -102,13 +102,17 @@
         private final @NonNull String mFileName;
         private int mWeight;
         private boolean mItalic;
+        private String mVariationSettings;
+        private int mTtcIndex;
         private int mResourceId;
 
         public FontFileResourceEntry(@NonNull String fileName, int weight, boolean italic,
-                int resourceId) {
+                @Nullable String variationSettings, int ttcIndex, int resourceId) {
             mFileName = fileName;
             mWeight = weight;
             mItalic = italic;
+            mVariationSettings = variationSettings;
+            mTtcIndex = ttcIndex;
             mResourceId = resourceId;
         }
 
@@ -124,6 +128,14 @@
             return mItalic;
         }
 
+        public @Nullable String getVariationSettings() {
+            return mVariationSettings;
+        }
+
+        public int getTtcIndex() {
+            return mTtcIndex;
+        }
+
         public int getResourceId() {
             return mResourceId;
         }
@@ -260,6 +272,15 @@
                 ? R.styleable.FontFamilyFont_fontStyle
                 : R.styleable.FontFamilyFont_android_fontStyle;
         boolean isItalic = ITALIC == array.getInt(styleAttr, 0);
+        final int ttcIndexAttr = array.hasValue(R.styleable.FontFamilyFont_ttcIndex)
+                ? R.styleable.FontFamilyFont_ttcIndex
+                : R.styleable.FontFamilyFont_android_ttcIndex;
+        final int variationSettingsAttr =
+                array.hasValue(R.styleable.FontFamilyFont_fontVariationSettings)
+                        ? R.styleable.FontFamilyFont_fontVariationSettings
+                        : R.styleable.FontFamilyFont_android_fontVariationSettings;
+        String variationSettings = array.getString(variationSettingsAttr);
+        int ttcIndex = array.getInt(ttcIndexAttr, 0);
         final int resourceAttr = array.hasValue(R.styleable.FontFamilyFont_font)
                 ? R.styleable.FontFamilyFont_font
                 : R.styleable.FontFamilyFont_android_font;
@@ -269,7 +290,8 @@
         while (parser.next() != XmlPullParser.END_TAG) {
             skip(parser);
         }
-        return new FontFileResourceEntry(filename, weight, isItalic, resourceId);
+        return new FontFileResourceEntry(filename, weight, isItalic, variationSettings, ttcIndex,
+                resourceId);
     }
 
     private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
diff --git a/compat/src/main/java/android/support/v4/graphics/TypefaceCompat.java b/compat/src/main/java/android/support/v4/graphics/TypefaceCompat.java
index 3c55df6..b763101 100644
--- a/compat/src/main/java/android/support/v4/graphics/TypefaceCompat.java
+++ b/compat/src/main/java/android/support/v4/graphics/TypefaceCompat.java
@@ -32,10 +32,10 @@
 import android.support.v4.content.res.FontResourcesParserCompat.FontFamilyFilesResourceEntry;
 import android.support.v4.content.res.FontResourcesParserCompat.ProviderResourceEntry;
 import android.support.v4.content.res.ResourcesCompat;
+import android.support.v4.os.BuildCompat;
 import android.support.v4.provider.FontsContractCompat;
 import android.support.v4.provider.FontsContractCompat.FontInfo;
 import android.support.v4.util.LruCache;
-
 /**
  * Helper for accessing features in {@link Typeface}.
  * @hide
@@ -46,7 +46,9 @@
 
     private static final TypefaceCompatImpl sTypefaceCompatImpl;
     static {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+        if (BuildCompat.isAtLeastP()) {
+            sTypefaceCompatImpl = new TypefaceCompatApi28Impl();
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             sTypefaceCompatImpl = new TypefaceCompatApi26Impl();
         } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
                 && TypefaceCompatApi24Impl.isUsable()) {
diff --git a/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi24Impl.java b/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi24Impl.java
index 89a6ec4..a8c1988 100644
--- a/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi24Impl.java
+++ b/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi24Impl.java
@@ -159,8 +159,7 @@
             if (buffer == null) {
                 return null;
             }
-            // TODO: support ttc index.
-            if (!addFontWeightStyle(family, buffer, 0, e.getWeight(), e.isItalic())) {
+            if (!addFontWeightStyle(family, buffer, e.getTtcIndex(), e.getWeight(), e.isItalic())) {
                 return null;
             }
         }
diff --git a/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java b/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java
index 28ab3ed..955284e 100644
--- a/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java
+++ b/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java
@@ -60,76 +60,70 @@
             "createFromFamiliesWithDefault";
     private static final String FREEZE_METHOD = "freeze";
     private static final String ABORT_CREATION_METHOD = "abortCreation";
-    private static final Class sFontFamily;
-    private static final Constructor sFontFamilyCtor;
-    private static final Method sAddFontFromAssetManager;
-    private static final Method sAddFontFromBuffer;
-    private static final Method sFreeze;
-    private static final Method sAbortCreation;
-    private static final Method sCreateFromFamiliesWithDefault;
     private static final int RESOLVE_BY_FONT_TABLE = -1;
+    private static final String DEFAULT_FAMILY = "sans-serif";
 
-    static {
-        Class fontFamilyClass;
+    protected final Class mFontFamily;
+    protected final Constructor mFontFamilyCtor;
+    protected final Method mAddFontFromAssetManager;
+    protected final Method mAddFontFromBuffer;
+    protected final Method mFreeze;
+    protected final Method mAbortCreation;
+    protected final Method mCreateFromFamiliesWithDefault;
+
+    public TypefaceCompatApi26Impl() {
+        Class fontFamily;
         Constructor fontFamilyCtor;
-        Method addFontMethod;
-        Method addFromBufferMethod;
-        Method freezeMethod;
-        Method abortCreationMethod;
-        Method createFromFamiliesWithDefaultMethod;
+        Method addFontFromAssetManager;
+        Method addFontFromBuffer;
+        Method freeze;
+        Method abortCreation;
+        Method createFromFamiliesWithDefault;
         try {
-            fontFamilyClass = Class.forName(FONT_FAMILY_CLASS);
-            fontFamilyCtor = fontFamilyClass.getConstructor();
-            addFontMethod = fontFamilyClass.getMethod(ADD_FONT_FROM_ASSET_MANAGER_METHOD,
-                    AssetManager.class, String.class, Integer.TYPE, Boolean.TYPE, Integer.TYPE,
-                    Integer.TYPE, Integer.TYPE, FontVariationAxis[].class);
-            addFromBufferMethod = fontFamilyClass.getMethod(ADD_FONT_FROM_BUFFER_METHOD,
-                    ByteBuffer.class, Integer.TYPE, FontVariationAxis[].class, Integer.TYPE,
-                    Integer.TYPE);
-            freezeMethod = fontFamilyClass.getMethod(FREEZE_METHOD);
-            abortCreationMethod = fontFamilyClass.getMethod(ABORT_CREATION_METHOD);
-            Object familyArray = Array.newInstance(fontFamilyClass, 1);
-            createFromFamiliesWithDefaultMethod =
-                    Typeface.class.getDeclaredMethod(CREATE_FROM_FAMILIES_WITH_DEFAULT_METHOD,
-                            familyArray.getClass(), Integer.TYPE, Integer.TYPE);
-            createFromFamiliesWithDefaultMethod.setAccessible(true);
+            fontFamily = obtainFontFamily();
+            fontFamilyCtor = obtainFontFamilyCtor(fontFamily);
+            addFontFromAssetManager = obtainAddFontFromAssetManagerMethod(fontFamily);
+            addFontFromBuffer = obtainAddFontFromBufferMethod(fontFamily);
+            freeze = obtainFreezeMethod(fontFamily);
+            abortCreation = obtainAbortCreationMethod(fontFamily);
+            createFromFamiliesWithDefault = obtainCreateFromFamiliesWithDefaultMethod(fontFamily);
         } catch (ClassNotFoundException | NoSuchMethodException e) {
             Log.e(TAG, "Unable to collect necessary methods for class " + e.getClass().getName(),
                     e);
-            fontFamilyClass = null;
+            fontFamily = null;
             fontFamilyCtor = null;
-            addFontMethod = null;
-            addFromBufferMethod = null;
-            freezeMethod = null;
-            abortCreationMethod = null;
-            createFromFamiliesWithDefaultMethod = null;
+            addFontFromAssetManager = null;
+            addFontFromBuffer = null;
+            freeze = null;
+            abortCreation = null;
+            createFromFamiliesWithDefault = null;
         }
-        sFontFamilyCtor = fontFamilyCtor;
-        sFontFamily = fontFamilyClass;
-        sAddFontFromAssetManager = addFontMethod;
-        sAddFontFromBuffer = addFromBufferMethod;
-        sFreeze = freezeMethod;
-        sAbortCreation = abortCreationMethod;
-        sCreateFromFamiliesWithDefault = createFromFamiliesWithDefaultMethod;
+        mFontFamily = fontFamily;
+        mFontFamilyCtor = fontFamilyCtor;
+        mAddFontFromAssetManager = addFontFromAssetManager;
+        mAddFontFromBuffer = addFontFromBuffer;
+        mFreeze = freeze;
+        mAbortCreation = abortCreation;
+        mCreateFromFamiliesWithDefault = createFromFamiliesWithDefault;
     }
 
     /**
-     * Returns true if API26 implementation is usable.
+     * Returns true if all the necessary methods were found.
      */
-    private static boolean isFontFamilyPrivateAPIAvailable() {
-        if (sAddFontFromAssetManager == null) {
+    private boolean isFontFamilyPrivateAPIAvailable() {
+        if (mAddFontFromAssetManager == null) {
             Log.w(TAG, "Unable to collect necessary private methods. "
                     + "Fallback to legacy implementation.");
         }
-        return sAddFontFromAssetManager != null;
+        return mAddFontFromAssetManager != null;
     }
 
     /**
      * Create a new FontFamily instance
      */
-    private static Object newFamily() {
+    private Object newFamily() {
         try {
-            return sFontFamilyCtor.newInstance();
+            return mFontFamilyCtor.newInstance();
         } catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {
             throw new RuntimeException(e);
         }
@@ -139,12 +133,12 @@
      * Call FontFamily#addFontFromAssetManager(AssetManager mgr, String path, int cookie,
      *      boolean isAsset, int ttcIndex, int weight, int isItalic, FontVariationAxis[] axes)
      */
-    private static boolean addFontFromAssetManager(Context context, Object family, String fileName,
-            int ttcIndex, int weight, int style) {
+    private boolean addFontFromAssetManager(Context context, Object family, String fileName,
+            int ttcIndex, int weight, int style, @Nullable FontVariationAxis[] axes) {
         try {
-            final Boolean result = (Boolean) sAddFontFromAssetManager.invoke(family,
+            final Boolean result = (Boolean) mAddFontFromAssetManager.invoke(family,
                     context.getAssets(), fileName, 0 /* cookie */, false /* isAsset */, ttcIndex,
-                    weight, style, null /* axes */);
+                    weight, style, axes);
             return result.booleanValue();
         } catch (IllegalAccessException | InvocationTargetException e) {
             throw new RuntimeException(e);
@@ -155,10 +149,10 @@
      * Call FontFamily#addFontFromBuffer(ByteBuffer font, int ttcIndex, FontVariationAxis[] axes,
      *      int weight, int italic)
      */
-    private static boolean addFontFromBuffer(Object family, ByteBuffer buffer,
+    private boolean addFontFromBuffer(Object family, ByteBuffer buffer,
             int ttcIndex, int weight, int style) {
         try {
-            final Boolean result = (Boolean) sAddFontFromBuffer.invoke(family,
+            final Boolean result = (Boolean) mAddFontFromBuffer.invoke(family,
                     buffer, ttcIndex, null /* axes */, weight, style);
             return result.booleanValue();
         } catch (IllegalAccessException | InvocationTargetException e) {
@@ -167,14 +161,14 @@
     }
 
     /**
-     * Call static method Typeface#createFromFamiliesWithDefault(
+     * Call method Typeface#createFromFamiliesWithDefault(
      *      FontFamily[] families, int weight, int italic)
      */
-    private static Typeface createFromFamiliesWithDefault(Object family) {
+    protected Typeface createFromFamiliesWithDefault(Object family) {
         try {
-            Object familyArray = Array.newInstance(sFontFamily, 1);
+            Object familyArray = Array.newInstance(mFontFamily, 1);
             Array.set(familyArray, 0, family);
-            return (Typeface) sCreateFromFamiliesWithDefault.invoke(null /* static method */,
+            return (Typeface) mCreateFromFamiliesWithDefault.invoke(null /* static method */,
                     familyArray, RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE);
         } catch (IllegalAccessException | InvocationTargetException e) {
             throw new RuntimeException(e);
@@ -184,9 +178,9 @@
     /**
      * Call FontFamily#freeze()
      */
-    private static boolean freeze(Object family) {
+    private boolean freeze(Object family) {
         try {
-            Boolean result = (Boolean) sFreeze.invoke(family);
+            Boolean result = (Boolean) mFreeze.invoke(family);
             return result.booleanValue();
         } catch (IllegalAccessException | InvocationTargetException e) {
             throw new RuntimeException(e);
@@ -196,9 +190,9 @@
     /**
      * Call FontFamily#abortCreation()
      */
-    private static void abortCreation(Object family) {
+    private void abortCreation(Object family) {
         try {
-            sAbortCreation.invoke(family);
+            mAbortCreation.invoke(family);
         } catch (IllegalAccessException | InvocationTargetException e) {
             throw new RuntimeException(e);
         }
@@ -213,9 +207,9 @@
         }
         Object fontFamily = newFamily();
         for (final FontFileResourceEntry fontFile : entry.getEntries()) {
-            // TODO: Add ttc and variation font support. (b/37853920)
             if (!addFontFromAssetManager(context, fontFamily, fontFile.getFileName(),
-                    0 /* ttcIndex */, fontFile.getWeight(), fontFile.isItalic() ? 1 : 0)) {
+                    fontFile.getTtcIndex(), fontFile.getWeight(), fontFile.isItalic() ? 1 : 0,
+                    FontVariationAxis.fromFontVariationSettings(fontFile.getVariationSettings()))) {
                 abortCreation(fontFamily);
                 return null;
             }
@@ -292,7 +286,7 @@
         Object fontFamily = newFamily();
         if (!addFontFromAssetManager(context, fontFamily, path,
                 0 /* ttcIndex */, RESOLVE_BY_FONT_TABLE /* weight */,
-                RESOLVE_BY_FONT_TABLE /* italic */)) {
+                RESOLVE_BY_FONT_TABLE /* italic */, null /* axes */)) {
             abortCreation(fontFamily);
             return null;
         }
@@ -301,4 +295,47 @@
         }
         return createFromFamiliesWithDefault(fontFamily);
     }
+
+    // The following getters retrieve by reflection the Typeface methods, belonging to the
+    // framework code, which will be invoked. Since the definitions of these methods can change
+    // across different API versions, inheriting classes should override these getters in order to
+    // reflect the method definitions in the API versions they represent.
+    //===========================================================================================
+    protected Class obtainFontFamily() throws ClassNotFoundException {
+        return Class.forName(FONT_FAMILY_CLASS);
+    }
+
+    protected Constructor obtainFontFamilyCtor(Class fontFamily) throws NoSuchMethodException {
+        return fontFamily.getConstructor();
+    }
+
+    protected Method obtainAddFontFromAssetManagerMethod(Class fontFamily)
+            throws NoSuchMethodException {
+        return fontFamily.getMethod(ADD_FONT_FROM_ASSET_MANAGER_METHOD,
+                AssetManager.class, String.class, Integer.TYPE, Boolean.TYPE, Integer.TYPE,
+                Integer.TYPE, Integer.TYPE, FontVariationAxis[].class);
+    }
+
+    protected Method obtainAddFontFromBufferMethod(Class fontFamily) throws NoSuchMethodException {
+        return fontFamily.getMethod(ADD_FONT_FROM_BUFFER_METHOD,
+                ByteBuffer.class, Integer.TYPE, FontVariationAxis[].class, Integer.TYPE,
+                Integer.TYPE);
+    }
+
+    protected Method obtainFreezeMethod(Class fontFamily) throws NoSuchMethodException {
+        return fontFamily.getMethod(FREEZE_METHOD);
+    }
+
+    protected Method obtainAbortCreationMethod(Class fontFamily) throws NoSuchMethodException {
+        return fontFamily.getMethod(ABORT_CREATION_METHOD);
+    }
+
+    protected Method obtainCreateFromFamiliesWithDefaultMethod(Class fontFamily)
+            throws NoSuchMethodException {
+        Object familyArray = Array.newInstance(fontFamily, 1);
+        Method m =  Typeface.class.getDeclaredMethod(CREATE_FROM_FAMILIES_WITH_DEFAULT_METHOD,
+                familyArray.getClass(), Integer.TYPE, Integer.TYPE);
+        m.setAccessible(true);
+        return m;
+    }
 }
diff --git a/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi28Impl.java b/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi28Impl.java
new file mode 100644
index 0000000..baa2ce6
--- /dev/null
+++ b/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi28Impl.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.graphics;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
+import android.graphics.Typeface;
+import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Implementation of the Typeface compat methods for API 28 and above.
+ * @hide
+ */
+@RestrictTo(LIBRARY_GROUP)
+@RequiresApi(28)
+public class TypefaceCompatApi28Impl extends TypefaceCompatApi26Impl {
+    private static final String TAG = "TypefaceCompatApi28Impl";
+
+    private static final String CREATE_FROM_FAMILIES_WITH_DEFAULT_METHOD =
+            "createFromFamiliesWithDefault";
+    private static final int RESOLVE_BY_FONT_TABLE = -1;
+    private static final String DEFAULT_FAMILY = "sans-serif";
+
+    /**
+     * Call method Typeface#createFromFamiliesWithDefault(
+     *      FontFamily[] families, String fallbackName, int weight, int italic)
+     */
+    @Override
+    protected Typeface createFromFamiliesWithDefault(Object family) {
+        try {
+            Object familyArray = Array.newInstance(mFontFamily, 1);
+            Array.set(familyArray, 0, family);
+            return (Typeface) mCreateFromFamiliesWithDefault.invoke(null /* static method */,
+                    familyArray, DEFAULT_FAMILY, RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE);
+        } catch (IllegalAccessException | InvocationTargetException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    protected Method obtainCreateFromFamiliesWithDefaultMethod(Class fontFamily)
+            throws NoSuchMethodException {
+        Object familyArray = Array.newInstance(fontFamily, 1);
+        Method m =  Typeface.class.getDeclaredMethod(CREATE_FROM_FAMILIES_WITH_DEFAULT_METHOD,
+                familyArray.getClass(), String.class, Integer.TYPE, Integer.TYPE);
+        m.setAccessible(true);
+        return m;
+    }
+}
diff --git a/compat/src/main/java/android/support/v4/graphics/drawable/IconCompat.java b/compat/src/main/java/android/support/v4/graphics/drawable/IconCompat.java
index 359c96b..dc226c1 100644
--- a/compat/src/main/java/android/support/v4/graphics/drawable/IconCompat.java
+++ b/compat/src/main/java/android/support/v4/graphics/drawable/IconCompat.java
@@ -220,6 +220,7 @@
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP)
+    @SuppressWarnings("deprecation")
     public void addToShortcutIntent(@NonNull Intent outIntent, @Nullable Drawable badge) {
         Bitmap icon;
         switch (mType) {
diff --git a/compat/src/main/java/android/support/v4/util/LongSparseArray.java b/compat/src/main/java/android/support/v4/util/LongSparseArray.java
index 25b6bb9..febb5d5 100644
--- a/compat/src/main/java/android/support/v4/util/LongSparseArray.java
+++ b/compat/src/main/java/android/support/v4/util/LongSparseArray.java
@@ -235,6 +235,14 @@
     }
 
     /**
+     * Return true if size() is 0.
+     * @return true if size() is 0.
+     */
+    public boolean isEmpty() {
+        return size() == 0;
+    }
+
+    /**
      * Given an index in the range <code>0...size()-1</code>, returns
      * the key from the <code>index</code>th key-value mapping that this
      * LongSparseArray stores.
diff --git a/compat/src/main/java/android/support/v4/util/SparseArrayCompat.java b/compat/src/main/java/android/support/v4/util/SparseArrayCompat.java
index aedc4ad..5238cf0 100644
--- a/compat/src/main/java/android/support/v4/util/SparseArrayCompat.java
+++ b/compat/src/main/java/android/support/v4/util/SparseArrayCompat.java
@@ -228,6 +228,14 @@
     }
 
     /**
+     * Return true if size() is 0.
+     * @return true if size() is 0.
+     */
+    public boolean isEmpty() {
+        return size() == 0;
+    }
+
+    /**
      * Given an index in the range <code>0...size()-1</code>, returns
      * the key from the <code>index</code>th key-value mapping that this
      * SparseArray stores.
diff --git a/compat/src/main/java/android/support/v4/view/ViewConfigurationCompat.java b/compat/src/main/java/android/support/v4/view/ViewConfigurationCompat.java
index 60d37a9..a12387b 100644
--- a/compat/src/main/java/android/support/v4/view/ViewConfigurationCompat.java
+++ b/compat/src/main/java/android/support/v4/view/ViewConfigurationCompat.java
@@ -117,5 +117,17 @@
         return 0;
     }
 
+    /**
+     * @param config Used to get the hover slop directly from the {@link ViewConfiguration}.
+     *
+     * @return The hover slop value.
+     */
+    public static int getScaledHoverSlop(ViewConfiguration config) {
+        if (android.os.Build.VERSION.SDK_INT >= 28) {
+            return config.getScaledHoverSlop();
+        }
+        return config.getScaledTouchSlop() / 2;
+    }
+
     private ViewConfigurationCompat() {}
 }
diff --git a/compat/src/main/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java b/compat/src/main/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
index 327be01..d76481c 100644
--- a/compat/src/main/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
+++ b/compat/src/main/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
@@ -2343,16 +2343,18 @@
 
     public void setCollectionInfo(Object collectionInfo) {
         if (Build.VERSION.SDK_INT >= 19) {
-            mInfo.setCollectionInfo((AccessibilityNodeInfo.CollectionInfo)
-                    ((CollectionInfoCompat) collectionInfo).mInfo);
+            mInfo.setCollectionInfo((collectionInfo == null) ? null
+                    : (AccessibilityNodeInfo.CollectionInfo) ((CollectionInfoCompat)
+                            collectionInfo).mInfo);
         }
 
     }
 
     public void setCollectionItemInfo(Object collectionItemInfo) {
         if (Build.VERSION.SDK_INT >= 19) {
-            mInfo.setCollectionItemInfo((AccessibilityNodeInfo.CollectionItemInfo)
-                    ((CollectionItemInfoCompat) collectionItemInfo).mInfo);
+            mInfo.setCollectionItemInfo((collectionItemInfo == null) ? null
+                    : (AccessibilityNodeInfo.CollectionItemInfo) ((CollectionItemInfoCompat)
+                            collectionItemInfo).mInfo);
         }
     }
 
diff --git a/compat/tests/java/android/support/v4/app/NotificationCompatTest.java b/compat/tests/java/android/support/v4/app/NotificationCompatTest.java
index 41da709..903778f 100644
--- a/compat/tests/java/android/support/v4/app/NotificationCompatTest.java
+++ b/compat/tests/java/android/support/v4/app/NotificationCompatTest.java
@@ -23,7 +23,6 @@
 import static android.support.v4.app.NotificationCompat.GROUP_ALERT_ALL;
 import static android.support.v4.app.NotificationCompat.GROUP_ALERT_CHILDREN;
 import static android.support.v4.app.NotificationCompat.GROUP_ALERT_SUMMARY;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -49,6 +48,7 @@
 import org.junit.runner.RunWith;
 
 import java.util.ArrayList;
+import java.util.List;
 
 
 @RunWith(AndroidJUnit4.class)
@@ -200,6 +200,13 @@
     }
 
     @Test
+    public void testNotificationActionBuilder_defaultShowsUserInterfaceTrue() {
+        NotificationCompat.Action action = newActionBuilder().build();
+
+        assertTrue(action.getShowsUserInterface());
+    }
+
+    @Test
     public void testNotificationAction_defaultAllowGeneratedRepliesTrue() throws Throwable {
         NotificationCompat.Action a = new NotificationCompat.Action(0, null, null);
 
@@ -207,6 +214,13 @@
     }
 
     @Test
+    public void testNotificationAction_defaultShowsUserInterfaceTrue() {
+        NotificationCompat.Action action = new NotificationCompat.Action(0, null, null);
+
+        assertTrue(action.getShowsUserInterface());
+    }
+
+    @Test
     public void testNotificationActionBuilder_setAllowGeneratedRepliesFalse() throws Throwable {
         NotificationCompat.Action a = newActionBuilder()
                 .setAllowGeneratedReplies(false).build();
@@ -214,6 +228,28 @@
         assertFalse(a.getAllowGeneratedReplies());
     }
 
+    @Test
+    public void testNotificationAction_setShowsUserInterfaceFalse() {
+        NotificationCompat.Action action = newActionBuilder()
+                .setShowsUserInterface(false).build();
+
+        assertFalse(action.getShowsUserInterface());
+    }
+
+    @SdkSuppress(minSdkVersion = 20)
+    @Test
+    public void testGetActionCompatFromAction_showsUserInterface() {
+        NotificationCompat.Action action = newActionBuilder()
+                .setShowsUserInterface(false).build();
+        Notification notification = newNotificationBuilder().addAction(action).build();
+        NotificationCompat.Action result =
+                NotificationCompat.getActionCompatFromAction(notification.actions[0]);
+
+        assertFalse(result.getExtras().getBoolean(
+                NotificationCompat.Action.EXTRA_SHOWS_USER_INTERFACE, true));
+        assertFalse(result.getShowsUserInterface());
+    }
+
     @SdkSuppress(minSdkVersion = 17)
     @Test
     public void testNotificationWearableExtenderAction_setAllowGeneratedRepliesTrue()
@@ -488,6 +524,147 @@
         assertEquals(100, n.ledOffMS);
     }
 
+    @Test
+    public void messagingStyle_isGroupConversation() {
+        mContext.getApplicationInfo().targetSdkVersion = Build.VERSION_CODES.P;
+        NotificationCompat.MessagingStyle messagingStyle =
+                new NotificationCompat.MessagingStyle("self name")
+                        .setGroupConversation(true)
+                        .setConversationTitle("test conversation title");
+        new NotificationCompat.Builder(mContext, "test id")
+                .setSmallIcon(1)
+                .setContentTitle("test title")
+                .setStyle(messagingStyle)
+                .build();
+
+        assertTrue(messagingStyle.isGroupConversation());
+    }
+
+    @Test
+    public void messagingStyle_isGroupConversation_noConversationTitle() {
+        mContext.getApplicationInfo().targetSdkVersion = Build.VERSION_CODES.P;
+        NotificationCompat.MessagingStyle messagingStyle =
+                new NotificationCompat.MessagingStyle("self name")
+                        .setGroupConversation(true)
+                        .setConversationTitle(null);
+        new NotificationCompat.Builder(mContext, "test id")
+                .setSmallIcon(1)
+                .setContentTitle("test title")
+                .setStyle(messagingStyle)
+                .build();
+
+        assertTrue(messagingStyle.isGroupConversation());
+    }
+
+    @Test
+    public void messagingStyle_isGroupConversation_withConversationTitle_legacy() {
+        // In legacy (version < P), isGroupConversation is controlled by conversationTitle.
+        mContext.getApplicationInfo().targetSdkVersion = Build.VERSION_CODES.O;
+        NotificationCompat.MessagingStyle messagingStyle =
+                new NotificationCompat.MessagingStyle("self name")
+                        .setGroupConversation(false)
+                        .setConversationTitle("test conversation title");
+        new NotificationCompat.Builder(mContext, "test id")
+                .setSmallIcon(1)
+                .setContentTitle("test title")
+                .setStyle(messagingStyle)
+                .build();
+
+        assertTrue(messagingStyle.isGroupConversation());
+    }
+
+    @Test
+    public void messagingStyle_isGroupConversation_withoutConversationTitle_legacy() {
+        // In legacy (version < P), isGroupConversation is controlled by conversationTitle.
+        mContext.getApplicationInfo().targetSdkVersion = Build.VERSION_CODES.O;
+        NotificationCompat.MessagingStyle messagingStyle =
+                new NotificationCompat.MessagingStyle("self name")
+                        .setGroupConversation(true)
+                        .setConversationTitle(null);
+        new NotificationCompat.Builder(mContext, "test id")
+                .setSmallIcon(1)
+                .setContentTitle("test title")
+                .setStyle(messagingStyle)
+                .build();
+
+        assertFalse(messagingStyle.isGroupConversation());
+    }
+
+    @Test
+    public void testMessagingStyle_extras() {
+        NotificationCompat.MessagingStyle messagingStyle =
+                new NotificationCompat.MessagingStyle("test name")
+                        .setGroupConversation(true);
+        Bundle bundle = new Bundle();
+        messagingStyle.addCompatExtras(bundle);
+
+        NotificationCompat.MessagingStyle resultMessagingStyle =
+                new NotificationCompat.MessagingStyle("test name");
+        resultMessagingStyle.restoreFromCompatExtras(bundle);
+
+        assertTrue(resultMessagingStyle.isGroupConversation());
+    }
+
+    @Test
+    public void action_builder_hasDefault() {
+        NotificationCompat.Action action =
+                new NotificationCompat.Action.Builder(0, "Test Title", null).build();
+        assertEquals(NotificationCompat.Action.SEMANTIC_ACTION_NONE, action.getSemanticAction());
+    }
+
+    @Test
+    public void action_builder_setSemanticAction() {
+        NotificationCompat.Action action =
+                new NotificationCompat.Action.Builder(0, "Test Title", null)
+                        .setSemanticAction(NotificationCompat.Action.SEMANTIC_ACTION_REPLY)
+                        .build();
+        assertEquals(NotificationCompat.Action.SEMANTIC_ACTION_REPLY, action.getSemanticAction());
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 20)
+    public void action_semanticAction_toAndFromNotification() {
+        NotificationCompat.Action action =
+                new NotificationCompat.Action.Builder(0, "Test Title", null)
+                        .setSemanticAction(NotificationCompat.Action.SEMANTIC_ACTION_REPLY)
+                        .build();
+        Notification notification = newNotificationBuilder().addAction(action).build();
+        NotificationCompat.Action result = NotificationCompat.getAction(notification, 0);
+
+        assertEquals(NotificationCompat.Action.SEMANTIC_ACTION_REPLY, result.getSemanticAction());
+    }
+
+    private static final NotificationCompat.Action TEST_INVISIBLE_ACTION =
+            new NotificationCompat.Action.Builder(0, "Test Title", null).build();
+
+    @Test
+    @SdkSuppress(minSdkVersion = 21)
+    public void getInvisibleActions() {
+        Notification notification =
+                newNotificationBuilder().addInvisibleAction(TEST_INVISIBLE_ACTION).build();
+        verifyInvisibleActionExists(notification);
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 21)
+    public void getInvisibleActions_withCarExtender() {
+        NotificationCompat.CarExtender carExtender = new NotificationCompat.CarExtender();
+        Notification notification = newNotificationBuilder()
+                .addInvisibleAction(TEST_INVISIBLE_ACTION)
+                .extend(carExtender)
+                .build();
+        verifyInvisibleActionExists(notification);
+    }
+
+    private static void verifyInvisibleActionExists(Notification notification) {
+        List<NotificationCompat.Action> result =
+                NotificationCompat.getInvisibleActions(notification);
+        assertTrue("Expecting 1 result, got " + result.size(), result.size() == 1);
+        NotificationCompat.Action resultAction = result.get(0);
+        assertEquals(resultAction.getIcon(), TEST_INVISIBLE_ACTION.getIcon());
+        assertEquals(resultAction.getTitle(), TEST_INVISIBLE_ACTION.getTitle());
+    }
+
     private static RemoteInput newDataOnlyRemoteInput() {
         return new RemoteInput.Builder(DATA_RESULT_KEY)
             .setAllowFreeFormInput(false)
diff --git a/compat/tests/java/android/support/v4/content/res/FontResourcesParserCompatTest.java b/compat/tests/java/android/support/v4/content/res/FontResourcesParserCompatTest.java
index 6120eed..f503d99 100644
--- a/compat/tests/java/android/support/v4/content/res/FontResourcesParserCompatTest.java
+++ b/compat/tests/java/android/support/v4/content/res/FontResourcesParserCompatTest.java
@@ -63,7 +63,7 @@
     @Test
     public void testParse() throws XmlPullParserException, IOException {
         @SuppressLint("ResourceType")
-        XmlResourceParser parser = mResources.getXml(R.font.samplexmlfont);
+        XmlResourceParser parser = mResources.getXml(R.font.samplexmlfontforparsing);
 
         FamilyResourceEntry result = FontResourcesParserCompat.parse(parser, mResources);
 
@@ -74,18 +74,26 @@
         FontFileResourceEntry font1 = fileEntries[0];
         assertEquals(400, font1.getWeight());
         assertEquals(false, font1.isItalic());
+        assertEquals("'wdth' 0.8", font1.getVariationSettings());
+        assertEquals(0, font1.getTtcIndex());
         assertEquals(R.font.samplefont, font1.getResourceId());
         FontFileResourceEntry font2 = fileEntries[1];
         assertEquals(400, font2.getWeight());
         assertEquals(true, font2.isItalic());
+        assertEquals("'contrast' 0.5", font2.getVariationSettings());
+        assertEquals(1, font2.getTtcIndex());
         assertEquals(R.font.samplefont2, font2.getResourceId());
         FontFileResourceEntry font3 = fileEntries[2];
         assertEquals(700, font3.getWeight());
         assertEquals(false, font3.isItalic());
+        assertEquals("'wdth' 500.0, 'wght' 300.0", font3.getVariationSettings());
+        assertEquals(2, font3.getTtcIndex());
         assertEquals(R.font.samplefont3, font3.getResourceId());
         FontFileResourceEntry font4 = fileEntries[3];
         assertEquals(700, font4.getWeight());
         assertEquals(true, font4.isItalic());
+        assertEquals(null, font4.getVariationSettings());
+        assertEquals(0, font4.getTtcIndex());
         assertEquals(R.font.samplefont4, font4.getResourceId());
     }
 
@@ -98,7 +106,7 @@
         }
 
         @SuppressLint("ResourceType")
-        XmlResourceParser parser = mResources.getXml(R.font.samplexmlfont2);
+        XmlResourceParser parser = mResources.getXml(R.font.samplexmlfontforparsing2);
 
         FamilyResourceEntry result = FontResourcesParserCompat.parse(parser, mResources);
 
@@ -109,18 +117,26 @@
         FontFileResourceEntry font1 = fileEntries[0];
         assertEquals(400, font1.getWeight());
         assertEquals(false, font1.isItalic());
+        assertEquals("'wdth' 0.8", font1.getVariationSettings());
+        assertEquals(0, font1.getTtcIndex());
         assertEquals(R.font.samplefont, font1.getResourceId());
         FontFileResourceEntry font2 = fileEntries[1];
         assertEquals(400, font2.getWeight());
         assertEquals(true, font2.isItalic());
+        assertEquals("'contrast' 0.5", font2.getVariationSettings());
+        assertEquals(1, font2.getTtcIndex());
         assertEquals(R.font.samplefont2, font2.getResourceId());
         FontFileResourceEntry font3 = fileEntries[2];
         assertEquals(700, font3.getWeight());
         assertEquals(false, font3.isItalic());
+        assertEquals("'wdth' 500.0, 'wght' 300.0", font3.getVariationSettings());
+        assertEquals(2, font3.getTtcIndex());
         assertEquals(R.font.samplefont3, font3.getResourceId());
         FontFileResourceEntry font4 = fileEntries[3];
         assertEquals(700, font4.getWeight());
         assertEquals(true, font4.isItalic());
+        assertEquals(null, font4.getVariationSettings());
+        assertEquals(0, font4.getTtcIndex());
         assertEquals(R.font.samplefont4, font4.getResourceId());
     }
 
diff --git a/compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java b/compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java
index dff4c33..9c27966 100644
--- a/compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java
+++ b/compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java
@@ -31,6 +31,7 @@
 import android.content.res.Resources;
 import android.graphics.Paint;
 import android.graphics.Typeface;
+import android.os.Build;
 import android.support.annotation.NonNull;
 import android.support.compat.test.R;
 import android.support.test.InstrumentationRegistry;
@@ -356,6 +357,81 @@
         assertEquals(R.font.large_d, getSelectedFontResourceId(typeface));
     }
 
+    private Typeface getLargerTypeface(String text, Typeface typeface1, Typeface typeface2) {
+        Paint p1 = new Paint();
+        p1.setTypeface(typeface1);
+        float width1 = p1.measureText(text);
+        Paint p2 = new Paint();
+        p2.setTypeface(typeface2);
+        float width2 = p2.measureText(text);
+
+        if (width1 > width2) {
+            return typeface1;
+        } else if (width1 < width2) {
+            return typeface2;
+        } else {
+            assertTrue(false);
+            return null;
+        }
+    }
+
+    @Test
+    public void testCreateFromResourcesFamilyXml_resourceTtcFont() throws Exception {
+        // Here we test that building typefaces by indexing in font collections works correctly.
+        // We want to ensure that the built typefaces correspond to the fonts with the right index.
+        // sample_font_collection.ttc contains two fonts (with indices 0 and 1). The first one has
+        // glyph "a" of 3em width, and all the other glyphs 1em. The second one has glyph "b" of
+        // 3em width, and all the other glyphs 1em. Hence, we can compare the width of these
+        // glyphs to assert that ttc indexing works.
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
+            // Creating typefaces with ttc index was only supported in the API starting with N.
+            return;
+        }
+        final FamilyResourceEntry entry1 = FontResourcesParserCompat.parse(
+                mResources.getXml(R.font.ttctestfont1), mResources);
+        Typeface typeface1 = TypefaceCompat.createFromResourcesFamilyXml(mContext, entry1,
+                mResources, R.font.ttctestfont1, Typeface.NORMAL, null /* callback */,
+                null /*handler */, false /* isXmlRequest */);
+        assertNotNull(typeface1);
+        final FamilyResourceEntry entry2 = FontResourcesParserCompat.parse(
+                mResources.getXml(R.font.ttctestfont2), mResources);
+        Typeface typeface2 = TypefaceCompat.createFromResourcesFamilyXml(mContext, entry2,
+                mResources, R.font.ttctestfont2, Typeface.NORMAL, null /* callback */,
+                null /*handler */, false /* isXmlRequest */);
+        assertNotNull(typeface2);
+
+        assertEquals(getLargerTypeface("a", typeface1, typeface2), typeface1);
+        assertEquals(getLargerTypeface("b", typeface1, typeface2), typeface2);
+    }
+
+    @Test
+    public void testCreateFromResourcesFamilyXml_resourceFontWithVariationSettings()
+            throws Exception {
+        // Here we test that specifying variation settings for fonts in XMLs works correctly.
+        // We build typefaces from two families containing one font each, using the same font
+        // resource, but having different values for the 'wdth' tag. Then we measure the painted
+        // text to ensure that the tag affects the text width. The font resource used supports
+        // the 'wdth' axis for the dash (-) character.
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+            // Variation settings are only supported on O and newer.
+            return;
+        }
+        final FamilyResourceEntry entry1 = FontResourcesParserCompat.parse(
+                mResources.getXml(R.font.variationsettingstestfont1), mResources);
+        Typeface typeface1 = TypefaceCompat.createFromResourcesFamilyXml(mContext, entry1,
+                mResources, R.font.variationsettingstestfont1, Typeface.NORMAL, null /* callback */,
+                null /*handler */, false /* isXmlRequest */);
+        assertNotNull(typeface1);
+        final FamilyResourceEntry entry2 = FontResourcesParserCompat.parse(
+                mResources.getXml(R.font.variationsettingstestfont2), mResources);
+        Typeface typeface2 = TypefaceCompat.createFromResourcesFamilyXml(mContext, entry2,
+                mResources, R.font.variationsettingstestfont2, Typeface.NORMAL, null /* callback */,
+                null /*handler */, false /* isXmlRequest */);
+        assertNotNull(typeface2);
+
+        assertEquals(getLargerTypeface("-", typeface1, typeface2), typeface2);
+    }
+
     @Test
     public void testCreateFromResourcesFontFile() {
         Typeface typeface = TypefaceCompat.createFromResourcesFontFile(mContext, mResources,
diff --git a/compat/tests/java/android/support/v4/util/LongSparseArrayTest.java b/compat/tests/java/android/support/v4/util/LongSparseArrayTest.java
new file mode 100644
index 0000000..663ea48
--- /dev/null
+++ b/compat/tests/java/android/support/v4/util/LongSparseArrayTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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 android.support.v4.util;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class LongSparseArrayTest {
+    @Test
+    public void isEmpty() throws Exception {
+        LongSparseArray<String> LongSparseArray = new LongSparseArray<>();
+        assertTrue(LongSparseArray.isEmpty()); // Newly created LongSparseArray should be empty
+
+        // Adding elements should change state from empty to not empty.
+        for (long i = 0L; i < 5L; i++) {
+            LongSparseArray.put(i, Long.toString(i));
+            assertFalse(LongSparseArray.isEmpty());
+        }
+        LongSparseArray.clear();
+        assertTrue(LongSparseArray.isEmpty()); // A cleared LongSparseArray should be empty.
+
+
+        long key1 = 1L, key2 = 2L;
+        String value1 = "some value", value2 = "some other value";
+        LongSparseArray.append(key1, value1);
+        assertFalse(LongSparseArray.isEmpty()); // has 1 element.
+        LongSparseArray.append(key2, value2);
+        assertFalse(LongSparseArray.isEmpty());  // has 2 elements.
+        assertFalse(LongSparseArray.isEmpty());  // consecutive calls should be OK.
+
+        LongSparseArray.remove(key1);
+        assertFalse(LongSparseArray.isEmpty()); // has 1 element.
+        LongSparseArray.remove(key2);
+        assertTrue(LongSparseArray.isEmpty());
+    }
+
+}
diff --git a/compat/tests/java/android/support/v4/util/SparseArrayCompatTest.java b/compat/tests/java/android/support/v4/util/SparseArrayCompatTest.java
new file mode 100644
index 0000000..122c89b
--- /dev/null
+++ b/compat/tests/java/android/support/v4/util/SparseArrayCompatTest.java
@@ -0,0 +1,58 @@
+/*
+ * 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 android.support.v4.util;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SparseArrayCompatTest {
+    @Test
+    public void isEmpty() throws Exception {
+        SparseArrayCompat<String> sparseArrayCompat = new SparseArrayCompat<>();
+        assertTrue(sparseArrayCompat.isEmpty()); // Newly created SparseArrayCompat should be empty
+
+        // Adding elements should change state from empty to not empty.
+        for (int i = 0; i < 5; i++) {
+            sparseArrayCompat.put(i, Integer.toString(i));
+            assertFalse(sparseArrayCompat.isEmpty());
+        }
+        sparseArrayCompat.clear();
+        assertTrue(sparseArrayCompat.isEmpty()); // A cleared SparseArrayCompat should be empty.
+
+
+        int key1 = 1, key2 = 2;
+        String value1 = "some value", value2 = "some other value";
+        sparseArrayCompat.append(key1, value1);
+        assertFalse(sparseArrayCompat.isEmpty()); // has 1 element.
+        sparseArrayCompat.append(key2, value2);
+        assertFalse(sparseArrayCompat.isEmpty());  // has 2 elements.
+        assertFalse(sparseArrayCompat.isEmpty());  // consecutive calls should be OK.
+
+        sparseArrayCompat.remove(key1);
+        assertFalse(sparseArrayCompat.isEmpty()); // has 1 element.
+        sparseArrayCompat.remove(key2);
+        assertTrue(sparseArrayCompat.isEmpty());
+    }
+}
diff --git a/compat/tests/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatTest.java b/compat/tests/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatTest.java
new file mode 100644
index 0000000..34a0f99
--- /dev/null
+++ b/compat/tests/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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 android.support.v4.view.accessibility;
+
+import static org.junit.Assert.*;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AccessibilityNodeInfoCompatTest {
+    @Test
+    public void testSetCollectionInfoIsNullable() throws Exception {
+        AccessibilityNodeInfo accessibilityNodeInfo = AccessibilityNodeInfo.obtain();
+        AccessibilityNodeInfoCompat accessibilityNodeInfoCompat = AccessibilityNodeInfoCompat.wrap(
+                accessibilityNodeInfo);
+        accessibilityNodeInfoCompat.setCollectionInfo(null);
+    }
+
+    @Test
+    public void testSetCollectionItemInfoIsNullable() throws Exception {
+        AccessibilityNodeInfo accessibilityNodeInfo = AccessibilityNodeInfo.obtain();
+        AccessibilityNodeInfoCompat accessibilityNodeInfoCompat = AccessibilityNodeInfoCompat.wrap(
+                accessibilityNodeInfo);
+        accessibilityNodeInfoCompat.setCollectionItemInfo(null);
+    }
+}
diff --git a/compat/tests/res/font/sample_font_collection.ttc b/compat/tests/res/font/sample_font_collection.ttc
new file mode 100644
index 0000000..9252f3d
--- /dev/null
+++ b/compat/tests/res/font/sample_font_collection.ttc
Binary files differ
diff --git a/compat/tests/res/font/samplexmlfontforparsing.xml b/compat/tests/res/font/samplexmlfontforparsing.xml
new file mode 100644
index 0000000..a96385c
--- /dev/null
+++ b/compat/tests/res/font/samplexmlfontforparsing.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<font-family xmlns:android="http://schemas.android.com/apk/res/android"
+             xmlns:app="http://schemas.android.com/apk/res-auto">
+    <font app:fontStyle="normal" app:fontWeight="400" app:fontVariationSettings="'wdth' 0.8"
+          app:font="@font/samplefont" app:ttcIndex="0" />
+    <font app:fontStyle="italic" app:fontWeight="400" app:fontVariationSettings="'contrast' 0.5"
+          app:font="@font/samplefont2" app:ttcIndex="1" />
+    <font app:fontStyle="normal" app:fontWeight="700" app:fontVariationSettings="'wdth' 500.0, 'wght' 300.0"
+          app:font="@font/samplefont3" app:ttcIndex="2" />
+    <font app:fontStyle="italic" app:fontWeight="700" app:font="@font/samplefont4" />
+</font-family>
diff --git a/compat/tests/res/font/samplexmlfontforparsing2.xml b/compat/tests/res/font/samplexmlfontforparsing2.xml
new file mode 100644
index 0000000..eb310ba
--- /dev/null
+++ b/compat/tests/res/font/samplexmlfontforparsing2.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+<font-family xmlns:android="http://schemas.android.com/apk/res/android" >
+    <font android:fontStyle="normal" android:fontWeight="400" android:fontVariationSettings="'wdth' 0.8"
+          android:font="@font/samplefont" android:ttcIndex="0" />
+    <font android:fontStyle="italic" android:fontWeight="400" android:fontVariationSettings="'contrast' 0.5"
+          android:font="@font/samplefont2" android:ttcIndex="1" />
+    <font android:fontStyle="normal" android:fontWeight="700" android:fontVariationSettings="'wdth' 500.0, 'wght' 300.0"
+          android:font="@font/samplefont3" android:ttcIndex="2" />
+    <font android:fontStyle="italic" android:fontWeight="700" android:font="@font/samplefont4" />
+</font-family>
diff --git a/compat/tests/res/font/ttctestfont1.xml b/compat/tests/res/font/ttctestfont1.xml
new file mode 100644
index 0000000..a2b75e3
--- /dev/null
+++ b/compat/tests/res/font/ttctestfont1.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
+    <font app:font="@font/sample_font_collection" app:ttcIndex="0" />
+</font-family>
diff --git a/compat/tests/res/font/ttctestfont2.xml b/compat/tests/res/font/ttctestfont2.xml
new file mode 100644
index 0000000..e64ed6a
--- /dev/null
+++ b/compat/tests/res/font/ttctestfont2.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
+    <font app:font="@font/sample_font_collection" app:ttcIndex="1" />
+</font-family>
diff --git a/compat/tests/res/font/variable_width_dash_font.ttf b/compat/tests/res/font/variable_width_dash_font.ttf
new file mode 100644
index 0000000..f7a256a
--- /dev/null
+++ b/compat/tests/res/font/variable_width_dash_font.ttf
Binary files differ
diff --git a/compat/tests/res/font/variationsettingstestfont1.xml b/compat/tests/res/font/variationsettingstestfont1.xml
new file mode 100644
index 0000000..39052a6
--- /dev/null
+++ b/compat/tests/res/font/variationsettingstestfont1.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
+    <font app:font="@font/variable_width_dash_font" app:fontVariationSettings="'wdth' 100.0" />
+</font-family>
diff --git a/compat/tests/res/font/variationsettingstestfont2.xml b/compat/tests/res/font/variationsettingstestfont2.xml
new file mode 100644
index 0000000..90382d0
--- /dev/null
+++ b/compat/tests/res/font/variationsettingstestfont2.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
+    <font app:font="@font/variable_width_dash_font" app:fontVariationSettings="'wdth' 500.0" />
+</font-family>
diff --git a/content/Android.mk b/content/Android.mk
deleted file mode 100644
index cdd49af..0000000
--- a/content/Android.mk
+++ /dev/null
@@ -1,31 +0,0 @@
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-content
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-compat
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/content/api/27.1.0.txt b/content/api/27.1.0.txt
new file mode 100644
index 0000000..e0b4fa3
--- /dev/null
+++ b/content/api/27.1.0.txt
@@ -0,0 +1,54 @@
+package android.support.content {
+
+  public class ContentPager {
+    ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner);
+    ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner, int);
+    method public static android.os.Bundle createArgs(int, int);
+    method public android.support.content.Query query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal, android.support.content.ContentPager.ContentCallback);
+    method public void reset();
+    field public static final int CURSOR_DISPOSITION_COPIED = 1; // 0x1
+    field public static final int CURSOR_DISPOSITION_PAGED = 2; // 0x2
+    field public static final int CURSOR_DISPOSITION_REPAGED = 3; // 0x3
+    field public static final int CURSOR_DISPOSITION_WRAPPED = 4; // 0x4
+    field public static final java.lang.String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
+    field public static final java.lang.String EXTRA_REQUESTED_LIMIT = "android-support:extra-ignored-limit";
+    field public static final java.lang.String EXTRA_SUGGESTED_LIMIT = "android-support:extra-suggested-limit";
+    field public static final java.lang.String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
+    field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-arg-limit";
+    field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-arg-offset";
+  }
+
+  public static abstract interface ContentPager.ContentCallback {
+    method public abstract void onCursorReady(android.support.content.Query, android.database.Cursor);
+  }
+
+  public static abstract class ContentPager.CursorDisposition implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract interface ContentPager.QueryRunner {
+    method public abstract void cancel(android.support.content.Query);
+    method public abstract boolean isRunning(android.support.content.Query);
+    method public abstract void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+  }
+
+  public static abstract interface ContentPager.QueryRunner.Callback {
+    method public abstract void onQueryFinished(android.support.content.Query, android.database.Cursor);
+    method public abstract android.database.Cursor runQueryInBackground(android.support.content.Query);
+  }
+
+  public final class LoaderQueryRunner implements android.support.content.ContentPager.QueryRunner {
+    ctor public LoaderQueryRunner(android.content.Context, android.app.LoaderManager);
+    method public void cancel(android.support.content.Query);
+    method public boolean isRunning(android.support.content.Query);
+    method public void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+  }
+
+  public final class Query {
+    method public int getId();
+    method public int getLimit();
+    method public int getOffset();
+    method public android.net.Uri getUri();
+  }
+
+}
+
diff --git a/content/src/androidTest/AndroidManifest.xml b/content/src/androidTest/AndroidManifest.xml
index 4a815c4..4ccc3a2 100644
--- a/content/src/androidTest/AndroidManifest.xml
+++ b/content/src/androidTest/AndroidManifest.xml
@@ -15,9 +15,8 @@
   ~ limitations under the License.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
           package="android.support.content.test">
-    <uses-sdk android:minSdkVersion="14" />
+    <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
 
     <application android:supportsRtl="true">
         <activity android:name="android.support.content.TestActivity" />
diff --git a/core-ui/Android.mk b/core-ui/Android.mk
deleted file mode 100644
index 1473381..0000000
--- a/core-ui/Android.mk
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright (C) 2011 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-core-ui \
-#       android-support-compat
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-core-ui
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-compat \
-    android-support-core-utils
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-LOCAL_EXPORT_PROGUARD_FLAG_FILES := proguard-rules.pro
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/core-ui/api/27.1.0.txt b/core-ui/api/27.1.0.txt
new file mode 100644
index 0000000..815d6e3
--- /dev/null
+++ b/core-ui/api/27.1.0.txt
@@ -0,0 +1,750 @@
+package android.support.design.widget {
+
+  public class CoordinatorLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingParent2 {
+    ctor public CoordinatorLayout(android.content.Context);
+    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
+    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
+    method public void dispatchDependentViewsChanged(android.view.View);
+    method public boolean doViewsOverlap(android.view.View, android.view.View);
+    method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public java.util.List<android.view.View> getDependencies(android.view.View);
+    method public java.util.List<android.view.View> getDependents(android.view.View);
+    method public android.graphics.drawable.Drawable getStatusBarBackground();
+    method public boolean isPointInChildBounds(android.view.View, int, int);
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void onDraw(android.graphics.Canvas);
+    method public void onLayoutChild(android.view.View, int);
+    method public void onMeasureChild(android.view.View, int, int, int, int);
+    method public void onNestedPreScroll(android.view.View, 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 setStatusBarBackground(android.graphics.drawable.Drawable);
+    method public void setStatusBarBackgroundColor(int);
+    method public void setStatusBarBackgroundResource(int);
+  }
+
+  public static abstract interface CoordinatorLayout.AttachedBehavior {
+    method public abstract android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
+  }
+
+  public static abstract class CoordinatorLayout.Behavior<V extends android.view.View> {
+    ctor public CoordinatorLayout.Behavior();
+    ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
+    method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
+    method public boolean getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect);
+    method public int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
+    method public float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
+    method public static java.lang.Object getTag(android.view.View);
+    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+    method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
+    method public void onAttachedToLayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
+    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+    method public void onDetachedFromLayoutParams();
+    method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
+    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
+    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
+    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
+    method public deprecated void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
+    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[], int);
+    method public deprecated void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
+    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int, int);
+    method public deprecated void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
+    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
+    method public boolean onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect, boolean);
+    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
+    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
+    method public deprecated boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
+    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
+    method public deprecated void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int);
+    method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
+    method public static void setTag(android.view.View, java.lang.Object);
+  }
+
+  public static abstract deprecated class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
+  }
+
+  public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public CoordinatorLayout.LayoutParams(int, int);
+    ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
+    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getAnchorId();
+    method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
+    method public void setAnchorId(int);
+    method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
+    field public int anchorGravity;
+    field public int dodgeInsetEdges;
+    field public int gravity;
+    field public int insetEdge;
+    field public int keyline;
+  }
+
+  protected static class CoordinatorLayout.SavedState extends android.support.v4.view.AbsSavedState {
+    ctor public CoordinatorLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
+  }
+
+}
+
+package android.support.v4.app {
+
+  public deprecated class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
+    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int, int);
+    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, boolean, int, int, int);
+    method public boolean isDrawerIndicatorEnabled();
+    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 setDrawerIndicatorEnabled(boolean);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
+    method public void setHomeAsUpIndicator(int);
+    method public void syncState();
+  }
+
+  public static abstract deprecated interface ActionBarDrawerToggle.Delegate {
+    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
+    method public abstract void setActionBarDescription(int);
+    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
+  }
+
+  public static abstract deprecated interface ActionBarDrawerToggle.DelegateProvider {
+    method public abstract android.support.v4.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+  }
+
+}
+
+package android.support.v4.view {
+
+  public abstract class AbsSavedState implements android.os.Parcelable {
+    ctor protected AbsSavedState(android.os.Parcelable);
+    ctor protected AbsSavedState(android.os.Parcel);
+    ctor protected AbsSavedState(android.os.Parcel, java.lang.ClassLoader);
+    method public int describeContents();
+    method public final android.os.Parcelable getSuperState();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.view.AbsSavedState> CREATOR;
+    field public static final android.support.v4.view.AbsSavedState EMPTY_STATE;
+  }
+
+  public final class AsyncLayoutInflater {
+    ctor public AsyncLayoutInflater(android.content.Context);
+    method public void inflate(int, android.view.ViewGroup, android.support.v4.view.AsyncLayoutInflater.OnInflateFinishedListener);
+  }
+
+  public static abstract interface AsyncLayoutInflater.OnInflateFinishedListener {
+    method public abstract void onInflateFinished(android.view.View, int, android.view.ViewGroup);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
+    method public boolean dispatchNestedPreScroll(int, int, int[], int[], int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(int);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public abstract class PagerAdapter {
+    ctor public PagerAdapter();
+    method public void destroyItem(android.view.ViewGroup, int, java.lang.Object);
+    method public deprecated void destroyItem(android.view.View, int, java.lang.Object);
+    method public void finishUpdate(android.view.ViewGroup);
+    method public deprecated void finishUpdate(android.view.View);
+    method public abstract int getCount();
+    method public int getItemPosition(java.lang.Object);
+    method public java.lang.CharSequence getPageTitle(int);
+    method public float getPageWidth(int);
+    method public java.lang.Object instantiateItem(android.view.ViewGroup, int);
+    method public deprecated java.lang.Object instantiateItem(android.view.View, int);
+    method public abstract boolean isViewFromObject(android.view.View, java.lang.Object);
+    method public void notifyDataSetChanged();
+    method public void registerDataSetObserver(android.database.DataSetObserver);
+    method public void restoreState(android.os.Parcelable, java.lang.ClassLoader);
+    method public android.os.Parcelable saveState();
+    method public void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
+    method public deprecated void setPrimaryItem(android.view.View, int, java.lang.Object);
+    method public void startUpdate(android.view.ViewGroup);
+    method public deprecated void startUpdate(android.view.View);
+    method public void unregisterDataSetObserver(android.database.DataSetObserver);
+    field public static final int POSITION_NONE = -2; // 0xfffffffe
+    field public static final int POSITION_UNCHANGED = -1; // 0xffffffff
+  }
+
+  public class PagerTabStrip extends android.support.v4.view.PagerTitleStrip {
+    ctor public PagerTabStrip(android.content.Context);
+    ctor public PagerTabStrip(android.content.Context, android.util.AttributeSet);
+    method public boolean getDrawFullUnderline();
+    method public int getTabIndicatorColor();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setDrawFullUnderline(boolean);
+    method public void setTabIndicatorColor(int);
+    method public void setTabIndicatorColorResource(int);
+  }
+
+  public class PagerTitleStrip extends android.view.ViewGroup {
+    ctor public PagerTitleStrip(android.content.Context);
+    ctor public PagerTitleStrip(android.content.Context, android.util.AttributeSet);
+    method public int getTextSpacing();
+    method public void setGravity(int);
+    method public void setNonPrimaryAlpha(float);
+    method public void setTextColor(int);
+    method public void setTextSize(int, float);
+    method public void setTextSpacing(int);
+  }
+
+  public class ViewPager extends android.view.ViewGroup {
+    ctor public ViewPager(android.content.Context);
+    ctor public ViewPager(android.content.Context, android.util.AttributeSet);
+    method public void addOnAdapterChangeListener(android.support.v4.view.ViewPager.OnAdapterChangeListener);
+    method public void addOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
+    method public boolean arrowScroll(int);
+    method public boolean beginFakeDrag();
+    method protected boolean canScroll(android.view.View, boolean, int, int, int);
+    method public void clearOnPageChangeListeners();
+    method public void endFakeDrag();
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fakeDragBy(float);
+    method public android.support.v4.view.PagerAdapter getAdapter();
+    method public int getCurrentItem();
+    method public int getOffscreenPageLimit();
+    method public int getPageMargin();
+    method public boolean isFakeDragging();
+    method protected void onPageScrolled(int, float, int);
+    method public void onRestoreInstanceState(android.os.Parcelable);
+    method public android.os.Parcelable onSaveInstanceState();
+    method public void removeOnAdapterChangeListener(android.support.v4.view.ViewPager.OnAdapterChangeListener);
+    method public void removeOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
+    method public void setAdapter(android.support.v4.view.PagerAdapter);
+    method public void setCurrentItem(int);
+    method public void setCurrentItem(int, boolean);
+    method public void setOffscreenPageLimit(int);
+    method public deprecated void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
+    method public void setPageMargin(int);
+    method public void setPageMarginDrawable(android.graphics.drawable.Drawable);
+    method public void setPageMarginDrawable(int);
+    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer);
+    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer, int);
+    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
+    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
+    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
+  }
+
+  public static abstract class ViewPager.DecorView implements java.lang.annotation.Annotation {
+  }
+
+  public static class ViewPager.LayoutParams extends android.view.ViewGroup.LayoutParams {
+    ctor public ViewPager.LayoutParams();
+    ctor public ViewPager.LayoutParams(android.content.Context, android.util.AttributeSet);
+    field public int gravity;
+    field public boolean isDecor;
+  }
+
+  public static abstract interface ViewPager.OnAdapterChangeListener {
+    method public abstract void onAdapterChanged(android.support.v4.view.ViewPager, android.support.v4.view.PagerAdapter, android.support.v4.view.PagerAdapter);
+  }
+
+  public static abstract interface ViewPager.OnPageChangeListener {
+    method public abstract void onPageScrollStateChanged(int);
+    method public abstract void onPageScrolled(int, float, int);
+    method public abstract void onPageSelected(int);
+  }
+
+  public static abstract interface ViewPager.PageTransformer {
+    method public abstract void transformPage(android.view.View, float);
+  }
+
+  public static class ViewPager.SavedState extends android.support.v4.view.AbsSavedState {
+    ctor public ViewPager.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.v4.view.ViewPager.SavedState> CREATOR;
+  }
+
+  public static class ViewPager.SimpleOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
+    ctor public ViewPager.SimpleOnPageChangeListener();
+    method public void onPageScrollStateChanged(int);
+    method public void onPageScrolled(int, float, int);
+    method public void onPageSelected(int);
+  }
+
+}
+
+package android.support.v4.view.animation {
+
+  public class FastOutLinearInInterpolator implements android.view.animation.Interpolator {
+    ctor public FastOutLinearInInterpolator();
+  }
+
+  public class FastOutSlowInInterpolator implements android.view.animation.Interpolator {
+    ctor public FastOutSlowInInterpolator();
+  }
+
+  public class LinearOutSlowInInterpolator implements android.view.animation.Interpolator {
+    ctor public LinearOutSlowInInterpolator();
+  }
+
+}
+
+package android.support.v4.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View, android.view.MotionEvent);
+    method public abstract void scrollTargetBy(int, int);
+    method public android.support.v4.widget.AutoScrollHelper setActivationDelay(int);
+    method public android.support.v4.widget.AutoScrollHelper setEdgeType(int);
+    method public android.support.v4.widget.AutoScrollHelper setEnabled(boolean);
+    method public android.support.v4.widget.AutoScrollHelper setExclusive(boolean);
+    method public android.support.v4.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public android.support.v4.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public android.support.v4.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public android.support.v4.widget.AutoScrollHelper setRampDownDuration(int);
+    method public android.support.v4.widget.AutoScrollHelper setRampUpDuration(int);
+    method public android.support.v4.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public android.support.v4.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  public class CircularProgressDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable {
+    ctor public CircularProgressDrawable(android.content.Context);
+    method public void draw(android.graphics.Canvas);
+    method public boolean getArrowEnabled();
+    method public float getArrowHeight();
+    method public float getArrowScale();
+    method public float getArrowWidth();
+    method public int getBackgroundColor();
+    method public float getCenterRadius();
+    method public int[] getColorSchemeColors();
+    method public float getEndTrim();
+    method public int getOpacity();
+    method public float getProgressRotation();
+    method public float getStartTrim();
+    method public android.graphics.Paint.Cap getStrokeCap();
+    method public float getStrokeWidth();
+    method public boolean isRunning();
+    method public void setAlpha(int);
+    method public void setArrowDimensions(float, float);
+    method public void setArrowEnabled(boolean);
+    method public void setArrowScale(float);
+    method public void setBackgroundColor(int);
+    method public void setCenterRadius(float);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setColorSchemeColors(int...);
+    method public void setProgressRotation(float);
+    method public void setStartEndTrim(float, float);
+    method public void setStrokeCap(android.graphics.Paint.Cap);
+    method public void setStrokeWidth(float);
+    method public void setStyle(int);
+    method public void start();
+    method public void stop();
+    field public static final int DEFAULT = 1; // 0x1
+    field public static final int LARGE = 0; // 0x0
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet);
+    method public synchronized void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public synchronized void show();
+  }
+
+  public abstract class CursorAdapter extends android.widget.BaseAdapter implements android.widget.Filterable {
+    ctor public deprecated CursorAdapter(android.content.Context, android.database.Cursor);
+    ctor public CursorAdapter(android.content.Context, android.database.Cursor, boolean);
+    ctor public CursorAdapter(android.content.Context, android.database.Cursor, int);
+    method public abstract void bindView(android.view.View, android.content.Context, android.database.Cursor);
+    method public void changeCursor(android.database.Cursor);
+    method public java.lang.CharSequence convertToString(android.database.Cursor);
+    method public int getCount();
+    method public android.database.Cursor getCursor();
+    method public android.widget.Filter getFilter();
+    method public android.widget.FilterQueryProvider getFilterQueryProvider();
+    method public java.lang.Object getItem(int);
+    method public long getItemId(int);
+    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
+    method protected deprecated void init(android.content.Context, android.database.Cursor, boolean);
+    method public android.view.View newDropDownView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
+    method public abstract android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
+    method protected void onContentChanged();
+    method public android.database.Cursor runQueryOnBackgroundThread(java.lang.CharSequence);
+    method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
+    method public android.database.Cursor swapCursor(android.database.Cursor);
+    field public static final deprecated int FLAG_AUTO_REQUERY = 1; // 0x1
+    field public static final int FLAG_REGISTER_CONTENT_OBSERVER = 2; // 0x2
+  }
+
+  public class DrawerLayout extends android.view.ViewGroup {
+    ctor public DrawerLayout(android.content.Context);
+    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet);
+    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet, int);
+    method public void addDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
+    method public void closeDrawer(android.view.View);
+    method public void closeDrawer(android.view.View, boolean);
+    method public void closeDrawer(int);
+    method public void closeDrawer(int, boolean);
+    method public void closeDrawers();
+    method public float getDrawerElevation();
+    method public int getDrawerLockMode(int);
+    method public int getDrawerLockMode(android.view.View);
+    method public java.lang.CharSequence getDrawerTitle(int);
+    method public android.graphics.drawable.Drawable getStatusBarBackgroundDrawable();
+    method public boolean isDrawerOpen(android.view.View);
+    method public boolean isDrawerOpen(int);
+    method public boolean isDrawerVisible(android.view.View);
+    method public boolean isDrawerVisible(int);
+    method public void onDraw(android.graphics.Canvas);
+    method public void openDrawer(android.view.View);
+    method public void openDrawer(android.view.View, boolean);
+    method public void openDrawer(int);
+    method public void openDrawer(int, boolean);
+    method public void removeDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
+    method public void setDrawerElevation(float);
+    method public deprecated void setDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
+    method public void setDrawerLockMode(int);
+    method public void setDrawerLockMode(int, int);
+    method public void setDrawerLockMode(int, android.view.View);
+    method public void setDrawerShadow(android.graphics.drawable.Drawable, int);
+    method public void setDrawerShadow(int, int);
+    method public void setDrawerTitle(int, java.lang.CharSequence);
+    method public void setScrimColor(int);
+    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
+    method public void setStatusBarBackground(int);
+    method public void setStatusBarBackgroundColor(int);
+    field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
+    field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
+    field public static final int LOCK_MODE_UNDEFINED = 3; // 0x3
+    field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
+    field public static final int STATE_DRAGGING = 1; // 0x1
+    field public static final int STATE_IDLE = 0; // 0x0
+    field public static final int STATE_SETTLING = 2; // 0x2
+  }
+
+  public static abstract interface DrawerLayout.DrawerListener {
+    method public abstract void onDrawerClosed(android.view.View);
+    method public abstract void onDrawerOpened(android.view.View);
+    method public abstract void onDrawerSlide(android.view.View, float);
+    method public abstract void onDrawerStateChanged(int);
+  }
+
+  public static class DrawerLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public DrawerLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public DrawerLayout.LayoutParams(int, int);
+    ctor public DrawerLayout.LayoutParams(int, int, int);
+    ctor public DrawerLayout.LayoutParams(android.support.v4.widget.DrawerLayout.LayoutParams);
+    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    field public int gravity;
+  }
+
+  protected static class DrawerLayout.SavedState extends android.support.v4.view.AbsSavedState {
+    ctor public DrawerLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public DrawerLayout.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.v4.widget.DrawerLayout.SavedState> CREATOR;
+  }
+
+  public static abstract class DrawerLayout.SimpleDrawerListener implements android.support.v4.widget.DrawerLayout.DrawerListener {
+    ctor public DrawerLayout.SimpleDrawerListener();
+    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);
+  }
+
+  public abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
+    ctor public ExploreByTouchHelper(android.view.View);
+    method public final boolean clearKeyboardFocusForVirtualView(int);
+    method public final boolean dispatchHoverEvent(android.view.MotionEvent);
+    method public final boolean dispatchKeyEvent(android.view.KeyEvent);
+    method public final int getAccessibilityFocusedVirtualViewId();
+    method public deprecated int getFocusedVirtualView();
+    method public final int getKeyboardFocusedVirtualViewId();
+    method protected abstract int getVirtualViewAt(float, float);
+    method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer>);
+    method public final void invalidateRoot();
+    method public final void invalidateVirtualView(int);
+    method public final void invalidateVirtualView(int, int);
+    method public final void onFocusChanged(boolean, int, android.graphics.Rect);
+    method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle);
+    method protected void onPopulateEventForHost(android.view.accessibility.AccessibilityEvent);
+    method protected void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
+    method protected void onPopulateNodeForHost(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method protected abstract void onPopulateNodeForVirtualView(int, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method protected void onVirtualViewKeyboardFocusChanged(int, boolean);
+    method public final boolean requestKeyboardFocusForVirtualView(int);
+    method public final boolean sendEventForVirtualView(int, int);
+    field public static final int HOST_ID = -1; // 0xffffffff
+    field public static final int INVALID_ID = -2147483648; // 0x80000000
+  }
+
+  public class ListViewAutoScrollHelper extends android.support.v4.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild2 android.support.v4.view.NestedScrollingParent android.support.v4.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet, int);
+    method public boolean arrowScroll(int);
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[], int[], int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(android.support.v4.widget.NestedScrollView.OnScrollChangeListener);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollTo(int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static abstract interface NestedScrollView.OnScrollChangeListener {
+    method public abstract void onScrollChange(android.support.v4.widget.NestedScrollView, int, int, int, int);
+  }
+
+  public abstract class ResourceCursorAdapter extends android.support.v4.widget.CursorAdapter {
+    ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
+    ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, boolean);
+    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, int);
+    method public android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
+    method public void setDropDownViewResource(int);
+    method public void setViewResource(int);
+  }
+
+  public class SimpleCursorAdapter extends android.support.v4.widget.ResourceCursorAdapter {
+    ctor public deprecated SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[]);
+    ctor public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[], int);
+    method public void bindView(android.view.View, android.content.Context, android.database.Cursor);
+    method public void changeCursorAndColumns(android.database.Cursor, java.lang.String[], int[]);
+    method public android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter getCursorToStringConverter();
+    method public int getStringConversionColumn();
+    method public android.support.v4.widget.SimpleCursorAdapter.ViewBinder getViewBinder();
+    method public void setCursorToStringConverter(android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter);
+    method public void setStringConversionColumn(int);
+    method public void setViewBinder(android.support.v4.widget.SimpleCursorAdapter.ViewBinder);
+    method public void setViewImage(android.widget.ImageView, java.lang.String);
+    method public void setViewText(android.widget.TextView, java.lang.String);
+  }
+
+  public static abstract interface SimpleCursorAdapter.CursorToStringConverter {
+    method public abstract java.lang.CharSequence convertToString(android.database.Cursor);
+  }
+
+  public static abstract interface SimpleCursorAdapter.ViewBinder {
+    method public abstract boolean setViewValue(android.view.View, android.database.Cursor, int);
+  }
+
+  public class SlidingPaneLayout extends android.view.ViewGroup {
+    ctor public SlidingPaneLayout(android.content.Context);
+    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet);
+    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet, int);
+    method protected boolean canScroll(android.view.View, boolean, int, int, int);
+    method public deprecated boolean canSlide();
+    method public boolean closePane();
+    method public int getCoveredFadeColor();
+    method public int getParallaxDistance();
+    method public int getSliderFadeColor();
+    method public boolean isOpen();
+    method public boolean isSlideable();
+    method public boolean openPane();
+    method public void setCoveredFadeColor(int);
+    method public void setPanelSlideListener(android.support.v4.widget.SlidingPaneLayout.PanelSlideListener);
+    method public void setParallaxDistance(int);
+    method public deprecated void setShadowDrawable(android.graphics.drawable.Drawable);
+    method public void setShadowDrawableLeft(android.graphics.drawable.Drawable);
+    method public void setShadowDrawableRight(android.graphics.drawable.Drawable);
+    method public deprecated void setShadowResource(int);
+    method public void setShadowResourceLeft(int);
+    method public void setShadowResourceRight(int);
+    method public void setSliderFadeColor(int);
+    method public deprecated void smoothSlideClosed();
+    method public deprecated void smoothSlideOpen();
+  }
+
+  public static class SlidingPaneLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public SlidingPaneLayout.LayoutParams();
+    ctor public SlidingPaneLayout.LayoutParams(int, int);
+    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public SlidingPaneLayout.LayoutParams(android.support.v4.widget.SlidingPaneLayout.LayoutParams);
+    ctor public SlidingPaneLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    field public float weight;
+  }
+
+  public static abstract interface SlidingPaneLayout.PanelSlideListener {
+    method public abstract void onPanelClosed(android.view.View);
+    method public abstract void onPanelOpened(android.view.View);
+    method public abstract void onPanelSlide(android.view.View, float);
+  }
+
+  public static class SlidingPaneLayout.SimplePanelSlideListener implements android.support.v4.widget.SlidingPaneLayout.PanelSlideListener {
+    ctor public SlidingPaneLayout.SimplePanelSlideListener();
+    method public void onPanelClosed(android.view.View);
+    method public void onPanelOpened(android.view.View);
+    method public void onPanelSlide(android.view.View, float);
+  }
+
+  public deprecated class Space extends android.view.View {
+    ctor public deprecated Space(android.content.Context, android.util.AttributeSet, int);
+    ctor public deprecated Space(android.content.Context, android.util.AttributeSet);
+    ctor public deprecated Space(android.content.Context);
+    method public deprecated void draw(android.graphics.Canvas);
+    method protected deprecated void onMeasure(int, int);
+  }
+
+  public class SwipeRefreshLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
+    ctor public SwipeRefreshLayout(android.content.Context);
+    ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
+    method public boolean canChildScrollUp();
+    method public int getProgressCircleDiameter();
+    method public int getProgressViewEndOffset();
+    method public int getProgressViewStartOffset();
+    method public boolean isRefreshing();
+    method public void onMeasure(int, int);
+    method public deprecated void setColorScheme(int...);
+    method public void setColorSchemeColors(int...);
+    method public void setColorSchemeResources(int...);
+    method public void setDistanceToTriggerSync(int);
+    method public void setOnChildScrollUpCallback(android.support.v4.widget.SwipeRefreshLayout.OnChildScrollUpCallback);
+    method public void setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener);
+    method public deprecated void setProgressBackgroundColor(int);
+    method public void setProgressBackgroundColorSchemeColor(int);
+    method public void setProgressBackgroundColorSchemeResource(int);
+    method public void setProgressViewEndTarget(boolean, int);
+    method public void setProgressViewOffset(boolean, int, int);
+    method public void setRefreshing(boolean);
+    method public void setSize(int);
+    field public static final int DEFAULT = 1; // 0x1
+    field public static final int LARGE = 0; // 0x0
+    field protected int mFrom;
+    field protected int mOriginalOffsetTop;
+  }
+
+  public static abstract interface SwipeRefreshLayout.OnChildScrollUpCallback {
+    method public abstract boolean canChildScrollUp(android.support.v4.widget.SwipeRefreshLayout, android.view.View);
+  }
+
+  public static abstract interface SwipeRefreshLayout.OnRefreshListener {
+    method public abstract void onRefresh();
+  }
+
+  public class ViewDragHelper {
+    method public void abort();
+    method protected boolean canScroll(android.view.View, boolean, int, int, int, int);
+    method public void cancel();
+    method public void captureChildView(android.view.View, int);
+    method public boolean checkTouchSlop(int);
+    method public boolean checkTouchSlop(int, int);
+    method public boolean continueSettling(boolean);
+    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, android.support.v4.widget.ViewDragHelper.Callback);
+    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, float, android.support.v4.widget.ViewDragHelper.Callback);
+    method public android.view.View findTopChildUnder(int, int);
+    method public void flingCapturedView(int, int, int, int);
+    method public int getActivePointerId();
+    method public android.view.View getCapturedView();
+    method public int getEdgeSize();
+    method public float getMinVelocity();
+    method public int getTouchSlop();
+    method public int getViewDragState();
+    method public boolean isCapturedViewUnder(int, int);
+    method public boolean isEdgeTouched(int);
+    method public boolean isEdgeTouched(int, int);
+    method public boolean isPointerDown(int);
+    method public boolean isViewUnder(android.view.View, int, int);
+    method public void processTouchEvent(android.view.MotionEvent);
+    method public void setEdgeTrackingEnabled(int);
+    method public void setMinVelocity(float);
+    method public boolean settleCapturedViewAt(int, int);
+    method public boolean shouldInterceptTouchEvent(android.view.MotionEvent);
+    method public boolean smoothSlideViewTo(android.view.View, int, int);
+    field public static final int DIRECTION_ALL = 3; // 0x3
+    field public static final int DIRECTION_HORIZONTAL = 1; // 0x1
+    field public static final int DIRECTION_VERTICAL = 2; // 0x2
+    field public static final int EDGE_ALL = 15; // 0xf
+    field public static final int EDGE_BOTTOM = 8; // 0x8
+    field public static final int EDGE_LEFT = 1; // 0x1
+    field public static final int EDGE_RIGHT = 2; // 0x2
+    field public static final int EDGE_TOP = 4; // 0x4
+    field public static final int INVALID_POINTER = -1; // 0xffffffff
+    field public static final int STATE_DRAGGING = 1; // 0x1
+    field public static final int STATE_IDLE = 0; // 0x0
+    field public static final int STATE_SETTLING = 2; // 0x2
+  }
+
+  public static abstract class ViewDragHelper.Callback {
+    ctor public ViewDragHelper.Callback();
+    method public int clampViewPositionHorizontal(android.view.View, int, int);
+    method public int clampViewPositionVertical(android.view.View, int, int);
+    method public int getOrderedChildIndex(int);
+    method public int getViewHorizontalDragRange(android.view.View);
+    method public int getViewVerticalDragRange(android.view.View);
+    method public void onEdgeDragStarted(int, int);
+    method public boolean onEdgeLock(int);
+    method public void onEdgeTouched(int, int);
+    method public void onViewCaptured(android.view.View, int);
+    method public void onViewDragStateChanged(int);
+    method public void onViewPositionChanged(android.view.View, int, int, int, int);
+    method public void onViewReleased(android.view.View, float, float);
+    method public abstract boolean tryCaptureView(android.view.View, int);
+  }
+
+}
+
diff --git a/core-utils/Android.mk b/core-utils/Android.mk
deleted file mode 100644
index 751091b..0000000
--- a/core-utils/Android.mk
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (C) 2011 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-core-utils \
-#       android-support-compat
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-core-utils
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := \
-    $(call all-java-files-under,kitkat) \
-    $(call all-java-files-under,api21) \
-    $(call all-java-files-under,java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-compat
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/core-utils/api/27.1.0.txt b/core-utils/api/27.1.0.txt
new file mode 100644
index 0000000..d535653
--- /dev/null
+++ b/core-utils/api/27.1.0.txt
@@ -0,0 +1,321 @@
+package android.support.v4.app {
+
+  public class AppLaunchChecker {
+    ctor public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray[] getMetrics();
+    method public android.util.SparseIntArray[] remove(android.app.Activity);
+    method public android.util.SparseIntArray[] reset();
+    method public android.util.SparseIntArray[] stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent getParentActivityIntent(android.content.Context, java.lang.Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static java.lang.String getParentActivityName(android.app.Activity);
+    method public static java.lang.String getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final java.lang.String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable {
+    method public android.support.v4.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public android.support.v4.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public android.support.v4.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public android.support.v4.app.TaskStackBuilder addParentStack(java.lang.Class<?>);
+    method public android.support.v4.app.TaskStackBuilder addParentStack(android.content.ComponentName);
+    method public static android.support.v4.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent editIntentAt(int);
+    method public static deprecated android.support.v4.app.TaskStackBuilder from(android.content.Context);
+    method public deprecated android.content.Intent getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent[] getIntents();
+    method public android.app.PendingIntent getPendingIntent(int, int);
+    method public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
+    method public deprecated java.util.Iterator<android.content.Intent> iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle);
+  }
+
+  public static abstract interface TaskStackBuilder.SupportParentable {
+    method public abstract android.content.Intent getSupportParentActivityIntent();
+  }
+
+}
+
+package android.support.v4.content {
+
+  public abstract class AsyncTaskLoader<D> extends android.support.v4.content.Loader {
+    ctor public AsyncTaskLoader(android.content.Context);
+    method public void cancelLoadInBackground();
+    method public boolean isLoadInBackgroundCanceled();
+    method public abstract D loadInBackground();
+    method public void onCanceled(D);
+    method protected D onLoadInBackground();
+    method public void setUpdateThrottle(long);
+  }
+
+  public class CursorLoader extends android.support.v4.content.AsyncTaskLoader {
+    ctor public CursorLoader(android.content.Context);
+    ctor public CursorLoader(android.content.Context, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+    method public void deliverResult(android.database.Cursor);
+    method public java.lang.String[] getProjection();
+    method public java.lang.String getSelection();
+    method public java.lang.String[] getSelectionArgs();
+    method public java.lang.String getSortOrder();
+    method public android.net.Uri getUri();
+    method public android.database.Cursor loadInBackground();
+    method public void onCanceled(android.database.Cursor);
+    method public void setProjection(java.lang.String[]);
+    method public void setSelection(java.lang.String);
+    method public void setSelectionArgs(java.lang.String[]);
+    method public void setSortOrder(java.lang.String);
+    method public void setUri(android.net.Uri);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
+    method public java.lang.String getType(android.net.Uri);
+    method public static android.net.Uri getUriForFile(android.content.Context, java.lang.String, java.io.File);
+    method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
+    method public boolean onCreate();
+    method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+    method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+  }
+
+  public class Loader<D> {
+    ctor public Loader(android.content.Context);
+    method public void abandon();
+    method public boolean cancelLoad();
+    method public void commitContentChanged();
+    method public java.lang.String dataToString(D);
+    method public void deliverCancellation();
+    method public void deliverResult(D);
+    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public void forceLoad();
+    method public android.content.Context getContext();
+    method public int getId();
+    method public boolean isAbandoned();
+    method public boolean isReset();
+    method public boolean isStarted();
+    method protected void onAbandon();
+    method protected boolean onCancelLoad();
+    method public void onContentChanged();
+    method protected void onForceLoad();
+    method protected void onReset();
+    method protected void onStartLoading();
+    method protected void onStopLoading();
+    method public void registerListener(int, android.support.v4.content.Loader.OnLoadCompleteListener<D>);
+    method public void registerOnLoadCanceledListener(android.support.v4.content.Loader.OnLoadCanceledListener<D>);
+    method public void reset();
+    method public void rollbackContentChanged();
+    method public final void startLoading();
+    method public void stopLoading();
+    method public boolean takeContentChanged();
+    method public void unregisterListener(android.support.v4.content.Loader.OnLoadCompleteListener<D>);
+    method public void unregisterOnLoadCanceledListener(android.support.v4.content.Loader.OnLoadCanceledListener<D>);
+  }
+
+  public final class Loader.ForceLoadContentObserver extends android.database.ContentObserver {
+    ctor public Loader.ForceLoadContentObserver();
+  }
+
+  public static abstract interface Loader.OnLoadCanceledListener<D> {
+    method public abstract void onLoadCanceled(android.support.v4.content.Loader<D>);
+  }
+
+  public static abstract interface Loader.OnLoadCompleteListener<D> {
+    method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
+  }
+
+  public final class LocalBroadcastManager {
+    method public static android.support.v4.content.LocalBroadcastManager getInstance(android.content.Context);
+    method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+    method public boolean sendBroadcast(android.content.Intent);
+    method public void sendBroadcastSync(android.content.Intent);
+    method public void unregisterReceiver(android.content.BroadcastReceiver);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(java.lang.String, java.lang.String);
+    method public static java.lang.String matches(java.lang.String, java.lang.String[]);
+    method public static java.lang.String matches(java.lang.String[], java.lang.String);
+    method public static java.lang.String[] matchesMany(java.lang.String[], java.lang.String);
+  }
+
+  public final class PermissionChecker {
+    method public static int checkCallingOrSelfPermission(android.content.Context, java.lang.String);
+    method public static int checkCallingPermission(android.content.Context, java.lang.String, java.lang.String);
+    method public static int checkPermission(android.content.Context, java.lang.String, int, int, java.lang.String);
+    method public static int checkSelfPermission(android.content.Context, java.lang.String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  public abstract deprecated class WakefulBroadcastReceiver extends android.content.BroadcastReceiver {
+    ctor public WakefulBroadcastReceiver();
+    method public static boolean completeWakefulIntent(android.content.Intent);
+    method public static android.content.ComponentName startWakefulService(android.content.Context, android.content.Intent);
+  }
+
+}
+
+package android.support.v4.graphics {
+
+  public final class ColorUtils {
+    method public static int HSLToColor(float[]);
+    method public static int LABToColor(double, double, double);
+    method public static void LABToXYZ(double, double, double, double[]);
+    method public static void RGBToHSL(int, int, int, float[]);
+    method public static void RGBToLAB(int, int, int, double[]);
+    method public static void RGBToXYZ(int, int, int, double[]);
+    method public static int XYZToColor(double, double, double);
+    method public static void XYZToLAB(double, double, double, double[]);
+    method public static int blendARGB(int, int, float);
+    method public static void blendHSL(float[], float[], float, float[]);
+    method public static void blendLAB(double[], double[], double, double[]);
+    method public static double calculateContrast(int, int);
+    method public static double calculateLuminance(int);
+    method public static int calculateMinimumAlpha(int, int, float);
+    method public static void colorToHSL(int, float[]);
+    method public static void colorToLAB(int, double[]);
+    method public static void colorToXYZ(int, double[]);
+    method public static int compositeColors(int, int);
+    method public static double distanceEuclidean(double[], double[]);
+    method public static int setAlphaComponent(int, int);
+  }
+
+}
+
+package android.support.v4.graphics.drawable {
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap);
+    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.lang.String);
+    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+}
+
+package android.support.v4.math {
+
+  public class MathUtils {
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+  }
+
+}
+
+package android.support.v4.print {
+
+  public final class PrintHelper {
+    ctor public PrintHelper(android.content.Context);
+    method public int getColorMode();
+    method public int getOrientation();
+    method public int getScaleMode();
+    method public void printBitmap(java.lang.String, android.graphics.Bitmap);
+    method public void printBitmap(java.lang.String, android.graphics.Bitmap, android.support.v4.print.PrintHelper.OnPrintFinishCallback);
+    method public void printBitmap(java.lang.String, android.net.Uri) throws java.io.FileNotFoundException;
+    method public void printBitmap(java.lang.String, android.net.Uri, android.support.v4.print.PrintHelper.OnPrintFinishCallback) throws java.io.FileNotFoundException;
+    method public void setColorMode(int);
+    method public void setOrientation(int);
+    method public void setScaleMode(int);
+    method public static boolean systemSupportsPrint();
+    field public static final int COLOR_MODE_COLOR = 2; // 0x2
+    field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
+    field public static final int ORIENTATION_LANDSCAPE = 1; // 0x1
+    field public static final int ORIENTATION_PORTRAIT = 2; // 0x2
+    field public static final int SCALE_MODE_FILL = 2; // 0x2
+    field public static final int SCALE_MODE_FIT = 1; // 0x1
+  }
+
+  public static abstract interface PrintHelper.OnPrintFinishCallback {
+    method public abstract void onFinish();
+  }
+
+}
+
+package android.support.v4.provider {
+
+  public abstract class DocumentFile {
+    method public abstract boolean canRead();
+    method public abstract boolean canWrite();
+    method public abstract android.support.v4.provider.DocumentFile createDirectory(java.lang.String);
+    method public abstract android.support.v4.provider.DocumentFile createFile(java.lang.String, java.lang.String);
+    method public abstract boolean delete();
+    method public abstract boolean exists();
+    method public android.support.v4.provider.DocumentFile findFile(java.lang.String);
+    method public static android.support.v4.provider.DocumentFile fromFile(java.io.File);
+    method public static android.support.v4.provider.DocumentFile fromSingleUri(android.content.Context, android.net.Uri);
+    method public static android.support.v4.provider.DocumentFile fromTreeUri(android.content.Context, android.net.Uri);
+    method public abstract java.lang.String getName();
+    method public android.support.v4.provider.DocumentFile getParentFile();
+    method public abstract java.lang.String getType();
+    method public abstract android.net.Uri getUri();
+    method public abstract boolean isDirectory();
+    method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
+    method public abstract boolean isFile();
+    method public abstract boolean isVirtual();
+    method public abstract long lastModified();
+    method public abstract long length();
+    method public abstract android.support.v4.provider.DocumentFile[] listFiles();
+    method public abstract boolean renameTo(java.lang.String);
+  }
+
+}
+
diff --git a/core-utils/java/android/support/v4/content/WakefulBroadcastReceiver.java b/core-utils/java/android/support/v4/content/WakefulBroadcastReceiver.java
index 8ec3eee..78555aa 100644
--- a/core-utils/java/android/support/v4/content/WakefulBroadcastReceiver.java
+++ b/core-utils/java/android/support/v4/content/WakefulBroadcastReceiver.java
@@ -34,6 +34,9 @@
  * for you; you must request the {@link android.Manifest.permission#WAKE_LOCK}
  * permission to use it.</p>
  *
+ * <p>Wakelocks held by this class are reported to tools as
+ * {@code "androidx.core:wake:<component-name>"}.</p>
+ *
  * <h3>Example</h3>
  *
  * <p>A {@link WakefulBroadcastReceiver} uses the method
@@ -103,7 +106,7 @@
 
             PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
             PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
-                    "wake:" + comp.flattenToShortString());
+                    "androidx.core:wake:" + comp.flattenToShortString());
             wl.setReferenceCounted(false);
             wl.acquire(60 * 1000);
             sActiveWakeLocks.put(id, wl);
diff --git a/customtabs/Android.mk b/customtabs/Android.mk
deleted file mode 100644
index 27b92a0..0000000
--- a/customtabs/Android.mk
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (C) 2015 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-customtabs \
-#       android-support-compat
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-customtabs
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/src/main/java
-LOCAL_SRC_FILES := \
-    $(call all-java-files-under,src/main/java) \
-    $(call all-Iaidl-files-under,src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/src/main/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-v7-appcompat \
-    android-support-compat \
-    android-support-core-ui
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/customtabs/api/27.1.0.txt b/customtabs/api/27.1.0.txt
new file mode 100644
index 0000000..e172dba
--- /dev/null
+++ b/customtabs/api/27.1.0.txt
@@ -0,0 +1,208 @@
+package android.support.customtabs {
+
+  public class CustomTabsCallback {
+    ctor public CustomTabsCallback();
+    method public void extraCallback(java.lang.String, android.os.Bundle);
+    method public void onMessageChannelReady(android.os.Bundle);
+    method public void onNavigationEvent(int, android.os.Bundle);
+    method public void onPostMessage(java.lang.String, android.os.Bundle);
+    method public void onRelationshipValidationResult(int, android.net.Uri, boolean, android.os.Bundle);
+    field public static final int NAVIGATION_ABORTED = 4; // 0x4
+    field public static final int NAVIGATION_FAILED = 3; // 0x3
+    field public static final int NAVIGATION_FINISHED = 2; // 0x2
+    field public static final int NAVIGATION_STARTED = 1; // 0x1
+    field public static final int TAB_HIDDEN = 6; // 0x6
+    field public static final int TAB_SHOWN = 5; // 0x5
+  }
+
+  public class CustomTabsClient {
+    method public static boolean bindCustomTabsService(android.content.Context, java.lang.String, android.support.customtabs.CustomTabsServiceConnection);
+    method public static boolean connectAndInitialize(android.content.Context, java.lang.String);
+    method public android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
+    method public static java.lang.String getPackageName(android.content.Context, java.util.List<java.lang.String>);
+    method public static java.lang.String getPackageName(android.content.Context, java.util.List<java.lang.String>, boolean);
+    method public android.support.customtabs.CustomTabsSession newSession(android.support.customtabs.CustomTabsCallback);
+    method public boolean warmup(long);
+  }
+
+  public final class CustomTabsIntent {
+    method public static int getMaxToolbarItems();
+    method public void launchUrl(android.content.Context, android.net.Uri);
+    method public static android.content.Intent setAlwaysUseBrowserUI(android.content.Intent);
+    method public static boolean shouldAlwaysUseBrowserUI(android.content.Intent);
+    field public static final java.lang.String EXTRA_ACTION_BUTTON_BUNDLE = "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE";
+    field public static final java.lang.String EXTRA_CLOSE_BUTTON_ICON = "android.support.customtabs.extra.CLOSE_BUTTON_ICON";
+    field public static final java.lang.String EXTRA_DEFAULT_SHARE_MENU_ITEM = "android.support.customtabs.extra.SHARE_MENU_ITEM";
+    field public static final java.lang.String EXTRA_ENABLE_INSTANT_APPS = "android.support.customtabs.extra.EXTRA_ENABLE_INSTANT_APPS";
+    field public static final java.lang.String EXTRA_ENABLE_URLBAR_HIDING = "android.support.customtabs.extra.ENABLE_URLBAR_HIDING";
+    field public static final java.lang.String EXTRA_EXIT_ANIMATION_BUNDLE = "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE";
+    field public static final java.lang.String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS";
+    field public static final java.lang.String EXTRA_REMOTEVIEWS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS";
+    field public static final java.lang.String EXTRA_REMOTEVIEWS_CLICKED_ID = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_CLICKED_ID";
+    field public static final java.lang.String EXTRA_REMOTEVIEWS_PENDINGINTENT = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_PENDINGINTENT";
+    field public static final java.lang.String EXTRA_REMOTEVIEWS_VIEW_IDS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_VIEW_IDS";
+    field public static final java.lang.String EXTRA_SECONDARY_TOOLBAR_COLOR = "android.support.customtabs.extra.SECONDARY_TOOLBAR_COLOR";
+    field public static final java.lang.String EXTRA_SESSION = "android.support.customtabs.extra.SESSION";
+    field public static final java.lang.String EXTRA_TINT_ACTION_BUTTON = "android.support.customtabs.extra.TINT_ACTION_BUTTON";
+    field public static final java.lang.String EXTRA_TITLE_VISIBILITY_STATE = "android.support.customtabs.extra.TITLE_VISIBILITY";
+    field public static final java.lang.String EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR";
+    field public static final java.lang.String EXTRA_TOOLBAR_ITEMS = "android.support.customtabs.extra.TOOLBAR_ITEMS";
+    field public static final java.lang.String KEY_DESCRIPTION = "android.support.customtabs.customaction.DESCRIPTION";
+    field public static final java.lang.String KEY_ICON = "android.support.customtabs.customaction.ICON";
+    field public static final java.lang.String KEY_ID = "android.support.customtabs.customaction.ID";
+    field public static final java.lang.String KEY_MENU_ITEM_TITLE = "android.support.customtabs.customaction.MENU_ITEM_TITLE";
+    field public static final java.lang.String KEY_PENDING_INTENT = "android.support.customtabs.customaction.PENDING_INTENT";
+    field public static final int NO_TITLE = 0; // 0x0
+    field public static final int SHOW_PAGE_TITLE = 1; // 0x1
+    field public static final int TOOLBAR_ACTION_BUTTON_ID = 0; // 0x0
+    field public final android.content.Intent intent;
+    field public final android.os.Bundle startAnimationBundle;
+  }
+
+  public static final class CustomTabsIntent.Builder {
+    ctor public CustomTabsIntent.Builder();
+    ctor public CustomTabsIntent.Builder(android.support.customtabs.CustomTabsSession);
+    method public android.support.customtabs.CustomTabsIntent.Builder addDefaultShareMenuItem();
+    method public android.support.customtabs.CustomTabsIntent.Builder addMenuItem(java.lang.String, android.app.PendingIntent);
+    method public deprecated android.support.customtabs.CustomTabsIntent.Builder addToolbarItem(int, android.graphics.Bitmap, java.lang.String, android.app.PendingIntent) throws java.lang.IllegalStateException;
+    method public android.support.customtabs.CustomTabsIntent build();
+    method public android.support.customtabs.CustomTabsIntent.Builder enableUrlBarHiding();
+    method public android.support.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, java.lang.String, android.app.PendingIntent, boolean);
+    method public android.support.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, java.lang.String, android.app.PendingIntent);
+    method public android.support.customtabs.CustomTabsIntent.Builder setCloseButtonIcon(android.graphics.Bitmap);
+    method public android.support.customtabs.CustomTabsIntent.Builder setExitAnimations(android.content.Context, int, int);
+    method public android.support.customtabs.CustomTabsIntent.Builder setInstantAppsEnabled(boolean);
+    method public android.support.customtabs.CustomTabsIntent.Builder setSecondaryToolbarColor(int);
+    method public android.support.customtabs.CustomTabsIntent.Builder setSecondaryToolbarViews(android.widget.RemoteViews, int[], android.app.PendingIntent);
+    method public android.support.customtabs.CustomTabsIntent.Builder setShowTitle(boolean);
+    method public android.support.customtabs.CustomTabsIntent.Builder setStartAnimations(android.content.Context, int, int);
+    method public android.support.customtabs.CustomTabsIntent.Builder setToolbarColor(int);
+  }
+
+  public abstract class CustomTabsService extends android.app.Service {
+    ctor public CustomTabsService();
+    method protected boolean cleanUpSession(android.support.customtabs.CustomTabsSessionToken);
+    method protected abstract android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
+    method protected abstract boolean mayLaunchUrl(android.support.customtabs.CustomTabsSessionToken, android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
+    method protected abstract boolean newSession(android.support.customtabs.CustomTabsSessionToken);
+    method public android.os.IBinder onBind(android.content.Intent);
+    method protected abstract int postMessage(android.support.customtabs.CustomTabsSessionToken, java.lang.String, android.os.Bundle);
+    method protected abstract boolean requestPostMessageChannel(android.support.customtabs.CustomTabsSessionToken, android.net.Uri);
+    method protected abstract boolean updateVisuals(android.support.customtabs.CustomTabsSessionToken, android.os.Bundle);
+    method protected abstract boolean validateRelationship(android.support.customtabs.CustomTabsSessionToken, int, android.net.Uri, android.os.Bundle);
+    method protected abstract boolean warmup(long);
+    field public static final java.lang.String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
+    field public static final java.lang.String KEY_URL = "android.support.customtabs.otherurls.URL";
+    field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
+    field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
+    field public static final int RESULT_FAILURE_DISALLOWED = -1; // 0xffffffff
+    field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
+    field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
+    field public static final int RESULT_SUCCESS = 0; // 0x0
+  }
+
+  public static abstract class CustomTabsService.Relation implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract class CustomTabsService.Result implements java.lang.annotation.Annotation {
+  }
+
+  public abstract class CustomTabsServiceConnection implements android.content.ServiceConnection {
+    ctor public CustomTabsServiceConnection();
+    method public abstract void onCustomTabsServiceConnected(android.content.ComponentName, android.support.customtabs.CustomTabsClient);
+    method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
+  }
+
+  public final class CustomTabsSession {
+    method public static android.support.customtabs.CustomTabsSession createMockSessionForTesting(android.content.ComponentName);
+    method public boolean mayLaunchUrl(android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
+    method public int postMessage(java.lang.String, android.os.Bundle);
+    method public boolean requestPostMessageChannel(android.net.Uri);
+    method public boolean setActionButton(android.graphics.Bitmap, java.lang.String);
+    method public boolean setSecondaryToolbarViews(android.widget.RemoteViews, int[], android.app.PendingIntent);
+    method public deprecated boolean setToolbarItem(int, android.graphics.Bitmap, java.lang.String);
+    method public boolean validateRelationship(int, android.net.Uri, android.os.Bundle);
+  }
+
+  public class CustomTabsSessionToken {
+    method public static android.support.customtabs.CustomTabsSessionToken createMockSessionTokenForTesting();
+    method public android.support.customtabs.CustomTabsCallback getCallback();
+    method public static android.support.customtabs.CustomTabsSessionToken getSessionTokenFromIntent(android.content.Intent);
+    method public boolean isAssociatedWith(android.support.customtabs.CustomTabsSession);
+  }
+
+  public class PostMessageService extends android.app.Service {
+    ctor public PostMessageService();
+    method public android.os.IBinder onBind(android.content.Intent);
+  }
+
+  public abstract class PostMessageServiceConnection implements android.content.ServiceConnection {
+    ctor public PostMessageServiceConnection(android.support.customtabs.CustomTabsSessionToken);
+    method public boolean bindSessionToPostMessageService(android.content.Context, java.lang.String);
+    method public final boolean notifyMessageChannelReady(android.os.Bundle);
+    method public void onPostMessageServiceConnected();
+    method public void onPostMessageServiceDisconnected();
+    method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
+    method public final void onServiceDisconnected(android.content.ComponentName);
+    method public final boolean postMessage(java.lang.String, android.os.Bundle);
+    method public void unbindFromContext(android.content.Context);
+  }
+
+  public class TrustedWebUtils {
+    method public static void launchAsTrustedWebActivity(android.content.Context, android.support.customtabs.CustomTabsIntent, android.net.Uri);
+    field public static final java.lang.String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY = "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
+  }
+
+}
+
+package androidx.browser.browseractions {
+
+  public class BrowserActionItem {
+    ctor public BrowserActionItem(java.lang.String, android.app.PendingIntent, int);
+    ctor public BrowserActionItem(java.lang.String, android.app.PendingIntent);
+    method public android.app.PendingIntent getAction();
+    method public int getIconId();
+    method public java.lang.String getTitle();
+  }
+
+  public class BrowserActionsIntent {
+    method public static java.lang.String getCreatorPackageName(android.content.Intent);
+    method public android.content.Intent getIntent();
+    method public static void launchIntent(android.content.Context, android.content.Intent);
+    method public static void openBrowserAction(android.content.Context, android.net.Uri);
+    method public static void openBrowserAction(android.content.Context, android.net.Uri, int, java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem>, android.app.PendingIntent);
+    method public static java.util.List<androidx.browser.browseractions.BrowserActionItem> parseBrowserActionItems(java.util.ArrayList<android.os.Bundle>);
+    field public static final java.lang.String ACTION_BROWSER_ACTIONS_OPEN = "androidx.browser.browseractions.browser_action_open";
+    field public static final java.lang.String EXTRA_APP_ID = "androidx.browser.browseractions.APP_ID";
+    field public static final java.lang.String EXTRA_MENU_ITEMS = "androidx.browser.browseractions.extra.MENU_ITEMS";
+    field public static final java.lang.String EXTRA_SELECTED_ACTION_PENDING_INTENT = "androidx.browser.browseractions.extra.SELECTED_ACTION_PENDING_INTENT";
+    field public static final java.lang.String EXTRA_TYPE = "androidx.browser.browseractions.extra.TYPE";
+    field public static final int ITEM_COPY = 3; // 0x3
+    field public static final int ITEM_DOWNLOAD = 2; // 0x2
+    field public static final int ITEM_INVALID_ITEM = -1; // 0xffffffff
+    field public static final int ITEM_OPEN_IN_INCOGNITO = 1; // 0x1
+    field public static final int ITEM_OPEN_IN_NEW_TAB = 0; // 0x0
+    field public static final int ITEM_SHARE = 4; // 0x4
+    field public static final java.lang.String KEY_ACTION = "androidx.browser.browseractions.ACTION";
+    field public static final java.lang.String KEY_ICON_ID = "androidx.browser.browseractions.ICON_ID";
+    field public static final java.lang.String KEY_TITLE = "androidx.browser.browseractions.TITLE";
+    field public static final int MAX_CUSTOM_ITEMS = 5; // 0x5
+    field public static final int URL_TYPE_AUDIO = 3; // 0x3
+    field public static final int URL_TYPE_FILE = 4; // 0x4
+    field public static final int URL_TYPE_IMAGE = 1; // 0x1
+    field public static final int URL_TYPE_NONE = 0; // 0x0
+    field public static final int URL_TYPE_PLUGIN = 5; // 0x5
+    field public static final int URL_TYPE_VIDEO = 2; // 0x2
+  }
+
+  public static final class BrowserActionsIntent.Builder {
+    ctor public BrowserActionsIntent.Builder(android.content.Context, android.net.Uri);
+    method public androidx.browser.browseractions.BrowserActionsIntent build();
+    method public androidx.browser.browseractions.BrowserActionsIntent.Builder setCustomItems(java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem>);
+    method public androidx.browser.browseractions.BrowserActionsIntent.Builder setCustomItems(androidx.browser.browseractions.BrowserActionItem...);
+    method public androidx.browser.browseractions.BrowserActionsIntent.Builder setOnItemSelectedAction(android.app.PendingIntent);
+    method public androidx.browser.browseractions.BrowserActionsIntent.Builder setUrlType(int);
+  }
+
+}
+
diff --git a/design/Android.mk b/design/Android.mk
deleted file mode 100644
index f856de6..0000000
--- a/design/Android.mk
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright (C) 2015 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-design \
-#       android-support-transition \
-#       android-support-v7-appcompat \
-#       android-support-v7-recyclerview \
-#       android-support-v4
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_AAPT2_ONLY := true
-LOCAL_MODULE := android-support-design
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := \
-    $(call all-java-files-under,base) \
-    $(call all-java-files-under,lollipop) \
-    $(call all-java-files-under,src)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-transition \
-    android-support-v7-appcompat \
-    android-support-v7-recyclerview \
-    android-support-compat \
-    android-support-media-compat \
-    android-support-core-utils \
-    android-support-core-ui \
-    android-support-fragment
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := \
-    --no-version-vectors \
-    --add-javadoc-annotation doconly
-LOCAL_EXPORT_PROGUARD_FLAG_FILES := proguard-rules.pro
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/design/api/26.0.0.txt b/design/api/26.0.0.txt
deleted file mode 100644
index 602ee48..0000000
--- a/design/api/26.0.0.txt
+++ /dev/null
@@ -1,618 +0,0 @@
-package android.support.design.widget {
-
-  public class AppBarLayout extends android.widget.LinearLayout {
-    ctor public AppBarLayout(android.content.Context);
-    ctor public AppBarLayout(android.content.Context, android.util.AttributeSet);
-    method public void addOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method protected android.support.design.widget.AppBarLayout.LayoutParams generateDefaultLayoutParams();
-    method public android.support.design.widget.AppBarLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
-    method protected android.support.design.widget.AppBarLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public deprecated float getTargetElevation();
-    method public final int getTotalScrollRange();
-    method public void removeOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public void setExpanded(boolean);
-    method public void setExpanded(boolean, boolean);
-    method public deprecated void setTargetElevation(float);
-  }
-
-  public static class AppBarLayout.Behavior extends android.support.design.widget.HeaderBehavior {
-    ctor public AppBarLayout.Behavior();
-    ctor public AppBarLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int, int, int, int);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[], int);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int, int, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, android.view.View, int, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int);
-    method public void setDragCallback(android.support.design.widget.AppBarLayout.Behavior.DragCallback);
-  }
-
-  public static abstract class AppBarLayout.Behavior.DragCallback {
-    ctor public AppBarLayout.Behavior.DragCallback();
-    method public abstract boolean canDrag(android.support.design.widget.AppBarLayout);
-  }
-
-  protected static class AppBarLayout.Behavior.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.AppBarLayout.Behavior.SavedState> CREATOR;
-  }
-
-  public static class AppBarLayout.LayoutParams extends android.widget.LinearLayout.LayoutParams {
-    ctor public AppBarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public AppBarLayout.LayoutParams(int, int);
-    ctor public AppBarLayout.LayoutParams(int, int, float);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.widget.LinearLayout.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.support.design.widget.AppBarLayout.LayoutParams);
-    method public int getScrollFlags();
-    method public android.view.animation.Interpolator getScrollInterpolator();
-    method public void setScrollFlags(int);
-    method public void setScrollInterpolator(android.view.animation.Interpolator);
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS = 4; // 0x4
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 8; // 0x8
-    field public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 2; // 0x2
-    field public static final int SCROLL_FLAG_SCROLL = 1; // 0x1
-    field public static final int SCROLL_FLAG_SNAP = 16; // 0x10
-  }
-
-  public static abstract interface AppBarLayout.OnOffsetChangedListener {
-    method public abstract void onOffsetChanged(android.support.design.widget.AppBarLayout, int);
-  }
-
-  public static class AppBarLayout.ScrollingViewBehavior extends android.support.design.widget.HeaderScrollingViewBehavior {
-    ctor public AppBarLayout.ScrollingViewBehavior();
-    ctor public AppBarLayout.ScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, android.view.View, android.graphics.Rect, boolean);
-  }
-
-  public abstract class BaseTransientBottomBar<B extends android.support.design.widget.BaseTransientBottomBar<B>> {
-    ctor protected BaseTransientBottomBar(android.view.ViewGroup, android.view.View, android.support.design.widget.BaseTransientBottomBar.ContentViewCallback);
-    method public B addCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback<B>);
-    method public void dismiss();
-    method public android.content.Context getContext();
-    method public int getDuration();
-    method public android.view.View getView();
-    method public boolean isShown();
-    method public boolean isShownOrQueued();
-    method public B removeCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback<B>);
-    method public B setDuration(int);
-    method public void show();
-    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
-    field public static final int LENGTH_LONG = 0; // 0x0
-    field public static final int LENGTH_SHORT = -1; // 0xffffffff
-  }
-
-  public static abstract class BaseTransientBottomBar.BaseCallback<B> {
-    ctor public BaseTransientBottomBar.BaseCallback();
-    method public void onDismissed(B, int);
-    method public void onShown(B);
-    field public static final int DISMISS_EVENT_ACTION = 1; // 0x1
-    field public static final int DISMISS_EVENT_CONSECUTIVE = 4; // 0x4
-    field public static final int DISMISS_EVENT_MANUAL = 3; // 0x3
-    field public static final int DISMISS_EVENT_SWIPE = 0; // 0x0
-    field public static final int DISMISS_EVENT_TIMEOUT = 2; // 0x2
-  }
-
-  public static abstract interface BaseTransientBottomBar.ContentViewCallback {
-    method public abstract void animateContentIn(int, int);
-    method public abstract void animateContentOut(int, int);
-  }
-
-  public class BottomNavigationView extends android.widget.FrameLayout {
-    ctor public BottomNavigationView(android.content.Context);
-    ctor public BottomNavigationView(android.content.Context, android.util.AttributeSet);
-    ctor public BottomNavigationView(android.content.Context, android.util.AttributeSet, int);
-    method public int getItemBackgroundResource();
-    method public android.content.res.ColorStateList getItemIconTintList();
-    method public android.content.res.ColorStateList getItemTextColor();
-    method public int getMaxItemCount();
-    method public android.view.Menu getMenu();
-    method public int getSelectedItemId();
-    method public void inflateMenu(int);
-    method public void setItemBackgroundResource(int);
-    method public void setItemIconTintList(android.content.res.ColorStateList);
-    method public void setItemTextColor(android.content.res.ColorStateList);
-    method public void setOnNavigationItemReselectedListener(android.support.design.widget.BottomNavigationView.OnNavigationItemReselectedListener);
-    method public void setOnNavigationItemSelectedListener(android.support.design.widget.BottomNavigationView.OnNavigationItemSelectedListener);
-    method public void setSelectedItemId(int);
-  }
-
-  public static abstract interface BottomNavigationView.OnNavigationItemReselectedListener {
-    method public abstract void onNavigationItemReselected(android.view.MenuItem);
-  }
-
-  public static abstract interface BottomNavigationView.OnNavigationItemSelectedListener {
-    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
-  }
-
-  public class BottomSheetBehavior<V extends android.view.View> extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public BottomSheetBehavior();
-    ctor public BottomSheetBehavior(android.content.Context, android.util.AttributeSet);
-    method public static <V extends android.view.View> android.support.design.widget.BottomSheetBehavior<V> from(V);
-    method public final int getPeekHeight();
-    method public boolean getSkipCollapsed();
-    method public final int getState();
-    method public boolean isHideable();
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void setBottomSheetCallback(android.support.design.widget.BottomSheetBehavior.BottomSheetCallback);
-    method public void setHideable(boolean);
-    method public final void setPeekHeight(int);
-    method public void setSkipCollapsed(boolean);
-    method public final void setState(int);
-    field public static final int PEEK_HEIGHT_AUTO = -1; // 0xffffffff
-    field public static final int STATE_COLLAPSED = 4; // 0x4
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_EXPANDED = 3; // 0x3
-    field public static final int STATE_HIDDEN = 5; // 0x5
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract class BottomSheetBehavior.BottomSheetCallback {
-    ctor public BottomSheetBehavior.BottomSheetCallback();
-    method public abstract void onSlide(android.view.View, float);
-    method public abstract void onStateChanged(android.view.View, int);
-  }
-
-  protected static class BottomSheetBehavior.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public BottomSheetBehavior.SavedState(android.os.Parcel);
-    ctor public BottomSheetBehavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public BottomSheetBehavior.SavedState(android.os.Parcelable, int);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.BottomSheetBehavior.SavedState> CREATOR;
-  }
-
-  public class BottomSheetDialog extends android.support.v7.app.AppCompatDialog {
-    ctor public BottomSheetDialog(android.content.Context);
-    ctor public BottomSheetDialog(android.content.Context, int);
-    ctor protected BottomSheetDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-  }
-
-  public class BottomSheetDialogFragment extends android.support.v7.app.AppCompatDialogFragment {
-    ctor public BottomSheetDialogFragment();
-  }
-
-  public class CollapsingToolbarLayout extends android.widget.FrameLayout {
-    ctor public CollapsingToolbarLayout(android.content.Context);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet, int);
-    method protected android.support.design.widget.CollapsingToolbarLayout.LayoutParams generateDefaultLayoutParams();
-    method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
-    method protected android.widget.FrameLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public int getCollapsedTitleGravity();
-    method public android.graphics.Typeface getCollapsedTitleTypeface();
-    method public android.graphics.drawable.Drawable getContentScrim();
-    method public int getExpandedTitleGravity();
-    method public int getExpandedTitleMarginBottom();
-    method public int getExpandedTitleMarginEnd();
-    method public int getExpandedTitleMarginStart();
-    method public int getExpandedTitleMarginTop();
-    method public android.graphics.Typeface getExpandedTitleTypeface();
-    method public long getScrimAnimationDuration();
-    method public int getScrimVisibleHeightTrigger();
-    method public android.graphics.drawable.Drawable getStatusBarScrim();
-    method public java.lang.CharSequence getTitle();
-    method public boolean isTitleEnabled();
-    method public void setCollapsedTitleGravity(int);
-    method public void setCollapsedTitleTextAppearance(int);
-    method public void setCollapsedTitleTextColor(int);
-    method public void setCollapsedTitleTextColor(android.content.res.ColorStateList);
-    method public void setCollapsedTitleTypeface(android.graphics.Typeface);
-    method public void setContentScrim(android.graphics.drawable.Drawable);
-    method public void setContentScrimColor(int);
-    method public void setContentScrimResource(int);
-    method public void setExpandedTitleColor(int);
-    method public void setExpandedTitleGravity(int);
-    method public void setExpandedTitleMargin(int, int, int, int);
-    method public void setExpandedTitleMarginBottom(int);
-    method public void setExpandedTitleMarginEnd(int);
-    method public void setExpandedTitleMarginStart(int);
-    method public void setExpandedTitleMarginTop(int);
-    method public void setExpandedTitleTextAppearance(int);
-    method public void setExpandedTitleTextColor(android.content.res.ColorStateList);
-    method public void setExpandedTitleTypeface(android.graphics.Typeface);
-    method public void setScrimAnimationDuration(long);
-    method public void setScrimVisibleHeightTrigger(int);
-    method public void setScrimsShown(boolean);
-    method public void setScrimsShown(boolean, boolean);
-    method public void setStatusBarScrim(android.graphics.drawable.Drawable);
-    method public void setStatusBarScrimColor(int);
-    method public void setStatusBarScrimResource(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleEnabled(boolean);
-  }
-
-  public static class CollapsingToolbarLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public CollapsingToolbarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    method public int getCollapseMode();
-    method public float getParallaxMultiplier();
-    method public void setCollapseMode(int);
-    method public void setParallaxMultiplier(float);
-    field public static final int COLLAPSE_MODE_OFF = 0; // 0x0
-    field public static final int COLLAPSE_MODE_PARALLAX = 2; // 0x2
-    field public static final int COLLAPSE_MODE_PIN = 1; // 0x1
-  }
-
-  public class CoordinatorLayout extends android.view.ViewGroup {
-    ctor public CoordinatorLayout(android.content.Context);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void dispatchDependentViewsChanged(android.view.View);
-    method public boolean doViewsOverlap(android.view.View, android.view.View);
-    method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateDefaultLayoutParams();
-    method public android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
-    method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public java.util.List<android.view.View> getDependencies(android.view.View);
-    method public java.util.List<android.view.View> getDependents(android.view.View);
-    method public android.graphics.drawable.Drawable getStatusBarBackground();
-    method public boolean isPointInChildBounds(android.view.View, int, int);
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onLayoutChild(android.view.View, int);
-    method public void onMeasureChild(android.view.View, int, int, int, int);
-    method public void onNestedPreScroll(android.view.View, 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 setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackgroundColor(int);
-    method public void setStatusBarBackgroundResource(int);
-  }
-
-  public static abstract class CoordinatorLayout.Behavior<V extends android.view.View> {
-    ctor public CoordinatorLayout.Behavior();
-    ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect);
-    method public int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
-    method public float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
-    method public static java.lang.Object getTag(android.view.View);
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
-    method public void onAttachedToLayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void onDetachedFromLayoutParams();
-    method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
-    method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
-    method public deprecated void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[], int);
-    method public deprecated void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int, int);
-    method public deprecated void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
-    method public boolean onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect, boolean);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
-    method public deprecated boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
-    method public deprecated void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int);
-    method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public static void setTag(android.view.View, java.lang.Object);
-  }
-
-  public static abstract class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
-  }
-
-  public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public CoordinatorLayout.LayoutParams(int, int);
-    ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    method public int getAnchorId();
-    method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
-    method public void setAnchorId(int);
-    method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
-    field public int anchorGravity;
-    field public int dodgeInsetEdges;
-    field public int gravity;
-    field public int insetEdge;
-    field public int keyline;
-  }
-
-  protected static class CoordinatorLayout.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public CoordinatorLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
-  }
-
-  public class FloatingActionButton extends android.support.design.widget.VisibilityAwareImageButton {
-    ctor public FloatingActionButton(android.content.Context);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet, int);
-    method public float getCompatElevation();
-    method public android.graphics.drawable.Drawable getContentBackground();
-    method public boolean getContentRect(android.graphics.Rect);
-    method public int getRippleColor();
-    method public int getSize();
-    method public boolean getUseCompatPadding();
-    method public void hide();
-    method public void hide(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setCompatElevation(float);
-    method public void setRippleColor(int);
-    method public void setSize(int);
-    method public void setUseCompatPadding(boolean);
-    method public void show();
-    method public void show(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
-    field public static final int SIZE_AUTO = -1; // 0xffffffff
-    field public static final int SIZE_MINI = 1; // 0x1
-    field public static final int SIZE_NORMAL = 0; // 0x0
-  }
-
-  public static class FloatingActionButton.Behavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public FloatingActionButton.Behavior();
-    ctor public FloatingActionButton.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.graphics.Rect);
-    method public boolean isAutoHideEnabled();
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, int);
-    method public void setAutoHideEnabled(boolean);
-  }
-
-  public static abstract class FloatingActionButton.OnVisibilityChangedListener {
-    ctor public FloatingActionButton.OnVisibilityChangedListener();
-    method public void onHidden(android.support.design.widget.FloatingActionButton);
-    method public void onShown(android.support.design.widget.FloatingActionButton);
-  }
-
-   abstract class HeaderBehavior<V extends android.view.View> extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public HeaderBehavior();
-    ctor public HeaderBehavior(android.content.Context, android.util.AttributeSet);
-  }
-
-   abstract class HeaderScrollingViewBehavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public HeaderScrollingViewBehavior();
-    ctor public HeaderScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public final int getOverlayTop();
-    method protected void layoutChild(android.support.design.widget.CoordinatorLayout, android.view.View, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.view.View, int, int, int, int);
-    method public final void setOverlayTop(int);
-  }
-
-  public class NavigationView extends android.widget.FrameLayout {
-    ctor public NavigationView(android.content.Context);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet, int);
-    method public void addHeaderView(android.view.View);
-    method public int getHeaderCount();
-    method public android.view.View getHeaderView(int);
-    method public android.graphics.drawable.Drawable getItemBackground();
-    method public android.content.res.ColorStateList getItemIconTintList();
-    method public android.content.res.ColorStateList getItemTextColor();
-    method public android.view.Menu getMenu();
-    method public android.view.View inflateHeaderView(int);
-    method public void inflateMenu(int);
-    method public void removeHeaderView(android.view.View);
-    method public void setCheckedItem(int);
-    method public void setItemBackground(android.graphics.drawable.Drawable);
-    method public void setItemBackgroundResource(int);
-    method public void setItemIconTintList(android.content.res.ColorStateList);
-    method public void setItemTextAppearance(int);
-    method public void setItemTextColor(android.content.res.ColorStateList);
-    method public void setNavigationItemSelectedListener(android.support.design.widget.NavigationView.OnNavigationItemSelectedListener);
-  }
-
-  public static abstract interface NavigationView.OnNavigationItemSelectedListener {
-    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
-  }
-
-  public static class NavigationView.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public NavigationView.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public NavigationView.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.NavigationView.SavedState> CREATOR;
-    field public android.os.Bundle menuState;
-  }
-
-  public final class Snackbar extends android.support.design.widget.BaseTransientBottomBar {
-    method public static android.support.design.widget.Snackbar make(android.view.View, java.lang.CharSequence, int);
-    method public static android.support.design.widget.Snackbar make(android.view.View, int, int);
-    method public android.support.design.widget.Snackbar setAction(int, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setAction(java.lang.CharSequence, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setActionTextColor(android.content.res.ColorStateList);
-    method public android.support.design.widget.Snackbar setActionTextColor(int);
-    method public deprecated android.support.design.widget.Snackbar setCallback(android.support.design.widget.Snackbar.Callback);
-    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
-    method public android.support.design.widget.Snackbar setText(int);
-    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
-    field public static final int LENGTH_LONG = 0; // 0x0
-    field public static final int LENGTH_SHORT = -1; // 0xffffffff
-  }
-
-  public static class Snackbar.Callback extends android.support.design.widget.BaseTransientBottomBar.BaseCallback {
-    ctor public Snackbar.Callback();
-    method public void onDismissed(android.support.design.widget.Snackbar, int);
-    method public void onShown(android.support.design.widget.Snackbar);
-    field public static final int DISMISS_EVENT_ACTION = 1; // 0x1
-    field public static final int DISMISS_EVENT_CONSECUTIVE = 4; // 0x4
-    field public static final int DISMISS_EVENT_MANUAL = 3; // 0x3
-    field public static final int DISMISS_EVENT_SWIPE = 0; // 0x0
-    field public static final int DISMISS_EVENT_TIMEOUT = 2; // 0x2
-  }
-
-  public class SwipeDismissBehavior<V extends android.view.View> extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public SwipeDismissBehavior();
-    method public boolean canSwipeDismissView(android.view.View);
-    method public int getDragState();
-    method public void setDragDismissDistance(float);
-    method public void setEndAlphaSwipeDistance(float);
-    method public void setListener(android.support.design.widget.SwipeDismissBehavior.OnDismissListener);
-    method public void setSensitivity(float);
-    method public void setStartAlphaSwipeDistance(float);
-    method public void setSwipeDirection(int);
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_ANY = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_END_TO_START = 1; // 0x1
-    field public static final int SWIPE_DIRECTION_START_TO_END = 0; // 0x0
-  }
-
-  public static abstract interface SwipeDismissBehavior.OnDismissListener {
-    method public abstract void onDismiss(android.view.View);
-    method public abstract void onDragStateChanged(int);
-  }
-
-  public final class TabItem extends android.view.View {
-    ctor public TabItem(android.content.Context);
-    ctor public TabItem(android.content.Context, android.util.AttributeSet);
-  }
-
-  public class TabLayout extends android.widget.HorizontalScrollView {
-    ctor public TabLayout(android.content.Context);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void addOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void addTab(android.support.design.widget.TabLayout.Tab);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, boolean);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int, boolean);
-    method public void clearOnTabSelectedListeners();
-    method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
-    method public int getSelectedTabPosition();
-    method public android.support.design.widget.TabLayout.Tab getTabAt(int);
-    method public int getTabCount();
-    method public int getTabGravity();
-    method public int getTabMode();
-    method public android.content.res.ColorStateList getTabTextColors();
-    method public android.support.design.widget.TabLayout.Tab newTab();
-    method public void removeAllTabs();
-    method public void removeOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void removeTab(android.support.design.widget.TabLayout.Tab);
-    method public void removeTabAt(int);
-    method public deprecated void setOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void setScrollPosition(int, float, boolean);
-    method public void setSelectedTabIndicatorColor(int);
-    method public void setSelectedTabIndicatorHeight(int);
-    method public void setTabGravity(int);
-    method public void setTabMode(int);
-    method public void setTabTextColors(android.content.res.ColorStateList);
-    method public void setTabTextColors(int, int);
-    method public deprecated void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
-    method public void setupWithViewPager(android.support.v4.view.ViewPager);
-    method public void setupWithViewPager(android.support.v4.view.ViewPager, boolean);
-    field public static final int GRAVITY_CENTER = 1; // 0x1
-    field public static final int GRAVITY_FILL = 0; // 0x0
-    field public static final int MODE_FIXED = 1; // 0x1
-    field public static final int MODE_SCROLLABLE = 0; // 0x0
-  }
-
-  public static abstract interface TabLayout.OnTabSelectedListener {
-    method public abstract void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public static final class TabLayout.Tab {
-    method public java.lang.CharSequence getContentDescription();
-    method public android.view.View getCustomView();
-    method public android.graphics.drawable.Drawable getIcon();
-    method public int getPosition();
-    method public java.lang.Object getTag();
-    method public java.lang.CharSequence getText();
-    method public boolean isSelected();
-    method public void select();
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(int);
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(android.view.View);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(int);
-    method public android.support.design.widget.TabLayout.Tab setIcon(android.graphics.drawable.Drawable);
-    method public android.support.design.widget.TabLayout.Tab setIcon(int);
-    method public android.support.design.widget.TabLayout.Tab setTag(java.lang.Object);
-    method public android.support.design.widget.TabLayout.Tab setText(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class TabLayout.TabLayoutOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public TabLayout.TabLayoutOnPageChangeListener(android.support.design.widget.TabLayout);
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public static class TabLayout.ViewPagerOnTabSelectedListener implements android.support.design.widget.TabLayout.OnTabSelectedListener {
-    ctor public TabLayout.ViewPagerOnTabSelectedListener(android.support.v4.view.ViewPager);
-    method public void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public class TextInputEditText extends android.support.v7.widget.AppCompatEditText {
-    ctor public TextInputEditText(android.content.Context);
-    ctor public TextInputEditText(android.content.Context, android.util.AttributeSet);
-    ctor public TextInputEditText(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class TextInputLayout extends android.widget.LinearLayout {
-    ctor public TextInputLayout(android.content.Context);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet, int);
-    method public int getCounterMaxLength();
-    method public android.widget.EditText getEditText();
-    method public java.lang.CharSequence getError();
-    method public java.lang.CharSequence getHint();
-    method public java.lang.CharSequence getPasswordVisibilityToggleContentDescription();
-    method public android.graphics.drawable.Drawable getPasswordVisibilityToggleDrawable();
-    method public android.graphics.Typeface getTypeface();
-    method public boolean isCounterEnabled();
-    method public boolean isErrorEnabled();
-    method public boolean isHintAnimationEnabled();
-    method public boolean isHintEnabled();
-    method public boolean isPasswordVisibilityToggleEnabled();
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void setCounterEnabled(boolean);
-    method public void setCounterMaxLength(int);
-    method public void setError(java.lang.CharSequence);
-    method public void setErrorEnabled(boolean);
-    method public void setErrorTextAppearance(int);
-    method public void setHint(java.lang.CharSequence);
-    method public void setHintAnimationEnabled(boolean);
-    method public void setHintEnabled(boolean);
-    method public void setHintTextAppearance(int);
-    method public void setPasswordVisibilityToggleContentDescription(int);
-    method public void setPasswordVisibilityToggleContentDescription(java.lang.CharSequence);
-    method public void setPasswordVisibilityToggleDrawable(int);
-    method public void setPasswordVisibilityToggleDrawable(android.graphics.drawable.Drawable);
-    method public void setPasswordVisibilityToggleEnabled(boolean);
-    method public void setPasswordVisibilityToggleTintList(android.content.res.ColorStateList);
-    method public void setPasswordVisibilityToggleTintMode(android.graphics.PorterDuff.Mode);
-    method public void setTypeface(android.graphics.Typeface);
-  }
-
-   class ViewOffsetBehavior<V extends android.view.View> extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public ViewOffsetBehavior();
-    ctor public ViewOffsetBehavior(android.content.Context, android.util.AttributeSet);
-    method public int getLeftAndRightOffset();
-    method public int getTopAndBottomOffset();
-    method protected void layoutChild(android.support.design.widget.CoordinatorLayout, V, int);
-    method public boolean setLeftAndRightOffset(int);
-    method public boolean setTopAndBottomOffset(int);
-  }
-
-   class VisibilityAwareImageButton extends android.widget.ImageButton {
-    ctor public VisibilityAwareImageButton(android.content.Context);
-    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet);
-    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-}
-
diff --git a/design/api/26.1.0.txt b/design/api/26.1.0.txt
deleted file mode 100644
index 602ee48..0000000
--- a/design/api/26.1.0.txt
+++ /dev/null
@@ -1,618 +0,0 @@
-package android.support.design.widget {
-
-  public class AppBarLayout extends android.widget.LinearLayout {
-    ctor public AppBarLayout(android.content.Context);
-    ctor public AppBarLayout(android.content.Context, android.util.AttributeSet);
-    method public void addOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method protected android.support.design.widget.AppBarLayout.LayoutParams generateDefaultLayoutParams();
-    method public android.support.design.widget.AppBarLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
-    method protected android.support.design.widget.AppBarLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public deprecated float getTargetElevation();
-    method public final int getTotalScrollRange();
-    method public void removeOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public void setExpanded(boolean);
-    method public void setExpanded(boolean, boolean);
-    method public deprecated void setTargetElevation(float);
-  }
-
-  public static class AppBarLayout.Behavior extends android.support.design.widget.HeaderBehavior {
-    ctor public AppBarLayout.Behavior();
-    ctor public AppBarLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int, int, int, int);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[], int);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int, int, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, android.view.View, int, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int);
-    method public void setDragCallback(android.support.design.widget.AppBarLayout.Behavior.DragCallback);
-  }
-
-  public static abstract class AppBarLayout.Behavior.DragCallback {
-    ctor public AppBarLayout.Behavior.DragCallback();
-    method public abstract boolean canDrag(android.support.design.widget.AppBarLayout);
-  }
-
-  protected static class AppBarLayout.Behavior.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.AppBarLayout.Behavior.SavedState> CREATOR;
-  }
-
-  public static class AppBarLayout.LayoutParams extends android.widget.LinearLayout.LayoutParams {
-    ctor public AppBarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public AppBarLayout.LayoutParams(int, int);
-    ctor public AppBarLayout.LayoutParams(int, int, float);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.widget.LinearLayout.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.support.design.widget.AppBarLayout.LayoutParams);
-    method public int getScrollFlags();
-    method public android.view.animation.Interpolator getScrollInterpolator();
-    method public void setScrollFlags(int);
-    method public void setScrollInterpolator(android.view.animation.Interpolator);
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS = 4; // 0x4
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 8; // 0x8
-    field public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 2; // 0x2
-    field public static final int SCROLL_FLAG_SCROLL = 1; // 0x1
-    field public static final int SCROLL_FLAG_SNAP = 16; // 0x10
-  }
-
-  public static abstract interface AppBarLayout.OnOffsetChangedListener {
-    method public abstract void onOffsetChanged(android.support.design.widget.AppBarLayout, int);
-  }
-
-  public static class AppBarLayout.ScrollingViewBehavior extends android.support.design.widget.HeaderScrollingViewBehavior {
-    ctor public AppBarLayout.ScrollingViewBehavior();
-    ctor public AppBarLayout.ScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, android.view.View, android.graphics.Rect, boolean);
-  }
-
-  public abstract class BaseTransientBottomBar<B extends android.support.design.widget.BaseTransientBottomBar<B>> {
-    ctor protected BaseTransientBottomBar(android.view.ViewGroup, android.view.View, android.support.design.widget.BaseTransientBottomBar.ContentViewCallback);
-    method public B addCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback<B>);
-    method public void dismiss();
-    method public android.content.Context getContext();
-    method public int getDuration();
-    method public android.view.View getView();
-    method public boolean isShown();
-    method public boolean isShownOrQueued();
-    method public B removeCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback<B>);
-    method public B setDuration(int);
-    method public void show();
-    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
-    field public static final int LENGTH_LONG = 0; // 0x0
-    field public static final int LENGTH_SHORT = -1; // 0xffffffff
-  }
-
-  public static abstract class BaseTransientBottomBar.BaseCallback<B> {
-    ctor public BaseTransientBottomBar.BaseCallback();
-    method public void onDismissed(B, int);
-    method public void onShown(B);
-    field public static final int DISMISS_EVENT_ACTION = 1; // 0x1
-    field public static final int DISMISS_EVENT_CONSECUTIVE = 4; // 0x4
-    field public static final int DISMISS_EVENT_MANUAL = 3; // 0x3
-    field public static final int DISMISS_EVENT_SWIPE = 0; // 0x0
-    field public static final int DISMISS_EVENT_TIMEOUT = 2; // 0x2
-  }
-
-  public static abstract interface BaseTransientBottomBar.ContentViewCallback {
-    method public abstract void animateContentIn(int, int);
-    method public abstract void animateContentOut(int, int);
-  }
-
-  public class BottomNavigationView extends android.widget.FrameLayout {
-    ctor public BottomNavigationView(android.content.Context);
-    ctor public BottomNavigationView(android.content.Context, android.util.AttributeSet);
-    ctor public BottomNavigationView(android.content.Context, android.util.AttributeSet, int);
-    method public int getItemBackgroundResource();
-    method public android.content.res.ColorStateList getItemIconTintList();
-    method public android.content.res.ColorStateList getItemTextColor();
-    method public int getMaxItemCount();
-    method public android.view.Menu getMenu();
-    method public int getSelectedItemId();
-    method public void inflateMenu(int);
-    method public void setItemBackgroundResource(int);
-    method public void setItemIconTintList(android.content.res.ColorStateList);
-    method public void setItemTextColor(android.content.res.ColorStateList);
-    method public void setOnNavigationItemReselectedListener(android.support.design.widget.BottomNavigationView.OnNavigationItemReselectedListener);
-    method public void setOnNavigationItemSelectedListener(android.support.design.widget.BottomNavigationView.OnNavigationItemSelectedListener);
-    method public void setSelectedItemId(int);
-  }
-
-  public static abstract interface BottomNavigationView.OnNavigationItemReselectedListener {
-    method public abstract void onNavigationItemReselected(android.view.MenuItem);
-  }
-
-  public static abstract interface BottomNavigationView.OnNavigationItemSelectedListener {
-    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
-  }
-
-  public class BottomSheetBehavior<V extends android.view.View> extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public BottomSheetBehavior();
-    ctor public BottomSheetBehavior(android.content.Context, android.util.AttributeSet);
-    method public static <V extends android.view.View> android.support.design.widget.BottomSheetBehavior<V> from(V);
-    method public final int getPeekHeight();
-    method public boolean getSkipCollapsed();
-    method public final int getState();
-    method public boolean isHideable();
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void setBottomSheetCallback(android.support.design.widget.BottomSheetBehavior.BottomSheetCallback);
-    method public void setHideable(boolean);
-    method public final void setPeekHeight(int);
-    method public void setSkipCollapsed(boolean);
-    method public final void setState(int);
-    field public static final int PEEK_HEIGHT_AUTO = -1; // 0xffffffff
-    field public static final int STATE_COLLAPSED = 4; // 0x4
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_EXPANDED = 3; // 0x3
-    field public static final int STATE_HIDDEN = 5; // 0x5
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract class BottomSheetBehavior.BottomSheetCallback {
-    ctor public BottomSheetBehavior.BottomSheetCallback();
-    method public abstract void onSlide(android.view.View, float);
-    method public abstract void onStateChanged(android.view.View, int);
-  }
-
-  protected static class BottomSheetBehavior.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public BottomSheetBehavior.SavedState(android.os.Parcel);
-    ctor public BottomSheetBehavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public BottomSheetBehavior.SavedState(android.os.Parcelable, int);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.BottomSheetBehavior.SavedState> CREATOR;
-  }
-
-  public class BottomSheetDialog extends android.support.v7.app.AppCompatDialog {
-    ctor public BottomSheetDialog(android.content.Context);
-    ctor public BottomSheetDialog(android.content.Context, int);
-    ctor protected BottomSheetDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-  }
-
-  public class BottomSheetDialogFragment extends android.support.v7.app.AppCompatDialogFragment {
-    ctor public BottomSheetDialogFragment();
-  }
-
-  public class CollapsingToolbarLayout extends android.widget.FrameLayout {
-    ctor public CollapsingToolbarLayout(android.content.Context);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet, int);
-    method protected android.support.design.widget.CollapsingToolbarLayout.LayoutParams generateDefaultLayoutParams();
-    method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
-    method protected android.widget.FrameLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public int getCollapsedTitleGravity();
-    method public android.graphics.Typeface getCollapsedTitleTypeface();
-    method public android.graphics.drawable.Drawable getContentScrim();
-    method public int getExpandedTitleGravity();
-    method public int getExpandedTitleMarginBottom();
-    method public int getExpandedTitleMarginEnd();
-    method public int getExpandedTitleMarginStart();
-    method public int getExpandedTitleMarginTop();
-    method public android.graphics.Typeface getExpandedTitleTypeface();
-    method public long getScrimAnimationDuration();
-    method public int getScrimVisibleHeightTrigger();
-    method public android.graphics.drawable.Drawable getStatusBarScrim();
-    method public java.lang.CharSequence getTitle();
-    method public boolean isTitleEnabled();
-    method public void setCollapsedTitleGravity(int);
-    method public void setCollapsedTitleTextAppearance(int);
-    method public void setCollapsedTitleTextColor(int);
-    method public void setCollapsedTitleTextColor(android.content.res.ColorStateList);
-    method public void setCollapsedTitleTypeface(android.graphics.Typeface);
-    method public void setContentScrim(android.graphics.drawable.Drawable);
-    method public void setContentScrimColor(int);
-    method public void setContentScrimResource(int);
-    method public void setExpandedTitleColor(int);
-    method public void setExpandedTitleGravity(int);
-    method public void setExpandedTitleMargin(int, int, int, int);
-    method public void setExpandedTitleMarginBottom(int);
-    method public void setExpandedTitleMarginEnd(int);
-    method public void setExpandedTitleMarginStart(int);
-    method public void setExpandedTitleMarginTop(int);
-    method public void setExpandedTitleTextAppearance(int);
-    method public void setExpandedTitleTextColor(android.content.res.ColorStateList);
-    method public void setExpandedTitleTypeface(android.graphics.Typeface);
-    method public void setScrimAnimationDuration(long);
-    method public void setScrimVisibleHeightTrigger(int);
-    method public void setScrimsShown(boolean);
-    method public void setScrimsShown(boolean, boolean);
-    method public void setStatusBarScrim(android.graphics.drawable.Drawable);
-    method public void setStatusBarScrimColor(int);
-    method public void setStatusBarScrimResource(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleEnabled(boolean);
-  }
-
-  public static class CollapsingToolbarLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public CollapsingToolbarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    method public int getCollapseMode();
-    method public float getParallaxMultiplier();
-    method public void setCollapseMode(int);
-    method public void setParallaxMultiplier(float);
-    field public static final int COLLAPSE_MODE_OFF = 0; // 0x0
-    field public static final int COLLAPSE_MODE_PARALLAX = 2; // 0x2
-    field public static final int COLLAPSE_MODE_PIN = 1; // 0x1
-  }
-
-  public class CoordinatorLayout extends android.view.ViewGroup {
-    ctor public CoordinatorLayout(android.content.Context);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void dispatchDependentViewsChanged(android.view.View);
-    method public boolean doViewsOverlap(android.view.View, android.view.View);
-    method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateDefaultLayoutParams();
-    method public android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
-    method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public java.util.List<android.view.View> getDependencies(android.view.View);
-    method public java.util.List<android.view.View> getDependents(android.view.View);
-    method public android.graphics.drawable.Drawable getStatusBarBackground();
-    method public boolean isPointInChildBounds(android.view.View, int, int);
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onLayoutChild(android.view.View, int);
-    method public void onMeasureChild(android.view.View, int, int, int, int);
-    method public void onNestedPreScroll(android.view.View, 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 setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackgroundColor(int);
-    method public void setStatusBarBackgroundResource(int);
-  }
-
-  public static abstract class CoordinatorLayout.Behavior<V extends android.view.View> {
-    ctor public CoordinatorLayout.Behavior();
-    ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect);
-    method public int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
-    method public float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
-    method public static java.lang.Object getTag(android.view.View);
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
-    method public void onAttachedToLayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void onDetachedFromLayoutParams();
-    method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
-    method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
-    method public deprecated void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[], int);
-    method public deprecated void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int, int);
-    method public deprecated void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
-    method public boolean onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect, boolean);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
-    method public deprecated boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
-    method public deprecated void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int);
-    method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public static void setTag(android.view.View, java.lang.Object);
-  }
-
-  public static abstract class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
-  }
-
-  public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public CoordinatorLayout.LayoutParams(int, int);
-    ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    method public int getAnchorId();
-    method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
-    method public void setAnchorId(int);
-    method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
-    field public int anchorGravity;
-    field public int dodgeInsetEdges;
-    field public int gravity;
-    field public int insetEdge;
-    field public int keyline;
-  }
-
-  protected static class CoordinatorLayout.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public CoordinatorLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
-  }
-
-  public class FloatingActionButton extends android.support.design.widget.VisibilityAwareImageButton {
-    ctor public FloatingActionButton(android.content.Context);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet, int);
-    method public float getCompatElevation();
-    method public android.graphics.drawable.Drawable getContentBackground();
-    method public boolean getContentRect(android.graphics.Rect);
-    method public int getRippleColor();
-    method public int getSize();
-    method public boolean getUseCompatPadding();
-    method public void hide();
-    method public void hide(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setCompatElevation(float);
-    method public void setRippleColor(int);
-    method public void setSize(int);
-    method public void setUseCompatPadding(boolean);
-    method public void show();
-    method public void show(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
-    field public static final int SIZE_AUTO = -1; // 0xffffffff
-    field public static final int SIZE_MINI = 1; // 0x1
-    field public static final int SIZE_NORMAL = 0; // 0x0
-  }
-
-  public static class FloatingActionButton.Behavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public FloatingActionButton.Behavior();
-    ctor public FloatingActionButton.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.graphics.Rect);
-    method public boolean isAutoHideEnabled();
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, int);
-    method public void setAutoHideEnabled(boolean);
-  }
-
-  public static abstract class FloatingActionButton.OnVisibilityChangedListener {
-    ctor public FloatingActionButton.OnVisibilityChangedListener();
-    method public void onHidden(android.support.design.widget.FloatingActionButton);
-    method public void onShown(android.support.design.widget.FloatingActionButton);
-  }
-
-   abstract class HeaderBehavior<V extends android.view.View> extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public HeaderBehavior();
-    ctor public HeaderBehavior(android.content.Context, android.util.AttributeSet);
-  }
-
-   abstract class HeaderScrollingViewBehavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public HeaderScrollingViewBehavior();
-    ctor public HeaderScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public final int getOverlayTop();
-    method protected void layoutChild(android.support.design.widget.CoordinatorLayout, android.view.View, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.view.View, int, int, int, int);
-    method public final void setOverlayTop(int);
-  }
-
-  public class NavigationView extends android.widget.FrameLayout {
-    ctor public NavigationView(android.content.Context);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet, int);
-    method public void addHeaderView(android.view.View);
-    method public int getHeaderCount();
-    method public android.view.View getHeaderView(int);
-    method public android.graphics.drawable.Drawable getItemBackground();
-    method public android.content.res.ColorStateList getItemIconTintList();
-    method public android.content.res.ColorStateList getItemTextColor();
-    method public android.view.Menu getMenu();
-    method public android.view.View inflateHeaderView(int);
-    method public void inflateMenu(int);
-    method public void removeHeaderView(android.view.View);
-    method public void setCheckedItem(int);
-    method public void setItemBackground(android.graphics.drawable.Drawable);
-    method public void setItemBackgroundResource(int);
-    method public void setItemIconTintList(android.content.res.ColorStateList);
-    method public void setItemTextAppearance(int);
-    method public void setItemTextColor(android.content.res.ColorStateList);
-    method public void setNavigationItemSelectedListener(android.support.design.widget.NavigationView.OnNavigationItemSelectedListener);
-  }
-
-  public static abstract interface NavigationView.OnNavigationItemSelectedListener {
-    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
-  }
-
-  public static class NavigationView.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public NavigationView.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public NavigationView.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.NavigationView.SavedState> CREATOR;
-    field public android.os.Bundle menuState;
-  }
-
-  public final class Snackbar extends android.support.design.widget.BaseTransientBottomBar {
-    method public static android.support.design.widget.Snackbar make(android.view.View, java.lang.CharSequence, int);
-    method public static android.support.design.widget.Snackbar make(android.view.View, int, int);
-    method public android.support.design.widget.Snackbar setAction(int, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setAction(java.lang.CharSequence, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setActionTextColor(android.content.res.ColorStateList);
-    method public android.support.design.widget.Snackbar setActionTextColor(int);
-    method public deprecated android.support.design.widget.Snackbar setCallback(android.support.design.widget.Snackbar.Callback);
-    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
-    method public android.support.design.widget.Snackbar setText(int);
-    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
-    field public static final int LENGTH_LONG = 0; // 0x0
-    field public static final int LENGTH_SHORT = -1; // 0xffffffff
-  }
-
-  public static class Snackbar.Callback extends android.support.design.widget.BaseTransientBottomBar.BaseCallback {
-    ctor public Snackbar.Callback();
-    method public void onDismissed(android.support.design.widget.Snackbar, int);
-    method public void onShown(android.support.design.widget.Snackbar);
-    field public static final int DISMISS_EVENT_ACTION = 1; // 0x1
-    field public static final int DISMISS_EVENT_CONSECUTIVE = 4; // 0x4
-    field public static final int DISMISS_EVENT_MANUAL = 3; // 0x3
-    field public static final int DISMISS_EVENT_SWIPE = 0; // 0x0
-    field public static final int DISMISS_EVENT_TIMEOUT = 2; // 0x2
-  }
-
-  public class SwipeDismissBehavior<V extends android.view.View> extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public SwipeDismissBehavior();
-    method public boolean canSwipeDismissView(android.view.View);
-    method public int getDragState();
-    method public void setDragDismissDistance(float);
-    method public void setEndAlphaSwipeDistance(float);
-    method public void setListener(android.support.design.widget.SwipeDismissBehavior.OnDismissListener);
-    method public void setSensitivity(float);
-    method public void setStartAlphaSwipeDistance(float);
-    method public void setSwipeDirection(int);
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_ANY = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_END_TO_START = 1; // 0x1
-    field public static final int SWIPE_DIRECTION_START_TO_END = 0; // 0x0
-  }
-
-  public static abstract interface SwipeDismissBehavior.OnDismissListener {
-    method public abstract void onDismiss(android.view.View);
-    method public abstract void onDragStateChanged(int);
-  }
-
-  public final class TabItem extends android.view.View {
-    ctor public TabItem(android.content.Context);
-    ctor public TabItem(android.content.Context, android.util.AttributeSet);
-  }
-
-  public class TabLayout extends android.widget.HorizontalScrollView {
-    ctor public TabLayout(android.content.Context);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void addOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void addTab(android.support.design.widget.TabLayout.Tab);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, boolean);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int, boolean);
-    method public void clearOnTabSelectedListeners();
-    method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
-    method public int getSelectedTabPosition();
-    method public android.support.design.widget.TabLayout.Tab getTabAt(int);
-    method public int getTabCount();
-    method public int getTabGravity();
-    method public int getTabMode();
-    method public android.content.res.ColorStateList getTabTextColors();
-    method public android.support.design.widget.TabLayout.Tab newTab();
-    method public void removeAllTabs();
-    method public void removeOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void removeTab(android.support.design.widget.TabLayout.Tab);
-    method public void removeTabAt(int);
-    method public deprecated void setOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void setScrollPosition(int, float, boolean);
-    method public void setSelectedTabIndicatorColor(int);
-    method public void setSelectedTabIndicatorHeight(int);
-    method public void setTabGravity(int);
-    method public void setTabMode(int);
-    method public void setTabTextColors(android.content.res.ColorStateList);
-    method public void setTabTextColors(int, int);
-    method public deprecated void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
-    method public void setupWithViewPager(android.support.v4.view.ViewPager);
-    method public void setupWithViewPager(android.support.v4.view.ViewPager, boolean);
-    field public static final int GRAVITY_CENTER = 1; // 0x1
-    field public static final int GRAVITY_FILL = 0; // 0x0
-    field public static final int MODE_FIXED = 1; // 0x1
-    field public static final int MODE_SCROLLABLE = 0; // 0x0
-  }
-
-  public static abstract interface TabLayout.OnTabSelectedListener {
-    method public abstract void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public static final class TabLayout.Tab {
-    method public java.lang.CharSequence getContentDescription();
-    method public android.view.View getCustomView();
-    method public android.graphics.drawable.Drawable getIcon();
-    method public int getPosition();
-    method public java.lang.Object getTag();
-    method public java.lang.CharSequence getText();
-    method public boolean isSelected();
-    method public void select();
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(int);
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(android.view.View);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(int);
-    method public android.support.design.widget.TabLayout.Tab setIcon(android.graphics.drawable.Drawable);
-    method public android.support.design.widget.TabLayout.Tab setIcon(int);
-    method public android.support.design.widget.TabLayout.Tab setTag(java.lang.Object);
-    method public android.support.design.widget.TabLayout.Tab setText(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class TabLayout.TabLayoutOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public TabLayout.TabLayoutOnPageChangeListener(android.support.design.widget.TabLayout);
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public static class TabLayout.ViewPagerOnTabSelectedListener implements android.support.design.widget.TabLayout.OnTabSelectedListener {
-    ctor public TabLayout.ViewPagerOnTabSelectedListener(android.support.v4.view.ViewPager);
-    method public void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public class TextInputEditText extends android.support.v7.widget.AppCompatEditText {
-    ctor public TextInputEditText(android.content.Context);
-    ctor public TextInputEditText(android.content.Context, android.util.AttributeSet);
-    ctor public TextInputEditText(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class TextInputLayout extends android.widget.LinearLayout {
-    ctor public TextInputLayout(android.content.Context);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet, int);
-    method public int getCounterMaxLength();
-    method public android.widget.EditText getEditText();
-    method public java.lang.CharSequence getError();
-    method public java.lang.CharSequence getHint();
-    method public java.lang.CharSequence getPasswordVisibilityToggleContentDescription();
-    method public android.graphics.drawable.Drawable getPasswordVisibilityToggleDrawable();
-    method public android.graphics.Typeface getTypeface();
-    method public boolean isCounterEnabled();
-    method public boolean isErrorEnabled();
-    method public boolean isHintAnimationEnabled();
-    method public boolean isHintEnabled();
-    method public boolean isPasswordVisibilityToggleEnabled();
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void setCounterEnabled(boolean);
-    method public void setCounterMaxLength(int);
-    method public void setError(java.lang.CharSequence);
-    method public void setErrorEnabled(boolean);
-    method public void setErrorTextAppearance(int);
-    method public void setHint(java.lang.CharSequence);
-    method public void setHintAnimationEnabled(boolean);
-    method public void setHintEnabled(boolean);
-    method public void setHintTextAppearance(int);
-    method public void setPasswordVisibilityToggleContentDescription(int);
-    method public void setPasswordVisibilityToggleContentDescription(java.lang.CharSequence);
-    method public void setPasswordVisibilityToggleDrawable(int);
-    method public void setPasswordVisibilityToggleDrawable(android.graphics.drawable.Drawable);
-    method public void setPasswordVisibilityToggleEnabled(boolean);
-    method public void setPasswordVisibilityToggleTintList(android.content.res.ColorStateList);
-    method public void setPasswordVisibilityToggleTintMode(android.graphics.PorterDuff.Mode);
-    method public void setTypeface(android.graphics.Typeface);
-  }
-
-   class ViewOffsetBehavior<V extends android.view.View> extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public ViewOffsetBehavior();
-    ctor public ViewOffsetBehavior(android.content.Context, android.util.AttributeSet);
-    method public int getLeftAndRightOffset();
-    method public int getTopAndBottomOffset();
-    method protected void layoutChild(android.support.design.widget.CoordinatorLayout, V, int);
-    method public boolean setLeftAndRightOffset(int);
-    method public boolean setTopAndBottomOffset(int);
-  }
-
-   class VisibilityAwareImageButton extends android.widget.ImageButton {
-    ctor public VisibilityAwareImageButton(android.content.Context);
-    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet);
-    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-}
-
diff --git a/design/api/27.0.0.ignore b/design/api/27.0.0.ignore
deleted file mode 100644
index d982dc1..0000000
--- a/design/api/27.0.0.ignore
+++ /dev/null
@@ -1,14 +0,0 @@
-a1fc27e
-197ce1d
-88bc57e
-9761c3e
-86b38bf
-c6abd5e
-cea5c29
-8bac7c2
-f02de9f
-1d50e39
-fb2d5b2
-4c9b1f0
-7da565d
-33c90df
diff --git a/design/api/27.0.0.txt b/design/api/27.0.0.txt
deleted file mode 100644
index 602ee48..0000000
--- a/design/api/27.0.0.txt
+++ /dev/null
@@ -1,618 +0,0 @@
-package android.support.design.widget {
-
-  public class AppBarLayout extends android.widget.LinearLayout {
-    ctor public AppBarLayout(android.content.Context);
-    ctor public AppBarLayout(android.content.Context, android.util.AttributeSet);
-    method public void addOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method protected android.support.design.widget.AppBarLayout.LayoutParams generateDefaultLayoutParams();
-    method public android.support.design.widget.AppBarLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
-    method protected android.support.design.widget.AppBarLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public deprecated float getTargetElevation();
-    method public final int getTotalScrollRange();
-    method public void removeOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public void setExpanded(boolean);
-    method public void setExpanded(boolean, boolean);
-    method public deprecated void setTargetElevation(float);
-  }
-
-  public static class AppBarLayout.Behavior extends android.support.design.widget.HeaderBehavior {
-    ctor public AppBarLayout.Behavior();
-    ctor public AppBarLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int, int, int, int);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[], int);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int, int, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, android.view.View, int, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int);
-    method public void setDragCallback(android.support.design.widget.AppBarLayout.Behavior.DragCallback);
-  }
-
-  public static abstract class AppBarLayout.Behavior.DragCallback {
-    ctor public AppBarLayout.Behavior.DragCallback();
-    method public abstract boolean canDrag(android.support.design.widget.AppBarLayout);
-  }
-
-  protected static class AppBarLayout.Behavior.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.AppBarLayout.Behavior.SavedState> CREATOR;
-  }
-
-  public static class AppBarLayout.LayoutParams extends android.widget.LinearLayout.LayoutParams {
-    ctor public AppBarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public AppBarLayout.LayoutParams(int, int);
-    ctor public AppBarLayout.LayoutParams(int, int, float);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.widget.LinearLayout.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.support.design.widget.AppBarLayout.LayoutParams);
-    method public int getScrollFlags();
-    method public android.view.animation.Interpolator getScrollInterpolator();
-    method public void setScrollFlags(int);
-    method public void setScrollInterpolator(android.view.animation.Interpolator);
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS = 4; // 0x4
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 8; // 0x8
-    field public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 2; // 0x2
-    field public static final int SCROLL_FLAG_SCROLL = 1; // 0x1
-    field public static final int SCROLL_FLAG_SNAP = 16; // 0x10
-  }
-
-  public static abstract interface AppBarLayout.OnOffsetChangedListener {
-    method public abstract void onOffsetChanged(android.support.design.widget.AppBarLayout, int);
-  }
-
-  public static class AppBarLayout.ScrollingViewBehavior extends android.support.design.widget.HeaderScrollingViewBehavior {
-    ctor public AppBarLayout.ScrollingViewBehavior();
-    ctor public AppBarLayout.ScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, android.view.View, android.graphics.Rect, boolean);
-  }
-
-  public abstract class BaseTransientBottomBar<B extends android.support.design.widget.BaseTransientBottomBar<B>> {
-    ctor protected BaseTransientBottomBar(android.view.ViewGroup, android.view.View, android.support.design.widget.BaseTransientBottomBar.ContentViewCallback);
-    method public B addCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback<B>);
-    method public void dismiss();
-    method public android.content.Context getContext();
-    method public int getDuration();
-    method public android.view.View getView();
-    method public boolean isShown();
-    method public boolean isShownOrQueued();
-    method public B removeCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback<B>);
-    method public B setDuration(int);
-    method public void show();
-    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
-    field public static final int LENGTH_LONG = 0; // 0x0
-    field public static final int LENGTH_SHORT = -1; // 0xffffffff
-  }
-
-  public static abstract class BaseTransientBottomBar.BaseCallback<B> {
-    ctor public BaseTransientBottomBar.BaseCallback();
-    method public void onDismissed(B, int);
-    method public void onShown(B);
-    field public static final int DISMISS_EVENT_ACTION = 1; // 0x1
-    field public static final int DISMISS_EVENT_CONSECUTIVE = 4; // 0x4
-    field public static final int DISMISS_EVENT_MANUAL = 3; // 0x3
-    field public static final int DISMISS_EVENT_SWIPE = 0; // 0x0
-    field public static final int DISMISS_EVENT_TIMEOUT = 2; // 0x2
-  }
-
-  public static abstract interface BaseTransientBottomBar.ContentViewCallback {
-    method public abstract void animateContentIn(int, int);
-    method public abstract void animateContentOut(int, int);
-  }
-
-  public class BottomNavigationView extends android.widget.FrameLayout {
-    ctor public BottomNavigationView(android.content.Context);
-    ctor public BottomNavigationView(android.content.Context, android.util.AttributeSet);
-    ctor public BottomNavigationView(android.content.Context, android.util.AttributeSet, int);
-    method public int getItemBackgroundResource();
-    method public android.content.res.ColorStateList getItemIconTintList();
-    method public android.content.res.ColorStateList getItemTextColor();
-    method public int getMaxItemCount();
-    method public android.view.Menu getMenu();
-    method public int getSelectedItemId();
-    method public void inflateMenu(int);
-    method public void setItemBackgroundResource(int);
-    method public void setItemIconTintList(android.content.res.ColorStateList);
-    method public void setItemTextColor(android.content.res.ColorStateList);
-    method public void setOnNavigationItemReselectedListener(android.support.design.widget.BottomNavigationView.OnNavigationItemReselectedListener);
-    method public void setOnNavigationItemSelectedListener(android.support.design.widget.BottomNavigationView.OnNavigationItemSelectedListener);
-    method public void setSelectedItemId(int);
-  }
-
-  public static abstract interface BottomNavigationView.OnNavigationItemReselectedListener {
-    method public abstract void onNavigationItemReselected(android.view.MenuItem);
-  }
-
-  public static abstract interface BottomNavigationView.OnNavigationItemSelectedListener {
-    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
-  }
-
-  public class BottomSheetBehavior<V extends android.view.View> extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public BottomSheetBehavior();
-    ctor public BottomSheetBehavior(android.content.Context, android.util.AttributeSet);
-    method public static <V extends android.view.View> android.support.design.widget.BottomSheetBehavior<V> from(V);
-    method public final int getPeekHeight();
-    method public boolean getSkipCollapsed();
-    method public final int getState();
-    method public boolean isHideable();
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void setBottomSheetCallback(android.support.design.widget.BottomSheetBehavior.BottomSheetCallback);
-    method public void setHideable(boolean);
-    method public final void setPeekHeight(int);
-    method public void setSkipCollapsed(boolean);
-    method public final void setState(int);
-    field public static final int PEEK_HEIGHT_AUTO = -1; // 0xffffffff
-    field public static final int STATE_COLLAPSED = 4; // 0x4
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_EXPANDED = 3; // 0x3
-    field public static final int STATE_HIDDEN = 5; // 0x5
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract class BottomSheetBehavior.BottomSheetCallback {
-    ctor public BottomSheetBehavior.BottomSheetCallback();
-    method public abstract void onSlide(android.view.View, float);
-    method public abstract void onStateChanged(android.view.View, int);
-  }
-
-  protected static class BottomSheetBehavior.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public BottomSheetBehavior.SavedState(android.os.Parcel);
-    ctor public BottomSheetBehavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public BottomSheetBehavior.SavedState(android.os.Parcelable, int);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.BottomSheetBehavior.SavedState> CREATOR;
-  }
-
-  public class BottomSheetDialog extends android.support.v7.app.AppCompatDialog {
-    ctor public BottomSheetDialog(android.content.Context);
-    ctor public BottomSheetDialog(android.content.Context, int);
-    ctor protected BottomSheetDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-  }
-
-  public class BottomSheetDialogFragment extends android.support.v7.app.AppCompatDialogFragment {
-    ctor public BottomSheetDialogFragment();
-  }
-
-  public class CollapsingToolbarLayout extends android.widget.FrameLayout {
-    ctor public CollapsingToolbarLayout(android.content.Context);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet, int);
-    method protected android.support.design.widget.CollapsingToolbarLayout.LayoutParams generateDefaultLayoutParams();
-    method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
-    method protected android.widget.FrameLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public int getCollapsedTitleGravity();
-    method public android.graphics.Typeface getCollapsedTitleTypeface();
-    method public android.graphics.drawable.Drawable getContentScrim();
-    method public int getExpandedTitleGravity();
-    method public int getExpandedTitleMarginBottom();
-    method public int getExpandedTitleMarginEnd();
-    method public int getExpandedTitleMarginStart();
-    method public int getExpandedTitleMarginTop();
-    method public android.graphics.Typeface getExpandedTitleTypeface();
-    method public long getScrimAnimationDuration();
-    method public int getScrimVisibleHeightTrigger();
-    method public android.graphics.drawable.Drawable getStatusBarScrim();
-    method public java.lang.CharSequence getTitle();
-    method public boolean isTitleEnabled();
-    method public void setCollapsedTitleGravity(int);
-    method public void setCollapsedTitleTextAppearance(int);
-    method public void setCollapsedTitleTextColor(int);
-    method public void setCollapsedTitleTextColor(android.content.res.ColorStateList);
-    method public void setCollapsedTitleTypeface(android.graphics.Typeface);
-    method public void setContentScrim(android.graphics.drawable.Drawable);
-    method public void setContentScrimColor(int);
-    method public void setContentScrimResource(int);
-    method public void setExpandedTitleColor(int);
-    method public void setExpandedTitleGravity(int);
-    method public void setExpandedTitleMargin(int, int, int, int);
-    method public void setExpandedTitleMarginBottom(int);
-    method public void setExpandedTitleMarginEnd(int);
-    method public void setExpandedTitleMarginStart(int);
-    method public void setExpandedTitleMarginTop(int);
-    method public void setExpandedTitleTextAppearance(int);
-    method public void setExpandedTitleTextColor(android.content.res.ColorStateList);
-    method public void setExpandedTitleTypeface(android.graphics.Typeface);
-    method public void setScrimAnimationDuration(long);
-    method public void setScrimVisibleHeightTrigger(int);
-    method public void setScrimsShown(boolean);
-    method public void setScrimsShown(boolean, boolean);
-    method public void setStatusBarScrim(android.graphics.drawable.Drawable);
-    method public void setStatusBarScrimColor(int);
-    method public void setStatusBarScrimResource(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleEnabled(boolean);
-  }
-
-  public static class CollapsingToolbarLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public CollapsingToolbarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    method public int getCollapseMode();
-    method public float getParallaxMultiplier();
-    method public void setCollapseMode(int);
-    method public void setParallaxMultiplier(float);
-    field public static final int COLLAPSE_MODE_OFF = 0; // 0x0
-    field public static final int COLLAPSE_MODE_PARALLAX = 2; // 0x2
-    field public static final int COLLAPSE_MODE_PIN = 1; // 0x1
-  }
-
-  public class CoordinatorLayout extends android.view.ViewGroup {
-    ctor public CoordinatorLayout(android.content.Context);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void dispatchDependentViewsChanged(android.view.View);
-    method public boolean doViewsOverlap(android.view.View, android.view.View);
-    method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateDefaultLayoutParams();
-    method public android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
-    method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public java.util.List<android.view.View> getDependencies(android.view.View);
-    method public java.util.List<android.view.View> getDependents(android.view.View);
-    method public android.graphics.drawable.Drawable getStatusBarBackground();
-    method public boolean isPointInChildBounds(android.view.View, int, int);
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onLayoutChild(android.view.View, int);
-    method public void onMeasureChild(android.view.View, int, int, int, int);
-    method public void onNestedPreScroll(android.view.View, 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 setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackgroundColor(int);
-    method public void setStatusBarBackgroundResource(int);
-  }
-
-  public static abstract class CoordinatorLayout.Behavior<V extends android.view.View> {
-    ctor public CoordinatorLayout.Behavior();
-    ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect);
-    method public int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
-    method public float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
-    method public static java.lang.Object getTag(android.view.View);
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
-    method public void onAttachedToLayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void onDetachedFromLayoutParams();
-    method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
-    method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
-    method public deprecated void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[], int);
-    method public deprecated void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int, int);
-    method public deprecated void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
-    method public boolean onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect, boolean);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
-    method public deprecated boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
-    method public deprecated void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int);
-    method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public static void setTag(android.view.View, java.lang.Object);
-  }
-
-  public static abstract class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
-  }
-
-  public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public CoordinatorLayout.LayoutParams(int, int);
-    ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    method public int getAnchorId();
-    method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
-    method public void setAnchorId(int);
-    method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
-    field public int anchorGravity;
-    field public int dodgeInsetEdges;
-    field public int gravity;
-    field public int insetEdge;
-    field public int keyline;
-  }
-
-  protected static class CoordinatorLayout.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public CoordinatorLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
-  }
-
-  public class FloatingActionButton extends android.support.design.widget.VisibilityAwareImageButton {
-    ctor public FloatingActionButton(android.content.Context);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet, int);
-    method public float getCompatElevation();
-    method public android.graphics.drawable.Drawable getContentBackground();
-    method public boolean getContentRect(android.graphics.Rect);
-    method public int getRippleColor();
-    method public int getSize();
-    method public boolean getUseCompatPadding();
-    method public void hide();
-    method public void hide(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setCompatElevation(float);
-    method public void setRippleColor(int);
-    method public void setSize(int);
-    method public void setUseCompatPadding(boolean);
-    method public void show();
-    method public void show(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
-    field public static final int SIZE_AUTO = -1; // 0xffffffff
-    field public static final int SIZE_MINI = 1; // 0x1
-    field public static final int SIZE_NORMAL = 0; // 0x0
-  }
-
-  public static class FloatingActionButton.Behavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public FloatingActionButton.Behavior();
-    ctor public FloatingActionButton.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.graphics.Rect);
-    method public boolean isAutoHideEnabled();
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, int);
-    method public void setAutoHideEnabled(boolean);
-  }
-
-  public static abstract class FloatingActionButton.OnVisibilityChangedListener {
-    ctor public FloatingActionButton.OnVisibilityChangedListener();
-    method public void onHidden(android.support.design.widget.FloatingActionButton);
-    method public void onShown(android.support.design.widget.FloatingActionButton);
-  }
-
-   abstract class HeaderBehavior<V extends android.view.View> extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public HeaderBehavior();
-    ctor public HeaderBehavior(android.content.Context, android.util.AttributeSet);
-  }
-
-   abstract class HeaderScrollingViewBehavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public HeaderScrollingViewBehavior();
-    ctor public HeaderScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public final int getOverlayTop();
-    method protected void layoutChild(android.support.design.widget.CoordinatorLayout, android.view.View, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.view.View, int, int, int, int);
-    method public final void setOverlayTop(int);
-  }
-
-  public class NavigationView extends android.widget.FrameLayout {
-    ctor public NavigationView(android.content.Context);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet, int);
-    method public void addHeaderView(android.view.View);
-    method public int getHeaderCount();
-    method public android.view.View getHeaderView(int);
-    method public android.graphics.drawable.Drawable getItemBackground();
-    method public android.content.res.ColorStateList getItemIconTintList();
-    method public android.content.res.ColorStateList getItemTextColor();
-    method public android.view.Menu getMenu();
-    method public android.view.View inflateHeaderView(int);
-    method public void inflateMenu(int);
-    method public void removeHeaderView(android.view.View);
-    method public void setCheckedItem(int);
-    method public void setItemBackground(android.graphics.drawable.Drawable);
-    method public void setItemBackgroundResource(int);
-    method public void setItemIconTintList(android.content.res.ColorStateList);
-    method public void setItemTextAppearance(int);
-    method public void setItemTextColor(android.content.res.ColorStateList);
-    method public void setNavigationItemSelectedListener(android.support.design.widget.NavigationView.OnNavigationItemSelectedListener);
-  }
-
-  public static abstract interface NavigationView.OnNavigationItemSelectedListener {
-    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
-  }
-
-  public static class NavigationView.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public NavigationView.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public NavigationView.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.NavigationView.SavedState> CREATOR;
-    field public android.os.Bundle menuState;
-  }
-
-  public final class Snackbar extends android.support.design.widget.BaseTransientBottomBar {
-    method public static android.support.design.widget.Snackbar make(android.view.View, java.lang.CharSequence, int);
-    method public static android.support.design.widget.Snackbar make(android.view.View, int, int);
-    method public android.support.design.widget.Snackbar setAction(int, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setAction(java.lang.CharSequence, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setActionTextColor(android.content.res.ColorStateList);
-    method public android.support.design.widget.Snackbar setActionTextColor(int);
-    method public deprecated android.support.design.widget.Snackbar setCallback(android.support.design.widget.Snackbar.Callback);
-    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
-    method public android.support.design.widget.Snackbar setText(int);
-    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
-    field public static final int LENGTH_LONG = 0; // 0x0
-    field public static final int LENGTH_SHORT = -1; // 0xffffffff
-  }
-
-  public static class Snackbar.Callback extends android.support.design.widget.BaseTransientBottomBar.BaseCallback {
-    ctor public Snackbar.Callback();
-    method public void onDismissed(android.support.design.widget.Snackbar, int);
-    method public void onShown(android.support.design.widget.Snackbar);
-    field public static final int DISMISS_EVENT_ACTION = 1; // 0x1
-    field public static final int DISMISS_EVENT_CONSECUTIVE = 4; // 0x4
-    field public static final int DISMISS_EVENT_MANUAL = 3; // 0x3
-    field public static final int DISMISS_EVENT_SWIPE = 0; // 0x0
-    field public static final int DISMISS_EVENT_TIMEOUT = 2; // 0x2
-  }
-
-  public class SwipeDismissBehavior<V extends android.view.View> extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public SwipeDismissBehavior();
-    method public boolean canSwipeDismissView(android.view.View);
-    method public int getDragState();
-    method public void setDragDismissDistance(float);
-    method public void setEndAlphaSwipeDistance(float);
-    method public void setListener(android.support.design.widget.SwipeDismissBehavior.OnDismissListener);
-    method public void setSensitivity(float);
-    method public void setStartAlphaSwipeDistance(float);
-    method public void setSwipeDirection(int);
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_ANY = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_END_TO_START = 1; // 0x1
-    field public static final int SWIPE_DIRECTION_START_TO_END = 0; // 0x0
-  }
-
-  public static abstract interface SwipeDismissBehavior.OnDismissListener {
-    method public abstract void onDismiss(android.view.View);
-    method public abstract void onDragStateChanged(int);
-  }
-
-  public final class TabItem extends android.view.View {
-    ctor public TabItem(android.content.Context);
-    ctor public TabItem(android.content.Context, android.util.AttributeSet);
-  }
-
-  public class TabLayout extends android.widget.HorizontalScrollView {
-    ctor public TabLayout(android.content.Context);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void addOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void addTab(android.support.design.widget.TabLayout.Tab);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, boolean);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int, boolean);
-    method public void clearOnTabSelectedListeners();
-    method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
-    method public int getSelectedTabPosition();
-    method public android.support.design.widget.TabLayout.Tab getTabAt(int);
-    method public int getTabCount();
-    method public int getTabGravity();
-    method public int getTabMode();
-    method public android.content.res.ColorStateList getTabTextColors();
-    method public android.support.design.widget.TabLayout.Tab newTab();
-    method public void removeAllTabs();
-    method public void removeOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void removeTab(android.support.design.widget.TabLayout.Tab);
-    method public void removeTabAt(int);
-    method public deprecated void setOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void setScrollPosition(int, float, boolean);
-    method public void setSelectedTabIndicatorColor(int);
-    method public void setSelectedTabIndicatorHeight(int);
-    method public void setTabGravity(int);
-    method public void setTabMode(int);
-    method public void setTabTextColors(android.content.res.ColorStateList);
-    method public void setTabTextColors(int, int);
-    method public deprecated void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
-    method public void setupWithViewPager(android.support.v4.view.ViewPager);
-    method public void setupWithViewPager(android.support.v4.view.ViewPager, boolean);
-    field public static final int GRAVITY_CENTER = 1; // 0x1
-    field public static final int GRAVITY_FILL = 0; // 0x0
-    field public static final int MODE_FIXED = 1; // 0x1
-    field public static final int MODE_SCROLLABLE = 0; // 0x0
-  }
-
-  public static abstract interface TabLayout.OnTabSelectedListener {
-    method public abstract void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public static final class TabLayout.Tab {
-    method public java.lang.CharSequence getContentDescription();
-    method public android.view.View getCustomView();
-    method public android.graphics.drawable.Drawable getIcon();
-    method public int getPosition();
-    method public java.lang.Object getTag();
-    method public java.lang.CharSequence getText();
-    method public boolean isSelected();
-    method public void select();
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(int);
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(android.view.View);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(int);
-    method public android.support.design.widget.TabLayout.Tab setIcon(android.graphics.drawable.Drawable);
-    method public android.support.design.widget.TabLayout.Tab setIcon(int);
-    method public android.support.design.widget.TabLayout.Tab setTag(java.lang.Object);
-    method public android.support.design.widget.TabLayout.Tab setText(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class TabLayout.TabLayoutOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public TabLayout.TabLayoutOnPageChangeListener(android.support.design.widget.TabLayout);
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public static class TabLayout.ViewPagerOnTabSelectedListener implements android.support.design.widget.TabLayout.OnTabSelectedListener {
-    ctor public TabLayout.ViewPagerOnTabSelectedListener(android.support.v4.view.ViewPager);
-    method public void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public class TextInputEditText extends android.support.v7.widget.AppCompatEditText {
-    ctor public TextInputEditText(android.content.Context);
-    ctor public TextInputEditText(android.content.Context, android.util.AttributeSet);
-    ctor public TextInputEditText(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class TextInputLayout extends android.widget.LinearLayout {
-    ctor public TextInputLayout(android.content.Context);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet, int);
-    method public int getCounterMaxLength();
-    method public android.widget.EditText getEditText();
-    method public java.lang.CharSequence getError();
-    method public java.lang.CharSequence getHint();
-    method public java.lang.CharSequence getPasswordVisibilityToggleContentDescription();
-    method public android.graphics.drawable.Drawable getPasswordVisibilityToggleDrawable();
-    method public android.graphics.Typeface getTypeface();
-    method public boolean isCounterEnabled();
-    method public boolean isErrorEnabled();
-    method public boolean isHintAnimationEnabled();
-    method public boolean isHintEnabled();
-    method public boolean isPasswordVisibilityToggleEnabled();
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void setCounterEnabled(boolean);
-    method public void setCounterMaxLength(int);
-    method public void setError(java.lang.CharSequence);
-    method public void setErrorEnabled(boolean);
-    method public void setErrorTextAppearance(int);
-    method public void setHint(java.lang.CharSequence);
-    method public void setHintAnimationEnabled(boolean);
-    method public void setHintEnabled(boolean);
-    method public void setHintTextAppearance(int);
-    method public void setPasswordVisibilityToggleContentDescription(int);
-    method public void setPasswordVisibilityToggleContentDescription(java.lang.CharSequence);
-    method public void setPasswordVisibilityToggleDrawable(int);
-    method public void setPasswordVisibilityToggleDrawable(android.graphics.drawable.Drawable);
-    method public void setPasswordVisibilityToggleEnabled(boolean);
-    method public void setPasswordVisibilityToggleTintList(android.content.res.ColorStateList);
-    method public void setPasswordVisibilityToggleTintMode(android.graphics.PorterDuff.Mode);
-    method public void setTypeface(android.graphics.Typeface);
-  }
-
-   class ViewOffsetBehavior<V extends android.view.View> extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public ViewOffsetBehavior();
-    ctor public ViewOffsetBehavior(android.content.Context, android.util.AttributeSet);
-    method public int getLeftAndRightOffset();
-    method public int getTopAndBottomOffset();
-    method protected void layoutChild(android.support.design.widget.CoordinatorLayout, V, int);
-    method public boolean setLeftAndRightOffset(int);
-    method public boolean setTopAndBottomOffset(int);
-  }
-
-   class VisibilityAwareImageButton extends android.widget.ImageButton {
-    ctor public VisibilityAwareImageButton(android.content.Context);
-    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet);
-    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-}
-
diff --git a/design/api/current.txt b/design/api/27.1.0.txt
similarity index 100%
rename from design/api/current.txt
rename to design/api/27.1.0.txt
diff --git a/design/base/android/support/design/widget/AnimationUtils.java b/design/base/android/support/design/widget/AnimationUtils.java
deleted file mode 100644
index 3613afd..0000000
--- a/design/base/android/support/design/widget/AnimationUtils.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.support.v4.view.animation.FastOutLinearInInterpolator;
-import android.support.v4.view.animation.FastOutSlowInInterpolator;
-import android.support.v4.view.animation.LinearOutSlowInInterpolator;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Interpolator;
-import android.view.animation.LinearInterpolator;
-
-class AnimationUtils {
-
-    static final Interpolator LINEAR_INTERPOLATOR = new LinearInterpolator();
-    static final Interpolator FAST_OUT_SLOW_IN_INTERPOLATOR = new FastOutSlowInInterpolator();
-    static final Interpolator FAST_OUT_LINEAR_IN_INTERPOLATOR = new FastOutLinearInInterpolator();
-    static final Interpolator LINEAR_OUT_SLOW_IN_INTERPOLATOR = new LinearOutSlowInInterpolator();
-    static final Interpolator DECELERATE_INTERPOLATOR = new DecelerateInterpolator();
-
-    /**
-     * Linear interpolation between {@code startValue} and {@code endValue} by {@code fraction}.
-     */
-    static float lerp(float startValue, float endValue, float fraction) {
-        return startValue + (fraction * (endValue - startValue));
-    }
-
-    static int lerp(int startValue, int endValue, float fraction) {
-        return startValue + Math.round(fraction * (endValue - startValue));
-    }
-
-}
diff --git a/design/base/android/support/design/widget/CircularBorderDrawable.java b/design/base/android/support/design/widget/CircularBorderDrawable.java
deleted file mode 100644
index 617a501..0000000
--- a/design/base/android/support/design/widget/CircularBorderDrawable.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.content.res.ColorStateList;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.LinearGradient;
-import android.graphics.Paint;
-import android.graphics.PixelFormat;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.Shader;
-import android.graphics.drawable.Drawable;
-import android.support.v4.graphics.ColorUtils;
-
-/**
- * A drawable which draws an oval 'border'.
- */
-class CircularBorderDrawable extends Drawable {
-
-    /**
-     * We actually draw the stroke wider than the border size given. This is to reduce any
-     * potential transparent space caused by anti-aliasing and padding rounding.
-     * This value defines the multiplier used to determine to draw stroke width.
-     */
-    private static final float DRAW_STROKE_WIDTH_MULTIPLE = 1.3333f;
-
-    final Paint mPaint;
-    final Rect mRect = new Rect();
-    final RectF mRectF = new RectF();
-
-    float mBorderWidth;
-
-    private int mTopOuterStrokeColor;
-    private int mTopInnerStrokeColor;
-    private int mBottomOuterStrokeColor;
-    private int mBottomInnerStrokeColor;
-
-    private ColorStateList mBorderTint;
-    private int mCurrentBorderTintColor;
-
-    private boolean mInvalidateShader = true;
-
-    private float mRotation;
-
-    public CircularBorderDrawable() {
-        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-        mPaint.setStyle(Paint.Style.STROKE);
-    }
-
-    void setGradientColors(int topOuterStrokeColor, int topInnerStrokeColor,
-            int bottomOuterStrokeColor, int bottomInnerStrokeColor) {
-        mTopOuterStrokeColor = topOuterStrokeColor;
-        mTopInnerStrokeColor = topInnerStrokeColor;
-        mBottomOuterStrokeColor = bottomOuterStrokeColor;
-        mBottomInnerStrokeColor = bottomInnerStrokeColor;
-    }
-
-    /**
-     * Set the border width
-     */
-    void setBorderWidth(float width) {
-        if (mBorderWidth != width) {
-            mBorderWidth = width;
-            mPaint.setStrokeWidth(width * DRAW_STROKE_WIDTH_MULTIPLE);
-            mInvalidateShader = true;
-            invalidateSelf();
-        }
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        if (mInvalidateShader) {
-            mPaint.setShader(createGradientShader());
-            mInvalidateShader = false;
-        }
-
-        final float halfBorderWidth = mPaint.getStrokeWidth() / 2f;
-        final RectF rectF = mRectF;
-
-        // We need to inset the oval bounds by half the border width. This is because stroke draws
-        // the center of the border on the dimension. Whereas we want the stroke on the inside.
-        copyBounds(mRect);
-        rectF.set(mRect);
-        rectF.left += halfBorderWidth;
-        rectF.top += halfBorderWidth;
-        rectF.right -= halfBorderWidth;
-        rectF.bottom -= halfBorderWidth;
-
-        canvas.save();
-        canvas.rotate(mRotation, rectF.centerX(), rectF.centerY());
-        // Draw the oval
-        canvas.drawOval(rectF, mPaint);
-        canvas.restore();
-    }
-
-    @Override
-    public boolean getPadding(Rect padding) {
-        final int borderWidth = Math.round(mBorderWidth);
-        padding.set(borderWidth, borderWidth, borderWidth, borderWidth);
-        return true;
-    }
-
-    @Override
-    public void setAlpha(int alpha) {
-        mPaint.setAlpha(alpha);
-        invalidateSelf();
-    }
-
-    void setBorderTint(ColorStateList tint) {
-        if (tint != null) {
-            mCurrentBorderTintColor = tint.getColorForState(getState(), mCurrentBorderTintColor);
-        }
-        mBorderTint = tint;
-        mInvalidateShader = true;
-        invalidateSelf();
-    }
-
-    @Override
-    public void setColorFilter(ColorFilter colorFilter) {
-        mPaint.setColorFilter(colorFilter);
-        invalidateSelf();
-    }
-
-    @Override
-    public int getOpacity() {
-        return mBorderWidth > 0 ? PixelFormat.TRANSLUCENT : PixelFormat.TRANSPARENT;
-    }
-
-    final void setRotation(float rotation) {
-        if (rotation != mRotation) {
-            mRotation = rotation;
-            invalidateSelf();
-        }
-    }
-
-    @Override
-    protected void onBoundsChange(Rect bounds) {
-        mInvalidateShader = true;
-    }
-
-    @Override
-    public boolean isStateful() {
-        return (mBorderTint != null && mBorderTint.isStateful()) || super.isStateful();
-    }
-
-    @Override
-    protected boolean onStateChange(int[] state) {
-        if (mBorderTint != null) {
-            final int newColor = mBorderTint.getColorForState(state, mCurrentBorderTintColor);
-            if (newColor != mCurrentBorderTintColor) {
-                mInvalidateShader = true;
-                mCurrentBorderTintColor = newColor;
-            }
-        }
-        if (mInvalidateShader) {
-            invalidateSelf();
-        }
-        return mInvalidateShader;
-    }
-
-    /**
-     * Creates a vertical {@link LinearGradient}
-     * @return
-     */
-    private Shader createGradientShader() {
-        final Rect rect = mRect;
-        copyBounds(rect);
-
-        final float borderRatio = mBorderWidth / rect.height();
-
-        final int[] colors = new int[6];
-        colors[0] = ColorUtils.compositeColors(mTopOuterStrokeColor, mCurrentBorderTintColor);
-        colors[1] = ColorUtils.compositeColors(mTopInnerStrokeColor, mCurrentBorderTintColor);
-        colors[2] = ColorUtils.compositeColors(
-                ColorUtils.setAlphaComponent(mTopInnerStrokeColor, 0), mCurrentBorderTintColor);
-        colors[3] = ColorUtils.compositeColors(
-                ColorUtils.setAlphaComponent(mBottomInnerStrokeColor, 0), mCurrentBorderTintColor);
-        colors[4] = ColorUtils.compositeColors(mBottomInnerStrokeColor, mCurrentBorderTintColor);
-        colors[5] = ColorUtils.compositeColors(mBottomOuterStrokeColor, mCurrentBorderTintColor);
-
-        final float[] positions = new float[6];
-        positions[0] = 0f;
-        positions[1] = borderRatio;
-        positions[2] = 0.5f;
-        positions[3] = 0.5f;
-        positions[4] = 1f - borderRatio;
-        positions[5] = 1f;
-
-        return new LinearGradient(
-                0, rect.top,
-                0, rect.bottom,
-                colors, positions,
-                Shader.TileMode.CLAMP);
-    }
-}
diff --git a/design/base/android/support/design/widget/FloatingActionButtonImpl.java b/design/base/android/support/design/widget/FloatingActionButtonImpl.java
deleted file mode 100644
index 132cd81..0000000
--- a/design/base/android/support/design/widget/FloatingActionButtonImpl.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.Color;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.GradientDrawable;
-import android.graphics.drawable.LayerDrawable;
-import android.os.Build;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
-import android.support.design.R;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.graphics.drawable.DrawableCompat;
-import android.support.v4.view.ViewCompat;
-import android.view.View;
-import android.view.ViewTreeObserver;
-import android.view.animation.Interpolator;
-
-@RequiresApi(14)
-class FloatingActionButtonImpl {
-    static final Interpolator ANIM_INTERPOLATOR = AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR;
-    static final long PRESSED_ANIM_DURATION = 100;
-    static final long PRESSED_ANIM_DELAY = 100;
-
-    static final int ANIM_STATE_NONE = 0;
-    static final int ANIM_STATE_HIDING = 1;
-    static final int ANIM_STATE_SHOWING = 2;
-
-    int mAnimState = ANIM_STATE_NONE;
-
-    private final StateListAnimator mStateListAnimator;
-
-    ShadowDrawableWrapper mShadowDrawable;
-
-    private float mRotation;
-
-    Drawable mShapeDrawable;
-    Drawable mRippleDrawable;
-    CircularBorderDrawable mBorderDrawable;
-    Drawable mContentBackground;
-
-    float mElevation;
-    float mPressedTranslationZ;
-
-    interface InternalVisibilityChangedListener {
-        void onShown();
-        void onHidden();
-    }
-
-    static final int SHOW_HIDE_ANIM_DURATION = 200;
-
-    static final int[] PRESSED_ENABLED_STATE_SET = {android.R.attr.state_pressed,
-            android.R.attr.state_enabled};
-    static final int[] FOCUSED_ENABLED_STATE_SET = {android.R.attr.state_focused,
-            android.R.attr.state_enabled};
-    static final int[] ENABLED_STATE_SET = {android.R.attr.state_enabled};
-    static final int[] EMPTY_STATE_SET = new int[0];
-
-    final VisibilityAwareImageButton mView;
-    final ShadowViewDelegate mShadowViewDelegate;
-
-    private final Rect mTmpRect = new Rect();
-    private ViewTreeObserver.OnPreDrawListener mPreDrawListener;
-
-    FloatingActionButtonImpl(VisibilityAwareImageButton view,
-            ShadowViewDelegate shadowViewDelegate) {
-        mView = view;
-        mShadowViewDelegate = shadowViewDelegate;
-
-        mStateListAnimator = new StateListAnimator();
-
-        // Elevate with translationZ when pressed or focused
-        mStateListAnimator.addState(PRESSED_ENABLED_STATE_SET,
-                createAnimator(new ElevateToTranslationZAnimation()));
-        mStateListAnimator.addState(FOCUSED_ENABLED_STATE_SET,
-                createAnimator(new ElevateToTranslationZAnimation()));
-        // Reset back to elevation by default
-        mStateListAnimator.addState(ENABLED_STATE_SET,
-                createAnimator(new ResetElevationAnimation()));
-        // Set to 0 when disabled
-        mStateListAnimator.addState(EMPTY_STATE_SET,
-                createAnimator(new DisabledElevationAnimation()));
-
-        mRotation = mView.getRotation();
-    }
-
-    void setBackgroundDrawable(ColorStateList backgroundTint,
-            PorterDuff.Mode backgroundTintMode, int rippleColor, int borderWidth) {
-        // Now we need to tint the original background with the tint, using
-        // an InsetDrawable if we have a border width
-        mShapeDrawable = DrawableCompat.wrap(createShapeDrawable());
-        DrawableCompat.setTintList(mShapeDrawable, backgroundTint);
-        if (backgroundTintMode != null) {
-            DrawableCompat.setTintMode(mShapeDrawable, backgroundTintMode);
-        }
-
-        // Now we created a mask Drawable which will be used for touch feedback.
-        GradientDrawable touchFeedbackShape = createShapeDrawable();
-
-        // We'll now wrap that touch feedback mask drawable with a ColorStateList. We do not need
-        // to inset for any border here as LayerDrawable will nest the padding for us
-        mRippleDrawable = DrawableCompat.wrap(touchFeedbackShape);
-        DrawableCompat.setTintList(mRippleDrawable, createColorStateList(rippleColor));
-
-        final Drawable[] layers;
-        if (borderWidth > 0) {
-            mBorderDrawable = createBorderDrawable(borderWidth, backgroundTint);
-            layers = new Drawable[] {mBorderDrawable, mShapeDrawable, mRippleDrawable};
-        } else {
-            mBorderDrawable = null;
-            layers = new Drawable[] {mShapeDrawable, mRippleDrawable};
-        }
-
-        mContentBackground = new LayerDrawable(layers);
-
-        mShadowDrawable = new ShadowDrawableWrapper(
-                mView.getContext(),
-                mContentBackground,
-                mShadowViewDelegate.getRadius(),
-                mElevation,
-                mElevation + mPressedTranslationZ);
-        mShadowDrawable.setAddPaddingForCorners(false);
-        mShadowViewDelegate.setBackgroundDrawable(mShadowDrawable);
-    }
-
-    void setBackgroundTintList(ColorStateList tint) {
-        if (mShapeDrawable != null) {
-            DrawableCompat.setTintList(mShapeDrawable, tint);
-        }
-        if (mBorderDrawable != null) {
-            mBorderDrawable.setBorderTint(tint);
-        }
-    }
-
-    void setBackgroundTintMode(PorterDuff.Mode tintMode) {
-        if (mShapeDrawable != null) {
-            DrawableCompat.setTintMode(mShapeDrawable, tintMode);
-        }
-    }
-
-
-    void setRippleColor(int rippleColor) {
-        if (mRippleDrawable != null) {
-            DrawableCompat.setTintList(mRippleDrawable, createColorStateList(rippleColor));
-        }
-    }
-
-    final void setElevation(float elevation) {
-        if (mElevation != elevation) {
-            mElevation = elevation;
-            onElevationsChanged(elevation, mPressedTranslationZ);
-        }
-    }
-
-    float getElevation() {
-        return mElevation;
-    }
-
-    final void setPressedTranslationZ(float translationZ) {
-        if (mPressedTranslationZ != translationZ) {
-            mPressedTranslationZ = translationZ;
-            onElevationsChanged(mElevation, translationZ);
-        }
-    }
-
-    void onElevationsChanged(float elevation, float pressedTranslationZ) {
-        if (mShadowDrawable != null) {
-            mShadowDrawable.setShadowSize(elevation, elevation + mPressedTranslationZ);
-            updatePadding();
-        }
-    }
-
-    void onDrawableStateChanged(int[] state) {
-        mStateListAnimator.setState(state);
-    }
-
-    void jumpDrawableToCurrentState() {
-        mStateListAnimator.jumpToCurrentState();
-    }
-
-    void hide(@Nullable final InternalVisibilityChangedListener listener, final boolean fromUser) {
-        if (isOrWillBeHidden()) {
-            // We either are or will soon be hidden, skip the call
-            return;
-        }
-
-        mView.animate().cancel();
-
-        if (shouldAnimateVisibilityChange()) {
-            mAnimState = ANIM_STATE_HIDING;
-
-            mView.animate()
-                    .scaleX(0f)
-                    .scaleY(0f)
-                    .alpha(0f)
-                    .setDuration(SHOW_HIDE_ANIM_DURATION)
-                    .setInterpolator(AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR)
-                    .setListener(new AnimatorListenerAdapter() {
-                        private boolean mCancelled;
-
-                        @Override
-                        public void onAnimationStart(Animator animation) {
-                            mView.internalSetVisibility(View.VISIBLE, fromUser);
-                            mCancelled = false;
-                        }
-
-                        @Override
-                        public void onAnimationCancel(Animator animation) {
-                            mCancelled = true;
-                        }
-
-                        @Override
-                        public void onAnimationEnd(Animator animation) {
-                            mAnimState = ANIM_STATE_NONE;
-
-                            if (!mCancelled) {
-                                mView.internalSetVisibility(fromUser ? View.GONE : View.INVISIBLE,
-                                        fromUser);
-                                if (listener != null) {
-                                    listener.onHidden();
-                                }
-                            }
-                        }
-                    });
-        } else {
-            // If the view isn't laid out, or we're in the editor, don't run the animation
-            mView.internalSetVisibility(fromUser ? View.GONE : View.INVISIBLE, fromUser);
-            if (listener != null) {
-                listener.onHidden();
-            }
-        }
-    }
-
-    void show(@Nullable final InternalVisibilityChangedListener listener, final boolean fromUser) {
-        if (isOrWillBeShown()) {
-            // We either are or will soon be visible, skip the call
-            return;
-        }
-
-        mView.animate().cancel();
-
-        if (shouldAnimateVisibilityChange()) {
-            mAnimState = ANIM_STATE_SHOWING;
-
-            if (mView.getVisibility() != View.VISIBLE) {
-                // If the view isn't visible currently, we'll animate it from a single pixel
-                mView.setAlpha(0f);
-                mView.setScaleY(0f);
-                mView.setScaleX(0f);
-            }
-
-            mView.animate()
-                    .scaleX(1f)
-                    .scaleY(1f)
-                    .alpha(1f)
-                    .setDuration(SHOW_HIDE_ANIM_DURATION)
-                    .setInterpolator(AnimationUtils.LINEAR_OUT_SLOW_IN_INTERPOLATOR)
-                    .setListener(new AnimatorListenerAdapter() {
-                        @Override
-                        public void onAnimationStart(Animator animation) {
-                            mView.internalSetVisibility(View.VISIBLE, fromUser);
-                        }
-
-                        @Override
-                        public void onAnimationEnd(Animator animation) {
-                            mAnimState = ANIM_STATE_NONE;
-                            if (listener != null) {
-                                listener.onShown();
-                            }
-                        }
-                    });
-        } else {
-            mView.internalSetVisibility(View.VISIBLE, fromUser);
-            mView.setAlpha(1f);
-            mView.setScaleY(1f);
-            mView.setScaleX(1f);
-            if (listener != null) {
-                listener.onShown();
-            }
-        }
-    }
-
-    final Drawable getContentBackground() {
-        return mContentBackground;
-    }
-
-    void onCompatShadowChanged() {
-        // Ignore pre-v21
-    }
-
-    final void updatePadding() {
-        Rect rect = mTmpRect;
-        getPadding(rect);
-        onPaddingUpdated(rect);
-        mShadowViewDelegate.setShadowPadding(rect.left, rect.top, rect.right, rect.bottom);
-    }
-
-    void getPadding(Rect rect) {
-        mShadowDrawable.getPadding(rect);
-    }
-
-    void onPaddingUpdated(Rect padding) {}
-
-    void onAttachedToWindow() {
-        if (requirePreDrawListener()) {
-            ensurePreDrawListener();
-            mView.getViewTreeObserver().addOnPreDrawListener(mPreDrawListener);
-        }
-    }
-
-    void onDetachedFromWindow() {
-        if (mPreDrawListener != null) {
-            mView.getViewTreeObserver().removeOnPreDrawListener(mPreDrawListener);
-            mPreDrawListener = null;
-        }
-    }
-
-    boolean requirePreDrawListener() {
-        return true;
-    }
-
-    CircularBorderDrawable createBorderDrawable(int borderWidth, ColorStateList backgroundTint) {
-        final Context context = mView.getContext();
-        CircularBorderDrawable borderDrawable = newCircularDrawable();
-        borderDrawable.setGradientColors(
-                ContextCompat.getColor(context, R.color.design_fab_stroke_top_outer_color),
-                ContextCompat.getColor(context, R.color.design_fab_stroke_top_inner_color),
-                ContextCompat.getColor(context, R.color.design_fab_stroke_end_inner_color),
-                ContextCompat.getColor(context, R.color.design_fab_stroke_end_outer_color));
-        borderDrawable.setBorderWidth(borderWidth);
-        borderDrawable.setBorderTint(backgroundTint);
-        return borderDrawable;
-    }
-
-    CircularBorderDrawable newCircularDrawable() {
-        return new CircularBorderDrawable();
-    }
-
-    void onPreDraw() {
-        final float rotation = mView.getRotation();
-        if (mRotation != rotation) {
-            mRotation = rotation;
-            updateFromViewRotation();
-        }
-    }
-
-    private void ensurePreDrawListener() {
-        if (mPreDrawListener == null) {
-            mPreDrawListener = new ViewTreeObserver.OnPreDrawListener() {
-                @Override
-                public boolean onPreDraw() {
-                    FloatingActionButtonImpl.this.onPreDraw();
-                    return true;
-                }
-            };
-        }
-    }
-
-    GradientDrawable createShapeDrawable() {
-        GradientDrawable d = newGradientDrawableForShape();
-        d.setShape(GradientDrawable.OVAL);
-        d.setColor(Color.WHITE);
-        return d;
-    }
-
-    GradientDrawable newGradientDrawableForShape() {
-        return new GradientDrawable();
-    }
-
-    boolean isOrWillBeShown() {
-        if (mView.getVisibility() != View.VISIBLE) {
-            // If we not currently visible, return true if we're animating to be shown
-            return mAnimState == ANIM_STATE_SHOWING;
-        } else {
-            // Otherwise if we're visible, return true if we're not animating to be hidden
-            return mAnimState != ANIM_STATE_HIDING;
-        }
-    }
-
-    boolean isOrWillBeHidden() {
-        if (mView.getVisibility() == View.VISIBLE) {
-            // If we currently visible, return true if we're animating to be hidden
-            return mAnimState == ANIM_STATE_HIDING;
-        } else {
-            // Otherwise if we're not visible, return true if we're not animating to be shown
-            return mAnimState != ANIM_STATE_SHOWING;
-        }
-    }
-
-    private ValueAnimator createAnimator(@NonNull ShadowAnimatorImpl impl) {
-        final ValueAnimator animator = new ValueAnimator();
-        animator.setInterpolator(ANIM_INTERPOLATOR);
-        animator.setDuration(PRESSED_ANIM_DURATION);
-        animator.addListener(impl);
-        animator.addUpdateListener(impl);
-        animator.setFloatValues(0, 1);
-        return animator;
-    }
-
-    private abstract class ShadowAnimatorImpl extends AnimatorListenerAdapter
-            implements ValueAnimator.AnimatorUpdateListener {
-        private boolean mValidValues;
-        private float mShadowSizeStart;
-        private float mShadowSizeEnd;
-
-        @Override
-        public void onAnimationUpdate(ValueAnimator animator) {
-            if (!mValidValues) {
-                mShadowSizeStart = mShadowDrawable.getShadowSize();
-                mShadowSizeEnd = getTargetShadowSize();
-                mValidValues = true;
-            }
-
-            mShadowDrawable.setShadowSize(mShadowSizeStart
-                    + ((mShadowSizeEnd - mShadowSizeStart) * animator.getAnimatedFraction()));
-        }
-
-        @Override
-        public void onAnimationEnd(Animator animator) {
-            mShadowDrawable.setShadowSize(mShadowSizeEnd);
-            mValidValues = false;
-        }
-
-        /**
-         * @return the shadow size we want to animate to.
-         */
-        protected abstract float getTargetShadowSize();
-    }
-
-    private class ResetElevationAnimation extends ShadowAnimatorImpl {
-        ResetElevationAnimation() {
-        }
-
-        @Override
-        protected float getTargetShadowSize() {
-            return mElevation;
-        }
-    }
-
-    private class ElevateToTranslationZAnimation extends ShadowAnimatorImpl {
-        ElevateToTranslationZAnimation() {
-        }
-
-        @Override
-        protected float getTargetShadowSize() {
-            return mElevation + mPressedTranslationZ;
-        }
-    }
-
-    private class DisabledElevationAnimation extends ShadowAnimatorImpl {
-        DisabledElevationAnimation() {
-        }
-
-        @Override
-        protected float getTargetShadowSize() {
-            return 0f;
-        }
-    }
-
-    private static ColorStateList createColorStateList(int selectedColor) {
-        final int[][] states = new int[3][];
-        final int[] colors = new int[3];
-        int i = 0;
-
-        states[i] = FOCUSED_ENABLED_STATE_SET;
-        colors[i] = selectedColor;
-        i++;
-
-        states[i] = PRESSED_ENABLED_STATE_SET;
-        colors[i] = selectedColor;
-        i++;
-
-        // Default enabled state
-        states[i] = new int[0];
-        colors[i] = Color.TRANSPARENT;
-        i++;
-
-        return new ColorStateList(states, colors);
-    }
-
-    private boolean shouldAnimateVisibilityChange() {
-        return ViewCompat.isLaidOut(mView) && !mView.isInEditMode();
-    }
-
-    private void updateFromViewRotation() {
-        if (Build.VERSION.SDK_INT == 19) {
-            // KitKat seems to have an issue with views which are rotated with angles which are
-            // not divisible by 90. Worked around by moving to software rendering in these cases.
-            if ((mRotation % 90) != 0) {
-                if (mView.getLayerType() != View.LAYER_TYPE_SOFTWARE) {
-                    mView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
-                }
-            } else {
-                if (mView.getLayerType() != View.LAYER_TYPE_NONE) {
-                    mView.setLayerType(View.LAYER_TYPE_NONE, null);
-                }
-            }
-        }
-
-        // Offset any View rotation
-        if (mShadowDrawable != null) {
-            mShadowDrawable.setRotation(-mRotation);
-        }
-        if (mBorderDrawable != null) {
-            mBorderDrawable.setRotation(-mRotation);
-        }
-    }
-}
diff --git a/design/base/android/support/design/widget/ShadowDrawableWrapper.java b/design/base/android/support/design/widget/ShadowDrawableWrapper.java
deleted file mode 100644
index dfb8e1d..0000000
--- a/design/base/android/support/design/widget/ShadowDrawableWrapper.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.design.widget;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.LinearGradient;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.PixelFormat;
-import android.graphics.RadialGradient;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.Shader;
-import android.graphics.drawable.Drawable;
-import android.support.design.R;
-import android.support.v4.content.ContextCompat;
-import android.support.v7.graphics.drawable.DrawableWrapper;
-
-/**
- * A {@link android.graphics.drawable.Drawable} which wraps another drawable and
- * draws a shadow around it.
- */
-class ShadowDrawableWrapper extends DrawableWrapper {
-    // used to calculate content padding
-    static final double COS_45 = Math.cos(Math.toRadians(45));
-
-    static final float SHADOW_MULTIPLIER = 1.5f;
-
-    static final float SHADOW_TOP_SCALE = 0.25f;
-    static final float SHADOW_HORIZ_SCALE = 0.5f;
-    static final float SHADOW_BOTTOM_SCALE = 1f;
-
-    final Paint mCornerShadowPaint;
-    final Paint mEdgeShadowPaint;
-
-    final RectF mContentBounds;
-
-    float mCornerRadius;
-
-    Path mCornerShadowPath;
-
-    // updated value with inset
-    float mMaxShadowSize;
-    // actual value set by developer
-    float mRawMaxShadowSize;
-
-    // multiplied value to account for shadow offset
-    float mShadowSize;
-    // actual value set by developer
-    float mRawShadowSize;
-
-    private boolean mDirty = true;
-
-    private final int mShadowStartColor;
-    private final int mShadowMiddleColor;
-    private final int mShadowEndColor;
-
-    private boolean mAddPaddingForCorners = true;
-
-    private float mRotation;
-
-    /**
-     * If shadow size is set to a value above max shadow, we print a warning
-     */
-    private boolean mPrintedShadowClipWarning = false;
-
-    public ShadowDrawableWrapper(Context context, Drawable content, float radius,
-            float shadowSize, float maxShadowSize) {
-        super(content);
-
-        mShadowStartColor = ContextCompat.getColor(context, R.color.design_fab_shadow_start_color);
-        mShadowMiddleColor = ContextCompat.getColor(context, R.color.design_fab_shadow_mid_color);
-        mShadowEndColor = ContextCompat.getColor(context, R.color.design_fab_shadow_end_color);
-
-        mCornerShadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
-        mCornerShadowPaint.setStyle(Paint.Style.FILL);
-        mCornerRadius = Math.round(radius);
-        mContentBounds = new RectF();
-        mEdgeShadowPaint = new Paint(mCornerShadowPaint);
-        mEdgeShadowPaint.setAntiAlias(false);
-        setShadowSize(shadowSize, maxShadowSize);
-    }
-
-    /**
-     * Casts the value to an even integer.
-     */
-    private static int toEven(float value) {
-        int i = Math.round(value);
-        return (i % 2 == 1) ? i - 1 : i;
-    }
-
-    public void setAddPaddingForCorners(boolean addPaddingForCorners) {
-        mAddPaddingForCorners = addPaddingForCorners;
-        invalidateSelf();
-    }
-
-    @Override
-    public void setAlpha(int alpha) {
-        super.setAlpha(alpha);
-        mCornerShadowPaint.setAlpha(alpha);
-        mEdgeShadowPaint.setAlpha(alpha);
-    }
-
-    @Override
-    protected void onBoundsChange(Rect bounds) {
-        mDirty = true;
-    }
-
-    void setShadowSize(float shadowSize, float maxShadowSize) {
-        if (shadowSize < 0 || maxShadowSize < 0) {
-            throw new IllegalArgumentException("invalid shadow size");
-        }
-        shadowSize = toEven(shadowSize);
-        maxShadowSize = toEven(maxShadowSize);
-        if (shadowSize > maxShadowSize) {
-            shadowSize = maxShadowSize;
-            if (!mPrintedShadowClipWarning) {
-                mPrintedShadowClipWarning = true;
-            }
-        }
-        if (mRawShadowSize == shadowSize && mRawMaxShadowSize == maxShadowSize) {
-            return;
-        }
-        mRawShadowSize = shadowSize;
-        mRawMaxShadowSize = maxShadowSize;
-        mShadowSize = Math.round(shadowSize * SHADOW_MULTIPLIER);
-        mMaxShadowSize = maxShadowSize;
-        mDirty = true;
-        invalidateSelf();
-    }
-
-    @Override
-    public boolean getPadding(Rect padding) {
-        int vOffset = (int) Math.ceil(calculateVerticalPadding(mRawMaxShadowSize, mCornerRadius,
-                mAddPaddingForCorners));
-        int hOffset = (int) Math.ceil(calculateHorizontalPadding(mRawMaxShadowSize, mCornerRadius,
-                mAddPaddingForCorners));
-        padding.set(hOffset, vOffset, hOffset, vOffset);
-        return true;
-    }
-
-    public static float calculateVerticalPadding(float maxShadowSize, float cornerRadius,
-            boolean addPaddingForCorners) {
-        if (addPaddingForCorners) {
-            return (float) (maxShadowSize * SHADOW_MULTIPLIER + (1 - COS_45) * cornerRadius);
-        } else {
-            return maxShadowSize * SHADOW_MULTIPLIER;
-        }
-    }
-
-    public static float calculateHorizontalPadding(float maxShadowSize, float cornerRadius,
-            boolean addPaddingForCorners) {
-        if (addPaddingForCorners) {
-            return (float) (maxShadowSize + (1 - COS_45) * cornerRadius);
-        } else {
-            return maxShadowSize;
-        }
-    }
-
-    @Override
-    public int getOpacity() {
-        return PixelFormat.TRANSLUCENT;
-    }
-
-    public void setCornerRadius(float radius) {
-        radius = Math.round(radius);
-        if (mCornerRadius == radius) {
-            return;
-        }
-        mCornerRadius = radius;
-        mDirty = true;
-        invalidateSelf();
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        if (mDirty) {
-            buildComponents(getBounds());
-            mDirty = false;
-        }
-        drawShadow(canvas);
-
-        super.draw(canvas);
-    }
-
-    final void setRotation(float rotation) {
-        if (mRotation != rotation) {
-            mRotation = rotation;
-            invalidateSelf();
-        }
-    }
-
-    private void drawShadow(Canvas canvas) {
-        final int rotateSaved = canvas.save();
-        canvas.rotate(mRotation, mContentBounds.centerX(), mContentBounds.centerY());
-
-        final float edgeShadowTop = -mCornerRadius - mShadowSize;
-        final float shadowOffset = mCornerRadius;
-        final boolean drawHorizontalEdges = mContentBounds.width() - 2 * shadowOffset > 0;
-        final boolean drawVerticalEdges = mContentBounds.height() - 2 * shadowOffset > 0;
-
-        final float shadowOffsetTop = mRawShadowSize - (mRawShadowSize * SHADOW_TOP_SCALE);
-        final float shadowOffsetHorizontal = mRawShadowSize - (mRawShadowSize * SHADOW_HORIZ_SCALE);
-        final float shadowOffsetBottom = mRawShadowSize - (mRawShadowSize * SHADOW_BOTTOM_SCALE);
-
-        final float shadowScaleHorizontal = shadowOffset / (shadowOffset + shadowOffsetHorizontal);
-        final float shadowScaleTop = shadowOffset / (shadowOffset + shadowOffsetTop);
-        final float shadowScaleBottom = shadowOffset / (shadowOffset + shadowOffsetBottom);
-
-        // LT
-        int saved = canvas.save();
-        canvas.translate(mContentBounds.left + shadowOffset, mContentBounds.top + shadowOffset);
-        canvas.scale(shadowScaleHorizontal, shadowScaleTop);
-        canvas.drawPath(mCornerShadowPath, mCornerShadowPaint);
-        if (drawHorizontalEdges) {
-            // TE
-            canvas.scale(1f / shadowScaleHorizontal, 1f);
-            canvas.drawRect(0, edgeShadowTop,
-                    mContentBounds.width() - 2 * shadowOffset, -mCornerRadius,
-                    mEdgeShadowPaint);
-        }
-        canvas.restoreToCount(saved);
-        // RB
-        saved = canvas.save();
-        canvas.translate(mContentBounds.right - shadowOffset, mContentBounds.bottom - shadowOffset);
-        canvas.scale(shadowScaleHorizontal, shadowScaleBottom);
-        canvas.rotate(180f);
-        canvas.drawPath(mCornerShadowPath, mCornerShadowPaint);
-        if (drawHorizontalEdges) {
-            // BE
-            canvas.scale(1f / shadowScaleHorizontal, 1f);
-            canvas.drawRect(0, edgeShadowTop,
-                    mContentBounds.width() - 2 * shadowOffset, -mCornerRadius + mShadowSize,
-                    mEdgeShadowPaint);
-        }
-        canvas.restoreToCount(saved);
-        // LB
-        saved = canvas.save();
-        canvas.translate(mContentBounds.left + shadowOffset, mContentBounds.bottom - shadowOffset);
-        canvas.scale(shadowScaleHorizontal, shadowScaleBottom);
-        canvas.rotate(270f);
-        canvas.drawPath(mCornerShadowPath, mCornerShadowPaint);
-        if (drawVerticalEdges) {
-            // LE
-            canvas.scale(1f / shadowScaleBottom, 1f);
-            canvas.drawRect(0, edgeShadowTop,
-                    mContentBounds.height() - 2 * shadowOffset, -mCornerRadius, mEdgeShadowPaint);
-        }
-        canvas.restoreToCount(saved);
-        // RT
-        saved = canvas.save();
-        canvas.translate(mContentBounds.right - shadowOffset, mContentBounds.top + shadowOffset);
-        canvas.scale(shadowScaleHorizontal, shadowScaleTop);
-        canvas.rotate(90f);
-        canvas.drawPath(mCornerShadowPath, mCornerShadowPaint);
-        if (drawVerticalEdges) {
-            // RE
-            canvas.scale(1f / shadowScaleTop, 1f);
-            canvas.drawRect(0, edgeShadowTop,
-                    mContentBounds.height() - 2 * shadowOffset, -mCornerRadius, mEdgeShadowPaint);
-        }
-        canvas.restoreToCount(saved);
-
-        canvas.restoreToCount(rotateSaved);
-    }
-
-    private void buildShadowCorners() {
-        RectF innerBounds = new RectF(-mCornerRadius, -mCornerRadius, mCornerRadius, mCornerRadius);
-        RectF outerBounds = new RectF(innerBounds);
-        outerBounds.inset(-mShadowSize, -mShadowSize);
-
-        if (mCornerShadowPath == null) {
-            mCornerShadowPath = new Path();
-        } else {
-            mCornerShadowPath.reset();
-        }
-        mCornerShadowPath.setFillType(Path.FillType.EVEN_ODD);
-        mCornerShadowPath.moveTo(-mCornerRadius, 0);
-        mCornerShadowPath.rLineTo(-mShadowSize, 0);
-        // outer arc
-        mCornerShadowPath.arcTo(outerBounds, 180f, 90f, false);
-        // inner arc
-        mCornerShadowPath.arcTo(innerBounds, 270f, -90f, false);
-        mCornerShadowPath.close();
-
-        float shadowRadius = -outerBounds.top;
-        if (shadowRadius > 0f) {
-            float startRatio = mCornerRadius / shadowRadius;
-            float midRatio = startRatio + ((1f - startRatio) / 2f);
-            mCornerShadowPaint.setShader(new RadialGradient(0, 0, shadowRadius,
-                    new int[]{0, mShadowStartColor, mShadowMiddleColor, mShadowEndColor},
-                    new float[]{0f, startRatio, midRatio, 1f},
-                    Shader.TileMode.CLAMP));
-        }
-
-        // we offset the content shadowSize/2 pixels up to make it more realistic.
-        // this is why edge shadow shader has some extra space
-        // When drawing bottom edge shadow, we use that extra space.
-        mEdgeShadowPaint.setShader(new LinearGradient(0, innerBounds.top, 0, outerBounds.top,
-                new int[]{mShadowStartColor, mShadowMiddleColor, mShadowEndColor},
-                new float[]{0f, .5f, 1f}, Shader.TileMode.CLAMP));
-        mEdgeShadowPaint.setAntiAlias(false);
-    }
-
-    private void buildComponents(Rect bounds) {
-        // Card is offset SHADOW_MULTIPLIER * maxShadowSize to account for the shadow shift.
-        // We could have different top-bottom offsets to avoid extra gap above but in that case
-        // center aligning Views inside the CardView would be problematic.
-        final float verticalOffset = mRawMaxShadowSize * SHADOW_MULTIPLIER;
-        mContentBounds.set(bounds.left + mRawMaxShadowSize, bounds.top + verticalOffset,
-                bounds.right - mRawMaxShadowSize, bounds.bottom - verticalOffset);
-
-        getWrappedDrawable().setBounds((int) mContentBounds.left, (int) mContentBounds.top,
-                (int) mContentBounds.right, (int) mContentBounds.bottom);
-
-        buildShadowCorners();
-    }
-
-    public float getCornerRadius() {
-        return mCornerRadius;
-    }
-
-    public void setShadowSize(float size) {
-        setShadowSize(size, mRawMaxShadowSize);
-    }
-
-    public void setMaxShadowSize(float size) {
-        setShadowSize(mRawShadowSize, size);
-    }
-
-    public float getShadowSize() {
-        return mRawShadowSize;
-    }
-
-    public float getMaxShadowSize() {
-        return mRawMaxShadowSize;
-    }
-
-    public float getMinWidth() {
-        final float content = 2 *
-                Math.max(mRawMaxShadowSize, mCornerRadius + mRawMaxShadowSize / 2);
-        return content + mRawMaxShadowSize * 2;
-    }
-
-    public float getMinHeight() {
-        final float content = 2 * Math.max(mRawMaxShadowSize, mCornerRadius
-                + mRawMaxShadowSize * SHADOW_MULTIPLIER / 2);
-        return content + (mRawMaxShadowSize * SHADOW_MULTIPLIER) * 2;
-    }
-}
diff --git a/design/base/android/support/design/widget/ShadowViewDelegate.java b/design/base/android/support/design/widget/ShadowViewDelegate.java
deleted file mode 100644
index 83a3a7a..0000000
--- a/design/base/android/support/design/widget/ShadowViewDelegate.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.graphics.drawable.Drawable;
-
-interface ShadowViewDelegate {
-    float getRadius();
-    void setShadowPadding(int left, int top, int right, int bottom);
-    void setBackgroundDrawable(Drawable background);
-    boolean isCompatPaddingEnabled();
-}
diff --git a/design/base/android/support/design/widget/StateListAnimator.java b/design/base/android/support/design/widget/StateListAnimator.java
deleted file mode 100644
index aef24be..0000000
--- a/design/base/android/support/design/widget/StateListAnimator.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
-import android.util.StateSet;
-
-import java.util.ArrayList;
-
-final class StateListAnimator {
-
-    private final ArrayList<Tuple> mTuples = new ArrayList<>();
-
-    private Tuple mLastMatch = null;
-    ValueAnimator mRunningAnimator = null;
-
-    private final ValueAnimator.AnimatorListener mAnimationListener =
-            new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationEnd(Animator animator) {
-                    if (mRunningAnimator == animator) {
-                        mRunningAnimator = null;
-                    }
-                }
-            };
-
-    /**
-     * Associates the given Animation with the provided drawable state specs so that it will be run
-     * when the View's drawable state matches the specs.
-     *
-     * @param specs    The drawable state specs to match against
-     * @param animator The animator to run when the specs match
-     */
-    public void addState(int[] specs, ValueAnimator animator) {
-        Tuple tuple = new Tuple(specs, animator);
-        animator.addListener(mAnimationListener);
-        mTuples.add(tuple);
-    }
-
-    /**
-     * Called by View
-     */
-    void setState(int[] state) {
-        Tuple match = null;
-        final int count = mTuples.size();
-        for (int i = 0; i < count; i++) {
-            final Tuple tuple = mTuples.get(i);
-            if (StateSet.stateSetMatches(tuple.mSpecs, state)) {
-                match = tuple;
-                break;
-            }
-        }
-        if (match == mLastMatch) {
-            return;
-        }
-        if (mLastMatch != null) {
-            cancel();
-        }
-
-        mLastMatch = match;
-
-        if (match != null) {
-            start(match);
-        }
-    }
-
-    private void start(Tuple match) {
-        mRunningAnimator = match.mAnimator;
-        mRunningAnimator.start();
-    }
-
-    private void cancel() {
-        if (mRunningAnimator != null) {
-            mRunningAnimator.cancel();
-            mRunningAnimator = null;
-        }
-    }
-
-    /**
-     * If there is an animation running for a recent state change, ends it.
-     *
-     * <p>This causes the animation to assign the end value(s) to the View.</p>
-     */
-    public void jumpToCurrentState() {
-        if (mRunningAnimator != null) {
-            mRunningAnimator.end();
-            mRunningAnimator = null;
-        }
-    }
-
-    static class Tuple {
-        final int[] mSpecs;
-        final ValueAnimator mAnimator;
-
-        Tuple(int[] specs, ValueAnimator animator) {
-            mSpecs = specs;
-            mAnimator = animator;
-        }
-    }
-}
\ No newline at end of file
diff --git a/design/base/android/support/design/widget/VisibilityAwareImageButton.java b/design/base/android/support/design/widget/VisibilityAwareImageButton.java
deleted file mode 100644
index d7a0b13..0000000
--- a/design/base/android/support/design/widget/VisibilityAwareImageButton.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.ImageButton;
-
-class VisibilityAwareImageButton extends ImageButton {
-
-    private int mUserSetVisibility;
-
-    public VisibilityAwareImageButton(Context context) {
-        this(context, null);
-    }
-
-    public VisibilityAwareImageButton(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public VisibilityAwareImageButton(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        mUserSetVisibility = getVisibility();
-    }
-
-    @Override
-    public void setVisibility(int visibility) {
-        internalSetVisibility(visibility, true);
-    }
-
-    final void internalSetVisibility(int visibility, boolean fromUser) {
-        super.setVisibility(visibility);
-        if (fromUser) {
-            mUserSetVisibility = visibility;
-        }
-    }
-
-    final int getUserSetVisibility() {
-        return mUserSetVisibility;
-    }
-}
diff --git a/design/build.gradle b/design/build.gradle
deleted file mode 100644
index baa94ea..0000000
--- a/design/build.gradle
+++ /dev/null
@@ -1,67 +0,0 @@
-import static android.support.dependencies.DependenciesKt.*
-import android.support.LibraryGroups
-import android.support.LibraryVersions
-
-plugins {
-    id("SupportAndroidLibraryPlugin")
-}
-
-dependencies {
-    api(project(":support-v4"))
-    api(project(":appcompat-v7"))
-    api(project(":recyclerview-v7"))
-    api(project(":transition"))
-
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(ESPRESSO_CONTRIB, libs.exclude_support)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation project(':support-testutils')
-}
-
-android {
-    defaultConfig {
-        // This disables the builds tools automatic vector -> PNG generation
-        generatedDensities = []
-    }
-
-    sourceSets {
-        main.java.srcDirs = [
-                'base',
-                'gingerbread',
-                'ics',
-                'lollipop',
-                'src'
-        ]
-        main.res.srcDirs = [
-                'res',
-                'res-public'
-        ]
-        main.resources.srcDir 'src'
-    }
-
-    buildTypes.all {
-        consumerProguardFiles 'proguard-rules.pro'
-    }
-
-    aaptOptions {
-        additionalParameters "--no-version-vectors"
-    }
-
-    buildTypes {
-        debug {
-            pseudoLocalesEnabled true
-        }
-    }
-}
-
-supportLibrary {
-    name = "Android Design Support Library"
-    publish = true
-    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
-    mavenGroup = LibraryGroups.SUPPORT
-    inceptionYear = "2015"
-    description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren\'t a part of the framework APIs. Compatible on devices running API 14 or later."
-    legacySourceLocation = true
-}
diff --git a/design/lollipop/android/support/design/widget/CircularBorderDrawableLollipop.java b/design/lollipop/android/support/design/widget/CircularBorderDrawableLollipop.java
deleted file mode 100644
index 8008404..0000000
--- a/design/lollipop/android/support/design/widget/CircularBorderDrawableLollipop.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.graphics.Outline;
-import android.support.annotation.RequiresApi;
-
-/**
- * Lollipop version of {@link CircularBorderDrawable}.
- */
-@RequiresApi(21)
-class CircularBorderDrawableLollipop extends CircularBorderDrawable {
-
-    @Override
-    public void getOutline(Outline outline) {
-        copyBounds(mRect);
-        outline.setOval(mRect);
-    }
-
-}
diff --git a/design/lollipop/android/support/design/widget/FloatingActionButtonLollipop.java b/design/lollipop/android/support/design/widget/FloatingActionButtonLollipop.java
deleted file mode 100644
index 0df83da..0000000
--- a/design/lollipop/android/support/design/widget/FloatingActionButtonLollipop.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.animation.Animator;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.animation.StateListAnimator;
-import android.content.res.ColorStateList;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.GradientDrawable;
-import android.graphics.drawable.InsetDrawable;
-import android.graphics.drawable.LayerDrawable;
-import android.graphics.drawable.RippleDrawable;
-import android.os.Build;
-import android.support.annotation.RequiresApi;
-import android.support.v4.graphics.drawable.DrawableCompat;
-import android.view.View;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RequiresApi(21)
-class FloatingActionButtonLollipop extends FloatingActionButtonImpl {
-
-    private InsetDrawable mInsetDrawable;
-
-    FloatingActionButtonLollipop(VisibilityAwareImageButton view,
-            ShadowViewDelegate shadowViewDelegate) {
-        super(view, shadowViewDelegate);
-    }
-
-    @Override
-    void setBackgroundDrawable(ColorStateList backgroundTint,
-            PorterDuff.Mode backgroundTintMode, int rippleColor, int borderWidth) {
-        // Now we need to tint the shape background with the tint
-        mShapeDrawable = DrawableCompat.wrap(createShapeDrawable());
-        DrawableCompat.setTintList(mShapeDrawable, backgroundTint);
-        if (backgroundTintMode != null) {
-            DrawableCompat.setTintMode(mShapeDrawable, backgroundTintMode);
-        }
-
-        final Drawable rippleContent;
-        if (borderWidth > 0) {
-            mBorderDrawable = createBorderDrawable(borderWidth, backgroundTint);
-            rippleContent = new LayerDrawable(new Drawable[]{mBorderDrawable, mShapeDrawable});
-        } else {
-            mBorderDrawable = null;
-            rippleContent = mShapeDrawable;
-        }
-
-        mRippleDrawable = new RippleDrawable(ColorStateList.valueOf(rippleColor),
-                rippleContent, null);
-
-        mContentBackground = mRippleDrawable;
-
-        mShadowViewDelegate.setBackgroundDrawable(mRippleDrawable);
-    }
-
-    @Override
-    void setRippleColor(int rippleColor) {
-        if (mRippleDrawable instanceof RippleDrawable) {
-            ((RippleDrawable) mRippleDrawable).setColor(ColorStateList.valueOf(rippleColor));
-        } else {
-            super.setRippleColor(rippleColor);
-        }
-    }
-
-    @Override
-    void onElevationsChanged(final float elevation, final float pressedTranslationZ) {
-        if (Build.VERSION.SDK_INT == 21) {
-            // Animations produce NPE in version 21. Bluntly set the values instead (matching the
-            // logic in the animations below).
-            if (mView.isEnabled()) {
-                mView.setElevation(elevation);
-                if (mView.isFocused() || mView.isPressed()) {
-                    mView.setTranslationZ(pressedTranslationZ);
-                } else {
-                    mView.setTranslationZ(0);
-                }
-            } else {
-                mView.setElevation(0);
-                mView.setTranslationZ(0);
-            }
-        } else {
-            final StateListAnimator stateListAnimator = new StateListAnimator();
-
-            // Animate elevation and translationZ to our values when pressed
-            AnimatorSet set = new AnimatorSet();
-            set.play(ObjectAnimator.ofFloat(mView, "elevation", elevation).setDuration(0))
-                    .with(ObjectAnimator.ofFloat(mView, View.TRANSLATION_Z, pressedTranslationZ)
-                            .setDuration(PRESSED_ANIM_DURATION));
-            set.setInterpolator(ANIM_INTERPOLATOR);
-            stateListAnimator.addState(PRESSED_ENABLED_STATE_SET, set);
-
-            // Same deal for when we're focused
-            set = new AnimatorSet();
-            set.play(ObjectAnimator.ofFloat(mView, "elevation", elevation).setDuration(0))
-                    .with(ObjectAnimator.ofFloat(mView, View.TRANSLATION_Z, pressedTranslationZ)
-                            .setDuration(PRESSED_ANIM_DURATION));
-            set.setInterpolator(ANIM_INTERPOLATOR);
-            stateListAnimator.addState(FOCUSED_ENABLED_STATE_SET, set);
-
-            // Animate translationZ to 0 if not pressed
-            set = new AnimatorSet();
-            List<Animator> animators = new ArrayList<>();
-            animators.add(ObjectAnimator.ofFloat(mView, "elevation", elevation).setDuration(0));
-            if (Build.VERSION.SDK_INT >= 22 && Build.VERSION.SDK_INT <= 24) {
-                // This is a no-op animation which exists here only for introducing the duration
-                // because setting the delay (on the next animation) via "setDelay" or "after"
-                // can trigger a NPE between android versions 22 and 24 (due to a framework
-                // bug). The issue has been fixed in version 25.
-                animators.add(ObjectAnimator.ofFloat(mView, View.TRANSLATION_Z,
-                        mView.getTranslationZ()).setDuration(PRESSED_ANIM_DELAY));
-            }
-            animators.add(ObjectAnimator.ofFloat(mView, View.TRANSLATION_Z, 0f)
-                    .setDuration(PRESSED_ANIM_DURATION));
-            set.playSequentially(animators.toArray(new ObjectAnimator[0]));
-            set.setInterpolator(ANIM_INTERPOLATOR);
-            stateListAnimator.addState(ENABLED_STATE_SET, set);
-
-            // Animate everything to 0 when disabled
-            set = new AnimatorSet();
-            set.play(ObjectAnimator.ofFloat(mView, "elevation", 0f).setDuration(0))
-                    .with(ObjectAnimator.ofFloat(mView, View.TRANSLATION_Z, 0f).setDuration(0));
-            set.setInterpolator(ANIM_INTERPOLATOR);
-            stateListAnimator.addState(EMPTY_STATE_SET, set);
-
-            mView.setStateListAnimator(stateListAnimator);
-        }
-
-        if (mShadowViewDelegate.isCompatPaddingEnabled()) {
-            updatePadding();
-        }
-    }
-
-    @Override
-    public float getElevation() {
-        return mView.getElevation();
-    }
-
-    @Override
-    void onCompatShadowChanged() {
-        updatePadding();
-    }
-
-    @Override
-    void onPaddingUpdated(Rect padding) {
-        if (mShadowViewDelegate.isCompatPaddingEnabled()) {
-            mInsetDrawable = new InsetDrawable(mRippleDrawable,
-                    padding.left, padding.top, padding.right, padding.bottom);
-            mShadowViewDelegate.setBackgroundDrawable(mInsetDrawable);
-        } else {
-            mShadowViewDelegate.setBackgroundDrawable(mRippleDrawable);
-        }
-    }
-
-    @Override
-    void onDrawableStateChanged(int[] state) {
-        // no-op
-    }
-
-    @Override
-    void jumpDrawableToCurrentState() {
-        // no-op
-    }
-
-    @Override
-    boolean requirePreDrawListener() {
-        return false;
-    }
-
-    @Override
-    CircularBorderDrawable newCircularDrawable() {
-        return new CircularBorderDrawableLollipop();
-    }
-
-    @Override
-    GradientDrawable newGradientDrawableForShape() {
-        return new AlwaysStatefulGradientDrawable();
-    }
-
-    @Override
-    void getPadding(Rect rect) {
-        if (mShadowViewDelegate.isCompatPaddingEnabled()) {
-            final float radius = mShadowViewDelegate.getRadius();
-            final float maxShadowSize = getElevation() + mPressedTranslationZ;
-            final int hPadding = (int) Math.ceil(
-                    ShadowDrawableWrapper.calculateHorizontalPadding(maxShadowSize, radius, false));
-            final int vPadding = (int) Math.ceil(
-                    ShadowDrawableWrapper.calculateVerticalPadding(maxShadowSize, radius, false));
-            rect.set(hPadding, vPadding, hPadding, vPadding);
-        } else {
-            rect.set(0, 0, 0, 0);
-        }
-    }
-
-    /**
-     * LayerDrawable on L+ caches its isStateful() state and doesn't refresh it,
-     * meaning that if we apply a tint to one of its children, the parent doesn't become
-     * stateful and the tint doesn't work for state changes. We workaround it by saying that we
-     * are always stateful. If we don't have a stateful tint, the change is ignored anyway.
-     */
-    static class AlwaysStatefulGradientDrawable extends GradientDrawable {
-        @Override
-        public boolean isStateful() {
-            return true;
-        }
-    }
-}
diff --git a/design/lollipop/android/support/design/widget/ViewUtilsLollipop.java b/design/lollipop/android/support/design/widget/ViewUtilsLollipop.java
deleted file mode 100644
index 5927e9b..0000000
--- a/design/lollipop/android/support/design/widget/ViewUtilsLollipop.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.animation.AnimatorInflater;
-import android.animation.ObjectAnimator;
-import android.animation.StateListAnimator;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.support.annotation.RequiresApi;
-import android.support.design.R;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewOutlineProvider;
-
-@RequiresApi(21)
-class ViewUtilsLollipop {
-
-    private static final int[] STATE_LIST_ANIM_ATTRS = new int[] {android.R.attr.stateListAnimator};
-
-    static void setBoundsViewOutlineProvider(View view) {
-        view.setOutlineProvider(ViewOutlineProvider.BOUNDS);
-    }
-
-    static void setStateListAnimatorFromAttrs(View view, AttributeSet attrs,
-           int defStyleAttr,  int defStyleRes) {
-        final Context context = view.getContext();
-        final TypedArray a = context.obtainStyledAttributes(attrs, STATE_LIST_ANIM_ATTRS,
-                defStyleAttr, defStyleRes);
-        try {
-            if (a.hasValue(0)) {
-                StateListAnimator sla = AnimatorInflater.loadStateListAnimator(context,
-                        a.getResourceId(0, 0));
-                view.setStateListAnimator(sla);
-            }
-        } finally {
-            a.recycle();
-        }
-    }
-
-    /**
-     * Creates and sets a {@link StateListAnimator} with a custom elevation value
-     */
-    static void setDefaultAppBarLayoutStateListAnimator(final View view, final float elevation) {
-        final int dur = view.getResources().getInteger(R.integer.app_bar_elevation_anim_duration);
-
-        final StateListAnimator sla = new StateListAnimator();
-
-        // Enabled and collapsible, but not collapsed means not elevated
-        sla.addState(new int[]{android.R.attr.enabled, R.attr.state_collapsible,
-                        -R.attr.state_collapsed},
-                ObjectAnimator.ofFloat(view, "elevation", 0f).setDuration(dur));
-
-        // Default enabled state
-        sla.addState(new int[]{android.R.attr.enabled},
-                ObjectAnimator.ofFloat(view, "elevation", elevation).setDuration(dur));
-
-        // Disabled state
-        sla.addState(new int[0],
-                ObjectAnimator.ofFloat(view, "elevation", 0).setDuration(0));
-
-        view.setStateListAnimator(sla);
-    }
-
-}
diff --git a/design/proguard-rules.pro b/design/proguard-rules.pro
deleted file mode 100644
index 96e2ee0..0000000
--- a/design/proguard-rules.pro
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright (C) 2015 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.
-
-# CoordinatorLayout resolves the behaviors of its child components with reflection.
--keep public class * extends android.support.design.widget.CoordinatorLayout$Behavior {
-    public <init>(android.content.Context, android.util.AttributeSet);
-    public <init>();
-}
-
-# Make sure we keep annotations for CoordinatorLayout's DefaultBehavior
--keepattributes *Annotation*
diff --git a/design/res-public/values/public_attrs.xml b/design/res-public/values/public_attrs.xml
deleted file mode 100644
index 9afe981..0000000
--- a/design/res-public/values/public_attrs.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-
-<!-- Definitions of attributes to be exposed as public -->
-<resources>
-    <public type="attr" name="backgroundTint"/>
-    <public type="attr" name="backgroundTintMode"/>
-    <public type="attr" name="behavior_hideable"/>
-    <public type="attr" name="behavior_overlapTop"/>
-    <public type="attr" name="behavior_peekHeight"/>
-    <public type="attr" name="borderWidth"/>
-    <public type="attr" name="bottomSheetDialogTheme"/>
-    <public type="attr" name="bottomSheetStyle"/>
-    <public type="attr" name="collapsedTitleGravity"/>
-    <public type="attr" name="collapsedTitleTextAppearance"/>
-    <public type="attr" name="contentScrim"/>
-    <public type="attr" name="counterEnabled"/>
-    <public type="attr" name="counterMaxLength"/>
-    <public type="attr" name="counterOverflowTextAppearance"/>
-    <public type="attr" name="counterTextAppearance"/>
-    <public type="attr" name="elevation"/>
-    <public type="attr" name="errorEnabled"/>
-    <public type="attr" name="errorTextAppearance"/>
-    <public type="attr" name="expanded"/>
-    <public type="attr" name="expandedTitleGravity"/>
-    <public type="attr" name="expandedTitleMargin"/>
-    <public type="attr" name="expandedTitleMarginBottom"/>
-    <public type="attr" name="expandedTitleMarginEnd"/>
-    <public type="attr" name="expandedTitleMarginStart"/>
-    <public type="attr" name="expandedTitleMarginTop"/>
-    <public type="attr" name="expandedTitleTextAppearance"/>
-    <public type="attr" name="fabSize"/>
-    <public type="attr" name="headerLayout"/>
-    <public type="attr" name="hintAnimationEnabled"/>
-    <public type="attr" name="hintEnabled"/>
-    <public type="attr" name="hintTextAppearance"/>
-    <public type="attr" name="itemBackground"/>
-    <public type="attr" name="itemIconTint"/>
-    <public type="attr" name="itemTextAppearance"/>
-    <public type="attr" name="itemTextColor"/>
-    <public type="attr" name="layout_collapseMode"/>
-    <public type="attr" name="layout_collapseParallaxMultiplier"/>
-    <public type="attr" name="layout_scrollFlags"/>
-    <public type="attr" name="layout_scrollInterpolator"/>
-    <public type="attr" name="menu"/>
-    <public type="attr" name="pressedTranslationZ"/>
-    <public type="attr" name="rippleColor"/>
-    <public type="attr" name="statusBarScrim"/>
-    <public type="attr" name="tabBackground"/>
-    <public type="attr" name="tabContentStart"/>
-    <public type="attr" name="tabGravity"/>
-    <public type="attr" name="tabIndicatorColor"/>
-    <public type="attr" name="tabIndicatorHeight"/>
-    <public type="attr" name="tabMaxWidth"/>
-    <public type="attr" name="tabMinWidth"/>
-    <public type="attr" name="tabMode"/>
-    <public type="attr" name="tabPadding"/>
-    <public type="attr" name="tabPaddingBottom"/>
-    <public type="attr" name="tabPaddingEnd"/>
-    <public type="attr" name="tabPaddingStart"/>
-    <public type="attr" name="tabPaddingTop"/>
-    <public type="attr" name="tabSelectedTextColor"/>
-    <public type="attr" name="tabTextAppearance"/>
-    <public type="attr" name="tabTextColor"/>
-    <public type="attr" name="textColorError"/>
-    <public type="attr" name="title"/>
-    <public type="attr" name="titleEnabled"/>
-    <public type="attr" name="toolbarId"/>
-    <public type="attr" name="useCompatPadding"/>
-</resources>
diff --git a/design/res-public/values/public_strings.xml b/design/res-public/values/public_strings.xml
deleted file mode 100644
index 29f4155..0000000
--- a/design/res-public/values/public_strings.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-
-<!-- Definitions of styles to be exposed as public -->
-<resources>
-    <public type="string" name="appbar_scrolling_view_behavior"/>
-    <public type="string" name="bottom_sheet_behavior"/>
-</resources>
diff --git a/design/res-public/values/public_styles.xml b/design/res-public/values/public_styles.xml
deleted file mode 100644
index 0dcde45..0000000
--- a/design/res-public/values/public_styles.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-
-<!-- Definitions of styles to be exposed as public -->
-<resources>
-    <public type="style" name="TextAppearance.Design.CollapsingToolbar.Expanded"/>
-    <public type="style" name="TextAppearance.Design.Counter"/>
-    <public type="style" name="TextAppearance.Design.Counter.Overflow"/>
-    <public type="style" name="TextAppearance.Design.Error"/>
-    <public type="style" name="TextAppearance.Design.Hint"/>
-    <public type="style" name="TextAppearance.Design.Snackbar.Message"/>
-    <public type="style" name="TextAppearance.Design.Tab"/>
-    <public type="style" name="Theme.Design"/>
-    <public type="style" name="Theme.Design.BottomNavigationView"/>
-    <public type="style" name="Theme.Design.BottomSheetDialog"/>
-    <public type="style" name="Theme.Design.Light"/>
-    <public type="style" name="Theme.Design.Light.BottomSheetDialog"/>
-    <public type="style" name="Theme.Design.Light.NoActionBar"/>
-    <public type="style" name="Theme.Design.NoActionBar"/>
-    <public type="style" name="Widget.Design.AppBarLayout"/>
-    <public type="style" name="Widget.Design.BottomSheet.Modal"/>
-    <public type="style" name="Widget.Design.CollapsingToolbar"/>
-    <public type="style" name="Widget.Design.CoordinatorLayout"/>
-    <public type="style" name="Widget.Design.FloatingActionButton"/>
-    <public type="style" name="Widget.Design.NavigationView"/>
-    <public type="style" name="Widget.Design.Snackbar"/>
-    <public type="style" name="Widget.Design.TabLayout"/>
-    <public type="style" name="Widget.Design.TextInputLayout"/>
-</resources>
diff --git a/design/res/anim-v21/design_bottom_sheet_slide_in.xml b/design/res/anim-v21/design_bottom_sheet_slide_in.xml
deleted file mode 100644
index b5960a3..0000000
--- a/design/res/anim-v21/design_bottom_sheet_slide_in.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-     android:duration="@integer/bottom_sheet_slide_duration"
-     android:interpolator="@android:interpolator/fast_out_linear_in">
-
-    <translate
-            android:fromYDelta="20%p"
-            android:toYDelta="0"/>
-
-    <alpha
-            android:fromAlpha="0.0"
-            android:toAlpha="1.0"/>
-
-</set>
diff --git a/design/res/anim-v21/design_bottom_sheet_slide_out.xml b/design/res/anim-v21/design_bottom_sheet_slide_out.xml
deleted file mode 100644
index d680abe..0000000
--- a/design/res/anim-v21/design_bottom_sheet_slide_out.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-     android:duration="@integer/bottom_sheet_slide_duration"
-     android:interpolator="@android:interpolator/fast_out_slow_in">
-
-    <translate
-            android:fromYDelta="0"
-            android:toYDelta="20%p"/>
-
-    <alpha
-            android:fromAlpha="1.0"
-            android:toAlpha="0.0"/>
-
-</set>
diff --git a/design/res/anim/design_bottom_sheet_slide_in.xml b/design/res/anim/design_bottom_sheet_slide_in.xml
deleted file mode 100644
index 7cbae08..0000000
--- a/design/res/anim/design_bottom_sheet_slide_in.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-     android:duration="@integer/bottom_sheet_slide_duration"
-     android:interpolator="@android:anim/accelerate_decelerate_interpolator">
-
-    <translate
-            android:fromYDelta="20%p"
-            android:toYDelta="0"/>
-
-    <alpha
-            android:fromAlpha="0.0"
-            android:toAlpha="1.0"/>
-
-</set>
diff --git a/design/res/anim/design_bottom_sheet_slide_out.xml b/design/res/anim/design_bottom_sheet_slide_out.xml
deleted file mode 100644
index 2e30963..0000000
--- a/design/res/anim/design_bottom_sheet_slide_out.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-     android:duration="@integer/bottom_sheet_slide_duration"
-     android:interpolator="@android:anim/accelerate_interpolator">
-
-    <translate
-            android:fromYDelta="0"
-            android:toYDelta="20%p"/>
-
-    <alpha
-            android:fromAlpha="1.0"
-            android:toAlpha="0.0"/>
-
-</set>
diff --git a/design/res/anim/design_snackbar_in.xml b/design/res/anim/design_snackbar_in.xml
deleted file mode 100644
index a40524c..0000000
--- a/design/res/anim/design_snackbar_in.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-
-<translate xmlns:android="http://schemas.android.com/apk/res/android"
-           android:fromYDelta="100%"
-           android:toYDelta="0"/>
diff --git a/design/res/anim/design_snackbar_out.xml b/design/res/anim/design_snackbar_out.xml
deleted file mode 100644
index eb55cc0..0000000
--- a/design/res/anim/design_snackbar_out.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-
-<translate xmlns:android="http://schemas.android.com/apk/res/android"
-           android:fromYDelta="0"
-           android:toYDelta="100%"/>
\ No newline at end of file
diff --git a/design/res/animator-v21/design_appbar_state_list_animator.xml b/design/res/animator-v21/design_appbar_state_list_animator.xml
deleted file mode 100644
index a8a98e5..0000000
--- a/design/res/animator-v21/design_appbar_state_list_animator.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:app="http://schemas.android.com/apk/res-auto">
-
-    <item android:state_enabled="true" app:state_collapsed="false" app:state_collapsible="true">
-        <objectAnimator android:duration="@integer/app_bar_elevation_anim_duration"
-                        android:propertyName="elevation"
-                        android:valueTo="0dp"
-                        android:valueType="floatType"/>
-    </item>
-
-    <item android:state_enabled="true">
-        <objectAnimator android:duration="@integer/app_bar_elevation_anim_duration"
-                        android:propertyName="elevation"
-                        android:valueTo="@dimen/design_appbar_elevation"
-                        android:valueType="floatType"/>
-    </item>
-
-    <item>
-        <objectAnimator android:duration="0"
-                        android:propertyName="elevation"
-                        android:valueTo="0"
-                        android:valueType="floatType"/>
-    </item>
-
-</selector>
\ No newline at end of file
diff --git a/design/res/color-v23/design_tint_password_toggle.xml b/design/res/color-v23/design_tint_password_toggle.xml
deleted file mode 100644
index b728ccf..0000000
--- a/design/res/color-v23/design_tint_password_toggle.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:color="?android:attr/colorForeground" android:alpha="0.54"/>
-</selector>
\ No newline at end of file
diff --git a/design/res/color/design_error.xml b/design/res/color/design_error.xml
deleted file mode 100644
index e28602f..0000000
--- a/design/res/color/design_error.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_enabled="false" android:color="?android:attr/textColorTertiary"/>
-    <item android:color="?attr/textColorError"/>
-</selector>
\ No newline at end of file
diff --git a/design/res/color/design_tint_password_toggle.xml b/design/res/color/design_tint_password_toggle.xml
deleted file mode 100644
index 13beffd..0000000
--- a/design/res/color/design_tint_password_toggle.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:app="http://schemas.android.com/apk/res-auto">
-    <item android:color="?android:attr/colorForeground" app:alpha="0.54"/>
-</selector>
\ No newline at end of file
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility_off.xml b/design/res/drawable-anydpi-v21/design_ic_visibility_off.xml
deleted file mode 100644
index a8b47f0..0000000
--- a/design/res/drawable-anydpi-v21/design_ic_visibility_off.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24">
-
-    <path
-        android:fillColor="@android:color/white"
-        android:pathData="M12,7c2.76,0 5,2.24 5,5 0,0.65 -0.13,1.26 -0.36,1.83l2.92,2.92c1.51,-1.26 2.7,-2.89 3.43,-4.75 -1.73,-4.39 -6,-7.5 -11,-7.5 -1.4,0 -2.74,0.25 -3.98,0.7l2.16,2.16C10.74,7.13 11.35,7 12,7zM2,4.27l2.28,2.28 0.46,0.46C3.08,8.3 1.78,10.02 1,12c1.73,4.39 6,7.5 11,7.5 1.55,0 3.03,-0.3 4.38,-0.84l0.42,0.42L19.73,22 21,20.73 3.27,3 2,4.27zM7.53,9.8l1.55,1.55c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.66 1.34,3 3,3 0.22,0 0.44,-0.03 0.65,-0.08l1.55,1.55c-0.67,0.33 -1.41,0.53 -2.2,0.53 -2.76,0 -5,-2.24 -5,-5 0,-0.79 0.2,-1.53 0.53,-2.2zM11.84,9.02l3.15,3.15 0.02,-0.16c0,-1.66 -1.34,-3 -3,-3l-0.17,0.01z"/>
-
-</vector>
\ No newline at end of file
diff --git a/design/res/drawable-hdpi/design_ic_visibility.png b/design/res/drawable-hdpi/design_ic_visibility.png
deleted file mode 100644
index 329e617..0000000
--- a/design/res/drawable-hdpi/design_ic_visibility.png
+++ /dev/null
Binary files differ
diff --git a/design/res/drawable-hdpi/design_ic_visibility_off.png b/design/res/drawable-hdpi/design_ic_visibility_off.png
deleted file mode 100644
index b21a686..0000000
--- a/design/res/drawable-hdpi/design_ic_visibility_off.png
+++ /dev/null
Binary files differ
diff --git a/design/res/drawable-mdpi/design_ic_visibility.png b/design/res/drawable-mdpi/design_ic_visibility.png
deleted file mode 100644
index 58597e9..0000000
--- a/design/res/drawable-mdpi/design_ic_visibility.png
+++ /dev/null
Binary files differ
diff --git a/design/res/drawable-mdpi/design_ic_visibility_off.png b/design/res/drawable-mdpi/design_ic_visibility_off.png
deleted file mode 100644
index 3efdf49..0000000
--- a/design/res/drawable-mdpi/design_ic_visibility_off.png
+++ /dev/null
Binary files differ
diff --git a/design/res/drawable-v21/avd_hide_password.xml b/design/res/drawable-v21/avd_hide_password.xml
deleted file mode 100644
index 8c6ed1c..0000000
--- a/design/res/drawable-v21/avd_hide_password.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
-  -->
-
-<animated-vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:aapt="http://schemas.android.com/aapt">
-
-    <aapt:attr name="android:drawable">
-
-        <vector
-            android:width="24dp"
-            android:height="24dp"
-            android:viewportHeight="24"
-            android:viewportWidth="24">
-
-            <path
-                android:name="strike_through"
-                android:pathData="@string/path_password_strike_through"
-                android:strokeColor="@android:color/white"
-                android:strokeLineCap="square"
-                android:strokeWidth="1.8"
-                android:trimPathEnd="0"/>
-
-            <group>
-
-                <clip-path
-                    android:name="eye_mask"
-                    android:pathData="@string/path_password_eye_mask_visible"/>
-
-                <path
-                    android:name="eye"
-                    android:fillColor="@android:color/white"
-                    android:pathData="@string/path_password_eye"/>
-
-            </group>
-
-        </vector>
-
-    </aapt:attr>
-
-    <target android:name="eye_mask">
-
-        <aapt:attr name="android:animation">
-
-            <objectAnimator
-                android:duration="@integer/hide_password_duration"
-                android:interpolator="@android:interpolator/fast_out_slow_in"
-                android:propertyName="pathData"
-                android:valueFrom="@string/path_password_eye_mask_visible"
-                android:valueTo="@string/path_password_eye_mask_strike_through"
-                android:valueType="pathType"/>
-
-        </aapt:attr>
-
-    </target>
-
-    <target android:name="strike_through">
-
-        <aapt:attr name="android:animation">
-
-            <objectAnimator
-                android:duration="@integer/hide_password_duration"
-                android:interpolator="@android:interpolator/fast_out_slow_in"
-                android:propertyName="trimPathEnd"
-                android:valueFrom="0"
-                android:valueTo="1"/>
-
-        </aapt:attr>
-
-    </target>
-
-</animated-vector>
diff --git a/design/res/drawable-v21/avd_show_password.xml b/design/res/drawable-v21/avd_show_password.xml
deleted file mode 100644
index 5b205d7..0000000
--- a/design/res/drawable-v21/avd_show_password.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
-  -->
-
-<animated-vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:aapt="http://schemas.android.com/aapt">
-
-    <aapt:attr name="android:drawable">
-
-        <vector
-            android:width="24dp"
-            android:height="24dp"
-            android:viewportHeight="24"
-            android:viewportWidth="24">
-
-            <path
-                android:name="strike_through"
-                android:pathData="@string/path_password_strike_through"
-                android:strokeColor="@android:color/white"
-                android:strokeLineCap="square"
-                android:strokeWidth="1.8"/>
-
-            <group>
-
-                <clip-path
-                    android:name="eye_mask"
-                    android:pathData="@string/path_password_eye_mask_strike_through"/>
-
-                <path
-                    android:name="eye"
-                    android:fillColor="@android:color/white"
-                    android:pathData="@string/path_password_eye"/>
-
-            </group>
-
-        </vector>
-
-    </aapt:attr>
-
-    <target android:name="eye_mask">
-
-        <aapt:attr name="android:animation">
-
-            <objectAnimator
-                android:duration="@integer/show_password_duration"
-                android:interpolator="@android:interpolator/fast_out_linear_in"
-                android:propertyName="pathData"
-                android:valueFrom="@string/path_password_eye_mask_strike_through"
-                android:valueTo="@string/path_password_eye_mask_visible"
-                android:valueType="pathType"/>
-
-        </aapt:attr>
-
-    </target>
-
-    <target android:name="strike_through">
-
-        <aapt:attr name="android:animation">
-
-            <objectAnimator
-                android:duration="@integer/show_password_duration"
-                android:interpolator="@android:interpolator/fast_out_linear_in"
-                android:propertyName="trimPathEnd"
-                android:valueFrom="1"
-                android:valueTo="0"/>
-
-        </aapt:attr>
-
-    </target>
-
-</animated-vector>
diff --git a/design/res/drawable-v21/design_password_eye.xml b/design/res/drawable-v21/design_password_eye.xml
deleted file mode 100644
index 1bffaf4..0000000
--- a/design/res/drawable-v21/design_password_eye.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
--->
-
-<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <item
-        android:id="@+id/visible"
-        android:drawable="@drawable/design_ic_visibility"
-        android:state_checked="true"/>
-
-    <item
-        android:id="@+id/masked"
-        android:drawable="@drawable/design_ic_visibility_off"/>
-
-    <transition
-        android:drawable="@drawable/avd_show_password"
-        android:fromId="@id/masked"
-        android:toId="@id/visible"/>
-
-    <transition
-        android:drawable="@drawable/avd_hide_password"
-        android:fromId="@id/visible"
-        android:toId="@id/masked"/>
-
-</animated-selector>
\ No newline at end of file
diff --git a/design/res/drawable-xhdpi/design_ic_visibility.png b/design/res/drawable-xhdpi/design_ic_visibility.png
deleted file mode 100644
index 1f7b4cc..0000000
--- a/design/res/drawable-xhdpi/design_ic_visibility.png
+++ /dev/null
Binary files differ
diff --git a/design/res/drawable-xhdpi/design_ic_visibility_off.png b/design/res/drawable-xhdpi/design_ic_visibility_off.png
deleted file mode 100644
index 46bf0c9..0000000
--- a/design/res/drawable-xhdpi/design_ic_visibility_off.png
+++ /dev/null
Binary files differ
diff --git a/design/res/drawable-xxhdpi/design_ic_visibility.png b/design/res/drawable-xxhdpi/design_ic_visibility.png
deleted file mode 100644
index c816ab4..0000000
--- a/design/res/drawable-xxhdpi/design_ic_visibility.png
+++ /dev/null
Binary files differ
diff --git a/design/res/drawable-xxhdpi/design_ic_visibility_off.png b/design/res/drawable-xxhdpi/design_ic_visibility_off.png
deleted file mode 100644
index 13eb65d..0000000
--- a/design/res/drawable-xxhdpi/design_ic_visibility_off.png
+++ /dev/null
Binary files differ
diff --git a/design/res/drawable-xxxhdpi/design_ic_visibility.png b/design/res/drawable-xxxhdpi/design_ic_visibility.png
deleted file mode 100644
index e005b97..0000000
--- a/design/res/drawable-xxxhdpi/design_ic_visibility.png
+++ /dev/null
Binary files differ
diff --git a/design/res/drawable-xxxhdpi/design_ic_visibility_off.png b/design/res/drawable-xxxhdpi/design_ic_visibility_off.png
deleted file mode 100644
index ce3c9d8..0000000
--- a/design/res/drawable-xxxhdpi/design_ic_visibility_off.png
+++ /dev/null
Binary files differ
diff --git a/design/res/drawable/design_bottom_navigation_item_background.xml b/design/res/drawable/design_bottom_navigation_item_background.xml
deleted file mode 100644
index 7674f42..0000000
--- a/design/res/drawable/design_bottom_navigation_item_background.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
-  -->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_pressed="true">
-        <shape android:shape="rectangle">
-            <solid android:color="#ff0000"/>
-        </shape>
-    </item>
-    <item>
-        <shape android:shape="rectangle">
-            <solid android:color="#ffffff"/>
-        </shape>
-    </item>
-</selector>
\ No newline at end of file
diff --git a/design/res/drawable/design_password_eye.xml b/design/res/drawable/design_password_eye.xml
deleted file mode 100644
index b5185f1..0000000
--- a/design/res/drawable/design_password_eye.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <item
-        android:drawable="@drawable/design_ic_visibility"
-        android:state_checked="true"/>
-
-    <item
-        android:drawable="@drawable/design_ic_visibility_off"/>
-
-</selector>
\ No newline at end of file
diff --git a/design/res/drawable/design_snackbar_background.xml b/design/res/drawable/design_snackbar_background.xml
deleted file mode 100644
index e82441c..0000000
--- a/design/res/drawable/design_snackbar_background.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
-  -->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-       android:shape="rectangle">
-    <corners android:radius="@dimen/design_snackbar_background_corner_radius"/>
-    <solid android:color="@color/design_snackbar_background_color"/>
-</shape>
\ No newline at end of file
diff --git a/design/res/drawable/navigation_empty_icon.xml b/design/res/drawable/navigation_empty_icon.xml
deleted file mode 100644
index 799bd94..0000000
--- a/design/res/drawable/navigation_empty_icon.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
--->
-<shape
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <solid android:color="@android:color/transparent"/>
-    <size
-        android:width="@dimen/design_navigation_icon_size"
-        android:height="@dimen/design_navigation_icon_size" />
-</shape>
diff --git a/design/res/layout-sw600dp/design_layout_snackbar.xml b/design/res/layout-sw600dp/design_layout_snackbar.xml
deleted file mode 100644
index 28835e5..0000000
--- a/design/res/layout-sw600dp/design_layout_snackbar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-
-<view xmlns:android="http://schemas.android.com/apk/res/android"
-      class="android.support.design.widget.Snackbar$SnackbarLayout"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:layout_gravity="bottom|center_horizontal"
-      android:theme="@style/ThemeOverlay.AppCompat.Dark"
-      style="@style/Widget.Design.Snackbar" />
\ No newline at end of file
diff --git a/design/res/layout/design_bottom_navigation_item.xml b/design/res/layout/design_bottom_navigation_item.xml
deleted file mode 100644
index f6212cf..0000000
--- a/design/res/layout/design_bottom_navigation_item.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
-  -->
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-    <ImageView
-        android:id="@+id/icon"
-        android:layout_width="24dp"
-        android:layout_height="24dp"
-        android:layout_gravity="center_horizontal"
-        android:layout_marginTop="@dimen/design_bottom_navigation_margin"
-        android:layout_marginBottom="@dimen/design_bottom_navigation_margin"
-        android:duplicateParentState="true" />
-    <android.support.design.internal.BaselineLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="bottom|center_horizontal"
-        android:clipToPadding="false"
-        android:paddingBottom="10dp"
-        android:duplicateParentState="true">
-        <TextView
-            android:id="@+id/smallLabel"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textSize="@dimen/design_bottom_navigation_text_size"
-            android:singleLine="true"
-            android:duplicateParentState="true" />
-        <TextView
-            android:id="@+id/largeLabel"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:visibility="invisible"
-            android:textSize="@dimen/design_bottom_navigation_active_text_size"
-            android:singleLine="true"
-            android:duplicateParentState="true" />
-    </android.support.design.internal.BaselineLayout>
-</merge>
\ No newline at end of file
diff --git a/design/res/layout/design_bottom_sheet_dialog.xml b/design/res/layout/design_bottom_sheet_dialog.xml
deleted file mode 100644
index 28e023c..0000000
--- a/design/res/layout/design_bottom_sheet_dialog.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/container"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <android.support.design.widget.CoordinatorLayout
-        android:id="@+id/coordinator"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:fitsSystemWindows="true">
-
-        <View
-            android:id="@+id/touch_outside"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:importantForAccessibility="no"
-            android:soundEffectsEnabled="false"
-            tools:ignore="UnusedAttribute"/>
-
-        <FrameLayout
-            android:id="@+id/design_bottom_sheet"
-            style="?attr/bottomSheetStyle"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_horizontal|top"
-            app:layout_behavior="@string/bottom_sheet_behavior"/>
-
-    </android.support.design.widget.CoordinatorLayout>
-
-</FrameLayout>
diff --git a/design/res/layout/design_layout_snackbar.xml b/design/res/layout/design_layout_snackbar.xml
deleted file mode 100644
index 8f3f0d6..0000000
--- a/design/res/layout/design_layout_snackbar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-
-<view xmlns:android="http://schemas.android.com/apk/res/android"
-      class="android.support.design.widget.Snackbar$SnackbarLayout"
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:layout_gravity="bottom"
-      android:theme="@style/ThemeOverlay.AppCompat.Dark"
-      style="@style/Widget.Design.Snackbar" />
\ No newline at end of file
diff --git a/design/res/layout/design_layout_snackbar_include.xml b/design/res/layout/design_layout_snackbar_include.xml
deleted file mode 100644
index fe11d8e..0000000
--- a/design/res/layout/design_layout_snackbar_include.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-
-<view
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    class="android.support.design.internal.SnackbarContentLayout"
-    android:theme="@style/ThemeOverlay.AppCompat.Dark"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_gravity="bottom">
-
-    <TextView
-        android:id="@+id/snackbar_text"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:paddingTop="@dimen/design_snackbar_padding_vertical"
-        android:paddingBottom="@dimen/design_snackbar_padding_vertical"
-        android:paddingLeft="@dimen/design_snackbar_padding_horizontal"
-        android:paddingRight="@dimen/design_snackbar_padding_horizontal"
-        android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
-        android:maxLines="@integer/design_snackbar_text_max_lines"
-        android:layout_gravity="center_vertical|left|start"
-        android:ellipsize="end"
-        android:textAlignment="viewStart"/>
-
-    <Button
-        android:id="@+id/snackbar_action"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginLeft="@dimen/design_snackbar_extra_spacing_horizontal"
-        android:layout_marginStart="@dimen/design_snackbar_extra_spacing_horizontal"
-        android:layout_gravity="center_vertical|right|end"
-        android:minWidth="48dp"
-        android:visibility="gone"
-        android:textColor="?attr/colorAccent"
-        style="?attr/borderlessButtonStyle"/>
-
-</view>
\ No newline at end of file
diff --git a/design/res/layout/design_layout_tab_icon.xml b/design/res/layout/design_layout_tab_icon.xml
deleted file mode 100644
index 5dcfa11..0000000
--- a/design/res/layout/design_layout_tab_icon.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
-  -->
-
-<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
-           android:layout_width="24dp"
-           android:layout_height="24dp"
-           android:scaleType="centerInside"/>
\ No newline at end of file
diff --git a/design/res/layout/design_layout_tab_text.xml b/design/res/layout/design_layout_tab_text.xml
deleted file mode 100644
index a83bb3d..0000000
--- a/design/res/layout/design_layout_tab_text.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:ellipsize="end"
-          android:gravity="center"
-          android:maxLines="2"/>
\ No newline at end of file
diff --git a/design/res/layout/design_menu_item_action_area.xml b/design/res/layout/design_menu_item_action_area.xml
deleted file mode 100644
index ba8141d..0000000
--- a/design/res/layout/design_menu_item_action_area.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-             android:layout_width="wrap_content"
-             android:layout_height="match_parent"/>
diff --git a/design/res/layout/design_navigation_item.xml b/design/res/layout/design_navigation_item.xml
deleted file mode 100644
index ccd42de..0000000
--- a/design/res/layout/design_navigation_item.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<android.support.design.internal.NavigationMenuItemView
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="?attr/listPreferredItemHeightSmall"
-        android:paddingLeft="?attr/listPreferredItemPaddingLeft"
-        android:paddingRight="?attr/listPreferredItemPaddingRight"
-        android:foreground="?attr/selectableItemBackground"
-        android:focusable="true"/>
diff --git a/design/res/layout/design_navigation_item_header.xml b/design/res/layout/design_navigation_item_header.xml
deleted file mode 100644
index 8d03f69..0000000
--- a/design/res/layout/design_navigation_item_header.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-      android:id="@+id/navigation_header_container"
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:orientation="vertical"
-      android:paddingBottom="@dimen/design_navigation_separator_vertical_padding" />
diff --git a/design/res/layout/design_navigation_item_separator.xml b/design/res/layout/design_navigation_item_separator.xml
deleted file mode 100644
index 938a3fb..0000000
--- a/design/res/layout/design_navigation_item_separator.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-             android:layout_width="match_parent"
-             android:layout_height="wrap_content">
-
-    <View android:layout_width="match_parent"
-          android:layout_height="1dp"
-          android:background="?android:attr/listDivider"/>
-
-</FrameLayout>
diff --git a/design/res/layout/design_navigation_item_subheader.xml b/design/res/layout/design_navigation_item_subheader.xml
deleted file mode 100644
index 707ec6a..0000000
--- a/design/res/layout/design_navigation_item_subheader.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
-          android:layout_width="match_parent"
-          android:layout_height="?attr/listPreferredItemHeightSmall"
-          android:gravity="center_vertical|start"
-          android:maxLines="1"
-          android:paddingLeft="?attr/listPreferredItemPaddingLeft"
-          android:paddingRight="?attr/listPreferredItemPaddingRight"
-          android:textAppearance="@style/TextAppearance.AppCompat.Body2"
-          android:textColor="?android:textColorSecondary"/>
diff --git a/design/res/layout/design_navigation_menu_item.xml b/design/res/layout/design_navigation_menu_item.xml
deleted file mode 100644
index 91104bb..0000000
--- a/design/res/layout/design_navigation_menu_item.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <CheckedTextView
-            android:id="@+id/design_menu_item_text"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:drawablePadding="@dimen/design_navigation_icon_padding"
-            android:gravity="center_vertical|start"
-            android:maxLines="1"
-            android:textAppearance="@style/TextAppearance.AppCompat.Body2"/>
-
-    <ViewStub
-            android:id="@+id/design_menu_item_action_area_stub"
-            android:inflatedId="@+id/design_menu_item_action_area"
-            android:layout="@layout/design_menu_item_action_area"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"/>
-
-</merge>
diff --git a/design/res/layout/design_text_input_password_icon.xml b/design/res/layout/design_text_input_password_icon.xml
deleted file mode 100644
index ca1cd09..0000000
--- a/design/res/layout/design_text_input_password_icon.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
--->
-
-<android.support.design.widget.CheckableImageButton
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/text_input_password_toggle"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:layout_gravity="center_vertical|end|right"
-    android:background="?attr/selectableItemBackgroundBorderless"
-    android:minHeight="48dp"
-    android:minWidth="48dp"/>
\ No newline at end of file
diff --git a/design/res/values-sw600dp/dimens.xml b/design/res/values-sw600dp/dimens.xml
deleted file mode 100644
index 9d61f00..0000000
--- a/design/res/values-sw600dp/dimens.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-
-<resources>
-
-    <dimen name="design_tab_scrollable_min_width">160dp</dimen>
-
-    <dimen name="design_snackbar_min_width">320dp</dimen>
-    <dimen name="design_snackbar_max_width">576dp</dimen>
-    <dimen name="design_snackbar_padding_vertical_2lines">@dimen/design_snackbar_padding_vertical</dimen>
-    <dimen name="design_snackbar_extra_spacing_horizontal">24dp</dimen>
-    <dimen name="design_snackbar_background_corner_radius">2dp</dimen>
-    <dimen name="design_snackbar_action_inline_max_width">0dp</dimen>
-
-    <!-- 5 * standard increment (64dp on tablets) -->
-    <dimen name="design_navigation_max_width">320dp</dimen>
-
-</resources>
\ No newline at end of file
diff --git a/design/res/values-sw600dp/styles.xml b/design/res/values-sw600dp/styles.xml
deleted file mode 100644
index 622a5e3..0000000
--- a/design/res/values-sw600dp/styles.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<resources>
-
-    <style name="Widget.Design.TabLayout" parent="Base.Widget.Design.TabLayout">
-        <item name="tabGravity">center</item>
-        <item name="tabMode">fixed</item>
-    </style>
-
-</resources>
-
diff --git a/design/res/values-v21/styles.xml b/design/res/values-v21/styles.xml
deleted file mode 100644
index c692579..0000000
--- a/design/res/values-v21/styles.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
--->
-<resources>
-
-    <style name="Base.Widget.Design.AppBarLayout" parent="Base.V21.Widget.Design.AppBarLayout" />
-
-    <style name="Base.V21.Widget.Design.AppBarLayout" parent="Base.V14.Widget.Design.AppBarLayout">
-        <item name="android:stateListAnimator">@animator/design_appbar_state_list_animator</item>
-    </style>
-
-</resources>
-
diff --git a/design/res/values-v26/styles.xml b/design/res/values-v26/styles.xml
deleted file mode 100644
index f20a058..0000000
--- a/design/res/values-v26/styles.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
-  -->
-
-<resources>
-
-    <style name="Base.Widget.Design.AppBarLayout" parent="Base.V26.Widget.Design.AppBarLayout" />
-
-    <style name="Base.V26.Widget.Design.AppBarLayout" parent="Base.V21.Widget.Design.AppBarLayout">
-        <item name="android:keyboardNavigationCluster">true</item>
-        <item name="android:touchscreenBlocksFocus">true</item>
-    </style>
-
-</resources>
\ No newline at end of file
diff --git a/design/res/values/attrs.xml b/design/res/values/attrs.xml
deleted file mode 100644
index 8c3536f..0000000
--- a/design/res/values/attrs.xml
+++ /dev/null
@@ -1,379 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<resources>
-
-    <declare-styleable name="FloatingActionButton">
-        <!-- Background for the FloatingActionButton -->
-        <attr name="backgroundTint"/>
-        <attr name="backgroundTintMode"/>
-
-        <!-- Ripple color for the FAB. -->
-        <attr name="rippleColor" format="color"/>
-        <!-- Size for the FAB. If fabCustomSize is set, this will be ignored. -->
-        <attr name="fabSize">
-            <!-- A size which will change based on the window size. -->
-            <enum name="auto" value="-1"/>
-            <!-- The normal sized button. -->
-            <enum name="normal" value="0"/>
-            <!-- The mini sized button. -->
-            <enum name="mini" value="1"/>
-        </attr>
-        <!-- Custom size for the FAB. If this is set, fabSize will be ignored. -->
-        <attr name="fabCustomSize" format="dimension"/>
-        <!-- Elevation value for the FAB -->
-        <attr name="elevation"/>
-        <!-- TranslationZ value for the FAB when pressed-->
-        <attr name="pressedTranslationZ" format="dimension"/>
-        <!-- The width of the border around the FAB. -->
-        <attr name="borderWidth" format="dimension"/>
-        <!-- Enable compat padding. -->
-        <attr name="useCompatPadding" format="boolean"/>
-    </declare-styleable>
-
-    <declare-styleable name="FloatingActionButton_Behavior_Layout">
-        <!-- Whether the FAB should automatically hide when there is no space for it. -->
-        <attr name="behavior_autoHide" format="boolean"/>
-    </declare-styleable>
-
-    <declare-styleable name="ScrimInsetsFrameLayout">
-        <attr name="insetForeground" format="color|reference"/>
-    </declare-styleable>
-
-    <declare-styleable name="NavigationView">
-        <attr name="android:background"/>
-        <attr name="android:fitsSystemWindows"/>
-        <attr name="android:maxWidth"/>
-        <attr name="elevation"/>
-        <!-- The menu resource to inflate and populate items from. -->
-        <attr name="menu" format="reference"/>
-        <attr name="itemIconTint" format="color"/>
-        <attr name="itemTextColor" format="color"/>
-        <attr name="itemBackground" format="reference"/>
-        <attr name="itemTextAppearance" format="reference"/>
-        <!-- Layout resource to inflate as the header -->
-        <attr name="headerLayout" format="reference"/>
-    </declare-styleable>
-
-    <declare-styleable name="ForegroundLinearLayout">
-        <attr name="android:foreground" />
-        <attr name="android:foregroundGravity" />
-        <attr name="foregroundInsidePadding" format="boolean" />
-    </declare-styleable>
-
-    <declare-styleable name="TabLayout">
-        <!-- Color of the indicator used to show the currently selected tab. -->
-        <attr name="tabIndicatorColor" format="color"/>
-        <!-- Height of the indicator used to show the currently selected tab. -->
-        <attr name="tabIndicatorHeight" format="dimension"/>
-        <!-- Position in the Y axis from the starting edge that tabs should be positioned from. -->
-        <attr name="tabContentStart" format="dimension"/>
-        <!-- Reference to a background to be applied to tabs. -->
-        <attr name="tabBackground" format="reference"/>
-        <!-- The behavior mode for the Tabs in this layout -->
-        <attr name="tabMode">
-            <enum name="scrollable" value="0"/>
-            <enum name="fixed" value="1"/>
-        </attr>
-        <!-- Gravity constant for tabs. -->
-        <attr name="tabGravity">
-            <enum name="fill" value="0"/>
-            <enum name="center" value="1"/>
-        </attr>
-        <!-- The minimum width for tabs. -->
-        <attr name="tabMinWidth" format="dimension"/>
-        <!-- The maximum width for tabs. -->
-        <attr name="tabMaxWidth" format="dimension"/>
-        <!-- A reference to a TextAppearance style to be applied to tabs. -->
-        <attr name="tabTextAppearance" format="reference"/>
-        <!-- The default text color to be applied to tabs. -->
-        <attr name="tabTextColor" format="color"/>
-        <!-- The text color to be applied to the currently selected tab. -->
-        <attr name="tabSelectedTextColor" format="color"/>
-        <!-- The preferred padding along the start edge of tabs. -->
-        <attr name="tabPaddingStart" format="dimension"/>
-        <!-- The preferred padding along the top edge of tabs. -->
-        <attr name="tabPaddingTop" format="dimension"/>
-        <!-- The preferred padding along the end edge of tabs. -->
-        <attr name="tabPaddingEnd" format="dimension"/>
-        <!-- The preferred padding along the bottom edge of tabs. -->
-        <attr name="tabPaddingBottom" format="dimension"/>
-        <!-- The preferred padding along all edges of tabs. -->
-        <attr name="tabPadding" format="dimension"/>
-    </declare-styleable>
-
-    <declare-styleable name="TabItem">
-        <!-- Text to display in the tab. -->
-        <attr name="android:text" />
-        <!-- Icon to display in the tab. -->
-        <attr name="android:icon" />
-        <!-- A reference to a layout resource to be displayed in the tab. -->
-        <attr name="android:layout" />
-    </declare-styleable>
-
-    <declare-styleable name="TextInputLayout">
-        <attr name="hintTextAppearance" format="reference"/>
-        <!-- The hint to display in the floating label. -->
-        <attr name="android:hint"/>
-        <!-- Whether the layout's floating label functionality is enabled. -->
-        <attr name="hintEnabled" format="boolean"/>
-        <!-- Whether the layout is laid out as if an error will be displayed. -->
-        <attr name="errorEnabled" format="boolean"/>
-        <!-- TextAppearance of any error message displayed. -->
-        <attr name="errorTextAppearance" format="reference"/>
-        <!-- Whether the layout is laid out as if the character counter will be displayed. -->
-        <attr name="counterEnabled" format="boolean"/>
-        <!-- The max length to display in the character counter. -->
-        <attr name="counterMaxLength" format="integer" />
-        <!-- TextAppearance of the character counter. -->
-        <attr name="counterTextAppearance" format="reference"/>
-        <!-- TextAppearance of the character counter when the text is longer than the max. -->
-        <attr name="counterOverflowTextAppearance" format="reference"/>
-        <attr name="android:textColorHint"/>
-        <!-- Whether to animate hint state changes. -->
-        <attr name="hintAnimationEnabled" format="boolean"/>
-        <!-- Whether the view will display a toggle when the EditText has a password. -->
-        <attr name="passwordToggleEnabled" format="boolean"/>
-        <!-- Drawable to use as the password input visibility toggle icon. -->
-        <attr name="passwordToggleDrawable" format="reference"/>
-        <!-- Text to set as the content description for the password input visibility toggle. -->
-        <attr name="passwordToggleContentDescription" format="string"/>
-        <!-- Icon to use for the password input visibility toggle -->
-        <attr name="passwordToggleTint" format="color"/>
-        <!-- Blending mode used to apply the background tint. -->
-        <attr name="passwordToggleTintMode">
-            <!-- The tint is drawn on top of the drawable.
-                 [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc] -->
-            <enum name="src_over" value="3" />
-            <!-- The tint is masked by the alpha channel of the drawable. The drawable’s
-                 color channels are thrown out. [Sa * Da, Sc * Da] -->
-            <enum name="src_in" value="5" />
-            <!-- The tint is drawn above the drawable, but with the drawable’s alpha
-                 channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc] -->
-            <enum name="src_atop" value="9" />
-            <!-- Multiplies the color and alpha channels of the drawable with those of
-                 the tint. [Sa * Da, Sc * Dc] -->
-            <enum name="multiply" value="14" />
-            <!-- [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] -->
-            <enum name="screen" value="15" />
-        </attr>
-    </declare-styleable>
-
-    <declare-styleable name="SnackbarLayout">
-        <attr name="android:maxWidth"/>
-        <attr name="elevation"/>
-        <attr name="maxActionInlineWidth" format="dimension"/>
-    </declare-styleable>
-
-    <declare-styleable name="AppBarLayout">
-        <!-- Deprecated. Elevation is now controlled via a state list animator. -->
-        <attr name="elevation" />
-        <attr name="android:background" />
-        <!-- The initial expanded state for the AppBarLayout. This only takes effect when this
-             view is a direct child of a CoordinatorLayout. -->
-        <attr name="expanded" format="boolean" />
-        <attr name="android:keyboardNavigationCluster" />
-        <attr name="android:touchscreenBlocksFocus" />
-    </declare-styleable>
-
-    <declare-styleable name="AppBarLayoutStates">
-        <!-- State value for {@link android.support.design.widget.AppBarLayout} set when the view
-             has been collapsed. -->
-        <attr name="state_collapsed" format="boolean" />
-        <!-- State value for {@link android.support.design.widget.AppBarLayout} set when the view
-             has children which are capable of being collapsed. -->
-        <attr name="state_collapsible" format="boolean" />
-    </declare-styleable>
-
-    <declare-styleable name="AppBarLayout_Layout">
-        <attr name="layout_scrollFlags">
-            <!-- The view will be scroll in direct relation to scroll events. This flag needs to be
-                 set for any of the other flags to take effect. If any sibling views
-                 before this one do not have this flag, then this value has no effect. -->
-            <flag name="scroll" value="0x1"/>
-
-            <!-- When exiting (scrolling off screen) the view will be scrolled until it is
-                 'collapsed'. The collapsed height is defined by the view's minimum height. -->
-            <flag name="exitUntilCollapsed" value="0x2"/>
-
-            <!-- When entering (scrolling on screen) the view will scroll on any downwards
-                 scroll event, regardless of whether the scrolling view is also scrolling. This
-                 is commonly referred to as the 'quick return' pattern. -->
-            <flag name="enterAlways" value="0x4"/>
-
-            <!-- An additional flag for 'enterAlways' which modifies the returning view to
-                 only initially scroll back to it's collapsed height. Once the scrolling view has
-                 reached the end of it's scroll range, the remainder of this view will be scrolled
-                 into view. -->
-            <flag name="enterAlwaysCollapsed" value="0x8"/>
-
-            <!-- Upon a scroll ending, if the view is only partially visible then it will be
-                 snapped and scrolled to it's closest edge. -->
-            <flag name="snap" value="0x10"/>
-        </attr>
-
-        <!-- An interpolator to use when scrolling this View. Only takes effect when View
-             is scrollable. -->
-        <attr name="layout_scrollInterpolator" format="reference" />
-    </declare-styleable>
-
-    <declare-styleable name="ScrollingViewBehavior_Layout">
-        <!-- The amount that the scrolling view should overlap the bottom of any AppBarLayout -->
-        <attr name="behavior_overlapTop" format="dimension" />
-    </declare-styleable>
-
-    <declare-styleable name="CollapsingToolbarLayout">
-        <!--  Specifies extra space on the start, top, end and bottom
-              sides of the the expanded title text. Margin values should be positive. -->
-        <attr name="expandedTitleMargin" format="dimension"/>
-        <!--  Specifies extra space on the start side of the the expanded title text.
-              Margin values should be positive. -->
-        <attr name="expandedTitleMarginStart" format="dimension"/>
-        <!--  Specifies extra space on the top side of the the expanded title text.
-              Margin values should be positive. -->
-        <attr name="expandedTitleMarginTop" format="dimension"/>
-        <!--  Specifies extra space on the end side of the the expanded title text.
-              Margin values should be positive. -->
-        <attr name="expandedTitleMarginEnd" format="dimension"/>
-        <!--  Specifies extra space on the bottom side of the the expanded title text.
-              Margin values should be positive. -->
-        <attr name="expandedTitleMarginBottom" format="dimension"/>
-        <!-- The text appearance of the CollapsingToolbarLayout's title when it is fully
-             'expanded' -->
-        <attr name="expandedTitleTextAppearance" format="reference"/>
-        <!-- The text appearance of the CollapsingToolbarLayouts title when it is fully
-             'collapsed' -->
-        <attr name="collapsedTitleTextAppearance" format="reference"/>
-        <!-- The drawable to use as a scrim on top of the CollapsingToolbarLayouts content when
-             it has been scrolled sufficiently off screen. -->
-        <attr name="contentScrim" format="color"/>
-        <!-- The drawable to use as a scrim for the status bar content when the
-             CollapsingToolbarLayout has been scrolled sufficiently off screen. Only works on
-             Lollipop with the correct setup. -->
-        <attr name="statusBarScrim" format="color" />
-        <!-- The id of the primary Toolbar child that you wish to use for the purpose of collapsing.
-             This Toolbar descendant view does not need to be a direct child of the layout.
-             If you do not set this, the first direct Toolbar child found will be used. -->
-        <attr name="toolbarId" format="reference"/>
-        <!-- Specifies the amount of visible height in pixels used to define when to trigger a
-             scrim visibility change. -->
-        <attr name="scrimVisibleHeightTrigger" format="dimension"/>
-        <!-- Specifies the duration used for scrim visibility animations. -->
-        <attr name="scrimAnimationDuration" format="integer"/>
-
-        <!-- Specifies how the title should be positioned when collapsed. -->
-        <attr name="collapsedTitleGravity">
-            <!-- Push title to the top of its container, not changing its size. -->
-            <flag name="top" value="0x30"/>
-            <!-- Push title to the bottom of its container, not changing its size. -->
-            <flag name="bottom" value="0x50"/>
-            <!-- Push title to the left of its container, not changing its size. -->
-            <flag name="left" value="0x03"/>
-            <!-- Push title to the right of its container, not changing its size. -->
-            <flag name="right" value="0x05"/>
-            <!-- Place title in the vertical center of its container, not changing its size. -->
-            <flag name="center_vertical" value="0x10"/>
-            <!-- Grow the vertical size of the title if needed so it completely fills its container. -->
-            <flag name="fill_vertical" value="0x70"/>
-            <!-- Place title in the horizontal center of its container, not changing its size. -->
-            <flag name="center_horizontal" value="0x01"/>
-            <!-- Place the title in the center of its container in both the vertical and horizontal axis, not changing its size. -->
-            <flag name="center" value="0x11"/>
-            <!-- Push title to the beginning of its container, not changing its size. -->
-            <flag name="start" value="0x00800003"/>
-            <!-- Push title to the end of its container, not changing its size. -->
-            <flag name="end" value="0x00800005"/>
-        </attr>
-
-        <!-- Specifies how the title should be positioned when expanded. -->
-        <attr name="expandedTitleGravity">
-            <!-- Push title to the top of its container, not changing its size. -->
-            <flag name="top" value="0x30"/>
-            <!-- Push title to the bottom of its container, not changing its size. -->
-            <flag name="bottom" value="0x50"/>
-            <!-- Push title to the left of its container, not changing its size. -->
-            <flag name="left" value="0x03"/>
-            <!-- Push title to the right of its container, not changing its size. -->
-            <flag name="right" value="0x05"/>
-            <!-- Place title in the vertical center of its container, not changing its size. -->
-            <flag name="center_vertical" value="0x10"/>
-            <!-- Grow the vertical size of the title if needed so it completely fills its container. -->
-            <flag name="fill_vertical" value="0x70"/>
-            <!-- Place title in the horizontal center of its container, not changing its size. -->
-            <flag name="center_horizontal" value="0x01"/>
-            <!-- Place the title in the center of its container in both the vertical and horizontal axis, not changing its size. -->
-            <flag name="center" value="0x11"/>
-            <!-- Push title to the beginning of its container, not changing its size. -->
-            <flag name="start" value="0x00800003"/>
-            <!-- Push title to the end of its container, not changing its size. -->
-            <flag name="end" value="0x00800005"/>
-        </attr>
-
-        <!-- Whether the CollapsingToolbarLayout should draw its own shrinking/growing title. -->
-        <attr name="titleEnabled" format="boolean"/>
-        <!-- The title to show when titleEnabled is set to true. -->
-        <attr name="title"/>
-    </declare-styleable>
-
-    <declare-styleable name="CollapsingToolbarLayout_Layout">
-        <attr name="layout_collapseMode">
-            <!-- The view will act as normal with no collapsing behavior. -->
-            <enum name="none" value="0"/>
-            <!-- The view will pin in place. -->
-            <enum name="pin" value="1"/>
-            <!-- The view will scroll in a parallax fashion. See the
-                 layout_collapseParallaxMultiplier attribute to change the multiplier. -->
-            <enum name="parallax" value="2"/>
-        </attr>
-
-        <!-- The multiplier used when layout_collapseMode is set to 'parallax'. The value should
-             be between 0.0 and 1.0. -->
-        <attr name="layout_collapseParallaxMultiplier" format="float"/>
-    </declare-styleable>
-
-    <declare-styleable name="BottomSheetBehavior_Layout">
-        <!-- The height of the bottom sheet when it is collapsed. -->
-        <attr name="behavior_peekHeight" format="dimension">
-            <!-- Peek at the 16:9 ratio keyline of its parent -->
-            <enum name="auto" value="-1"/>
-        </attr>
-        <!-- Whether this bottom sheet can be hidden by dragging it further downwards -->
-        <attr name="behavior_hideable" format="boolean"/>
-        <!-- Skip the collapsed state once expanded; no effect unless it is hideable -->
-        <attr name="behavior_skipCollapsed" format="boolean"/>
-    </declare-styleable>
-
-    <declare-styleable name="DesignTheme">
-        <!-- Theme to use for modal bottom sheet dialogs spawned from this theme. -->
-        <attr name="bottomSheetDialogTheme" format="reference" />
-        <!-- Style to use for modal bottom sheets in this theme. -->
-        <attr name="bottomSheetStyle" format="reference" />
-
-        <!-- Text color used to indicate an error has occurred. -->
-        <!-- {@deprecated Use colorError} -->
-        <attr name="textColorError" format="reference|color" />
-    </declare-styleable>
-
-    <declare-styleable name="BottomNavigationView">
-        <!-- The menu resource to inflate and populate items from. -->
-        <attr name="menu"/>
-        <attr name="itemIconTint"/>
-        <attr name="itemTextColor"/>
-        <attr name="itemBackground"/>
-        <attr name="elevation"/>
-    </declare-styleable>
-
-</resources>
diff --git a/design/res/values/colors.xml b/design/res/values/colors.xml
deleted file mode 100644
index 88fe630..0000000
--- a/design/res/values/colors.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-
-<resources>
-
-    <!-- Color for the top outer pixels in the stroke: 18% white (these are multiplied) -->
-    <color name="design_fab_stroke_top_outer_color">#2EFFFFFF</color>
-    <!-- Color for the top inner pixels in the stroke: 10% white (these are multiplied) -->
-    <color name="design_fab_stroke_top_inner_color">#1AFFFFFF</color>
-    <!-- Color for the bottom outer pixels in the stroke: 6% black (these are multiplied) -->
-    <color name="design_fab_stroke_end_outer_color">#0F000000</color>
-    <!-- Color for the bottom inner pixels in the stroke: 4% black (these are multiplied) -->
-    <color name="design_fab_stroke_end_inner_color">#0A000000</color>
-
-    <!-- Shadow color for the first pixels of a shadow -->
-    <color name="design_fab_shadow_start_color">#44000000</color>
-    <!-- Shadow color for the middle pixels of a shadow -->
-    <color name="design_fab_shadow_mid_color">#14000000</color>
-    <!-- Shadow color for the furthest pixels of a shadow -->
-    <color name="design_fab_shadow_end_color">@android:color/transparent</color>
-
-    <color name="design_snackbar_background_color">#323232</color>
-
-    <color name="design_bottom_navigation_shadow_color">#14000000</color>
-
-</resources>
\ No newline at end of file
diff --git a/design/res/values/config.xml b/design/res/values/config.xml
deleted file mode 100644
index 67635a8..0000000
--- a/design/res/values/config.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-
-<resources>
-
-    <integer name="design_snackbar_text_max_lines">2</integer>
-
-</resources>
\ No newline at end of file
diff --git a/design/res/values/dimens.xml b/design/res/values/dimens.xml
deleted file mode 100644
index de715ce..0000000
--- a/design/res/values/dimens.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<resources>
-
-    <dimen name="design_fab_elevation">6dp</dimen>
-    <dimen name="design_fab_translation_z_pressed">6dp</dimen>
-    <dimen name="design_fab_image_size">24dp</dimen>
-    <dimen name="design_fab_size_normal">56dp</dimen>
-    <dimen name="design_fab_size_mini">40dp</dimen>
-    <dimen name="design_fab_border_width">0.5dp</dimen>
-
-    <!-- 5 * standard increment (56dp) -->
-    <dimen name="design_navigation_max_width">280dp</dimen>
-    <dimen name="design_navigation_elevation">16dp</dimen>
-    <dimen name="design_navigation_icon_padding">32dp</dimen>
-    <dimen name="design_navigation_icon_size">24dp</dimen>
-    <dimen name="design_navigation_separator_vertical_padding">8dp</dimen>
-    <dimen name="design_navigation_padding_bottom">8dp</dimen>
-
-    <dimen name="design_tab_scrollable_min_width">72dp</dimen>
-    <dimen name="design_tab_max_width">264dp</dimen>
-    <dimen name="design_tab_text_size">14sp</dimen>
-    <dimen name="design_tab_text_size_2line">12sp</dimen>
-
-    <dimen name="design_snackbar_min_width">-1px</dimen>
-    <dimen name="design_snackbar_max_width">-1px</dimen>
-    <dimen name="design_snackbar_elevation">6dp</dimen>
-    <dimen name="design_snackbar_background_corner_radius">0dp</dimen>
-
-    <dimen name="design_snackbar_padding_horizontal">12dp</dimen>
-    <dimen name="design_snackbar_padding_vertical">14dp</dimen>
-    <dimen name="design_snackbar_padding_vertical_2lines">24dp</dimen>
-
-    <!-- Extra spacing between the action and message views -->
-    <dimen name="design_snackbar_extra_spacing_horizontal">0dp</dimen>
-    <!-- The maximum width for a Snackbar's inline action. If the view is width than this then
-         the Snackbar will change to vertical stacking -->
-    <dimen name="design_snackbar_action_inline_max_width">128dp</dimen>
-
-    <dimen name="design_snackbar_text_size">14sp</dimen>
-
-    <dimen name="design_appbar_elevation">4dp</dimen>
-
-    <dimen name="design_bottom_sheet_modal_elevation">16dp</dimen>
-    <dimen name="design_bottom_sheet_peek_height_min">64dp</dimen>
-
-    <dimen name="design_bottom_navigation_height">56dp</dimen>
-    <dimen name="design_bottom_navigation_elevation">8dp</dimen>
-    <dimen name="design_bottom_navigation_shadow_height">1dp</dimen>
-    <dimen name="design_bottom_navigation_text_size">12sp</dimen>
-    <dimen name="design_bottom_navigation_active_text_size">14sp</dimen>
-    <dimen name="design_bottom_navigation_margin">8dp</dimen>
-    <dimen name="design_bottom_navigation_item_min_width">56dp</dimen>
-    <dimen name="design_bottom_navigation_item_max_width">96dp</dimen>
-    <dimen name="design_bottom_navigation_active_item_max_width">168dp</dimen>
-
-</resources>
diff --git a/design/res/values/ids.xml b/design/res/values/ids.xml
deleted file mode 100644
index ca90284..0000000
--- a/design/res/values/ids.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<resources>
-
-    <item name="view_offset_helper" type="id" />
-
-    <item name="textinput_error" type="id" />
-    <item name="textinput_counter" type="id" />
-
-</resources>
-
diff --git a/design/res/values/password_visibility.xml b/design/res/values/password_visibility.xml
deleted file mode 100644
index 1c85c1a..0000000
--- a/design/res/values/password_visibility.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
-  -->
-
-<resources>
-
-    <!-- Resources used in the password visibility anim, see @drawable/design_password_eye -->
-    <string name="path_password_eye_mask_visible" translatable="false">M2,4.27 L2,4.27 L4.54,1.73 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z</string>
-    <string name="path_password_eye_mask_strike_through" translatable="false">M2,4.27 L19.73,22 L22.27,19.46 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z</string>
-    <string name="path_password_eye" translatable="false">M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z</string>
-    <string name="path_password_strike_through" translatable="false">M3.27,4.27 L19.74,20.74</string>
-    <integer name="show_password_duration">200</integer>
-    <integer name="hide_password_duration">320</integer>
-
-</resources>
diff --git a/design/res/values/strings.xml b/design/res/values/strings.xml
deleted file mode 100644
index 43a84cd..0000000
--- a/design/res/values/strings.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<resources>
-    <!-- The class name to the ScrollingChildBehavior required for AppBarLayout -->
-    <string name="appbar_scrolling_view_behavior" translatable="false">android.support.design.widget.AppBarLayout$ScrollingViewBehavior</string>
-    <!-- The class name to the BottomSheetBehavior -->
-    <string name="bottom_sheet_behavior" translatable="false">android.support.design.widget.BottomSheetBehavior</string>
-    <!-- The text pattern for the character counter -->
-    <string name="character_counter_pattern" translatable="false">%1$d / %2$d</string>
-    <!-- Content description for the password visibility toggle button. [CHAR LIMIT=NONE] -->
-    <string name="password_toggle_content_description">Toggle password visibility</string>
-</resources>
-
diff --git a/design/res/values/styles.xml b/design/res/values/styles.xml
deleted file mode 100644
index bbb200d..0000000
--- a/design/res/values/styles.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<resources xmlns:tools="http://schemas.android.com/tools">
-
-    <style name="Widget.Design.FloatingActionButton" parent="android:Widget">
-        <item name="android:background">@drawable/design_fab_background</item>
-        <item name="backgroundTint">?attr/colorAccent</item>
-        <item name="fabSize">auto</item>
-        <item name="elevation">@dimen/design_fab_elevation</item>
-        <item name="pressedTranslationZ">@dimen/design_fab_translation_z_pressed</item>
-        <item name="rippleColor">?attr/colorControlHighlight</item>
-        <item name="borderWidth">@dimen/design_fab_border_width</item>
-    </style>
-
-    <style name="Widget.Design.ScrimInsetsFrameLayout" parent="">
-        <item name="insetForeground">#4000</item>
-    </style>
-
-    <style name="Widget.Design.NavigationView" parent="">
-        <item name="elevation">@dimen/design_navigation_elevation</item>
-        <item name="android:background">?android:attr/windowBackground</item>
-        <item name="android:fitsSystemWindows">true</item>
-        <item name="android:maxWidth">@dimen/design_navigation_max_width</item>
-    </style>
-
-    <style name="Widget.Design.TabLayout" parent="Base.Widget.Design.TabLayout">
-        <item name="tabGravity">fill</item>
-        <item name="tabMode">fixed</item>
-    </style>
-
-    <style name="Widget.Design.BottomNavigationView" parent="">
-        <item name="itemBackground">?attr/selectableItemBackgroundBorderless</item>
-        <item name="elevation">@dimen/design_bottom_navigation_elevation</item>
-    </style>
-
-    <style name="Base.Widget.Design.TabLayout" parent="android:Widget">
-        <item name="tabMaxWidth">@dimen/design_tab_max_width</item>
-        <item name="tabIndicatorColor">?attr/colorAccent</item>
-        <item name="tabIndicatorHeight">2dp</item>
-        <item name="tabPaddingStart">12dp</item>
-        <item name="tabPaddingEnd">12dp</item>
-        <item name="tabBackground">?attr/selectableItemBackground</item>
-        <item name="tabTextAppearance">@style/TextAppearance.Design.Tab</item>
-        <item name="tabSelectedTextColor">?android:textColorPrimary</item>
-    </style>
-
-    <style name="TextAppearance.Design.Tab" parent="TextAppearance.AppCompat.Button">
-        <item name="android:textSize">@dimen/design_tab_text_size</item>
-        <item name="android:textColor">?android:textColorSecondary</item>
-        <item name="textAllCaps">true</item>
-    </style>
-
-    <style name="Widget.Design.TextInputLayout" parent="android:Widget">
-        <item name="hintTextAppearance">@style/TextAppearance.Design.Hint</item>
-        <item name="errorTextAppearance">@style/TextAppearance.Design.Error</item>
-        <item name="counterTextAppearance">@style/TextAppearance.Design.Counter</item>
-        <item name="counterOverflowTextAppearance">@style/TextAppearance.Design.Counter.Overflow</item>
-        <item name="passwordToggleDrawable">@drawable/design_password_eye</item>
-        <item name="passwordToggleTint">@color/design_tint_password_toggle</item>
-        <item name="passwordToggleContentDescription">@string/password_toggle_content_description</item>
-    </style>
-
-    <style name="TextAppearance.Design.Hint" parent="TextAppearance.AppCompat.Caption">
-        <item name="android:textColor">?attr/colorControlActivated</item>
-    </style>
-
-    <style name="TextAppearance.Design.Error" parent="TextAppearance.AppCompat.Caption">
-        <item name="android:textColor">@color/design_error</item>
-    </style>
-
-    <style name="TextAppearance.Design.Counter" parent="TextAppearance.AppCompat.Caption"/>
-
-    <style name="TextAppearance.Design.Counter.Overflow" parent="TextAppearance.AppCompat.Caption">
-        <item name="android:textColor">@color/design_error</item>
-    </style>
-
-    <style name="TextAppearance.Design.Snackbar.Message" parent="android:TextAppearance">
-        <item name="android:textSize">@dimen/design_snackbar_text_size</item>
-        <item name="android:textColor">?android:textColorPrimary</item>
-    </style>
-
-    <style name="Widget.Design.Snackbar" parent="android:Widget">
-        <item name="android:minWidth">@dimen/design_snackbar_min_width</item>
-        <item name="android:maxWidth">@dimen/design_snackbar_max_width</item>
-        <item name="android:background">@drawable/design_snackbar_background</item>
-        <item name="android:paddingLeft">@dimen/design_snackbar_padding_horizontal</item>
-        <item name="android:paddingRight">@dimen/design_snackbar_padding_horizontal</item>
-        <item name="elevation">@dimen/design_snackbar_elevation</item>
-        <item name="maxActionInlineWidth">@dimen/design_snackbar_action_inline_max_width</item>
-    </style>
-
-    <style name="Widget.Design.CollapsingToolbar" parent="android:Widget">
-        <item name="expandedTitleMargin">32dp</item>
-        <item name="statusBarScrim">?attr/colorPrimaryDark</item>
-    </style>
-
-    <style name="Base.Widget.Design.AppBarLayout" parent="Base.V14.Widget.Design.AppBarLayout" />
-
-    <style name="Base.V14.Widget.Design.AppBarLayout" parent="android:Widget">
-        <item name="android:background">?attr/colorPrimary</item>
-    </style>
-
-    <style name="Widget.Design.AppBarLayout" parent="Base.Widget.Design.AppBarLayout">
-    </style>
-
-    <style name="Widget.Design.CoordinatorLayout" parent="@style/Widget.Support.CoordinatorLayout">
-        <item name="statusBarBackground">?attr/colorPrimaryDark</item>
-    </style>
-
-    <style name="TextAppearance.Design.CollapsingToolbar.Expanded" parent="TextAppearance.AppCompat.Display1">
-        <item name="android:textColor">?android:attr/textColorPrimary</item>
-    </style>
-
-    <style name="Animation.Design.BottomSheetDialog" parent="Animation.AppCompat.Dialog">
-        <item name="android:windowEnterAnimation">@anim/design_bottom_sheet_slide_in</item>
-        <item name="android:windowExitAnimation">@anim/design_bottom_sheet_slide_out</item>
-    </style>
-
-    <style name="Widget.Design.BottomSheet.Modal" parent="android:Widget">
-        <item name="android:background">?android:attr/colorBackground</item>
-        <item tools:ignore="NewApi" name="android:elevation">@dimen/design_bottom_sheet_modal_elevation</item>
-        <item name="behavior_peekHeight">auto</item>
-        <item name="behavior_hideable">true</item>
-        <item name="behavior_skipCollapsed">false</item>
-    </style>
-
-</resources>
-
diff --git a/design/res/values/themes.xml b/design/res/values/themes.xml
deleted file mode 100644
index aa4c876..0000000
--- a/design/res/values/themes.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2015 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.
--->
-<resources>
-
-    <style name="Theme.Design.BottomSheetDialog" parent="Theme.AppCompat.Dialog">
-        <item name="android:windowBackground">@android:color/transparent</item>
-        <item name="android:windowAnimationStyle">@style/Animation.Design.BottomSheetDialog</item>
-        <item name="bottomSheetStyle">@style/Widget.Design.BottomSheet.Modal</item>
-    </style>
-
-    <style name="Theme.Design.Light.BottomSheetDialog" parent="Theme.AppCompat.Light.Dialog">
-        <item name="android:windowBackground">@android:color/transparent</item>
-        <item name="android:windowAnimationStyle">@style/Animation.Design.BottomSheetDialog</item>
-        <item name="bottomSheetStyle">@style/Widget.Design.BottomSheet.Modal</item>
-    </style>
-
-    <style name="Theme.Design" parent="Theme.AppCompat">
-        <item name="textColorError">?attr/colorError</item>
-        <item name="coordinatorLayoutStyle">@style/Widget.Design.CoordinatorLayout</item>
-    </style>
-
-    <style name="Theme.Design.Light" parent="Theme.AppCompat.Light">
-        <item name="textColorError">?attr/colorError</item>
-        <item name="coordinatorLayoutStyle">@style/Widget.Design.CoordinatorLayout</item>
-    </style>
-
-    <style name="Theme.Design.NoActionBar">
-        <item name="windowActionBar">false</item>
-        <item name="windowNoTitle">true</item>
-    </style>
-
-    <style name="Theme.Design.Light.NoActionBar">
-        <item name="windowActionBar">false</item>
-        <item name="windowNoTitle">true</item>
-    </style>
-
-</resources>
diff --git a/design/src/android/support/design/internal/BaselineLayout.java b/design/src/android/support/design/internal/BaselineLayout.java
deleted file mode 100644
index 0bfdf24..0000000
--- a/design/src/android/support/design/internal/BaselineLayout.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * 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 android.support.design.internal;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-
-/**
- * A simple ViewGroup that aligns all the views inside on a baseline. Note: bottom padding for this
- * view will be measured starting from the baseline.
- *
- * @hide
- */
-public class BaselineLayout extends ViewGroup {
-    private int mBaseline = -1;
-
-    public BaselineLayout(Context context) {
-        super(context, null, 0);
-    }
-
-    public BaselineLayout(Context context, AttributeSet attrs) {
-        super(context, attrs, 0);
-    }
-
-    public BaselineLayout(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        final int count = getChildCount();
-        int maxWidth = 0;
-        int maxHeight = 0;
-        int maxChildBaseline = -1;
-        int maxChildDescent = -1;
-        int childState = 0;
-
-        for (int i = 0; i < count; i++) {
-            final View child = getChildAt(i);
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            measureChild(child, widthMeasureSpec, heightMeasureSpec);
-            final int baseline = child.getBaseline();
-            if (baseline != -1) {
-                maxChildBaseline = Math.max(maxChildBaseline, baseline);
-                maxChildDescent = Math.max(maxChildDescent, child.getMeasuredHeight() - baseline);
-            }
-            maxWidth = Math.max(maxWidth, child.getMeasuredWidth());
-            maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
-            childState = View.combineMeasuredStates(childState, child.getMeasuredState());
-        }
-        if (maxChildBaseline != -1) {
-            maxChildDescent = Math.max(maxChildDescent, getPaddingBottom());
-            maxHeight = Math.max(maxHeight, maxChildBaseline + maxChildDescent);
-            mBaseline = maxChildBaseline;
-        }
-        maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
-        maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());
-        setMeasuredDimension(
-                View.resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
-                View.resolveSizeAndState(maxHeight, heightMeasureSpec,
-                        childState << MEASURED_HEIGHT_STATE_SHIFT));
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
-        final int count = getChildCount();
-        final int parentLeft = getPaddingLeft();
-        final int parentRight = right - left - getPaddingRight();
-        final int parentContentWidth = parentRight - parentLeft;
-        final int parentTop = getPaddingTop();
-
-        for (int i = 0; i < count; i++) {
-            final View child = getChildAt(i);
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            final int width = child.getMeasuredWidth();
-            final int height = child.getMeasuredHeight();
-
-            final int childLeft = parentLeft + (parentContentWidth - width) / 2;
-            final int childTop;
-            if (mBaseline != -1 && child.getBaseline() != -1) {
-                childTop = parentTop + mBaseline - child.getBaseline();
-            } else {
-                childTop = parentTop;
-            }
-
-            child.layout(childLeft, childTop, childLeft + width, childTop + height);
-        }
-    }
-
-    @Override
-    public int getBaseline() {
-        return mBaseline;
-    }
-}
diff --git a/design/src/android/support/design/internal/BottomNavigationItemView.java b/design/src/android/support/design/internal/BottomNavigationItemView.java
deleted file mode 100644
index fe5e636..0000000
--- a/design/src/android/support/design/internal/BottomNavigationItemView.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * 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 android.support.design.internal;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.NonNull;
-import android.support.annotation.RestrictTo;
-import android.support.design.R;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.graphics.drawable.DrawableCompat;
-import android.support.v4.view.PointerIconCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v7.view.menu.MenuItemImpl;
-import android.support.v7.view.menu.MenuView;
-import android.support.v7.widget.TooltipCompat;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-/**
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public class BottomNavigationItemView extends FrameLayout implements MenuView.ItemView {
-    public static final int INVALID_ITEM_POSITION = -1;
-
-    private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked };
-
-    private final int mDefaultMargin;
-    private final int mShiftAmount;
-    private final float mScaleUpFactor;
-    private final float mScaleDownFactor;
-
-    private boolean mShiftingMode;
-
-    private ImageView mIcon;
-    private final TextView mSmallLabel;
-    private final TextView mLargeLabel;
-    private int mItemPosition = INVALID_ITEM_POSITION;
-
-    private MenuItemImpl mItemData;
-
-    private ColorStateList mIconTint;
-
-    public BottomNavigationItemView(@NonNull Context context) {
-        this(context, null);
-    }
-
-    public BottomNavigationItemView(@NonNull Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public BottomNavigationItemView(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        final Resources res = getResources();
-        int inactiveLabelSize =
-                res.getDimensionPixelSize(R.dimen.design_bottom_navigation_text_size);
-        int activeLabelSize = res.getDimensionPixelSize(
-                R.dimen.design_bottom_navigation_active_text_size);
-        mDefaultMargin = res.getDimensionPixelSize(R.dimen.design_bottom_navigation_margin);
-        mShiftAmount = inactiveLabelSize - activeLabelSize;
-        mScaleUpFactor = 1f * activeLabelSize / inactiveLabelSize;
-        mScaleDownFactor = 1f * inactiveLabelSize / activeLabelSize;
-
-        LayoutInflater.from(context).inflate(R.layout.design_bottom_navigation_item, this, true);
-        setBackgroundResource(R.drawable.design_bottom_navigation_item_background);
-        mIcon = findViewById(R.id.icon);
-        mSmallLabel = findViewById(R.id.smallLabel);
-        mLargeLabel = findViewById(R.id.largeLabel);
-    }
-
-    @Override
-    public void initialize(MenuItemImpl itemData, int menuType) {
-        mItemData = itemData;
-        setCheckable(itemData.isCheckable());
-        setChecked(itemData.isChecked());
-        setEnabled(itemData.isEnabled());
-        setIcon(itemData.getIcon());
-        setTitle(itemData.getTitle());
-        setId(itemData.getItemId());
-        setContentDescription(itemData.getContentDescription());
-        TooltipCompat.setTooltipText(this, itemData.getTooltipText());
-    }
-
-    public void setItemPosition(int position) {
-        mItemPosition = position;
-    }
-
-    public int getItemPosition() {
-        return mItemPosition;
-    }
-
-    public void setShiftingMode(boolean enabled) {
-        mShiftingMode = enabled;
-    }
-
-    @Override
-    public MenuItemImpl getItemData() {
-        return mItemData;
-    }
-
-    @Override
-    public void setTitle(CharSequence title) {
-        mSmallLabel.setText(title);
-        mLargeLabel.setText(title);
-    }
-
-    @Override
-    public void setCheckable(boolean checkable) {
-        refreshDrawableState();
-    }
-
-    @Override
-    public void setChecked(boolean checked) {
-        mLargeLabel.setPivotX(mLargeLabel.getWidth() / 2);
-        mLargeLabel.setPivotY(mLargeLabel.getBaseline());
-        mSmallLabel.setPivotX(mSmallLabel.getWidth() / 2);
-        mSmallLabel.setPivotY(mSmallLabel.getBaseline());
-        if (mShiftingMode) {
-            if (checked) {
-                LayoutParams iconParams = (LayoutParams) mIcon.getLayoutParams();
-                iconParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
-                iconParams.topMargin = mDefaultMargin;
-                mIcon.setLayoutParams(iconParams);
-                mLargeLabel.setVisibility(VISIBLE);
-                mLargeLabel.setScaleX(1f);
-                mLargeLabel.setScaleY(1f);
-            } else {
-                LayoutParams iconParams = (LayoutParams) mIcon.getLayoutParams();
-                iconParams.gravity = Gravity.CENTER;
-                iconParams.topMargin = mDefaultMargin;
-                mIcon.setLayoutParams(iconParams);
-                mLargeLabel.setVisibility(INVISIBLE);
-                mLargeLabel.setScaleX(0.5f);
-                mLargeLabel.setScaleY(0.5f);
-            }
-            mSmallLabel.setVisibility(INVISIBLE);
-        } else {
-            if (checked) {
-                LayoutParams iconParams = (LayoutParams) mIcon.getLayoutParams();
-                iconParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
-                iconParams.topMargin = mDefaultMargin + mShiftAmount;
-                mIcon.setLayoutParams(iconParams);
-                mLargeLabel.setVisibility(VISIBLE);
-                mSmallLabel.setVisibility(INVISIBLE);
-
-                mLargeLabel.setScaleX(1f);
-                mLargeLabel.setScaleY(1f);
-                mSmallLabel.setScaleX(mScaleUpFactor);
-                mSmallLabel.setScaleY(mScaleUpFactor);
-            } else {
-                LayoutParams iconParams = (LayoutParams) mIcon.getLayoutParams();
-                iconParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
-                iconParams.topMargin = mDefaultMargin;
-                mIcon.setLayoutParams(iconParams);
-                mLargeLabel.setVisibility(INVISIBLE);
-                mSmallLabel.setVisibility(VISIBLE);
-
-                mLargeLabel.setScaleX(mScaleDownFactor);
-                mLargeLabel.setScaleY(mScaleDownFactor);
-                mSmallLabel.setScaleX(1f);
-                mSmallLabel.setScaleY(1f);
-            }
-        }
-
-        refreshDrawableState();
-    }
-
-    @Override
-    public void setEnabled(boolean enabled) {
-        super.setEnabled(enabled);
-        mSmallLabel.setEnabled(enabled);
-        mLargeLabel.setEnabled(enabled);
-        mIcon.setEnabled(enabled);
-
-        if (enabled) {
-            ViewCompat.setPointerIcon(this,
-                    PointerIconCompat.getSystemIcon(getContext(), PointerIconCompat.TYPE_HAND));
-        } else {
-            ViewCompat.setPointerIcon(this, null);
-        }
-
-    }
-
-    @Override
-    public int[] onCreateDrawableState(final int extraSpace) {
-        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
-        if (mItemData != null && mItemData.isCheckable() && mItemData.isChecked()) {
-            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
-        }
-        return drawableState;
-    }
-
-    @Override
-    public void setShortcut(boolean showShortcut, char shortcutKey) {
-    }
-
-    @Override
-    public void setIcon(Drawable icon) {
-        if (icon != null) {
-            Drawable.ConstantState state = icon.getConstantState();
-            icon = DrawableCompat.wrap(state == null ? icon : state.newDrawable()).mutate();
-            DrawableCompat.setTintList(icon, mIconTint);
-        }
-        mIcon.setImageDrawable(icon);
-    }
-
-    @Override
-    public boolean prefersCondensedTitle() {
-        return false;
-    }
-
-    @Override
-    public boolean showsIcon() {
-        return true;
-    }
-
-    public void setIconTintList(ColorStateList tint) {
-        mIconTint = tint;
-        if (mItemData != null) {
-            // Update the icon so that the tint takes effect
-            setIcon(mItemData.getIcon());
-        }
-    }
-
-    public void setTextColor(ColorStateList color) {
-        mSmallLabel.setTextColor(color);
-        mLargeLabel.setTextColor(color);
-    }
-
-    public void setItemBackground(int background) {
-        Drawable backgroundDrawable = background == 0
-                ? null : ContextCompat.getDrawable(getContext(), background);
-        ViewCompat.setBackground(this, backgroundDrawable);
-    }
-}
diff --git a/design/src/android/support/design/internal/BottomNavigationMenu.java b/design/src/android/support/design/internal/BottomNavigationMenu.java
deleted file mode 100644
index a86d2ad..0000000
--- a/design/src/android/support/design/internal/BottomNavigationMenu.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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 android.support.design.internal;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.support.annotation.RestrictTo;
-import android.support.v7.view.menu.MenuBuilder;
-import android.support.v7.view.menu.MenuItemImpl;
-import android.view.MenuItem;
-import android.view.SubMenu;
-
-/**
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public final class BottomNavigationMenu extends MenuBuilder {
-    public static final int MAX_ITEM_COUNT = 5;
-
-    public BottomNavigationMenu(Context context) {
-        super(context);
-    }
-
-    @Override
-    public SubMenu addSubMenu(int group, int id, int categoryOrder, CharSequence title) {
-        throw new UnsupportedOperationException("BottomNavigationView does not support submenus");
-    }
-
-    @Override
-    protected MenuItem addInternal(int group, int id, int categoryOrder, CharSequence title) {
-        if (size() + 1 > MAX_ITEM_COUNT) {
-            throw new IllegalArgumentException(
-                    "Maximum number of items supported by BottomNavigationView is " + MAX_ITEM_COUNT
-                            + ". Limit can be checked with BottomNavigationView#getMaxItemCount()");
-        }
-        stopDispatchingItemsChanged();
-        final MenuItem item = super.addInternal(group, id, categoryOrder, title);
-        if (item instanceof MenuItemImpl) {
-            ((MenuItemImpl) item).setExclusiveCheckable(true);
-        }
-        startDispatchingItemsChanged();
-        return item;
-    }
-}
diff --git a/design/src/android/support/design/internal/BottomNavigationMenuView.java b/design/src/android/support/design/internal/BottomNavigationMenuView.java
deleted file mode 100644
index bf33454..0000000
--- a/design/src/android/support/design/internal/BottomNavigationMenuView.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * 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 android.support.design.internal;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-import android.support.design.R;
-import android.support.transition.AutoTransition;
-import android.support.transition.TransitionManager;
-import android.support.transition.TransitionSet;
-import android.support.v4.util.Pools;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.animation.FastOutSlowInInterpolator;
-import android.support.v7.view.menu.MenuBuilder;
-import android.support.v7.view.menu.MenuItemImpl;
-import android.support.v7.view.menu.MenuView;
-import android.util.AttributeSet;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-
-/**
- * @hide For internal use only.
- */
-@RestrictTo(LIBRARY_GROUP)
-public class BottomNavigationMenuView extends ViewGroup implements MenuView {
-    private static final long ACTIVE_ANIMATION_DURATION_MS = 115L;
-
-    private final TransitionSet mSet;
-    private final int mInactiveItemMaxWidth;
-    private final int mInactiveItemMinWidth;
-    private final int mActiveItemMaxWidth;
-    private final int mItemHeight;
-    private final OnClickListener mOnClickListener;
-    private final Pools.Pool<BottomNavigationItemView> mItemPool = new Pools.SynchronizedPool<>(5);
-
-    private boolean mShiftingMode = true;
-
-    private BottomNavigationItemView[] mButtons;
-    private int mSelectedItemId = 0;
-    private int mSelectedItemPosition = 0;
-    private ColorStateList mItemIconTint;
-    private ColorStateList mItemTextColor;
-    private int mItemBackgroundRes;
-    private int[] mTempChildWidths;
-
-    private BottomNavigationPresenter mPresenter;
-    private MenuBuilder mMenu;
-
-    public BottomNavigationMenuView(Context context) {
-        this(context, null);
-    }
-
-    public BottomNavigationMenuView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        final Resources res = getResources();
-        mInactiveItemMaxWidth = res.getDimensionPixelSize(
-                R.dimen.design_bottom_navigation_item_max_width);
-        mInactiveItemMinWidth = res.getDimensionPixelSize(
-                R.dimen.design_bottom_navigation_item_min_width);
-        mActiveItemMaxWidth = res.getDimensionPixelSize(
-                R.dimen.design_bottom_navigation_active_item_max_width);
-        mItemHeight = res.getDimensionPixelSize(R.dimen.design_bottom_navigation_height);
-
-        mSet = new AutoTransition();
-        mSet.setOrdering(TransitionSet.ORDERING_TOGETHER);
-        mSet.setDuration(ACTIVE_ANIMATION_DURATION_MS);
-        mSet.setInterpolator(new FastOutSlowInInterpolator());
-        mSet.addTransition(new TextScale());
-
-        mOnClickListener = new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                final BottomNavigationItemView itemView = (BottomNavigationItemView) v;
-                MenuItem item = itemView.getItemData();
-                if (!mMenu.performItemAction(item, mPresenter, 0)) {
-                    item.setChecked(true);
-                }
-            }
-        };
-        mTempChildWidths = new int[BottomNavigationMenu.MAX_ITEM_COUNT];
-    }
-
-    @Override
-    public void initialize(MenuBuilder menu) {
-        mMenu = menu;
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        final int width = MeasureSpec.getSize(widthMeasureSpec);
-        final int count = getChildCount();
-
-        final int heightSpec = MeasureSpec.makeMeasureSpec(mItemHeight, MeasureSpec.EXACTLY);
-
-        if (mShiftingMode) {
-            final int inactiveCount = count - 1;
-            final int activeMaxAvailable = width - inactiveCount * mInactiveItemMinWidth;
-            final int activeWidth = Math.min(activeMaxAvailable, mActiveItemMaxWidth);
-            final int inactiveMaxAvailable = (width - activeWidth) / inactiveCount;
-            final int inactiveWidth = Math.min(inactiveMaxAvailable, mInactiveItemMaxWidth);
-            int extra = width - activeWidth - inactiveWidth * inactiveCount;
-            for (int i = 0; i < count; i++) {
-                mTempChildWidths[i] = (i == mSelectedItemPosition) ? activeWidth : inactiveWidth;
-                if (extra > 0) {
-                    mTempChildWidths[i]++;
-                    extra--;
-                }
-            }
-        } else {
-            final int maxAvailable = width / (count == 0 ? 1 : count);
-            final int childWidth = Math.min(maxAvailable, mActiveItemMaxWidth);
-            int extra = width - childWidth * count;
-            for (int i = 0; i < count; i++) {
-                mTempChildWidths[i] = childWidth;
-                if (extra > 0) {
-                    mTempChildWidths[i]++;
-                    extra--;
-                }
-            }
-        }
-
-        int totalWidth = 0;
-        for (int i = 0; i < count; i++) {
-            final View child = getChildAt(i);
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-            child.measure(MeasureSpec.makeMeasureSpec(mTempChildWidths[i], MeasureSpec.EXACTLY),
-                    heightSpec);
-            ViewGroup.LayoutParams params = child.getLayoutParams();
-            params.width = child.getMeasuredWidth();
-            totalWidth += child.getMeasuredWidth();
-        }
-        setMeasuredDimension(
-                View.resolveSizeAndState(totalWidth,
-                        MeasureSpec.makeMeasureSpec(totalWidth, MeasureSpec.EXACTLY), 0),
-                View.resolveSizeAndState(mItemHeight, heightSpec, 0));
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
-        final int count = getChildCount();
-        final int width = right - left;
-        final int height = bottom - top;
-        int used = 0;
-        for (int i = 0; i < count; i++) {
-            final View child = getChildAt(i);
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-            if (ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL) {
-                child.layout(width - used - child.getMeasuredWidth(), 0, width - used, height);
-            } else {
-                child.layout(used, 0, child.getMeasuredWidth() + used, height);
-            }
-            used += child.getMeasuredWidth();
-        }
-    }
-
-    @Override
-    public int getWindowAnimations() {
-        return 0;
-    }
-
-    /**
-     * Sets the tint which is applied to the menu items' icons.
-     *
-     * @param tint the tint to apply
-     */
-    public void setIconTintList(ColorStateList tint) {
-        mItemIconTint = tint;
-        if (mButtons == null) return;
-        for (BottomNavigationItemView item : mButtons) {
-            item.setIconTintList(tint);
-        }
-    }
-
-    /**
-     * Returns the tint which is applied to menu items' icons.
-     *
-     * @return the ColorStateList that is used to tint menu items' icons
-     */
-    @Nullable
-    public ColorStateList getIconTintList() {
-        return mItemIconTint;
-    }
-
-    /**
-     * Sets the text color to be used on menu items.
-     *
-     * @param color the ColorStateList used for menu items' text.
-     */
-    public void setItemTextColor(ColorStateList color) {
-        mItemTextColor = color;
-        if (mButtons == null) return;
-        for (BottomNavigationItemView item : mButtons) {
-            item.setTextColor(color);
-        }
-    }
-
-    /**
-     * Returns the text color used on menu items.
-     *
-     * @return the ColorStateList used for menu items' text
-     */
-    public ColorStateList getItemTextColor() {
-        return mItemTextColor;
-    }
-
-    /**
-     * Sets the resource ID to be used for item background.
-     *
-     * @param background the resource ID of the background
-     */
-    public void setItemBackgroundRes(int background) {
-        mItemBackgroundRes = background;
-        if (mButtons == null) return;
-        for (BottomNavigationItemView item : mButtons) {
-            item.setItemBackground(background);
-        }
-    }
-
-    /**
-     * Returns the resource ID for the background of the menu items.
-     *
-     * @return the resource ID for the background
-     */
-    public int getItemBackgroundRes() {
-        return mItemBackgroundRes;
-    }
-
-    public void setPresenter(BottomNavigationPresenter presenter) {
-        mPresenter = presenter;
-    }
-
-    public void buildMenuView() {
-        removeAllViews();
-        if (mButtons != null) {
-            for (BottomNavigationItemView item : mButtons) {
-                mItemPool.release(item);
-            }
-        }
-        if (mMenu.size() == 0) {
-            mSelectedItemId = 0;
-            mSelectedItemPosition = 0;
-            mButtons = null;
-            return;
-        }
-        mButtons = new BottomNavigationItemView[mMenu.size()];
-        mShiftingMode = mMenu.size() > 3;
-        for (int i = 0; i < mMenu.size(); i++) {
-            mPresenter.setUpdateSuspended(true);
-            mMenu.getItem(i).setCheckable(true);
-            mPresenter.setUpdateSuspended(false);
-            BottomNavigationItemView child = getNewItem();
-            mButtons[i] = child;
-            child.setIconTintList(mItemIconTint);
-            child.setTextColor(mItemTextColor);
-            child.setItemBackground(mItemBackgroundRes);
-            child.setShiftingMode(mShiftingMode);
-            child.initialize((MenuItemImpl) mMenu.getItem(i), 0);
-            child.setItemPosition(i);
-            child.setOnClickListener(mOnClickListener);
-            addView(child);
-        }
-        mSelectedItemPosition = Math.min(mMenu.size() - 1, mSelectedItemPosition);
-        mMenu.getItem(mSelectedItemPosition).setChecked(true);
-    }
-
-    public void updateMenuView() {
-        final int menuSize = mMenu.size();
-        if (menuSize != mButtons.length) {
-            // The size has changed. Rebuild menu view from scratch.
-            buildMenuView();
-            return;
-        }
-        int previousSelectedId = mSelectedItemId;
-
-        for (int i = 0; i < menuSize; i++) {
-            MenuItem item = mMenu.getItem(i);
-            if (item.isChecked()) {
-                mSelectedItemId = item.getItemId();
-                mSelectedItemPosition = i;
-            }
-        }
-        if (previousSelectedId != mSelectedItemId) {
-            // Note: this has to be called before BottomNavigationItemView#initialize().
-            TransitionManager.beginDelayedTransition(this, mSet);
-        }
-
-        for (int i = 0; i < menuSize; i++) {
-            mPresenter.setUpdateSuspended(true);
-            mButtons[i].initialize((MenuItemImpl) mMenu.getItem(i), 0);
-            mPresenter.setUpdateSuspended(false);
-        }
-
-    }
-
-    private BottomNavigationItemView getNewItem() {
-        BottomNavigationItemView item = mItemPool.acquire();
-        if (item == null) {
-            item = new BottomNavigationItemView(getContext());
-        }
-        return item;
-    }
-
-    public int getSelectedItemId() {
-        return mSelectedItemId;
-    }
-
-    void tryRestoreSelectedItemId(int itemId) {
-        final int size = mMenu.size();
-        for (int i = 0; i < size; i++) {
-            MenuItem item = mMenu.getItem(i);
-            if (itemId == item.getItemId()) {
-                mSelectedItemId = itemId;
-                mSelectedItemPosition = i;
-                item.setChecked(true);
-                break;
-            }
-        }
-    }
-}
diff --git a/design/src/android/support/design/internal/BottomNavigationPresenter.java b/design/src/android/support/design/internal/BottomNavigationPresenter.java
deleted file mode 100644
index 1343a4b..0000000
--- a/design/src/android/support/design/internal/BottomNavigationPresenter.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * 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 android.support.design.internal;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.annotation.NonNull;
-import android.support.annotation.RestrictTo;
-import android.support.v7.view.menu.MenuBuilder;
-import android.support.v7.view.menu.MenuItemImpl;
-import android.support.v7.view.menu.MenuPresenter;
-import android.support.v7.view.menu.MenuView;
-import android.support.v7.view.menu.SubMenuBuilder;
-import android.view.ViewGroup;
-
-/**
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public class BottomNavigationPresenter implements MenuPresenter {
-    private MenuBuilder mMenu;
-    private BottomNavigationMenuView mMenuView;
-    private boolean mUpdateSuspended = false;
-    private int mId;
-
-    public void setBottomNavigationMenuView(BottomNavigationMenuView menuView) {
-        mMenuView = menuView;
-    }
-
-    @Override
-    public void initForMenu(Context context, MenuBuilder menu) {
-        mMenuView.initialize(mMenu);
-        mMenu = menu;
-    }
-
-    @Override
-    public MenuView getMenuView(ViewGroup root) {
-        return mMenuView;
-    }
-
-    @Override
-    public void updateMenuView(boolean cleared) {
-        if (mUpdateSuspended) return;
-        if (cleared) {
-            mMenuView.buildMenuView();
-        } else {
-            mMenuView.updateMenuView();
-        }
-    }
-
-    @Override
-    public void setCallback(Callback cb) {}
-
-    @Override
-    public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
-        return false;
-    }
-
-    @Override
-    public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {}
-
-    @Override
-    public boolean flagActionItems() {
-        return false;
-    }
-
-    @Override
-    public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) {
-        return false;
-    }
-
-    @Override
-    public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) {
-        return false;
-    }
-
-    public void setId(int id) {
-        mId = id;
-    }
-
-    @Override
-    public int getId() {
-        return mId;
-    }
-
-    @Override
-    public Parcelable onSaveInstanceState() {
-        SavedState savedState = new SavedState();
-        savedState.selectedItemId = mMenuView.getSelectedItemId();
-        return savedState;
-    }
-
-    @Override
-    public void onRestoreInstanceState(Parcelable state) {
-        if (state instanceof SavedState) {
-            mMenuView.tryRestoreSelectedItemId(((SavedState) state).selectedItemId);
-        }
-    }
-
-    public void setUpdateSuspended(boolean updateSuspended) {
-        mUpdateSuspended = updateSuspended;
-    }
-
-    static class SavedState implements Parcelable {
-        int selectedItemId;
-
-        SavedState() {}
-
-        SavedState(Parcel in) {
-            selectedItemId = in.readInt();
-        }
-
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        @Override
-        public void writeToParcel(@NonNull Parcel out, int flags) {
-            out.writeInt(selectedItemId);
-        }
-
-        public static final Creator<SavedState> CREATOR = new Creator<SavedState>() {
-            @Override
-            public SavedState createFromParcel(Parcel in) {
-                return new SavedState(in);
-            }
-
-            @Override
-            public SavedState[] newArray(int size) {
-                return new SavedState[size];
-            }
-        };
-    }
-}
diff --git a/design/src/android/support/design/internal/ForegroundLinearLayout.java b/design/src/android/support/design/internal/ForegroundLinearLayout.java
deleted file mode 100644
index 6d90503..0000000
--- a/design/src/android/support/design/internal/ForegroundLinearLayout.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.internal;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RestrictTo;
-import android.support.design.R;
-import android.support.v7.widget.LinearLayoutCompat;
-import android.util.AttributeSet;
-import android.view.Gravity;
-
-/**
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public class ForegroundLinearLayout extends LinearLayoutCompat {
-
-    private Drawable mForeground;
-
-    private final Rect mSelfBounds = new Rect();
-
-    private final Rect mOverlayBounds = new Rect();
-
-    private int mForegroundGravity = Gravity.FILL;
-
-    protected boolean mForegroundInPadding = true;
-
-    boolean mForegroundBoundsChanged = false;
-
-    public ForegroundLinearLayout(Context context) {
-        this(context, null);
-    }
-
-    public ForegroundLinearLayout(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public ForegroundLinearLayout(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-
-        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ForegroundLinearLayout,
-                defStyle, 0);
-
-        mForegroundGravity = a.getInt(
-                R.styleable.ForegroundLinearLayout_android_foregroundGravity, mForegroundGravity);
-
-        final Drawable d = a.getDrawable(R.styleable.ForegroundLinearLayout_android_foreground);
-        if (d != null) {
-            setForeground(d);
-        }
-
-        mForegroundInPadding = a.getBoolean(
-                R.styleable.ForegroundLinearLayout_foregroundInsidePadding, true);
-
-        a.recycle();
-    }
-
-    /**
-     * Describes how the foreground is positioned.
-     *
-     * @return foreground gravity.
-     * @see #setForegroundGravity(int)
-     */
-    @Override
-    public int getForegroundGravity() {
-        return mForegroundGravity;
-    }
-
-    /**
-     * Describes how the foreground is positioned. Defaults to START and TOP.
-     *
-     * @param foregroundGravity See {@link android.view.Gravity}
-     * @see #getForegroundGravity()
-     */
-    @Override
-    public void setForegroundGravity(int foregroundGravity) {
-        if (mForegroundGravity != foregroundGravity) {
-            if ((foregroundGravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) == 0) {
-                foregroundGravity |= Gravity.START;
-            }
-
-            if ((foregroundGravity & Gravity.VERTICAL_GRAVITY_MASK) == 0) {
-                foregroundGravity |= Gravity.TOP;
-            }
-
-            mForegroundGravity = foregroundGravity;
-
-            if (mForegroundGravity == Gravity.FILL && mForeground != null) {
-                Rect padding = new Rect();
-                mForeground.getPadding(padding);
-            }
-
-            requestLayout();
-        }
-    }
-
-    @Override
-    protected boolean verifyDrawable(Drawable who) {
-        return super.verifyDrawable(who) || (who == mForeground);
-    }
-
-    @RequiresApi(11)
-    @Override
-    public void jumpDrawablesToCurrentState() {
-        super.jumpDrawablesToCurrentState();
-        if (mForeground != null) {
-            mForeground.jumpToCurrentState();
-        }
-    }
-
-    @Override
-    protected void drawableStateChanged() {
-        super.drawableStateChanged();
-        if (mForeground != null && mForeground.isStateful()) {
-            mForeground.setState(getDrawableState());
-        }
-    }
-
-    /**
-     * Supply a Drawable that is to be rendered on top of all of the child
-     * views in the frame layout.  Any padding in the Drawable will be taken
-     * into account by ensuring that the children are inset to be placed
-     * inside of the padding area.
-     *
-     * @param drawable The Drawable to be drawn on top of the children.
-     */
-    @Override
-    public void setForeground(Drawable drawable) {
-        if (mForeground != drawable) {
-            if (mForeground != null) {
-                mForeground.setCallback(null);
-                unscheduleDrawable(mForeground);
-            }
-
-            mForeground = drawable;
-
-            if (drawable != null) {
-                setWillNotDraw(false);
-                drawable.setCallback(this);
-                if (drawable.isStateful()) {
-                    drawable.setState(getDrawableState());
-                }
-                if (mForegroundGravity == Gravity.FILL) {
-                    Rect padding = new Rect();
-                    drawable.getPadding(padding);
-                }
-            } else {
-                setWillNotDraw(true);
-            }
-            requestLayout();
-            invalidate();
-        }
-    }
-
-    /**
-     * Returns the drawable used as the foreground of this FrameLayout. The
-     * foreground drawable, if non-null, is always drawn on top of the children.
-     *
-     * @return A Drawable or null if no foreground was set.
-     */
-    @Override
-    public Drawable getForeground() {
-        return mForeground;
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
-        super.onLayout(changed, left, top, right, bottom);
-        mForegroundBoundsChanged |= changed;
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-        mForegroundBoundsChanged = true;
-    }
-
-    @Override
-    public void draw(@NonNull Canvas canvas) {
-        super.draw(canvas);
-
-        if (mForeground != null) {
-            final Drawable foreground = mForeground;
-
-            if (mForegroundBoundsChanged) {
-                mForegroundBoundsChanged = false;
-                final Rect selfBounds = mSelfBounds;
-                final Rect overlayBounds = mOverlayBounds;
-
-                final int w = getRight() - getLeft();
-                final int h = getBottom() - getTop();
-
-                if (mForegroundInPadding) {
-                    selfBounds.set(0, 0, w, h);
-                } else {
-                    selfBounds.set(getPaddingLeft(), getPaddingTop(),
-                            w - getPaddingRight(), h - getPaddingBottom());
-                }
-
-                Gravity.apply(mForegroundGravity, foreground.getIntrinsicWidth(),
-                        foreground.getIntrinsicHeight(), selfBounds, overlayBounds);
-                foreground.setBounds(overlayBounds);
-            }
-
-            foreground.draw(canvas);
-        }
-    }
-
-    @RequiresApi(21)
-    @Override
-    public void drawableHotspotChanged(float x, float y) {
-        super.drawableHotspotChanged(x, y);
-        if (mForeground != null) {
-            mForeground.setHotspot(x, y);
-        }
-    }
-
-}
diff --git a/design/src/android/support/design/internal/NavigationMenu.java b/design/src/android/support/design/internal/NavigationMenu.java
deleted file mode 100644
index a0ec5e0..0000000
--- a/design/src/android/support/design/internal/NavigationMenu.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.internal;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.support.annotation.RestrictTo;
-import android.support.v7.view.menu.MenuBuilder;
-import android.support.v7.view.menu.MenuItemImpl;
-import android.support.v7.view.menu.SubMenuBuilder;
-import android.view.SubMenu;
-
-/**
- * This is a {@link MenuBuilder} that returns an instance of {@link NavigationSubMenu} instead of
- * {@link SubMenuBuilder} when a sub menu is created.
- *
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public class NavigationMenu extends MenuBuilder {
-
-    public NavigationMenu(Context context) {
-        super(context);
-    }
-
-    @Override
-    public SubMenu addSubMenu(int group, int id, int categoryOrder, CharSequence title) {
-        final MenuItemImpl item = (MenuItemImpl) addInternal(group, id, categoryOrder, title);
-        final SubMenuBuilder subMenu = new NavigationSubMenu(getContext(), this, item);
-        item.setSubMenu(subMenu);
-        return subMenu;
-    }
-
-}
diff --git a/design/src/android/support/design/internal/NavigationMenuItemView.java b/design/src/android/support/design/internal/NavigationMenuItemView.java
deleted file mode 100644
index eea9e90..0000000
--- a/design/src/android/support/design/internal/NavigationMenuItemView.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.internal;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.Color;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.StateListDrawable;
-import android.support.annotation.RestrictTo;
-import android.support.design.R;
-import android.support.v4.content.res.ResourcesCompat;
-import android.support.v4.graphics.drawable.DrawableCompat;
-import android.support.v4.view.AccessibilityDelegateCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.accessibility.AccessibilityEventCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.support.v4.widget.TextViewCompat;
-import android.support.v7.view.menu.MenuItemImpl;
-import android.support.v7.view.menu.MenuView;
-import android.support.v7.widget.TooltipCompat;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewStub;
-import android.widget.CheckedTextView;
-import android.widget.FrameLayout;
-
-/**
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public class NavigationMenuItemView extends ForegroundLinearLayout implements MenuView.ItemView {
-
-    private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};
-
-    private final int mIconSize;
-
-    private boolean mNeedsEmptyIcon;
-
-    boolean mCheckable;
-
-    private final CheckedTextView mTextView;
-
-    private FrameLayout mActionArea;
-
-    private MenuItemImpl mItemData;
-
-    private ColorStateList mIconTintList;
-
-    private boolean mHasIconTintList;
-
-    private Drawable mEmptyDrawable;
-
-    private final AccessibilityDelegateCompat mAccessibilityDelegate
-            = new AccessibilityDelegateCompat() {
-
-        @Override
-        public void onInitializeAccessibilityNodeInfo(View host,
-                AccessibilityNodeInfoCompat info) {
-            super.onInitializeAccessibilityNodeInfo(host, info);
-            info.setCheckable(mCheckable);
-        }
-
-    };
-
-    public NavigationMenuItemView(Context context) {
-        this(context, null);
-    }
-
-    public NavigationMenuItemView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public NavigationMenuItemView(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        setOrientation(HORIZONTAL);
-        LayoutInflater.from(context).inflate(R.layout.design_navigation_menu_item, this, true);
-        mIconSize = context.getResources().getDimensionPixelSize(
-                R.dimen.design_navigation_icon_size);
-        mTextView = findViewById(R.id.design_menu_item_text);
-        mTextView.setDuplicateParentStateEnabled(true);
-        ViewCompat.setAccessibilityDelegate(mTextView, mAccessibilityDelegate);
-    }
-
-    @Override
-    public void initialize(MenuItemImpl itemData, int menuType) {
-        mItemData = itemData;
-
-        setVisibility(itemData.isVisible() ? VISIBLE : GONE);
-
-        if (getBackground() == null) {
-            ViewCompat.setBackground(this, createDefaultBackground());
-        }
-
-        setCheckable(itemData.isCheckable());
-        setChecked(itemData.isChecked());
-        setEnabled(itemData.isEnabled());
-        setTitle(itemData.getTitle());
-        setIcon(itemData.getIcon());
-        setActionView(itemData.getActionView());
-        setContentDescription(itemData.getContentDescription());
-        TooltipCompat.setTooltipText(this, itemData.getTooltipText());
-        adjustAppearance();
-    }
-
-    private boolean shouldExpandActionArea() {
-        return mItemData.getTitle() == null &&
-                mItemData.getIcon() == null &&
-                mItemData.getActionView() != null;
-    }
-
-    private void adjustAppearance() {
-        if (shouldExpandActionArea()) {
-            // Expand the actionView area
-            mTextView.setVisibility(View.GONE);
-            if (mActionArea != null) {
-                LayoutParams params = (LayoutParams) mActionArea.getLayoutParams();
-                params.width = LayoutParams.MATCH_PARENT;
-                mActionArea.setLayoutParams(params);
-            }
-        } else {
-            mTextView.setVisibility(View.VISIBLE);
-            if (mActionArea != null) {
-                LayoutParams params = (LayoutParams) mActionArea.getLayoutParams();
-                params.width = LayoutParams.WRAP_CONTENT;
-                mActionArea.setLayoutParams(params);
-            }
-        }
-    }
-
-    public void recycle() {
-        if (mActionArea != null) {
-            mActionArea.removeAllViews();
-        }
-        mTextView.setCompoundDrawables(null, null, null, null);
-    }
-
-    private void setActionView(View actionView) {
-        if (actionView != null) {
-            if (mActionArea == null) {
-                mActionArea = (FrameLayout) ((ViewStub) findViewById(
-                        R.id.design_menu_item_action_area_stub)).inflate();
-            }
-            mActionArea.removeAllViews();
-            mActionArea.addView(actionView);
-        }
-    }
-
-    private StateListDrawable createDefaultBackground() {
-        TypedValue value = new TypedValue();
-        if (getContext().getTheme().resolveAttribute(
-                android.support.v7.appcompat.R.attr.colorControlHighlight, value, true)) {
-            StateListDrawable drawable = new StateListDrawable();
-            drawable.addState(CHECKED_STATE_SET, new ColorDrawable(value.data));
-            drawable.addState(EMPTY_STATE_SET, new ColorDrawable(Color.TRANSPARENT));
-            return drawable;
-        }
-        return null;
-    }
-
-    @Override
-    public MenuItemImpl getItemData() {
-        return mItemData;
-    }
-
-    @Override
-    public void setTitle(CharSequence title) {
-        mTextView.setText(title);
-    }
-
-    @Override
-    public void setCheckable(boolean checkable) {
-        refreshDrawableState();
-        if (mCheckable != checkable) {
-            mCheckable = checkable;
-            mAccessibilityDelegate.sendAccessibilityEvent(mTextView,
-                    AccessibilityEventCompat.TYPE_WINDOW_CONTENT_CHANGED);
-        }
-    }
-
-    @Override
-    public void setChecked(boolean checked) {
-        refreshDrawableState();
-        mTextView.setChecked(checked);
-    }
-
-    @Override
-    public void setShortcut(boolean showShortcut, char shortcutKey) {
-    }
-
-    @Override
-    public void setIcon(Drawable icon) {
-        if (icon != null) {
-            if (mHasIconTintList) {
-                Drawable.ConstantState state = icon.getConstantState();
-                icon = DrawableCompat.wrap(state == null ? icon : state.newDrawable()).mutate();
-                DrawableCompat.setTintList(icon, mIconTintList);
-            }
-            icon.setBounds(0, 0, mIconSize, mIconSize);
-        } else if (mNeedsEmptyIcon) {
-            if (mEmptyDrawable == null) {
-                mEmptyDrawable = ResourcesCompat.getDrawable(getResources(),
-                        R.drawable.navigation_empty_icon, getContext().getTheme());
-                if (mEmptyDrawable != null) {
-                    mEmptyDrawable.setBounds(0, 0, mIconSize, mIconSize);
-                }
-            }
-            icon = mEmptyDrawable;
-        }
-        TextViewCompat.setCompoundDrawablesRelative(mTextView, icon, null, null, null);
-    }
-
-    @Override
-    public boolean prefersCondensedTitle() {
-        return false;
-    }
-
-    @Override
-    public boolean showsIcon() {
-        return true;
-    }
-
-    @Override
-    protected int[] onCreateDrawableState(int extraSpace) {
-        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
-        if (mItemData != null && mItemData.isCheckable() && mItemData.isChecked()) {
-            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
-        }
-        return drawableState;
-    }
-
-    void setIconTintList(ColorStateList tintList) {
-        mIconTintList = tintList;
-        mHasIconTintList = mIconTintList != null;
-        if (mItemData != null) {
-            // Update the icon so that the tint takes effect
-            setIcon(mItemData.getIcon());
-        }
-    }
-
-    public void setTextAppearance(int textAppearance) {
-        TextViewCompat.setTextAppearance(mTextView, textAppearance);
-    }
-
-    public void setTextColor(ColorStateList colors) {
-        mTextView.setTextColor(colors);
-    }
-
-    public void setNeedsEmptyIcon(boolean needsEmptyIcon) {
-        mNeedsEmptyIcon = needsEmptyIcon;
-    }
-
-}
diff --git a/design/src/android/support/design/internal/NavigationMenuPresenter.java b/design/src/android/support/design/internal/NavigationMenuPresenter.java
deleted file mode 100644
index 98ad468..0000000
--- a/design/src/android/support/design/internal/NavigationMenuPresenter.java
+++ /dev/null
@@ -1,686 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.internal;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-import android.support.annotation.StyleRes;
-import android.support.design.R;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.WindowInsetsCompat;
-import android.support.v7.view.menu.MenuBuilder;
-import android.support.v7.view.menu.MenuItemImpl;
-import android.support.v7.view.menu.MenuPresenter;
-import android.support.v7.view.menu.MenuView;
-import android.support.v7.view.menu.SubMenuBuilder;
-import android.support.v7.widget.RecyclerView;
-import android.util.SparseArray;
-import android.view.LayoutInflater;
-import android.view.SubMenu;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-
-/**
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public class NavigationMenuPresenter implements MenuPresenter {
-
-    private static final String STATE_HIERARCHY = "android:menu:list";
-    private static final String STATE_ADAPTER = "android:menu:adapter";
-    private static final String STATE_HEADER = "android:menu:header";
-
-    private NavigationMenuView mMenuView;
-    LinearLayout mHeaderLayout;
-
-    private Callback mCallback;
-    MenuBuilder mMenu;
-    private int mId;
-
-    NavigationMenuAdapter mAdapter;
-    LayoutInflater mLayoutInflater;
-
-    int mTextAppearance;
-    boolean mTextAppearanceSet;
-    ColorStateList mTextColor;
-    ColorStateList mIconTintList;
-    Drawable mItemBackground;
-
-    /**
-     * Padding to be inserted at the top of the list to avoid the first menu item
-     * from being placed underneath the status bar.
-     */
-    private int mPaddingTopDefault;
-
-    /**
-     * Padding for separators between items
-     */
-    int mPaddingSeparator;
-
-    @Override
-    public void initForMenu(Context context, MenuBuilder menu) {
-        mLayoutInflater = LayoutInflater.from(context);
-        mMenu = menu;
-        Resources res = context.getResources();
-        mPaddingSeparator = res.getDimensionPixelOffset(
-                R.dimen.design_navigation_separator_vertical_padding);
-    }
-
-    @Override
-    public MenuView getMenuView(ViewGroup root) {
-        if (mMenuView == null) {
-            mMenuView = (NavigationMenuView) mLayoutInflater.inflate(
-                    R.layout.design_navigation_menu, root, false);
-            if (mAdapter == null) {
-                mAdapter = new NavigationMenuAdapter();
-            }
-            mHeaderLayout = (LinearLayout) mLayoutInflater
-                    .inflate(R.layout.design_navigation_item_header,
-                            mMenuView, false);
-            mMenuView.setAdapter(mAdapter);
-        }
-        return mMenuView;
-    }
-
-    @Override
-    public void updateMenuView(boolean cleared) {
-        if (mAdapter != null) {
-            mAdapter.update();
-        }
-    }
-
-    @Override
-    public void setCallback(Callback cb) {
-        mCallback = cb;
-    }
-
-    @Override
-    public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
-        return false;
-    }
-
-    @Override
-    public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
-        if (mCallback != null) {
-            mCallback.onCloseMenu(menu, allMenusAreClosing);
-        }
-    }
-
-    @Override
-    public boolean flagActionItems() {
-        return false;
-    }
-
-    @Override
-    public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) {
-        return false;
-    }
-
-    @Override
-    public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) {
-        return false;
-    }
-
-    @Override
-    public int getId() {
-        return mId;
-    }
-
-    public void setId(int id) {
-        mId = id;
-    }
-
-    @Override
-    public Parcelable onSaveInstanceState() {
-        if (Build.VERSION.SDK_INT >= 11) {
-            // API 9-10 does not support ClassLoaderCreator, therefore things can crash if they're
-            // loaded via different loaders. Rather than crash we just won't save state on those
-            // platforms
-            final Bundle state = new Bundle();
-            if (mMenuView != null) {
-                SparseArray<Parcelable> hierarchy = new SparseArray<>();
-                mMenuView.saveHierarchyState(hierarchy);
-                state.putSparseParcelableArray(STATE_HIERARCHY, hierarchy);
-            }
-            if (mAdapter != null) {
-                state.putBundle(STATE_ADAPTER, mAdapter.createInstanceState());
-            }
-            if (mHeaderLayout != null) {
-                SparseArray<Parcelable> header = new SparseArray<>();
-                mHeaderLayout.saveHierarchyState(header);
-                state.putSparseParcelableArray(STATE_HEADER, header);
-            }
-            return state;
-        }
-        return null;
-    }
-
-    @Override
-    public void onRestoreInstanceState(final Parcelable parcelable) {
-        if (parcelable instanceof Bundle) {
-            Bundle state = (Bundle) parcelable;
-            SparseArray<Parcelable> hierarchy = state.getSparseParcelableArray(STATE_HIERARCHY);
-            if (hierarchy != null) {
-                mMenuView.restoreHierarchyState(hierarchy);
-            }
-            Bundle adapterState = state.getBundle(STATE_ADAPTER);
-            if (adapterState != null) {
-                mAdapter.restoreInstanceState(adapterState);
-            }
-            SparseArray<Parcelable> header = state.getSparseParcelableArray(STATE_HEADER);
-            if (header != null) {
-                mHeaderLayout.restoreHierarchyState(header);
-            }
-        }
-    }
-
-    public void setCheckedItem(MenuItemImpl item) {
-        mAdapter.setCheckedItem(item);
-    }
-
-    public View inflateHeaderView(@LayoutRes int res) {
-        View view = mLayoutInflater.inflate(res, mHeaderLayout, false);
-        addHeaderView(view);
-        return view;
-    }
-
-    public void addHeaderView(@NonNull View view) {
-        mHeaderLayout.addView(view);
-        // The padding on top should be cleared.
-        mMenuView.setPadding(0, 0, 0, mMenuView.getPaddingBottom());
-    }
-
-    public void removeHeaderView(@NonNull View view) {
-        mHeaderLayout.removeView(view);
-        if (mHeaderLayout.getChildCount() == 0) {
-            mMenuView.setPadding(0, mPaddingTopDefault, 0, mMenuView.getPaddingBottom());
-        }
-    }
-
-    public int getHeaderCount() {
-        return mHeaderLayout.getChildCount();
-    }
-
-    public View getHeaderView(int index) {
-        return mHeaderLayout.getChildAt(index);
-    }
-
-    @Nullable
-    public ColorStateList getItemTintList() {
-        return mIconTintList;
-    }
-
-    public void setItemIconTintList(@Nullable ColorStateList tint) {
-        mIconTintList = tint;
-        updateMenuView(false);
-    }
-
-    @Nullable
-    public ColorStateList getItemTextColor() {
-        return mTextColor;
-    }
-
-    public void setItemTextColor(@Nullable ColorStateList textColor) {
-        mTextColor = textColor;
-        updateMenuView(false);
-    }
-
-    public void setItemTextAppearance(@StyleRes int resId) {
-        mTextAppearance = resId;
-        mTextAppearanceSet = true;
-        updateMenuView(false);
-    }
-
-    @Nullable
-    public Drawable getItemBackground() {
-        return mItemBackground;
-    }
-
-    public void setItemBackground(@Nullable Drawable itemBackground) {
-        mItemBackground = itemBackground;
-        updateMenuView(false);
-    }
-
-    public void setUpdateSuspended(boolean updateSuspended) {
-        if (mAdapter != null) {
-            mAdapter.setUpdateSuspended(updateSuspended);
-        }
-    }
-
-    public void dispatchApplyWindowInsets(WindowInsetsCompat insets) {
-        int top = insets.getSystemWindowInsetTop();
-        if (mPaddingTopDefault != top) {
-            mPaddingTopDefault = top;
-            if (mHeaderLayout.getChildCount() == 0) {
-                mMenuView.setPadding(0, mPaddingTopDefault, 0, mMenuView.getPaddingBottom());
-            }
-        }
-        ViewCompat.dispatchApplyWindowInsets(mHeaderLayout, insets);
-    }
-
-    private abstract static class ViewHolder extends RecyclerView.ViewHolder {
-
-        public ViewHolder(View itemView) {
-            super(itemView);
-        }
-
-    }
-
-    private static class NormalViewHolder extends ViewHolder {
-
-        public NormalViewHolder(LayoutInflater inflater, ViewGroup parent,
-                View.OnClickListener listener) {
-            super(inflater.inflate(R.layout.design_navigation_item, parent, false));
-            itemView.setOnClickListener(listener);
-        }
-
-    }
-
-    private static class SubheaderViewHolder extends ViewHolder {
-
-        public SubheaderViewHolder(LayoutInflater inflater, ViewGroup parent) {
-            super(inflater.inflate(R.layout.design_navigation_item_subheader, parent, false));
-        }
-
-    }
-
-    private static class SeparatorViewHolder extends ViewHolder {
-
-        public SeparatorViewHolder(LayoutInflater inflater, ViewGroup parent) {
-            super(inflater.inflate(R.layout.design_navigation_item_separator, parent, false));
-        }
-
-    }
-
-    private static class HeaderViewHolder extends ViewHolder {
-
-        public HeaderViewHolder(View itemView) {
-            super(itemView);
-        }
-
-    }
-
-    /**
-     * Handles click events for the menu items. The items has to be {@link NavigationMenuItemView}.
-     */
-    final View.OnClickListener mOnClickListener = new View.OnClickListener() {
-
-        @Override
-        public void onClick(View v) {
-            NavigationMenuItemView itemView = (NavigationMenuItemView) v;
-            setUpdateSuspended(true);
-            MenuItemImpl item = itemView.getItemData();
-            boolean result = mMenu.performItemAction(item, NavigationMenuPresenter.this, 0);
-            if (item != null && item.isCheckable() && result) {
-                mAdapter.setCheckedItem(item);
-            }
-            setUpdateSuspended(false);
-            updateMenuView(false);
-        }
-
-    };
-
-    private class NavigationMenuAdapter extends RecyclerView.Adapter<ViewHolder> {
-
-        private static final String STATE_CHECKED_ITEM = "android:menu:checked";
-
-        private static final String STATE_ACTION_VIEWS = "android:menu:action_views";
-        private static final int VIEW_TYPE_NORMAL = 0;
-        private static final int VIEW_TYPE_SUBHEADER = 1;
-        private static final int VIEW_TYPE_SEPARATOR = 2;
-        private static final int VIEW_TYPE_HEADER = 3;
-
-        private final ArrayList<NavigationMenuItem> mItems = new ArrayList<>();
-        private MenuItemImpl mCheckedItem;
-        private boolean mUpdateSuspended;
-
-        NavigationMenuAdapter() {
-            prepareMenuItems();
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return position;
-        }
-
-        @Override
-        public int getItemCount() {
-            return mItems.size();
-        }
-
-        @Override
-        public int getItemViewType(int position) {
-            NavigationMenuItem item = mItems.get(position);
-            if (item instanceof NavigationMenuSeparatorItem) {
-                return VIEW_TYPE_SEPARATOR;
-            } else if (item instanceof NavigationMenuHeaderItem) {
-                return VIEW_TYPE_HEADER;
-            } else if (item instanceof NavigationMenuTextItem) {
-                NavigationMenuTextItem textItem = (NavigationMenuTextItem) item;
-                if (textItem.getMenuItem().hasSubMenu()) {
-                    return VIEW_TYPE_SUBHEADER;
-                } else {
-                    return VIEW_TYPE_NORMAL;
-                }
-            }
-            throw new RuntimeException("Unknown item type.");
-        }
-
-        @Override
-        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-            switch (viewType) {
-                case VIEW_TYPE_NORMAL:
-                    return new NormalViewHolder(mLayoutInflater, parent, mOnClickListener);
-                case VIEW_TYPE_SUBHEADER:
-                    return new SubheaderViewHolder(mLayoutInflater, parent);
-                case VIEW_TYPE_SEPARATOR:
-                    return new SeparatorViewHolder(mLayoutInflater, parent);
-                case VIEW_TYPE_HEADER:
-                    return new HeaderViewHolder(mHeaderLayout);
-            }
-            return null;
-        }
-
-        @Override
-        public void onBindViewHolder(ViewHolder holder, int position) {
-            switch (getItemViewType(position)) {
-                case VIEW_TYPE_NORMAL: {
-                    NavigationMenuItemView itemView = (NavigationMenuItemView) holder.itemView;
-                    itemView.setIconTintList(mIconTintList);
-                    if (mTextAppearanceSet) {
-                        itemView.setTextAppearance(mTextAppearance);
-                    }
-                    if (mTextColor != null) {
-                        itemView.setTextColor(mTextColor);
-                    }
-                    ViewCompat.setBackground(itemView, mItemBackground != null ?
-                            mItemBackground.getConstantState().newDrawable() : null);
-                    NavigationMenuTextItem item = (NavigationMenuTextItem) mItems.get(position);
-                    itemView.setNeedsEmptyIcon(item.needsEmptyIcon);
-                    itemView.initialize(item.getMenuItem(), 0);
-                    break;
-                }
-                case VIEW_TYPE_SUBHEADER: {
-                    TextView subHeader = (TextView) holder.itemView;
-                    NavigationMenuTextItem item = (NavigationMenuTextItem) mItems.get(position);
-                    subHeader.setText(item.getMenuItem().getTitle());
-                    break;
-                }
-                case VIEW_TYPE_SEPARATOR: {
-                    NavigationMenuSeparatorItem item =
-                            (NavigationMenuSeparatorItem) mItems.get(position);
-                    holder.itemView.setPadding(0, item.getPaddingTop(), 0,
-                            item.getPaddingBottom());
-                    break;
-                }
-                case VIEW_TYPE_HEADER: {
-                    break;
-                }
-            }
-
-        }
-
-        @Override
-        public void onViewRecycled(ViewHolder holder) {
-            if (holder instanceof NormalViewHolder) {
-                ((NavigationMenuItemView) holder.itemView).recycle();
-            }
-        }
-
-        public void update() {
-            prepareMenuItems();
-            notifyDataSetChanged();
-        }
-
-        /**
-         * Flattens the visible menu items of {@link #mMenu} into {@link #mItems},
-         * while inserting separators between items when necessary.
-         */
-        private void prepareMenuItems() {
-            if (mUpdateSuspended) {
-                return;
-            }
-            mUpdateSuspended = true;
-            mItems.clear();
-            mItems.add(new NavigationMenuHeaderItem());
-
-            int currentGroupId = -1;
-            int currentGroupStart = 0;
-            boolean currentGroupHasIcon = false;
-            for (int i = 0, totalSize = mMenu.getVisibleItems().size(); i < totalSize; i++) {
-                MenuItemImpl item = mMenu.getVisibleItems().get(i);
-                if (item.isChecked()) {
-                    setCheckedItem(item);
-                }
-                if (item.isCheckable()) {
-                    item.setExclusiveCheckable(false);
-                }
-                if (item.hasSubMenu()) {
-                    SubMenu subMenu = item.getSubMenu();
-                    if (subMenu.hasVisibleItems()) {
-                        if (i != 0) {
-                            mItems.add(new NavigationMenuSeparatorItem(mPaddingSeparator, 0));
-                        }
-                        mItems.add(new NavigationMenuTextItem(item));
-                        boolean subMenuHasIcon = false;
-                        int subMenuStart = mItems.size();
-                        for (int j = 0, size = subMenu.size(); j < size; j++) {
-                            MenuItemImpl subMenuItem = (MenuItemImpl) subMenu.getItem(j);
-                            if (subMenuItem.isVisible()) {
-                                if (!subMenuHasIcon && subMenuItem.getIcon() != null) {
-                                    subMenuHasIcon = true;
-                                }
-                                if (subMenuItem.isCheckable()) {
-                                    subMenuItem.setExclusiveCheckable(false);
-                                }
-                                if (item.isChecked()) {
-                                    setCheckedItem(item);
-                                }
-                                mItems.add(new NavigationMenuTextItem(subMenuItem));
-                            }
-                        }
-                        if (subMenuHasIcon) {
-                            appendTransparentIconIfMissing(subMenuStart, mItems.size());
-                        }
-                    }
-                } else {
-                    int groupId = item.getGroupId();
-                    if (groupId != currentGroupId) { // first item in group
-                        currentGroupStart = mItems.size();
-                        currentGroupHasIcon = item.getIcon() != null;
-                        if (i != 0) {
-                            currentGroupStart++;
-                            mItems.add(new NavigationMenuSeparatorItem(
-                                    mPaddingSeparator, mPaddingSeparator));
-                        }
-                    } else if (!currentGroupHasIcon && item.getIcon() != null) {
-                        currentGroupHasIcon = true;
-                        appendTransparentIconIfMissing(currentGroupStart, mItems.size());
-                    }
-                    NavigationMenuTextItem textItem = new NavigationMenuTextItem(item);
-                    textItem.needsEmptyIcon = currentGroupHasIcon;
-                    mItems.add(textItem);
-                    currentGroupId = groupId;
-                }
-            }
-            mUpdateSuspended = false;
-        }
-
-        private void appendTransparentIconIfMissing(int startIndex, int endIndex) {
-            for (int i = startIndex; i < endIndex; i++) {
-                NavigationMenuTextItem textItem = (NavigationMenuTextItem) mItems.get(i);
-                textItem.needsEmptyIcon = true;
-            }
-        }
-
-        public void setCheckedItem(MenuItemImpl checkedItem) {
-            if (mCheckedItem == checkedItem || !checkedItem.isCheckable()) {
-                return;
-            }
-            if (mCheckedItem != null) {
-                mCheckedItem.setChecked(false);
-            }
-            mCheckedItem = checkedItem;
-            checkedItem.setChecked(true);
-        }
-
-        public Bundle createInstanceState() {
-            Bundle state = new Bundle();
-            if (mCheckedItem != null) {
-                state.putInt(STATE_CHECKED_ITEM, mCheckedItem.getItemId());
-            }
-            // Store the states of the action views.
-            SparseArray<ParcelableSparseArray> actionViewStates = new SparseArray<>();
-            for (int i = 0, size = mItems.size(); i < size; i++) {
-                NavigationMenuItem navigationMenuItem = mItems.get(i);
-                if (navigationMenuItem instanceof NavigationMenuTextItem) {
-                    MenuItemImpl item = ((NavigationMenuTextItem) navigationMenuItem).getMenuItem();
-                    View actionView = item != null ? item.getActionView() : null;
-                    if (actionView != null) {
-                        ParcelableSparseArray container = new ParcelableSparseArray();
-                        actionView.saveHierarchyState(container);
-                        actionViewStates.put(item.getItemId(), container);
-                    }
-                }
-            }
-            state.putSparseParcelableArray(STATE_ACTION_VIEWS, actionViewStates);
-            return state;
-        }
-
-        public void restoreInstanceState(Bundle state) {
-            int checkedItem = state.getInt(STATE_CHECKED_ITEM, 0);
-            if (checkedItem != 0) {
-                mUpdateSuspended = true;
-                for (int i = 0, size = mItems.size(); i < size; i++) {
-                    NavigationMenuItem item = mItems.get(i);
-                    if (item instanceof NavigationMenuTextItem) {
-                        MenuItemImpl menuItem = ((NavigationMenuTextItem) item).getMenuItem();
-                        if (menuItem != null && menuItem.getItemId() == checkedItem) {
-                            setCheckedItem(menuItem);
-                            break;
-                        }
-                    }
-                }
-                mUpdateSuspended = false;
-                prepareMenuItems();
-            }
-            // Restore the states of the action views.
-            SparseArray<ParcelableSparseArray> actionViewStates = state
-                    .getSparseParcelableArray(STATE_ACTION_VIEWS);
-            if (actionViewStates != null) {
-                for (int i = 0, size = mItems.size(); i < size; i++) {
-                    NavigationMenuItem navigationMenuItem = mItems.get(i);
-                    if (!(navigationMenuItem instanceof NavigationMenuTextItem)) {
-                        continue;
-                    }
-                    MenuItemImpl item = ((NavigationMenuTextItem) navigationMenuItem).getMenuItem();
-                    if (item == null) {
-                        continue;
-                    }
-                    View actionView = item.getActionView();
-                    if (actionView == null) {
-                        continue;
-                    }
-                    ParcelableSparseArray container = actionViewStates.get(item.getItemId());
-                    if (container == null) {
-                        continue;
-                    }
-                    actionView.restoreHierarchyState(container);
-                }
-            }
-        }
-
-        public void setUpdateSuspended(boolean updateSuspended) {
-            mUpdateSuspended = updateSuspended;
-        }
-
-    }
-
-    /**
-     * Unified data model for all sorts of navigation menu items.
-     */
-    private interface NavigationMenuItem {
-    }
-
-    /**
-     * Normal or subheader items.
-     */
-    private static class NavigationMenuTextItem implements NavigationMenuItem {
-
-        private final MenuItemImpl mMenuItem;
-
-        boolean needsEmptyIcon;
-
-        NavigationMenuTextItem(MenuItemImpl item) {
-            mMenuItem = item;
-        }
-
-        public MenuItemImpl getMenuItem() {
-            return mMenuItem;
-        }
-
-    }
-
-    /**
-     * Separator items.
-     */
-    private static class NavigationMenuSeparatorItem implements NavigationMenuItem {
-
-        private final int mPaddingTop;
-
-        private final int mPaddingBottom;
-
-        public NavigationMenuSeparatorItem(int paddingTop, int paddingBottom) {
-            mPaddingTop = paddingTop;
-            mPaddingBottom = paddingBottom;
-        }
-
-        public int getPaddingTop() {
-            return mPaddingTop;
-        }
-
-        public int getPaddingBottom() {
-            return mPaddingBottom;
-        }
-
-    }
-
-    /**
-     * Header (not subheader) items.
-     */
-    private static class NavigationMenuHeaderItem implements NavigationMenuItem {
-        NavigationMenuHeaderItem() {
-        }
-        // The actual content is hold by NavigationMenuPresenter#mHeaderLayout.
-    }
-
-}
diff --git a/design/src/android/support/design/internal/NavigationMenuView.java b/design/src/android/support/design/internal/NavigationMenuView.java
deleted file mode 100644
index 711f71e..0000000
--- a/design/src/android/support/design/internal/NavigationMenuView.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.internal;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.support.annotation.RestrictTo;
-import android.support.v7.view.menu.MenuBuilder;
-import android.support.v7.view.menu.MenuView;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.util.AttributeSet;
-
-/**
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public class NavigationMenuView extends RecyclerView implements MenuView {
-
-    public NavigationMenuView(Context context) {
-        this(context, null);
-    }
-
-    public NavigationMenuView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public NavigationMenuView(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
-    }
-
-    @Override
-    public void initialize(MenuBuilder menu) {
-
-    }
-
-    @Override
-    public int getWindowAnimations() {
-        return 0;
-    }
-
-}
diff --git a/design/src/android/support/design/internal/NavigationSubMenu.java b/design/src/android/support/design/internal/NavigationSubMenu.java
deleted file mode 100644
index 1ff1e4f..0000000
--- a/design/src/android/support/design/internal/NavigationSubMenu.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.internal;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.support.annotation.RestrictTo;
-import android.support.v7.view.menu.MenuBuilder;
-import android.support.v7.view.menu.MenuItemImpl;
-import android.support.v7.view.menu.SubMenuBuilder;
-
-/**
- * This is a {@link SubMenuBuilder} that it notifies the parent {@link NavigationMenu} of its menu
- * updates.
- *
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public class NavigationSubMenu extends SubMenuBuilder {
-
-    public NavigationSubMenu(Context context, NavigationMenu menu, MenuItemImpl item) {
-        super(context, menu, item);
-    }
-
-    @Override
-    public void onItemsChanged(boolean structureChanged) {
-        super.onItemsChanged(structureChanged);
-        ((MenuBuilder) getParentMenu()).onItemsChanged(structureChanged);
-    }
-
-}
diff --git a/design/src/android/support/design/internal/ParcelableSparseArray.java b/design/src/android/support/design/internal/ParcelableSparseArray.java
deleted file mode 100644
index b29000e..0000000
--- a/design/src/android/support/design/internal/ParcelableSparseArray.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.internal;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.annotation.RestrictTo;
-import android.util.SparseArray;
-
-/**
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public class ParcelableSparseArray extends SparseArray<Parcelable> implements Parcelable {
-
-    public ParcelableSparseArray() {
-        super();
-    }
-
-    public ParcelableSparseArray(Parcel source, ClassLoader loader) {
-        super();
-        int size = source.readInt();
-        int[] keys = new int[size];
-        source.readIntArray(keys);
-        Parcelable[] values = source.readParcelableArray(loader);
-        for (int i = 0; i < size; ++i) {
-            put(keys[i], values[i]);
-        }
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel parcel, int flags) {
-        int size = size();
-        int[] keys = new int[size];
-        Parcelable[] values = new Parcelable[size];
-        for (int i = 0; i < size; ++i) {
-            keys[i] = keyAt(i);
-            values[i] = valueAt(i);
-        }
-        parcel.writeInt(size);
-        parcel.writeIntArray(keys);
-        parcel.writeParcelableArray(values, flags);
-    }
-
-    public static final Creator<ParcelableSparseArray> CREATOR =
-            new ClassLoaderCreator<ParcelableSparseArray>() {
-                @Override
-                public ParcelableSparseArray createFromParcel(Parcel source, ClassLoader loader) {
-                    return new ParcelableSparseArray(source, loader);
-                }
-
-                @Override
-                public ParcelableSparseArray createFromParcel(Parcel source) {
-                    return new ParcelableSparseArray(source, null);
-                }
-
-                @Override
-                public ParcelableSparseArray[] newArray(int size) {
-                    return new ParcelableSparseArray[size];
-                }
-            };
-}
diff --git a/design/src/android/support/design/internal/ScrimInsetsFrameLayout.java b/design/src/android/support/design/internal/ScrimInsetsFrameLayout.java
deleted file mode 100644
index 38f5b29..0000000
--- a/design/src/android/support/design/internal/ScrimInsetsFrameLayout.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.internal;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.NonNull;
-import android.support.annotation.RestrictTo;
-import android.support.design.R;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.WindowInsetsCompat;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.FrameLayout;
-
-/**
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public class ScrimInsetsFrameLayout extends FrameLayout {
-
-    Drawable mInsetForeground;
-
-    Rect mInsets;
-
-    private Rect mTempRect = new Rect();
-
-    public ScrimInsetsFrameLayout(Context context) {
-        this(context, null);
-    }
-
-    public ScrimInsetsFrameLayout(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public ScrimInsetsFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-
-        final TypedArray a = context.obtainStyledAttributes(attrs,
-                R.styleable.ScrimInsetsFrameLayout, defStyleAttr,
-                R.style.Widget_Design_ScrimInsetsFrameLayout);
-        mInsetForeground = a.getDrawable(R.styleable.ScrimInsetsFrameLayout_insetForeground);
-        a.recycle();
-        setWillNotDraw(true); // No need to draw until the insets are adjusted
-
-        ViewCompat.setOnApplyWindowInsetsListener(this,
-                new android.support.v4.view.OnApplyWindowInsetsListener() {
-                    @Override
-                    public WindowInsetsCompat onApplyWindowInsets(View v,
-                            WindowInsetsCompat insets) {
-                        if (null == mInsets) {
-                            mInsets = new Rect();
-                        }
-                        mInsets.set(insets.getSystemWindowInsetLeft(),
-                                insets.getSystemWindowInsetTop(),
-                                insets.getSystemWindowInsetRight(),
-                                insets.getSystemWindowInsetBottom());
-                        onInsetsChanged(insets);
-                        setWillNotDraw(!insets.hasSystemWindowInsets() || mInsetForeground == null);
-                        ViewCompat.postInvalidateOnAnimation(ScrimInsetsFrameLayout.this);
-                        return insets.consumeSystemWindowInsets();
-                    }
-                });
-    }
-
-    @Override
-    public void draw(@NonNull Canvas canvas) {
-        super.draw(canvas);
-
-        int width = getWidth();
-        int height = getHeight();
-        if (mInsets != null && mInsetForeground != null) {
-            int sc = canvas.save();
-            canvas.translate(getScrollX(), getScrollY());
-
-            // Top
-            mTempRect.set(0, 0, width, mInsets.top);
-            mInsetForeground.setBounds(mTempRect);
-            mInsetForeground.draw(canvas);
-
-            // Bottom
-            mTempRect.set(0, height - mInsets.bottom, width, height);
-            mInsetForeground.setBounds(mTempRect);
-            mInsetForeground.draw(canvas);
-
-            // Left
-            mTempRect.set(0, mInsets.top, mInsets.left, height - mInsets.bottom);
-            mInsetForeground.setBounds(mTempRect);
-            mInsetForeground.draw(canvas);
-
-            // Right
-            mTempRect.set(width - mInsets.right, mInsets.top, width, height - mInsets.bottom);
-            mInsetForeground.setBounds(mTempRect);
-            mInsetForeground.draw(canvas);
-
-            canvas.restoreToCount(sc);
-        }
-    }
-
-    @Override
-    protected void onAttachedToWindow() {
-        super.onAttachedToWindow();
-        if (mInsetForeground != null) {
-            mInsetForeground.setCallback(this);
-        }
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        if (mInsetForeground != null) {
-            mInsetForeground.setCallback(null);
-        }
-    }
-
-    protected void onInsetsChanged(WindowInsetsCompat insets) {
-    }
-
-}
diff --git a/design/src/android/support/design/internal/SnackbarContentLayout.java b/design/src/android/support/design/internal/SnackbarContentLayout.java
deleted file mode 100644
index 2abf012..0000000
--- a/design/src/android/support/design/internal/SnackbarContentLayout.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * 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 android.support.design.internal;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.support.annotation.RestrictTo;
-import android.support.design.R;
-import android.support.design.widget.BaseTransientBottomBar;
-import android.support.v4.view.ViewCompat;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.Button;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-/**
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public class SnackbarContentLayout extends LinearLayout implements
-        BaseTransientBottomBar.ContentViewCallback {
-    private TextView mMessageView;
-    private Button mActionView;
-
-    private int mMaxWidth;
-    private int mMaxInlineActionWidth;
-
-    public SnackbarContentLayout(Context context) {
-        this(context, null);
-    }
-
-    public SnackbarContentLayout(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SnackbarLayout);
-        mMaxWidth = a.getDimensionPixelSize(R.styleable.SnackbarLayout_android_maxWidth, -1);
-        mMaxInlineActionWidth = a.getDimensionPixelSize(
-                R.styleable.SnackbarLayout_maxActionInlineWidth, -1);
-        a.recycle();
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
-        mMessageView = findViewById(R.id.snackbar_text);
-        mActionView = findViewById(R.id.snackbar_action);
-    }
-
-    public TextView getMessageView() {
-        return mMessageView;
-    }
-
-    public Button getActionView() {
-        return mActionView;
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
-        if (mMaxWidth > 0 && getMeasuredWidth() > mMaxWidth) {
-            widthMeasureSpec = MeasureSpec.makeMeasureSpec(mMaxWidth, MeasureSpec.EXACTLY);
-            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-        }
-
-        final int multiLineVPadding = getResources().getDimensionPixelSize(
-                R.dimen.design_snackbar_padding_vertical_2lines);
-        final int singleLineVPadding = getResources().getDimensionPixelSize(
-                R.dimen.design_snackbar_padding_vertical);
-        final boolean isMultiLine = mMessageView.getLayout().getLineCount() > 1;
-
-        boolean remeasure = false;
-        if (isMultiLine && mMaxInlineActionWidth > 0
-                && mActionView.getMeasuredWidth() > mMaxInlineActionWidth) {
-            if (updateViewsWithinLayout(VERTICAL, multiLineVPadding,
-                    multiLineVPadding - singleLineVPadding)) {
-                remeasure = true;
-            }
-        } else {
-            final int messagePadding = isMultiLine ? multiLineVPadding : singleLineVPadding;
-            if (updateViewsWithinLayout(HORIZONTAL, messagePadding, messagePadding)) {
-                remeasure = true;
-            }
-        }
-
-        if (remeasure) {
-            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-        }
-    }
-
-    private boolean updateViewsWithinLayout(final int orientation,
-            final int messagePadTop, final int messagePadBottom) {
-        boolean changed = false;
-        if (orientation != getOrientation()) {
-            setOrientation(orientation);
-            changed = true;
-        }
-        if (mMessageView.getPaddingTop() != messagePadTop
-                || mMessageView.getPaddingBottom() != messagePadBottom) {
-            updateTopBottomPadding(mMessageView, messagePadTop, messagePadBottom);
-            changed = true;
-        }
-        return changed;
-    }
-
-    private static void updateTopBottomPadding(View view, int topPadding, int bottomPadding) {
-        if (ViewCompat.isPaddingRelative(view)) {
-            ViewCompat.setPaddingRelative(view,
-                    ViewCompat.getPaddingStart(view), topPadding,
-                    ViewCompat.getPaddingEnd(view), bottomPadding);
-        } else {
-            view.setPadding(view.getPaddingLeft(), topPadding,
-                    view.getPaddingRight(), bottomPadding);
-        }
-    }
-
-    @Override
-    public void animateContentIn(int delay, int duration) {
-        mMessageView.setAlpha(0f);
-        mMessageView.animate().alpha(1f).setDuration(duration)
-                .setStartDelay(delay).start();
-
-        if (mActionView.getVisibility() == VISIBLE) {
-            mActionView.setAlpha(0f);
-            mActionView.animate().alpha(1f).setDuration(duration)
-                    .setStartDelay(delay).start();
-        }
-    }
-
-    @Override
-    public void animateContentOut(int delay, int duration) {
-        mMessageView.setAlpha(1f);
-        mMessageView.animate().alpha(0f).setDuration(duration)
-                .setStartDelay(delay).start();
-
-        if (mActionView.getVisibility() == VISIBLE) {
-            mActionView.setAlpha(1f);
-            mActionView.animate().alpha(0f).setDuration(duration)
-                    .setStartDelay(delay).start();
-        }
-    }
-}
diff --git a/design/src/android/support/design/internal/TextScale.java b/design/src/android/support/design/internal/TextScale.java
deleted file mode 100644
index 06c9472..0000000
--- a/design/src/android/support/design/internal/TextScale.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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 android.support.design.internal;
-
-import android.animation.Animator;
-import android.animation.ValueAnimator;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RestrictTo;
-import android.support.transition.Transition;
-import android.support.transition.TransitionValues;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import java.util.Map;
-
-/**
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-@RequiresApi(14)
-public class TextScale extends Transition {
-    private static final String PROPNAME_SCALE = "android:textscale:scale";
-
-    @Override
-    public void captureStartValues(TransitionValues transitionValues) {
-        captureValues(transitionValues);
-    }
-
-    @Override
-    public void captureEndValues(TransitionValues transitionValues) {
-        captureValues(transitionValues);
-    }
-
-    private void captureValues(TransitionValues transitionValues) {
-        if (transitionValues.view instanceof TextView) {
-            TextView textview = (TextView) transitionValues.view;
-            transitionValues.values.put(PROPNAME_SCALE, textview.getScaleX());
-        }
-    }
-
-    @Override
-    public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
-            TransitionValues endValues) {
-        if (startValues == null || endValues == null || !(startValues.view instanceof TextView)
-                || !(endValues.view instanceof TextView)) {
-            return null;
-        }
-        final TextView view = (TextView) endValues.view;
-        Map<String, Object> startVals = startValues.values;
-        Map<String, Object> endVals = endValues.values;
-        final float startSize = startVals.get(PROPNAME_SCALE) != null ? (float) startVals.get(
-                PROPNAME_SCALE) : 1f;
-        final float endSize = endVals.get(PROPNAME_SCALE) != null ? (float) endVals.get(
-                PROPNAME_SCALE) : 1f;
-        if (startSize == endSize) {
-            return null;
-        }
-
-        ValueAnimator animator = ValueAnimator.ofFloat(startSize, endSize);
-
-        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-            @Override
-            public void onAnimationUpdate(ValueAnimator valueAnimator) {
-                float animatedValue = (float) valueAnimator.getAnimatedValue();
-                view.setScaleX(animatedValue);
-                view.setScaleY(animatedValue);
-            }
-        });
-        return animator;
-    }
-}
diff --git a/design/src/android/support/design/internal/package-info.java b/design/src/android/support/design/internal/package-info.java
deleted file mode 100644
index 6b6f7bb..0000000
--- a/design/src/android/support/design/internal/package-info.java
+++ /dev/null
@@ -1,9 +0,0 @@
-/**
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-package android.support.design.internal;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.support.annotation.RestrictTo;
diff --git a/design/src/android/support/design/widget/AppBarLayout.java b/design/src/android/support/design/widget/AppBarLayout.java
deleted file mode 100644
index 8304cd6..0000000
--- a/design/src/android/support/design/widget/AppBarLayout.java
+++ /dev/null
@@ -1,1474 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Rect;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.annotation.IntDef;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RestrictTo;
-import android.support.annotation.VisibleForTesting;
-import android.support.design.R;
-import android.support.v4.math.MathUtils;
-import android.support.v4.util.ObjectsCompat;
-import android.support.v4.view.AbsSavedState;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.WindowInsetsCompat;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.animation.Interpolator;
-import android.widget.LinearLayout;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * AppBarLayout is a vertical {@link LinearLayout} which implements many of the features of
- * material designs app bar concept, namely scrolling gestures.
- * <p>
- * Children should provide their desired scrolling behavior through
- * {@link LayoutParams#setScrollFlags(int)} and the associated layout xml attribute:
- * {@code app:layout_scrollFlags}.
- *
- * <p>
- * This view depends heavily on being used as a direct child within a {@link CoordinatorLayout}.
- * If you use AppBarLayout within a different {@link ViewGroup}, most of it's functionality will
- * not work.
- * <p>
- * AppBarLayout also requires a separate scrolling sibling in order to know when to scroll.
- * The binding is done through the {@link ScrollingViewBehavior} behavior class, meaning that you
- * should set your scrolling view's behavior to be an instance of {@link ScrollingViewBehavior}.
- * A string resource containing the full class name is available.
- *
- * <pre>
- * &lt;android.support.design.widget.CoordinatorLayout
- *         xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
- *         xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
- *         android:layout_width=&quot;match_parent&quot;
- *         android:layout_height=&quot;match_parent&quot;&gt;
- *
- *     &lt;android.support.v4.widget.NestedScrollView
- *             android:layout_width=&quot;match_parent&quot;
- *             android:layout_height=&quot;match_parent&quot;
- *             app:layout_behavior=&quot;@string/appbar_scrolling_view_behavior&quot;&gt;
- *
- *         &lt;!-- Your scrolling content --&gt;
- *
- *     &lt;/android.support.v4.widget.NestedScrollView&gt;
- *
- *     &lt;android.support.design.widget.AppBarLayout
- *             android:layout_height=&quot;wrap_content&quot;
- *             android:layout_width=&quot;match_parent&quot;&gt;
- *
- *         &lt;android.support.v7.widget.Toolbar
- *                 ...
- *                 app:layout_scrollFlags=&quot;scroll|enterAlways&quot;/&gt;
- *
- *         &lt;android.support.design.widget.TabLayout
- *                 ...
- *                 app:layout_scrollFlags=&quot;scroll|enterAlways&quot;/&gt;
- *
- *     &lt;/android.support.design.widget.AppBarLayout&gt;
- *
- * &lt;/android.support.design.widget.CoordinatorLayout&gt;
- * </pre>
- *
- * @see <a href="http://www.google.com/design/spec/layout/structure.html#structure-app-bar">
- *     http://www.google.com/design/spec/layout/structure.html#structure-app-bar</a>
- */
-@CoordinatorLayout.DefaultBehavior(AppBarLayout.Behavior.class)
-public class AppBarLayout extends LinearLayout {
-
-    static final int PENDING_ACTION_NONE = 0x0;
-    static final int PENDING_ACTION_EXPANDED = 0x1;
-    static final int PENDING_ACTION_COLLAPSED = 0x2;
-    static final int PENDING_ACTION_ANIMATE_ENABLED = 0x4;
-    static final int PENDING_ACTION_FORCE = 0x8;
-
-    /**
-     * Interface definition for a callback to be invoked when an {@link AppBarLayout}'s vertical
-     * offset changes.
-     */
-    public interface OnOffsetChangedListener {
-        /**
-         * Called when the {@link AppBarLayout}'s layout offset has been changed. This allows
-         * child views to implement custom behavior based on the offset (for instance pinning a
-         * view at a certain y value).
-         *
-         * @param appBarLayout the {@link AppBarLayout} which offset has changed
-         * @param verticalOffset the vertical offset for the parent {@link AppBarLayout}, in px
-         */
-        void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset);
-    }
-
-    private static final int INVALID_SCROLL_RANGE = -1;
-
-    private int mTotalScrollRange = INVALID_SCROLL_RANGE;
-    private int mDownPreScrollRange = INVALID_SCROLL_RANGE;
-    private int mDownScrollRange = INVALID_SCROLL_RANGE;
-
-    private boolean mHaveChildWithInterpolator;
-
-    private int mPendingAction = PENDING_ACTION_NONE;
-
-    private WindowInsetsCompat mLastInsets;
-
-    private List<OnOffsetChangedListener> mListeners;
-
-    private boolean mCollapsible;
-    private boolean mCollapsed;
-
-    private int[] mTmpStatesArray;
-
-    public AppBarLayout(Context context) {
-        this(context, null);
-    }
-
-    public AppBarLayout(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        setOrientation(VERTICAL);
-
-        ThemeUtils.checkAppCompatTheme(context);
-
-        if (Build.VERSION.SDK_INT >= 21) {
-            // Use the bounds view outline provider so that we cast a shadow, even without a
-            // background
-            ViewUtilsLollipop.setBoundsViewOutlineProvider(this);
-
-            // If we're running on API 21+, we should reset any state list animator from our
-            // default style
-            ViewUtilsLollipop.setStateListAnimatorFromAttrs(this, attrs, 0,
-                    R.style.Widget_Design_AppBarLayout);
-        }
-
-        final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AppBarLayout,
-                0, R.style.Widget_Design_AppBarLayout);
-        ViewCompat.setBackground(this, a.getDrawable(R.styleable.AppBarLayout_android_background));
-        if (a.hasValue(R.styleable.AppBarLayout_expanded)) {
-            setExpanded(a.getBoolean(R.styleable.AppBarLayout_expanded, false), false, false);
-        }
-        if (Build.VERSION.SDK_INT >= 21 && a.hasValue(R.styleable.AppBarLayout_elevation)) {
-            ViewUtilsLollipop.setDefaultAppBarLayoutStateListAnimator(
-                    this, a.getDimensionPixelSize(R.styleable.AppBarLayout_elevation, 0));
-        }
-        if (Build.VERSION.SDK_INT >= 26) {
-            // In O+, we have these values set in the style. Since there is no defStyleAttr for
-            // AppBarLayout at the AppCompat level, check for these attributes here.
-            if (a.hasValue(R.styleable.AppBarLayout_android_keyboardNavigationCluster)) {
-                this.setKeyboardNavigationCluster(a.getBoolean(
-                        R.styleable.AppBarLayout_android_keyboardNavigationCluster, false));
-            }
-            if (a.hasValue(R.styleable.AppBarLayout_android_touchscreenBlocksFocus)) {
-                this.setTouchscreenBlocksFocus(a.getBoolean(
-                        R.styleable.AppBarLayout_android_touchscreenBlocksFocus, false));
-            }
-        }
-        a.recycle();
-
-        ViewCompat.setOnApplyWindowInsetsListener(this,
-                new android.support.v4.view.OnApplyWindowInsetsListener() {
-                    @Override
-                    public WindowInsetsCompat onApplyWindowInsets(View v,
-                            WindowInsetsCompat insets) {
-                        return onWindowInsetChanged(insets);
-                    }
-                });
-    }
-
-    /**
-     * Add a listener that will be called when the offset of this {@link AppBarLayout} changes.
-     *
-     * @param listener The listener that will be called when the offset changes.]
-     *
-     * @see #removeOnOffsetChangedListener(OnOffsetChangedListener)
-     */
-    public void addOnOffsetChangedListener(OnOffsetChangedListener listener) {
-        if (mListeners == null) {
-            mListeners = new ArrayList<>();
-        }
-        if (listener != null && !mListeners.contains(listener)) {
-            mListeners.add(listener);
-        }
-    }
-
-    /**
-     * Remove the previously added {@link OnOffsetChangedListener}.
-     *
-     * @param listener the listener to remove.
-     */
-    public void removeOnOffsetChangedListener(OnOffsetChangedListener listener) {
-        if (mListeners != null && listener != null) {
-            mListeners.remove(listener);
-        }
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-        invalidateScrollRanges();
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        super.onLayout(changed, l, t, r, b);
-        invalidateScrollRanges();
-
-        mHaveChildWithInterpolator = false;
-        for (int i = 0, z = getChildCount(); i < z; i++) {
-            final View child = getChildAt(i);
-            final LayoutParams childLp = (LayoutParams) child.getLayoutParams();
-            final Interpolator interpolator = childLp.getScrollInterpolator();
-
-            if (interpolator != null) {
-                mHaveChildWithInterpolator = true;
-                break;
-            }
-        }
-
-        updateCollapsible();
-    }
-
-    private void updateCollapsible() {
-        boolean haveCollapsibleChild = false;
-        for (int i = 0, z = getChildCount(); i < z; i++) {
-            if (((LayoutParams) getChildAt(i).getLayoutParams()).isCollapsible()) {
-                haveCollapsibleChild = true;
-                break;
-            }
-        }
-        setCollapsibleState(haveCollapsibleChild);
-    }
-
-    private void invalidateScrollRanges() {
-        // Invalidate the scroll ranges
-        mTotalScrollRange = INVALID_SCROLL_RANGE;
-        mDownPreScrollRange = INVALID_SCROLL_RANGE;
-        mDownScrollRange = INVALID_SCROLL_RANGE;
-    }
-
-    @Override
-    public void setOrientation(int orientation) {
-        if (orientation != VERTICAL) {
-            throw new IllegalArgumentException("AppBarLayout is always vertical and does"
-                    + " not support horizontal orientation");
-        }
-        super.setOrientation(orientation);
-    }
-
-    /**
-     * Sets whether this {@link AppBarLayout} is expanded or not, animating if it has already
-     * been laid out.
-     *
-     * <p>As with {@link AppBarLayout}'s scrolling, this method relies on this layout being a
-     * direct child of a {@link CoordinatorLayout}.</p>
-     *
-     * @param expanded true if the layout should be fully expanded, false if it should
-     *                 be fully collapsed
-     *
-     * @attr ref android.support.design.R.styleable#AppBarLayout_expanded
-     */
-    public void setExpanded(boolean expanded) {
-        setExpanded(expanded, ViewCompat.isLaidOut(this));
-    }
-
-    /**
-     * Sets whether this {@link AppBarLayout} is expanded or not.
-     *
-     * <p>As with {@link AppBarLayout}'s scrolling, this method relies on this layout being a
-     * direct child of a {@link CoordinatorLayout}.</p>
-     *
-     * @param expanded true if the layout should be fully expanded, false if it should
-     *                 be fully collapsed
-     * @param animate Whether to animate to the new state
-     *
-     * @attr ref android.support.design.R.styleable#AppBarLayout_expanded
-     */
-    public void setExpanded(boolean expanded, boolean animate) {
-        setExpanded(expanded, animate, true);
-    }
-
-    private void setExpanded(boolean expanded, boolean animate, boolean force) {
-        mPendingAction = (expanded ? PENDING_ACTION_EXPANDED : PENDING_ACTION_COLLAPSED)
-                | (animate ? PENDING_ACTION_ANIMATE_ENABLED : 0)
-                | (force ? PENDING_ACTION_FORCE : 0);
-        requestLayout();
-    }
-
-    @Override
-    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
-        return p instanceof LayoutParams;
-    }
-
-    @Override
-    protected LayoutParams generateDefaultLayoutParams() {
-        return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
-    }
-
-    @Override
-    public LayoutParams generateLayoutParams(AttributeSet attrs) {
-        return new LayoutParams(getContext(), attrs);
-    }
-
-    @Override
-    protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
-        if (Build.VERSION.SDK_INT >= 19 && p instanceof LinearLayout.LayoutParams) {
-            return new LayoutParams((LinearLayout.LayoutParams) p);
-        } else if (p instanceof MarginLayoutParams) {
-            return new LayoutParams((MarginLayoutParams) p);
-        }
-        return new LayoutParams(p);
-    }
-
-    boolean hasChildWithInterpolator() {
-        return mHaveChildWithInterpolator;
-    }
-
-    /**
-     * Returns the scroll range of all children.
-     *
-     * @return the scroll range in px
-     */
-    public final int getTotalScrollRange() {
-        if (mTotalScrollRange != INVALID_SCROLL_RANGE) {
-            return mTotalScrollRange;
-        }
-
-        int range = 0;
-        for (int i = 0, z = getChildCount(); i < z; i++) {
-            final View child = getChildAt(i);
-            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-            final int childHeight = child.getMeasuredHeight();
-            final int flags = lp.mScrollFlags;
-
-            if ((flags & LayoutParams.SCROLL_FLAG_SCROLL) != 0) {
-                // We're set to scroll so add the child's height
-                range += childHeight + lp.topMargin + lp.bottomMargin;
-
-                if ((flags & LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED) != 0) {
-                    // For a collapsing scroll, we to take the collapsed height into account.
-                    // We also break straight away since later views can't scroll beneath
-                    // us
-                    range -= ViewCompat.getMinimumHeight(child);
-                    break;
-                }
-            } else {
-                // As soon as a view doesn't have the scroll flag, we end the range calculation.
-                // This is because views below can not scroll under a fixed view.
-                break;
-            }
-        }
-        return mTotalScrollRange = Math.max(0, range - getTopInset());
-    }
-
-    boolean hasScrollableChildren() {
-        return getTotalScrollRange() != 0;
-    }
-
-    /**
-     * Return the scroll range when scrolling up from a nested pre-scroll.
-     */
-    int getUpNestedPreScrollRange() {
-        return getTotalScrollRange();
-    }
-
-    /**
-     * Return the scroll range when scrolling down from a nested pre-scroll.
-     */
-    int getDownNestedPreScrollRange() {
-        if (mDownPreScrollRange != INVALID_SCROLL_RANGE) {
-            // If we already have a valid value, return it
-            return mDownPreScrollRange;
-        }
-
-        int range = 0;
-        for (int i = getChildCount() - 1; i >= 0; i--) {
-            final View child = getChildAt(i);
-            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-            final int childHeight = child.getMeasuredHeight();
-            final int flags = lp.mScrollFlags;
-
-            if ((flags & LayoutParams.FLAG_QUICK_RETURN) == LayoutParams.FLAG_QUICK_RETURN) {
-                // First take the margin into account
-                range += lp.topMargin + lp.bottomMargin;
-                // The view has the quick return flag combination...
-                if ((flags & LayoutParams.SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED) != 0) {
-                    // If they're set to enter collapsed, use the minimum height
-                    range += ViewCompat.getMinimumHeight(child);
-                } else if ((flags & LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED) != 0) {
-                    // Only enter by the amount of the collapsed height
-                    range += childHeight - ViewCompat.getMinimumHeight(child);
-                } else {
-                    // Else use the full height (minus the top inset)
-                    range += childHeight - getTopInset();
-                }
-            } else if (range > 0) {
-                // If we've hit an non-quick return scrollable view, and we've already hit a
-                // quick return view, return now
-                break;
-            }
-        }
-        return mDownPreScrollRange = Math.max(0, range);
-    }
-
-    /**
-     * Return the scroll range when scrolling down from a nested scroll.
-     */
-    int getDownNestedScrollRange() {
-        if (mDownScrollRange != INVALID_SCROLL_RANGE) {
-            // If we already have a valid value, return it
-            return mDownScrollRange;
-        }
-
-        int range = 0;
-        for (int i = 0, z = getChildCount(); i < z; i++) {
-            final View child = getChildAt(i);
-            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-            int childHeight = child.getMeasuredHeight();
-            childHeight += lp.topMargin + lp.bottomMargin;
-
-            final int flags = lp.mScrollFlags;
-
-            if ((flags & LayoutParams.SCROLL_FLAG_SCROLL) != 0) {
-                // We're set to scroll so add the child's height
-                range += childHeight;
-
-                if ((flags & LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED) != 0) {
-                    // For a collapsing exit scroll, we to take the collapsed height into account.
-                    // We also break the range straight away since later views can't scroll
-                    // beneath us
-                    range -= ViewCompat.getMinimumHeight(child) + getTopInset();
-                    break;
-                }
-            } else {
-                // As soon as a view doesn't have the scroll flag, we end the range calculation.
-                // This is because views below can not scroll under a fixed view.
-                break;
-            }
-        }
-        return mDownScrollRange = Math.max(0, range);
-    }
-
-    void dispatchOffsetUpdates(int offset) {
-        // Iterate backwards through the list so that most recently added listeners
-        // get the first chance to decide
-        if (mListeners != null) {
-            for (int i = 0, z = mListeners.size(); i < z; i++) {
-                final OnOffsetChangedListener listener = mListeners.get(i);
-                if (listener != null) {
-                    listener.onOffsetChanged(this, offset);
-                }
-            }
-        }
-    }
-
-    final int getMinimumHeightForVisibleOverlappingContent() {
-        final int topInset = getTopInset();
-        final int minHeight = ViewCompat.getMinimumHeight(this);
-        if (minHeight != 0) {
-            // If this layout has a min height, use it (doubled)
-            return (minHeight * 2) + topInset;
-        }
-
-        // Otherwise, we'll use twice the min height of our last child
-        final int childCount = getChildCount();
-        final int lastChildMinHeight = childCount >= 1
-                ? ViewCompat.getMinimumHeight(getChildAt(childCount - 1)) : 0;
-        if (lastChildMinHeight != 0) {
-            return (lastChildMinHeight * 2) + topInset;
-        }
-
-        // If we reach here then we don't have a min height explicitly set. Instead we'll take a
-        // guess at 1/3 of our height being visible
-        return getHeight() / 3;
-    }
-
-    @Override
-    protected int[] onCreateDrawableState(int extraSpace) {
-        if (mTmpStatesArray == null) {
-            // Note that we can't allocate this at the class level (in declaration) since
-            // some paths in super View constructor are going to call this method before
-            // that
-            mTmpStatesArray = new int[2];
-        }
-        final int[] extraStates = mTmpStatesArray;
-        final int[] states = super.onCreateDrawableState(extraSpace + extraStates.length);
-
-        extraStates[0] = mCollapsible ? R.attr.state_collapsible : -R.attr.state_collapsible;
-        extraStates[1] = mCollapsible && mCollapsed
-                ? R.attr.state_collapsed : -R.attr.state_collapsed;
-
-        return mergeDrawableStates(states, extraStates);
-    }
-
-    /**
-     * Sets whether the AppBarLayout has collapsible children or not.
-     *
-     * @return true if the collapsible state changed
-     */
-    private boolean setCollapsibleState(boolean collapsible) {
-        if (mCollapsible != collapsible) {
-            mCollapsible = collapsible;
-            refreshDrawableState();
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Sets whether the AppBarLayout is in a collapsed state or not.
-     *
-     * @return true if the collapsed state changed
-     */
-    boolean setCollapsedState(boolean collapsed) {
-        if (mCollapsed != collapsed) {
-            mCollapsed = collapsed;
-            refreshDrawableState();
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * @deprecated target elevation is now deprecated. AppBarLayout's elevation is now
-     * controlled via a {@link android.animation.StateListAnimator}. If a target
-     * elevation is set, either by this method or the {@code app:elevation} attribute,
-     * a new state list animator is created which uses the given {@code elevation} value.
-     *
-     * @attr ref android.support.design.R.styleable#AppBarLayout_elevation
-     */
-    @Deprecated
-    public void setTargetElevation(float elevation) {
-        if (Build.VERSION.SDK_INT >= 21) {
-            ViewUtilsLollipop.setDefaultAppBarLayoutStateListAnimator(this, elevation);
-        }
-    }
-
-    /**
-     * @deprecated target elevation is now deprecated. AppBarLayout's elevation is now
-     * controlled via a {@link android.animation.StateListAnimator}. This method now
-     * always returns 0.
-     */
-    @Deprecated
-    public float getTargetElevation() {
-        return 0;
-    }
-
-    int getPendingAction() {
-        return mPendingAction;
-    }
-
-    void resetPendingAction() {
-        mPendingAction = PENDING_ACTION_NONE;
-    }
-
-    @VisibleForTesting
-    final int getTopInset() {
-        return mLastInsets != null ? mLastInsets.getSystemWindowInsetTop() : 0;
-    }
-
-    WindowInsetsCompat onWindowInsetChanged(final WindowInsetsCompat insets) {
-        WindowInsetsCompat newInsets = null;
-
-        if (ViewCompat.getFitsSystemWindows(this)) {
-            // If we're set to fit system windows, keep the insets
-            newInsets = insets;
-        }
-
-        // If our insets have changed, keep them and invalidate the scroll ranges...
-        if (!ObjectsCompat.equals(mLastInsets, newInsets)) {
-            mLastInsets = newInsets;
-            invalidateScrollRanges();
-        }
-
-        return insets;
-    }
-
-    public static class LayoutParams extends LinearLayout.LayoutParams {
-
-        /** @hide */
-        @RestrictTo(LIBRARY_GROUP)
-        @IntDef(flag=true, value={
-                SCROLL_FLAG_SCROLL,
-                SCROLL_FLAG_EXIT_UNTIL_COLLAPSED,
-                SCROLL_FLAG_ENTER_ALWAYS,
-                SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED,
-                SCROLL_FLAG_SNAP
-        })
-        @Retention(RetentionPolicy.SOURCE)
-        public @interface ScrollFlags {}
-
-        /**
-         * The view will be scroll in direct relation to scroll events. This flag needs to be
-         * set for any of the other flags to take effect. If any sibling views
-         * before this one do not have this flag, then this value has no effect.
-         */
-        public static final int SCROLL_FLAG_SCROLL = 0x1;
-
-        /**
-         * When exiting (scrolling off screen) the view will be scrolled until it is
-         * 'collapsed'. The collapsed height is defined by the view's minimum height.
-         *
-         * @see ViewCompat#getMinimumHeight(View)
-         * @see View#setMinimumHeight(int)
-         */
-        public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 0x2;
-
-        /**
-         * When entering (scrolling on screen) the view will scroll on any downwards
-         * scroll event, regardless of whether the scrolling view is also scrolling. This
-         * is commonly referred to as the 'quick return' pattern.
-         */
-        public static final int SCROLL_FLAG_ENTER_ALWAYS = 0x4;
-
-        /**
-         * An additional flag for 'enterAlways' which modifies the returning view to
-         * only initially scroll back to it's collapsed height. Once the scrolling view has
-         * reached the end of it's scroll range, the remainder of this view will be scrolled
-         * into view. The collapsed height is defined by the view's minimum height.
-         *
-         * @see ViewCompat#getMinimumHeight(View)
-         * @see View#setMinimumHeight(int)
-         */
-        public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 0x8;
-
-        /**
-         * Upon a scroll ending, if the view is only partially visible then it will be snapped
-         * and scrolled to it's closest edge. For example, if the view only has it's bottom 25%
-         * displayed, it will be scrolled off screen completely. Conversely, if it's bottom 75%
-         * is visible then it will be scrolled fully into view.
-         */
-        public static final int SCROLL_FLAG_SNAP = 0x10;
-
-        /**
-         * Internal flags which allows quick checking features
-         */
-        static final int FLAG_QUICK_RETURN = SCROLL_FLAG_SCROLL | SCROLL_FLAG_ENTER_ALWAYS;
-        static final int FLAG_SNAP = SCROLL_FLAG_SCROLL | SCROLL_FLAG_SNAP;
-        static final int COLLAPSIBLE_FLAGS = SCROLL_FLAG_EXIT_UNTIL_COLLAPSED
-                | SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED;
-
-        int mScrollFlags = SCROLL_FLAG_SCROLL;
-        Interpolator mScrollInterpolator;
-
-        public LayoutParams(Context c, AttributeSet attrs) {
-            super(c, attrs);
-            TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.AppBarLayout_Layout);
-            mScrollFlags = a.getInt(R.styleable.AppBarLayout_Layout_layout_scrollFlags, 0);
-            if (a.hasValue(R.styleable.AppBarLayout_Layout_layout_scrollInterpolator)) {
-                int resId = a.getResourceId(
-                        R.styleable.AppBarLayout_Layout_layout_scrollInterpolator, 0);
-                mScrollInterpolator = android.view.animation.AnimationUtils.loadInterpolator(
-                        c, resId);
-            }
-            a.recycle();
-        }
-
-        public LayoutParams(int width, int height) {
-            super(width, height);
-        }
-
-        public LayoutParams(int width, int height, float weight) {
-            super(width, height, weight);
-        }
-
-        public LayoutParams(ViewGroup.LayoutParams p) {
-            super(p);
-        }
-
-        public LayoutParams(MarginLayoutParams source) {
-            super(source);
-        }
-
-        @RequiresApi(19)
-        public LayoutParams(LinearLayout.LayoutParams source) {
-            // The copy constructor called here only exists on API 19+.
-            super(source);
-        }
-
-        @RequiresApi(19)
-        public LayoutParams(LayoutParams source) {
-            // The copy constructor called here only exists on API 19+.
-            super(source);
-            mScrollFlags = source.mScrollFlags;
-            mScrollInterpolator = source.mScrollInterpolator;
-        }
-
-        /**
-         * Set the scrolling flags.
-         *
-         * @param flags bitwise int of {@link #SCROLL_FLAG_SCROLL},
-         *             {@link #SCROLL_FLAG_EXIT_UNTIL_COLLAPSED}, {@link #SCROLL_FLAG_ENTER_ALWAYS},
-         *             {@link #SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED} and {@link #SCROLL_FLAG_SNAP }.
-         *
-         * @see #getScrollFlags()
-         *
-         * @attr ref android.support.design.R.styleable#AppBarLayout_Layout_layout_scrollFlags
-         */
-        public void setScrollFlags(@ScrollFlags int flags) {
-            mScrollFlags = flags;
-        }
-
-        /**
-         * Returns the scrolling flags.
-         *
-         * @see #setScrollFlags(int)
-         *
-         * @attr ref android.support.design.R.styleable#AppBarLayout_Layout_layout_scrollFlags
-         */
-        @ScrollFlags
-        public int getScrollFlags() {
-            return mScrollFlags;
-        }
-
-        /**
-         * Set the interpolator to when scrolling the view associated with this
-         * {@link LayoutParams}.
-         *
-         * @param interpolator the interpolator to use, or null to use normal 1-to-1 scrolling.
-         *
-         * @attr ref android.support.design.R.styleable#AppBarLayout_Layout_layout_scrollInterpolator
-         * @see #getScrollInterpolator()
-         */
-        public void setScrollInterpolator(Interpolator interpolator) {
-            mScrollInterpolator = interpolator;
-        }
-
-        /**
-         * Returns the {@link Interpolator} being used for scrolling the view associated with this
-         * {@link LayoutParams}. Null indicates 'normal' 1-to-1 scrolling.
-         *
-         * @attr ref android.support.design.R.styleable#AppBarLayout_Layout_layout_scrollInterpolator
-         * @see #setScrollInterpolator(Interpolator)
-         */
-        public Interpolator getScrollInterpolator() {
-            return mScrollInterpolator;
-        }
-
-        /**
-         * Returns true if the scroll flags are compatible for 'collapsing'
-         */
-        boolean isCollapsible() {
-            return (mScrollFlags & SCROLL_FLAG_SCROLL) == SCROLL_FLAG_SCROLL
-                    && (mScrollFlags & COLLAPSIBLE_FLAGS) != 0;
-        }
-    }
-
-    /**
-     * The default {@link Behavior} for {@link AppBarLayout}. Implements the necessary nested
-     * scroll handling with offsetting.
-     */
-    public static class Behavior extends HeaderBehavior<AppBarLayout> {
-        private static final int MAX_OFFSET_ANIMATION_DURATION = 600; // ms
-        private static final int INVALID_POSITION = -1;
-
-        /**
-         * Callback to allow control over any {@link AppBarLayout} dragging.
-         */
-        public static abstract class DragCallback {
-            /**
-             * Allows control over whether the given {@link AppBarLayout} can be dragged or not.
-             *
-             * <p>Dragging is defined as a direct touch on the AppBarLayout with movement. This
-             * call does not affect any nested scrolling.</p>
-             *
-             * @return true if we are in a position to scroll the AppBarLayout via a drag, false
-             *         if not.
-             */
-            public abstract boolean canDrag(@NonNull AppBarLayout appBarLayout);
-        }
-
-        private int mOffsetDelta;
-        private ValueAnimator mOffsetAnimator;
-
-        private int mOffsetToChildIndexOnLayout = INVALID_POSITION;
-        private boolean mOffsetToChildIndexOnLayoutIsMinHeight;
-        private float mOffsetToChildIndexOnLayoutPerc;
-
-        private WeakReference<View> mLastNestedScrollingChildRef;
-        private DragCallback mOnDragCallback;
-
-        public Behavior() {}
-
-        public Behavior(Context context, AttributeSet attrs) {
-            super(context, attrs);
-        }
-
-        @Override
-        public boolean onStartNestedScroll(CoordinatorLayout parent, AppBarLayout child,
-                View directTargetChild, View target, int nestedScrollAxes, int type) {
-            // Return true if we're nested scrolling vertically, and we have scrollable children
-            // and the scrolling view is big enough to scroll
-            final boolean started = (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0
-                    && child.hasScrollableChildren()
-                    && parent.getHeight() - directTargetChild.getHeight() <= child.getHeight();
-
-            if (started && mOffsetAnimator != null) {
-                // Cancel any offset animation
-                mOffsetAnimator.cancel();
-            }
-
-            // A new nested scroll has started so clear out the previous ref
-            mLastNestedScrollingChildRef = null;
-
-            return started;
-        }
-
-        @Override
-        public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child,
-                View target, int dx, int dy, int[] consumed, int type) {
-            if (dy != 0) {
-                int min, max;
-                if (dy < 0) {
-                    // We're scrolling down
-                    min = -child.getTotalScrollRange();
-                    max = min + child.getDownNestedPreScrollRange();
-                } else {
-                    // We're scrolling up
-                    min = -child.getUpNestedPreScrollRange();
-                    max = 0;
-                }
-                if (min != max) {
-                    consumed[1] = scroll(coordinatorLayout, child, dy, min, max);
-                }
-            }
-        }
-
-        @Override
-        public void onNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child,
-                View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed,
-                int type) {
-            if (dyUnconsumed < 0) {
-                // If the scrolling view is scrolling down but not consuming, it's probably be at
-                // the top of it's content
-                scroll(coordinatorLayout, child, dyUnconsumed,
-                        -child.getDownNestedScrollRange(), 0);
-            }
-        }
-
-        @Override
-        public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout abl,
-                View target, int type) {
-            if (type == ViewCompat.TYPE_TOUCH) {
-                // If we haven't been flung then let's see if the current view has been set to snap
-                snapToChildIfNeeded(coordinatorLayout, abl);
-            }
-
-            // Keep a reference to the previous nested scrolling child
-            mLastNestedScrollingChildRef = new WeakReference<>(target);
-        }
-
-        /**
-         * Set a callback to control any {@link AppBarLayout} dragging.
-         *
-         * @param callback the callback to use, or {@code null} to use the default behavior.
-         */
-        public void setDragCallback(@Nullable DragCallback callback) {
-            mOnDragCallback = callback;
-        }
-
-        private void animateOffsetTo(final CoordinatorLayout coordinatorLayout,
-                final AppBarLayout child, final int offset, float velocity) {
-            final int distance = Math.abs(getTopBottomOffsetForScrollingSibling() - offset);
-
-            final int duration;
-            velocity = Math.abs(velocity);
-            if (velocity > 0) {
-                duration = 3 * Math.round(1000 * (distance / velocity));
-            } else {
-                final float distanceRatio = (float) distance / child.getHeight();
-                duration = (int) ((distanceRatio + 1) * 150);
-            }
-
-            animateOffsetWithDuration(coordinatorLayout, child, offset, duration);
-        }
-
-        private void animateOffsetWithDuration(final CoordinatorLayout coordinatorLayout,
-                final AppBarLayout child, final int offset, final int duration) {
-            final int currentOffset = getTopBottomOffsetForScrollingSibling();
-            if (currentOffset == offset) {
-                if (mOffsetAnimator != null && mOffsetAnimator.isRunning()) {
-                    mOffsetAnimator.cancel();
-                }
-                return;
-            }
-
-            if (mOffsetAnimator == null) {
-                mOffsetAnimator = new ValueAnimator();
-                mOffsetAnimator.setInterpolator(AnimationUtils.DECELERATE_INTERPOLATOR);
-                mOffsetAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-                    @Override
-                    public void onAnimationUpdate(ValueAnimator animation) {
-                        setHeaderTopBottomOffset(coordinatorLayout, child,
-                                (int) animation.getAnimatedValue());
-                    }
-                });
-            } else {
-                mOffsetAnimator.cancel();
-            }
-
-            mOffsetAnimator.setDuration(Math.min(duration, MAX_OFFSET_ANIMATION_DURATION));
-            mOffsetAnimator.setIntValues(currentOffset, offset);
-            mOffsetAnimator.start();
-        }
-
-        private int getChildIndexOnOffset(AppBarLayout abl, final int offset) {
-            for (int i = 0, count = abl.getChildCount(); i < count; i++) {
-                View child = abl.getChildAt(i);
-                if (child.getTop() <= -offset && child.getBottom() >= -offset) {
-                    return i;
-                }
-            }
-            return -1;
-        }
-
-        private void snapToChildIfNeeded(CoordinatorLayout coordinatorLayout, AppBarLayout abl) {
-            final int offset = getTopBottomOffsetForScrollingSibling();
-            final int offsetChildIndex = getChildIndexOnOffset(abl, offset);
-            if (offsetChildIndex >= 0) {
-                final View offsetChild = abl.getChildAt(offsetChildIndex);
-                final LayoutParams lp = (LayoutParams) offsetChild.getLayoutParams();
-                final int flags = lp.getScrollFlags();
-
-                if ((flags & LayoutParams.FLAG_SNAP) == LayoutParams.FLAG_SNAP) {
-                    // We're set the snap, so animate the offset to the nearest edge
-                    int snapTop = -offsetChild.getTop();
-                    int snapBottom = -offsetChild.getBottom();
-
-                    if (offsetChildIndex == abl.getChildCount() - 1) {
-                        // If this is the last child, we need to take the top inset into account
-                        snapBottom += abl.getTopInset();
-                    }
-
-                    if (checkFlag(flags, LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED)) {
-                        // If the view is set only exit until it is collapsed, we'll abide by that
-                        snapBottom += ViewCompat.getMinimumHeight(offsetChild);
-                    } else if (checkFlag(flags, LayoutParams.FLAG_QUICK_RETURN
-                            | LayoutParams.SCROLL_FLAG_ENTER_ALWAYS)) {
-                        // If it's set to always enter collapsed, it actually has two states. We
-                        // select the state and then snap within the state
-                        final int seam = snapBottom + ViewCompat.getMinimumHeight(offsetChild);
-                        if (offset < seam) {
-                            snapTop = seam;
-                        } else {
-                            snapBottom = seam;
-                        }
-                    }
-
-                    final int newOffset = offset < (snapBottom + snapTop) / 2
-                            ? snapBottom
-                            : snapTop;
-                    animateOffsetTo(coordinatorLayout, abl,
-                            MathUtils.clamp(newOffset, -abl.getTotalScrollRange(), 0), 0);
-                }
-            }
-        }
-
-        private static boolean checkFlag(final int flags, final int check) {
-            return (flags & check) == check;
-        }
-
-        @Override
-        public boolean onMeasureChild(CoordinatorLayout parent, AppBarLayout child,
-                int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec,
-                int heightUsed) {
-            final CoordinatorLayout.LayoutParams lp =
-                    (CoordinatorLayout.LayoutParams) child.getLayoutParams();
-            if (lp.height == CoordinatorLayout.LayoutParams.WRAP_CONTENT) {
-                // If the view is set to wrap on it's height, CoordinatorLayout by default will
-                // cap the view at the CoL's height. Since the AppBarLayout can scroll, this isn't
-                // what we actually want, so we measure it ourselves with an unspecified spec to
-                // allow the child to be larger than it's parent
-                parent.onMeasureChild(child, parentWidthMeasureSpec, widthUsed,
-                        MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), heightUsed);
-                return true;
-            }
-
-            // Let the parent handle it as normal
-            return super.onMeasureChild(parent, child, parentWidthMeasureSpec, widthUsed,
-                    parentHeightMeasureSpec, heightUsed);
-        }
-
-        @Override
-        public boolean onLayoutChild(CoordinatorLayout parent, AppBarLayout abl,
-                int layoutDirection) {
-            boolean handled = super.onLayoutChild(parent, abl, layoutDirection);
-
-            // The priority for for actions here is (first which is true wins):
-            // 1. forced pending actions
-            // 2. offsets for restorations
-            // 3. non-forced pending actions
-            final int pendingAction = abl.getPendingAction();
-            if (mOffsetToChildIndexOnLayout >= 0 && (pendingAction & PENDING_ACTION_FORCE) == 0) {
-                View child = abl.getChildAt(mOffsetToChildIndexOnLayout);
-                int offset = -child.getBottom();
-                if (mOffsetToChildIndexOnLayoutIsMinHeight) {
-                    offset += ViewCompat.getMinimumHeight(child) + abl.getTopInset();
-                } else {
-                    offset += Math.round(child.getHeight() * mOffsetToChildIndexOnLayoutPerc);
-                }
-                setHeaderTopBottomOffset(parent, abl, offset);
-            } else if (pendingAction != PENDING_ACTION_NONE) {
-                final boolean animate = (pendingAction & PENDING_ACTION_ANIMATE_ENABLED) != 0;
-                if ((pendingAction & PENDING_ACTION_COLLAPSED) != 0) {
-                    final int offset = -abl.getUpNestedPreScrollRange();
-                    if (animate) {
-                        animateOffsetTo(parent, abl, offset, 0);
-                    } else {
-                        setHeaderTopBottomOffset(parent, abl, offset);
-                    }
-                } else if ((pendingAction & PENDING_ACTION_EXPANDED) != 0) {
-                    if (animate) {
-                        animateOffsetTo(parent, abl, 0, 0);
-                    } else {
-                        setHeaderTopBottomOffset(parent, abl, 0);
-                    }
-                }
-            }
-
-            // Finally reset any pending states
-            abl.resetPendingAction();
-            mOffsetToChildIndexOnLayout = INVALID_POSITION;
-
-            // We may have changed size, so let's constrain the top and bottom offset correctly,
-            // just in case we're out of the bounds
-            setTopAndBottomOffset(
-                    MathUtils.clamp(getTopAndBottomOffset(), -abl.getTotalScrollRange(), 0));
-
-            // Update the AppBarLayout's drawable state for any elevation changes.
-            // This is needed so that the elevation is set in the first layout, so that
-            // we don't get a visual elevation jump pre-N (due to the draw dispatch skip)
-            updateAppBarLayoutDrawableState(parent, abl, getTopAndBottomOffset(), 0, true);
-
-            // Make sure we dispatch the offset update
-            abl.dispatchOffsetUpdates(getTopAndBottomOffset());
-
-            return handled;
-        }
-
-        @Override
-        boolean canDragView(AppBarLayout view) {
-            if (mOnDragCallback != null) {
-                // If there is a drag callback set, it's in control
-                return mOnDragCallback.canDrag(view);
-            }
-
-            // Else we'll use the default behaviour of seeing if it can scroll down
-            if (mLastNestedScrollingChildRef != null) {
-                // If we have a reference to a scrolling view, check it
-                final View scrollingView = mLastNestedScrollingChildRef.get();
-                return scrollingView != null && scrollingView.isShown()
-                        && !scrollingView.canScrollVertically(-1);
-            } else {
-                // Otherwise we assume that the scrolling view hasn't been scrolled and can drag.
-                return true;
-            }
-        }
-
-        @Override
-        void onFlingFinished(CoordinatorLayout parent, AppBarLayout layout) {
-            // At the end of a manual fling, check to see if we need to snap to the edge-child
-            snapToChildIfNeeded(parent, layout);
-        }
-
-        @Override
-        int getMaxDragOffset(AppBarLayout view) {
-            return -view.getDownNestedScrollRange();
-        }
-
-        @Override
-        int getScrollRangeForDragFling(AppBarLayout view) {
-            return view.getTotalScrollRange();
-        }
-
-        @Override
-        int setHeaderTopBottomOffset(CoordinatorLayout coordinatorLayout,
-                AppBarLayout appBarLayout, int newOffset, int minOffset, int maxOffset) {
-            final int curOffset = getTopBottomOffsetForScrollingSibling();
-            int consumed = 0;
-
-            if (minOffset != 0 && curOffset >= minOffset && curOffset <= maxOffset) {
-                // If we have some scrolling range, and we're currently within the min and max
-                // offsets, calculate a new offset
-                newOffset = MathUtils.clamp(newOffset, minOffset, maxOffset);
-                if (curOffset != newOffset) {
-                    final int interpolatedOffset = appBarLayout.hasChildWithInterpolator()
-                            ? interpolateOffset(appBarLayout, newOffset)
-                            : newOffset;
-
-                    final boolean offsetChanged = setTopAndBottomOffset(interpolatedOffset);
-
-                    // Update how much dy we have consumed
-                    consumed = curOffset - newOffset;
-                    // Update the stored sibling offset
-                    mOffsetDelta = newOffset - interpolatedOffset;
-
-                    if (!offsetChanged && appBarLayout.hasChildWithInterpolator()) {
-                        // If the offset hasn't changed and we're using an interpolated scroll
-                        // then we need to keep any dependent views updated. CoL will do this for
-                        // us when we move, but we need to do it manually when we don't (as an
-                        // interpolated scroll may finish early).
-                        coordinatorLayout.dispatchDependentViewsChanged(appBarLayout);
-                    }
-
-                    // Dispatch the updates to any listeners
-                    appBarLayout.dispatchOffsetUpdates(getTopAndBottomOffset());
-
-                    // Update the AppBarLayout's drawable state (for any elevation changes)
-                    updateAppBarLayoutDrawableState(coordinatorLayout, appBarLayout, newOffset,
-                            newOffset < curOffset ? -1 : 1, false);
-                }
-            } else {
-                // Reset the offset delta
-                mOffsetDelta = 0;
-            }
-
-            return consumed;
-        }
-
-        @VisibleForTesting
-        boolean isOffsetAnimatorRunning() {
-            return mOffsetAnimator != null && mOffsetAnimator.isRunning();
-        }
-
-        private int interpolateOffset(AppBarLayout layout, final int offset) {
-            final int absOffset = Math.abs(offset);
-
-            for (int i = 0, z = layout.getChildCount(); i < z; i++) {
-                final View child = layout.getChildAt(i);
-                final AppBarLayout.LayoutParams childLp = (LayoutParams) child.getLayoutParams();
-                final Interpolator interpolator = childLp.getScrollInterpolator();
-
-                if (absOffset >= child.getTop() && absOffset <= child.getBottom()) {
-                    if (interpolator != null) {
-                        int childScrollableHeight = 0;
-                        final int flags = childLp.getScrollFlags();
-                        if ((flags & LayoutParams.SCROLL_FLAG_SCROLL) != 0) {
-                            // We're set to scroll so add the child's height plus margin
-                            childScrollableHeight += child.getHeight() + childLp.topMargin
-                                    + childLp.bottomMargin;
-
-                            if ((flags & LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED) != 0) {
-                                // For a collapsing scroll, we to take the collapsed height
-                                // into account.
-                                childScrollableHeight -= ViewCompat.getMinimumHeight(child);
-                            }
-                        }
-
-                        if (ViewCompat.getFitsSystemWindows(child)) {
-                            childScrollableHeight -= layout.getTopInset();
-                        }
-
-                        if (childScrollableHeight > 0) {
-                            final int offsetForView = absOffset - child.getTop();
-                            final int interpolatedDiff = Math.round(childScrollableHeight *
-                                    interpolator.getInterpolation(
-                                            offsetForView / (float) childScrollableHeight));
-
-                            return Integer.signum(offset) * (child.getTop() + interpolatedDiff);
-                        }
-                    }
-
-                    // If we get to here then the view on the offset isn't suitable for interpolated
-                    // scrolling. So break out of the loop
-                    break;
-                }
-            }
-
-            return offset;
-        }
-
-        private void updateAppBarLayoutDrawableState(final CoordinatorLayout parent,
-                final AppBarLayout layout, final int offset, final int direction,
-                final boolean forceJump) {
-            final View child = getAppBarChildOnOffset(layout, offset);
-            if (child != null) {
-                final AppBarLayout.LayoutParams childLp = (LayoutParams) child.getLayoutParams();
-                final int flags = childLp.getScrollFlags();
-                boolean collapsed = false;
-
-                if ((flags & LayoutParams.SCROLL_FLAG_SCROLL) != 0) {
-                    final int minHeight = ViewCompat.getMinimumHeight(child);
-
-                    if (direction > 0 && (flags & (LayoutParams.SCROLL_FLAG_ENTER_ALWAYS
-                            | LayoutParams.SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED)) != 0) {
-                        // We're set to enter always collapsed so we are only collapsed when
-                        // being scrolled down, and in a collapsed offset
-                        collapsed = -offset >= child.getBottom() - minHeight - layout.getTopInset();
-                    } else if ((flags & LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED) != 0) {
-                        // We're set to exit until collapsed, so any offset which results in
-                        // the minimum height (or less) being shown is collapsed
-                        collapsed = -offset >= child.getBottom() - minHeight - layout.getTopInset();
-                    }
-                }
-
-                final boolean changed = layout.setCollapsedState(collapsed);
-
-                if (Build.VERSION.SDK_INT >= 11 && (forceJump
-                        || (changed && shouldJumpElevationState(parent, layout)))) {
-                    // If the collapsed state changed, we may need to
-                    // jump to the current state if we have an overlapping view
-                    layout.jumpDrawablesToCurrentState();
-                }
-            }
-        }
-
-        private boolean shouldJumpElevationState(CoordinatorLayout parent, AppBarLayout layout) {
-            // We should jump the elevated state if we have a dependent scrolling view which has
-            // an overlapping top (i.e. overlaps us)
-            final List<View> dependencies = parent.getDependents(layout);
-            for (int i = 0, size = dependencies.size(); i < size; i++) {
-                final View dependency = dependencies.get(i);
-                final CoordinatorLayout.LayoutParams lp =
-                        (CoordinatorLayout.LayoutParams) dependency.getLayoutParams();
-                final CoordinatorLayout.Behavior behavior = lp.getBehavior();
-
-                if (behavior instanceof ScrollingViewBehavior) {
-                    return ((ScrollingViewBehavior) behavior).getOverlayTop() != 0;
-                }
-            }
-            return false;
-        }
-
-        private static View getAppBarChildOnOffset(final AppBarLayout layout, final int offset) {
-            final int absOffset = Math.abs(offset);
-            for (int i = 0, z = layout.getChildCount(); i < z; i++) {
-                final View child = layout.getChildAt(i);
-                if (absOffset >= child.getTop() && absOffset <= child.getBottom()) {
-                    return child;
-                }
-            }
-            return null;
-        }
-
-        @Override
-        int getTopBottomOffsetForScrollingSibling() {
-            return getTopAndBottomOffset() + mOffsetDelta;
-        }
-
-        @Override
-        public Parcelable onSaveInstanceState(CoordinatorLayout parent, AppBarLayout abl) {
-            final Parcelable superState = super.onSaveInstanceState(parent, abl);
-            final int offset = getTopAndBottomOffset();
-
-            // Try and find the first visible child...
-            for (int i = 0, count = abl.getChildCount(); i < count; i++) {
-                View child = abl.getChildAt(i);
-                final int visBottom = child.getBottom() + offset;
-
-                if (child.getTop() + offset <= 0 && visBottom >= 0) {
-                    final SavedState ss = new SavedState(superState);
-                    ss.firstVisibleChildIndex = i;
-                    ss.firstVisibleChildAtMinimumHeight =
-                            visBottom == (ViewCompat.getMinimumHeight(child) + abl.getTopInset());
-                    ss.firstVisibleChildPercentageShown = visBottom / (float) child.getHeight();
-                    return ss;
-                }
-            }
-
-            // Else we'll just return the super state
-            return superState;
-        }
-
-        @Override
-        public void onRestoreInstanceState(CoordinatorLayout parent, AppBarLayout appBarLayout,
-                Parcelable state) {
-            if (state instanceof SavedState) {
-                final SavedState ss = (SavedState) state;
-                super.onRestoreInstanceState(parent, appBarLayout, ss.getSuperState());
-                mOffsetToChildIndexOnLayout = ss.firstVisibleChildIndex;
-                mOffsetToChildIndexOnLayoutPerc = ss.firstVisibleChildPercentageShown;
-                mOffsetToChildIndexOnLayoutIsMinHeight = ss.firstVisibleChildAtMinimumHeight;
-            } else {
-                super.onRestoreInstanceState(parent, appBarLayout, state);
-                mOffsetToChildIndexOnLayout = INVALID_POSITION;
-            }
-        }
-
-        protected static class SavedState extends AbsSavedState {
-            int firstVisibleChildIndex;
-            float firstVisibleChildPercentageShown;
-            boolean firstVisibleChildAtMinimumHeight;
-
-            public SavedState(Parcel source, ClassLoader loader) {
-                super(source, loader);
-                firstVisibleChildIndex = source.readInt();
-                firstVisibleChildPercentageShown = source.readFloat();
-                firstVisibleChildAtMinimumHeight = source.readByte() != 0;
-            }
-
-            public SavedState(Parcelable superState) {
-                super(superState);
-            }
-
-            @Override
-            public void writeToParcel(Parcel dest, int flags) {
-                super.writeToParcel(dest, flags);
-                dest.writeInt(firstVisibleChildIndex);
-                dest.writeFloat(firstVisibleChildPercentageShown);
-                dest.writeByte((byte) (firstVisibleChildAtMinimumHeight ? 1 : 0));
-            }
-
-            public static final Creator<SavedState> CREATOR = new ClassLoaderCreator<SavedState>() {
-                @Override
-                public SavedState createFromParcel(Parcel source, ClassLoader loader) {
-                    return new SavedState(source, loader);
-                }
-
-                @Override
-                public SavedState createFromParcel(Parcel source) {
-                    return new SavedState(source, null);
-                }
-
-                @Override
-                public SavedState[] newArray(int size) {
-                    return new SavedState[size];
-                }
-            };
-        }
-    }
-
-    /**
-     * Behavior which should be used by {@link View}s which can scroll vertically and support
-     * nested scrolling to automatically scroll any {@link AppBarLayout} siblings.
-     */
-    public static class ScrollingViewBehavior extends HeaderScrollingViewBehavior {
-
-        public ScrollingViewBehavior() {}
-
-        public ScrollingViewBehavior(Context context, AttributeSet attrs) {
-            super(context, attrs);
-
-            final TypedArray a = context.obtainStyledAttributes(attrs,
-                    R.styleable.ScrollingViewBehavior_Layout);
-            setOverlayTop(a.getDimensionPixelSize(
-                    R.styleable.ScrollingViewBehavior_Layout_behavior_overlapTop, 0));
-            a.recycle();
-        }
-
-        @Override
-        public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
-            // We depend on any AppBarLayouts
-            return dependency instanceof AppBarLayout;
-        }
-
-        @Override
-        public boolean onDependentViewChanged(CoordinatorLayout parent, View child,
-                View dependency) {
-            offsetChildAsNeeded(parent, child, dependency);
-            return false;
-        }
-
-        @Override
-        public boolean onRequestChildRectangleOnScreen(CoordinatorLayout parent, View child,
-                Rect rectangle, boolean immediate) {
-            final AppBarLayout header = findFirstDependency(parent.getDependencies(child));
-            if (header != null) {
-                // Offset the rect by the child's left/top
-                rectangle.offset(child.getLeft(), child.getTop());
-
-                final Rect parentRect = mTempRect1;
-                parentRect.set(0, 0, parent.getWidth(), parent.getHeight());
-
-                if (!parentRect.contains(rectangle)) {
-                    // If the rectangle can not be fully seen the visible bounds, collapse
-                    // the AppBarLayout
-                    header.setExpanded(false, !immediate);
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        private void offsetChildAsNeeded(CoordinatorLayout parent, View child, View dependency) {
-            final CoordinatorLayout.Behavior behavior =
-                    ((CoordinatorLayout.LayoutParams) dependency.getLayoutParams()).getBehavior();
-            if (behavior instanceof Behavior) {
-                // Offset the child, pinning it to the bottom the header-dependency, maintaining
-                // any vertical gap and overlap
-                final Behavior ablBehavior = (Behavior) behavior;
-                ViewCompat.offsetTopAndBottom(child, (dependency.getBottom() - child.getTop())
-                        + ablBehavior.mOffsetDelta
-                        + getVerticalLayoutGap()
-                        - getOverlapPixelsForOffset(dependency));
-            }
-        }
-
-        @Override
-        float getOverlapRatioForOffset(final View header) {
-            if (header instanceof AppBarLayout) {
-                final AppBarLayout abl = (AppBarLayout) header;
-                final int totalScrollRange = abl.getTotalScrollRange();
-                final int preScrollDown = abl.getDownNestedPreScrollRange();
-                final int offset = getAppBarLayoutOffset(abl);
-
-                if (preScrollDown != 0 && (totalScrollRange + offset) <= preScrollDown) {
-                    // If we're in a pre-scroll down. Don't use the offset at all.
-                    return 0;
-                } else {
-                    final int availScrollRange = totalScrollRange - preScrollDown;
-                    if (availScrollRange != 0) {
-                        // Else we'll use a interpolated ratio of the overlap, depending on offset
-                        return 1f + (offset / (float) availScrollRange);
-                    }
-                }
-            }
-            return 0f;
-        }
-
-        private static int getAppBarLayoutOffset(AppBarLayout abl) {
-            final CoordinatorLayout.Behavior behavior =
-                    ((CoordinatorLayout.LayoutParams) abl.getLayoutParams()).getBehavior();
-            if (behavior instanceof Behavior) {
-                return ((Behavior) behavior).getTopBottomOffsetForScrollingSibling();
-            }
-            return 0;
-        }
-
-        @Override
-        AppBarLayout findFirstDependency(List<View> views) {
-            for (int i = 0, z = views.size(); i < z; i++) {
-                View view = views.get(i);
-                if (view instanceof AppBarLayout) {
-                    return (AppBarLayout) view;
-                }
-            }
-            return null;
-        }
-
-        @Override
-        int getScrollRange(View v) {
-            if (v instanceof AppBarLayout) {
-                return ((AppBarLayout) v).getTotalScrollRange();
-            } else {
-                return super.getScrollRange(v);
-            }
-        }
-    }
-}
diff --git a/design/src/android/support/design/widget/BaseTransientBottomBar.java b/design/src/android/support/design/widget/BaseTransientBottomBar.java
deleted file mode 100644
index 18c9ef9..0000000
--- a/design/src/android/support/design/widget/BaseTransientBottomBar.java
+++ /dev/null
@@ -1,753 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-import static android.support.design.widget.AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.os.Build;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.RestrictTo;
-import android.support.design.R;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.WindowInsetsCompat;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.view.accessibility.AccessibilityManager;
-import android.view.animation.Animation;
-import android.view.animation.AnimationUtils;
-import android.widget.FrameLayout;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Base class for lightweight transient bars that are displayed along the bottom edge of the
- * application window.
- *
- * @param <B> The transient bottom bar subclass.
- */
-public abstract class BaseTransientBottomBar<B extends BaseTransientBottomBar<B>> {
-    /**
-     * Base class for {@link BaseTransientBottomBar} callbacks.
-     *
-     * @param <B> The transient bottom bar subclass.
-     * @see BaseTransientBottomBar#addCallback(BaseCallback)
-     */
-    public abstract static class BaseCallback<B> {
-        /** Indicates that the Snackbar was dismissed via a swipe.*/
-        public static final int DISMISS_EVENT_SWIPE = 0;
-        /** Indicates that the Snackbar was dismissed via an action click.*/
-        public static final int DISMISS_EVENT_ACTION = 1;
-        /** Indicates that the Snackbar was dismissed via a timeout.*/
-        public static final int DISMISS_EVENT_TIMEOUT = 2;
-        /** Indicates that the Snackbar was dismissed via a call to {@link #dismiss()}.*/
-        public static final int DISMISS_EVENT_MANUAL = 3;
-        /** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/
-        public static final int DISMISS_EVENT_CONSECUTIVE = 4;
-
-        /** @hide */
-        @RestrictTo(LIBRARY_GROUP)
-        @IntDef({DISMISS_EVENT_SWIPE, DISMISS_EVENT_ACTION, DISMISS_EVENT_TIMEOUT,
-                DISMISS_EVENT_MANUAL, DISMISS_EVENT_CONSECUTIVE})
-        @Retention(RetentionPolicy.SOURCE)
-        public @interface DismissEvent {}
-
-        /**
-         * Called when the given {@link BaseTransientBottomBar} has been dismissed, either
-         * through a time-out, having been manually dismissed, or an action being clicked.
-         *
-         * @param transientBottomBar The transient bottom bar which has been dismissed.
-         * @param event The event which caused the dismissal. One of either:
-         *              {@link #DISMISS_EVENT_SWIPE}, {@link #DISMISS_EVENT_ACTION},
-         *              {@link #DISMISS_EVENT_TIMEOUT}, {@link #DISMISS_EVENT_MANUAL} or
-         *              {@link #DISMISS_EVENT_CONSECUTIVE}.
-         *
-         * @see BaseTransientBottomBar#dismiss()
-         */
-        public void onDismissed(B transientBottomBar, @DismissEvent int event) {
-            // empty
-        }
-
-        /**
-         * Called when the given {@link BaseTransientBottomBar} is visible.
-         *
-         * @param transientBottomBar The transient bottom bar which is now visible.
-         * @see BaseTransientBottomBar#show()
-         */
-        public void onShown(B transientBottomBar) {
-            // empty
-        }
-    }
-
-    /**
-     * Interface that defines the behavior of the main content of a transient bottom bar.
-     */
-    public interface ContentViewCallback {
-        /**
-         * Animates the content of the transient bottom bar in.
-         *
-         * @param delay Animation delay.
-         * @param duration Animation duration.
-         */
-        void animateContentIn(int delay, int duration);
-
-        /**
-         * Animates the content of the transient bottom bar out.
-         *
-         * @param delay Animation delay.
-         * @param duration Animation duration.
-         */
-        void animateContentOut(int delay, int duration);
-    }
-
-    /**
-     * @hide
-     */
-    @RestrictTo(LIBRARY_GROUP)
-    @IntDef({LENGTH_INDEFINITE, LENGTH_SHORT, LENGTH_LONG})
-    @IntRange(from = 1)
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface Duration {}
-
-    /**
-     * Show the Snackbar indefinitely. This means that the Snackbar will be displayed from the time
-     * that is {@link #show() shown} until either it is dismissed, or another Snackbar is shown.
-     *
-     * @see #setDuration
-     */
-    public static final int LENGTH_INDEFINITE = -2;
-
-    /**
-     * Show the Snackbar for a short period of time.
-     *
-     * @see #setDuration
-     */
-    public static final int LENGTH_SHORT = -1;
-
-    /**
-     * Show the Snackbar for a long period of time.
-     *
-     * @see #setDuration
-     */
-    public static final int LENGTH_LONG = 0;
-
-    static final int ANIMATION_DURATION = 250;
-    static final int ANIMATION_FADE_DURATION = 180;
-
-    static final Handler sHandler;
-    static final int MSG_SHOW = 0;
-    static final int MSG_DISMISS = 1;
-
-    // On JB/KK versions of the platform sometimes View.setTranslationY does not
-    // result in layout / draw pass, and CoordinatorLayout relies on a draw pass to
-    // happen to sync vertical positioning of all its child views
-    private static final boolean USE_OFFSET_API = (Build.VERSION.SDK_INT >= 16)
-            && (Build.VERSION.SDK_INT <= 19);
-
-    static {
-        sHandler = new Handler(Looper.getMainLooper(), new Handler.Callback() {
-            @Override
-            public boolean handleMessage(Message message) {
-                switch (message.what) {
-                    case MSG_SHOW:
-                        ((BaseTransientBottomBar) message.obj).showView();
-                        return true;
-                    case MSG_DISMISS:
-                        ((BaseTransientBottomBar) message.obj).hideView(message.arg1);
-                        return true;
-                }
-                return false;
-            }
-        });
-    }
-
-    private final ViewGroup mTargetParent;
-    private final Context mContext;
-    final SnackbarBaseLayout mView;
-    private final ContentViewCallback mContentViewCallback;
-    private int mDuration;
-
-    private List<BaseCallback<B>> mCallbacks;
-
-    private final AccessibilityManager mAccessibilityManager;
-
-    /**
-     * @hide
-     */
-    @RestrictTo(LIBRARY_GROUP)
-    interface OnLayoutChangeListener {
-        void onLayoutChange(View view, int left, int top, int right, int bottom);
-    }
-
-    /**
-     * @hide
-     */
-    @RestrictTo(LIBRARY_GROUP)
-    interface OnAttachStateChangeListener {
-        void onViewAttachedToWindow(View v);
-        void onViewDetachedFromWindow(View v);
-    }
-
-    /**
-     * Constructor for the transient bottom bar.
-     *
-     * @param parent The parent for this transient bottom bar.
-     * @param content The content view for this transient bottom bar.
-     * @param contentViewCallback The content view callback for this transient bottom bar.
-     */
-    protected BaseTransientBottomBar(@NonNull ViewGroup parent, @NonNull View content,
-            @NonNull ContentViewCallback contentViewCallback) {
-        if (parent == null) {
-            throw new IllegalArgumentException("Transient bottom bar must have non-null parent");
-        }
-        if (content == null) {
-            throw new IllegalArgumentException("Transient bottom bar must have non-null content");
-        }
-        if (contentViewCallback == null) {
-            throw new IllegalArgumentException("Transient bottom bar must have non-null callback");
-        }
-
-        mTargetParent = parent;
-        mContentViewCallback = contentViewCallback;
-        mContext = parent.getContext();
-
-        ThemeUtils.checkAppCompatTheme(mContext);
-
-        LayoutInflater inflater = LayoutInflater.from(mContext);
-        // Note that for backwards compatibility reasons we inflate a layout that is defined
-        // in the extending Snackbar class. This is to prevent breakage of apps that have custom
-        // coordinator layout behaviors that depend on that layout.
-        mView = (SnackbarBaseLayout) inflater.inflate(
-                R.layout.design_layout_snackbar, mTargetParent, false);
-        mView.addView(content);
-
-        ViewCompat.setAccessibilityLiveRegion(mView,
-                ViewCompat.ACCESSIBILITY_LIVE_REGION_POLITE);
-        ViewCompat.setImportantForAccessibility(mView,
-                ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
-
-        // Make sure that we fit system windows and have a listener to apply any insets
-        ViewCompat.setFitsSystemWindows(mView, true);
-        ViewCompat.setOnApplyWindowInsetsListener(mView,
-                new android.support.v4.view.OnApplyWindowInsetsListener() {
-                    @Override
-                    public WindowInsetsCompat onApplyWindowInsets(View v,
-                            WindowInsetsCompat insets) {
-                        // Copy over the bottom inset as padding so that we're displayed
-                        // above the navigation bar
-                        v.setPadding(v.getPaddingLeft(), v.getPaddingTop(),
-                                v.getPaddingRight(), insets.getSystemWindowInsetBottom());
-                        return insets;
-                    }
-                });
-
-        mAccessibilityManager = (AccessibilityManager)
-                mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
-    }
-
-    /**
-     * Set how long to show the view for.
-     *
-     * @param duration either be one of the predefined lengths:
-     *                 {@link #LENGTH_SHORT}, {@link #LENGTH_LONG}, or a custom duration
-     *                 in milliseconds.
-     */
-    @NonNull
-    public B setDuration(@Duration int duration) {
-        mDuration = duration;
-        return (B) this;
-    }
-
-    /**
-     * Return the duration.
-     *
-     * @see #setDuration
-     */
-    @Duration
-    public int getDuration() {
-        return mDuration;
-    }
-
-    /**
-     * Returns the {@link BaseTransientBottomBar}'s context.
-     */
-    @NonNull
-    public Context getContext() {
-        return mContext;
-    }
-
-    /**
-     * Returns the {@link BaseTransientBottomBar}'s view.
-     */
-    @NonNull
-    public View getView() {
-        return mView;
-    }
-
-    /**
-     * Show the {@link BaseTransientBottomBar}.
-     */
-    public void show() {
-        SnackbarManager.getInstance().show(mDuration, mManagerCallback);
-    }
-
-    /**
-     * Dismiss the {@link BaseTransientBottomBar}.
-     */
-    public void dismiss() {
-        dispatchDismiss(BaseCallback.DISMISS_EVENT_MANUAL);
-    }
-
-    void dispatchDismiss(@BaseCallback.DismissEvent int event) {
-        SnackbarManager.getInstance().dismiss(mManagerCallback, event);
-    }
-
-    /**
-     * Adds the specified callback to the list of callbacks that will be notified of transient
-     * bottom bar events.
-     *
-     * @param callback Callback to notify when transient bottom bar events occur.
-     * @see #removeCallback(BaseCallback)
-     */
-    @NonNull
-    public B addCallback(@NonNull BaseCallback<B> callback) {
-        if (callback == null) {
-            return (B) this;
-        }
-        if (mCallbacks == null) {
-            mCallbacks = new ArrayList<BaseCallback<B>>();
-        }
-        mCallbacks.add(callback);
-        return (B) this;
-    }
-
-    /**
-     * Removes the specified callback from the list of callbacks that will be notified of transient
-     * bottom bar events.
-     *
-     * @param callback Callback to remove from being notified of transient bottom bar events
-     * @see #addCallback(BaseCallback)
-     */
-    @NonNull
-    public B removeCallback(@NonNull BaseCallback<B> callback) {
-        if (callback == null) {
-            return (B) this;
-        }
-        if (mCallbacks == null) {
-            // This can happen if this method is called before the first call to addCallback
-            return (B) this;
-        }
-        mCallbacks.remove(callback);
-        return (B) this;
-    }
-
-    /**
-     * Return whether this {@link BaseTransientBottomBar} is currently being shown.
-     */
-    public boolean isShown() {
-        return SnackbarManager.getInstance().isCurrent(mManagerCallback);
-    }
-
-    /**
-     * Returns whether this {@link BaseTransientBottomBar} is currently being shown, or is queued
-     * to be shown next.
-     */
-    public boolean isShownOrQueued() {
-        return SnackbarManager.getInstance().isCurrentOrNext(mManagerCallback);
-    }
-
-    final SnackbarManager.Callback mManagerCallback = new SnackbarManager.Callback() {
-        @Override
-        public void show() {
-            sHandler.sendMessage(sHandler.obtainMessage(MSG_SHOW, BaseTransientBottomBar.this));
-        }
-
-        @Override
-        public void dismiss(int event) {
-            sHandler.sendMessage(sHandler.obtainMessage(MSG_DISMISS, event, 0,
-                    BaseTransientBottomBar.this));
-        }
-    };
-
-    final void showView() {
-        if (mView.getParent() == null) {
-            final ViewGroup.LayoutParams lp = mView.getLayoutParams();
-
-            if (lp instanceof CoordinatorLayout.LayoutParams) {
-                // If our LayoutParams are from a CoordinatorLayout, we'll setup our Behavior
-                final CoordinatorLayout.LayoutParams clp = (CoordinatorLayout.LayoutParams) lp;
-
-                final Behavior behavior = new Behavior();
-                behavior.setStartAlphaSwipeDistance(0.1f);
-                behavior.setEndAlphaSwipeDistance(0.6f);
-                behavior.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_START_TO_END);
-                behavior.setListener(new SwipeDismissBehavior.OnDismissListener() {
-                    @Override
-                    public void onDismiss(View view) {
-                        view.setVisibility(View.GONE);
-                        dispatchDismiss(BaseCallback.DISMISS_EVENT_SWIPE);
-                    }
-
-                    @Override
-                    public void onDragStateChanged(int state) {
-                        switch (state) {
-                            case SwipeDismissBehavior.STATE_DRAGGING:
-                            case SwipeDismissBehavior.STATE_SETTLING:
-                                // If the view is being dragged or settling, pause the timeout
-                                SnackbarManager.getInstance().pauseTimeout(mManagerCallback);
-                                break;
-                            case SwipeDismissBehavior.STATE_IDLE:
-                                // If the view has been released and is idle, restore the timeout
-                                SnackbarManager.getInstance()
-                                        .restoreTimeoutIfPaused(mManagerCallback);
-                                break;
-                        }
-                    }
-                });
-                clp.setBehavior(behavior);
-                // Also set the inset edge so that views can dodge the bar correctly
-                clp.insetEdge = Gravity.BOTTOM;
-            }
-
-            mTargetParent.addView(mView);
-        }
-
-        mView.setOnAttachStateChangeListener(
-                new BaseTransientBottomBar.OnAttachStateChangeListener() {
-                @Override
-                public void onViewAttachedToWindow(View v) {}
-
-                @Override
-                public void onViewDetachedFromWindow(View v) {
-                    if (isShownOrQueued()) {
-                        // If we haven't already been dismissed then this event is coming from a
-                        // non-user initiated action. Hence we need to make sure that we callback
-                        // and keep our state up to date. We need to post the call since
-                        // removeView() will call through to onDetachedFromWindow and thus overflow.
-                        sHandler.post(new Runnable() {
-                            @Override
-                            public void run() {
-                                onViewHidden(BaseCallback.DISMISS_EVENT_MANUAL);
-                            }
-                        });
-                    }
-                }
-            });
-
-        if (ViewCompat.isLaidOut(mView)) {
-            if (shouldAnimate()) {
-                // If animations are enabled, animate it in
-                animateViewIn();
-            } else {
-                // Else if anims are disabled just call back now
-                onViewShown();
-            }
-        } else {
-            // Otherwise, add one of our layout change listeners and show it in when laid out
-            mView.setOnLayoutChangeListener(new BaseTransientBottomBar.OnLayoutChangeListener() {
-                @Override
-                public void onLayoutChange(View view, int left, int top, int right, int bottom) {
-                    mView.setOnLayoutChangeListener(null);
-
-                    if (shouldAnimate()) {
-                        // If animations are enabled, animate it in
-                        animateViewIn();
-                    } else {
-                        // Else if anims are disabled just call back now
-                        onViewShown();
-                    }
-                }
-            });
-        }
-    }
-
-    void animateViewIn() {
-        if (Build.VERSION.SDK_INT >= 12) {
-            final int viewHeight = mView.getHeight();
-            if (USE_OFFSET_API) {
-                ViewCompat.offsetTopAndBottom(mView, viewHeight);
-            } else {
-                mView.setTranslationY(viewHeight);
-            }
-            final ValueAnimator animator = new ValueAnimator();
-            animator.setIntValues(viewHeight, 0);
-            animator.setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR);
-            animator.setDuration(ANIMATION_DURATION);
-            animator.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationStart(Animator animator) {
-                    mContentViewCallback.animateContentIn(
-                            ANIMATION_DURATION - ANIMATION_FADE_DURATION,
-                            ANIMATION_FADE_DURATION);
-                }
-
-                @Override
-                public void onAnimationEnd(Animator animator) {
-                    onViewShown();
-                }
-            });
-            animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-                private int mPreviousAnimatedIntValue = viewHeight;
-
-                @Override
-                public void onAnimationUpdate(ValueAnimator animator) {
-                    int currentAnimatedIntValue = (int) animator.getAnimatedValue();
-                    if (USE_OFFSET_API) {
-                        ViewCompat.offsetTopAndBottom(mView,
-                                currentAnimatedIntValue - mPreviousAnimatedIntValue);
-                    } else {
-                        mView.setTranslationY(currentAnimatedIntValue);
-                    }
-                    mPreviousAnimatedIntValue = currentAnimatedIntValue;
-                }
-            });
-            animator.start();
-        } else {
-            final Animation anim = AnimationUtils.loadAnimation(mView.getContext(),
-                    R.anim.design_snackbar_in);
-            anim.setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR);
-            anim.setDuration(ANIMATION_DURATION);
-            anim.setAnimationListener(new Animation.AnimationListener() {
-                @Override
-                public void onAnimationEnd(Animation animation) {
-                    onViewShown();
-                }
-
-                @Override
-                public void onAnimationStart(Animation animation) {}
-
-                @Override
-                public void onAnimationRepeat(Animation animation) {}
-            });
-            mView.startAnimation(anim);
-        }
-    }
-
-    private void animateViewOut(final int event) {
-        if (Build.VERSION.SDK_INT >= 12) {
-            final ValueAnimator animator = new ValueAnimator();
-            animator.setIntValues(0, mView.getHeight());
-            animator.setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR);
-            animator.setDuration(ANIMATION_DURATION);
-            animator.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationStart(Animator animator) {
-                    mContentViewCallback.animateContentOut(0, ANIMATION_FADE_DURATION);
-                }
-
-                @Override
-                public void onAnimationEnd(Animator animator) {
-                    onViewHidden(event);
-                }
-            });
-            animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-                private int mPreviousAnimatedIntValue = 0;
-
-                @Override
-                public void onAnimationUpdate(ValueAnimator animator) {
-                    int currentAnimatedIntValue = (int) animator.getAnimatedValue();
-                    if (USE_OFFSET_API) {
-                        ViewCompat.offsetTopAndBottom(mView,
-                                currentAnimatedIntValue - mPreviousAnimatedIntValue);
-                    } else {
-                        mView.setTranslationY(currentAnimatedIntValue);
-                    }
-                    mPreviousAnimatedIntValue = currentAnimatedIntValue;
-                }
-            });
-            animator.start();
-        } else {
-            final Animation anim = AnimationUtils.loadAnimation(mView.getContext(),
-                    R.anim.design_snackbar_out);
-            anim.setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR);
-            anim.setDuration(ANIMATION_DURATION);
-            anim.setAnimationListener(new Animation.AnimationListener() {
-                @Override
-                public void onAnimationEnd(Animation animation) {
-                    onViewHidden(event);
-                }
-
-                @Override
-                public void onAnimationStart(Animation animation) {}
-
-                @Override
-                public void onAnimationRepeat(Animation animation) {}
-            });
-            mView.startAnimation(anim);
-        }
-    }
-
-    final void hideView(@BaseCallback.DismissEvent final int event) {
-        if (shouldAnimate() && mView.getVisibility() == View.VISIBLE) {
-            animateViewOut(event);
-        } else {
-            // If anims are disabled or the view isn't visible, just call back now
-            onViewHidden(event);
-        }
-    }
-
-    void onViewShown() {
-        SnackbarManager.getInstance().onShown(mManagerCallback);
-        if (mCallbacks != null) {
-            // Notify the callbacks. Do that from the end of the list so that if a callback
-            // removes itself as the result of being called, it won't mess up with our iteration
-            int callbackCount = mCallbacks.size();
-            for (int i = callbackCount - 1; i >= 0; i--) {
-                mCallbacks.get(i).onShown((B) this);
-            }
-        }
-    }
-
-    void onViewHidden(int event) {
-        // First tell the SnackbarManager that it has been dismissed
-        SnackbarManager.getInstance().onDismissed(mManagerCallback);
-        if (mCallbacks != null) {
-            // Notify the callbacks. Do that from the end of the list so that if a callback
-            // removes itself as the result of being called, it won't mess up with our iteration
-            int callbackCount = mCallbacks.size();
-            for (int i = callbackCount - 1; i >= 0; i--) {
-                mCallbacks.get(i).onDismissed((B) this, event);
-            }
-        }
-        if (Build.VERSION.SDK_INT < 11) {
-            // We need to hide the Snackbar on pre-v11 since it uses an old style Animation.
-            // ViewGroup has special handling in removeView() when getAnimation() != null in
-            // that it waits. This then means that the calculated insets are wrong and the
-            // any dodging views do not return. We workaround it by setting the view to gone while
-            // ViewGroup actually gets around to removing it.
-            mView.setVisibility(View.GONE);
-        }
-        // Lastly, hide and remove the view from the parent (if attached)
-        final ViewParent parent = mView.getParent();
-        if (parent instanceof ViewGroup) {
-            ((ViewGroup) parent).removeView(mView);
-        }
-    }
-
-    /**
-     * Returns true if we should animate the Snackbar view in/out.
-     */
-    boolean shouldAnimate() {
-        return !mAccessibilityManager.isEnabled();
-    }
-
-    /**
-     * @hide
-     */
-    @RestrictTo(LIBRARY_GROUP)
-    static class SnackbarBaseLayout extends FrameLayout {
-        private BaseTransientBottomBar.OnLayoutChangeListener mOnLayoutChangeListener;
-        private BaseTransientBottomBar.OnAttachStateChangeListener mOnAttachStateChangeListener;
-
-        SnackbarBaseLayout(Context context) {
-            this(context, null);
-        }
-
-        SnackbarBaseLayout(Context context, AttributeSet attrs) {
-            super(context, attrs);
-            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SnackbarLayout);
-            if (a.hasValue(R.styleable.SnackbarLayout_elevation)) {
-                ViewCompat.setElevation(this, a.getDimensionPixelSize(
-                        R.styleable.SnackbarLayout_elevation, 0));
-            }
-            a.recycle();
-
-            setClickable(true);
-        }
-
-        @Override
-        protected void onLayout(boolean changed, int l, int t, int r, int b) {
-            super.onLayout(changed, l, t, r, b);
-            if (mOnLayoutChangeListener != null) {
-                mOnLayoutChangeListener.onLayoutChange(this, l, t, r, b);
-            }
-        }
-
-        @Override
-        protected void onAttachedToWindow() {
-            super.onAttachedToWindow();
-            if (mOnAttachStateChangeListener != null) {
-                mOnAttachStateChangeListener.onViewAttachedToWindow(this);
-            }
-
-            ViewCompat.requestApplyInsets(this);
-        }
-
-        @Override
-        protected void onDetachedFromWindow() {
-            super.onDetachedFromWindow();
-            if (mOnAttachStateChangeListener != null) {
-                mOnAttachStateChangeListener.onViewDetachedFromWindow(this);
-            }
-        }
-
-        void setOnLayoutChangeListener(
-                BaseTransientBottomBar.OnLayoutChangeListener onLayoutChangeListener) {
-            mOnLayoutChangeListener = onLayoutChangeListener;
-        }
-
-        void setOnAttachStateChangeListener(
-                BaseTransientBottomBar.OnAttachStateChangeListener listener) {
-            mOnAttachStateChangeListener = listener;
-        }
-    }
-
-    final class Behavior extends SwipeDismissBehavior<SnackbarBaseLayout> {
-        @Override
-        public boolean canSwipeDismissView(View child) {
-            return child instanceof SnackbarBaseLayout;
-        }
-
-        @Override
-        public boolean onInterceptTouchEvent(CoordinatorLayout parent, SnackbarBaseLayout child,
-                MotionEvent event) {
-            switch (event.getActionMasked()) {
-                case MotionEvent.ACTION_DOWN:
-                    // We want to make sure that we disable any Snackbar timeouts if the user is
-                    // currently touching the Snackbar. We restore the timeout when complete
-                    if (parent.isPointInChildBounds(child, (int) event.getX(),
-                            (int) event.getY())) {
-                        SnackbarManager.getInstance().pauseTimeout(mManagerCallback);
-                    }
-                    break;
-                case MotionEvent.ACTION_UP:
-                case MotionEvent.ACTION_CANCEL:
-                    SnackbarManager.getInstance().restoreTimeoutIfPaused(mManagerCallback);
-                    break;
-            }
-            return super.onInterceptTouchEvent(parent, child, event);
-        }
-    }
-}
diff --git a/design/src/android/support/design/widget/BottomNavigationView.java b/design/src/android/support/design/widget/BottomNavigationView.java
deleted file mode 100644
index 61dba87..0000000
--- a/design/src/android/support/design/widget/BottomNavigationView.java
+++ /dev/null
@@ -1,477 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IdRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.design.R;
-import android.support.design.internal.BottomNavigationMenu;
-import android.support.design.internal.BottomNavigationMenuView;
-import android.support.design.internal.BottomNavigationPresenter;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.view.AbsSavedState;
-import android.support.v4.view.ViewCompat;
-import android.support.v7.content.res.AppCompatResources;
-import android.support.v7.view.SupportMenuInflater;
-import android.support.v7.view.menu.MenuBuilder;
-import android.support.v7.widget.TintTypedArray;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-
-/**
- * <p>
- * Represents a standard bottom navigation bar for application. It is an implementation of
- * <a href="https://material.google.com/components/bottom-navigation.html">material design bottom
- * navigation</a>.
- * </p>
- *
- * <p>
- * Bottom navigation bars make it easy for users to explore and switch between top-level views in
- * a single tap. It should be used when application has three to five top-level destinations.
- * </p>
- *
- * <p>
- * The bar contents can be populated by specifying a menu resource file. Each menu item title, icon
- * and enabled state will be used for displaying bottom navigation bar items. Menu items can also be
- * used for programmatically selecting which destination is currently active. It can be done using
- * {@code MenuItem#setChecked(true)}
- * </p>
- *
- * <pre>
- * layout resource file:
- * &lt;android.support.design.widget.BottomNavigationView
- *     xmlns:android="http://schemas.android.com/apk/res/android"
- *     xmlns:app="http://schemas.android.com/apk/res-auto"
- *     android:id="@+id/navigation"
- *     android:layout_width="match_parent"
- *     android:layout_height="56dp"
- *     android:layout_gravity="start"
- *     app:menu="@menu/my_navigation_items" /&gt;
- *
- * res/menu/my_navigation_items.xml:
- * &lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&gt;
- *     &lt;item android:id="@+id/action_search"
- *          android:title="@string/menu_search"
- *          android:icon="@drawable/ic_search" /&gt;
- *     &lt;item android:id="@+id/action_settings"
- *          android:title="@string/menu_settings"
- *          android:icon="@drawable/ic_add" /&gt;
- *     &lt;item android:id="@+id/action_navigation"
- *          android:title="@string/menu_navigation"
- *          android:icon="@drawable/ic_action_navigation_menu" /&gt;
- * &lt;/menu&gt;
- * </pre>
- */
-public class BottomNavigationView extends FrameLayout {
-
-    private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};
-    private static final int[] DISABLED_STATE_SET = {-android.R.attr.state_enabled};
-
-    private static final int MENU_PRESENTER_ID = 1;
-
-    private final MenuBuilder mMenu;
-    private final BottomNavigationMenuView mMenuView;
-    private final BottomNavigationPresenter mPresenter = new BottomNavigationPresenter();
-    private MenuInflater mMenuInflater;
-
-    private OnNavigationItemSelectedListener mSelectedListener;
-    private OnNavigationItemReselectedListener mReselectedListener;
-
-    public BottomNavigationView(Context context) {
-        this(context, null);
-    }
-
-    public BottomNavigationView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public BottomNavigationView(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-
-        ThemeUtils.checkAppCompatTheme(context);
-
-        // Create the menu
-        mMenu = new BottomNavigationMenu(context);
-
-        mMenuView = new BottomNavigationMenuView(context);
-        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
-                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
-        params.gravity = Gravity.CENTER;
-        mMenuView.setLayoutParams(params);
-
-        mPresenter.setBottomNavigationMenuView(mMenuView);
-        mPresenter.setId(MENU_PRESENTER_ID);
-        mMenuView.setPresenter(mPresenter);
-        mMenu.addMenuPresenter(mPresenter);
-        mPresenter.initForMenu(getContext(), mMenu);
-
-        // Custom attributes
-        TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs,
-                R.styleable.BottomNavigationView, defStyleAttr,
-                R.style.Widget_Design_BottomNavigationView);
-
-        if (a.hasValue(R.styleable.BottomNavigationView_itemIconTint)) {
-            mMenuView.setIconTintList(
-                    a.getColorStateList(R.styleable.BottomNavigationView_itemIconTint));
-        } else {
-            mMenuView.setIconTintList(
-                    createDefaultColorStateList(android.R.attr.textColorSecondary));
-        }
-        if (a.hasValue(R.styleable.BottomNavigationView_itemTextColor)) {
-            mMenuView.setItemTextColor(
-                    a.getColorStateList(R.styleable.BottomNavigationView_itemTextColor));
-        } else {
-            mMenuView.setItemTextColor(
-                    createDefaultColorStateList(android.R.attr.textColorSecondary));
-        }
-        if (a.hasValue(R.styleable.BottomNavigationView_elevation)) {
-            ViewCompat.setElevation(this, a.getDimensionPixelSize(
-                    R.styleable.BottomNavigationView_elevation, 0));
-        }
-
-        int itemBackground = a.getResourceId(R.styleable.BottomNavigationView_itemBackground, 0);
-        mMenuView.setItemBackgroundRes(itemBackground);
-
-        if (a.hasValue(R.styleable.BottomNavigationView_menu)) {
-            inflateMenu(a.getResourceId(R.styleable.BottomNavigationView_menu, 0));
-        }
-        a.recycle();
-
-        addView(mMenuView, params);
-        if (Build.VERSION.SDK_INT < 21) {
-            addCompatibilityTopDivider(context);
-        }
-
-        mMenu.setCallback(new MenuBuilder.Callback() {
-            @Override
-            public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
-                if (mReselectedListener != null && item.getItemId() == getSelectedItemId()) {
-                    mReselectedListener.onNavigationItemReselected(item);
-                    return true; // item is already selected
-                }
-                return mSelectedListener != null
-                        && !mSelectedListener.onNavigationItemSelected(item);
-            }
-
-            @Override
-            public void onMenuModeChange(MenuBuilder menu) {}
-        });
-    }
-
-    /**
-     * Set a listener that will be notified when a bottom navigation item is selected. This listener
-     * will also be notified when the currently selected item is reselected, unless an
-     * {@link OnNavigationItemReselectedListener} has also been set.
-     *
-     * @param listener The listener to notify
-     *
-     * @see #setOnNavigationItemReselectedListener(OnNavigationItemReselectedListener)
-     */
-    public void setOnNavigationItemSelectedListener(
-            @Nullable OnNavigationItemSelectedListener listener) {
-        mSelectedListener = listener;
-    }
-
-    /**
-     * Set a listener that will be notified when the currently selected bottom navigation item is
-     * reselected. This does not require an {@link OnNavigationItemSelectedListener} to be set.
-     *
-     * @param listener The listener to notify
-     *
-     * @see #setOnNavigationItemSelectedListener(OnNavigationItemSelectedListener)
-     */
-    public void setOnNavigationItemReselectedListener(
-            @Nullable OnNavigationItemReselectedListener listener) {
-        mReselectedListener = listener;
-    }
-
-    /**
-     * Returns the {@link Menu} instance associated with this bottom navigation bar.
-     */
-    @NonNull
-    public Menu getMenu() {
-        return mMenu;
-    }
-
-    /**
-     * Inflate a menu resource into this navigation view.
-     *
-     * <p>Existing items in the menu will not be modified or removed.</p>
-     *
-     * @param resId ID of a menu resource to inflate
-     */
-    public void inflateMenu(int resId) {
-        mPresenter.setUpdateSuspended(true);
-        getMenuInflater().inflate(resId, mMenu);
-        mPresenter.setUpdateSuspended(false);
-        mPresenter.updateMenuView(true);
-    }
-
-    /**
-     * @return The maximum number of items that can be shown in BottomNavigationView.
-     */
-    public int getMaxItemCount() {
-        return BottomNavigationMenu.MAX_ITEM_COUNT;
-    }
-
-    /**
-     * Returns the tint which is applied to our menu items' icons.
-     *
-     * @see #setItemIconTintList(ColorStateList)
-     *
-     * @attr ref R.styleable#BottomNavigationView_itemIconTint
-     */
-    @Nullable
-    public ColorStateList getItemIconTintList() {
-        return mMenuView.getIconTintList();
-    }
-
-    /**
-     * Set the tint which is applied to our menu items' icons.
-     *
-     * @param tint the tint to apply.
-     *
-     * @attr ref R.styleable#BottomNavigationView_itemIconTint
-     */
-    public void setItemIconTintList(@Nullable ColorStateList tint) {
-        mMenuView.setIconTintList(tint);
-    }
-
-    /**
-     * Returns colors used for the different states (normal, selected, focused, etc.) of the menu
-     * item text.
-     *
-     * @see #setItemTextColor(ColorStateList)
-     *
-     * @return the ColorStateList of colors used for the different states of the menu items text.
-     *
-     * @attr ref R.styleable#BottomNavigationView_itemTextColor
-     */
-    @Nullable
-    public ColorStateList getItemTextColor() {
-        return mMenuView.getItemTextColor();
-    }
-
-    /**
-     * Set the colors to use for the different states (normal, selected, focused, etc.) of the menu
-     * item text.
-     *
-     * @see #getItemTextColor()
-     *
-     * @attr ref R.styleable#BottomNavigationView_itemTextColor
-     */
-    public void setItemTextColor(@Nullable ColorStateList textColor) {
-        mMenuView.setItemTextColor(textColor);
-    }
-
-    /**
-     * Returns the background resource of the menu items.
-     *
-     * @see #setItemBackgroundResource(int)
-     *
-     * @attr ref R.styleable#BottomNavigationView_itemBackground
-     */
-    @DrawableRes
-    public int getItemBackgroundResource() {
-        return mMenuView.getItemBackgroundRes();
-    }
-
-    /**
-     * Set the background of our menu items to the given resource.
-     *
-     * @param resId The identifier of the resource.
-     *
-     * @attr ref R.styleable#BottomNavigationView_itemBackground
-     */
-    public void setItemBackgroundResource(@DrawableRes int resId) {
-        mMenuView.setItemBackgroundRes(resId);
-    }
-
-    /**
-     * Returns the currently selected menu item ID, or zero if there is no menu.
-     *
-     * @see #setSelectedItemId(int)
-     */
-    @IdRes
-    public int getSelectedItemId() {
-        return mMenuView.getSelectedItemId();
-    }
-
-    /**
-     * Set the selected menu item ID. This behaves the same as tapping on an item.
-     *
-     * @param itemId The menu item ID. If no item has this ID, the current selection is unchanged.
-     *
-     * @see #getSelectedItemId()
-     */
-    public void setSelectedItemId(@IdRes int itemId) {
-        MenuItem item = mMenu.findItem(itemId);
-        if (item != null) {
-            if (!mMenu.performItemAction(item, mPresenter, 0)) {
-                item.setChecked(true);
-            }
-        }
-    }
-
-    /**
-     * Listener for handling selection events on bottom navigation items.
-     */
-    public interface OnNavigationItemSelectedListener {
-
-        /**
-         * Called when an item in the bottom navigation menu is selected.
-         *
-         * @param item The selected item
-         *
-         * @return true to display the item as the selected item and false if the item should not
-         *         be selected. Consider setting non-selectable items as disabled preemptively to
-         *         make them appear non-interactive.
-         */
-        boolean onNavigationItemSelected(@NonNull MenuItem item);
-    }
-
-    /**
-     * Listener for handling reselection events on bottom navigation items.
-     */
-    public interface OnNavigationItemReselectedListener {
-
-        /**
-         * Called when the currently selected item in the bottom navigation menu is selected again.
-         *
-         * @param item The selected item
-         */
-        void onNavigationItemReselected(@NonNull MenuItem item);
-    }
-
-    private void addCompatibilityTopDivider(Context context) {
-        View divider = new View(context);
-        divider.setBackgroundColor(
-                ContextCompat.getColor(context, R.color.design_bottom_navigation_shadow_color));
-        FrameLayout.LayoutParams dividerParams = new FrameLayout.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                getResources().getDimensionPixelSize(
-                        R.dimen.design_bottom_navigation_shadow_height));
-        divider.setLayoutParams(dividerParams);
-        addView(divider);
-    }
-
-    private MenuInflater getMenuInflater() {
-        if (mMenuInflater == null) {
-            mMenuInflater = new SupportMenuInflater(getContext());
-        }
-        return mMenuInflater;
-    }
-
-    private ColorStateList createDefaultColorStateList(int baseColorThemeAttr) {
-        final TypedValue value = new TypedValue();
-        if (!getContext().getTheme().resolveAttribute(baseColorThemeAttr, value, true)) {
-            return null;
-        }
-        ColorStateList baseColor = AppCompatResources.getColorStateList(
-                getContext(), value.resourceId);
-        if (!getContext().getTheme().resolveAttribute(
-                android.support.v7.appcompat.R.attr.colorPrimary, value, true)) {
-            return null;
-        }
-        int colorPrimary = value.data;
-        int defaultColor = baseColor.getDefaultColor();
-        return new ColorStateList(new int[][]{
-                DISABLED_STATE_SET,
-                CHECKED_STATE_SET,
-                EMPTY_STATE_SET
-        }, new int[]{
-                baseColor.getColorForState(DISABLED_STATE_SET, defaultColor),
-                colorPrimary,
-                defaultColor
-        });
-    }
-
-    @Override
-    protected Parcelable onSaveInstanceState() {
-        Parcelable superState = super.onSaveInstanceState();
-        SavedState savedState = new SavedState(superState);
-        savedState.menuPresenterState = new Bundle();
-        mMenu.savePresenterStates(savedState.menuPresenterState);
-        return savedState;
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Parcelable state) {
-        if (!(state instanceof SavedState)) {
-            super.onRestoreInstanceState(state);
-            return;
-        }
-        SavedState savedState = (SavedState) state;
-        super.onRestoreInstanceState(savedState.getSuperState());
-        mMenu.restorePresenterStates(savedState.menuPresenterState);
-    }
-
-    static class SavedState extends AbsSavedState {
-        Bundle menuPresenterState;
-
-        public SavedState(Parcelable superState) {
-            super(superState);
-        }
-
-        public SavedState(Parcel source, ClassLoader loader) {
-            super(source, loader);
-            readFromParcel(source, loader);
-        }
-
-        @Override
-        public void writeToParcel(@NonNull Parcel out, int flags) {
-            super.writeToParcel(out, flags);
-            out.writeBundle(menuPresenterState);
-        }
-
-        private void readFromParcel(Parcel in, ClassLoader loader) {
-            menuPresenterState = in.readBundle(loader);
-        }
-
-        public static final Creator<SavedState> CREATOR = new ClassLoaderCreator<SavedState>() {
-            @Override
-            public SavedState createFromParcel(Parcel in, ClassLoader loader) {
-                return new SavedState(in, loader);
-            }
-
-            @Override
-            public SavedState createFromParcel(Parcel in) {
-                return new SavedState(in, null);
-            }
-
-            @Override
-            public SavedState[] newArray(int size) {
-                return new SavedState[size];
-            }
-        };
-    }
-}
diff --git a/design/src/android/support/design/widget/BottomSheetBehavior.java b/design/src/android/support/design/widget/BottomSheetBehavior.java
deleted file mode 100644
index 00ce8f9..0000000
--- a/design/src/android/support/design/widget/BottomSheetBehavior.java
+++ /dev/null
@@ -1,829 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.annotation.IntDef;
-import android.support.annotation.NonNull;
-import android.support.annotation.RestrictTo;
-import android.support.annotation.VisibleForTesting;
-import android.support.design.R;
-import android.support.v4.math.MathUtils;
-import android.support.v4.view.AbsSavedState;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.widget.ViewDragHelper;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.MotionEvent;
-import android.view.VelocityTracker;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.WeakReference;
-
-
-/**
- * An interaction behavior plugin for a child view of {@link CoordinatorLayout} to make it work as
- * a bottom sheet.
- */
-public class BottomSheetBehavior<V extends View> extends CoordinatorLayout.Behavior<V> {
-
-    /**
-     * Callback for monitoring events about bottom sheets.
-     */
-    public abstract static class BottomSheetCallback {
-
-        /**
-         * Called when the bottom sheet changes its state.
-         *
-         * @param bottomSheet The bottom sheet view.
-         * @param newState    The new state. This will be one of {@link #STATE_DRAGGING},
-         *                    {@link #STATE_SETTLING}, {@link #STATE_EXPANDED},
-         *                    {@link #STATE_COLLAPSED}, or {@link #STATE_HIDDEN}.
-         */
-        public abstract void onStateChanged(@NonNull View bottomSheet, @State int newState);
-
-        /**
-         * Called when the bottom sheet is being dragged.
-         *
-         * @param bottomSheet The bottom sheet view.
-         * @param slideOffset The new offset of this bottom sheet within [-1,1] range. Offset
-         *                    increases as this bottom sheet is moving upward. From 0 to 1 the sheet
-         *                    is between collapsed and expanded states and from -1 to 0 it is
-         *                    between hidden and collapsed states.
-         */
-        public abstract void onSlide(@NonNull View bottomSheet, float slideOffset);
-    }
-
-    /**
-     * The bottom sheet is dragging.
-     */
-    public static final int STATE_DRAGGING = 1;
-
-    /**
-     * The bottom sheet is settling.
-     */
-    public static final int STATE_SETTLING = 2;
-
-    /**
-     * The bottom sheet is expanded.
-     */
-    public static final int STATE_EXPANDED = 3;
-
-    /**
-     * The bottom sheet is collapsed.
-     */
-    public static final int STATE_COLLAPSED = 4;
-
-    /**
-     * The bottom sheet is hidden.
-     */
-    public static final int STATE_HIDDEN = 5;
-
-    /** @hide */
-    @RestrictTo(LIBRARY_GROUP)
-    @IntDef({STATE_EXPANDED, STATE_COLLAPSED, STATE_DRAGGING, STATE_SETTLING, STATE_HIDDEN})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface State {}
-
-    /**
-     * Peek at the 16:9 ratio keyline of its parent.
-     *
-     * <p>This can be used as a parameter for {@link #setPeekHeight(int)}.
-     * {@link #getPeekHeight()} will return this when the value is set.</p>
-     */
-    public static final int PEEK_HEIGHT_AUTO = -1;
-
-    private static final float HIDE_THRESHOLD = 0.5f;
-
-    private static final float HIDE_FRICTION = 0.1f;
-
-    private float mMaximumVelocity;
-
-    private int mPeekHeight;
-
-    private boolean mPeekHeightAuto;
-
-    private int mPeekHeightMin;
-
-    int mMinOffset;
-
-    int mMaxOffset;
-
-    boolean mHideable;
-
-    private boolean mSkipCollapsed;
-
-    @State
-    int mState = STATE_COLLAPSED;
-
-    ViewDragHelper mViewDragHelper;
-
-    private boolean mIgnoreEvents;
-
-    private int mLastNestedScrollDy;
-
-    private boolean mNestedScrolled;
-
-    int mParentHeight;
-
-    WeakReference<V> mViewRef;
-
-    WeakReference<View> mNestedScrollingChildRef;
-
-    private BottomSheetCallback mCallback;
-
-    private VelocityTracker mVelocityTracker;
-
-    int mActivePointerId;
-
-    private int mInitialY;
-
-    boolean mTouchingScrollingChild;
-
-    /**
-     * Default constructor for instantiating BottomSheetBehaviors.
-     */
-    public BottomSheetBehavior() {
-    }
-
-    /**
-     * Default constructor for inflating BottomSheetBehaviors from layout.
-     *
-     * @param context The {@link Context}.
-     * @param attrs   The {@link AttributeSet}.
-     */
-    public BottomSheetBehavior(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        TypedArray a = context.obtainStyledAttributes(attrs,
-                R.styleable.BottomSheetBehavior_Layout);
-        TypedValue value = a.peekValue(R.styleable.BottomSheetBehavior_Layout_behavior_peekHeight);
-        if (value != null && value.data == PEEK_HEIGHT_AUTO) {
-            setPeekHeight(value.data);
-        } else {
-            setPeekHeight(a.getDimensionPixelSize(
-                    R.styleable.BottomSheetBehavior_Layout_behavior_peekHeight, PEEK_HEIGHT_AUTO));
-        }
-        setHideable(a.getBoolean(R.styleable.BottomSheetBehavior_Layout_behavior_hideable, false));
-        setSkipCollapsed(a.getBoolean(R.styleable.BottomSheetBehavior_Layout_behavior_skipCollapsed,
-                false));
-        a.recycle();
-        ViewConfiguration configuration = ViewConfiguration.get(context);
-        mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
-    }
-
-    @Override
-    public Parcelable onSaveInstanceState(CoordinatorLayout parent, V child) {
-        return new SavedState(super.onSaveInstanceState(parent, child), mState);
-    }
-
-    @Override
-    public void onRestoreInstanceState(CoordinatorLayout parent, V child, Parcelable state) {
-        SavedState ss = (SavedState) state;
-        super.onRestoreInstanceState(parent, child, ss.getSuperState());
-        // Intermediate states are restored as collapsed state
-        if (ss.state == STATE_DRAGGING || ss.state == STATE_SETTLING) {
-            mState = STATE_COLLAPSED;
-        } else {
-            mState = ss.state;
-        }
-    }
-
-    @Override
-    public boolean onLayoutChild(CoordinatorLayout parent, V child, int layoutDirection) {
-        if (ViewCompat.getFitsSystemWindows(parent) && !ViewCompat.getFitsSystemWindows(child)) {
-            ViewCompat.setFitsSystemWindows(child, true);
-        }
-        int savedTop = child.getTop();
-        // First let the parent lay it out
-        parent.onLayoutChild(child, layoutDirection);
-        // Offset the bottom sheet
-        mParentHeight = parent.getHeight();
-        int peekHeight;
-        if (mPeekHeightAuto) {
-            if (mPeekHeightMin == 0) {
-                mPeekHeightMin = parent.getResources().getDimensionPixelSize(
-                        R.dimen.design_bottom_sheet_peek_height_min);
-            }
-            peekHeight = Math.max(mPeekHeightMin, mParentHeight - parent.getWidth() * 9 / 16);
-        } else {
-            peekHeight = mPeekHeight;
-        }
-        mMinOffset = Math.max(0, mParentHeight - child.getHeight());
-        mMaxOffset = Math.max(mParentHeight - peekHeight, mMinOffset);
-        if (mState == STATE_EXPANDED) {
-            ViewCompat.offsetTopAndBottom(child, mMinOffset);
-        } else if (mHideable && mState == STATE_HIDDEN) {
-            ViewCompat.offsetTopAndBottom(child, mParentHeight);
-        } else if (mState == STATE_COLLAPSED) {
-            ViewCompat.offsetTopAndBottom(child, mMaxOffset);
-        } else if (mState == STATE_DRAGGING || mState == STATE_SETTLING) {
-            ViewCompat.offsetTopAndBottom(child, savedTop - child.getTop());
-        }
-        if (mViewDragHelper == null) {
-            mViewDragHelper = ViewDragHelper.create(parent, mDragCallback);
-        }
-        mViewRef = new WeakReference<>(child);
-        mNestedScrollingChildRef = new WeakReference<>(findScrollingChild(child));
-        return true;
-    }
-
-    @Override
-    public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
-        if (!child.isShown()) {
-            mIgnoreEvents = true;
-            return false;
-        }
-        int action = event.getActionMasked();
-        // Record the velocity
-        if (action == MotionEvent.ACTION_DOWN) {
-            reset();
-        }
-        if (mVelocityTracker == null) {
-            mVelocityTracker = VelocityTracker.obtain();
-        }
-        mVelocityTracker.addMovement(event);
-        switch (action) {
-            case MotionEvent.ACTION_UP:
-            case MotionEvent.ACTION_CANCEL:
-                mTouchingScrollingChild = false;
-                mActivePointerId = MotionEvent.INVALID_POINTER_ID;
-                // Reset the ignore flag
-                if (mIgnoreEvents) {
-                    mIgnoreEvents = false;
-                    return false;
-                }
-                break;
-            case MotionEvent.ACTION_DOWN:
-                int initialX = (int) event.getX();
-                mInitialY = (int) event.getY();
-                View scroll = mNestedScrollingChildRef != null
-                        ? mNestedScrollingChildRef.get() : null;
-                if (scroll != null && parent.isPointInChildBounds(scroll, initialX, mInitialY)) {
-                    mActivePointerId = event.getPointerId(event.getActionIndex());
-                    mTouchingScrollingChild = true;
-                }
-                mIgnoreEvents = mActivePointerId == MotionEvent.INVALID_POINTER_ID &&
-                        !parent.isPointInChildBounds(child, initialX, mInitialY);
-                break;
-        }
-        if (!mIgnoreEvents && mViewDragHelper.shouldInterceptTouchEvent(event)) {
-            return true;
-        }
-        // We have to handle cases that the ViewDragHelper does not capture the bottom sheet because
-        // it is not the top most view of its parent. This is not necessary when the touch event is
-        // happening over the scrolling content as nested scrolling logic handles that case.
-        View scroll = mNestedScrollingChildRef.get();
-        return action == MotionEvent.ACTION_MOVE && scroll != null &&
-                !mIgnoreEvents && mState != STATE_DRAGGING &&
-                !parent.isPointInChildBounds(scroll, (int) event.getX(), (int) event.getY()) &&
-                Math.abs(mInitialY - event.getY()) > mViewDragHelper.getTouchSlop();
-    }
-
-    @Override
-    public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
-        if (!child.isShown()) {
-            return false;
-        }
-        int action = event.getActionMasked();
-        if (mState == STATE_DRAGGING && action == MotionEvent.ACTION_DOWN) {
-            return true;
-        }
-        if (mViewDragHelper != null) {
-            mViewDragHelper.processTouchEvent(event);
-        }
-        // Record the velocity
-        if (action == MotionEvent.ACTION_DOWN) {
-            reset();
-        }
-        if (mVelocityTracker == null) {
-            mVelocityTracker = VelocityTracker.obtain();
-        }
-        mVelocityTracker.addMovement(event);
-        // The ViewDragHelper tries to capture only the top-most View. We have to explicitly tell it
-        // to capture the bottom sheet in case it is not captured and the touch slop is passed.
-        if (action == MotionEvent.ACTION_MOVE && !mIgnoreEvents) {
-            if (Math.abs(mInitialY - event.getY()) > mViewDragHelper.getTouchSlop()) {
-                mViewDragHelper.captureChildView(child, event.getPointerId(event.getActionIndex()));
-            }
-        }
-        return !mIgnoreEvents;
-    }
-
-    @Override
-    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, V child,
-            View directTargetChild, View target, int nestedScrollAxes) {
-        mLastNestedScrollDy = 0;
-        mNestedScrolled = false;
-        return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
-    }
-
-    @Override
-    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, V child, View target, int dx,
-            int dy, int[] consumed) {
-        View scrollingChild = mNestedScrollingChildRef.get();
-        if (target != scrollingChild) {
-            return;
-        }
-        int currentTop = child.getTop();
-        int newTop = currentTop - dy;
-        if (dy > 0) { // Upward
-            if (newTop < mMinOffset) {
-                consumed[1] = currentTop - mMinOffset;
-                ViewCompat.offsetTopAndBottom(child, -consumed[1]);
-                setStateInternal(STATE_EXPANDED);
-            } else {
-                consumed[1] = dy;
-                ViewCompat.offsetTopAndBottom(child, -dy);
-                setStateInternal(STATE_DRAGGING);
-            }
-        } else if (dy < 0) { // Downward
-            if (!target.canScrollVertically(-1)) {
-                if (newTop <= mMaxOffset || mHideable) {
-                    consumed[1] = dy;
-                    ViewCompat.offsetTopAndBottom(child, -dy);
-                    setStateInternal(STATE_DRAGGING);
-                } else {
-                    consumed[1] = currentTop - mMaxOffset;
-                    ViewCompat.offsetTopAndBottom(child, -consumed[1]);
-                    setStateInternal(STATE_COLLAPSED);
-                }
-            }
-        }
-        dispatchOnSlide(child.getTop());
-        mLastNestedScrollDy = dy;
-        mNestedScrolled = true;
-    }
-
-    @Override
-    public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, V child, View target) {
-        if (child.getTop() == mMinOffset) {
-            setStateInternal(STATE_EXPANDED);
-            return;
-        }
-        if (mNestedScrollingChildRef == null || target != mNestedScrollingChildRef.get()
-                || !mNestedScrolled) {
-            return;
-        }
-        int top;
-        int targetState;
-        if (mLastNestedScrollDy > 0) {
-            top = mMinOffset;
-            targetState = STATE_EXPANDED;
-        } else if (mHideable && shouldHide(child, getYVelocity())) {
-            top = mParentHeight;
-            targetState = STATE_HIDDEN;
-        } else if (mLastNestedScrollDy == 0) {
-            int currentTop = child.getTop();
-            if (Math.abs(currentTop - mMinOffset) < Math.abs(currentTop - mMaxOffset)) {
-                top = mMinOffset;
-                targetState = STATE_EXPANDED;
-            } else {
-                top = mMaxOffset;
-                targetState = STATE_COLLAPSED;
-            }
-        } else {
-            top = mMaxOffset;
-            targetState = STATE_COLLAPSED;
-        }
-        if (mViewDragHelper.smoothSlideViewTo(child, child.getLeft(), top)) {
-            setStateInternal(STATE_SETTLING);
-            ViewCompat.postOnAnimation(child, new SettleRunnable(child, targetState));
-        } else {
-            setStateInternal(targetState);
-        }
-        mNestedScrolled = false;
-    }
-
-    @Override
-    public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, V child, View target,
-            float velocityX, float velocityY) {
-        return target == mNestedScrollingChildRef.get() &&
-                (mState != STATE_EXPANDED ||
-                        super.onNestedPreFling(coordinatorLayout, child, target,
-                                velocityX, velocityY));
-    }
-
-    /**
-     * Sets the height of the bottom sheet when it is collapsed.
-     *
-     * @param peekHeight The height of the collapsed bottom sheet in pixels, or
-     *                   {@link #PEEK_HEIGHT_AUTO} to configure the sheet to peek automatically
-     *                   at 16:9 ratio keyline.
-     * @attr ref android.support.design.R.styleable#BottomSheetBehavior_Layout_behavior_peekHeight
-     */
-    public final void setPeekHeight(int peekHeight) {
-        boolean layout = false;
-        if (peekHeight == PEEK_HEIGHT_AUTO) {
-            if (!mPeekHeightAuto) {
-                mPeekHeightAuto = true;
-                layout = true;
-            }
-        } else if (mPeekHeightAuto || mPeekHeight != peekHeight) {
-            mPeekHeightAuto = false;
-            mPeekHeight = Math.max(0, peekHeight);
-            mMaxOffset = mParentHeight - peekHeight;
-            layout = true;
-        }
-        if (layout && mState == STATE_COLLAPSED && mViewRef != null) {
-            V view = mViewRef.get();
-            if (view != null) {
-                view.requestLayout();
-            }
-        }
-    }
-
-    /**
-     * Gets the height of the bottom sheet when it is collapsed.
-     *
-     * @return The height of the collapsed bottom sheet in pixels, or {@link #PEEK_HEIGHT_AUTO}
-     *         if the sheet is configured to peek automatically at 16:9 ratio keyline
-     * @attr ref android.support.design.R.styleable#BottomSheetBehavior_Layout_behavior_peekHeight
-     */
-    public final int getPeekHeight() {
-        return mPeekHeightAuto ? PEEK_HEIGHT_AUTO : mPeekHeight;
-    }
-
-    /**
-     * Sets whether this bottom sheet can hide when it is swiped down.
-     *
-     * @param hideable {@code true} to make this bottom sheet hideable.
-     * @attr ref android.support.design.R.styleable#BottomSheetBehavior_Layout_behavior_hideable
-     */
-    public void setHideable(boolean hideable) {
-        mHideable = hideable;
-    }
-
-    /**
-     * Gets whether this bottom sheet can hide when it is swiped down.
-     *
-     * @return {@code true} if this bottom sheet can hide.
-     * @attr ref android.support.design.R.styleable#BottomSheetBehavior_Layout_behavior_hideable
-     */
-    public boolean isHideable() {
-        return mHideable;
-    }
-
-    /**
-     * Sets whether this bottom sheet should skip the collapsed state when it is being hidden
-     * after it is expanded once. Setting this to true has no effect unless the sheet is hideable.
-     *
-     * @param skipCollapsed True if the bottom sheet should skip the collapsed state.
-     * @attr ref android.support.design.R.styleable#BottomSheetBehavior_Layout_behavior_skipCollapsed
-     */
-    public void setSkipCollapsed(boolean skipCollapsed) {
-        mSkipCollapsed = skipCollapsed;
-    }
-
-    /**
-     * Sets whether this bottom sheet should skip the collapsed state when it is being hidden
-     * after it is expanded once.
-     *
-     * @return Whether the bottom sheet should skip the collapsed state.
-     * @attr ref android.support.design.R.styleable#BottomSheetBehavior_Layout_behavior_skipCollapsed
-     */
-    public boolean getSkipCollapsed() {
-        return mSkipCollapsed;
-    }
-
-    /**
-     * Sets a callback to be notified of bottom sheet events.
-     *
-     * @param callback The callback to notify when bottom sheet events occur.
-     */
-    public void setBottomSheetCallback(BottomSheetCallback callback) {
-        mCallback = callback;
-    }
-
-    /**
-     * Sets the state of the bottom sheet. The bottom sheet will transition to that state with
-     * animation.
-     *
-     * @param state One of {@link #STATE_COLLAPSED}, {@link #STATE_EXPANDED}, or
-     *              {@link #STATE_HIDDEN}.
-     */
-    public final void setState(final @State int state) {
-        if (state == mState) {
-            return;
-        }
-        if (mViewRef == null) {
-            // The view is not laid out yet; modify mState and let onLayoutChild handle it later
-            if (state == STATE_COLLAPSED || state == STATE_EXPANDED ||
-                    (mHideable && state == STATE_HIDDEN)) {
-                mState = state;
-            }
-            return;
-        }
-        final V child = mViewRef.get();
-        if (child == null) {
-            return;
-        }
-        // Start the animation; wait until a pending layout if there is one.
-        ViewParent parent = child.getParent();
-        if (parent != null && parent.isLayoutRequested() && ViewCompat.isAttachedToWindow(child)) {
-            child.post(new Runnable() {
-                @Override
-                public void run() {
-                    startSettlingAnimation(child, state);
-                }
-            });
-        } else {
-            startSettlingAnimation(child, state);
-        }
-    }
-
-    /**
-     * Gets the current state of the bottom sheet.
-     *
-     * @return One of {@link #STATE_EXPANDED}, {@link #STATE_COLLAPSED}, {@link #STATE_DRAGGING},
-     * {@link #STATE_SETTLING}, and {@link #STATE_HIDDEN}.
-     */
-    @State
-    public final int getState() {
-        return mState;
-    }
-
-    void setStateInternal(@State int state) {
-        if (mState == state) {
-            return;
-        }
-        mState = state;
-        View bottomSheet = mViewRef.get();
-        if (bottomSheet != null && mCallback != null) {
-            mCallback.onStateChanged(bottomSheet, state);
-        }
-    }
-
-    private void reset() {
-        mActivePointerId = ViewDragHelper.INVALID_POINTER;
-        if (mVelocityTracker != null) {
-            mVelocityTracker.recycle();
-            mVelocityTracker = null;
-        }
-    }
-
-    boolean shouldHide(View child, float yvel) {
-        if (mSkipCollapsed) {
-            return true;
-        }
-        if (child.getTop() < mMaxOffset) {
-            // It should not hide, but collapse.
-            return false;
-        }
-        final float newTop = child.getTop() + yvel * HIDE_FRICTION;
-        return Math.abs(newTop - mMaxOffset) / (float) mPeekHeight > HIDE_THRESHOLD;
-    }
-
-    @VisibleForTesting
-    View findScrollingChild(View view) {
-        if (ViewCompat.isNestedScrollingEnabled(view)) {
-            return view;
-        }
-        if (view instanceof ViewGroup) {
-            ViewGroup group = (ViewGroup) view;
-            for (int i = 0, count = group.getChildCount(); i < count; i++) {
-                View scrollingChild = findScrollingChild(group.getChildAt(i));
-                if (scrollingChild != null) {
-                    return scrollingChild;
-                }
-            }
-        }
-        return null;
-    }
-
-    private float getYVelocity() {
-        mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
-        return mVelocityTracker.getYVelocity(mActivePointerId);
-    }
-
-    void startSettlingAnimation(View child, int state) {
-        int top;
-        if (state == STATE_COLLAPSED) {
-            top = mMaxOffset;
-        } else if (state == STATE_EXPANDED) {
-            top = mMinOffset;
-        } else if (mHideable && state == STATE_HIDDEN) {
-            top = mParentHeight;
-        } else {
-            throw new IllegalArgumentException("Illegal state argument: " + state);
-        }
-        if (mViewDragHelper.smoothSlideViewTo(child, child.getLeft(), top)) {
-            setStateInternal(STATE_SETTLING);
-            ViewCompat.postOnAnimation(child, new SettleRunnable(child, state));
-        } else {
-            setStateInternal(state);
-        }
-    }
-
-    private final ViewDragHelper.Callback mDragCallback = new ViewDragHelper.Callback() {
-
-        @Override
-        public boolean tryCaptureView(View child, int pointerId) {
-            if (mState == STATE_DRAGGING) {
-                return false;
-            }
-            if (mTouchingScrollingChild) {
-                return false;
-            }
-            if (mState == STATE_EXPANDED && mActivePointerId == pointerId) {
-                View scroll = mNestedScrollingChildRef.get();
-                if (scroll != null && scroll.canScrollVertically(-1)) {
-                    // Let the content scroll up
-                    return false;
-                }
-            }
-            return mViewRef != null && mViewRef.get() == child;
-        }
-
-        @Override
-        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
-            dispatchOnSlide(top);
-        }
-
-        @Override
-        public void onViewDragStateChanged(int state) {
-            if (state == ViewDragHelper.STATE_DRAGGING) {
-                setStateInternal(STATE_DRAGGING);
-            }
-        }
-
-        @Override
-        public void onViewReleased(View releasedChild, float xvel, float yvel) {
-            int top;
-            @State int targetState;
-            if (yvel < 0) { // Moving up
-                top = mMinOffset;
-                targetState = STATE_EXPANDED;
-            } else if (mHideable && shouldHide(releasedChild, yvel)) {
-                top = mParentHeight;
-                targetState = STATE_HIDDEN;
-            } else if (yvel == 0.f) {
-                int currentTop = releasedChild.getTop();
-                if (Math.abs(currentTop - mMinOffset) < Math.abs(currentTop - mMaxOffset)) {
-                    top = mMinOffset;
-                    targetState = STATE_EXPANDED;
-                } else {
-                    top = mMaxOffset;
-                    targetState = STATE_COLLAPSED;
-                }
-            } else {
-                top = mMaxOffset;
-                targetState = STATE_COLLAPSED;
-            }
-            if (mViewDragHelper.settleCapturedViewAt(releasedChild.getLeft(), top)) {
-                setStateInternal(STATE_SETTLING);
-                ViewCompat.postOnAnimation(releasedChild,
-                        new SettleRunnable(releasedChild, targetState));
-            } else {
-                setStateInternal(targetState);
-            }
-        }
-
-        @Override
-        public int clampViewPositionVertical(View child, int top, int dy) {
-            return MathUtils.clamp(top, mMinOffset, mHideable ? mParentHeight : mMaxOffset);
-        }
-
-        @Override
-        public int clampViewPositionHorizontal(View child, int left, int dx) {
-            return child.getLeft();
-        }
-
-        @Override
-        public int getViewVerticalDragRange(View child) {
-            if (mHideable) {
-                return mParentHeight - mMinOffset;
-            } else {
-                return mMaxOffset - mMinOffset;
-            }
-        }
-    };
-
-    void dispatchOnSlide(int top) {
-        View bottomSheet = mViewRef.get();
-        if (bottomSheet != null && mCallback != null) {
-            if (top > mMaxOffset) {
-                mCallback.onSlide(bottomSheet, (float) (mMaxOffset - top) /
-                        (mParentHeight - mMaxOffset));
-            } else {
-                mCallback.onSlide(bottomSheet,
-                        (float) (mMaxOffset - top) / ((mMaxOffset - mMinOffset)));
-            }
-        }
-    }
-
-    @VisibleForTesting
-    int getPeekHeightMin() {
-        return mPeekHeightMin;
-    }
-
-    private class SettleRunnable implements Runnable {
-
-        private final View mView;
-
-        @State
-        private final int mTargetState;
-
-        SettleRunnable(View view, @State int targetState) {
-            mView = view;
-            mTargetState = targetState;
-        }
-
-        @Override
-        public void run() {
-            if (mViewDragHelper != null && mViewDragHelper.continueSettling(true)) {
-                ViewCompat.postOnAnimation(mView, this);
-            } else {
-                setStateInternal(mTargetState);
-            }
-        }
-    }
-
-    protected static class SavedState extends AbsSavedState {
-        @State
-        final int state;
-
-        public SavedState(Parcel source) {
-            this(source, null);
-        }
-
-        public SavedState(Parcel source, ClassLoader loader) {
-            super(source, loader);
-            //noinspection ResourceType
-            state = source.readInt();
-        }
-
-        public SavedState(Parcelable superState, @State int state) {
-            super(superState);
-            this.state = state;
-        }
-
-        @Override
-        public void writeToParcel(Parcel out, int flags) {
-            super.writeToParcel(out, flags);
-            out.writeInt(state);
-        }
-
-        public static final Creator<SavedState> CREATOR = new ClassLoaderCreator<SavedState>() {
-            @Override
-            public SavedState createFromParcel(Parcel in, ClassLoader loader) {
-                return new SavedState(in, loader);
-            }
-
-            @Override
-            public SavedState createFromParcel(Parcel in) {
-                return new SavedState(in, null);
-            }
-
-            @Override
-            public SavedState[] newArray(int size) {
-                return new SavedState[size];
-            }
-        };
-    }
-
-    /**
-     * A utility function to get the {@link BottomSheetBehavior} associated with the {@code view}.
-     *
-     * @param view The {@link View} with {@link BottomSheetBehavior}.
-     * @return The {@link BottomSheetBehavior} associated with the {@code view}.
-     */
-    @SuppressWarnings("unchecked")
-    public static <V extends View> BottomSheetBehavior<V> from(V view) {
-        ViewGroup.LayoutParams params = view.getLayoutParams();
-        if (!(params instanceof CoordinatorLayout.LayoutParams)) {
-            throw new IllegalArgumentException("The view is not a child of CoordinatorLayout");
-        }
-        CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) params)
-                .getBehavior();
-        if (!(behavior instanceof BottomSheetBehavior)) {
-            throw new IllegalArgumentException(
-                    "The view is not associated with BottomSheetBehavior");
-        }
-        return (BottomSheetBehavior<V>) behavior;
-    }
-
-}
diff --git a/design/src/android/support/design/widget/BottomSheetDialog.java b/design/src/android/support/design/widget/BottomSheetDialog.java
deleted file mode 100644
index 19b5782..0000000
--- a/design/src/android/support/design/widget/BottomSheetDialog.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.os.Build;
-import android.os.Bundle;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.StyleRes;
-import android.support.design.R;
-import android.support.v4.view.AccessibilityDelegateCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.support.v7.app.AppCompatDialog;
-import android.util.TypedValue;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.WindowManager;
-import android.widget.FrameLayout;
-
-/**
- * Base class for {@link android.app.Dialog}s styled as a bottom sheet.
- */
-public class BottomSheetDialog extends AppCompatDialog {
-
-    private BottomSheetBehavior<FrameLayout> mBehavior;
-
-    boolean mCancelable = true;
-    private boolean mCanceledOnTouchOutside = true;
-    private boolean mCanceledOnTouchOutsideSet;
-
-    public BottomSheetDialog(@NonNull Context context) {
-        this(context, 0);
-    }
-
-    public BottomSheetDialog(@NonNull Context context, @StyleRes int theme) {
-        super(context, getThemeResId(context, theme));
-        // We hide the title bar for any style configuration. Otherwise, there will be a gap
-        // above the bottom sheet when it is expanded.
-        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
-    }
-
-    protected BottomSheetDialog(@NonNull Context context, boolean cancelable,
-            OnCancelListener cancelListener) {
-        super(context, cancelable, cancelListener);
-        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
-        mCancelable = cancelable;
-    }
-
-    @Override
-    public void setContentView(@LayoutRes int layoutResId) {
-        super.setContentView(wrapInBottomSheet(layoutResId, null, null));
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        Window window = getWindow();
-        if (window != null) {
-            if (Build.VERSION.SDK_INT >= 21) {
-                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
-                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
-            }
-            window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.MATCH_PARENT);
-        }
-    }
-
-    @Override
-    public void setContentView(View view) {
-        super.setContentView(wrapInBottomSheet(0, view, null));
-    }
-
-    @Override
-    public void setContentView(View view, ViewGroup.LayoutParams params) {
-        super.setContentView(wrapInBottomSheet(0, view, params));
-    }
-
-    @Override
-    public void setCancelable(boolean cancelable) {
-        super.setCancelable(cancelable);
-        if (mCancelable != cancelable) {
-            mCancelable = cancelable;
-            if (mBehavior != null) {
-                mBehavior.setHideable(cancelable);
-            }
-        }
-    }
-
-    @Override
-    protected void onStart() {
-        super.onStart();
-        if (mBehavior != null) {
-            mBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
-        }
-    }
-
-    @Override
-    public void setCanceledOnTouchOutside(boolean cancel) {
-        super.setCanceledOnTouchOutside(cancel);
-        if (cancel && !mCancelable) {
-            mCancelable = true;
-        }
-        mCanceledOnTouchOutside = cancel;
-        mCanceledOnTouchOutsideSet = true;
-    }
-
-    private View wrapInBottomSheet(int layoutResId, View view, ViewGroup.LayoutParams params) {
-        final FrameLayout container = (FrameLayout) View.inflate(getContext(),
-                R.layout.design_bottom_sheet_dialog, null);
-        final CoordinatorLayout coordinator =
-                (CoordinatorLayout) container.findViewById(R.id.coordinator);
-        if (layoutResId != 0 && view == null) {
-            view = getLayoutInflater().inflate(layoutResId, coordinator, false);
-        }
-        FrameLayout bottomSheet = (FrameLayout) coordinator.findViewById(R.id.design_bottom_sheet);
-        mBehavior = BottomSheetBehavior.from(bottomSheet);
-        mBehavior.setBottomSheetCallback(mBottomSheetCallback);
-        mBehavior.setHideable(mCancelable);
-        if (params == null) {
-            bottomSheet.addView(view);
-        } else {
-            bottomSheet.addView(view, params);
-        }
-        // We treat the CoordinatorLayout as outside the dialog though it is technically inside
-        coordinator.findViewById(R.id.touch_outside).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                if (mCancelable && isShowing() && shouldWindowCloseOnTouchOutside()) {
-                    cancel();
-                }
-            }
-        });
-        // Handle accessibility events
-        ViewCompat.setAccessibilityDelegate(bottomSheet, new AccessibilityDelegateCompat() {
-            @Override
-            public void onInitializeAccessibilityNodeInfo(View host,
-                    AccessibilityNodeInfoCompat info) {
-                super.onInitializeAccessibilityNodeInfo(host, info);
-                if (mCancelable) {
-                    info.addAction(AccessibilityNodeInfoCompat.ACTION_DISMISS);
-                    info.setDismissable(true);
-                } else {
-                    info.setDismissable(false);
-                }
-            }
-
-            @Override
-            public boolean performAccessibilityAction(View host, int action, Bundle args) {
-                if (action == AccessibilityNodeInfoCompat.ACTION_DISMISS && mCancelable) {
-                    cancel();
-                    return true;
-                }
-                return super.performAccessibilityAction(host, action, args);
-            }
-        });
-        bottomSheet.setOnTouchListener(new View.OnTouchListener() {
-            @Override
-            public boolean onTouch(View view, MotionEvent event) {
-                // Consume the event and prevent it from falling through
-                return true;
-            }
-        });
-        return container;
-    }
-
-    boolean shouldWindowCloseOnTouchOutside() {
-        if (!mCanceledOnTouchOutsideSet) {
-            if (Build.VERSION.SDK_INT < 11) {
-                mCanceledOnTouchOutside = true;
-            } else {
-                TypedArray a = getContext().obtainStyledAttributes(
-                        new int[]{android.R.attr.windowCloseOnTouchOutside});
-                mCanceledOnTouchOutside = a.getBoolean(0, true);
-                a.recycle();
-            }
-            mCanceledOnTouchOutsideSet = true;
-        }
-        return mCanceledOnTouchOutside;
-    }
-
-    private static int getThemeResId(Context context, int themeId) {
-        if (themeId == 0) {
-            // If the provided theme is 0, then retrieve the dialogTheme from our theme
-            TypedValue outValue = new TypedValue();
-            if (context.getTheme().resolveAttribute(
-                    R.attr.bottomSheetDialogTheme, outValue, true)) {
-                themeId = outValue.resourceId;
-            } else {
-                // bottomSheetDialogTheme is not provided; we default to our light theme
-                themeId = R.style.Theme_Design_Light_BottomSheetDialog;
-            }
-        }
-        return themeId;
-    }
-
-    private BottomSheetBehavior.BottomSheetCallback mBottomSheetCallback
-            = new BottomSheetBehavior.BottomSheetCallback() {
-        @Override
-        public void onStateChanged(@NonNull View bottomSheet,
-                @BottomSheetBehavior.State int newState) {
-            if (newState == BottomSheetBehavior.STATE_HIDDEN) {
-                cancel();
-            }
-        }
-
-        @Override
-        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
-        }
-    };
-
-}
diff --git a/design/src/android/support/design/widget/BottomSheetDialogFragment.java b/design/src/android/support/design/widget/BottomSheetDialogFragment.java
deleted file mode 100644
index 8842988..0000000
--- a/design/src/android/support/design/widget/BottomSheetDialogFragment.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.app.Dialog;
-import android.os.Bundle;
-import android.support.v4.app.DialogFragment;
-import android.support.v7.app.AppCompatDialogFragment;
-
-/**
- * Modal bottom sheet. This is a version of {@link DialogFragment} that shows a bottom sheet
- * using {@link BottomSheetDialog} instead of a floating dialog.
- */
-public class BottomSheetDialogFragment extends AppCompatDialogFragment {
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        return new BottomSheetDialog(getContext(), getTheme());
-    }
-
-}
diff --git a/design/src/android/support/design/widget/CheckableImageButton.java b/design/src/android/support/design/widget/CheckableImageButton.java
deleted file mode 100644
index f274581..0000000
--- a/design/src/android/support/design/widget/CheckableImageButton.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.support.annotation.RestrictTo;
-import android.support.v4.view.AccessibilityDelegateCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.accessibility.AccessibilityEventCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.support.v7.widget.AppCompatImageButton;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.accessibility.AccessibilityEvent;
-import android.widget.Checkable;
-
-/**
- * @hide
- */
-@RestrictTo(LIBRARY_GROUP)
-public class CheckableImageButton extends AppCompatImageButton implements Checkable {
-
-    private static final int[] DRAWABLE_STATE_CHECKED = new int[]{android.R.attr.state_checked};
-
-    private boolean mChecked;
-
-    public CheckableImageButton(Context context) {
-        this(context, null);
-    }
-
-    public CheckableImageButton(Context context, AttributeSet attrs) {
-        this(context, attrs, android.support.v7.appcompat.R.attr.imageButtonStyle);
-    }
-
-    public CheckableImageButton(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-
-        ViewCompat.setAccessibilityDelegate(this, new AccessibilityDelegateCompat() {
-            @Override
-            public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
-                super.onInitializeAccessibilityEvent(host, event);
-                event.setChecked(isChecked());
-            }
-
-            @Override
-            public void onInitializeAccessibilityNodeInfo(View host,
-                    AccessibilityNodeInfoCompat info) {
-                super.onInitializeAccessibilityNodeInfo(host, info);
-                info.setCheckable(true);
-                info.setChecked(isChecked());
-            }
-        });
-    }
-
-    @Override
-    public void setChecked(boolean checked) {
-        if (mChecked != checked) {
-            mChecked = checked;
-            refreshDrawableState();
-            sendAccessibilityEvent(
-                    AccessibilityEventCompat.TYPE_WINDOW_CONTENT_CHANGED);
-        }
-    }
-
-    @Override
-    public boolean isChecked() {
-        return mChecked;
-    }
-
-    @Override
-    public void toggle() {
-        setChecked(!mChecked);
-    }
-
-    @Override
-    public int[] onCreateDrawableState(int extraSpace) {
-        if (mChecked) {
-            return mergeDrawableStates(
-                    super.onCreateDrawableState(extraSpace + DRAWABLE_STATE_CHECKED.length),
-                    DRAWABLE_STATE_CHECKED);
-        } else {
-            return super.onCreateDrawableState(extraSpace);
-        }
-    }
-}
diff --git a/design/src/android/support/design/widget/CollapsingTextHelper.java b/design/src/android/support/design/widget/CollapsingTextHelper.java
deleted file mode 100644
index a33cabc..0000000
--- a/design/src/android/support/design/widget/CollapsingTextHelper.java
+++ /dev/null
@@ -1,723 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.Typeface;
-import android.os.Build;
-import android.support.annotation.ColorInt;
-import android.support.v4.math.MathUtils;
-import android.support.v4.text.TextDirectionHeuristicsCompat;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v7.widget.TintTypedArray;
-import android.text.TextPaint;
-import android.text.TextUtils;
-import android.view.Gravity;
-import android.view.View;
-import android.view.animation.Interpolator;
-
-final class CollapsingTextHelper {
-
-    // Pre-JB-MR2 doesn't support HW accelerated canvas scaled text so we will workaround it
-    // by using our own texture
-    private static final boolean USE_SCALING_TEXTURE = Build.VERSION.SDK_INT < 18;
-
-    private static final boolean DEBUG_DRAW = false;
-    private static final Paint DEBUG_DRAW_PAINT;
-    static {
-        DEBUG_DRAW_PAINT = DEBUG_DRAW ? new Paint() : null;
-        if (DEBUG_DRAW_PAINT != null) {
-            DEBUG_DRAW_PAINT.setAntiAlias(true);
-            DEBUG_DRAW_PAINT.setColor(Color.MAGENTA);
-        }
-    }
-
-    private final View mView;
-
-    private boolean mDrawTitle;
-    private float mExpandedFraction;
-
-    private final Rect mExpandedBounds;
-    private final Rect mCollapsedBounds;
-    private final RectF mCurrentBounds;
-    private int mExpandedTextGravity = Gravity.CENTER_VERTICAL;
-    private int mCollapsedTextGravity = Gravity.CENTER_VERTICAL;
-    private float mExpandedTextSize = 15;
-    private float mCollapsedTextSize = 15;
-    private ColorStateList mExpandedTextColor;
-    private ColorStateList mCollapsedTextColor;
-
-    private float mExpandedDrawY;
-    private float mCollapsedDrawY;
-    private float mExpandedDrawX;
-    private float mCollapsedDrawX;
-    private float mCurrentDrawX;
-    private float mCurrentDrawY;
-    private Typeface mCollapsedTypeface;
-    private Typeface mExpandedTypeface;
-    private Typeface mCurrentTypeface;
-
-    private CharSequence mText;
-    private CharSequence mTextToDraw;
-    private boolean mIsRtl;
-
-    private boolean mUseTexture;
-    private Bitmap mExpandedTitleTexture;
-    private Paint mTexturePaint;
-    private float mTextureAscent;
-    private float mTextureDescent;
-
-    private float mScale;
-    private float mCurrentTextSize;
-
-    private int[] mState;
-
-    private boolean mBoundsChanged;
-
-    private final TextPaint mTextPaint;
-
-    private Interpolator mPositionInterpolator;
-    private Interpolator mTextSizeInterpolator;
-
-    private float mCollapsedShadowRadius, mCollapsedShadowDx, mCollapsedShadowDy;
-    private int mCollapsedShadowColor;
-
-    private float mExpandedShadowRadius, mExpandedShadowDx, mExpandedShadowDy;
-    private int mExpandedShadowColor;
-
-    public CollapsingTextHelper(View view) {
-        mView = view;
-
-        mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
-
-        mCollapsedBounds = new Rect();
-        mExpandedBounds = new Rect();
-        mCurrentBounds = new RectF();
-    }
-
-    void setTextSizeInterpolator(Interpolator interpolator) {
-        mTextSizeInterpolator = interpolator;
-        recalculate();
-    }
-
-    void setPositionInterpolator(Interpolator interpolator) {
-        mPositionInterpolator = interpolator;
-        recalculate();
-    }
-
-    void setExpandedTextSize(float textSize) {
-        if (mExpandedTextSize != textSize) {
-            mExpandedTextSize = textSize;
-            recalculate();
-        }
-    }
-
-    void setCollapsedTextSize(float textSize) {
-        if (mCollapsedTextSize != textSize) {
-            mCollapsedTextSize = textSize;
-            recalculate();
-        }
-    }
-
-    void setCollapsedTextColor(ColorStateList textColor) {
-        if (mCollapsedTextColor != textColor) {
-            mCollapsedTextColor = textColor;
-            recalculate();
-        }
-    }
-
-    void setExpandedTextColor(ColorStateList textColor) {
-        if (mExpandedTextColor != textColor) {
-            mExpandedTextColor = textColor;
-            recalculate();
-        }
-    }
-
-    void setExpandedBounds(int left, int top, int right, int bottom) {
-        if (!rectEquals(mExpandedBounds, left, top, right, bottom)) {
-            mExpandedBounds.set(left, top, right, bottom);
-            mBoundsChanged = true;
-            onBoundsChanged();
-        }
-    }
-
-    void setCollapsedBounds(int left, int top, int right, int bottom) {
-        if (!rectEquals(mCollapsedBounds, left, top, right, bottom)) {
-            mCollapsedBounds.set(left, top, right, bottom);
-            mBoundsChanged = true;
-            onBoundsChanged();
-        }
-    }
-
-    void onBoundsChanged() {
-        mDrawTitle = mCollapsedBounds.width() > 0 && mCollapsedBounds.height() > 0
-                && mExpandedBounds.width() > 0 && mExpandedBounds.height() > 0;
-    }
-
-    void setExpandedTextGravity(int gravity) {
-        if (mExpandedTextGravity != gravity) {
-            mExpandedTextGravity = gravity;
-            recalculate();
-        }
-    }
-
-    int getExpandedTextGravity() {
-        return mExpandedTextGravity;
-    }
-
-    void setCollapsedTextGravity(int gravity) {
-        if (mCollapsedTextGravity != gravity) {
-            mCollapsedTextGravity = gravity;
-            recalculate();
-        }
-    }
-
-    int getCollapsedTextGravity() {
-        return mCollapsedTextGravity;
-    }
-
-    void setCollapsedTextAppearance(int resId) {
-        TintTypedArray a = TintTypedArray.obtainStyledAttributes(mView.getContext(), resId,
-                android.support.v7.appcompat.R.styleable.TextAppearance);
-        if (a.hasValue(android.support.v7.appcompat.R.styleable.TextAppearance_android_textColor)) {
-            mCollapsedTextColor = a.getColorStateList(
-                    android.support.v7.appcompat.R.styleable.TextAppearance_android_textColor);
-        }
-        if (a.hasValue(android.support.v7.appcompat.R.styleable.TextAppearance_android_textSize)) {
-            mCollapsedTextSize = a.getDimensionPixelSize(
-                    android.support.v7.appcompat.R.styleable.TextAppearance_android_textSize,
-                    (int) mCollapsedTextSize);
-        }
-        mCollapsedShadowColor = a.getInt(
-                android.support.v7.appcompat.R.styleable.TextAppearance_android_shadowColor, 0);
-        mCollapsedShadowDx = a.getFloat(
-                android.support.v7.appcompat.R.styleable.TextAppearance_android_shadowDx, 0);
-        mCollapsedShadowDy = a.getFloat(
-                android.support.v7.appcompat.R.styleable.TextAppearance_android_shadowDy, 0);
-        mCollapsedShadowRadius = a.getFloat(
-                android.support.v7.appcompat.R.styleable.TextAppearance_android_shadowRadius, 0);
-        a.recycle();
-
-        if (Build.VERSION.SDK_INT >= 16) {
-            mCollapsedTypeface = readFontFamilyTypeface(resId);
-        }
-
-        recalculate();
-    }
-
-    void setExpandedTextAppearance(int resId) {
-        TintTypedArray a = TintTypedArray.obtainStyledAttributes(mView.getContext(), resId,
-                android.support.v7.appcompat.R.styleable.TextAppearance);
-        if (a.hasValue(android.support.v7.appcompat.R.styleable.TextAppearance_android_textColor)) {
-            mExpandedTextColor = a.getColorStateList(
-                    android.support.v7.appcompat.R.styleable.TextAppearance_android_textColor);
-        }
-        if (a.hasValue(android.support.v7.appcompat.R.styleable.TextAppearance_android_textSize)) {
-            mExpandedTextSize = a.getDimensionPixelSize(
-                    android.support.v7.appcompat.R.styleable.TextAppearance_android_textSize,
-                    (int) mExpandedTextSize);
-        }
-        mExpandedShadowColor = a.getInt(
-                android.support.v7.appcompat.R.styleable.TextAppearance_android_shadowColor, 0);
-        mExpandedShadowDx = a.getFloat(
-                android.support.v7.appcompat.R.styleable.TextAppearance_android_shadowDx, 0);
-        mExpandedShadowDy = a.getFloat(
-                android.support.v7.appcompat.R.styleable.TextAppearance_android_shadowDy, 0);
-        mExpandedShadowRadius = a.getFloat(
-                android.support.v7.appcompat.R.styleable.TextAppearance_android_shadowRadius, 0);
-        a.recycle();
-
-        if (Build.VERSION.SDK_INT >= 16) {
-            mExpandedTypeface = readFontFamilyTypeface(resId);
-        }
-
-        recalculate();
-    }
-
-    private Typeface readFontFamilyTypeface(int resId) {
-        final TypedArray a = mView.getContext().obtainStyledAttributes(resId,
-                new int[]{android.R.attr.fontFamily});
-        try {
-            final String family = a.getString(0);
-            if (family != null) {
-                return Typeface.create(family, Typeface.NORMAL);
-            }
-        } finally {
-            a.recycle();
-        }
-        return null;
-    }
-
-    void setCollapsedTypeface(Typeface typeface) {
-        if (areTypefacesDifferent(mCollapsedTypeface, typeface)) {
-            mCollapsedTypeface = typeface;
-            recalculate();
-        }
-    }
-
-    void setExpandedTypeface(Typeface typeface) {
-        if (areTypefacesDifferent(mExpandedTypeface, typeface)) {
-            mExpandedTypeface = typeface;
-            recalculate();
-        }
-    }
-
-    void setTypefaces(Typeface typeface) {
-        mCollapsedTypeface = mExpandedTypeface = typeface;
-        recalculate();
-    }
-
-    Typeface getCollapsedTypeface() {
-        return mCollapsedTypeface != null ? mCollapsedTypeface : Typeface.DEFAULT;
-    }
-
-    Typeface getExpandedTypeface() {
-        return mExpandedTypeface != null ? mExpandedTypeface : Typeface.DEFAULT;
-    }
-
-    /**
-     * Set the value indicating the current scroll value. This decides how much of the
-     * background will be displayed, as well as the title metrics/positioning.
-     *
-     * A value of {@code 0.0} indicates that the layout is fully expanded.
-     * A value of {@code 1.0} indicates that the layout is fully collapsed.
-     */
-    void setExpansionFraction(float fraction) {
-        fraction = MathUtils.clamp(fraction, 0f, 1f);
-
-        if (fraction != mExpandedFraction) {
-            mExpandedFraction = fraction;
-            calculateCurrentOffsets();
-        }
-    }
-
-    final boolean setState(final int[] state) {
-        mState = state;
-
-        if (isStateful()) {
-            recalculate();
-            return true;
-        }
-
-        return false;
-    }
-
-    final boolean isStateful() {
-        return (mCollapsedTextColor != null && mCollapsedTextColor.isStateful())
-                || (mExpandedTextColor != null && mExpandedTextColor.isStateful());
-    }
-
-    float getExpansionFraction() {
-        return mExpandedFraction;
-    }
-
-    float getCollapsedTextSize() {
-        return mCollapsedTextSize;
-    }
-
-    float getExpandedTextSize() {
-        return mExpandedTextSize;
-    }
-
-    private void calculateCurrentOffsets() {
-        calculateOffsets(mExpandedFraction);
-    }
-
-    private void calculateOffsets(final float fraction) {
-        interpolateBounds(fraction);
-        mCurrentDrawX = lerp(mExpandedDrawX, mCollapsedDrawX, fraction,
-                mPositionInterpolator);
-        mCurrentDrawY = lerp(mExpandedDrawY, mCollapsedDrawY, fraction,
-                mPositionInterpolator);
-
-        setInterpolatedTextSize(lerp(mExpandedTextSize, mCollapsedTextSize,
-                fraction, mTextSizeInterpolator));
-
-        if (mCollapsedTextColor != mExpandedTextColor) {
-            // If the collapsed and expanded text colors are different, blend them based on the
-            // fraction
-            mTextPaint.setColor(blendColors(
-                    getCurrentExpandedTextColor(), getCurrentCollapsedTextColor(), fraction));
-        } else {
-            mTextPaint.setColor(getCurrentCollapsedTextColor());
-        }
-
-        mTextPaint.setShadowLayer(
-                lerp(mExpandedShadowRadius, mCollapsedShadowRadius, fraction, null),
-                lerp(mExpandedShadowDx, mCollapsedShadowDx, fraction, null),
-                lerp(mExpandedShadowDy, mCollapsedShadowDy, fraction, null),
-                blendColors(mExpandedShadowColor, mCollapsedShadowColor, fraction));
-
-        ViewCompat.postInvalidateOnAnimation(mView);
-    }
-
-    @ColorInt
-    private int getCurrentExpandedTextColor() {
-        if (mState != null) {
-            return mExpandedTextColor.getColorForState(mState, 0);
-        } else {
-            return mExpandedTextColor.getDefaultColor();
-        }
-    }
-
-    @ColorInt
-    private int getCurrentCollapsedTextColor() {
-        if (mState != null) {
-            return mCollapsedTextColor.getColorForState(mState, 0);
-        } else {
-            return mCollapsedTextColor.getDefaultColor();
-        }
-    }
-
-    private void calculateBaseOffsets() {
-        final float currentTextSize = mCurrentTextSize;
-
-        // We then calculate the collapsed text size, using the same logic
-        calculateUsingTextSize(mCollapsedTextSize);
-        float width = mTextToDraw != null ?
-                mTextPaint.measureText(mTextToDraw, 0, mTextToDraw.length()) : 0;
-        final int collapsedAbsGravity = GravityCompat.getAbsoluteGravity(mCollapsedTextGravity,
-                mIsRtl ? ViewCompat.LAYOUT_DIRECTION_RTL : ViewCompat.LAYOUT_DIRECTION_LTR);
-        switch (collapsedAbsGravity & Gravity.VERTICAL_GRAVITY_MASK) {
-            case Gravity.BOTTOM:
-                mCollapsedDrawY = mCollapsedBounds.bottom;
-                break;
-            case Gravity.TOP:
-                mCollapsedDrawY = mCollapsedBounds.top - mTextPaint.ascent();
-                break;
-            case Gravity.CENTER_VERTICAL:
-            default:
-                float textHeight = mTextPaint.descent() - mTextPaint.ascent();
-                float textOffset = (textHeight / 2) - mTextPaint.descent();
-                mCollapsedDrawY = mCollapsedBounds.centerY() + textOffset;
-                break;
-        }
-        switch (collapsedAbsGravity & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK) {
-            case Gravity.CENTER_HORIZONTAL:
-                mCollapsedDrawX = mCollapsedBounds.centerX() - (width / 2);
-                break;
-            case Gravity.RIGHT:
-                mCollapsedDrawX = mCollapsedBounds.right - width;
-                break;
-            case Gravity.LEFT:
-            default:
-                mCollapsedDrawX = mCollapsedBounds.left;
-                break;
-        }
-
-        calculateUsingTextSize(mExpandedTextSize);
-        width = mTextToDraw != null
-                ? mTextPaint.measureText(mTextToDraw, 0, mTextToDraw.length()) : 0;
-        final int expandedAbsGravity = GravityCompat.getAbsoluteGravity(mExpandedTextGravity,
-                mIsRtl ? ViewCompat.LAYOUT_DIRECTION_RTL : ViewCompat.LAYOUT_DIRECTION_LTR);
-        switch (expandedAbsGravity & Gravity.VERTICAL_GRAVITY_MASK) {
-            case Gravity.BOTTOM:
-                mExpandedDrawY = mExpandedBounds.bottom;
-                break;
-            case Gravity.TOP:
-                mExpandedDrawY = mExpandedBounds.top - mTextPaint.ascent();
-                break;
-            case Gravity.CENTER_VERTICAL:
-            default:
-                float textHeight = mTextPaint.descent() - mTextPaint.ascent();
-                float textOffset = (textHeight / 2) - mTextPaint.descent();
-                mExpandedDrawY = mExpandedBounds.centerY() + textOffset;
-                break;
-        }
-        switch (expandedAbsGravity & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK) {
-            case Gravity.CENTER_HORIZONTAL:
-                mExpandedDrawX = mExpandedBounds.centerX() - (width / 2);
-                break;
-            case Gravity.RIGHT:
-                mExpandedDrawX = mExpandedBounds.right - width;
-                break;
-            case Gravity.LEFT:
-            default:
-                mExpandedDrawX = mExpandedBounds.left;
-                break;
-        }
-
-        // The bounds have changed so we need to clear the texture
-        clearTexture();
-        // Now reset the text size back to the original
-        setInterpolatedTextSize(currentTextSize);
-    }
-
-    private void interpolateBounds(float fraction) {
-        mCurrentBounds.left = lerp(mExpandedBounds.left, mCollapsedBounds.left,
-                fraction, mPositionInterpolator);
-        mCurrentBounds.top = lerp(mExpandedDrawY, mCollapsedDrawY,
-                fraction, mPositionInterpolator);
-        mCurrentBounds.right = lerp(mExpandedBounds.right, mCollapsedBounds.right,
-                fraction, mPositionInterpolator);
-        mCurrentBounds.bottom = lerp(mExpandedBounds.bottom, mCollapsedBounds.bottom,
-                fraction, mPositionInterpolator);
-    }
-
-    public void draw(Canvas canvas) {
-        final int saveCount = canvas.save();
-
-        if (mTextToDraw != null && mDrawTitle) {
-            float x = mCurrentDrawX;
-            float y = mCurrentDrawY;
-
-            final boolean drawTexture = mUseTexture && mExpandedTitleTexture != null;
-
-            final float ascent;
-            final float descent;
-            if (drawTexture) {
-                ascent = mTextureAscent * mScale;
-                descent = mTextureDescent * mScale;
-            } else {
-                ascent = mTextPaint.ascent() * mScale;
-                descent = mTextPaint.descent() * mScale;
-            }
-
-            if (DEBUG_DRAW) {
-                // Just a debug tool, which drawn a magenta rect in the text bounds
-                canvas.drawRect(mCurrentBounds.left, y + ascent, mCurrentBounds.right, y + descent,
-                        DEBUG_DRAW_PAINT);
-            }
-
-            if (drawTexture) {
-                y += ascent;
-            }
-
-            if (mScale != 1f) {
-                canvas.scale(mScale, mScale, x, y);
-            }
-
-            if (drawTexture) {
-                // If we should use a texture, draw it instead of text
-                canvas.drawBitmap(mExpandedTitleTexture, x, y, mTexturePaint);
-            } else {
-                canvas.drawText(mTextToDraw, 0, mTextToDraw.length(), x, y, mTextPaint);
-            }
-        }
-
-        canvas.restoreToCount(saveCount);
-    }
-
-    private boolean calculateIsRtl(CharSequence text) {
-        final boolean defaultIsRtl = ViewCompat.getLayoutDirection(mView)
-                == ViewCompat.LAYOUT_DIRECTION_RTL;
-        return (defaultIsRtl
-                ? TextDirectionHeuristicsCompat.FIRSTSTRONG_RTL
-                : TextDirectionHeuristicsCompat.FIRSTSTRONG_LTR).isRtl(text, 0, text.length());
-    }
-
-    private void setInterpolatedTextSize(float textSize) {
-        calculateUsingTextSize(textSize);
-
-        // Use our texture if the scale isn't 1.0
-        mUseTexture = USE_SCALING_TEXTURE && mScale != 1f;
-
-        if (mUseTexture) {
-            // Make sure we have an expanded texture if needed
-            ensureExpandedTexture();
-        }
-
-        ViewCompat.postInvalidateOnAnimation(mView);
-    }
-
-    private boolean areTypefacesDifferent(Typeface first, Typeface second) {
-        return (first != null && !first.equals(second)) || (first == null && second != null);
-    }
-
-    private void calculateUsingTextSize(final float textSize) {
-        if (mText == null) return;
-
-        final float collapsedWidth = mCollapsedBounds.width();
-        final float expandedWidth = mExpandedBounds.width();
-
-        final float availableWidth;
-        final float newTextSize;
-        boolean updateDrawText = false;
-
-        if (isClose(textSize, mCollapsedTextSize)) {
-            newTextSize = mCollapsedTextSize;
-            mScale = 1f;
-            if (areTypefacesDifferent(mCurrentTypeface, mCollapsedTypeface)) {
-                mCurrentTypeface = mCollapsedTypeface;
-                updateDrawText = true;
-            }
-            availableWidth = collapsedWidth;
-        } else {
-            newTextSize = mExpandedTextSize;
-            if (areTypefacesDifferent(mCurrentTypeface, mExpandedTypeface)) {
-                mCurrentTypeface = mExpandedTypeface;
-                updateDrawText = true;
-            }
-            if (isClose(textSize, mExpandedTextSize)) {
-                // If we're close to the expanded text size, snap to it and use a scale of 1
-                mScale = 1f;
-            } else {
-                // Else, we'll scale down from the expanded text size
-                mScale = textSize / mExpandedTextSize;
-            }
-
-            final float textSizeRatio = mCollapsedTextSize / mExpandedTextSize;
-            // This is the size of the expanded bounds when it is scaled to match the
-            // collapsed text size
-            final float scaledDownWidth = expandedWidth * textSizeRatio;
-
-            if (scaledDownWidth > collapsedWidth) {
-                // If the scaled down size is larger than the actual collapsed width, we need to
-                // cap the available width so that when the expanded text scales down, it matches
-                // the collapsed width
-                availableWidth = Math.min(collapsedWidth / textSizeRatio, expandedWidth);
-            } else {
-                // Otherwise we'll just use the expanded width
-                availableWidth = expandedWidth;
-            }
-        }
-
-        if (availableWidth > 0) {
-            updateDrawText = (mCurrentTextSize != newTextSize) || mBoundsChanged || updateDrawText;
-            mCurrentTextSize = newTextSize;
-            mBoundsChanged = false;
-        }
-
-        if (mTextToDraw == null || updateDrawText) {
-            mTextPaint.setTextSize(mCurrentTextSize);
-            mTextPaint.setTypeface(mCurrentTypeface);
-            // Use linear text scaling if we're scaling the canvas
-            mTextPaint.setLinearText(mScale != 1f);
-
-            // If we don't currently have text to draw, or the text size has changed, ellipsize...
-            final CharSequence title = TextUtils.ellipsize(mText, mTextPaint,
-                    availableWidth, TextUtils.TruncateAt.END);
-            if (!TextUtils.equals(title, mTextToDraw)) {
-                mTextToDraw = title;
-                mIsRtl = calculateIsRtl(mTextToDraw);
-            }
-        }
-    }
-
-    private void ensureExpandedTexture() {
-        if (mExpandedTitleTexture != null || mExpandedBounds.isEmpty()
-                || TextUtils.isEmpty(mTextToDraw)) {
-            return;
-        }
-
-        calculateOffsets(0f);
-        mTextureAscent = mTextPaint.ascent();
-        mTextureDescent = mTextPaint.descent();
-
-        final int w = Math.round(mTextPaint.measureText(mTextToDraw, 0, mTextToDraw.length()));
-        final int h = Math.round(mTextureDescent - mTextureAscent);
-
-        if (w <= 0 || h <= 0) {
-            return; // If the width or height are 0, return
-        }
-
-        mExpandedTitleTexture = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
-
-        Canvas c = new Canvas(mExpandedTitleTexture);
-        c.drawText(mTextToDraw, 0, mTextToDraw.length(), 0, h - mTextPaint.descent(), mTextPaint);
-
-        if (mTexturePaint == null) {
-            // Make sure we have a paint
-            mTexturePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
-        }
-    }
-
-    public void recalculate() {
-        if (mView.getHeight() > 0 && mView.getWidth() > 0) {
-            // If we've already been laid out, calculate everything now otherwise we'll wait
-            // until a layout
-            calculateBaseOffsets();
-            calculateCurrentOffsets();
-        }
-    }
-
-    /**
-     * Set the title to display
-     *
-     * @param text
-     */
-    void setText(CharSequence text) {
-        if (text == null || !text.equals(mText)) {
-            mText = text;
-            mTextToDraw = null;
-            clearTexture();
-            recalculate();
-        }
-    }
-
-    CharSequence getText() {
-        return mText;
-    }
-
-    private void clearTexture() {
-        if (mExpandedTitleTexture != null) {
-            mExpandedTitleTexture.recycle();
-            mExpandedTitleTexture = null;
-        }
-    }
-
-    /**
-     * Returns true if {@code value} is 'close' to it's closest decimal value. Close is currently
-     * defined as it's difference being < 0.001.
-     */
-    private static boolean isClose(float value, float targetValue) {
-        return Math.abs(value - targetValue) < 0.001f;
-    }
-
-    ColorStateList getExpandedTextColor() {
-        return mExpandedTextColor;
-    }
-
-    ColorStateList getCollapsedTextColor() {
-        return mCollapsedTextColor;
-    }
-
-    /**
-     * Blend {@code color1} and {@code color2} using the given ratio.
-     *
-     * @param ratio of which to blend. 0.0 will return {@code color1}, 0.5 will give an even blend,
-     *              1.0 will return {@code color2}.
-     */
-    private static int blendColors(int color1, int color2, float ratio) {
-        final float inverseRatio = 1f - ratio;
-        float a = (Color.alpha(color1) * inverseRatio) + (Color.alpha(color2) * ratio);
-        float r = (Color.red(color1) * inverseRatio) + (Color.red(color2) * ratio);
-        float g = (Color.green(color1) * inverseRatio) + (Color.green(color2) * ratio);
-        float b = (Color.blue(color1) * inverseRatio) + (Color.blue(color2) * ratio);
-        return Color.argb((int) a, (int) r, (int) g, (int) b);
-    }
-
-    private static float lerp(float startValue, float endValue, float fraction,
-            Interpolator interpolator) {
-        if (interpolator != null) {
-            fraction = interpolator.getInterpolation(fraction);
-        }
-        return AnimationUtils.lerp(startValue, endValue, fraction);
-    }
-
-    private static boolean rectEquals(Rect r, int left, int top, int right, int bottom) {
-        return !(r.left != left || r.top != top || r.right != right || r.bottom != bottom);
-    }
-}
diff --git a/design/src/android/support/design/widget/CollapsingToolbarLayout.java b/design/src/android/support/design/widget/CollapsingToolbarLayout.java
deleted file mode 100644
index 8c9b7d4..0000000
--- a/design/src/android/support/design/widget/CollapsingToolbarLayout.java
+++ /dev/null
@@ -1,1308 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.Typeface;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RestrictTo;
-import android.support.annotation.StyleRes;
-import android.support.design.R;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.graphics.drawable.DrawableCompat;
-import android.support.v4.math.MathUtils;
-import android.support.v4.util.ObjectsCompat;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.WindowInsetsCompat;
-import android.support.v4.widget.ViewGroupUtils;
-import android.support.v7.widget.Toolbar;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.widget.FrameLayout;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * CollapsingToolbarLayout is a wrapper for {@link Toolbar} which implements a collapsing app bar.
- * It is designed to be used as a direct child of a {@link AppBarLayout}.
- * CollapsingToolbarLayout contains the following features:
- *
- * <h4>Collapsing title</h4>
- * A title which is larger when the layout is fully visible but collapses and becomes smaller as
- * the layout is scrolled off screen. You can set the title to display via
- * {@link #setTitle(CharSequence)}. The title appearance can be tweaked via the
- * {@code collapsedTextAppearance} and {@code expandedTextAppearance} attributes.
- *
- * <h4>Content scrim</h4>
- * A full-bleed scrim which is show or hidden when the scroll position has hit a certain threshold.
- * You can change this via {@link #setContentScrim(Drawable)}.
- *
- * <h4>Status bar scrim</h4>
- * A scrim which is show or hidden behind the status bar when the scroll position has hit a certain
- * threshold. You can change this via {@link #setStatusBarScrim(Drawable)}. This only works
- * on {@link android.os.Build.VERSION_CODES#LOLLIPOP LOLLIPOP} devices when we set to fit system
- * windows.
- *
- * <h4>Parallax scrolling children</h4>
- * Child views can opt to be scrolled within this layout in a parallax fashion.
- * See {@link LayoutParams#COLLAPSE_MODE_PARALLAX} and
- * {@link LayoutParams#setParallaxMultiplier(float)}.
- *
- * <h4>Pinned position children</h4>
- * Child views can opt to be pinned in space globally. This is useful when implementing a
- * collapsing as it allows the {@link Toolbar} to be fixed in place even though this layout is
- * moving. See {@link LayoutParams#COLLAPSE_MODE_PIN}.
- *
- * <p><strong>Do not manually add views to the Toolbar at run time</strong>.
- * We will add a 'dummy view' to the Toolbar which allows us to work out the available space
- * for the title. This can interfere with any views which you add.</p>
- *
- * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_collapsedTitleTextAppearance
- * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleTextAppearance
- * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_contentScrim
- * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleMargin
- * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleMarginStart
- * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleMarginEnd
- * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleMarginBottom
- * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_statusBarScrim
- * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_toolbarId
- */
-public class CollapsingToolbarLayout extends FrameLayout {
-
-    private static final int DEFAULT_SCRIM_ANIMATION_DURATION = 600;
-
-    private boolean mRefreshToolbar = true;
-    private int mToolbarId;
-    private Toolbar mToolbar;
-    private View mToolbarDirectChild;
-    private View mDummyView;
-
-    private int mExpandedMarginStart;
-    private int mExpandedMarginTop;
-    private int mExpandedMarginEnd;
-    private int mExpandedMarginBottom;
-
-    private final Rect mTmpRect = new Rect();
-    final CollapsingTextHelper mCollapsingTextHelper;
-    private boolean mCollapsingTitleEnabled;
-    private boolean mDrawCollapsingTitle;
-
-    private Drawable mContentScrim;
-    Drawable mStatusBarScrim;
-    private int mScrimAlpha;
-    private boolean mScrimsAreShown;
-    private ValueAnimator mScrimAnimator;
-    private long mScrimAnimationDuration;
-    private int mScrimVisibleHeightTrigger = -1;
-
-    private AppBarLayout.OnOffsetChangedListener mOnOffsetChangedListener;
-
-    int mCurrentOffset;
-
-    WindowInsetsCompat mLastInsets;
-
-    public CollapsingToolbarLayout(Context context) {
-        this(context, null);
-    }
-
-    public CollapsingToolbarLayout(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public CollapsingToolbarLayout(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-
-        ThemeUtils.checkAppCompatTheme(context);
-
-        mCollapsingTextHelper = new CollapsingTextHelper(this);
-        mCollapsingTextHelper.setTextSizeInterpolator(AnimationUtils.DECELERATE_INTERPOLATOR);
-
-        TypedArray a = context.obtainStyledAttributes(attrs,
-                R.styleable.CollapsingToolbarLayout, defStyleAttr,
-                R.style.Widget_Design_CollapsingToolbar);
-
-        mCollapsingTextHelper.setExpandedTextGravity(
-                a.getInt(R.styleable.CollapsingToolbarLayout_expandedTitleGravity,
-                        GravityCompat.START | Gravity.BOTTOM));
-        mCollapsingTextHelper.setCollapsedTextGravity(
-                a.getInt(R.styleable.CollapsingToolbarLayout_collapsedTitleGravity,
-                        GravityCompat.START | Gravity.CENTER_VERTICAL));
-
-        mExpandedMarginStart = mExpandedMarginTop = mExpandedMarginEnd = mExpandedMarginBottom =
-                a.getDimensionPixelSize(R.styleable.CollapsingToolbarLayout_expandedTitleMargin, 0);
-
-        if (a.hasValue(R.styleable.CollapsingToolbarLayout_expandedTitleMarginStart)) {
-            mExpandedMarginStart = a.getDimensionPixelSize(
-                    R.styleable.CollapsingToolbarLayout_expandedTitleMarginStart, 0);
-        }
-        if (a.hasValue(R.styleable.CollapsingToolbarLayout_expandedTitleMarginEnd)) {
-            mExpandedMarginEnd = a.getDimensionPixelSize(
-                    R.styleable.CollapsingToolbarLayout_expandedTitleMarginEnd, 0);
-        }
-        if (a.hasValue(R.styleable.CollapsingToolbarLayout_expandedTitleMarginTop)) {
-            mExpandedMarginTop = a.getDimensionPixelSize(
-                    R.styleable.CollapsingToolbarLayout_expandedTitleMarginTop, 0);
-        }
-        if (a.hasValue(R.styleable.CollapsingToolbarLayout_expandedTitleMarginBottom)) {
-            mExpandedMarginBottom = a.getDimensionPixelSize(
-                    R.styleable.CollapsingToolbarLayout_expandedTitleMarginBottom, 0);
-        }
-
-        mCollapsingTitleEnabled = a.getBoolean(
-                R.styleable.CollapsingToolbarLayout_titleEnabled, true);
-        setTitle(a.getText(R.styleable.CollapsingToolbarLayout_title));
-
-        // First load the default text appearances
-        mCollapsingTextHelper.setExpandedTextAppearance(
-                R.style.TextAppearance_Design_CollapsingToolbar_Expanded);
-        mCollapsingTextHelper.setCollapsedTextAppearance(
-                android.support.v7.appcompat.R.style.TextAppearance_AppCompat_Widget_ActionBar_Title);
-
-        // Now overlay any custom text appearances
-        if (a.hasValue(R.styleable.CollapsingToolbarLayout_expandedTitleTextAppearance)) {
-            mCollapsingTextHelper.setExpandedTextAppearance(
-                    a.getResourceId(
-                            R.styleable.CollapsingToolbarLayout_expandedTitleTextAppearance, 0));
-        }
-        if (a.hasValue(R.styleable.CollapsingToolbarLayout_collapsedTitleTextAppearance)) {
-            mCollapsingTextHelper.setCollapsedTextAppearance(
-                    a.getResourceId(
-                            R.styleable.CollapsingToolbarLayout_collapsedTitleTextAppearance, 0));
-        }
-
-        mScrimVisibleHeightTrigger = a.getDimensionPixelSize(
-                R.styleable.CollapsingToolbarLayout_scrimVisibleHeightTrigger, -1);
-
-        mScrimAnimationDuration = a.getInt(
-                R.styleable.CollapsingToolbarLayout_scrimAnimationDuration,
-                DEFAULT_SCRIM_ANIMATION_DURATION);
-
-        setContentScrim(a.getDrawable(R.styleable.CollapsingToolbarLayout_contentScrim));
-        setStatusBarScrim(a.getDrawable(R.styleable.CollapsingToolbarLayout_statusBarScrim));
-
-        mToolbarId = a.getResourceId(R.styleable.CollapsingToolbarLayout_toolbarId, -1);
-
-        a.recycle();
-
-        setWillNotDraw(false);
-
-        ViewCompat.setOnApplyWindowInsetsListener(this,
-                new android.support.v4.view.OnApplyWindowInsetsListener() {
-                    @Override
-                    public WindowInsetsCompat onApplyWindowInsets(View v,
-                            WindowInsetsCompat insets) {
-                        return onWindowInsetChanged(insets);
-                    }
-                });
-    }
-
-    @Override
-    protected void onAttachedToWindow() {
-        super.onAttachedToWindow();
-
-        // Add an OnOffsetChangedListener if possible
-        final ViewParent parent = getParent();
-        if (parent instanceof AppBarLayout) {
-            // Copy over from the ABL whether we should fit system windows
-            ViewCompat.setFitsSystemWindows(this, ViewCompat.getFitsSystemWindows((View) parent));
-
-            if (mOnOffsetChangedListener == null) {
-                mOnOffsetChangedListener = new OffsetUpdateListener();
-            }
-            ((AppBarLayout) parent).addOnOffsetChangedListener(mOnOffsetChangedListener);
-
-            // We're attached, so lets request an inset dispatch
-            ViewCompat.requestApplyInsets(this);
-        }
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        // Remove our OnOffsetChangedListener if possible and it exists
-        final ViewParent parent = getParent();
-        if (mOnOffsetChangedListener != null && parent instanceof AppBarLayout) {
-            ((AppBarLayout) parent).removeOnOffsetChangedListener(mOnOffsetChangedListener);
-        }
-
-        super.onDetachedFromWindow();
-    }
-
-    WindowInsetsCompat onWindowInsetChanged(final WindowInsetsCompat insets) {
-        WindowInsetsCompat newInsets = null;
-
-        if (ViewCompat.getFitsSystemWindows(this)) {
-            // If we're set to fit system windows, keep the insets
-            newInsets = insets;
-        }
-
-        // If our insets have changed, keep them and invalidate the scroll ranges...
-        if (!ObjectsCompat.equals(mLastInsets, newInsets)) {
-            mLastInsets = newInsets;
-            requestLayout();
-        }
-
-        // Consume the insets. This is done so that child views with fitSystemWindows=true do not
-        // get the default padding functionality from View
-        return insets.consumeSystemWindowInsets();
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        super.draw(canvas);
-
-        // If we don't have a toolbar, the scrim will be not be drawn in drawChild() below.
-        // Instead, we draw it here, before our collapsing text.
-        ensureToolbar();
-        if (mToolbar == null && mContentScrim != null && mScrimAlpha > 0) {
-            mContentScrim.mutate().setAlpha(mScrimAlpha);
-            mContentScrim.draw(canvas);
-        }
-
-        // Let the collapsing text helper draw its text
-        if (mCollapsingTitleEnabled && mDrawCollapsingTitle) {
-            mCollapsingTextHelper.draw(canvas);
-        }
-
-        // Now draw the status bar scrim
-        if (mStatusBarScrim != null && mScrimAlpha > 0) {
-            final int topInset = mLastInsets != null ? mLastInsets.getSystemWindowInsetTop() : 0;
-            if (topInset > 0) {
-                mStatusBarScrim.setBounds(0, -mCurrentOffset, getWidth(),
-                        topInset - mCurrentOffset);
-                mStatusBarScrim.mutate().setAlpha(mScrimAlpha);
-                mStatusBarScrim.draw(canvas);
-            }
-        }
-    }
-
-    @Override
-    protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
-        // This is a little weird. Our scrim needs to be behind the Toolbar (if it is present),
-        // but in front of any other children which are behind it. To do this we intercept the
-        // drawChild() call, and draw our scrim just before the Toolbar is drawn
-        boolean invalidated = false;
-        if (mContentScrim != null && mScrimAlpha > 0 && isToolbarChild(child)) {
-            mContentScrim.mutate().setAlpha(mScrimAlpha);
-            mContentScrim.draw(canvas);
-            invalidated = true;
-        }
-        return super.drawChild(canvas, child, drawingTime) || invalidated;
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-        if (mContentScrim != null) {
-            mContentScrim.setBounds(0, 0, w, h);
-        }
-    }
-
-    private void ensureToolbar() {
-        if (!mRefreshToolbar) {
-            return;
-        }
-
-        // First clear out the current Toolbar
-        mToolbar = null;
-        mToolbarDirectChild = null;
-
-        if (mToolbarId != -1) {
-            // If we have an ID set, try and find it and it's direct parent to us
-            mToolbar = findViewById(mToolbarId);
-            if (mToolbar != null) {
-                mToolbarDirectChild = findDirectChild(mToolbar);
-            }
-        }
-
-        if (mToolbar == null) {
-            // If we don't have an ID, or couldn't find a Toolbar with the correct ID, try and find
-            // one from our direct children
-            Toolbar toolbar = null;
-            for (int i = 0, count = getChildCount(); i < count; i++) {
-                final View child = getChildAt(i);
-                if (child instanceof Toolbar) {
-                    toolbar = (Toolbar) child;
-                    break;
-                }
-            }
-            mToolbar = toolbar;
-        }
-
-        updateDummyView();
-        mRefreshToolbar = false;
-    }
-
-    private boolean isToolbarChild(View child) {
-        return (mToolbarDirectChild == null || mToolbarDirectChild == this)
-                ? child == mToolbar
-                : child == mToolbarDirectChild;
-    }
-
-    /**
-     * Returns the direct child of this layout, which itself is the ancestor of the
-     * given view.
-     */
-    private View findDirectChild(final View descendant) {
-        View directChild = descendant;
-        for (ViewParent p = descendant.getParent(); p != this && p != null; p = p.getParent()) {
-            if (p instanceof View) {
-                directChild = (View) p;
-            }
-        }
-        return directChild;
-    }
-
-    private void updateDummyView() {
-        if (!mCollapsingTitleEnabled && mDummyView != null) {
-            // If we have a dummy view and we have our title disabled, remove it from its parent
-            final ViewParent parent = mDummyView.getParent();
-            if (parent instanceof ViewGroup) {
-                ((ViewGroup) parent).removeView(mDummyView);
-            }
-        }
-        if (mCollapsingTitleEnabled && mToolbar != null) {
-            if (mDummyView == null) {
-                mDummyView = new View(getContext());
-            }
-            if (mDummyView.getParent() == null) {
-                mToolbar.addView(mDummyView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
-            }
-        }
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        ensureToolbar();
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
-        final int mode = MeasureSpec.getMode(heightMeasureSpec);
-        final int topInset = mLastInsets != null ? mLastInsets.getSystemWindowInsetTop() : 0;
-        if (mode == MeasureSpec.UNSPECIFIED && topInset > 0) {
-            // If we have a top inset and we're set to wrap_content height we need to make sure
-            // we add the top inset to our height, therefore we re-measure
-            heightMeasureSpec = MeasureSpec.makeMeasureSpec(
-                    getMeasuredHeight() + topInset, MeasureSpec.EXACTLY);
-            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-        }
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
-        super.onLayout(changed, left, top, right, bottom);
-
-        if (mLastInsets != null) {
-            // Shift down any views which are not set to fit system windows
-            final int insetTop = mLastInsets.getSystemWindowInsetTop();
-            for (int i = 0, z = getChildCount(); i < z; i++) {
-                final View child = getChildAt(i);
-                if (!ViewCompat.getFitsSystemWindows(child)) {
-                    if (child.getTop() < insetTop) {
-                        // If the child isn't set to fit system windows but is drawing within
-                        // the inset offset it down
-                        ViewCompat.offsetTopAndBottom(child, insetTop);
-                    }
-                }
-            }
-        }
-
-        // Update the collapsed bounds by getting it's transformed bounds
-        if (mCollapsingTitleEnabled && mDummyView != null) {
-            // We only draw the title if the dummy view is being displayed (Toolbar removes
-            // views if there is no space)
-            mDrawCollapsingTitle = ViewCompat.isAttachedToWindow(mDummyView)
-                    && mDummyView.getVisibility() == VISIBLE;
-
-            if (mDrawCollapsingTitle) {
-                final boolean isRtl = ViewCompat.getLayoutDirection(this)
-                        == ViewCompat.LAYOUT_DIRECTION_RTL;
-
-                // Update the collapsed bounds
-                final int maxOffset = getMaxOffsetForPinChild(
-                        mToolbarDirectChild != null ? mToolbarDirectChild : mToolbar);
-                ViewGroupUtils.getDescendantRect(this, mDummyView, mTmpRect);
-                mCollapsingTextHelper.setCollapsedBounds(
-                        mTmpRect.left + (isRtl
-                                ? mToolbar.getTitleMarginEnd()
-                                : mToolbar.getTitleMarginStart()),
-                        mTmpRect.top + maxOffset + mToolbar.getTitleMarginTop(),
-                        mTmpRect.right + (isRtl
-                                ? mToolbar.getTitleMarginStart()
-                                : mToolbar.getTitleMarginEnd()),
-                        mTmpRect.bottom + maxOffset - mToolbar.getTitleMarginBottom());
-
-                // Update the expanded bounds
-                mCollapsingTextHelper.setExpandedBounds(
-                        isRtl ? mExpandedMarginEnd : mExpandedMarginStart,
-                        mTmpRect.top + mExpandedMarginTop,
-                        right - left - (isRtl ? mExpandedMarginStart : mExpandedMarginEnd),
-                        bottom - top - mExpandedMarginBottom);
-                // Now recalculate using the new bounds
-                mCollapsingTextHelper.recalculate();
-            }
-        }
-
-        // Update our child view offset helpers. This needs to be done after the title has been
-        // setup, so that any Toolbars are in their original position
-        for (int i = 0, z = getChildCount(); i < z; i++) {
-            getViewOffsetHelper(getChildAt(i)).onViewLayout();
-        }
-
-        // Finally, set our minimum height to enable proper AppBarLayout collapsing
-        if (mToolbar != null) {
-            if (mCollapsingTitleEnabled && TextUtils.isEmpty(mCollapsingTextHelper.getText())) {
-                // If we do not currently have a title, try and grab it from the Toolbar
-                mCollapsingTextHelper.setText(mToolbar.getTitle());
-            }
-            if (mToolbarDirectChild == null || mToolbarDirectChild == this) {
-                setMinimumHeight(getHeightWithMargins(mToolbar));
-            } else {
-                setMinimumHeight(getHeightWithMargins(mToolbarDirectChild));
-            }
-        }
-
-        updateScrimVisibility();
-    }
-
-    private static int getHeightWithMargins(@NonNull final View view) {
-        final ViewGroup.LayoutParams lp = view.getLayoutParams();
-        if (lp instanceof MarginLayoutParams) {
-            final MarginLayoutParams mlp = (MarginLayoutParams) lp;
-            return view.getHeight() + mlp.topMargin + mlp.bottomMargin;
-        }
-        return view.getHeight();
-    }
-
-    static ViewOffsetHelper getViewOffsetHelper(View view) {
-        ViewOffsetHelper offsetHelper = (ViewOffsetHelper) view.getTag(R.id.view_offset_helper);
-        if (offsetHelper == null) {
-            offsetHelper = new ViewOffsetHelper(view);
-            view.setTag(R.id.view_offset_helper, offsetHelper);
-        }
-        return offsetHelper;
-    }
-
-    /**
-     * Sets the title to be displayed by this view, if enabled.
-     *
-     * @see #setTitleEnabled(boolean)
-     * @see #getTitle()
-     *
-     * @attr ref R.styleable#CollapsingToolbarLayout_title
-     */
-    public void setTitle(@Nullable CharSequence title) {
-        mCollapsingTextHelper.setText(title);
-    }
-
-    /**
-     * Returns the title currently being displayed by this view. If the title is not enabled, then
-     * this will return {@code null}.
-     *
-     * @attr ref R.styleable#CollapsingToolbarLayout_title
-     */
-    @Nullable
-    public CharSequence getTitle() {
-        return mCollapsingTitleEnabled ? mCollapsingTextHelper.getText() : null;
-    }
-
-    /**
-     * Sets whether this view should display its own title.
-     *
-     * <p>The title displayed by this view will shrink and grow based on the scroll offset.</p>
-     *
-     * @see #setTitle(CharSequence)
-     * @see #isTitleEnabled()
-     *
-     * @attr ref R.styleable#CollapsingToolbarLayout_titleEnabled
-     */
-    public void setTitleEnabled(boolean enabled) {
-        if (enabled != mCollapsingTitleEnabled) {
-            mCollapsingTitleEnabled = enabled;
-            updateDummyView();
-            requestLayout();
-        }
-    }
-
-    /**
-     * Returns whether this view is currently displaying its own title.
-     *
-     * @see #setTitleEnabled(boolean)
-     *
-     * @attr ref R.styleable#CollapsingToolbarLayout_titleEnabled
-     */
-    public boolean isTitleEnabled() {
-        return mCollapsingTitleEnabled;
-    }
-
-    /**
-     * Set whether the content scrim and/or status bar scrim should be shown or not. Any change
-     * in the vertical scroll may overwrite this value. Any visibility change will be animated if
-     * this view has already been laid out.
-     *
-     * @param shown whether the scrims should be shown
-     *
-     * @see #getStatusBarScrim()
-     * @see #getContentScrim()
-     */
-    public void setScrimsShown(boolean shown) {
-        setScrimsShown(shown, ViewCompat.isLaidOut(this) && !isInEditMode());
-    }
-
-    /**
-     * Set whether the content scrim and/or status bar scrim should be shown or not. Any change
-     * in the vertical scroll may overwrite this value.
-     *
-     * @param shown whether the scrims should be shown
-     * @param animate whether to animate the visibility change
-     *
-     * @see #getStatusBarScrim()
-     * @see #getContentScrim()
-     */
-    public void setScrimsShown(boolean shown, boolean animate) {
-        if (mScrimsAreShown != shown) {
-            if (animate) {
-                animateScrim(shown ? 0xFF : 0x0);
-            } else {
-                setScrimAlpha(shown ? 0xFF : 0x0);
-            }
-            mScrimsAreShown = shown;
-        }
-    }
-
-    private void animateScrim(int targetAlpha) {
-        ensureToolbar();
-        if (mScrimAnimator == null) {
-            mScrimAnimator = new ValueAnimator();
-            mScrimAnimator.setDuration(mScrimAnimationDuration);
-            mScrimAnimator.setInterpolator(
-                    targetAlpha > mScrimAlpha
-                            ? AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR
-                            : AnimationUtils.LINEAR_OUT_SLOW_IN_INTERPOLATOR);
-            mScrimAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-                @Override
-                public void onAnimationUpdate(ValueAnimator animator) {
-                    setScrimAlpha((int) animator.getAnimatedValue());
-                }
-            });
-        } else if (mScrimAnimator.isRunning()) {
-            mScrimAnimator.cancel();
-        }
-
-        mScrimAnimator.setIntValues(mScrimAlpha, targetAlpha);
-        mScrimAnimator.start();
-    }
-
-    void setScrimAlpha(int alpha) {
-        if (alpha != mScrimAlpha) {
-            final Drawable contentScrim = mContentScrim;
-            if (contentScrim != null && mToolbar != null) {
-                ViewCompat.postInvalidateOnAnimation(mToolbar);
-            }
-            mScrimAlpha = alpha;
-            ViewCompat.postInvalidateOnAnimation(CollapsingToolbarLayout.this);
-        }
-    }
-
-    int getScrimAlpha() {
-        return mScrimAlpha;
-    }
-
-    /**
-     * Set the drawable to use for the content scrim from resources. Providing null will disable
-     * the scrim functionality.
-     *
-     * @param drawable the drawable to display
-     *
-     * @attr ref R.styleable#CollapsingToolbarLayout_contentScrim
-     * @see #getContentScrim()
-     */
-    public void setContentScrim(@Nullable Drawable drawable) {
-        if (mContentScrim != drawable) {
-            if (mContentScrim != null) {
-                mContentScrim.setCallback(null);
-            }
-            mContentScrim = drawable != null ? drawable.mutate() : null;
-            if (mContentScrim != null) {
-                mContentScrim.setBounds(0, 0, getWidth(), getHeight());
-                mContentScrim.setCallback(this);
-                mContentScrim.setAlpha(mScrimAlpha);
-            }
-            ViewCompat.postInvalidateOnAnimation(this);
-        }
-    }
-
-    /**
-     * Set the color to use for the content scrim.
-     *
-     * @param color the color to display
-     *
-     * @attr ref R.styleable#CollapsingToolbarLayout_contentScrim
-     * @see #getContentScrim()
-     */
-    public void setContentScrimColor(@ColorInt int color) {
-        setContentScrim(new ColorDrawable(color));
-    }
-
-    /**
-     * Set the drawable to use for the content scrim from resources.
-     *
-     * @param resId drawable resource id
-     *
-     * @attr ref R.styleable#CollapsingToolbarLayout_contentScrim
-     * @see #getContentScrim()
-     */
-    public void setContentScrimResource(@DrawableRes int resId) {
-        setContentScrim(ContextCompat.getDrawable(getContext(), resId));
-
-    }
-
-    /**
-     * Returns the drawable which is used for the foreground scrim.
-     *
-     * @attr ref R.styleable#CollapsingToolbarLayout_contentScrim
-     * @see #setContentScrim(Drawable)
-     */
-    @Nullable
-    public Drawable getContentScrim() {
-        return mContentScrim;
-    }
-
-    /**
-     * Set the drawable to use for the status bar scrim from resources.
-     * Providing null will disable the scrim functionality.
-     *
-     * <p>This scrim is only shown when we have been given a top system inset.</p>
-     *
-     * @param drawable the drawable to display
-     *
-     * @attr ref R.styleable#CollapsingToolbarLayout_statusBarScrim
-     * @see #getStatusBarScrim()
-     */
-    public void setStatusBarScrim(@Nullable Drawable drawable) {
-        if (mStatusBarScrim != drawable) {
-            if (mStatusBarScrim != null) {
-                mStatusBarScrim.setCallback(null);
-            }
-            mStatusBarScrim = drawable != null ? drawable.mutate() : null;
-            if (mStatusBarScrim != null) {
-                if (mStatusBarScrim.isStateful()) {
-                    mStatusBarScrim.setState(getDrawableState());
-                }
-                DrawableCompat.setLayoutDirection(mStatusBarScrim,
-                        ViewCompat.getLayoutDirection(this));
-                mStatusBarScrim.setVisible(getVisibility() == VISIBLE, false);
-                mStatusBarScrim.setCallback(this);
-                mStatusBarScrim.setAlpha(mScrimAlpha);
-            }
-            ViewCompat.postInvalidateOnAnimation(this);
-        }
-    }
-
-    @Override
-    protected void drawableStateChanged() {
-        super.drawableStateChanged();
-
-        final int[] state = getDrawableState();
-        boolean changed = false;
-
-        Drawable d = mStatusBarScrim;
-        if (d != null && d.isStateful()) {
-            changed |= d.setState(state);
-        }
-        d = mContentScrim;
-        if (d != null && d.isStateful()) {
-            changed |= d.setState(state);
-        }
-        if (mCollapsingTextHelper != null) {
-            changed |= mCollapsingTextHelper.setState(state);
-        }
-
-        if (changed) {
-            invalidate();
-        }
-    }
-
-    @Override
-    protected boolean verifyDrawable(Drawable who) {
-        return super.verifyDrawable(who) || who == mContentScrim || who == mStatusBarScrim;
-    }
-
-    @Override
-    public void setVisibility(int visibility) {
-        super.setVisibility(visibility);
-
-        final boolean visible = visibility == VISIBLE;
-        if (mStatusBarScrim != null && mStatusBarScrim.isVisible() != visible) {
-            mStatusBarScrim.setVisible(visible, false);
-        }
-        if (mContentScrim != null && mContentScrim.isVisible() != visible) {
-            mContentScrim.setVisible(visible, false);
-        }
-    }
-
-    /**
-     * Set the color to use for the status bar scrim.
-     *
-     * <p>This scrim is only shown when we have been given a top system inset.</p>
-     *
-     * @param color the color to display
-     *
-     * @attr ref R.styleable#CollapsingToolbarLayout_statusBarScrim
-     * @see #getStatusBarScrim()
-     */
-    public void setStatusBarScrimColor(@ColorInt int color) {
-        setStatusBarScrim(new ColorDrawable(color));
-    }
-
-    /**
-     * Set the drawable to use for the content scrim from resources.
-     *
-     * @param resId drawable resource id
-     *
-     * @attr ref R.styleable#CollapsingToolbarLayout_statusBarScrim
-     * @see #getStatusBarScrim()
-     */
-    public void setStatusBarScrimResource(@DrawableRes int resId) {
-        setStatusBarScrim(ContextCompat.getDrawable(getContext(), resId));
-    }
-
-    /**
-     * Returns the drawable which is used for the status bar scrim.
-     *
-     * @attr ref R.styleable#CollapsingToolbarLayout_statusBarScrim
-     * @see #setStatusBarScrim(Drawable)
-     */
-    @Nullable
-    public Drawable getStatusBarScrim() {
-        return mStatusBarScrim;
-    }
-
-    /**
-     * Sets the text color and size for the collapsed title from the specified
-     * TextAppearance resource.
-     *
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_collapsedTitleTextAppearance
-     */
-    public void setCollapsedTitleTextAppearance(@StyleRes int resId) {
-        mCollapsingTextHelper.setCollapsedTextAppearance(resId);
-    }
-
-    /**
-     * Sets the text color of the collapsed title.
-     *
-     * @param color The new text color in ARGB format
-     */
-    public void setCollapsedTitleTextColor(@ColorInt int color) {
-        setCollapsedTitleTextColor(ColorStateList.valueOf(color));
-    }
-
-    /**
-     * Sets the text colors of the collapsed title.
-     *
-     * @param colors ColorStateList containing the new text colors
-     */
-    public void setCollapsedTitleTextColor(@NonNull ColorStateList colors) {
-        mCollapsingTextHelper.setCollapsedTextColor(colors);
-    }
-
-    /**
-     * Sets the horizontal alignment of the collapsed title and the vertical gravity that will
-     * be used when there is extra space in the collapsed bounds beyond what is required for
-     * the title itself.
-     *
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_collapsedTitleGravity
-     */
-    public void setCollapsedTitleGravity(int gravity) {
-        mCollapsingTextHelper.setCollapsedTextGravity(gravity);
-    }
-
-    /**
-     * Returns the horizontal and vertical alignment for title when collapsed.
-     *
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_collapsedTitleGravity
-     */
-    public int getCollapsedTitleGravity() {
-        return mCollapsingTextHelper.getCollapsedTextGravity();
-    }
-
-    /**
-     * Sets the text color and size for the expanded title from the specified
-     * TextAppearance resource.
-     *
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleTextAppearance
-     */
-    public void setExpandedTitleTextAppearance(@StyleRes int resId) {
-        mCollapsingTextHelper.setExpandedTextAppearance(resId);
-    }
-
-    /**
-     * Sets the text color of the expanded title.
-     *
-     * @param color The new text color in ARGB format
-     */
-    public void setExpandedTitleColor(@ColorInt int color) {
-        setExpandedTitleTextColor(ColorStateList.valueOf(color));
-    }
-
-    /**
-     * Sets the text colors of the expanded title.
-     *
-     * @param colors ColorStateList containing the new text colors
-     */
-    public void setExpandedTitleTextColor(@NonNull ColorStateList colors) {
-        mCollapsingTextHelper.setExpandedTextColor(colors);
-    }
-
-    /**
-     * Sets the horizontal alignment of the expanded title and the vertical gravity that will
-     * be used when there is extra space in the expanded bounds beyond what is required for
-     * the title itself.
-     *
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleGravity
-     */
-    public void setExpandedTitleGravity(int gravity) {
-        mCollapsingTextHelper.setExpandedTextGravity(gravity);
-    }
-
-    /**
-     * Returns the horizontal and vertical alignment for title when expanded.
-     *
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleGravity
-     */
-    public int getExpandedTitleGravity() {
-        return mCollapsingTextHelper.getExpandedTextGravity();
-    }
-
-    /**
-     * Set the typeface to use for the collapsed title.
-     *
-     * @param typeface typeface to use, or {@code null} to use the default.
-     */
-    public void setCollapsedTitleTypeface(@Nullable Typeface typeface) {
-        mCollapsingTextHelper.setCollapsedTypeface(typeface);
-    }
-
-    /**
-     * Returns the typeface used for the collapsed title.
-     */
-    @NonNull
-    public Typeface getCollapsedTitleTypeface() {
-        return mCollapsingTextHelper.getCollapsedTypeface();
-    }
-
-    /**
-     * Set the typeface to use for the expanded title.
-     *
-     * @param typeface typeface to use, or {@code null} to use the default.
-     */
-    public void setExpandedTitleTypeface(@Nullable Typeface typeface) {
-        mCollapsingTextHelper.setExpandedTypeface(typeface);
-    }
-
-    /**
-     * Returns the typeface used for the expanded title.
-     */
-    @NonNull
-    public Typeface getExpandedTitleTypeface() {
-        return mCollapsingTextHelper.getExpandedTypeface();
-    }
-
-    /**
-     * Sets the expanded title margins.
-     *
-     * @param start the starting title margin in pixels
-     * @param top the top title margin in pixels
-     * @param end the ending title margin in pixels
-     * @param bottom the bottom title margin in pixels
-     *
-     * @see #getExpandedTitleMarginStart()
-     * @see #getExpandedTitleMarginTop()
-     * @see #getExpandedTitleMarginEnd()
-     * @see #getExpandedTitleMarginBottom()
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleMargin
-     */
-    public void setExpandedTitleMargin(int start, int top, int end, int bottom) {
-        mExpandedMarginStart = start;
-        mExpandedMarginTop = top;
-        mExpandedMarginEnd = end;
-        mExpandedMarginBottom = bottom;
-        requestLayout();
-    }
-
-    /**
-     * @return the starting expanded title margin in pixels
-     *
-     * @see #setExpandedTitleMarginStart(int)
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleMarginStart
-     */
-    public int getExpandedTitleMarginStart() {
-        return mExpandedMarginStart;
-    }
-
-    /**
-     * Sets the starting expanded title margin in pixels.
-     *
-     * @param margin the starting title margin in pixels
-     * @see #getExpandedTitleMarginStart()
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleMarginStart
-     */
-    public void setExpandedTitleMarginStart(int margin) {
-        mExpandedMarginStart = margin;
-        requestLayout();
-    }
-
-    /**
-     * @return the top expanded title margin in pixels
-     * @see #setExpandedTitleMarginTop(int)
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleMarginTop
-     */
-    public int getExpandedTitleMarginTop() {
-        return mExpandedMarginTop;
-    }
-
-    /**
-     * Sets the top expanded title margin in pixels.
-     *
-     * @param margin the top title margin in pixels
-     * @see #getExpandedTitleMarginTop()
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleMarginTop
-     */
-    public void setExpandedTitleMarginTop(int margin) {
-        mExpandedMarginTop = margin;
-        requestLayout();
-    }
-
-    /**
-     * @return the ending expanded title margin in pixels
-     * @see #setExpandedTitleMarginEnd(int)
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleMarginEnd
-     */
-    public int getExpandedTitleMarginEnd() {
-        return mExpandedMarginEnd;
-    }
-
-    /**
-     * Sets the ending expanded title margin in pixels.
-     *
-     * @param margin the ending title margin in pixels
-     * @see #getExpandedTitleMarginEnd()
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleMarginEnd
-     */
-    public void setExpandedTitleMarginEnd(int margin) {
-        mExpandedMarginEnd = margin;
-        requestLayout();
-    }
-
-    /**
-     * @return the bottom expanded title margin in pixels
-     * @see #setExpandedTitleMarginBottom(int)
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleMarginBottom
-     */
-    public int getExpandedTitleMarginBottom() {
-        return mExpandedMarginBottom;
-    }
-
-    /**
-     * Sets the bottom expanded title margin in pixels.
-     *
-     * @param margin the bottom title margin in pixels
-     * @see #getExpandedTitleMarginBottom()
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_expandedTitleMarginBottom
-     */
-    public void setExpandedTitleMarginBottom(int margin) {
-        mExpandedMarginBottom = margin;
-        requestLayout();
-    }
-
-    /**
-     * Set the amount of visible height in pixels used to define when to trigger a scrim
-     * visibility change.
-     *
-     * <p>If the visible height of this view is less than the given value, the scrims will be
-     * made visible, otherwise they are hidden.</p>
-     *
-     * @param height value in pixels used to define when to trigger a scrim visibility change
-     *
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_scrimVisibleHeightTrigger
-     */
-    public void setScrimVisibleHeightTrigger(@IntRange(from = 0) final int height) {
-        if (mScrimVisibleHeightTrigger != height) {
-            mScrimVisibleHeightTrigger = height;
-            // Update the scrim visibility
-            updateScrimVisibility();
-        }
-    }
-
-    /**
-     * Returns the amount of visible height in pixels used to define when to trigger a scrim
-     * visibility change.
-     *
-     * @see #setScrimVisibleHeightTrigger(int)
-     */
-    public int getScrimVisibleHeightTrigger() {
-        if (mScrimVisibleHeightTrigger >= 0) {
-            // If we have one explicitly set, return it
-            return mScrimVisibleHeightTrigger;
-        }
-
-        // Otherwise we'll use the default computed value
-        final int insetTop = mLastInsets != null ? mLastInsets.getSystemWindowInsetTop() : 0;
-
-        final int minHeight = ViewCompat.getMinimumHeight(this);
-        if (minHeight > 0) {
-            // If we have a minHeight set, lets use 2 * minHeight (capped at our height)
-            return Math.min((minHeight * 2) + insetTop, getHeight());
-        }
-
-        // If we reach here then we don't have a min height set. Instead we'll take a
-        // guess at 1/3 of our height being visible
-        return getHeight() / 3;
-    }
-
-    /**
-     * Set the duration used for scrim visibility animations.
-     *
-     * @param duration the duration to use in milliseconds
-     *
-     * @attr ref android.support.design.R.styleable#CollapsingToolbarLayout_scrimAnimationDuration
-     */
-    public void setScrimAnimationDuration(@IntRange(from = 0) final long duration) {
-        mScrimAnimationDuration = duration;
-    }
-
-    /**
-     * Returns the duration in milliseconds used for scrim visibility animations.
-     */
-    public long getScrimAnimationDuration() {
-        return mScrimAnimationDuration;
-    }
-
-    @Override
-    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
-        return p instanceof LayoutParams;
-    }
-
-    @Override
-    protected LayoutParams generateDefaultLayoutParams() {
-        return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
-    }
-
-    @Override
-    public FrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs) {
-        return new LayoutParams(getContext(), attrs);
-    }
-
-    @Override
-    protected FrameLayout.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
-        return new LayoutParams(p);
-    }
-
-    public static class LayoutParams extends FrameLayout.LayoutParams {
-
-        private static final float DEFAULT_PARALLAX_MULTIPLIER = 0.5f;
-
-        /** @hide */
-        @RestrictTo(LIBRARY_GROUP)
-        @IntDef({
-                COLLAPSE_MODE_OFF,
-                COLLAPSE_MODE_PIN,
-                COLLAPSE_MODE_PARALLAX
-        })
-        @Retention(RetentionPolicy.SOURCE)
-        @interface CollapseMode {}
-
-        /**
-         * The view will act as normal with no collapsing behavior.
-         */
-        public static final int COLLAPSE_MODE_OFF = 0;
-
-        /**
-         * The view will pin in place until it reaches the bottom of the
-         * {@link CollapsingToolbarLayout}.
-         */
-        public static final int COLLAPSE_MODE_PIN = 1;
-
-        /**
-         * The view will scroll in a parallax fashion. See {@link #setParallaxMultiplier(float)}
-         * to change the multiplier used.
-         */
-        public static final int COLLAPSE_MODE_PARALLAX = 2;
-
-        int mCollapseMode = COLLAPSE_MODE_OFF;
-        float mParallaxMult = DEFAULT_PARALLAX_MULTIPLIER;
-
-        public LayoutParams(Context c, AttributeSet attrs) {
-            super(c, attrs);
-
-            TypedArray a = c.obtainStyledAttributes(attrs,
-                    R.styleable.CollapsingToolbarLayout_Layout);
-            mCollapseMode = a.getInt(
-                    R.styleable.CollapsingToolbarLayout_Layout_layout_collapseMode,
-                    COLLAPSE_MODE_OFF);
-            setParallaxMultiplier(a.getFloat(
-                    R.styleable.CollapsingToolbarLayout_Layout_layout_collapseParallaxMultiplier,
-                    DEFAULT_PARALLAX_MULTIPLIER));
-            a.recycle();
-        }
-
-        public LayoutParams(int width, int height) {
-            super(width, height);
-        }
-
-        public LayoutParams(int width, int height, int gravity) {
-            super(width, height, gravity);
-        }
-
-        public LayoutParams(ViewGroup.LayoutParams p) {
-            super(p);
-        }
-
-        public LayoutParams(MarginLayoutParams source) {
-            super(source);
-        }
-
-        @RequiresApi(19)
-        public LayoutParams(FrameLayout.LayoutParams source) {
-            // The copy constructor called here only exists on API 19+.
-            super(source);
-        }
-
-        /**
-         * Set the collapse mode.
-         *
-         * @param collapseMode one of {@link #COLLAPSE_MODE_OFF}, {@link #COLLAPSE_MODE_PIN}
-         *                     or {@link #COLLAPSE_MODE_PARALLAX}.
-         */
-        public void setCollapseMode(@CollapseMode int collapseMode) {
-            mCollapseMode = collapseMode;
-        }
-
-        /**
-         * Returns the requested collapse mode.
-         *
-         * @return the current mode. One of {@link #COLLAPSE_MODE_OFF}, {@link #COLLAPSE_MODE_PIN}
-         * or {@link #COLLAPSE_MODE_PARALLAX}.
-         */
-        @CollapseMode
-        public int getCollapseMode() {
-            return mCollapseMode;
-        }
-
-        /**
-         * Set the parallax scroll multiplier used in conjunction with
-         * {@link #COLLAPSE_MODE_PARALLAX}. A value of {@code 0.0} indicates no movement at all,
-         * {@code 1.0f} indicates normal scroll movement.
-         *
-         * @param multiplier the multiplier.
-         *
-         * @see #getParallaxMultiplier()
-         */
-        public void setParallaxMultiplier(float multiplier) {
-            mParallaxMult = multiplier;
-        }
-
-        /**
-         * Returns the parallax scroll multiplier used in conjunction with
-         * {@link #COLLAPSE_MODE_PARALLAX}.
-         *
-         * @see #setParallaxMultiplier(float)
-         */
-        public float getParallaxMultiplier() {
-            return mParallaxMult;
-        }
-    }
-
-    /**
-     * Show or hide the scrims if needed
-     */
-    final void updateScrimVisibility() {
-        if (mContentScrim != null || mStatusBarScrim != null) {
-            setScrimsShown(getHeight() + mCurrentOffset < getScrimVisibleHeightTrigger());
-        }
-    }
-
-    final int getMaxOffsetForPinChild(View child) {
-        final ViewOffsetHelper offsetHelper = getViewOffsetHelper(child);
-        final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-        return getHeight()
-                - offsetHelper.getLayoutTop()
-                - child.getHeight()
-                - lp.bottomMargin;
-    }
-
-    private class OffsetUpdateListener implements AppBarLayout.OnOffsetChangedListener {
-        OffsetUpdateListener() {
-        }
-
-        @Override
-        public void onOffsetChanged(AppBarLayout layout, int verticalOffset) {
-            mCurrentOffset = verticalOffset;
-
-            final int insetTop = mLastInsets != null ? mLastInsets.getSystemWindowInsetTop() : 0;
-
-            for (int i = 0, z = getChildCount(); i < z; i++) {
-                final View child = getChildAt(i);
-                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-                final ViewOffsetHelper offsetHelper = getViewOffsetHelper(child);
-
-                switch (lp.mCollapseMode) {
-                    case LayoutParams.COLLAPSE_MODE_PIN:
-                        offsetHelper.setTopAndBottomOffset(MathUtils.clamp(
-                                -verticalOffset, 0, getMaxOffsetForPinChild(child)));
-                        break;
-                    case LayoutParams.COLLAPSE_MODE_PARALLAX:
-                        offsetHelper.setTopAndBottomOffset(
-                                Math.round(-verticalOffset * lp.mParallaxMult));
-                        break;
-                }
-            }
-
-            // Show or hide the scrims if needed
-            updateScrimVisibility();
-
-            if (mStatusBarScrim != null && insetTop > 0) {
-                ViewCompat.postInvalidateOnAnimation(CollapsingToolbarLayout.this);
-            }
-
-            // Update the collapsing text's fraction
-            final int expandRange = getHeight() - ViewCompat.getMinimumHeight(
-                    CollapsingToolbarLayout.this) - insetTop;
-            mCollapsingTextHelper.setExpansionFraction(
-                    Math.abs(verticalOffset) / (float) expandRange);
-        }
-    }
-}
diff --git a/design/src/android/support/design/widget/DrawableUtils.java b/design/src/android/support/design/widget/DrawableUtils.java
deleted file mode 100644
index df1c04b..0000000
--- a/design/src/android/support/design/widget/DrawableUtils.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.DrawableContainer;
-import android.util.Log;
-
-import java.lang.reflect.Method;
-
-/**
- * Caution. Gross hacks ahead.
- */
-class DrawableUtils {
-
-    private static final String LOG_TAG = "DrawableUtils";
-
-    private static Method sSetConstantStateMethod;
-    private static boolean sSetConstantStateMethodFetched;
-
-    private DrawableUtils() {}
-
-    static boolean setContainerConstantState(DrawableContainer drawable,
-            Drawable.ConstantState constantState) {
-        // We can use getDeclaredMethod() on v9+
-        return setContainerConstantStateV9(drawable, constantState);
-    }
-
-    private static boolean setContainerConstantStateV9(DrawableContainer drawable,
-            Drawable.ConstantState constantState) {
-        if (!sSetConstantStateMethodFetched) {
-            try {
-                sSetConstantStateMethod = DrawableContainer.class.getDeclaredMethod(
-                        "setConstantState", DrawableContainer.DrawableContainerState.class);
-                sSetConstantStateMethod.setAccessible(true);
-            } catch (NoSuchMethodException e) {
-                Log.e(LOG_TAG, "Could not fetch setConstantState(). Oh well.");
-            }
-            sSetConstantStateMethodFetched = true;
-        }
-        if (sSetConstantStateMethod != null) {
-            try {
-                sSetConstantStateMethod.invoke(drawable, constantState);
-                return true;
-            } catch (Exception e) {
-                Log.e(LOG_TAG, "Could not invoke setConstantState(). Oh well.");
-            }
-        }
-        return false;
-    }
-}
diff --git a/design/src/android/support/design/widget/FloatingActionButton.java b/design/src/android/support/design/widget/FloatingActionButton.java
deleted file mode 100644
index f37b379..0000000
--- a/design/src/android/support/design/widget/FloatingActionButton.java
+++ /dev/null
@@ -1,870 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IntDef;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-import android.support.annotation.VisibleForTesting;
-import android.support.design.R;
-import android.support.design.widget.FloatingActionButtonImpl.InternalVisibilityChangedListener;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.widget.ViewGroupUtils;
-import android.support.v7.widget.AppCompatImageHelper;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.List;
-
-/**
- * Floating action buttons are used for a special type of promoted action. They are distinguished
- * by a circled icon floating above the UI and have special motion behaviors related to morphing,
- * launching, and the transferring anchor point.
- *
- * <p>Floating action buttons come in two sizes: the default and the mini. The size can be
- * controlled with the {@code fabSize} attribute.</p>
- *
- * <p>As this class descends from {@link ImageView}, you can control the icon which is displayed
- * via {@link #setImageDrawable(Drawable)}.</p>
- *
- * <p>The background color of this view defaults to the your theme's {@code colorAccent}. If you
- * wish to change this at runtime then you can do so via
- * {@link #setBackgroundTintList(ColorStateList)}.</p>
- */
-@CoordinatorLayout.DefaultBehavior(FloatingActionButton.Behavior.class)
-public class FloatingActionButton extends VisibilityAwareImageButton {
-
-    private static final String LOG_TAG = "FloatingActionButton";
-
-    /**
-     * Callback to be invoked when the visibility of a FloatingActionButton changes.
-     */
-    public abstract static class OnVisibilityChangedListener {
-        /**
-         * Called when a FloatingActionButton has been
-         * {@link #show(OnVisibilityChangedListener) shown}.
-         *
-         * @param fab the FloatingActionButton that was shown.
-         */
-        public void onShown(FloatingActionButton fab) {}
-
-        /**
-         * Called when a FloatingActionButton has been
-         * {@link #hide(OnVisibilityChangedListener) hidden}.
-         *
-         * @param fab the FloatingActionButton that was hidden.
-         */
-        public void onHidden(FloatingActionButton fab) {}
-    }
-
-    // These values must match those in the attrs declaration
-
-    /**
-     * The mini sized button. Will always been smaller than {@link #SIZE_NORMAL}.
-     *
-     * @see #setSize(int)
-     */
-    public static final int SIZE_MINI = 1;
-
-    /**
-     * The normal sized button. Will always been larger than {@link #SIZE_MINI}.
-     *
-     * @see #setSize(int)
-     */
-    public static final int SIZE_NORMAL = 0;
-
-    /**
-     * Size which will change based on the window size. For small sized windows
-     * (largest screen dimension < 470dp) this will select a small sized button, and for
-     * larger sized windows it will select a larger size.
-     *
-     * @see #setSize(int)
-     */
-    public static final int SIZE_AUTO = -1;
-
-    /**
-     * Indicates that FloatingActionButton should not have a custom size.
-     */
-    public static final int NO_CUSTOM_SIZE = 0;
-
-    /**
-     * The switch point for the largest screen edge where SIZE_AUTO switches from mini to normal.
-     */
-    private static final int AUTO_MINI_LARGEST_SCREEN_WIDTH = 470;
-
-    /** @hide */
-    @RestrictTo(LIBRARY_GROUP)
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({SIZE_MINI, SIZE_NORMAL, SIZE_AUTO})
-    public @interface Size {}
-
-    private ColorStateList mBackgroundTint;
-    private PorterDuff.Mode mBackgroundTintMode;
-
-    private int mBorderWidth;
-    private int mRippleColor;
-    private int mSize;
-    private int mCustomSize;
-    int mImagePadding;
-    private int mMaxImageSize;
-
-    boolean mCompatPadding;
-    final Rect mShadowPadding = new Rect();
-    private final Rect mTouchArea = new Rect();
-
-    private AppCompatImageHelper mImageHelper;
-
-    private FloatingActionButtonImpl mImpl;
-
-    public FloatingActionButton(Context context) {
-        this(context, null);
-    }
-
-    public FloatingActionButton(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public FloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-
-        ThemeUtils.checkAppCompatTheme(context);
-
-        TypedArray a = context.obtainStyledAttributes(attrs,
-                R.styleable.FloatingActionButton, defStyleAttr,
-                R.style.Widget_Design_FloatingActionButton);
-        mBackgroundTint = a.getColorStateList(R.styleable.FloatingActionButton_backgroundTint);
-        mBackgroundTintMode = ViewUtils.parseTintMode(a.getInt(
-                R.styleable.FloatingActionButton_backgroundTintMode, -1), null);
-        mRippleColor = a.getColor(R.styleable.FloatingActionButton_rippleColor, 0);
-        mSize = a.getInt(R.styleable.FloatingActionButton_fabSize, SIZE_AUTO);
-        mCustomSize = a.getDimensionPixelSize(R.styleable.FloatingActionButton_fabCustomSize,
-                    0);
-        mBorderWidth = a.getDimensionPixelSize(R.styleable.FloatingActionButton_borderWidth, 0);
-        final float elevation = a.getDimension(R.styleable.FloatingActionButton_elevation, 0f);
-        final float pressedTranslationZ = a.getDimension(
-                R.styleable.FloatingActionButton_pressedTranslationZ, 0f);
-        mCompatPadding = a.getBoolean(R.styleable.FloatingActionButton_useCompatPadding, false);
-        a.recycle();
-
-        mImageHelper = new AppCompatImageHelper(this);
-        mImageHelper.loadFromAttributes(attrs, defStyleAttr);
-
-        mMaxImageSize = (int) getResources().getDimension(R.dimen.design_fab_image_size);
-
-        getImpl().setBackgroundDrawable(mBackgroundTint, mBackgroundTintMode,
-                mRippleColor, mBorderWidth);
-        getImpl().setElevation(elevation);
-        getImpl().setPressedTranslationZ(pressedTranslationZ);
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        final int preferredSize = getSizeDimension();
-
-        mImagePadding = (preferredSize - mMaxImageSize) / 2;
-        getImpl().updatePadding();
-
-        final int w = resolveAdjustedSize(preferredSize, widthMeasureSpec);
-        final int h = resolveAdjustedSize(preferredSize, heightMeasureSpec);
-
-        // As we want to stay circular, we set both dimensions to be the
-        // smallest resolved dimension
-        final int d = Math.min(w, h);
-
-        // We add the shadow's padding to the measured dimension
-        setMeasuredDimension(
-                d + mShadowPadding.left + mShadowPadding.right,
-                d + mShadowPadding.top + mShadowPadding.bottom);
-    }
-
-    /**
-     * Returns the ripple color for this button.
-     *
-     * @return the ARGB color used for the ripple
-     * @see #setRippleColor(int)
-     */
-    @ColorInt
-    public int getRippleColor() {
-        return mRippleColor;
-    }
-
-    /**
-     * Sets the ripple color for this button.
-     *
-     * <p>When running on devices with KitKat or below, we draw this color as a filled circle
-     * rather than a ripple.</p>
-     *
-     * @param color ARGB color to use for the ripple
-     * @attr ref android.support.design.R.styleable#FloatingActionButton_rippleColor
-     * @see #getRippleColor()
-     */
-    public void setRippleColor(@ColorInt int color) {
-        if (mRippleColor != color) {
-            mRippleColor = color;
-            getImpl().setRippleColor(color);
-        }
-    }
-
-    /**
-     * Returns the tint applied to the background drawable, if specified.
-     *
-     * @return the tint applied to the background drawable
-     * @see #setBackgroundTintList(ColorStateList)
-     */
-    @Nullable
-    @Override
-    public ColorStateList getBackgroundTintList() {
-        return mBackgroundTint;
-    }
-
-    /**
-     * Applies a tint to the background drawable. Does not modify the current tint
-     * mode, which is {@link PorterDuff.Mode#SRC_IN} by default.
-     *
-     * @param tint the tint to apply, may be {@code null} to clear tint
-     */
-    @Override
-    public void setBackgroundTintList(@Nullable ColorStateList tint) {
-        if (mBackgroundTint != tint) {
-            mBackgroundTint = tint;
-            getImpl().setBackgroundTintList(tint);
-        }
-    }
-
-    /**
-     * Returns the blending mode used to apply the tint to the background
-     * drawable, if specified.
-     *
-     * @return the blending mode used to apply the tint to the background
-     *         drawable
-     * @see #setBackgroundTintMode(PorterDuff.Mode)
-     */
-    @Nullable
-    @Override
-    public PorterDuff.Mode getBackgroundTintMode() {
-        return mBackgroundTintMode;
-    }
-
-    /**
-     * Specifies the blending mode used to apply the tint specified by
-     * {@link #setBackgroundTintList(ColorStateList)}} to the background
-     * drawable. The default mode is {@link PorterDuff.Mode#SRC_IN}.
-     *
-     * @param tintMode the blending mode used to apply the tint, may be
-     *                 {@code null} to clear tint
-     */
-    @Override
-    public void setBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
-        if (mBackgroundTintMode != tintMode) {
-            mBackgroundTintMode = tintMode;
-            getImpl().setBackgroundTintMode(tintMode);
-        }
-    }
-
-    @Override
-    public void setBackgroundDrawable(Drawable background) {
-        Log.i(LOG_TAG, "Setting a custom background is not supported.");
-    }
-
-    @Override
-    public void setBackgroundResource(int resid) {
-        Log.i(LOG_TAG, "Setting a custom background is not supported.");
-    }
-
-    @Override
-    public void setBackgroundColor(int color) {
-        Log.i(LOG_TAG, "Setting a custom background is not supported.");
-    }
-
-    @Override
-    public void setImageResource(@DrawableRes int resId) {
-        // Intercept this call and instead retrieve the Drawable via the image helper
-        mImageHelper.setImageResource(resId);
-    }
-
-    /**
-     * Shows the button.
-     * <p>This method will animate the button show if the view has already been laid out.</p>
-     */
-    public void show() {
-        show(null);
-    }
-
-    /**
-     * Shows the button.
-     * <p>This method will animate the button show if the view has already been laid out.</p>
-     *
-     * @param listener the listener to notify when this view is shown
-     */
-    public void show(@Nullable final OnVisibilityChangedListener listener) {
-        show(listener, true);
-    }
-
-    void show(OnVisibilityChangedListener listener, boolean fromUser) {
-        getImpl().show(wrapOnVisibilityChangedListener(listener), fromUser);
-    }
-
-    /**
-     * Hides the button.
-     * <p>This method will animate the button hide if the view has already been laid out.</p>
-     */
-    public void hide() {
-        hide(null);
-    }
-
-    /**
-     * Hides the button.
-     * <p>This method will animate the button hide if the view has already been laid out.</p>
-     *
-     * @param listener the listener to notify when this view is hidden
-     */
-    public void hide(@Nullable OnVisibilityChangedListener listener) {
-        hide(listener, true);
-    }
-
-    void hide(@Nullable OnVisibilityChangedListener listener, boolean fromUser) {
-        getImpl().hide(wrapOnVisibilityChangedListener(listener), fromUser);
-    }
-
-    /**
-     * Set whether FloatingActionButton should add inner padding on platforms Lollipop and after,
-     * to ensure consistent dimensions on all platforms.
-     *
-     * @param useCompatPadding true if FloatingActionButton is adding inner padding on platforms
-     *                         Lollipop and after, to ensure consistent dimensions on all platforms.
-     *
-     * @attr ref android.support.design.R.styleable#FloatingActionButton_useCompatPadding
-     * @see #getUseCompatPadding()
-     */
-    public void setUseCompatPadding(boolean useCompatPadding) {
-        if (mCompatPadding != useCompatPadding) {
-            mCompatPadding = useCompatPadding;
-            getImpl().onCompatShadowChanged();
-        }
-    }
-
-    /**
-     * Returns whether FloatingActionButton will add inner padding on platforms Lollipop and after.
-     *
-     * @return true if FloatingActionButton is adding inner padding on platforms Lollipop and after,
-     * to ensure consistent dimensions on all platforms.
-     *
-     * @attr ref android.support.design.R.styleable#FloatingActionButton_useCompatPadding
-     * @see #setUseCompatPadding(boolean)
-     */
-    public boolean getUseCompatPadding() {
-        return mCompatPadding;
-    }
-
-    /**
-     * Sets the size of the button.
-     *
-     * <p>The options relate to the options available on the material design specification.
-     * {@link #SIZE_NORMAL} is larger than {@link #SIZE_MINI}. {@link #SIZE_AUTO} will choose
-     * an appropriate size based on the screen size.</p>
-     *
-     * @param size one of {@link #SIZE_NORMAL}, {@link #SIZE_MINI} or {@link #SIZE_AUTO}
-     *
-     * @attr ref android.support.design.R.styleable#FloatingActionButton_fabSize
-     */
-    public void setSize(@Size int size) {
-        if (size != mSize) {
-            mSize = size;
-            requestLayout();
-        }
-    }
-
-    /**
-     * Returns the chosen size for this button.
-     *
-     * @return one of {@link #SIZE_NORMAL}, {@link #SIZE_MINI} or {@link #SIZE_AUTO}
-     * @see #setSize(int)
-     */
-    @Size
-    public int getSize() {
-        return mSize;
-    }
-
-    @Nullable
-    private InternalVisibilityChangedListener wrapOnVisibilityChangedListener(
-            @Nullable final OnVisibilityChangedListener listener) {
-        if (listener == null) {
-            return null;
-        }
-
-        return new InternalVisibilityChangedListener() {
-            @Override
-            public void onShown() {
-                listener.onShown(FloatingActionButton.this);
-            }
-
-            @Override
-            public void onHidden() {
-                listener.onHidden(FloatingActionButton.this);
-            }
-        };
-    }
-
-    /**
-     * Sets the size of the button to be a custom value in pixels. If set to
-     * {@link #NO_CUSTOM_SIZE}, custom size will not be used and size will be calculated according
-     * to {@link #setSize(int)} method.
-     *
-     * @param size preferred size in pixels, or zero
-     *
-     * @attr ref android.support.design.R.styleable#FloatingActionButton_fabCustomSize
-     */
-    public void setCustomSize(int size) {
-        if (size < 0) {
-            throw new IllegalArgumentException("Custom size should be non-negative.");
-        }
-        mCustomSize = size;
-    }
-
-    /**
-     * Returns the custom size for this button.
-     *
-     * @return size in pixels, or {@link #NO_CUSTOM_SIZE}
-     */
-    public int getCustomSize() {
-        return mCustomSize;
-    }
-
-    int getSizeDimension() {
-        return getSizeDimension(mSize);
-    }
-
-    private int getSizeDimension(@Size final int size) {
-        final Resources res = getResources();
-        // If custom size is set, return it
-        if (mCustomSize != NO_CUSTOM_SIZE) {
-            return mCustomSize;
-        }
-        switch (size) {
-            case SIZE_AUTO:
-                // If we're set to auto, grab the size from resources and refresh
-                final int width = res.getConfiguration().screenWidthDp;
-                final int height = res.getConfiguration().screenHeightDp;
-                return Math.max(width, height) < AUTO_MINI_LARGEST_SCREEN_WIDTH
-                        ? getSizeDimension(SIZE_MINI)
-                        : getSizeDimension(SIZE_NORMAL);
-            case SIZE_MINI:
-                return res.getDimensionPixelSize(R.dimen.design_fab_size_mini);
-            case SIZE_NORMAL:
-            default:
-                return res.getDimensionPixelSize(R.dimen.design_fab_size_normal);
-        }
-    }
-
-    @Override
-    protected void onAttachedToWindow() {
-        super.onAttachedToWindow();
-        getImpl().onAttachedToWindow();
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        getImpl().onDetachedFromWindow();
-    }
-
-    @Override
-    protected void drawableStateChanged() {
-        super.drawableStateChanged();
-        getImpl().onDrawableStateChanged(getDrawableState());
-    }
-
-    @Override
-    public void jumpDrawablesToCurrentState() {
-        super.jumpDrawablesToCurrentState();
-        getImpl().jumpDrawableToCurrentState();
-    }
-
-    /**
-     * Return in {@code rect} the bounds of the actual floating action button content in view-local
-     * coordinates. This is defined as anything within any visible shadow.
-     *
-     * @return true if this view actually has been laid out and has a content rect, else false.
-     */
-    public boolean getContentRect(@NonNull Rect rect) {
-        if (ViewCompat.isLaidOut(this)) {
-            rect.set(0, 0, getWidth(), getHeight());
-            rect.left += mShadowPadding.left;
-            rect.top += mShadowPadding.top;
-            rect.right -= mShadowPadding.right;
-            rect.bottom -= mShadowPadding.bottom;
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Returns the FloatingActionButton's background, minus any compatible shadow implementation.
-     */
-    @NonNull
-    public Drawable getContentBackground() {
-        return getImpl().getContentBackground();
-    }
-
-    private static int resolveAdjustedSize(int desiredSize, int measureSpec) {
-        int result = desiredSize;
-        int specMode = MeasureSpec.getMode(measureSpec);
-        int specSize = MeasureSpec.getSize(measureSpec);
-        switch (specMode) {
-            case MeasureSpec.UNSPECIFIED:
-                // Parent says we can be as big as we want. Just don't be larger
-                // than max size imposed on ourselves.
-                result = desiredSize;
-                break;
-            case MeasureSpec.AT_MOST:
-                // Parent says we can be as big as we want, up to specSize.
-                // Don't be larger than specSize, and don't be larger than
-                // the max size imposed on ourselves.
-                result = Math.min(desiredSize, specSize);
-                break;
-            case MeasureSpec.EXACTLY:
-                // No choice. Do what we are told.
-                result = specSize;
-                break;
-        }
-        return result;
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent ev) {
-        switch (ev.getAction()) {
-            case MotionEvent.ACTION_DOWN:
-                // Skipping the gesture if it doesn't start in in the FAB 'content' area
-                if (getContentRect(mTouchArea)
-                        && !mTouchArea.contains((int) ev.getX(), (int) ev.getY())) {
-                    return false;
-                }
-                break;
-        }
-        return super.onTouchEvent(ev);
-    }
-
-    /**
-     * Behavior designed for use with {@link FloatingActionButton} instances. Its main function
-     * is to move {@link FloatingActionButton} views so that any displayed {@link Snackbar}s do
-     * not cover them.
-     */
-    public static class Behavior extends CoordinatorLayout.Behavior<FloatingActionButton> {
-        private static final boolean AUTO_HIDE_DEFAULT = true;
-
-        private Rect mTmpRect;
-        private OnVisibilityChangedListener mInternalAutoHideListener;
-        private boolean mAutoHideEnabled;
-
-        public Behavior() {
-            super();
-            mAutoHideEnabled = AUTO_HIDE_DEFAULT;
-        }
-
-        public Behavior(Context context, AttributeSet attrs) {
-            super(context, attrs);
-            TypedArray a = context.obtainStyledAttributes(attrs,
-                    R.styleable.FloatingActionButton_Behavior_Layout);
-            mAutoHideEnabled = a.getBoolean(
-                    R.styleable.FloatingActionButton_Behavior_Layout_behavior_autoHide,
-                    AUTO_HIDE_DEFAULT);
-            a.recycle();
-        }
-
-        /**
-         * Sets whether the associated FloatingActionButton automatically hides when there is
-         * not enough space to be displayed. This works with {@link AppBarLayout}
-         * and {@link BottomSheetBehavior}.
-         *
-         * @attr ref android.support.design.R.styleable#FloatingActionButton_Behavior_Layout_behavior_autoHide
-         * @param autoHide true to enable automatic hiding
-         */
-        public void setAutoHideEnabled(boolean autoHide) {
-            mAutoHideEnabled = autoHide;
-        }
-
-        /**
-         * Returns whether the associated FloatingActionButton automatically hides when there is
-         * not enough space to be displayed.
-         *
-         * @attr ref android.support.design.R.styleable#FloatingActionButton_Behavior_Layout_behavior_autoHide
-         * @return true if enabled
-         */
-        public boolean isAutoHideEnabled() {
-            return mAutoHideEnabled;
-        }
-
-        @Override
-        public void onAttachedToLayoutParams(@NonNull CoordinatorLayout.LayoutParams lp) {
-            if (lp.dodgeInsetEdges == Gravity.NO_GRAVITY) {
-                // If the developer hasn't set dodgeInsetEdges, lets set it to BOTTOM so that
-                // we dodge any Snackbars
-                lp.dodgeInsetEdges = Gravity.BOTTOM;
-            }
-        }
-
-        @Override
-        public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton child,
-                View dependency) {
-            if (dependency instanceof AppBarLayout) {
-                // If we're depending on an AppBarLayout we will show/hide it automatically
-                // if the FAB is anchored to the AppBarLayout
-                updateFabVisibilityForAppBarLayout(parent, (AppBarLayout) dependency, child);
-            } else if (isBottomSheet(dependency)) {
-                updateFabVisibilityForBottomSheet(dependency, child);
-            }
-            return false;
-        }
-
-        private static boolean isBottomSheet(@NonNull View view) {
-            final ViewGroup.LayoutParams lp = view.getLayoutParams();
-            if (lp instanceof CoordinatorLayout.LayoutParams) {
-                return ((CoordinatorLayout.LayoutParams) lp)
-                        .getBehavior() instanceof BottomSheetBehavior;
-            }
-            return false;
-        }
-
-        @VisibleForTesting
-        void setInternalAutoHideListener(OnVisibilityChangedListener listener) {
-            mInternalAutoHideListener = listener;
-        }
-
-        private boolean shouldUpdateVisibility(View dependency, FloatingActionButton child) {
-            final CoordinatorLayout.LayoutParams lp =
-                    (CoordinatorLayout.LayoutParams) child.getLayoutParams();
-            if (!mAutoHideEnabled) {
-                return false;
-            }
-
-            if (lp.getAnchorId() != dependency.getId()) {
-                // The anchor ID doesn't match the dependency, so we won't automatically
-                // show/hide the FAB
-                return false;
-            }
-
-            //noinspection RedundantIfStatement
-            if (child.getUserSetVisibility() != VISIBLE) {
-                // The view isn't set to be visible so skip changing its visibility
-                return false;
-            }
-
-            return true;
-        }
-
-        private boolean updateFabVisibilityForAppBarLayout(CoordinatorLayout parent,
-                AppBarLayout appBarLayout, FloatingActionButton child) {
-            if (!shouldUpdateVisibility(appBarLayout, child)) {
-                return false;
-            }
-
-            if (mTmpRect == null) {
-                mTmpRect = new Rect();
-            }
-
-            // First, let's get the visible rect of the dependency
-            final Rect rect = mTmpRect;
-            ViewGroupUtils.getDescendantRect(parent, appBarLayout, rect);
-
-            if (rect.bottom <= appBarLayout.getMinimumHeightForVisibleOverlappingContent()) {
-                // If the anchor's bottom is below the seam, we'll animate our FAB out
-                child.hide(mInternalAutoHideListener, false);
-            } else {
-                // Else, we'll animate our FAB back in
-                child.show(mInternalAutoHideListener, false);
-            }
-            return true;
-        }
-
-        private boolean updateFabVisibilityForBottomSheet(View bottomSheet,
-                FloatingActionButton child) {
-            if (!shouldUpdateVisibility(bottomSheet, child)) {
-                return false;
-            }
-            CoordinatorLayout.LayoutParams lp =
-                    (CoordinatorLayout.LayoutParams) child.getLayoutParams();
-            if (bottomSheet.getTop() < child.getHeight() / 2 + lp.topMargin) {
-                child.hide(mInternalAutoHideListener, false);
-            } else {
-                child.show(mInternalAutoHideListener, false);
-            }
-            return true;
-        }
-
-        @Override
-        public boolean onLayoutChild(CoordinatorLayout parent, FloatingActionButton child,
-                int layoutDirection) {
-            // First, let's make sure that the visibility of the FAB is consistent
-            final List<View> dependencies = parent.getDependencies(child);
-            for (int i = 0, count = dependencies.size(); i < count; i++) {
-                final View dependency = dependencies.get(i);
-                if (dependency instanceof AppBarLayout) {
-                    if (updateFabVisibilityForAppBarLayout(
-                            parent, (AppBarLayout) dependency, child)) {
-                        break;
-                    }
-                } else if (isBottomSheet(dependency)) {
-                    if (updateFabVisibilityForBottomSheet(dependency, child)) {
-                        break;
-                    }
-                }
-            }
-            // Now let the CoordinatorLayout lay out the FAB
-            parent.onLayoutChild(child, layoutDirection);
-            // Now offset it if needed
-            offsetIfNeeded(parent, child);
-            return true;
-        }
-
-        @Override
-        public boolean getInsetDodgeRect(@NonNull CoordinatorLayout parent,
-                @NonNull FloatingActionButton child, @NonNull Rect rect) {
-            // Since we offset so that any internal shadow padding isn't shown, we need to make
-            // sure that the shadow isn't used for any dodge inset calculations
-            final Rect shadowPadding = child.mShadowPadding;
-            rect.set(child.getLeft() + shadowPadding.left,
-                    child.getTop() + shadowPadding.top,
-                    child.getRight() - shadowPadding.right,
-                    child.getBottom() - shadowPadding.bottom);
-            return true;
-        }
-
-        /**
-         * Pre-Lollipop we use padding so that the shadow has enough space to be drawn. This method
-         * offsets our layout position so that we're positioned correctly if we're on one of
-         * our parent's edges.
-         */
-        private void offsetIfNeeded(CoordinatorLayout parent, FloatingActionButton fab) {
-            final Rect padding = fab.mShadowPadding;
-
-            if (padding != null && padding.centerX() > 0 && padding.centerY() > 0) {
-                final CoordinatorLayout.LayoutParams lp =
-                        (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
-
-                int offsetTB = 0, offsetLR = 0;
-
-                if (fab.getRight() >= parent.getWidth() - lp.rightMargin) {
-                    // If we're on the right edge, shift it the right
-                    offsetLR = padding.right;
-                } else if (fab.getLeft() <= lp.leftMargin) {
-                    // If we're on the left edge, shift it the left
-                    offsetLR = -padding.left;
-                }
-                if (fab.getBottom() >= parent.getHeight() - lp.bottomMargin) {
-                    // If we're on the bottom edge, shift it down
-                    offsetTB = padding.bottom;
-                } else if (fab.getTop() <= lp.topMargin) {
-                    // If we're on the top edge, shift it up
-                    offsetTB = -padding.top;
-                }
-
-                if (offsetTB != 0) {
-                    ViewCompat.offsetTopAndBottom(fab, offsetTB);
-                }
-                if (offsetLR != 0) {
-                    ViewCompat.offsetLeftAndRight(fab, offsetLR);
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns the backward compatible elevation of the FloatingActionButton.
-     *
-     * @return the backward compatible elevation in pixels.
-     * @attr ref android.support.design.R.styleable#FloatingActionButton_elevation
-     * @see #setCompatElevation(float)
-     */
-    public float getCompatElevation() {
-        return getImpl().getElevation();
-    }
-
-    /**
-     * Updates the backward compatible elevation of the FloatingActionButton.
-     *
-     * @param elevation The backward compatible elevation in pixels.
-     * @attr ref android.support.design.R.styleable#FloatingActionButton_elevation
-     * @see #getCompatElevation()
-     * @see #setUseCompatPadding(boolean)
-     */
-    public void setCompatElevation(float elevation) {
-        getImpl().setElevation(elevation);
-    }
-
-    private FloatingActionButtonImpl getImpl() {
-        if (mImpl == null) {
-            mImpl = createImpl();
-        }
-        return mImpl;
-    }
-
-    private FloatingActionButtonImpl createImpl() {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            return new FloatingActionButtonLollipop(this, new ShadowDelegateImpl());
-        } else {
-            return new FloatingActionButtonImpl(this, new ShadowDelegateImpl());
-        }
-    }
-
-    private class ShadowDelegateImpl implements ShadowViewDelegate {
-        ShadowDelegateImpl() {
-        }
-
-        @Override
-        public float getRadius() {
-            return getSizeDimension() / 2f;
-        }
-
-        @Override
-        public void setShadowPadding(int left, int top, int right, int bottom) {
-            mShadowPadding.set(left, top, right, bottom);
-            setPadding(left + mImagePadding, top + mImagePadding,
-                    right + mImagePadding, bottom + mImagePadding);
-        }
-
-        @Override
-        public void setBackgroundDrawable(Drawable background) {
-            FloatingActionButton.super.setBackgroundDrawable(background);
-        }
-
-        @Override
-        public boolean isCompatPaddingEnabled() {
-            return mCompatPadding;
-        }
-    }
-}
diff --git a/design/src/android/support/design/widget/HeaderBehavior.java b/design/src/android/support/design/widget/HeaderBehavior.java
deleted file mode 100644
index a5d0edf..0000000
--- a/design/src/android/support/design/widget/HeaderBehavior.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.content.Context;
-import android.support.design.widget.CoordinatorLayout.Behavior;
-import android.support.v4.math.MathUtils;
-import android.support.v4.view.ViewCompat;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.VelocityTracker;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.widget.OverScroller;
-
-/**
- * The {@link Behavior} for a view that sits vertically above scrolling a view.
- * See {@link HeaderScrollingViewBehavior}.
- */
-abstract class HeaderBehavior<V extends View> extends ViewOffsetBehavior<V> {
-
-    private static final int INVALID_POINTER = -1;
-
-    private Runnable mFlingRunnable;
-    OverScroller mScroller;
-
-    private boolean mIsBeingDragged;
-    private int mActivePointerId = INVALID_POINTER;
-    private int mLastMotionY;
-    private int mTouchSlop = -1;
-    private VelocityTracker mVelocityTracker;
-
-    public HeaderBehavior() {}
-
-    public HeaderBehavior(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    @Override
-    public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent ev) {
-        if (mTouchSlop < 0) {
-            mTouchSlop = ViewConfiguration.get(parent.getContext()).getScaledTouchSlop();
-        }
-
-        final int action = ev.getAction();
-
-        // Shortcut since we're being dragged
-        if (action == MotionEvent.ACTION_MOVE && mIsBeingDragged) {
-            return true;
-        }
-
-        switch (ev.getActionMasked()) {
-            case MotionEvent.ACTION_DOWN: {
-                mIsBeingDragged = false;
-                final int x = (int) ev.getX();
-                final int y = (int) ev.getY();
-                if (canDragView(child) && parent.isPointInChildBounds(child, x, y)) {
-                    mLastMotionY = y;
-                    mActivePointerId = ev.getPointerId(0);
-                    ensureVelocityTracker();
-                }
-                break;
-            }
-
-            case MotionEvent.ACTION_MOVE: {
-                final int activePointerId = mActivePointerId;
-                if (activePointerId == INVALID_POINTER) {
-                    // If we don't have a valid id, the touch down wasn't on content.
-                    break;
-                }
-                final int pointerIndex = ev.findPointerIndex(activePointerId);
-                if (pointerIndex == -1) {
-                    break;
-                }
-
-                final int y = (int) ev.getY(pointerIndex);
-                final int yDiff = Math.abs(y - mLastMotionY);
-                if (yDiff > mTouchSlop) {
-                    mIsBeingDragged = true;
-                    mLastMotionY = y;
-                }
-                break;
-            }
-
-            case MotionEvent.ACTION_CANCEL:
-            case MotionEvent.ACTION_UP: {
-                mIsBeingDragged = false;
-                mActivePointerId = INVALID_POINTER;
-                if (mVelocityTracker != null) {
-                    mVelocityTracker.recycle();
-                    mVelocityTracker = null;
-                }
-                break;
-            }
-        }
-
-        if (mVelocityTracker != null) {
-            mVelocityTracker.addMovement(ev);
-        }
-
-        return mIsBeingDragged;
-    }
-
-    @Override
-    public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent ev) {
-        if (mTouchSlop < 0) {
-            mTouchSlop = ViewConfiguration.get(parent.getContext()).getScaledTouchSlop();
-        }
-
-        switch (ev.getActionMasked()) {
-            case MotionEvent.ACTION_DOWN: {
-                final int x = (int) ev.getX();
-                final int y = (int) ev.getY();
-
-                if (parent.isPointInChildBounds(child, x, y) && canDragView(child)) {
-                    mLastMotionY = y;
-                    mActivePointerId = ev.getPointerId(0);
-                    ensureVelocityTracker();
-                } else {
-                    return false;
-                }
-                break;
-            }
-
-            case MotionEvent.ACTION_MOVE: {
-                final int activePointerIndex = ev.findPointerIndex(mActivePointerId);
-                if (activePointerIndex == -1) {
-                    return false;
-                }
-
-                final int y = (int) ev.getY(activePointerIndex);
-                int dy = mLastMotionY - y;
-
-                if (!mIsBeingDragged && Math.abs(dy) > mTouchSlop) {
-                    mIsBeingDragged = true;
-                    if (dy > 0) {
-                        dy -= mTouchSlop;
-                    } else {
-                        dy += mTouchSlop;
-                    }
-                }
-
-                if (mIsBeingDragged) {
-                    mLastMotionY = y;
-                    // We're being dragged so scroll the ABL
-                    scroll(parent, child, dy, getMaxDragOffset(child), 0);
-                }
-                break;
-            }
-
-            case MotionEvent.ACTION_UP:
-                if (mVelocityTracker != null) {
-                    mVelocityTracker.addMovement(ev);
-                    mVelocityTracker.computeCurrentVelocity(1000);
-                    float yvel = mVelocityTracker.getYVelocity(mActivePointerId);
-                    fling(parent, child, -getScrollRangeForDragFling(child), 0, yvel);
-                }
-                // $FALLTHROUGH
-            case MotionEvent.ACTION_CANCEL: {
-                mIsBeingDragged = false;
-                mActivePointerId = INVALID_POINTER;
-                if (mVelocityTracker != null) {
-                    mVelocityTracker.recycle();
-                    mVelocityTracker = null;
-                }
-                break;
-            }
-        }
-
-        if (mVelocityTracker != null) {
-            mVelocityTracker.addMovement(ev);
-        }
-
-        return true;
-    }
-
-    int setHeaderTopBottomOffset(CoordinatorLayout parent, V header, int newOffset) {
-        return setHeaderTopBottomOffset(parent, header, newOffset,
-                Integer.MIN_VALUE, Integer.MAX_VALUE);
-    }
-
-    int setHeaderTopBottomOffset(CoordinatorLayout parent, V header, int newOffset,
-            int minOffset, int maxOffset) {
-        final int curOffset = getTopAndBottomOffset();
-        int consumed = 0;
-
-        if (minOffset != 0 && curOffset >= minOffset && curOffset <= maxOffset) {
-            // If we have some scrolling range, and we're currently within the min and max
-            // offsets, calculate a new offset
-            newOffset = MathUtils.clamp(newOffset, minOffset, maxOffset);
-
-            if (curOffset != newOffset) {
-                setTopAndBottomOffset(newOffset);
-                // Update how much dy we have consumed
-                consumed = curOffset - newOffset;
-            }
-        }
-
-        return consumed;
-    }
-
-    int getTopBottomOffsetForScrollingSibling() {
-        return getTopAndBottomOffset();
-    }
-
-    final int scroll(CoordinatorLayout coordinatorLayout, V header,
-            int dy, int minOffset, int maxOffset) {
-        return setHeaderTopBottomOffset(coordinatorLayout, header,
-                getTopBottomOffsetForScrollingSibling() - dy, minOffset, maxOffset);
-    }
-
-    final boolean fling(CoordinatorLayout coordinatorLayout, V layout, int minOffset,
-            int maxOffset, float velocityY) {
-        if (mFlingRunnable != null) {
-            layout.removeCallbacks(mFlingRunnable);
-            mFlingRunnable = null;
-        }
-
-        if (mScroller == null) {
-            mScroller = new OverScroller(layout.getContext());
-        }
-
-        mScroller.fling(
-                0, getTopAndBottomOffset(), // curr
-                0, Math.round(velocityY), // velocity.
-                0, 0, // x
-                minOffset, maxOffset); // y
-
-        if (mScroller.computeScrollOffset()) {
-            mFlingRunnable = new FlingRunnable(coordinatorLayout, layout);
-            ViewCompat.postOnAnimation(layout, mFlingRunnable);
-            return true;
-        } else {
-            onFlingFinished(coordinatorLayout, layout);
-            return false;
-        }
-    }
-
-    /**
-     * Called when a fling has finished, or the fling was initiated but there wasn't enough
-     * velocity to start it.
-     */
-    void onFlingFinished(CoordinatorLayout parent, V layout) {
-        // no-op
-    }
-
-    /**
-     * Return true if the view can be dragged.
-     */
-    boolean canDragView(V view) {
-        return false;
-    }
-
-    /**
-     * Returns the maximum px offset when {@code view} is being dragged.
-     */
-    int getMaxDragOffset(V view) {
-        return -view.getHeight();
-    }
-
-    int getScrollRangeForDragFling(V view) {
-        return view.getHeight();
-    }
-
-    private void ensureVelocityTracker() {
-        if (mVelocityTracker == null) {
-            mVelocityTracker = VelocityTracker.obtain();
-        }
-    }
-
-    private class FlingRunnable implements Runnable {
-        private final CoordinatorLayout mParent;
-        private final V mLayout;
-
-        FlingRunnable(CoordinatorLayout parent, V layout) {
-            mParent = parent;
-            mLayout = layout;
-        }
-
-        @Override
-        public void run() {
-            if (mLayout != null && mScroller != null) {
-                if (mScroller.computeScrollOffset()) {
-                    setHeaderTopBottomOffset(mParent, mLayout, mScroller.getCurrY());
-                    // Post ourselves so that we run on the next animation
-                    ViewCompat.postOnAnimation(mLayout, this);
-                } else {
-                    onFlingFinished(mParent, mLayout);
-                }
-            }
-        }
-    }
-}
diff --git a/design/src/android/support/design/widget/HeaderScrollingViewBehavior.java b/design/src/android/support/design/widget/HeaderScrollingViewBehavior.java
deleted file mode 100644
index 81ddde5..0000000
--- a/design/src/android/support/design/widget/HeaderScrollingViewBehavior.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.support.design.widget.CoordinatorLayout.Behavior;
-import android.support.v4.math.MathUtils;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.WindowInsetsCompat;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-
-import java.util.List;
-
-/**
- * The {@link Behavior} for a scrolling view that is positioned vertically below another view.
- * See {@link HeaderBehavior}.
- */
-abstract class HeaderScrollingViewBehavior extends ViewOffsetBehavior<View> {
-
-    final Rect mTempRect1 = new Rect();
-    final Rect mTempRect2 = new Rect();
-
-    private int mVerticalLayoutGap = 0;
-    private int mOverlayTop;
-
-    public HeaderScrollingViewBehavior() {}
-
-    public HeaderScrollingViewBehavior(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    @Override
-    public boolean onMeasureChild(CoordinatorLayout parent, View child,
-            int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec,
-            int heightUsed) {
-        final int childLpHeight = child.getLayoutParams().height;
-        if (childLpHeight == ViewGroup.LayoutParams.MATCH_PARENT
-                || childLpHeight == ViewGroup.LayoutParams.WRAP_CONTENT) {
-            // If the menu's height is set to match_parent/wrap_content then measure it
-            // with the maximum visible height
-
-            final List<View> dependencies = parent.getDependencies(child);
-            final View header = findFirstDependency(dependencies);
-            if (header != null) {
-                if (ViewCompat.getFitsSystemWindows(header)
-                        && !ViewCompat.getFitsSystemWindows(child)) {
-                    // If the header is fitting system windows then we need to also,
-                    // otherwise we'll get CoL's compatible measuring
-                    ViewCompat.setFitsSystemWindows(child, true);
-
-                    if (ViewCompat.getFitsSystemWindows(child)) {
-                        // If the set succeeded, trigger a new layout and return true
-                        child.requestLayout();
-                        return true;
-                    }
-                }
-
-                int availableHeight = View.MeasureSpec.getSize(parentHeightMeasureSpec);
-                if (availableHeight == 0) {
-                    // If the measure spec doesn't specify a size, use the current height
-                    availableHeight = parent.getHeight();
-                }
-
-                final int height = availableHeight - header.getMeasuredHeight()
-                        + getScrollRange(header);
-                final int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(height,
-                        childLpHeight == ViewGroup.LayoutParams.MATCH_PARENT
-                                ? View.MeasureSpec.EXACTLY
-                                : View.MeasureSpec.AT_MOST);
-
-                // Now measure the scrolling view with the correct height
-                parent.onMeasureChild(child, parentWidthMeasureSpec,
-                        widthUsed, heightMeasureSpec, heightUsed);
-
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    protected void layoutChild(final CoordinatorLayout parent, final View child,
-            final int layoutDirection) {
-        final List<View> dependencies = parent.getDependencies(child);
-        final View header = findFirstDependency(dependencies);
-
-        if (header != null) {
-            final CoordinatorLayout.LayoutParams lp =
-                    (CoordinatorLayout.LayoutParams) child.getLayoutParams();
-            final Rect available = mTempRect1;
-            available.set(parent.getPaddingLeft() + lp.leftMargin,
-                    header.getBottom() + lp.topMargin,
-                    parent.getWidth() - parent.getPaddingRight() - lp.rightMargin,
-                    parent.getHeight() + header.getBottom()
-                            - parent.getPaddingBottom() - lp.bottomMargin);
-
-            final WindowInsetsCompat parentInsets = parent.getLastWindowInsets();
-            if (parentInsets != null && ViewCompat.getFitsSystemWindows(parent)
-                    && !ViewCompat.getFitsSystemWindows(child)) {
-                // If we're set to handle insets but this child isn't, then it has been measured as
-                // if there are no insets. We need to lay it out to match horizontally.
-                // Top and bottom and already handled in the logic above
-                available.left += parentInsets.getSystemWindowInsetLeft();
-                available.right -= parentInsets.getSystemWindowInsetRight();
-            }
-
-            final Rect out = mTempRect2;
-            GravityCompat.apply(resolveGravity(lp.gravity), child.getMeasuredWidth(),
-                    child.getMeasuredHeight(), available, out, layoutDirection);
-
-            final int overlap = getOverlapPixelsForOffset(header);
-
-            child.layout(out.left, out.top - overlap, out.right, out.bottom - overlap);
-            mVerticalLayoutGap = out.top - header.getBottom();
-        } else {
-            // If we don't have a dependency, let super handle it
-            super.layoutChild(parent, child, layoutDirection);
-            mVerticalLayoutGap = 0;
-        }
-    }
-
-    float getOverlapRatioForOffset(final View header) {
-        return 1f;
-    }
-
-    final int getOverlapPixelsForOffset(final View header) {
-        return mOverlayTop == 0 ? 0 : MathUtils.clamp(
-                (int) (getOverlapRatioForOffset(header) * mOverlayTop), 0, mOverlayTop);
-    }
-
-    private static int resolveGravity(int gravity) {
-        return gravity == Gravity.NO_GRAVITY ? GravityCompat.START | Gravity.TOP : gravity;
-    }
-
-    abstract View findFirstDependency(List<View> views);
-
-    int getScrollRange(View v) {
-        return v.getMeasuredHeight();
-    }
-
-    /**
-     * The gap between the top of the scrolling view and the bottom of the header layout in pixels.
-     */
-    final int getVerticalLayoutGap() {
-        return mVerticalLayoutGap;
-    }
-
-    /**
-     * Set the distance that this view should overlap any {@link AppBarLayout}.
-     *
-     * @param overlayTop the distance in px
-     */
-    public final void setOverlayTop(int overlayTop) {
-        mOverlayTop = overlayTop;
-    }
-
-    /**
-     * Returns the distance that this view should overlap any {@link AppBarLayout}.
-     */
-    public final int getOverlayTop() {
-        return mOverlayTop;
-    }
-}
\ No newline at end of file
diff --git a/design/src/android/support/design/widget/NavigationView.java b/design/src/android/support/design/widget/NavigationView.java
deleted file mode 100644
index 8fc8c76..0000000
--- a/design/src/android/support/design/widget/NavigationView.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IdRes;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-import android.support.annotation.StyleRes;
-import android.support.design.R;
-import android.support.design.internal.NavigationMenu;
-import android.support.design.internal.NavigationMenuPresenter;
-import android.support.design.internal.ScrimInsetsFrameLayout;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.view.AbsSavedState;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.WindowInsetsCompat;
-import android.support.v7.content.res.AppCompatResources;
-import android.support.v7.view.SupportMenuInflater;
-import android.support.v7.view.menu.MenuBuilder;
-import android.support.v7.view.menu.MenuItemImpl;
-import android.support.v7.widget.TintTypedArray;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-
-/**
- * Represents a standard navigation menu for application. The menu contents can be populated
- * by a menu resource file.
- * <p>NavigationView is typically placed inside a {@link android.support.v4.widget.DrawerLayout}.
- * </p>
- * <pre>
- * &lt;android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
- *     xmlns:app="http://schemas.android.com/apk/res-auto"
- *     android:id="@+id/drawer_layout"
- *     android:layout_width="match_parent"
- *     android:layout_height="match_parent"
- *     android:fitsSystemWindows="true"&gt;
- *
- *     &lt;!-- Your contents --&gt;
- *
- *     &lt;android.support.design.widget.NavigationView
- *         android:id="@+id/navigation"
- *         android:layout_width="wrap_content"
- *         android:layout_height="match_parent"
- *         android:layout_gravity="start"
- *         app:menu="@menu/my_navigation_items" /&gt;
- * &lt;/android.support.v4.widget.DrawerLayout&gt;
- * </pre>
- */
-public class NavigationView extends ScrimInsetsFrameLayout {
-
-    private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};
-    private static final int[] DISABLED_STATE_SET = {-android.R.attr.state_enabled};
-
-    private static final int PRESENTER_NAVIGATION_VIEW_ID = 1;
-
-    private final NavigationMenu mMenu;
-    private final NavigationMenuPresenter mPresenter = new NavigationMenuPresenter();
-
-    OnNavigationItemSelectedListener mListener;
-    private int mMaxWidth;
-
-    private MenuInflater mMenuInflater;
-
-    public NavigationView(Context context) {
-        this(context, null);
-    }
-
-    public NavigationView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public NavigationView(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-
-        ThemeUtils.checkAppCompatTheme(context);
-
-        // Create the menu
-        mMenu = new NavigationMenu(context);
-
-        // Custom attributes
-        TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs,
-                R.styleable.NavigationView, defStyleAttr,
-                R.style.Widget_Design_NavigationView);
-
-        ViewCompat.setBackground(
-                this, a.getDrawable(R.styleable.NavigationView_android_background));
-        if (a.hasValue(R.styleable.NavigationView_elevation)) {
-            ViewCompat.setElevation(this, a.getDimensionPixelSize(
-                    R.styleable.NavigationView_elevation, 0));
-        }
-        ViewCompat.setFitsSystemWindows(this,
-                a.getBoolean(R.styleable.NavigationView_android_fitsSystemWindows, false));
-
-        mMaxWidth = a.getDimensionPixelSize(R.styleable.NavigationView_android_maxWidth, 0);
-
-        final ColorStateList itemIconTint;
-        if (a.hasValue(R.styleable.NavigationView_itemIconTint)) {
-            itemIconTint = a.getColorStateList(R.styleable.NavigationView_itemIconTint);
-        } else {
-            itemIconTint = createDefaultColorStateList(android.R.attr.textColorSecondary);
-        }
-
-        boolean textAppearanceSet = false;
-        int textAppearance = 0;
-        if (a.hasValue(R.styleable.NavigationView_itemTextAppearance)) {
-            textAppearance = a.getResourceId(R.styleable.NavigationView_itemTextAppearance, 0);
-            textAppearanceSet = true;
-        }
-
-        ColorStateList itemTextColor = null;
-        if (a.hasValue(R.styleable.NavigationView_itemTextColor)) {
-            itemTextColor = a.getColorStateList(R.styleable.NavigationView_itemTextColor);
-        }
-
-        if (!textAppearanceSet && itemTextColor == null) {
-            // If there isn't a text appearance set, we'll use a default text color
-            itemTextColor = createDefaultColorStateList(android.R.attr.textColorPrimary);
-        }
-
-        final Drawable itemBackground = a.getDrawable(R.styleable.NavigationView_itemBackground);
-
-        mMenu.setCallback(new MenuBuilder.Callback() {
-            @Override
-            public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
-                return mListener != null && mListener.onNavigationItemSelected(item);
-            }
-
-            @Override
-            public void onMenuModeChange(MenuBuilder menu) {}
-        });
-        mPresenter.setId(PRESENTER_NAVIGATION_VIEW_ID);
-        mPresenter.initForMenu(context, mMenu);
-        mPresenter.setItemIconTintList(itemIconTint);
-        if (textAppearanceSet) {
-            mPresenter.setItemTextAppearance(textAppearance);
-        }
-        mPresenter.setItemTextColor(itemTextColor);
-        mPresenter.setItemBackground(itemBackground);
-        mMenu.addMenuPresenter(mPresenter);
-        addView((View) mPresenter.getMenuView(this));
-
-        if (a.hasValue(R.styleable.NavigationView_menu)) {
-            inflateMenu(a.getResourceId(R.styleable.NavigationView_menu, 0));
-        }
-
-        if (a.hasValue(R.styleable.NavigationView_headerLayout)) {
-            inflateHeaderView(a.getResourceId(R.styleable.NavigationView_headerLayout, 0));
-        }
-
-        a.recycle();
-    }
-
-    @Override
-    protected Parcelable onSaveInstanceState() {
-        Parcelable superState = super.onSaveInstanceState();
-        SavedState state = new SavedState(superState);
-        state.menuState = new Bundle();
-        mMenu.savePresenterStates(state.menuState);
-        return state;
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Parcelable savedState) {
-        if (!(savedState instanceof SavedState)) {
-            super.onRestoreInstanceState(savedState);
-            return;
-        }
-        SavedState state = (SavedState) savedState;
-        super.onRestoreInstanceState(state.getSuperState());
-        mMenu.restorePresenterStates(state.menuState);
-    }
-
-    /**
-     * Set a listener that will be notified when a menu item is selected.
-     *
-     * @param listener The listener to notify
-     */
-    public void setNavigationItemSelectedListener(
-            @Nullable OnNavigationItemSelectedListener listener) {
-        mListener = listener;
-    }
-
-    @Override
-    protected void onMeasure(int widthSpec, int heightSpec) {
-        switch (MeasureSpec.getMode(widthSpec)) {
-            case MeasureSpec.EXACTLY:
-                // Nothing to do
-                break;
-            case MeasureSpec.AT_MOST:
-                widthSpec = MeasureSpec.makeMeasureSpec(
-                        Math.min(MeasureSpec.getSize(widthSpec), mMaxWidth), MeasureSpec.EXACTLY);
-                break;
-            case MeasureSpec.UNSPECIFIED:
-                widthSpec = MeasureSpec.makeMeasureSpec(mMaxWidth, MeasureSpec.EXACTLY);
-                break;
-        }
-        // Let super sort out the height
-        super.onMeasure(widthSpec, heightSpec);
-    }
-
-    /**
-     * @hide
-     */
-    @RestrictTo(LIBRARY_GROUP)
-    @Override
-    protected void onInsetsChanged(WindowInsetsCompat insets) {
-        mPresenter.dispatchApplyWindowInsets(insets);
-    }
-
-    /**
-     * Inflate a menu resource into this navigation view.
-     *
-     * <p>Existing items in the menu will not be modified or removed.</p>
-     *
-     * @param resId ID of a menu resource to inflate
-     */
-    public void inflateMenu(int resId) {
-        mPresenter.setUpdateSuspended(true);
-        getMenuInflater().inflate(resId, mMenu);
-        mPresenter.setUpdateSuspended(false);
-        mPresenter.updateMenuView(false);
-    }
-
-    /**
-     * Returns the {@link Menu} instance associated with this navigation view.
-     */
-    public Menu getMenu() {
-        return mMenu;
-    }
-
-    /**
-     * Inflates a View and add it as a header of the navigation menu.
-     *
-     * @param res The layout resource ID.
-     * @return a newly inflated View.
-     */
-    public View inflateHeaderView(@LayoutRes int res) {
-        return mPresenter.inflateHeaderView(res);
-    }
-
-    /**
-     * Adds a View as a header of the navigation menu.
-     *
-     * @param view The view to be added as a header of the navigation menu.
-     */
-    public void addHeaderView(@NonNull View view) {
-        mPresenter.addHeaderView(view);
-    }
-
-    /**
-     * Removes a previously-added header view.
-     *
-     * @param view The view to remove
-     */
-    public void removeHeaderView(@NonNull View view) {
-        mPresenter.removeHeaderView(view);
-    }
-
-    /**
-     * Gets the number of headers in this NavigationView.
-     *
-     * @return A positive integer representing the number of headers.
-     */
-    public int getHeaderCount() {
-        return mPresenter.getHeaderCount();
-    }
-
-    /**
-     * Gets the header view at the specified position.
-     *
-     * @param index The position at which to get the view from.
-     * @return The header view the specified position or null if the position does not exist in this
-     * NavigationView.
-     */
-    public View getHeaderView(int index) {
-        return mPresenter.getHeaderView(index);
-    }
-
-    /**
-     * Returns the tint which is applied to our menu items' icons.
-     *
-     * @see #setItemIconTintList(ColorStateList)
-     *
-     * @attr ref R.styleable#NavigationView_itemIconTint
-     */
-    @Nullable
-    public ColorStateList getItemIconTintList() {
-        return mPresenter.getItemTintList();
-    }
-
-    /**
-     * Set the tint which is applied to our menu items' icons.
-     *
-     * @param tint the tint to apply.
-     *
-     * @attr ref R.styleable#NavigationView_itemIconTint
-     */
-    public void setItemIconTintList(@Nullable ColorStateList tint) {
-        mPresenter.setItemIconTintList(tint);
-    }
-
-    /**
-     * Returns the tint which is applied to our menu items' icons.
-     *
-     * @see #setItemTextColor(ColorStateList)
-     *
-     * @attr ref R.styleable#NavigationView_itemTextColor
-     */
-    @Nullable
-    public ColorStateList getItemTextColor() {
-        return mPresenter.getItemTextColor();
-    }
-
-    /**
-     * Set the text color to be used on our menu items.
-     *
-     * @see #getItemTextColor()
-     *
-     * @attr ref R.styleable#NavigationView_itemTextColor
-     */
-    public void setItemTextColor(@Nullable ColorStateList textColor) {
-        mPresenter.setItemTextColor(textColor);
-    }
-
-    /**
-     * Returns the background drawable for our menu items.
-     *
-     * @see #setItemBackgroundResource(int)
-     *
-     * @attr ref R.styleable#NavigationView_itemBackground
-     */
-    @Nullable
-    public Drawable getItemBackground() {
-        return mPresenter.getItemBackground();
-    }
-
-    /**
-     * Set the background of our menu items to the given resource.
-     *
-     * @param resId The identifier of the resource.
-     *
-     * @attr ref R.styleable#NavigationView_itemBackground
-     */
-    public void setItemBackgroundResource(@DrawableRes int resId) {
-        setItemBackground(ContextCompat.getDrawable(getContext(), resId));
-    }
-
-    /**
-     * Set the background of our menu items to a given resource. The resource should refer to
-     * a Drawable object or null to use the default background set on this navigation menu.
-     *
-     * @attr ref R.styleable#NavigationView_itemBackground
-     */
-    public void setItemBackground(@Nullable Drawable itemBackground) {
-        mPresenter.setItemBackground(itemBackground);
-    }
-
-    /**
-     * Sets the currently checked item in this navigation menu.
-     *
-     * @param id The item ID of the currently checked item.
-     */
-    public void setCheckedItem(@IdRes int id) {
-        MenuItem item = mMenu.findItem(id);
-        if (item != null) {
-            mPresenter.setCheckedItem((MenuItemImpl) item);
-        }
-    }
-
-    /**
-     * Set the text appearance of the menu items to a given resource.
-     *
-     * @attr ref R.styleable#NavigationView_itemTextAppearance
-     */
-    public void setItemTextAppearance(@StyleRes int resId) {
-        mPresenter.setItemTextAppearance(resId);
-    }
-
-    private MenuInflater getMenuInflater() {
-        if (mMenuInflater == null) {
-            mMenuInflater = new SupportMenuInflater(getContext());
-        }
-        return mMenuInflater;
-    }
-
-    private ColorStateList createDefaultColorStateList(int baseColorThemeAttr) {
-        final TypedValue value = new TypedValue();
-        if (!getContext().getTheme().resolveAttribute(baseColorThemeAttr, value, true)) {
-            return null;
-        }
-        ColorStateList baseColor = AppCompatResources.getColorStateList(
-                getContext(), value.resourceId);
-        if (!getContext().getTheme().resolveAttribute(
-                    android.support.v7.appcompat.R.attr.colorPrimary, value, true)) {
-            return null;
-        }
-        int colorPrimary = value.data;
-        int defaultColor = baseColor.getDefaultColor();
-        return new ColorStateList(new int[][]{
-                DISABLED_STATE_SET,
-                CHECKED_STATE_SET,
-                EMPTY_STATE_SET
-        }, new int[]{
-                baseColor.getColorForState(DISABLED_STATE_SET, defaultColor),
-                colorPrimary,
-                defaultColor
-        });
-    }
-
-    /**
-     * Listener for handling events on navigation items.
-     */
-    public interface OnNavigationItemSelectedListener {
-
-        /**
-         * Called when an item in the navigation menu is selected.
-         *
-         * @param item The selected item
-         *
-         * @return true to display the item as the selected item
-         */
-        public boolean onNavigationItemSelected(@NonNull MenuItem item);
-    }
-
-    /**
-     * User interface state that is stored by NavigationView for implementing
-     * onSaveInstanceState().
-     */
-    public static class SavedState extends AbsSavedState {
-        public Bundle menuState;
-
-        public SavedState(Parcel in, ClassLoader loader) {
-            super(in, loader);
-            menuState = in.readBundle(loader);
-        }
-
-        public SavedState(Parcelable superState) {
-            super(superState);
-        }
-
-        @Override
-        public void writeToParcel(@NonNull Parcel dest, int flags) {
-            super.writeToParcel(dest, flags);
-            dest.writeBundle(menuState);
-        }
-
-        public static final Creator<SavedState> CREATOR = new ClassLoaderCreator<SavedState>() {
-            @Override
-            public SavedState createFromParcel(Parcel in, ClassLoader loader) {
-                return new SavedState(in, loader);
-            }
-
-            @Override
-            public SavedState createFromParcel(Parcel in) {
-                return new SavedState(in, null);
-            }
-
-            @Override
-            public SavedState[] newArray(int size) {
-                return new SavedState[size];
-            }
-        };
-    }
-
-}
diff --git a/design/src/android/support/design/widget/Snackbar.java b/design/src/android/support/design/widget/Snackbar.java
deleted file mode 100644
index bd5ffba..0000000
--- a/design/src/android/support/design/widget/Snackbar.java
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.support.annotation.ColorInt;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-import android.support.annotation.StringRes;
-import android.support.design.R;
-import android.support.design.internal.SnackbarContentLayout;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.widget.FrameLayout;
-import android.widget.TextView;
-
-/**
- * Snackbars provide lightweight feedback about an operation. They show a brief message at the
- * bottom of the screen on mobile and lower left on larger devices. Snackbars appear above all other
- * elements on screen and only one can be displayed at a time.
- * <p>
- * They automatically disappear after a timeout or after user interaction elsewhere on the screen,
- * particularly after interactions that summon a new surface or activity. Snackbars can be swiped
- * off screen.
- * <p>
- * Snackbars can contain an action which is set via
- * {@link #setAction(CharSequence, android.view.View.OnClickListener)}.
- * <p>
- * To be notified when a snackbar has been shown or dismissed, you can provide a {@link Callback}
- * via {@link BaseTransientBottomBar#addCallback(BaseCallback)}.</p>
- */
-public final class Snackbar extends BaseTransientBottomBar<Snackbar> {
-
-    /**
-     * Show the Snackbar indefinitely. This means that the Snackbar will be displayed from the time
-     * that is {@link #show() shown} until either it is dismissed, or another Snackbar is shown.
-     *
-     * @see #setDuration
-     */
-    public static final int LENGTH_INDEFINITE = BaseTransientBottomBar.LENGTH_INDEFINITE;
-
-    /**
-     * Show the Snackbar for a short period of time.
-     *
-     * @see #setDuration
-     */
-    public static final int LENGTH_SHORT = BaseTransientBottomBar.LENGTH_SHORT;
-
-    /**
-     * Show the Snackbar for a long period of time.
-     *
-     * @see #setDuration
-     */
-    public static final int LENGTH_LONG = BaseTransientBottomBar.LENGTH_LONG;
-
-    /**
-     * Callback class for {@link Snackbar} instances.
-     *
-     * Note: this class is here to provide backwards-compatible way for apps written before
-     * the existence of the base {@link BaseTransientBottomBar} class.
-     *
-     * @see BaseTransientBottomBar#addCallback(BaseCallback)
-     */
-    public static class Callback extends BaseCallback<Snackbar> {
-        /** Indicates that the Snackbar was dismissed via a swipe.*/
-        public static final int DISMISS_EVENT_SWIPE = BaseCallback.DISMISS_EVENT_SWIPE;
-        /** Indicates that the Snackbar was dismissed via an action click.*/
-        public static final int DISMISS_EVENT_ACTION = BaseCallback.DISMISS_EVENT_ACTION;
-        /** Indicates that the Snackbar was dismissed via a timeout.*/
-        public static final int DISMISS_EVENT_TIMEOUT = BaseCallback.DISMISS_EVENT_TIMEOUT;
-        /** Indicates that the Snackbar was dismissed via a call to {@link #dismiss()}.*/
-        public static final int DISMISS_EVENT_MANUAL = BaseCallback.DISMISS_EVENT_MANUAL;
-        /** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/
-        public static final int DISMISS_EVENT_CONSECUTIVE = BaseCallback.DISMISS_EVENT_CONSECUTIVE;
-
-        @Override
-        public void onShown(Snackbar sb) {
-            // Stub implementation to make API check happy.
-        }
-
-        @Override
-        public void onDismissed(Snackbar transientBottomBar, @DismissEvent int event) {
-            // Stub implementation to make API check happy.
-        }
-    }
-
-    @Nullable private BaseCallback<Snackbar> mCallback;
-
-    private Snackbar(ViewGroup parent, View content, ContentViewCallback contentViewCallback) {
-        super(parent, content, contentViewCallback);
-    }
-
-    /**
-     * Make a Snackbar to display a message
-     *
-     * <p>Snackbar will try and find a parent view to hold Snackbar's view from the value given
-     * to {@code view}. Snackbar will walk up the view tree trying to find a suitable parent,
-     * which is defined as a {@link CoordinatorLayout} or the window decor's content view,
-     * whichever comes first.
-     *
-     * <p>Having a {@link CoordinatorLayout} in your view hierarchy allows Snackbar to enable
-     * certain features, such as swipe-to-dismiss and automatically moving of widgets like
-     * {@link FloatingActionButton}.
-     *
-     * @param view     The view to find a parent from.
-     * @param text     The text to show.  Can be formatted text.
-     * @param duration How long to display the message.  Either {@link #LENGTH_SHORT} or {@link
-     *                 #LENGTH_LONG}
-     */
-    @NonNull
-    public static Snackbar make(@NonNull View view, @NonNull CharSequence text,
-            @Duration int duration) {
-        final ViewGroup parent = findSuitableParent(view);
-        if (parent == null) {
-            throw new IllegalArgumentException("No suitable parent found from the given view. "
-                    + "Please provide a valid view.");
-        }
-
-        final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
-        final SnackbarContentLayout content =
-                (SnackbarContentLayout) inflater.inflate(
-                        R.layout.design_layout_snackbar_include, parent, false);
-        final Snackbar snackbar = new Snackbar(parent, content, content);
-        snackbar.setText(text);
-        snackbar.setDuration(duration);
-        return snackbar;
-    }
-
-    /**
-     * Make a Snackbar to display a message.
-     *
-     * <p>Snackbar will try and find a parent view to hold Snackbar's view from the value given
-     * to {@code view}. Snackbar will walk up the view tree trying to find a suitable parent,
-     * which is defined as a {@link CoordinatorLayout} or the window decor's content view,
-     * whichever comes first.
-     *
-     * <p>Having a {@link CoordinatorLayout} in your view hierarchy allows Snackbar to enable
-     * certain features, such as swipe-to-dismiss and automatically moving of widgets like
-     * {@link FloatingActionButton}.
-     *
-     * @param view     The view to find a parent from.
-     * @param resId    The resource id of the string resource to use. Can be formatted text.
-     * @param duration How long to display the message.  Either {@link #LENGTH_SHORT} or {@link
-     *                 #LENGTH_LONG}
-     */
-    @NonNull
-    public static Snackbar make(@NonNull View view, @StringRes int resId, @Duration int duration) {
-        return make(view, view.getResources().getText(resId), duration);
-    }
-
-    private static ViewGroup findSuitableParent(View view) {
-        ViewGroup fallback = null;
-        do {
-            if (view instanceof CoordinatorLayout) {
-                // We've found a CoordinatorLayout, use it
-                return (ViewGroup) view;
-            } else if (view instanceof FrameLayout) {
-                if (view.getId() == android.R.id.content) {
-                    // If we've hit the decor content view, then we didn't find a CoL in the
-                    // hierarchy, so use it.
-                    return (ViewGroup) view;
-                } else {
-                    // It's not the content view but we'll use it as our fallback
-                    fallback = (ViewGroup) view;
-                }
-            }
-
-            if (view != null) {
-                // Else, we will loop and crawl up the view hierarchy and try to find a parent
-                final ViewParent parent = view.getParent();
-                view = parent instanceof View ? (View) parent : null;
-            }
-        } while (view != null);
-
-        // If we reach here then we didn't find a CoL or a suitable content view so we'll fallback
-        return fallback;
-    }
-
-    /**
-     * Update the text in this {@link Snackbar}.
-     *
-     * @param message The new text for this {@link BaseTransientBottomBar}.
-     */
-    @NonNull
-    public Snackbar setText(@NonNull CharSequence message) {
-        final SnackbarContentLayout contentLayout = (SnackbarContentLayout) mView.getChildAt(0);
-        final TextView tv = contentLayout.getMessageView();
-        tv.setText(message);
-        return this;
-    }
-
-    /**
-     * Update the text in this {@link Snackbar}.
-     *
-     * @param resId The new text for this {@link BaseTransientBottomBar}.
-     */
-    @NonNull
-    public Snackbar setText(@StringRes int resId) {
-        return setText(getContext().getText(resId));
-    }
-
-    /**
-     * Set the action to be displayed in this {@link BaseTransientBottomBar}.
-     *
-     * @param resId    String resource to display for the action
-     * @param listener callback to be invoked when the action is clicked
-     */
-    @NonNull
-    public Snackbar setAction(@StringRes int resId, View.OnClickListener listener) {
-        return setAction(getContext().getText(resId), listener);
-    }
-
-    /**
-     * Set the action to be displayed in this {@link BaseTransientBottomBar}.
-     *
-     * @param text     Text to display for the action
-     * @param listener callback to be invoked when the action is clicked
-     */
-    @NonNull
-    public Snackbar setAction(CharSequence text, final View.OnClickListener listener) {
-        final SnackbarContentLayout contentLayout = (SnackbarContentLayout) mView.getChildAt(0);
-        final TextView tv = contentLayout.getActionView();
-
-        if (TextUtils.isEmpty(text) || listener == null) {
-            tv.setVisibility(View.GONE);
-            tv.setOnClickListener(null);
-        } else {
-            tv.setVisibility(View.VISIBLE);
-            tv.setText(text);
-            tv.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View view) {
-                    listener.onClick(view);
-                    // Now dismiss the Snackbar
-                    dispatchDismiss(BaseCallback.DISMISS_EVENT_ACTION);
-                }
-            });
-        }
-        return this;
-    }
-
-    /**
-     * Sets the text color of the action specified in
-     * {@link #setAction(CharSequence, View.OnClickListener)}.
-     */
-    @NonNull
-    public Snackbar setActionTextColor(ColorStateList colors) {
-        final SnackbarContentLayout contentLayout = (SnackbarContentLayout) mView.getChildAt(0);
-        final TextView tv = contentLayout.getActionView();
-        tv.setTextColor(colors);
-        return this;
-    }
-
-    /**
-     * Sets the text color of the action specified in
-     * {@link #setAction(CharSequence, View.OnClickListener)}.
-     */
-    @NonNull
-    public Snackbar setActionTextColor(@ColorInt int color) {
-        final SnackbarContentLayout contentLayout = (SnackbarContentLayout) mView.getChildAt(0);
-        final TextView tv = contentLayout.getActionView();
-        tv.setTextColor(color);
-        return this;
-    }
-
-    /**
-     * Set a callback to be called when this the visibility of this {@link Snackbar}
-     * changes. Note that this method is deprecated
-     * and you should use {@link #addCallback(BaseCallback)} to add a callback and
-     * {@link #removeCallback(BaseCallback)} to remove a registered callback.
-     *
-     * @param callback Callback to notify when transient bottom bar events occur.
-     * @deprecated Use {@link #addCallback(BaseCallback)}
-     * @see Callback
-     * @see #addCallback(BaseCallback)
-     * @see #removeCallback(BaseCallback)
-     */
-    @Deprecated
-    @NonNull
-    public Snackbar setCallback(Callback callback) {
-        // The logic in this method emulates what we had before support for multiple
-        // registered callbacks.
-        if (mCallback != null) {
-            removeCallback(mCallback);
-        }
-        if (callback != null) {
-            addCallback(callback);
-        }
-        // Update the deprecated field so that we can remove the passed callback the next
-        // time we're called
-        mCallback = callback;
-        return this;
-    }
-
-    /**
-     * @hide
-     *
-     * Note: this class is here to provide backwards-compatible way for apps written before
-     * the existence of the base {@link BaseTransientBottomBar} class.
-     */
-    @RestrictTo(LIBRARY_GROUP)
-    public static final class SnackbarLayout extends BaseTransientBottomBar.SnackbarBaseLayout {
-        public SnackbarLayout(Context context) {
-            super(context);
-        }
-
-        public SnackbarLayout(Context context, AttributeSet attrs) {
-            super(context, attrs);
-        }
-
-        @Override
-        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-            // Work around our backwards-compatible refactoring of Snackbar and inner content
-            // being inflated against snackbar's parent (instead of against the snackbar itself).
-            // Every child that is width=MATCH_PARENT is remeasured again and given the full width
-            // minus the paddings.
-            int childCount = getChildCount();
-            int availableWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
-            for (int i = 0; i < childCount; i++) {
-                View child = getChildAt(i);
-                if (child.getLayoutParams().width == ViewGroup.LayoutParams.MATCH_PARENT) {
-                    child.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.EXACTLY),
-                            MeasureSpec.makeMeasureSpec(child.getMeasuredHeight(),
-                                    MeasureSpec.EXACTLY));
-                }
-            }
-        }
-    }
-}
-
diff --git a/design/src/android/support/design/widget/SnackbarManager.java b/design/src/android/support/design/widget/SnackbarManager.java
deleted file mode 100644
index 43892d3..0000000
--- a/design/src/android/support/design/widget/SnackbarManager.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-
-import java.lang.ref.WeakReference;
-
-/**
- * Manages {@link Snackbar}s.
- */
-class SnackbarManager {
-
-    static final int MSG_TIMEOUT = 0;
-
-    private static final int SHORT_DURATION_MS = 1500;
-    private static final int LONG_DURATION_MS = 2750;
-
-    private static SnackbarManager sSnackbarManager;
-
-    static SnackbarManager getInstance() {
-        if (sSnackbarManager == null) {
-            sSnackbarManager = new SnackbarManager();
-        }
-        return sSnackbarManager;
-    }
-
-    private final Object mLock;
-    private final Handler mHandler;
-
-    private SnackbarRecord mCurrentSnackbar;
-    private SnackbarRecord mNextSnackbar;
-
-    private SnackbarManager() {
-        mLock = new Object();
-        mHandler = new Handler(Looper.getMainLooper(), new Handler.Callback() {
-            @Override
-            public boolean handleMessage(Message message) {
-                switch (message.what) {
-                    case MSG_TIMEOUT:
-                        handleTimeout((SnackbarRecord) message.obj);
-                        return true;
-                }
-                return false;
-            }
-        });
-    }
-
-    interface Callback {
-        void show();
-        void dismiss(int event);
-    }
-
-    public void show(int duration, Callback callback) {
-        synchronized (mLock) {
-            if (isCurrentSnackbarLocked(callback)) {
-                // Means that the callback is already in the queue. We'll just update the duration
-                mCurrentSnackbar.duration = duration;
-
-                // If this is the Snackbar currently being shown, call re-schedule it's
-                // timeout
-                mHandler.removeCallbacksAndMessages(mCurrentSnackbar);
-                scheduleTimeoutLocked(mCurrentSnackbar);
-                return;
-            } else if (isNextSnackbarLocked(callback)) {
-                // We'll just update the duration
-                mNextSnackbar.duration = duration;
-            } else {
-                // Else, we need to create a new record and queue it
-                mNextSnackbar = new SnackbarRecord(duration, callback);
-            }
-
-            if (mCurrentSnackbar != null && cancelSnackbarLocked(mCurrentSnackbar,
-                    Snackbar.Callback.DISMISS_EVENT_CONSECUTIVE)) {
-                // If we currently have a Snackbar, try and cancel it and wait in line
-                return;
-            } else {
-                // Clear out the current snackbar
-                mCurrentSnackbar = null;
-                // Otherwise, just show it now
-                showNextSnackbarLocked();
-            }
-        }
-    }
-
-    public void dismiss(Callback callback, int event) {
-        synchronized (mLock) {
-            if (isCurrentSnackbarLocked(callback)) {
-                cancelSnackbarLocked(mCurrentSnackbar, event);
-            } else if (isNextSnackbarLocked(callback)) {
-                cancelSnackbarLocked(mNextSnackbar, event);
-            }
-        }
-    }
-
-    /**
-     * Should be called when a Snackbar is no longer displayed. This is after any exit
-     * animation has finished.
-     */
-    public void onDismissed(Callback callback) {
-        synchronized (mLock) {
-            if (isCurrentSnackbarLocked(callback)) {
-                // If the callback is from a Snackbar currently show, remove it and show a new one
-                mCurrentSnackbar = null;
-                if (mNextSnackbar != null) {
-                    showNextSnackbarLocked();
-                }
-            }
-        }
-    }
-
-    /**
-     * Should be called when a Snackbar is being shown. This is after any entrance animation has
-     * finished.
-     */
-    public void onShown(Callback callback) {
-        synchronized (mLock) {
-            if (isCurrentSnackbarLocked(callback)) {
-                scheduleTimeoutLocked(mCurrentSnackbar);
-            }
-        }
-    }
-
-    public void pauseTimeout(Callback callback) {
-        synchronized (mLock) {
-            if (isCurrentSnackbarLocked(callback) && !mCurrentSnackbar.paused) {
-                mCurrentSnackbar.paused = true;
-                mHandler.removeCallbacksAndMessages(mCurrentSnackbar);
-            }
-        }
-    }
-
-    public void restoreTimeoutIfPaused(Callback callback) {
-        synchronized (mLock) {
-            if (isCurrentSnackbarLocked(callback) && mCurrentSnackbar.paused) {
-                mCurrentSnackbar.paused = false;
-                scheduleTimeoutLocked(mCurrentSnackbar);
-            }
-        }
-    }
-
-    public boolean isCurrent(Callback callback) {
-        synchronized (mLock) {
-            return isCurrentSnackbarLocked(callback);
-        }
-    }
-
-    public boolean isCurrentOrNext(Callback callback) {
-        synchronized (mLock) {
-            return isCurrentSnackbarLocked(callback) || isNextSnackbarLocked(callback);
-        }
-    }
-
-    private static class SnackbarRecord {
-        final WeakReference<Callback> callback;
-        int duration;
-        boolean paused;
-
-        SnackbarRecord(int duration, Callback callback) {
-            this.callback = new WeakReference<>(callback);
-            this.duration = duration;
-        }
-
-        boolean isSnackbar(Callback callback) {
-            return callback != null && this.callback.get() == callback;
-        }
-    }
-
-    private void showNextSnackbarLocked() {
-        if (mNextSnackbar != null) {
-            mCurrentSnackbar = mNextSnackbar;
-            mNextSnackbar = null;
-
-            final Callback callback = mCurrentSnackbar.callback.get();
-            if (callback != null) {
-                callback.show();
-            } else {
-                // The callback doesn't exist any more, clear out the Snackbar
-                mCurrentSnackbar = null;
-            }
-        }
-    }
-
-    private boolean cancelSnackbarLocked(SnackbarRecord record, int event) {
-        final Callback callback = record.callback.get();
-        if (callback != null) {
-            // Make sure we remove any timeouts for the SnackbarRecord
-            mHandler.removeCallbacksAndMessages(record);
-            callback.dismiss(event);
-            return true;
-        }
-        return false;
-    }
-
-    private boolean isCurrentSnackbarLocked(Callback callback) {
-        return mCurrentSnackbar != null && mCurrentSnackbar.isSnackbar(callback);
-    }
-
-    private boolean isNextSnackbarLocked(Callback callback) {
-        return mNextSnackbar != null && mNextSnackbar.isSnackbar(callback);
-    }
-
-    private void scheduleTimeoutLocked(SnackbarRecord r) {
-        if (r.duration == Snackbar.LENGTH_INDEFINITE) {
-            // If we're set to indefinite, we don't want to set a timeout
-            return;
-        }
-
-        int durationMs = LONG_DURATION_MS;
-        if (r.duration > 0) {
-            durationMs = r.duration;
-        } else if (r.duration == Snackbar.LENGTH_SHORT) {
-            durationMs = SHORT_DURATION_MS;
-        }
-        mHandler.removeCallbacksAndMessages(r);
-        mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_TIMEOUT, r), durationMs);
-    }
-
-    void handleTimeout(SnackbarRecord record) {
-        synchronized (mLock) {
-            if (mCurrentSnackbar == record || mNextSnackbar == record) {
-                cancelSnackbarLocked(record, Snackbar.Callback.DISMISS_EVENT_TIMEOUT);
-            }
-        }
-    }
-
-}
diff --git a/design/src/android/support/design/widget/SwipeDismissBehavior.java b/design/src/android/support/design/widget/SwipeDismissBehavior.java
deleted file mode 100644
index d857334..0000000
--- a/design/src/android/support/design/widget/SwipeDismissBehavior.java
+++ /dev/null
@@ -1,411 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.support.annotation.IntDef;
-import android.support.annotation.NonNull;
-import android.support.annotation.RestrictTo;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.widget.ViewDragHelper;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * An interaction behavior plugin for child views of {@link CoordinatorLayout} to provide support
- * for the 'swipe-to-dismiss' gesture.
- */
-public class SwipeDismissBehavior<V extends View> extends CoordinatorLayout.Behavior<V> {
-
-    /**
-     * A view is not currently being dragged or animating as a result of a fling/snap.
-     */
-    public static final int STATE_IDLE = ViewDragHelper.STATE_IDLE;
-
-    /**
-     * A view is currently being dragged. The position is currently changing as a result
-     * of user input or simulated user input.
-     */
-    public static final int STATE_DRAGGING = ViewDragHelper.STATE_DRAGGING;
-
-    /**
-     * A view is currently settling into place as a result of a fling or
-     * predefined non-interactive motion.
-     */
-    public static final int STATE_SETTLING = ViewDragHelper.STATE_SETTLING;
-
-    /** @hide */
-    @RestrictTo(LIBRARY_GROUP)
-    @IntDef({SWIPE_DIRECTION_START_TO_END, SWIPE_DIRECTION_END_TO_START, SWIPE_DIRECTION_ANY})
-    @Retention(RetentionPolicy.SOURCE)
-    private @interface SwipeDirection {}
-
-    /**
-     * Swipe direction that only allows swiping in the direction of start-to-end. That is
-     * left-to-right in LTR, or right-to-left in RTL.
-     */
-    public static final int SWIPE_DIRECTION_START_TO_END = 0;
-
-    /**
-     * Swipe direction that only allows swiping in the direction of end-to-start. That is
-     * right-to-left in LTR or left-to-right in RTL.
-     */
-    public static final int SWIPE_DIRECTION_END_TO_START = 1;
-
-    /**
-     * Swipe direction which allows swiping in either direction.
-     */
-    public static final int SWIPE_DIRECTION_ANY = 2;
-
-    private static final float DEFAULT_DRAG_DISMISS_THRESHOLD = 0.5f;
-    private static final float DEFAULT_ALPHA_START_DISTANCE = 0f;
-    private static final float DEFAULT_ALPHA_END_DISTANCE = DEFAULT_DRAG_DISMISS_THRESHOLD;
-
-    ViewDragHelper mViewDragHelper;
-    OnDismissListener mListener;
-    private boolean mInterceptingEvents;
-
-    private float mSensitivity = 0f;
-    private boolean mSensitivitySet;
-
-    int mSwipeDirection = SWIPE_DIRECTION_ANY;
-    float mDragDismissThreshold = DEFAULT_DRAG_DISMISS_THRESHOLD;
-    float mAlphaStartSwipeDistance = DEFAULT_ALPHA_START_DISTANCE;
-    float mAlphaEndSwipeDistance = DEFAULT_ALPHA_END_DISTANCE;
-
-    /**
-     * Callback interface used to notify the application that the view has been dismissed.
-     */
-    public interface OnDismissListener {
-        /**
-         * Called when {@code view} has been dismissed via swiping.
-         */
-        public void onDismiss(View view);
-
-        /**
-         * Called when the drag state has changed.
-         *
-         * @param state the new state. One of
-         * {@link #STATE_IDLE}, {@link #STATE_DRAGGING} or {@link #STATE_SETTLING}.
-         */
-        public void onDragStateChanged(int state);
-    }
-
-    /**
-     * Set the listener to be used when a dismiss event occurs.
-     *
-     * @param listener the listener to use.
-     */
-    public void setListener(OnDismissListener listener) {
-        mListener = listener;
-    }
-
-    /**
-     * Sets the swipe direction for this behavior.
-     *
-     * @param direction one of the {@link #SWIPE_DIRECTION_START_TO_END},
-     *                  {@link #SWIPE_DIRECTION_END_TO_START} or {@link #SWIPE_DIRECTION_ANY}
-     */
-    public void setSwipeDirection(@SwipeDirection int direction) {
-        mSwipeDirection = direction;
-    }
-
-    /**
-     * Set the threshold for telling if a view has been dragged enough to be dismissed.
-     *
-     * @param distance a ratio of a view's width, values are clamped to 0 >= x <= 1f;
-     */
-    public void setDragDismissDistance(float distance) {
-        mDragDismissThreshold = clamp(0f, distance, 1f);
-    }
-
-    /**
-     * The minimum swipe distance before the view's alpha is modified.
-     *
-     * @param fraction the distance as a fraction of the view's width.
-     */
-    public void setStartAlphaSwipeDistance(float fraction) {
-        mAlphaStartSwipeDistance = clamp(0f, fraction, 1f);
-    }
-
-    /**
-     * The maximum swipe distance for the view's alpha is modified.
-     *
-     * @param fraction the distance as a fraction of the view's width.
-     */
-    public void setEndAlphaSwipeDistance(float fraction) {
-        mAlphaEndSwipeDistance = clamp(0f, fraction, 1f);
-    }
-
-    /**
-     * Set the sensitivity used for detecting the start of a swipe. This only takes effect if
-     * no touch handling has occured yet.
-     *
-     * @param sensitivity Multiplier for how sensitive we should be about detecting
-     *                    the start of a drag. Larger values are more sensitive. 1.0f is normal.
-     */
-    public void setSensitivity(float sensitivity) {
-        mSensitivity = sensitivity;
-        mSensitivitySet = true;
-    }
-
-    @Override
-    public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
-        boolean dispatchEventToHelper = mInterceptingEvents;
-
-        switch (event.getActionMasked()) {
-            case MotionEvent.ACTION_DOWN:
-                mInterceptingEvents = parent.isPointInChildBounds(child,
-                        (int) event.getX(), (int) event.getY());
-                dispatchEventToHelper = mInterceptingEvents;
-                break;
-            case MotionEvent.ACTION_UP:
-            case MotionEvent.ACTION_CANCEL:
-                // Reset the ignore flag for next time
-                mInterceptingEvents = false;
-                break;
-        }
-
-        if (dispatchEventToHelper) {
-            ensureViewDragHelper(parent);
-            return mViewDragHelper.shouldInterceptTouchEvent(event);
-        }
-        return false;
-    }
-
-    @Override
-    public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
-        if (mViewDragHelper != null) {
-            mViewDragHelper.processTouchEvent(event);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Called when the user's input indicates that they want to swipe the given view.
-     *
-     * @param view View the user is attempting to swipe
-     * @return true if the view can be dismissed via swiping, false otherwise
-     */
-    public boolean canSwipeDismissView(@NonNull View view) {
-        return true;
-    }
-
-    private final ViewDragHelper.Callback mDragCallback = new ViewDragHelper.Callback() {
-        private static final int INVALID_POINTER_ID = -1;
-
-        private int mOriginalCapturedViewLeft;
-        private int mActivePointerId = INVALID_POINTER_ID;
-
-        @Override
-        public boolean tryCaptureView(View child, int pointerId) {
-            // Only capture if we don't already have an active pointer id
-            return mActivePointerId == INVALID_POINTER_ID && canSwipeDismissView(child);
-        }
-
-        @Override
-        public void onViewCaptured(View capturedChild, int activePointerId) {
-            mActivePointerId = activePointerId;
-            mOriginalCapturedViewLeft = capturedChild.getLeft();
-
-            // The view has been captured, and thus a drag is about to start so stop any parents
-            // intercepting
-            final ViewParent parent = capturedChild.getParent();
-            if (parent != null) {
-                parent.requestDisallowInterceptTouchEvent(true);
-            }
-        }
-
-        @Override
-        public void onViewDragStateChanged(int state) {
-            if (mListener != null) {
-                mListener.onDragStateChanged(state);
-            }
-        }
-
-        @Override
-        public void onViewReleased(View child, float xvel, float yvel) {
-            // Reset the active pointer ID
-            mActivePointerId = INVALID_POINTER_ID;
-
-            final int childWidth = child.getWidth();
-            int targetLeft;
-            boolean dismiss = false;
-
-            if (shouldDismiss(child, xvel)) {
-                targetLeft = child.getLeft() < mOriginalCapturedViewLeft
-                        ? mOriginalCapturedViewLeft - childWidth
-                        : mOriginalCapturedViewLeft + childWidth;
-                dismiss = true;
-            } else {
-                // Else, reset back to the original left
-                targetLeft = mOriginalCapturedViewLeft;
-            }
-
-            if (mViewDragHelper.settleCapturedViewAt(targetLeft, child.getTop())) {
-                ViewCompat.postOnAnimation(child, new SettleRunnable(child, dismiss));
-            } else if (dismiss && mListener != null) {
-                mListener.onDismiss(child);
-            }
-        }
-
-        private boolean shouldDismiss(View child, float xvel) {
-            if (xvel != 0f) {
-                final boolean isRtl = ViewCompat.getLayoutDirection(child)
-                        == ViewCompat.LAYOUT_DIRECTION_RTL;
-
-                if (mSwipeDirection == SWIPE_DIRECTION_ANY) {
-                    // We don't care about the direction so return true
-                    return true;
-                } else if (mSwipeDirection == SWIPE_DIRECTION_START_TO_END) {
-                    // We only allow start-to-end swiping, so the fling needs to be in the
-                    // correct direction
-                    return isRtl ? xvel < 0f : xvel > 0f;
-                } else if (mSwipeDirection == SWIPE_DIRECTION_END_TO_START) {
-                    // We only allow end-to-start swiping, so the fling needs to be in the
-                    // correct direction
-                    return isRtl ? xvel > 0f : xvel < 0f;
-                }
-            } else {
-                final int distance = child.getLeft() - mOriginalCapturedViewLeft;
-                final int thresholdDistance = Math.round(child.getWidth() * mDragDismissThreshold);
-                return Math.abs(distance) >= thresholdDistance;
-            }
-
-            return false;
-        }
-
-        @Override
-        public int getViewHorizontalDragRange(View child) {
-            return child.getWidth();
-        }
-
-        @Override
-        public int clampViewPositionHorizontal(View child, int left, int dx) {
-            final boolean isRtl = ViewCompat.getLayoutDirection(child)
-                    == ViewCompat.LAYOUT_DIRECTION_RTL;
-            int min, max;
-
-            if (mSwipeDirection == SWIPE_DIRECTION_START_TO_END) {
-                if (isRtl) {
-                    min = mOriginalCapturedViewLeft - child.getWidth();
-                    max = mOriginalCapturedViewLeft;
-                } else {
-                    min = mOriginalCapturedViewLeft;
-                    max = mOriginalCapturedViewLeft + child.getWidth();
-                }
-            } else if (mSwipeDirection == SWIPE_DIRECTION_END_TO_START) {
-                if (isRtl) {
-                    min = mOriginalCapturedViewLeft;
-                    max = mOriginalCapturedViewLeft + child.getWidth();
-                } else {
-                    min = mOriginalCapturedViewLeft - child.getWidth();
-                    max = mOriginalCapturedViewLeft;
-                }
-            } else {
-                min = mOriginalCapturedViewLeft - child.getWidth();
-                max = mOriginalCapturedViewLeft + child.getWidth();
-            }
-
-            return clamp(min, left, max);
-        }
-
-        @Override
-        public int clampViewPositionVertical(View child, int top, int dy) {
-            return child.getTop();
-        }
-
-        @Override
-        public void onViewPositionChanged(View child, int left, int top, int dx, int dy) {
-            final float startAlphaDistance = mOriginalCapturedViewLeft
-                    + child.getWidth() * mAlphaStartSwipeDistance;
-            final float endAlphaDistance = mOriginalCapturedViewLeft
-                    + child.getWidth() * mAlphaEndSwipeDistance;
-
-            if (left <= startAlphaDistance) {
-                child.setAlpha(1f);
-            } else if (left >= endAlphaDistance) {
-                child.setAlpha(0f);
-            } else {
-                // We're between the start and end distances
-                final float distance = fraction(startAlphaDistance, endAlphaDistance, left);
-                child.setAlpha(clamp(0f, 1f - distance, 1f));
-            }
-        }
-    };
-
-    private void ensureViewDragHelper(ViewGroup parent) {
-        if (mViewDragHelper == null) {
-            mViewDragHelper = mSensitivitySet
-                    ? ViewDragHelper.create(parent, mSensitivity, mDragCallback)
-                    : ViewDragHelper.create(parent, mDragCallback);
-        }
-    }
-
-    private class SettleRunnable implements Runnable {
-        private final View mView;
-        private final boolean mDismiss;
-
-        SettleRunnable(View view, boolean dismiss) {
-            mView = view;
-            mDismiss = dismiss;
-        }
-
-        @Override
-        public void run() {
-            if (mViewDragHelper != null && mViewDragHelper.continueSettling(true)) {
-                ViewCompat.postOnAnimation(mView, this);
-            } else {
-                if (mDismiss && mListener != null) {
-                    mListener.onDismiss(mView);
-                }
-            }
-        }
-    }
-
-    static float clamp(float min, float value, float max) {
-        return Math.min(Math.max(min, value), max);
-    }
-
-    static int clamp(int min, int value, int max) {
-        return Math.min(Math.max(min, value), max);
-    }
-
-    /**
-     * Retrieve the current drag state of this behavior. This will return one of
-     * {@link #STATE_IDLE}, {@link #STATE_DRAGGING} or {@link #STATE_SETTLING}.
-     *
-     * @return The current drag state
-     */
-    public int getDragState() {
-        return mViewDragHelper != null ? mViewDragHelper.getViewDragState() : STATE_IDLE;
-    }
-
-    /**
-     * The fraction that {@code value} is between {@code startValue} and {@code endValue}.
-     */
-    static float fraction(float startValue, float endValue, float value) {
-        return (value - startValue) / (endValue - startValue);
-    }
-}
\ No newline at end of file
diff --git a/design/src/android/support/design/widget/TabItem.java b/design/src/android/support/design/widget/TabItem.java
deleted file mode 100644
index 09b01db..0000000
--- a/design/src/android/support/design/widget/TabItem.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.support.design.R;
-import android.support.v7.widget.TintTypedArray;
-import android.util.AttributeSet;
-import android.view.View;
-
-/**
- * TabItem is a special 'view' which allows you to declare tab items for a {@link TabLayout}
- * within a layout. This view is not actually added to TabLayout, it is just a dummy which allows
- * setting of a tab items's text, icon and custom layout. See TabLayout for more information on how
- * to use it.
- *
- * @attr ref android.support.design.R.styleable#TabItem_android_icon
- * @attr ref android.support.design.R.styleable#TabItem_android_text
- * @attr ref android.support.design.R.styleable#TabItem_android_layout
- *
- * @see TabLayout
- */
-public final class TabItem extends View {
-    final CharSequence mText;
-    final Drawable mIcon;
-    final int mCustomLayout;
-
-    public TabItem(Context context) {
-        this(context, null);
-    }
-
-    public TabItem(Context context, AttributeSet attrs) {
-        super(context, attrs);
-
-        final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs,
-                R.styleable.TabItem);
-        mText = a.getText(R.styleable.TabItem_android_text);
-        mIcon = a.getDrawable(R.styleable.TabItem_android_icon);
-        mCustomLayout = a.getResourceId(R.styleable.TabItem_android_layout, 0);
-        a.recycle();
-    }
-}
\ No newline at end of file
diff --git a/design/src/android/support/design/widget/TabLayout.java b/design/src/android/support/design/widget/TabLayout.java
deleted file mode 100755
index 9b81465..0000000
--- a/design/src/android/support/design/widget/TabLayout.java
+++ /dev/null
@@ -1,2217 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-import static android.support.v4.view.ViewPager.SCROLL_STATE_DRAGGING;
-import static android.support.v4.view.ViewPager.SCROLL_STATE_IDLE;
-import static android.support.v4.view.ViewPager.SCROLL_STATE_SETTLING;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.database.DataSetObserver;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IntDef;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-import android.support.annotation.StringRes;
-import android.support.design.R;
-import android.support.v4.util.Pools;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.PointerIconCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.ViewPager;
-import android.support.v4.widget.TextViewCompat;
-import android.support.v7.app.ActionBar;
-import android.support.v7.content.res.AppCompatResources;
-import android.support.v7.widget.TooltipCompat;
-import android.text.Layout;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.SoundEffectConstants;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityNodeInfo;
-import android.widget.HorizontalScrollView;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Iterator;
-
-/**
- * TabLayout provides a horizontal layout to display tabs.
- *
- * <p>Population of the tabs to display is
- * done through {@link Tab} instances. You create tabs via {@link #newTab()}. From there you can
- * change the tab's label or icon via {@link Tab#setText(int)} and {@link Tab#setIcon(int)}
- * respectively. To display the tab, you need to add it to the layout via one of the
- * {@link #addTab(Tab)} methods. For example:
- * <pre>
- * TabLayout tabLayout = ...;
- * tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
- * tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
- * tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
- * </pre>
- * You should set a listener via {@link #setOnTabSelectedListener(OnTabSelectedListener)} to be
- * notified when any tab's selection state has been changed.
- *
- * <p>You can also add items to TabLayout in your layout through the use of {@link TabItem}.
- * An example usage is like so:</p>
- *
- * <pre>
- * &lt;android.support.design.widget.TabLayout
- *         android:layout_height=&quot;wrap_content&quot;
- *         android:layout_width=&quot;match_parent&quot;&gt;
- *
- *     &lt;android.support.design.widget.TabItem
- *             android:text=&quot;@string/tab_text&quot;/&gt;
- *
- *     &lt;android.support.design.widget.TabItem
- *             android:icon=&quot;@drawable/ic_android&quot;/&gt;
- *
- * &lt;/android.support.design.widget.TabLayout&gt;
- * </pre>
- *
- * <h3>ViewPager integration</h3>
- * <p>
- * If you're using a {@link android.support.v4.view.ViewPager} together
- * with this layout, you can call {@link #setupWithViewPager(ViewPager)} to link the two together.
- * This layout will be automatically populated from the {@link PagerAdapter}'s page titles.</p>
- *
- * <p>
- * This view also supports being used as part of a ViewPager's decor, and can be added
- * directly to the ViewPager in a layout resource file like so:</p>
- *
- * <pre>
- * &lt;android.support.v4.view.ViewPager
- *     android:layout_width=&quot;match_parent&quot;
- *     android:layout_height=&quot;match_parent&quot;&gt;
- *
- *     &lt;android.support.design.widget.TabLayout
- *         android:layout_width=&quot;match_parent&quot;
- *         android:layout_height=&quot;wrap_content&quot;
- *         android:layout_gravity=&quot;top&quot; /&gt;
- *
- * &lt;/android.support.v4.view.ViewPager&gt;
- * </pre>
- *
- * @see <a href="http://www.google.com/design/spec/components/tabs.html">Tabs</a>
- *
- * @attr ref android.support.design.R.styleable#TabLayout_tabPadding
- * @attr ref android.support.design.R.styleable#TabLayout_tabPaddingStart
- * @attr ref android.support.design.R.styleable#TabLayout_tabPaddingTop
- * @attr ref android.support.design.R.styleable#TabLayout_tabPaddingEnd
- * @attr ref android.support.design.R.styleable#TabLayout_tabPaddingBottom
- * @attr ref android.support.design.R.styleable#TabLayout_tabContentStart
- * @attr ref android.support.design.R.styleable#TabLayout_tabBackground
- * @attr ref android.support.design.R.styleable#TabLayout_tabMinWidth
- * @attr ref android.support.design.R.styleable#TabLayout_tabMaxWidth
- * @attr ref android.support.design.R.styleable#TabLayout_tabTextAppearance
- */
-@ViewPager.DecorView
-public class TabLayout extends HorizontalScrollView {
-
-    private static final int DEFAULT_HEIGHT_WITH_TEXT_ICON = 72; // dps
-    static final int DEFAULT_GAP_TEXT_ICON = 8; // dps
-    private static final int INVALID_WIDTH = -1;
-    private static final int DEFAULT_HEIGHT = 48; // dps
-    private static final int TAB_MIN_WIDTH_MARGIN = 56; //dps
-    static final int FIXED_WRAP_GUTTER_MIN = 16; //dps
-    static final int MOTION_NON_ADJACENT_OFFSET = 24;
-
-    private static final int ANIMATION_DURATION = 300;
-
-    private static final Pools.Pool<Tab> sTabPool = new Pools.SynchronizedPool<>(16);
-
-    /**
-     * Scrollable tabs display a subset of tabs at any given moment, and can contain longer tab
-     * labels and a larger number of tabs. They are best used for browsing contexts in touch
-     * interfaces when users don’t need to directly compare the tab labels.
-     *
-     * @see #setTabMode(int)
-     * @see #getTabMode()
-     */
-    public static final int MODE_SCROLLABLE = 0;
-
-    /**
-     * Fixed tabs display all tabs concurrently and are best used with content that benefits from
-     * quick pivots between tabs. The maximum number of tabs is limited by the view’s width.
-     * Fixed tabs have equal width, based on the widest tab label.
-     *
-     * @see #setTabMode(int)
-     * @see #getTabMode()
-     */
-    public static final int MODE_FIXED = 1;
-
-    /**
-     * @hide
-     */
-    @RestrictTo(LIBRARY_GROUP)
-    @IntDef(value = {MODE_SCROLLABLE, MODE_FIXED})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface Mode {}
-
-    /**
-     * Gravity used to fill the {@link TabLayout} as much as possible. This option only takes effect
-     * when used with {@link #MODE_FIXED}.
-     *
-     * @see #setTabGravity(int)
-     * @see #getTabGravity()
-     */
-    public static final int GRAVITY_FILL = 0;
-
-    /**
-     * Gravity used to lay out the tabs in the center of the {@link TabLayout}.
-     *
-     * @see #setTabGravity(int)
-     * @see #getTabGravity()
-     */
-    public static final int GRAVITY_CENTER = 1;
-
-    /**
-     * @hide
-     */
-    @RestrictTo(LIBRARY_GROUP)
-    @IntDef(flag = true, value = {GRAVITY_FILL, GRAVITY_CENTER})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface TabGravity {}
-
-    /**
-     * Callback interface invoked when a tab's selection state changes.
-     */
-    public interface OnTabSelectedListener {
-
-        /**
-         * Called when a tab enters the selected state.
-         *
-         * @param tab The tab that was selected
-         */
-        public void onTabSelected(Tab tab);
-
-        /**
-         * Called when a tab exits the selected state.
-         *
-         * @param tab The tab that was unselected
-         */
-        public void onTabUnselected(Tab tab);
-
-        /**
-         * Called when a tab that is already selected is chosen again by the user. Some applications
-         * may use this action to return to the top level of a category.
-         *
-         * @param tab The tab that was reselected.
-         */
-        public void onTabReselected(Tab tab);
-    }
-
-    private final ArrayList<Tab> mTabs = new ArrayList<>();
-    private Tab mSelectedTab;
-
-    private final SlidingTabStrip mTabStrip;
-
-    int mTabPaddingStart;
-    int mTabPaddingTop;
-    int mTabPaddingEnd;
-    int mTabPaddingBottom;
-
-    int mTabTextAppearance;
-    ColorStateList mTabTextColors;
-    float mTabTextSize;
-    float mTabTextMultiLineSize;
-
-    final int mTabBackgroundResId;
-
-    int mTabMaxWidth = Integer.MAX_VALUE;
-    private final int mRequestedTabMinWidth;
-    private final int mRequestedTabMaxWidth;
-    private final int mScrollableTabMinWidth;
-
-    private int mContentInsetStart;
-
-    int mTabGravity;
-    int mMode;
-
-    private OnTabSelectedListener mSelectedListener;
-    private final ArrayList<OnTabSelectedListener> mSelectedListeners = new ArrayList<>();
-    private OnTabSelectedListener mCurrentVpSelectedListener;
-
-    private ValueAnimator mScrollAnimator;
-
-    ViewPager mViewPager;
-    private PagerAdapter mPagerAdapter;
-    private DataSetObserver mPagerAdapterObserver;
-    private TabLayoutOnPageChangeListener mPageChangeListener;
-    private AdapterChangeListener mAdapterChangeListener;
-    private boolean mSetupViewPagerImplicitly;
-
-    // Pool we use as a simple RecyclerBin
-    private final Pools.Pool<TabView> mTabViewPool = new Pools.SimplePool<>(12);
-
-    public TabLayout(Context context) {
-        this(context, null);
-    }
-
-    public TabLayout(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public TabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-
-        ThemeUtils.checkAppCompatTheme(context);
-
-        // Disable the Scroll Bar
-        setHorizontalScrollBarEnabled(false);
-
-        // Add the TabStrip
-        mTabStrip = new SlidingTabStrip(context);
-        super.addView(mTabStrip, 0, new HorizontalScrollView.LayoutParams(
-                LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));
-
-        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TabLayout,
-                defStyleAttr, R.style.Widget_Design_TabLayout);
-
-        mTabStrip.setSelectedIndicatorHeight(
-                a.getDimensionPixelSize(R.styleable.TabLayout_tabIndicatorHeight, 0));
-        mTabStrip.setSelectedIndicatorColor(a.getColor(R.styleable.TabLayout_tabIndicatorColor, 0));
-
-        mTabPaddingStart = mTabPaddingTop = mTabPaddingEnd = mTabPaddingBottom = a
-                .getDimensionPixelSize(R.styleable.TabLayout_tabPadding, 0);
-        mTabPaddingStart = a.getDimensionPixelSize(R.styleable.TabLayout_tabPaddingStart,
-                mTabPaddingStart);
-        mTabPaddingTop = a.getDimensionPixelSize(R.styleable.TabLayout_tabPaddingTop,
-                mTabPaddingTop);
-        mTabPaddingEnd = a.getDimensionPixelSize(R.styleable.TabLayout_tabPaddingEnd,
-                mTabPaddingEnd);
-        mTabPaddingBottom = a.getDimensionPixelSize(R.styleable.TabLayout_tabPaddingBottom,
-                mTabPaddingBottom);
-
-        mTabTextAppearance = a.getResourceId(R.styleable.TabLayout_tabTextAppearance,
-                R.style.TextAppearance_Design_Tab);
-
-        // Text colors/sizes come from the text appearance first
-        final TypedArray ta = context.obtainStyledAttributes(mTabTextAppearance,
-                android.support.v7.appcompat.R.styleable.TextAppearance);
-        try {
-            mTabTextSize = ta.getDimensionPixelSize(
-                    android.support.v7.appcompat.R.styleable.TextAppearance_android_textSize, 0);
-            mTabTextColors = ta.getColorStateList(
-                    android.support.v7.appcompat.R.styleable.TextAppearance_android_textColor);
-        } finally {
-            ta.recycle();
-        }
-
-        if (a.hasValue(R.styleable.TabLayout_tabTextColor)) {
-            // If we have an explicit text color set, use it instead
-            mTabTextColors = a.getColorStateList(R.styleable.TabLayout_tabTextColor);
-        }
-
-        if (a.hasValue(R.styleable.TabLayout_tabSelectedTextColor)) {
-            // We have an explicit selected text color set, so we need to make merge it with the
-            // current colors. This is exposed so that developers can use theme attributes to set
-            // this (theme attrs in ColorStateLists are Lollipop+)
-            final int selected = a.getColor(R.styleable.TabLayout_tabSelectedTextColor, 0);
-            mTabTextColors = createColorStateList(mTabTextColors.getDefaultColor(), selected);
-        }
-
-        mRequestedTabMinWidth = a.getDimensionPixelSize(R.styleable.TabLayout_tabMinWidth,
-                INVALID_WIDTH);
-        mRequestedTabMaxWidth = a.getDimensionPixelSize(R.styleable.TabLayout_tabMaxWidth,
-                INVALID_WIDTH);
-        mTabBackgroundResId = a.getResourceId(R.styleable.TabLayout_tabBackground, 0);
-        mContentInsetStart = a.getDimensionPixelSize(R.styleable.TabLayout_tabContentStart, 0);
-        mMode = a.getInt(R.styleable.TabLayout_tabMode, MODE_FIXED);
-        mTabGravity = a.getInt(R.styleable.TabLayout_tabGravity, GRAVITY_FILL);
-        a.recycle();
-
-        // TODO add attr for these
-        final Resources res = getResources();
-        mTabTextMultiLineSize = res.getDimensionPixelSize(R.dimen.design_tab_text_size_2line);
-        mScrollableTabMinWidth = res.getDimensionPixelSize(R.dimen.design_tab_scrollable_min_width);
-
-        // Now apply the tab mode and gravity
-        applyModeAndGravity();
-    }
-
-    /**
-     * Sets the tab indicator's color for the currently selected tab.
-     *
-     * @param color color to use for the indicator
-     *
-     * @attr ref android.support.design.R.styleable#TabLayout_tabIndicatorColor
-     */
-    public void setSelectedTabIndicatorColor(@ColorInt int color) {
-        mTabStrip.setSelectedIndicatorColor(color);
-    }
-
-    /**
-     * Sets the tab indicator's height for the currently selected tab.
-     *
-     * @param height height to use for the indicator in pixels
-     *
-     * @attr ref android.support.design.R.styleable#TabLayout_tabIndicatorHeight
-     */
-    public void setSelectedTabIndicatorHeight(int height) {
-        mTabStrip.setSelectedIndicatorHeight(height);
-    }
-
-    /**
-     * Set the scroll position of the tabs. This is useful for when the tabs are being displayed as
-     * part of a scrolling container such as {@link android.support.v4.view.ViewPager}.
-     * <p>
-     * Calling this method does not update the selected tab, it is only used for drawing purposes.
-     *
-     * @param position current scroll position
-     * @param positionOffset Value from [0, 1) indicating the offset from {@code position}.
-     * @param updateSelectedText Whether to update the text's selected state.
-     */
-    public void setScrollPosition(int position, float positionOffset, boolean updateSelectedText) {
-        setScrollPosition(position, positionOffset, updateSelectedText, true);
-    }
-
-    void setScrollPosition(int position, float positionOffset, boolean updateSelectedText,
-            boolean updateIndicatorPosition) {
-        final int roundedPosition = Math.round(position + positionOffset);
-        if (roundedPosition < 0 || roundedPosition >= mTabStrip.getChildCount()) {
-            return;
-        }
-
-        // Set the indicator position, if enabled
-        if (updateIndicatorPosition) {
-            mTabStrip.setIndicatorPositionFromTabPosition(position, positionOffset);
-        }
-
-        // Now update the scroll position, canceling any running animation
-        if (mScrollAnimator != null && mScrollAnimator.isRunning()) {
-            mScrollAnimator.cancel();
-        }
-        scrollTo(calculateScrollXForTab(position, positionOffset), 0);
-
-        // Update the 'selected state' view as we scroll, if enabled
-        if (updateSelectedText) {
-            setSelectedTabView(roundedPosition);
-        }
-    }
-
-    private float getScrollPosition() {
-        return mTabStrip.getIndicatorPosition();
-    }
-
-    /**
-     * Add a tab to this layout. The tab will be added at the end of the list.
-     * If this is the first tab to be added it will become the selected tab.
-     *
-     * @param tab Tab to add
-     */
-    public void addTab(@NonNull Tab tab) {
-        addTab(tab, mTabs.isEmpty());
-    }
-
-    /**
-     * Add a tab to this layout. The tab will be inserted at <code>position</code>.
-     * If this is the first tab to be added it will become the selected tab.
-     *
-     * @param tab The tab to add
-     * @param position The new position of the tab
-     */
-    public void addTab(@NonNull Tab tab, int position) {
-        addTab(tab, position, mTabs.isEmpty());
-    }
-
-    /**
-     * Add a tab to this layout. The tab will be added at the end of the list.
-     *
-     * @param tab Tab to add
-     * @param setSelected True if the added tab should become the selected tab.
-     */
-    public void addTab(@NonNull Tab tab, boolean setSelected) {
-        addTab(tab, mTabs.size(), setSelected);
-    }
-
-    /**
-     * Add a tab to this layout. The tab will be inserted at <code>position</code>.
-     *
-     * @param tab The tab to add
-     * @param position The new position of the tab
-     * @param setSelected True if the added tab should become the selected tab.
-     */
-    public void addTab(@NonNull Tab tab, int position, boolean setSelected) {
-        if (tab.mParent != this) {
-            throw new IllegalArgumentException("Tab belongs to a different TabLayout.");
-        }
-        configureTab(tab, position);
-        addTabView(tab);
-
-        if (setSelected) {
-            tab.select();
-        }
-    }
-
-    private void addTabFromItemView(@NonNull TabItem item) {
-        final Tab tab = newTab();
-        if (item.mText != null) {
-            tab.setText(item.mText);
-        }
-        if (item.mIcon != null) {
-            tab.setIcon(item.mIcon);
-        }
-        if (item.mCustomLayout != 0) {
-            tab.setCustomView(item.mCustomLayout);
-        }
-        if (!TextUtils.isEmpty(item.getContentDescription())) {
-            tab.setContentDescription(item.getContentDescription());
-        }
-        addTab(tab);
-    }
-
-    /**
-     * @deprecated Use {@link #addOnTabSelectedListener(OnTabSelectedListener)} and
-     * {@link #removeOnTabSelectedListener(OnTabSelectedListener)}.
-     */
-    @Deprecated
-    public void setOnTabSelectedListener(@Nullable OnTabSelectedListener listener) {
-        // The logic in this method emulates what we had before support for multiple
-        // registered listeners.
-        if (mSelectedListener != null) {
-            removeOnTabSelectedListener(mSelectedListener);
-        }
-        // Update the deprecated field so that we can remove the passed listener the next
-        // time we're called
-        mSelectedListener = listener;
-        if (listener != null) {
-            addOnTabSelectedListener(listener);
-        }
-    }
-
-    /**
-     * Add a {@link TabLayout.OnTabSelectedListener} that will be invoked when tab selection
-     * changes.
-     *
-     * <p>Components that add a listener should take care to remove it when finished via
-     * {@link #removeOnTabSelectedListener(OnTabSelectedListener)}.</p>
-     *
-     * @param listener listener to add
-     */
-    public void addOnTabSelectedListener(@NonNull OnTabSelectedListener listener) {
-        if (!mSelectedListeners.contains(listener)) {
-            mSelectedListeners.add(listener);
-        }
-    }
-
-    /**
-     * Remove the given {@link TabLayout.OnTabSelectedListener} that was previously added via
-     * {@link #addOnTabSelectedListener(OnTabSelectedListener)}.
-     *
-     * @param listener listener to remove
-     */
-    public void removeOnTabSelectedListener(@NonNull OnTabSelectedListener listener) {
-        mSelectedListeners.remove(listener);
-    }
-
-    /**
-     * Remove all previously added {@link TabLayout.OnTabSelectedListener}s.
-     */
-    public void clearOnTabSelectedListeners() {
-        mSelectedListeners.clear();
-    }
-
-    /**
-     * Create and return a new {@link Tab}. You need to manually add this using
-     * {@link #addTab(Tab)} or a related method.
-     *
-     * @return A new Tab
-     * @see #addTab(Tab)
-     */
-    @NonNull
-    public Tab newTab() {
-        Tab tab = sTabPool.acquire();
-        if (tab == null) {
-            tab = new Tab();
-        }
-        tab.mParent = this;
-        tab.mView = createTabView(tab);
-        return tab;
-    }
-
-    /**
-     * Returns the number of tabs currently registered with the action bar.
-     *
-     * @return Tab count
-     */
-    public int getTabCount() {
-        return mTabs.size();
-    }
-
-    /**
-     * Returns the tab at the specified index.
-     */
-    @Nullable
-    public Tab getTabAt(int index) {
-        return (index < 0 || index >= getTabCount()) ? null : mTabs.get(index);
-    }
-
-    /**
-     * Returns the position of the current selected tab.
-     *
-     * @return selected tab position, or {@code -1} if there isn't a selected tab.
-     */
-    public int getSelectedTabPosition() {
-        return mSelectedTab != null ? mSelectedTab.getPosition() : -1;
-    }
-
-    /**
-     * Remove a tab from the layout. If the removed tab was selected it will be deselected
-     * and another tab will be selected if present.
-     *
-     * @param tab The tab to remove
-     */
-    public void removeTab(Tab tab) {
-        if (tab.mParent != this) {
-            throw new IllegalArgumentException("Tab does not belong to this TabLayout.");
-        }
-
-        removeTabAt(tab.getPosition());
-    }
-
-    /**
-     * Remove a tab from the layout. If the removed tab was selected it will be deselected
-     * and another tab will be selected if present.
-     *
-     * @param position Position of the tab to remove
-     */
-    public void removeTabAt(int position) {
-        final int selectedTabPosition = mSelectedTab != null ? mSelectedTab.getPosition() : 0;
-        removeTabViewAt(position);
-
-        final Tab removedTab = mTabs.remove(position);
-        if (removedTab != null) {
-            removedTab.reset();
-            sTabPool.release(removedTab);
-        }
-
-        final int newTabCount = mTabs.size();
-        for (int i = position; i < newTabCount; i++) {
-            mTabs.get(i).setPosition(i);
-        }
-
-        if (selectedTabPosition == position) {
-            selectTab(mTabs.isEmpty() ? null : mTabs.get(Math.max(0, position - 1)));
-        }
-    }
-
-    /**
-     * Remove all tabs from the action bar and deselect the current tab.
-     */
-    public void removeAllTabs() {
-        // Remove all the views
-        for (int i = mTabStrip.getChildCount() - 1; i >= 0; i--) {
-            removeTabViewAt(i);
-        }
-
-        for (final Iterator<Tab> i = mTabs.iterator(); i.hasNext();) {
-            final Tab tab = i.next();
-            i.remove();
-            tab.reset();
-            sTabPool.release(tab);
-        }
-
-        mSelectedTab = null;
-    }
-
-    /**
-     * Set the behavior mode for the Tabs in this layout. The valid input options are:
-     * <ul>
-     * <li>{@link #MODE_FIXED}: Fixed tabs display all tabs concurrently and are best used
-     * with content that benefits from quick pivots between tabs.</li>
-     * <li>{@link #MODE_SCROLLABLE}: Scrollable tabs display a subset of tabs at any given moment,
-     * and can contain longer tab labels and a larger number of tabs. They are best used for
-     * browsing contexts in touch interfaces when users don’t need to directly compare the tab
-     * labels. This mode is commonly used with a {@link android.support.v4.view.ViewPager}.</li>
-     * </ul>
-     *
-     * @param mode one of {@link #MODE_FIXED} or {@link #MODE_SCROLLABLE}.
-     *
-     * @attr ref android.support.design.R.styleable#TabLayout_tabMode
-     */
-    public void setTabMode(@Mode int mode) {
-        if (mode != mMode) {
-            mMode = mode;
-            applyModeAndGravity();
-        }
-    }
-
-    /**
-     * Returns the current mode used by this {@link TabLayout}.
-     *
-     * @see #setTabMode(int)
-     */
-    @Mode
-    public int getTabMode() {
-        return mMode;
-    }
-
-    /**
-     * Set the gravity to use when laying out the tabs.
-     *
-     * @param gravity one of {@link #GRAVITY_CENTER} or {@link #GRAVITY_FILL}.
-     *
-     * @attr ref android.support.design.R.styleable#TabLayout_tabGravity
-     */
-    public void setTabGravity(@TabGravity int gravity) {
-        if (mTabGravity != gravity) {
-            mTabGravity = gravity;
-            applyModeAndGravity();
-        }
-    }
-
-    /**
-     * The current gravity used for laying out tabs.
-     *
-     * @return one of {@link #GRAVITY_CENTER} or {@link #GRAVITY_FILL}.
-     */
-    @TabGravity
-    public int getTabGravity() {
-        return mTabGravity;
-    }
-
-    /**
-     * Sets the text colors for the different states (normal, selected) used for the tabs.
-     *
-     * @see #getTabTextColors()
-     */
-    public void setTabTextColors(@Nullable ColorStateList textColor) {
-        if (mTabTextColors != textColor) {
-            mTabTextColors = textColor;
-            updateAllTabs();
-        }
-    }
-
-    /**
-     * Gets the text colors for the different states (normal, selected) used for the tabs.
-     */
-    @Nullable
-    public ColorStateList getTabTextColors() {
-        return mTabTextColors;
-    }
-
-    /**
-     * Sets the text colors for the different states (normal, selected) used for the tabs.
-     *
-     * @attr ref android.support.design.R.styleable#TabLayout_tabTextColor
-     * @attr ref android.support.design.R.styleable#TabLayout_tabSelectedTextColor
-     */
-    public void setTabTextColors(int normalColor, int selectedColor) {
-        setTabTextColors(createColorStateList(normalColor, selectedColor));
-    }
-
-    /**
-     * The one-stop shop for setting up this {@link TabLayout} with a {@link ViewPager}.
-     *
-     * <p>This is the same as calling {@link #setupWithViewPager(ViewPager, boolean)} with
-     * auto-refresh enabled.</p>
-     *
-     * @param viewPager the ViewPager to link to, or {@code null} to clear any previous link
-     */
-    public void setupWithViewPager(@Nullable ViewPager viewPager) {
-        setupWithViewPager(viewPager, true);
-    }
-
-    /**
-     * The one-stop shop for setting up this {@link TabLayout} with a {@link ViewPager}.
-     *
-     * <p>This method will link the given ViewPager and this TabLayout together so that
-     * changes in one are automatically reflected in the other. This includes scroll state changes
-     * and clicks. The tabs displayed in this layout will be populated
-     * from the ViewPager adapter's page titles.</p>
-     *
-     * <p>If {@code autoRefresh} is {@code true}, any changes in the {@link PagerAdapter} will
-     * trigger this layout to re-populate itself from the adapter's titles.</p>
-     *
-     * <p>If the given ViewPager is non-null, it needs to already have a
-     * {@link PagerAdapter} set.</p>
-     *
-     * @param viewPager   the ViewPager to link to, or {@code null} to clear any previous link
-     * @param autoRefresh whether this layout should refresh its contents if the given ViewPager's
-     *                    content changes
-     */
-    public void setupWithViewPager(@Nullable final ViewPager viewPager, boolean autoRefresh) {
-        setupWithViewPager(viewPager, autoRefresh, false);
-    }
-
-    private void setupWithViewPager(@Nullable final ViewPager viewPager, boolean autoRefresh,
-            boolean implicitSetup) {
-        if (mViewPager != null) {
-            // If we've already been setup with a ViewPager, remove us from it
-            if (mPageChangeListener != null) {
-                mViewPager.removeOnPageChangeListener(mPageChangeListener);
-            }
-            if (mAdapterChangeListener != null) {
-                mViewPager.removeOnAdapterChangeListener(mAdapterChangeListener);
-            }
-        }
-
-        if (mCurrentVpSelectedListener != null) {
-            // If we already have a tab selected listener for the ViewPager, remove it
-            removeOnTabSelectedListener(mCurrentVpSelectedListener);
-            mCurrentVpSelectedListener = null;
-        }
-
-        if (viewPager != null) {
-            mViewPager = viewPager;
-
-            // Add our custom OnPageChangeListener to the ViewPager
-            if (mPageChangeListener == null) {
-                mPageChangeListener = new TabLayoutOnPageChangeListener(this);
-            }
-            mPageChangeListener.reset();
-            viewPager.addOnPageChangeListener(mPageChangeListener);
-
-            // Now we'll add a tab selected listener to set ViewPager's current item
-            mCurrentVpSelectedListener = new ViewPagerOnTabSelectedListener(viewPager);
-            addOnTabSelectedListener(mCurrentVpSelectedListener);
-
-            final PagerAdapter adapter = viewPager.getAdapter();
-            if (adapter != null) {
-                // Now we'll populate ourselves from the pager adapter, adding an observer if
-                // autoRefresh is enabled
-                setPagerAdapter(adapter, autoRefresh);
-            }
-
-            // Add a listener so that we're notified of any adapter changes
-            if (mAdapterChangeListener == null) {
-                mAdapterChangeListener = new AdapterChangeListener();
-            }
-            mAdapterChangeListener.setAutoRefresh(autoRefresh);
-            viewPager.addOnAdapterChangeListener(mAdapterChangeListener);
-
-            // Now update the scroll position to match the ViewPager's current item
-            setScrollPosition(viewPager.getCurrentItem(), 0f, true);
-        } else {
-            // We've been given a null ViewPager so we need to clear out the internal state,
-            // listeners and observers
-            mViewPager = null;
-            setPagerAdapter(null, false);
-        }
-
-        mSetupViewPagerImplicitly = implicitSetup;
-    }
-
-    /**
-     * @deprecated Use {@link #setupWithViewPager(ViewPager)} to link a TabLayout with a ViewPager
-     *             together. When that method is used, the TabLayout will be automatically updated
-     *             when the {@link PagerAdapter} is changed.
-     */
-    @Deprecated
-    public void setTabsFromPagerAdapter(@Nullable final PagerAdapter adapter) {
-        setPagerAdapter(adapter, false);
-    }
-
-    @Override
-    public boolean shouldDelayChildPressedState() {
-        // Only delay the pressed state if the tabs can scroll
-        return getTabScrollRange() > 0;
-    }
-
-    @Override
-    protected void onAttachedToWindow() {
-        super.onAttachedToWindow();
-
-        if (mViewPager == null) {
-            // If we don't have a ViewPager already, check if our parent is a ViewPager to
-            // setup with it automatically
-            final ViewParent vp = getParent();
-            if (vp instanceof ViewPager) {
-                // If we have a ViewPager parent and we've been added as part of its decor, let's
-                // assume that we should automatically setup to display any titles
-                setupWithViewPager((ViewPager) vp, true, true);
-            }
-        }
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-
-        if (mSetupViewPagerImplicitly) {
-            // If we've been setup with a ViewPager implicitly, let's clear out any listeners, etc
-            setupWithViewPager(null);
-            mSetupViewPagerImplicitly = false;
-        }
-    }
-
-    private int getTabScrollRange() {
-        return Math.max(0, mTabStrip.getWidth() - getWidth() - getPaddingLeft()
-                - getPaddingRight());
-    }
-
-    void setPagerAdapter(@Nullable final PagerAdapter adapter, final boolean addObserver) {
-        if (mPagerAdapter != null && mPagerAdapterObserver != null) {
-            // If we already have a PagerAdapter, unregister our observer
-            mPagerAdapter.unregisterDataSetObserver(mPagerAdapterObserver);
-        }
-
-        mPagerAdapter = adapter;
-
-        if (addObserver && adapter != null) {
-            // Register our observer on the new adapter
-            if (mPagerAdapterObserver == null) {
-                mPagerAdapterObserver = new PagerAdapterObserver();
-            }
-            adapter.registerDataSetObserver(mPagerAdapterObserver);
-        }
-
-        // Finally make sure we reflect the new adapter
-        populateFromPagerAdapter();
-    }
-
-    void populateFromPagerAdapter() {
-        removeAllTabs();
-
-        if (mPagerAdapter != null) {
-            final int adapterCount = mPagerAdapter.getCount();
-            for (int i = 0; i < adapterCount; i++) {
-                addTab(newTab().setText(mPagerAdapter.getPageTitle(i)), false);
-            }
-
-            // Make sure we reflect the currently set ViewPager item
-            if (mViewPager != null && adapterCount > 0) {
-                final int curItem = mViewPager.getCurrentItem();
-                if (curItem != getSelectedTabPosition() && curItem < getTabCount()) {
-                    selectTab(getTabAt(curItem));
-                }
-            }
-        }
-    }
-
-    private void updateAllTabs() {
-        for (int i = 0, z = mTabs.size(); i < z; i++) {
-            mTabs.get(i).updateView();
-        }
-    }
-
-    private TabView createTabView(@NonNull final Tab tab) {
-        TabView tabView = mTabViewPool != null ? mTabViewPool.acquire() : null;
-        if (tabView == null) {
-            tabView = new TabView(getContext());
-        }
-        tabView.setTab(tab);
-        tabView.setFocusable(true);
-        tabView.setMinimumWidth(getTabMinWidth());
-        return tabView;
-    }
-
-    private void configureTab(Tab tab, int position) {
-        tab.setPosition(position);
-        mTabs.add(position, tab);
-
-        final int count = mTabs.size();
-        for (int i = position + 1; i < count; i++) {
-            mTabs.get(i).setPosition(i);
-        }
-    }
-
-    private void addTabView(Tab tab) {
-        final TabView tabView = tab.mView;
-        mTabStrip.addView(tabView, tab.getPosition(), createLayoutParamsForTabs());
-    }
-
-    @Override
-    public void addView(View child) {
-        addViewInternal(child);
-    }
-
-    @Override
-    public void addView(View child, int index) {
-        addViewInternal(child);
-    }
-
-    @Override
-    public void addView(View child, ViewGroup.LayoutParams params) {
-        addViewInternal(child);
-    }
-
-    @Override
-    public void addView(View child, int index, ViewGroup.LayoutParams params) {
-        addViewInternal(child);
-    }
-
-    private void addViewInternal(final View child) {
-        if (child instanceof TabItem) {
-            addTabFromItemView((TabItem) child);
-        } else {
-            throw new IllegalArgumentException("Only TabItem instances can be added to TabLayout");
-        }
-    }
-
-    private LinearLayout.LayoutParams createLayoutParamsForTabs() {
-        final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
-                LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
-        updateTabViewLayoutParams(lp);
-        return lp;
-    }
-
-    private void updateTabViewLayoutParams(LinearLayout.LayoutParams lp) {
-        if (mMode == MODE_FIXED && mTabGravity == GRAVITY_FILL) {
-            lp.width = 0;
-            lp.weight = 1;
-        } else {
-            lp.width = LinearLayout.LayoutParams.WRAP_CONTENT;
-            lp.weight = 0;
-        }
-    }
-
-    int dpToPx(int dps) {
-        return Math.round(getResources().getDisplayMetrics().density * dps);
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        // If we have a MeasureSpec which allows us to decide our height, try and use the default
-        // height
-        final int idealHeight = dpToPx(getDefaultHeight()) + getPaddingTop() + getPaddingBottom();
-        switch (MeasureSpec.getMode(heightMeasureSpec)) {
-            case MeasureSpec.AT_MOST:
-                heightMeasureSpec = MeasureSpec.makeMeasureSpec(
-                        Math.min(idealHeight, MeasureSpec.getSize(heightMeasureSpec)),
-                        MeasureSpec.EXACTLY);
-                break;
-            case MeasureSpec.UNSPECIFIED:
-                heightMeasureSpec = MeasureSpec.makeMeasureSpec(idealHeight, MeasureSpec.EXACTLY);
-                break;
-        }
-
-        final int specWidth = MeasureSpec.getSize(widthMeasureSpec);
-        if (MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.UNSPECIFIED) {
-            // If we don't have an unspecified width spec, use the given size to calculate
-            // the max tab width
-            mTabMaxWidth = mRequestedTabMaxWidth > 0
-                    ? mRequestedTabMaxWidth
-                    : specWidth - dpToPx(TAB_MIN_WIDTH_MARGIN);
-        }
-
-        // Now super measure itself using the (possibly) modified height spec
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
-        if (getChildCount() == 1) {
-            // If we're in fixed mode then we need to make the tab strip is the same width as us
-            // so we don't scroll
-            final View child = getChildAt(0);
-            boolean remeasure = false;
-
-            switch (mMode) {
-                case MODE_SCROLLABLE:
-                    // We only need to resize the child if it's smaller than us. This is similar
-                    // to fillViewport
-                    remeasure = child.getMeasuredWidth() < getMeasuredWidth();
-                    break;
-                case MODE_FIXED:
-                    // Resize the child so that it doesn't scroll
-                    remeasure = child.getMeasuredWidth() != getMeasuredWidth();
-                    break;
-            }
-
-            if (remeasure) {
-                // Re-measure the child with a widthSpec set to be exactly our measure width
-                int childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec, getPaddingTop()
-                        + getPaddingBottom(), child.getLayoutParams().height);
-                int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
-                        getMeasuredWidth(), MeasureSpec.EXACTLY);
-                child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
-            }
-        }
-    }
-
-    private void removeTabViewAt(int position) {
-        final TabView view = (TabView) mTabStrip.getChildAt(position);
-        mTabStrip.removeViewAt(position);
-        if (view != null) {
-            view.reset();
-            mTabViewPool.release(view);
-        }
-        requestLayout();
-    }
-
-    private void animateToTab(int newPosition) {
-        if (newPosition == Tab.INVALID_POSITION) {
-            return;
-        }
-
-        if (getWindowToken() == null || !ViewCompat.isLaidOut(this)
-                || mTabStrip.childrenNeedLayout()) {
-            // If we don't have a window token, or we haven't been laid out yet just draw the new
-            // position now
-            setScrollPosition(newPosition, 0f, true);
-            return;
-        }
-
-        final int startScrollX = getScrollX();
-        final int targetScrollX = calculateScrollXForTab(newPosition, 0);
-
-        if (startScrollX != targetScrollX) {
-            ensureScrollAnimator();
-
-            mScrollAnimator.setIntValues(startScrollX, targetScrollX);
-            mScrollAnimator.start();
-        }
-
-        // Now animate the indicator
-        mTabStrip.animateIndicatorToPosition(newPosition, ANIMATION_DURATION);
-    }
-
-    private void ensureScrollAnimator() {
-        if (mScrollAnimator == null) {
-            mScrollAnimator = new ValueAnimator();
-            mScrollAnimator.setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR);
-            mScrollAnimator.setDuration(ANIMATION_DURATION);
-            mScrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-                @Override
-                public void onAnimationUpdate(ValueAnimator animator) {
-                    scrollTo((int) animator.getAnimatedValue(), 0);
-                }
-            });
-        }
-    }
-
-    void setScrollAnimatorListener(Animator.AnimatorListener listener) {
-        ensureScrollAnimator();
-        mScrollAnimator.addListener(listener);
-    }
-
-    private void setSelectedTabView(int position) {
-        final int tabCount = mTabStrip.getChildCount();
-        if (position < tabCount) {
-            for (int i = 0; i < tabCount; i++) {
-                final View child = mTabStrip.getChildAt(i);
-                child.setSelected(i == position);
-            }
-        }
-    }
-
-    void selectTab(Tab tab) {
-        selectTab(tab, true);
-    }
-
-    void selectTab(final Tab tab, boolean updateIndicator) {
-        final Tab currentTab = mSelectedTab;
-
-        if (currentTab == tab) {
-            if (currentTab != null) {
-                dispatchTabReselected(tab);
-                animateToTab(tab.getPosition());
-            }
-        } else {
-            final int newPosition = tab != null ? tab.getPosition() : Tab.INVALID_POSITION;
-            if (updateIndicator) {
-                if ((currentTab == null || currentTab.getPosition() == Tab.INVALID_POSITION)
-                        && newPosition != Tab.INVALID_POSITION) {
-                    // If we don't currently have a tab, just draw the indicator
-                    setScrollPosition(newPosition, 0f, true);
-                } else {
-                    animateToTab(newPosition);
-                }
-                if (newPosition != Tab.INVALID_POSITION) {
-                    setSelectedTabView(newPosition);
-                }
-            }
-            if (currentTab != null) {
-                dispatchTabUnselected(currentTab);
-            }
-            mSelectedTab = tab;
-            if (tab != null) {
-                dispatchTabSelected(tab);
-            }
-        }
-    }
-
-    private void dispatchTabSelected(@NonNull final Tab tab) {
-        for (int i = mSelectedListeners.size() - 1; i >= 0; i--) {
-            mSelectedListeners.get(i).onTabSelected(tab);
-        }
-    }
-
-    private void dispatchTabUnselected(@NonNull final Tab tab) {
-        for (int i = mSelectedListeners.size() - 1; i >= 0; i--) {
-            mSelectedListeners.get(i).onTabUnselected(tab);
-        }
-    }
-
-    private void dispatchTabReselected(@NonNull final Tab tab) {
-        for (int i = mSelectedListeners.size() - 1; i >= 0; i--) {
-            mSelectedListeners.get(i).onTabReselected(tab);
-        }
-    }
-
-    private int calculateScrollXForTab(int position, float positionOffset) {
-        if (mMode == MODE_SCROLLABLE) {
-            final View selectedChild = mTabStrip.getChildAt(position);
-            final View nextChild = position + 1 < mTabStrip.getChildCount()
-                    ? mTabStrip.getChildAt(position + 1)
-                    : null;
-            final int selectedWidth = selectedChild != null ? selectedChild.getWidth() : 0;
-            final int nextWidth = nextChild != null ? nextChild.getWidth() : 0;
-
-            // base scroll amount: places center of tab in center of parent
-            int scrollBase = selectedChild.getLeft() + (selectedWidth / 2) - (getWidth() / 2);
-            // offset amount: fraction of the distance between centers of tabs
-            int scrollOffset = (int) ((selectedWidth + nextWidth) * 0.5f * positionOffset);
-
-            return (ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_LTR)
-                    ? scrollBase + scrollOffset
-                    : scrollBase - scrollOffset;
-        }
-        return 0;
-    }
-
-    private void applyModeAndGravity() {
-        int paddingStart = 0;
-        if (mMode == MODE_SCROLLABLE) {
-            // If we're scrollable, or fixed at start, inset using padding
-            paddingStart = Math.max(0, mContentInsetStart - mTabPaddingStart);
-        }
-        ViewCompat.setPaddingRelative(mTabStrip, paddingStart, 0, 0, 0);
-
-        switch (mMode) {
-            case MODE_FIXED:
-                mTabStrip.setGravity(Gravity.CENTER_HORIZONTAL);
-                break;
-            case MODE_SCROLLABLE:
-                mTabStrip.setGravity(GravityCompat.START);
-                break;
-        }
-
-        updateTabViews(true);
-    }
-
-    void updateTabViews(final boolean requestLayout) {
-        for (int i = 0; i < mTabStrip.getChildCount(); i++) {
-            View child = mTabStrip.getChildAt(i);
-            child.setMinimumWidth(getTabMinWidth());
-            updateTabViewLayoutParams((LinearLayout.LayoutParams) child.getLayoutParams());
-            if (requestLayout) {
-                child.requestLayout();
-            }
-        }
-    }
-
-    /**
-     * A tab in this layout. Instances can be created via {@link #newTab()}.
-     */
-    public static final class Tab {
-
-        /**
-         * An invalid position for a tab.
-         *
-         * @see #getPosition()
-         */
-        public static final int INVALID_POSITION = -1;
-
-        private Object mTag;
-        private Drawable mIcon;
-        private CharSequence mText;
-        private CharSequence mContentDesc;
-        private int mPosition = INVALID_POSITION;
-        private View mCustomView;
-
-        TabLayout mParent;
-        TabView mView;
-
-        Tab() {
-            // Private constructor
-        }
-
-        /**
-         * @return This Tab's tag object.
-         */
-        @Nullable
-        public Object getTag() {
-            return mTag;
-        }
-
-        /**
-         * Give this Tab an arbitrary object to hold for later use.
-         *
-         * @param tag Object to store
-         * @return The current instance for call chaining
-         */
-        @NonNull
-        public Tab setTag(@Nullable Object tag) {
-            mTag = tag;
-            return this;
-        }
-
-
-        /**
-         * Returns the custom view used for this tab.
-         *
-         * @see #setCustomView(View)
-         * @see #setCustomView(int)
-         */
-        @Nullable
-        public View getCustomView() {
-            return mCustomView;
-        }
-
-        /**
-         * Set a custom view to be used for this tab.
-         * <p>
-         * If the provided view contains a {@link TextView} with an ID of
-         * {@link android.R.id#text1} then that will be updated with the value given
-         * to {@link #setText(CharSequence)}. Similarly, if this layout contains an
-         * {@link ImageView} with ID {@link android.R.id#icon} then it will be updated with
-         * the value given to {@link #setIcon(Drawable)}.
-         * </p>
-         *
-         * @param view Custom view to be used as a tab.
-         * @return The current instance for call chaining
-         */
-        @NonNull
-        public Tab setCustomView(@Nullable View view) {
-            mCustomView = view;
-            updateView();
-            return this;
-        }
-
-        /**
-         * Set a custom view to be used for this tab.
-         * <p>
-         * If the inflated layout contains a {@link TextView} with an ID of
-         * {@link android.R.id#text1} then that will be updated with the value given
-         * to {@link #setText(CharSequence)}. Similarly, if this layout contains an
-         * {@link ImageView} with ID {@link android.R.id#icon} then it will be updated with
-         * the value given to {@link #setIcon(Drawable)}.
-         * </p>
-         *
-         * @param resId A layout resource to inflate and use as a custom tab view
-         * @return The current instance for call chaining
-         */
-        @NonNull
-        public Tab setCustomView(@LayoutRes int resId) {
-            final LayoutInflater inflater = LayoutInflater.from(mView.getContext());
-            return setCustomView(inflater.inflate(resId, mView, false));
-        }
-
-        /**
-         * Return the icon associated with this tab.
-         *
-         * @return The tab's icon
-         */
-        @Nullable
-        public Drawable getIcon() {
-            return mIcon;
-        }
-
-        /**
-         * Return the current position of this tab in the action bar.
-         *
-         * @return Current position, or {@link #INVALID_POSITION} if this tab is not currently in
-         * the action bar.
-         */
-        public int getPosition() {
-            return mPosition;
-        }
-
-        void setPosition(int position) {
-            mPosition = position;
-        }
-
-        /**
-         * Return the text of this tab.
-         *
-         * @return The tab's text
-         */
-        @Nullable
-        public CharSequence getText() {
-            return mText;
-        }
-
-        /**
-         * Set the icon displayed on this tab.
-         *
-         * @param icon The drawable to use as an icon
-         * @return The current instance for call chaining
-         */
-        @NonNull
-        public Tab setIcon(@Nullable Drawable icon) {
-            mIcon = icon;
-            updateView();
-            return this;
-        }
-
-        /**
-         * Set the icon displayed on this tab.
-         *
-         * @param resId A resource ID referring to the icon that should be displayed
-         * @return The current instance for call chaining
-         */
-        @NonNull
-        public Tab setIcon(@DrawableRes int resId) {
-            if (mParent == null) {
-                throw new IllegalArgumentException("Tab not attached to a TabLayout");
-            }
-            return setIcon(AppCompatResources.getDrawable(mParent.getContext(), resId));
-        }
-
-        /**
-         * Set the text displayed on this tab. Text may be truncated if there is not room to display
-         * the entire string.
-         *
-         * @param text The text to display
-         * @return The current instance for call chaining
-         */
-        @NonNull
-        public Tab setText(@Nullable CharSequence text) {
-            mText = text;
-            updateView();
-            return this;
-        }
-
-        /**
-         * Set the text displayed on this tab. Text may be truncated if there is not room to display
-         * the entire string.
-         *
-         * @param resId A resource ID referring to the text that should be displayed
-         * @return The current instance for call chaining
-         */
-        @NonNull
-        public Tab setText(@StringRes int resId) {
-            if (mParent == null) {
-                throw new IllegalArgumentException("Tab not attached to a TabLayout");
-            }
-            return setText(mParent.getResources().getText(resId));
-        }
-
-        /**
-         * Select this tab. Only valid if the tab has been added to the action bar.
-         */
-        public void select() {
-            if (mParent == null) {
-                throw new IllegalArgumentException("Tab not attached to a TabLayout");
-            }
-            mParent.selectTab(this);
-        }
-
-        /**
-         * Returns true if this tab is currently selected.
-         */
-        public boolean isSelected() {
-            if (mParent == null) {
-                throw new IllegalArgumentException("Tab not attached to a TabLayout");
-            }
-            return mParent.getSelectedTabPosition() == mPosition;
-        }
-
-        /**
-         * Set a description of this tab's content for use in accessibility support. If no content
-         * description is provided the title will be used.
-         *
-         * @param resId A resource ID referring to the description text
-         * @return The current instance for call chaining
-         * @see #setContentDescription(CharSequence)
-         * @see #getContentDescription()
-         */
-        @NonNull
-        public Tab setContentDescription(@StringRes int resId) {
-            if (mParent == null) {
-                throw new IllegalArgumentException("Tab not attached to a TabLayout");
-            }
-            return setContentDescription(mParent.getResources().getText(resId));
-        }
-
-        /**
-         * Set a description of this tab's content for use in accessibility support. If no content
-         * description is provided the title will be used.
-         *
-         * @param contentDesc Description of this tab's content
-         * @return The current instance for call chaining
-         * @see #setContentDescription(int)
-         * @see #getContentDescription()
-         */
-        @NonNull
-        public Tab setContentDescription(@Nullable CharSequence contentDesc) {
-            mContentDesc = contentDesc;
-            updateView();
-            return this;
-        }
-
-        /**
-         * Gets a brief description of this tab's content for use in accessibility support.
-         *
-         * @return Description of this tab's content
-         * @see #setContentDescription(CharSequence)
-         * @see #setContentDescription(int)
-         */
-        @Nullable
-        public CharSequence getContentDescription() {
-            return mContentDesc;
-        }
-
-        void updateView() {
-            if (mView != null) {
-                mView.update();
-            }
-        }
-
-        void reset() {
-            mParent = null;
-            mView = null;
-            mTag = null;
-            mIcon = null;
-            mText = null;
-            mContentDesc = null;
-            mPosition = INVALID_POSITION;
-            mCustomView = null;
-        }
-    }
-
-    class TabView extends LinearLayout {
-        private Tab mTab;
-        private TextView mTextView;
-        private ImageView mIconView;
-
-        private View mCustomView;
-        private TextView mCustomTextView;
-        private ImageView mCustomIconView;
-
-        private int mDefaultMaxLines = 2;
-
-        public TabView(Context context) {
-            super(context);
-            if (mTabBackgroundResId != 0) {
-                ViewCompat.setBackground(
-                        this, AppCompatResources.getDrawable(context, mTabBackgroundResId));
-            }
-            ViewCompat.setPaddingRelative(this, mTabPaddingStart, mTabPaddingTop,
-                    mTabPaddingEnd, mTabPaddingBottom);
-            setGravity(Gravity.CENTER);
-            setOrientation(VERTICAL);
-            setClickable(true);
-            ViewCompat.setPointerIcon(this,
-                    PointerIconCompat.getSystemIcon(getContext(), PointerIconCompat.TYPE_HAND));
-        }
-
-        @Override
-        public boolean performClick() {
-            final boolean handled = super.performClick();
-
-            if (mTab != null) {
-                if (!handled) {
-                    playSoundEffect(SoundEffectConstants.CLICK);
-                }
-                mTab.select();
-                return true;
-            } else {
-                return handled;
-            }
-        }
-
-        @Override
-        public void setSelected(final boolean selected) {
-            final boolean changed = isSelected() != selected;
-
-            super.setSelected(selected);
-
-            if (changed && selected && Build.VERSION.SDK_INT < 16) {
-                // Pre-JB we need to manually send the TYPE_VIEW_SELECTED event
-                sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
-            }
-
-            // Always dispatch this to the child views, regardless of whether the value has
-            // changed
-            if (mTextView != null) {
-                mTextView.setSelected(selected);
-            }
-            if (mIconView != null) {
-                mIconView.setSelected(selected);
-            }
-            if (mCustomView != null) {
-                mCustomView.setSelected(selected);
-            }
-        }
-
-        @Override
-        public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
-            super.onInitializeAccessibilityEvent(event);
-            // This view masquerades as an action bar tab.
-            event.setClassName(ActionBar.Tab.class.getName());
-        }
-
-        @Override
-        public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
-            super.onInitializeAccessibilityNodeInfo(info);
-            // This view masquerades as an action bar tab.
-            info.setClassName(ActionBar.Tab.class.getName());
-        }
-
-        @Override
-        public void onMeasure(final int origWidthMeasureSpec, final int origHeightMeasureSpec) {
-            final int specWidthSize = MeasureSpec.getSize(origWidthMeasureSpec);
-            final int specWidthMode = MeasureSpec.getMode(origWidthMeasureSpec);
-            final int maxWidth = getTabMaxWidth();
-
-            final int widthMeasureSpec;
-            final int heightMeasureSpec = origHeightMeasureSpec;
-
-            if (maxWidth > 0 && (specWidthMode == MeasureSpec.UNSPECIFIED
-                    || specWidthSize > maxWidth)) {
-                // If we have a max width and a given spec which is either unspecified or
-                // larger than the max width, update the width spec using the same mode
-                widthMeasureSpec = MeasureSpec.makeMeasureSpec(mTabMaxWidth, MeasureSpec.AT_MOST);
-            } else {
-                // Else, use the original width spec
-                widthMeasureSpec = origWidthMeasureSpec;
-            }
-
-            // Now lets measure
-            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
-            // We need to switch the text size based on whether the text is spanning 2 lines or not
-            if (mTextView != null) {
-                final Resources res = getResources();
-                float textSize = mTabTextSize;
-                int maxLines = mDefaultMaxLines;
-
-                if (mIconView != null && mIconView.getVisibility() == VISIBLE) {
-                    // If the icon view is being displayed, we limit the text to 1 line
-                    maxLines = 1;
-                } else if (mTextView != null && mTextView.getLineCount() > 1) {
-                    // Otherwise when we have text which wraps we reduce the text size
-                    textSize = mTabTextMultiLineSize;
-                }
-
-                final float curTextSize = mTextView.getTextSize();
-                final int curLineCount = mTextView.getLineCount();
-                final int curMaxLines = TextViewCompat.getMaxLines(mTextView);
-
-                if (textSize != curTextSize || (curMaxLines >= 0 && maxLines != curMaxLines)) {
-                    // We've got a new text size and/or max lines...
-                    boolean updateTextView = true;
-
-                    if (mMode == MODE_FIXED && textSize > curTextSize && curLineCount == 1) {
-                        // If we're in fixed mode, going up in text size and currently have 1 line
-                        // then it's very easy to get into an infinite recursion.
-                        // To combat that we check to see if the change in text size
-                        // will cause a line count change. If so, abort the size change and stick
-                        // to the smaller size.
-                        final Layout layout = mTextView.getLayout();
-                        if (layout == null || approximateLineWidth(layout, 0, textSize)
-                                > getMeasuredWidth() - getPaddingLeft() - getPaddingRight()) {
-                            updateTextView = false;
-                        }
-                    }
-
-                    if (updateTextView) {
-                        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
-                        mTextView.setMaxLines(maxLines);
-                        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-                    }
-                }
-            }
-        }
-
-        void setTab(@Nullable final Tab tab) {
-            if (tab != mTab) {
-                mTab = tab;
-                update();
-            }
-        }
-
-        void reset() {
-            setTab(null);
-            setSelected(false);
-        }
-
-        final void update() {
-            final Tab tab = mTab;
-            final View custom = tab != null ? tab.getCustomView() : null;
-            if (custom != null) {
-                final ViewParent customParent = custom.getParent();
-                if (customParent != this) {
-                    if (customParent != null) {
-                        ((ViewGroup) customParent).removeView(custom);
-                    }
-                    addView(custom);
-                }
-                mCustomView = custom;
-                if (mTextView != null) {
-                    mTextView.setVisibility(GONE);
-                }
-                if (mIconView != null) {
-                    mIconView.setVisibility(GONE);
-                    mIconView.setImageDrawable(null);
-                }
-
-                mCustomTextView = (TextView) custom.findViewById(android.R.id.text1);
-                if (mCustomTextView != null) {
-                    mDefaultMaxLines = TextViewCompat.getMaxLines(mCustomTextView);
-                }
-                mCustomIconView = (ImageView) custom.findViewById(android.R.id.icon);
-            } else {
-                // We do not have a custom view. Remove one if it already exists
-                if (mCustomView != null) {
-                    removeView(mCustomView);
-                    mCustomView = null;
-                }
-                mCustomTextView = null;
-                mCustomIconView = null;
-            }
-
-            if (mCustomView == null) {
-                // If there isn't a custom view, we'll us our own in-built layouts
-                if (mIconView == null) {
-                    ImageView iconView = (ImageView) LayoutInflater.from(getContext())
-                            .inflate(R.layout.design_layout_tab_icon, this, false);
-                    addView(iconView, 0);
-                    mIconView = iconView;
-                }
-                if (mTextView == null) {
-                    TextView textView = (TextView) LayoutInflater.from(getContext())
-                            .inflate(R.layout.design_layout_tab_text, this, false);
-                    addView(textView);
-                    mTextView = textView;
-                    mDefaultMaxLines = TextViewCompat.getMaxLines(mTextView);
-                }
-                TextViewCompat.setTextAppearance(mTextView, mTabTextAppearance);
-                if (mTabTextColors != null) {
-                    mTextView.setTextColor(mTabTextColors);
-                }
-                updateTextAndIcon(mTextView, mIconView);
-            } else {
-                // Else, we'll see if there is a TextView or ImageView present and update them
-                if (mCustomTextView != null || mCustomIconView != null) {
-                    updateTextAndIcon(mCustomTextView, mCustomIconView);
-                }
-            }
-
-            // Finally update our selected state
-            setSelected(tab != null && tab.isSelected());
-        }
-
-        private void updateTextAndIcon(@Nullable final TextView textView,
-                @Nullable final ImageView iconView) {
-            final Drawable icon = mTab != null ? mTab.getIcon() : null;
-            final CharSequence text = mTab != null ? mTab.getText() : null;
-            final CharSequence contentDesc = mTab != null ? mTab.getContentDescription() : null;
-
-            if (iconView != null) {
-                if (icon != null) {
-                    iconView.setImageDrawable(icon);
-                    iconView.setVisibility(VISIBLE);
-                    setVisibility(VISIBLE);
-                } else {
-                    iconView.setVisibility(GONE);
-                    iconView.setImageDrawable(null);
-                }
-                iconView.setContentDescription(contentDesc);
-            }
-
-            final boolean hasText = !TextUtils.isEmpty(text);
-            if (textView != null) {
-                if (hasText) {
-                    textView.setText(text);
-                    textView.setVisibility(VISIBLE);
-                    setVisibility(VISIBLE);
-                } else {
-                    textView.setVisibility(GONE);
-                    textView.setText(null);
-                }
-                textView.setContentDescription(contentDesc);
-            }
-
-            if (iconView != null) {
-                MarginLayoutParams lp = ((MarginLayoutParams) iconView.getLayoutParams());
-                int bottomMargin = 0;
-                if (hasText && iconView.getVisibility() == VISIBLE) {
-                    // If we're showing both text and icon, add some margin bottom to the icon
-                    bottomMargin = dpToPx(DEFAULT_GAP_TEXT_ICON);
-                }
-                if (bottomMargin != lp.bottomMargin) {
-                    lp.bottomMargin = bottomMargin;
-                    iconView.requestLayout();
-                }
-            }
-            TooltipCompat.setTooltipText(this, hasText ? null : contentDesc);
-        }
-
-        public Tab getTab() {
-            return mTab;
-        }
-
-        /**
-         * Approximates a given lines width with the new provided text size.
-         */
-        private float approximateLineWidth(Layout layout, int line, float textSize) {
-            return layout.getLineWidth(line) * (textSize / layout.getPaint().getTextSize());
-        }
-    }
-
-    private class SlidingTabStrip extends LinearLayout {
-        private int mSelectedIndicatorHeight;
-        private final Paint mSelectedIndicatorPaint;
-
-        int mSelectedPosition = -1;
-        float mSelectionOffset;
-
-        private int mLayoutDirection = -1;
-
-        private int mIndicatorLeft = -1;
-        private int mIndicatorRight = -1;
-
-        private ValueAnimator mIndicatorAnimator;
-
-        SlidingTabStrip(Context context) {
-            super(context);
-            setWillNotDraw(false);
-            mSelectedIndicatorPaint = new Paint();
-        }
-
-        void setSelectedIndicatorColor(int color) {
-            if (mSelectedIndicatorPaint.getColor() != color) {
-                mSelectedIndicatorPaint.setColor(color);
-                ViewCompat.postInvalidateOnAnimation(this);
-            }
-        }
-
-        void setSelectedIndicatorHeight(int height) {
-            if (mSelectedIndicatorHeight != height) {
-                mSelectedIndicatorHeight = height;
-                ViewCompat.postInvalidateOnAnimation(this);
-            }
-        }
-
-        boolean childrenNeedLayout() {
-            for (int i = 0, z = getChildCount(); i < z; i++) {
-                final View child = getChildAt(i);
-                if (child.getWidth() <= 0) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        void setIndicatorPositionFromTabPosition(int position, float positionOffset) {
-            if (mIndicatorAnimator != null && mIndicatorAnimator.isRunning()) {
-                mIndicatorAnimator.cancel();
-            }
-
-            mSelectedPosition = position;
-            mSelectionOffset = positionOffset;
-            updateIndicatorPosition();
-        }
-
-        float getIndicatorPosition() {
-            return mSelectedPosition + mSelectionOffset;
-        }
-
-        @Override
-        public void onRtlPropertiesChanged(int layoutDirection) {
-            super.onRtlPropertiesChanged(layoutDirection);
-
-            // Workaround for a bug before Android M where LinearLayout did not relayout itself when
-            // layout direction changed.
-            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
-                //noinspection WrongConstant
-                if (mLayoutDirection != layoutDirection) {
-                    requestLayout();
-                    mLayoutDirection = layoutDirection;
-                }
-            }
-        }
-
-        @Override
-        protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
-            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
-            if (MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY) {
-                // HorizontalScrollView will first measure use with UNSPECIFIED, and then with
-                // EXACTLY. Ignore the first call since anything we do will be overwritten anyway
-                return;
-            }
-
-            if (mMode == MODE_FIXED && mTabGravity == GRAVITY_CENTER) {
-                final int count = getChildCount();
-
-                // First we'll find the widest tab
-                int largestTabWidth = 0;
-                for (int i = 0, z = count; i < z; i++) {
-                    View child = getChildAt(i);
-                    if (child.getVisibility() == VISIBLE) {
-                        largestTabWidth = Math.max(largestTabWidth, child.getMeasuredWidth());
-                    }
-                }
-
-                if (largestTabWidth <= 0) {
-                    // If we don't have a largest child yet, skip until the next measure pass
-                    return;
-                }
-
-                final int gutter = dpToPx(FIXED_WRAP_GUTTER_MIN);
-                boolean remeasure = false;
-
-                if (largestTabWidth * count <= getMeasuredWidth() - gutter * 2) {
-                    // If the tabs fit within our width minus gutters, we will set all tabs to have
-                    // the same width
-                    for (int i = 0; i < count; i++) {
-                        final LinearLayout.LayoutParams lp =
-                                (LayoutParams) getChildAt(i).getLayoutParams();
-                        if (lp.width != largestTabWidth || lp.weight != 0) {
-                            lp.width = largestTabWidth;
-                            lp.weight = 0;
-                            remeasure = true;
-                        }
-                    }
-                } else {
-                    // If the tabs will wrap to be larger than the width minus gutters, we need
-                    // to switch to GRAVITY_FILL
-                    mTabGravity = GRAVITY_FILL;
-                    updateTabViews(false);
-                    remeasure = true;
-                }
-
-                if (remeasure) {
-                    // Now re-measure after our changes
-                    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-                }
-            }
-        }
-
-        @Override
-        protected void onLayout(boolean changed, int l, int t, int r, int b) {
-            super.onLayout(changed, l, t, r, b);
-
-            if (mIndicatorAnimator != null && mIndicatorAnimator.isRunning()) {
-                // If we're currently running an animation, lets cancel it and start a
-                // new animation with the remaining duration
-                mIndicatorAnimator.cancel();
-                final long duration = mIndicatorAnimator.getDuration();
-                animateIndicatorToPosition(mSelectedPosition,
-                        Math.round((1f - mIndicatorAnimator.getAnimatedFraction()) * duration));
-            } else {
-                // If we've been layed out, update the indicator position
-                updateIndicatorPosition();
-            }
-        }
-
-        private void updateIndicatorPosition() {
-            final View selectedTitle = getChildAt(mSelectedPosition);
-            int left, right;
-
-            if (selectedTitle != null && selectedTitle.getWidth() > 0) {
-                left = selectedTitle.getLeft();
-                right = selectedTitle.getRight();
-
-                if (mSelectionOffset > 0f && mSelectedPosition < getChildCount() - 1) {
-                    // Draw the selection partway between the tabs
-                    View nextTitle = getChildAt(mSelectedPosition + 1);
-                    left = (int) (mSelectionOffset * nextTitle.getLeft() +
-                            (1.0f - mSelectionOffset) * left);
-                    right = (int) (mSelectionOffset * nextTitle.getRight() +
-                            (1.0f - mSelectionOffset) * right);
-                }
-            } else {
-                left = right = -1;
-            }
-
-            setIndicatorPosition(left, right);
-        }
-
-        void setIndicatorPosition(int left, int right) {
-            if (left != mIndicatorLeft || right != mIndicatorRight) {
-                // If the indicator's left/right has changed, invalidate
-                mIndicatorLeft = left;
-                mIndicatorRight = right;
-                ViewCompat.postInvalidateOnAnimation(this);
-            }
-        }
-
-        void animateIndicatorToPosition(final int position, int duration) {
-            if (mIndicatorAnimator != null && mIndicatorAnimator.isRunning()) {
-                mIndicatorAnimator.cancel();
-            }
-
-            final boolean isRtl = ViewCompat.getLayoutDirection(this)
-                    == ViewCompat.LAYOUT_DIRECTION_RTL;
-
-            final View targetView = getChildAt(position);
-            if (targetView == null) {
-                // If we don't have a view, just update the position now and return
-                updateIndicatorPosition();
-                return;
-            }
-
-            final int targetLeft = targetView.getLeft();
-            final int targetRight = targetView.getRight();
-            final int startLeft;
-            final int startRight;
-
-            if (Math.abs(position - mSelectedPosition) <= 1) {
-                // If the views are adjacent, we'll animate from edge-to-edge
-                startLeft = mIndicatorLeft;
-                startRight = mIndicatorRight;
-            } else {
-                // Else, we'll just grow from the nearest edge
-                final int offset = dpToPx(MOTION_NON_ADJACENT_OFFSET);
-                if (position < mSelectedPosition) {
-                    // We're going end-to-start
-                    if (isRtl) {
-                        startLeft = startRight = targetLeft - offset;
-                    } else {
-                        startLeft = startRight = targetRight + offset;
-                    }
-                } else {
-                    // We're going start-to-end
-                    if (isRtl) {
-                        startLeft = startRight = targetRight + offset;
-                    } else {
-                        startLeft = startRight = targetLeft - offset;
-                    }
-                }
-            }
-
-            if (startLeft != targetLeft || startRight != targetRight) {
-                ValueAnimator animator = mIndicatorAnimator = new ValueAnimator();
-                animator.setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR);
-                animator.setDuration(duration);
-                animator.setFloatValues(0, 1);
-                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-                    @Override
-                    public void onAnimationUpdate(ValueAnimator animator) {
-                        final float fraction = animator.getAnimatedFraction();
-                        setIndicatorPosition(
-                                AnimationUtils.lerp(startLeft, targetLeft, fraction),
-                                AnimationUtils.lerp(startRight, targetRight, fraction));
-                    }
-                });
-                animator.addListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(Animator animator) {
-                        mSelectedPosition = position;
-                        mSelectionOffset = 0f;
-                    }
-                });
-                animator.start();
-            }
-        }
-
-        @Override
-        public void draw(Canvas canvas) {
-            super.draw(canvas);
-
-            // Thick colored underline below the current selection
-            if (mIndicatorLeft >= 0 && mIndicatorRight > mIndicatorLeft) {
-                canvas.drawRect(mIndicatorLeft, getHeight() - mSelectedIndicatorHeight,
-                        mIndicatorRight, getHeight(), mSelectedIndicatorPaint);
-            }
-        }
-    }
-
-    private static ColorStateList createColorStateList(int defaultColor, int selectedColor) {
-        final int[][] states = new int[2][];
-        final int[] colors = new int[2];
-        int i = 0;
-
-        states[i] = SELECTED_STATE_SET;
-        colors[i] = selectedColor;
-        i++;
-
-        // Default enabled state
-        states[i] = EMPTY_STATE_SET;
-        colors[i] = defaultColor;
-        i++;
-
-        return new ColorStateList(states, colors);
-    }
-
-    private int getDefaultHeight() {
-        boolean hasIconAndText = false;
-        for (int i = 0, count = mTabs.size(); i < count; i++) {
-            Tab tab = mTabs.get(i);
-            if (tab != null && tab.getIcon() != null && !TextUtils.isEmpty(tab.getText())) {
-                hasIconAndText = true;
-                break;
-            }
-        }
-        return hasIconAndText ? DEFAULT_HEIGHT_WITH_TEXT_ICON : DEFAULT_HEIGHT;
-    }
-
-    private int getTabMinWidth() {
-        if (mRequestedTabMinWidth != INVALID_WIDTH) {
-            // If we have been given a min width, use it
-            return mRequestedTabMinWidth;
-        }
-        // Else, we'll use the default value
-        return mMode == MODE_SCROLLABLE ? mScrollableTabMinWidth : 0;
-    }
-
-    @Override
-    public LayoutParams generateLayoutParams(AttributeSet attrs) {
-        // We don't care about the layout params of any views added to us, since we don't actually
-        // add them. The only view we add is the SlidingTabStrip, which is done manually.
-        // We return the default layout params so that we don't blow up if we're given a TabItem
-        // without android:layout_* values.
-        return generateDefaultLayoutParams();
-    }
-
-    int getTabMaxWidth() {
-        return mTabMaxWidth;
-    }
-
-    /**
-     * A {@link ViewPager.OnPageChangeListener} class which contains the
-     * necessary calls back to the provided {@link TabLayout} so that the tab position is
-     * kept in sync.
-     *
-     * <p>This class stores the provided TabLayout weakly, meaning that you can use
-     * {@link ViewPager#addOnPageChangeListener(ViewPager.OnPageChangeListener)
-     * addOnPageChangeListener(OnPageChangeListener)} without removing the listener and
-     * not cause a leak.
-     */
-    public static class TabLayoutOnPageChangeListener implements ViewPager.OnPageChangeListener {
-        private final WeakReference<TabLayout> mTabLayoutRef;
-        private int mPreviousScrollState;
-        private int mScrollState;
-
-        public TabLayoutOnPageChangeListener(TabLayout tabLayout) {
-            mTabLayoutRef = new WeakReference<>(tabLayout);
-        }
-
-        @Override
-        public void onPageScrollStateChanged(final int state) {
-            mPreviousScrollState = mScrollState;
-            mScrollState = state;
-        }
-
-        @Override
-        public void onPageScrolled(final int position, final float positionOffset,
-                final int positionOffsetPixels) {
-            final TabLayout tabLayout = mTabLayoutRef.get();
-            if (tabLayout != null) {
-                // Only update the text selection if we're not settling, or we are settling after
-                // being dragged
-                final boolean updateText = mScrollState != SCROLL_STATE_SETTLING ||
-                        mPreviousScrollState == SCROLL_STATE_DRAGGING;
-                // Update the indicator if we're not settling after being idle. This is caused
-                // from a setCurrentItem() call and will be handled by an animation from
-                // onPageSelected() instead.
-                final boolean updateIndicator = !(mScrollState == SCROLL_STATE_SETTLING
-                        && mPreviousScrollState == SCROLL_STATE_IDLE);
-                tabLayout.setScrollPosition(position, positionOffset, updateText, updateIndicator);
-            }
-        }
-
-        @Override
-        public void onPageSelected(final int position) {
-            final TabLayout tabLayout = mTabLayoutRef.get();
-            if (tabLayout != null && tabLayout.getSelectedTabPosition() != position
-                    && position < tabLayout.getTabCount()) {
-                // Select the tab, only updating the indicator if we're not being dragged/settled
-                // (since onPageScrolled will handle that).
-                final boolean updateIndicator = mScrollState == SCROLL_STATE_IDLE
-                        || (mScrollState == SCROLL_STATE_SETTLING
-                        && mPreviousScrollState == SCROLL_STATE_IDLE);
-                tabLayout.selectTab(tabLayout.getTabAt(position), updateIndicator);
-            }
-        }
-
-        void reset() {
-            mPreviousScrollState = mScrollState = SCROLL_STATE_IDLE;
-        }
-    }
-
-    /**
-     * A {@link TabLayout.OnTabSelectedListener} class which contains the necessary calls back
-     * to the provided {@link ViewPager} so that the tab position is kept in sync.
-     */
-    public static class ViewPagerOnTabSelectedListener implements TabLayout.OnTabSelectedListener {
-        private final ViewPager mViewPager;
-
-        public ViewPagerOnTabSelectedListener(ViewPager viewPager) {
-            mViewPager = viewPager;
-        }
-
-        @Override
-        public void onTabSelected(TabLayout.Tab tab) {
-            mViewPager.setCurrentItem(tab.getPosition());
-        }
-
-        @Override
-        public void onTabUnselected(TabLayout.Tab tab) {
-            // No-op
-        }
-
-        @Override
-        public void onTabReselected(TabLayout.Tab tab) {
-            // No-op
-        }
-    }
-
-    private class PagerAdapterObserver extends DataSetObserver {
-        PagerAdapterObserver() {
-        }
-
-        @Override
-        public void onChanged() {
-            populateFromPagerAdapter();
-        }
-
-        @Override
-        public void onInvalidated() {
-            populateFromPagerAdapter();
-        }
-    }
-
-    private class AdapterChangeListener implements ViewPager.OnAdapterChangeListener {
-        private boolean mAutoRefresh;
-
-        AdapterChangeListener() {
-        }
-
-        @Override
-        public void onAdapterChanged(@NonNull ViewPager viewPager,
-                @Nullable PagerAdapter oldAdapter, @Nullable PagerAdapter newAdapter) {
-            if (mViewPager == viewPager) {
-                setPagerAdapter(newAdapter, mAutoRefresh);
-            }
-        }
-
-        void setAutoRefresh(boolean autoRefresh) {
-            mAutoRefresh = autoRefresh;
-        }
-    }
-}
diff --git a/design/src/android/support/design/widget/TextInputEditText.java b/design/src/android/support/design/widget/TextInputEditText.java
deleted file mode 100644
index ee6c32c..0000000
--- a/design/src/android/support/design/widget/TextInputEditText.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.content.Context;
-import android.support.v7.widget.AppCompatEditText;
-import android.support.v7.widget.WithHint;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewParent;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputConnection;
-
-/**
- * A special sub-class of {@link android.widget.EditText} designed for use as a child of
- * {@link TextInputLayout}.
- *
- * <p>Using this class allows us to display a hint in the IME when in 'extract' mode.</p>
- */
-public class TextInputEditText extends AppCompatEditText {
-
-    public TextInputEditText(Context context) {
-        super(context);
-    }
-
-    public TextInputEditText(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public TextInputEditText(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-    }
-
-    @Override
-    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
-        final InputConnection ic = super.onCreateInputConnection(outAttrs);
-        if (ic != null && outAttrs.hintText == null) {
-            // If we don't have a hint and our parent implements WithHint, use its hint for the
-            // EditorInfo. This allows us to display a hint in 'extract mode'.
-            ViewParent parent = getParent();
-            while (parent instanceof View) {
-                if (parent instanceof WithHint) {
-                    outAttrs.hintText = ((WithHint) parent).getHint();
-                    break;
-                }
-                parent = parent.getParent();
-            }
-        }
-        return ic;
-    }
-}
diff --git a/design/src/android/support/design/widget/TextInputLayout.java b/design/src/android/support/design/widget/TextInputLayout.java
deleted file mode 100644
index 0540678..0000000
--- a/design/src/android/support/design/widget/TextInputLayout.java
+++ /dev/null
@@ -1,1530 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.graphics.Typeface;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.DrawableContainer;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.StringRes;
-import android.support.annotation.StyleRes;
-import android.support.annotation.VisibleForTesting;
-import android.support.design.R;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.graphics.drawable.DrawableCompat;
-import android.support.v4.view.AbsSavedState;
-import android.support.v4.view.AccessibilityDelegateCompat;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.support.v4.widget.Space;
-import android.support.v4.widget.TextViewCompat;
-import android.support.v4.widget.ViewGroupUtils;
-import android.support.v7.content.res.AppCompatResources;
-import android.support.v7.widget.AppCompatDrawableManager;
-import android.support.v7.widget.AppCompatTextView;
-import android.support.v7.widget.TintTypedArray;
-import android.support.v7.widget.WithHint;
-import android.text.Editable;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.text.method.PasswordTransformationMethod;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewStructure;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.animation.AccelerateInterpolator;
-import android.widget.EditText;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-/**
- * Layout which wraps an {@link android.widget.EditText} (or descendant) to show a floating label
- * when the hint is hidden due to the user inputting text.
- *
- * <p>Also supports showing an error via {@link #setErrorEnabled(boolean)} and
- * {@link #setError(CharSequence)}, and a character counter via
- * {@link #setCounterEnabled(boolean)}.</p>
- *
- * <p>Password visibility toggling is also supported via the
- * {@link #setPasswordVisibilityToggleEnabled(boolean)} API and related attribute.
- * If enabled, a button is displayed to toggle between the password being displayed as plain-text
- * or disguised, when your EditText is set to display a password.</p>
- *
- * <p><strong>Note:</strong> When using the password toggle functionality, the 'end' compound
- * drawable of the EditText will be overridden while the toggle is enabled. To ensure that any
- * existing drawables are restored correctly, you should set those compound drawables relatively
- * (start/end), opposed to absolutely (left/right).</p>
- *
- * The {@link TextInputEditText} class is provided to be used as a child of this layout. Using
- * TextInputEditText allows TextInputLayout greater control over the visual aspects of any
- * text input. An example usage is as so:
- *
- * <pre>
- * &lt;android.support.design.widget.TextInputLayout
- *         android:layout_width=&quot;match_parent&quot;
- *         android:layout_height=&quot;wrap_content&quot;&gt;
- *
- *     &lt;android.support.design.widget.TextInputEditText
- *             android:layout_width=&quot;match_parent&quot;
- *             android:layout_height=&quot;wrap_content&quot;
- *             android:hint=&quot;@string/form_username&quot;/&gt;
- *
- * &lt;/android.support.design.widget.TextInputLayout&gt;
- * </pre>
- *
- * <p><strong>Note:</strong> The actual view hierarchy present under TextInputLayout is
- * <strong>NOT</strong> guaranteed to match the view hierarchy as written in XML. As a result,
- * calls to getParent() on children of the TextInputLayout -- such as an TextInputEditText --
- * may not return the TextInputLayout itself, but rather an intermediate View. If you need
- * to access a View directly, set an {@code android:id} and use {@link View#findViewById(int)}.
- */
-public class TextInputLayout extends LinearLayout implements WithHint {
-
-    private static final int ANIMATION_DURATION = 200;
-    private static final int INVALID_MAX_LENGTH = -1;
-
-    private static final String LOG_TAG = "TextInputLayout";
-
-    private final FrameLayout mInputFrame;
-    EditText mEditText;
-    private CharSequence mOriginalHint;
-
-    private boolean mHintEnabled;
-    private CharSequence mHint;
-
-    private Paint mTmpPaint;
-    private final Rect mTmpRect = new Rect();
-
-    private LinearLayout mIndicatorArea;
-    private int mIndicatorsAdded;
-
-    private Typeface mTypeface;
-
-    private boolean mErrorEnabled;
-    TextView mErrorView;
-    private int mErrorTextAppearance;
-    private boolean mErrorShown;
-    private CharSequence mError;
-
-    boolean mCounterEnabled;
-    private TextView mCounterView;
-    private int mCounterMaxLength;
-    private int mCounterTextAppearance;
-    private int mCounterOverflowTextAppearance;
-    private boolean mCounterOverflowed;
-
-    private boolean mPasswordToggleEnabled;
-    private Drawable mPasswordToggleDrawable;
-    private CharSequence mPasswordToggleContentDesc;
-    private CheckableImageButton mPasswordToggleView;
-    private boolean mPasswordToggledVisible;
-    private Drawable mPasswordToggleDummyDrawable;
-    private Drawable mOriginalEditTextEndDrawable;
-
-    private ColorStateList mPasswordToggleTintList;
-    private boolean mHasPasswordToggleTintList;
-    private PorterDuff.Mode mPasswordToggleTintMode;
-    private boolean mHasPasswordToggleTintMode;
-
-    private ColorStateList mDefaultTextColor;
-    private ColorStateList mFocusedTextColor;
-
-    // Only used for testing
-    private boolean mHintExpanded;
-
-    final CollapsingTextHelper mCollapsingTextHelper = new CollapsingTextHelper(this);
-
-    private boolean mHintAnimationEnabled;
-    private ValueAnimator mAnimator;
-
-    private boolean mHasReconstructedEditTextBackground;
-    private boolean mInDrawableStateChanged;
-
-    private boolean mRestoringSavedState;
-
-    public TextInputLayout(Context context) {
-        this(context, null);
-    }
-
-    public TextInputLayout(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public TextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) {
-        // Can't call through to super(Context, AttributeSet, int) since it doesn't exist on API 10
-        super(context, attrs);
-
-        ThemeUtils.checkAppCompatTheme(context);
-
-        setOrientation(VERTICAL);
-        setWillNotDraw(false);
-        setAddStatesFromChildren(true);
-
-        mInputFrame = new FrameLayout(context);
-        mInputFrame.setAddStatesFromChildren(true);
-        addView(mInputFrame);
-
-        mCollapsingTextHelper.setTextSizeInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR);
-        mCollapsingTextHelper.setPositionInterpolator(new AccelerateInterpolator());
-        mCollapsingTextHelper.setCollapsedTextGravity(Gravity.TOP | GravityCompat.START);
-
-        final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs,
-                R.styleable.TextInputLayout, defStyleAttr, R.style.Widget_Design_TextInputLayout);
-        mHintEnabled = a.getBoolean(R.styleable.TextInputLayout_hintEnabled, true);
-        setHint(a.getText(R.styleable.TextInputLayout_android_hint));
-        mHintAnimationEnabled = a.getBoolean(
-                R.styleable.TextInputLayout_hintAnimationEnabled, true);
-
-        if (a.hasValue(R.styleable.TextInputLayout_android_textColorHint)) {
-            mDefaultTextColor = mFocusedTextColor =
-                    a.getColorStateList(R.styleable.TextInputLayout_android_textColorHint);
-        }
-
-        final int hintAppearance = a.getResourceId(
-                R.styleable.TextInputLayout_hintTextAppearance, -1);
-        if (hintAppearance != -1) {
-            setHintTextAppearance(
-                    a.getResourceId(R.styleable.TextInputLayout_hintTextAppearance, 0));
-        }
-
-        mErrorTextAppearance = a.getResourceId(R.styleable.TextInputLayout_errorTextAppearance, 0);
-        final boolean errorEnabled = a.getBoolean(R.styleable.TextInputLayout_errorEnabled, false);
-
-        final boolean counterEnabled = a.getBoolean(
-                R.styleable.TextInputLayout_counterEnabled, false);
-        setCounterMaxLength(
-                a.getInt(R.styleable.TextInputLayout_counterMaxLength, INVALID_MAX_LENGTH));
-        mCounterTextAppearance = a.getResourceId(
-                R.styleable.TextInputLayout_counterTextAppearance, 0);
-        mCounterOverflowTextAppearance = a.getResourceId(
-                R.styleable.TextInputLayout_counterOverflowTextAppearance, 0);
-
-        mPasswordToggleEnabled = a.getBoolean(
-                R.styleable.TextInputLayout_passwordToggleEnabled, false);
-        mPasswordToggleDrawable = a.getDrawable(R.styleable.TextInputLayout_passwordToggleDrawable);
-        mPasswordToggleContentDesc = a.getText(
-                R.styleable.TextInputLayout_passwordToggleContentDescription);
-        if (a.hasValue(R.styleable.TextInputLayout_passwordToggleTint)) {
-            mHasPasswordToggleTintList = true;
-            mPasswordToggleTintList = a.getColorStateList(
-                    R.styleable.TextInputLayout_passwordToggleTint);
-        }
-        if (a.hasValue(R.styleable.TextInputLayout_passwordToggleTintMode)) {
-            mHasPasswordToggleTintMode = true;
-            mPasswordToggleTintMode = ViewUtils.parseTintMode(
-                    a.getInt(R.styleable.TextInputLayout_passwordToggleTintMode, -1), null);
-        }
-
-        a.recycle();
-
-        setErrorEnabled(errorEnabled);
-        setCounterEnabled(counterEnabled);
-        applyPasswordToggleTint();
-
-        if (ViewCompat.getImportantForAccessibility(this)
-                == ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
-            // Make sure we're important for accessibility if we haven't been explicitly not
-            ViewCompat.setImportantForAccessibility(this,
-                    ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
-        }
-
-        ViewCompat.setAccessibilityDelegate(this, new TextInputAccessibilityDelegate());
-    }
-
-    @Override
-    public void addView(View child, int index, final ViewGroup.LayoutParams params) {
-        if (child instanceof EditText) {
-            // Make sure that the EditText is vertically at the bottom, so that it sits on the
-            // EditText's underline
-            FrameLayout.LayoutParams flp = new FrameLayout.LayoutParams(params);
-            flp.gravity = Gravity.CENTER_VERTICAL | (flp.gravity & ~Gravity.VERTICAL_GRAVITY_MASK);
-            mInputFrame.addView(child, flp);
-
-            // Now use the EditText's LayoutParams as our own and update them to make enough space
-            // for the label
-            mInputFrame.setLayoutParams(params);
-            updateInputLayoutMargins();
-
-            setEditText((EditText) child);
-        } else {
-            // Carry on adding the View...
-            super.addView(child, index, params);
-        }
-    }
-
-    /**
-     * Set the typeface to use for the hint and any label views (such as counter and error views).
-     *
-     * @param typeface typeface to use, or {@code null} to use the default.
-     */
-    public void setTypeface(@Nullable Typeface typeface) {
-        if ((mTypeface != null && !mTypeface.equals(typeface))
-                || (mTypeface == null && typeface != null)) {
-            mTypeface = typeface;
-
-            mCollapsingTextHelper.setTypefaces(typeface);
-            if (mCounterView != null) {
-                mCounterView.setTypeface(typeface);
-            }
-            if (mErrorView != null) {
-                mErrorView.setTypeface(typeface);
-            }
-        }
-    }
-
-    /**
-     * Returns the typeface used for the hint and any label views (such as counter and error views).
-     */
-    @NonNull
-    public Typeface getTypeface() {
-        return mTypeface;
-    }
-
-    @Override
-    public void dispatchProvideAutofillStructure(ViewStructure structure, int flags) {
-        if (mOriginalHint == null || mEditText == null) {
-            super.dispatchProvideAutofillStructure(structure, flags);
-            return;
-        }
-
-        // Temporarily sets child's hint to its original value so it is properly set in the
-        // child's ViewStructure.
-        final CharSequence hint = mEditText.getHint();
-        mEditText.setHint(mOriginalHint);
-        try {
-            super.dispatchProvideAutofillStructure(structure, flags);
-        } finally {
-            mEditText.setHint(hint);
-        }
-    }
-
-    private void setEditText(EditText editText) {
-        // If we already have an EditText, throw an exception
-        if (mEditText != null) {
-            throw new IllegalArgumentException("We already have an EditText, can only have one");
-        }
-
-        if (!(editText instanceof TextInputEditText)) {
-            Log.i(LOG_TAG, "EditText added is not a TextInputEditText. Please switch to using that"
-                    + " class instead.");
-        }
-
-        mEditText = editText;
-
-        final boolean hasPasswordTransformation = hasPasswordTransformation();
-
-        // Use the EditText's typeface, and it's text size for our expanded text
-        if (!hasPasswordTransformation) {
-            // We don't want a monospace font just because we have a password field
-            mCollapsingTextHelper.setTypefaces(mEditText.getTypeface());
-        }
-        mCollapsingTextHelper.setExpandedTextSize(mEditText.getTextSize());
-
-        final int editTextGravity = mEditText.getGravity();
-        mCollapsingTextHelper.setCollapsedTextGravity(
-                Gravity.TOP | (editTextGravity & ~Gravity.VERTICAL_GRAVITY_MASK));
-        mCollapsingTextHelper.setExpandedTextGravity(editTextGravity);
-
-        // Add a TextWatcher so that we know when the text input has changed
-        mEditText.addTextChangedListener(new TextWatcher() {
-            @Override
-            public void afterTextChanged(Editable s) {
-                updateLabelState(!mRestoringSavedState);
-                if (mCounterEnabled) {
-                    updateCounter(s.length());
-                }
-            }
-
-            @Override
-            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
-
-            @Override
-            public void onTextChanged(CharSequence s, int start, int before, int count) {}
-        });
-
-        // Use the EditText's hint colors if we don't have one set
-        if (mDefaultTextColor == null) {
-            mDefaultTextColor = mEditText.getHintTextColors();
-        }
-
-        // If we do not have a valid hint, try and retrieve it from the EditText, if enabled
-        if (mHintEnabled && TextUtils.isEmpty(mHint)) {
-            // Save the hint so it can be restored on dispatchProvideAutofillStructure();
-            mOriginalHint = mEditText.getHint();
-            setHint(mOriginalHint);
-            // Clear the EditText's hint as we will display it ourselves
-            mEditText.setHint(null);
-        }
-
-        if (mCounterView != null) {
-            updateCounter(mEditText.getText().length());
-        }
-
-        if (mIndicatorArea != null) {
-            adjustIndicatorPadding();
-        }
-
-        updatePasswordToggleView();
-
-        // Update the label visibility with no animation, but force a state change
-        updateLabelState(false, true);
-    }
-
-    private void updateInputLayoutMargins() {
-        // Create/update the LayoutParams so that we can add enough top margin
-        // to the EditText so make room for the label
-        final LayoutParams lp = (LayoutParams) mInputFrame.getLayoutParams();
-        final int newTopMargin;
-
-        if (mHintEnabled) {
-            if (mTmpPaint == null) {
-                mTmpPaint = new Paint();
-            }
-            mTmpPaint.setTypeface(mCollapsingTextHelper.getCollapsedTypeface());
-            mTmpPaint.setTextSize(mCollapsingTextHelper.getCollapsedTextSize());
-            newTopMargin = (int) -mTmpPaint.ascent();
-        } else {
-            newTopMargin = 0;
-        }
-
-        if (newTopMargin != lp.topMargin) {
-            lp.topMargin = newTopMargin;
-            mInputFrame.requestLayout();
-        }
-    }
-
-    void updateLabelState(boolean animate) {
-        updateLabelState(animate, false);
-    }
-
-    void updateLabelState(final boolean animate, final boolean force) {
-        final boolean isEnabled = isEnabled();
-        final boolean hasText = mEditText != null && !TextUtils.isEmpty(mEditText.getText());
-        final boolean isFocused = arrayContains(getDrawableState(), android.R.attr.state_focused);
-        final boolean isErrorShowing = !TextUtils.isEmpty(getError());
-
-        if (mDefaultTextColor != null) {
-            mCollapsingTextHelper.setExpandedTextColor(mDefaultTextColor);
-        }
-
-        if (isEnabled && mCounterOverflowed && mCounterView != null) {
-            mCollapsingTextHelper.setCollapsedTextColor(mCounterView.getTextColors());
-        } else if (isEnabled && isFocused && mFocusedTextColor != null) {
-            mCollapsingTextHelper.setCollapsedTextColor(mFocusedTextColor);
-        } else if (mDefaultTextColor != null) {
-            mCollapsingTextHelper.setCollapsedTextColor(mDefaultTextColor);
-        }
-
-        if (hasText || (isEnabled() && (isFocused || isErrorShowing))) {
-            // We should be showing the label so do so if it isn't already
-            if (force || mHintExpanded) {
-                collapseHint(animate);
-            }
-        } else {
-            // We should not be showing the label so hide it
-            if (force || !mHintExpanded) {
-                expandHint(animate);
-            }
-        }
-    }
-
-    /**
-     * Returns the {@link android.widget.EditText} used for text input.
-     */
-    @Nullable
-    public EditText getEditText() {
-        return mEditText;
-    }
-
-    /**
-     * Set the hint to be displayed in the floating label, if enabled.
-     *
-     * @see #setHintEnabled(boolean)
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_android_hint
-     */
-    public void setHint(@Nullable CharSequence hint) {
-        if (mHintEnabled) {
-            setHintInternal(hint);
-            sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
-        }
-    }
-
-    private void setHintInternal(CharSequence hint) {
-        mHint = hint;
-        mCollapsingTextHelper.setText(hint);
-    }
-
-    /**
-     * Returns the hint which is displayed in the floating label, if enabled.
-     *
-     * @return the hint, or null if there isn't one set, or the hint is not enabled.
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_android_hint
-     */
-    @Override
-    @Nullable
-    public CharSequence getHint() {
-        return mHintEnabled ? mHint : null;
-    }
-
-    /**
-     * Sets whether the floating label functionality is enabled or not in this layout.
-     *
-     * <p>If enabled, any non-empty hint in the child EditText will be moved into the floating
-     * hint, and its existing hint will be cleared. If disabled, then any non-empty floating hint
-     * in this layout will be moved into the EditText, and this layout's hint will be cleared.</p>
-     *
-     * @see #setHint(CharSequence)
-     * @see #isHintEnabled()
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_hintEnabled
-     */
-    public void setHintEnabled(boolean enabled) {
-        if (enabled != mHintEnabled) {
-            mHintEnabled = enabled;
-
-            final CharSequence editTextHint = mEditText.getHint();
-            if (!mHintEnabled) {
-                if (!TextUtils.isEmpty(mHint) && TextUtils.isEmpty(editTextHint)) {
-                    // If the hint is disabled, but we have a hint set, and the EditText doesn't,
-                    // pass it through...
-                    mEditText.setHint(mHint);
-                }
-                // Now clear out any set hint
-                setHintInternal(null);
-            } else {
-                if (!TextUtils.isEmpty(editTextHint)) {
-                    // If the hint is now enabled and the EditText has one set, we'll use it if
-                    // we don't already have one, and clear the EditText's
-                    if (TextUtils.isEmpty(mHint)) {
-                        setHint(editTextHint);
-                    }
-                    mEditText.setHint(null);
-                }
-            }
-
-            // Now update the EditText top margin
-            if (mEditText != null) {
-                updateInputLayoutMargins();
-            }
-        }
-    }
-
-    /**
-     * Returns whether the floating label functionality is enabled or not in this layout.
-     *
-     * @see #setHintEnabled(boolean)
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_hintEnabled
-     */
-    public boolean isHintEnabled() {
-        return mHintEnabled;
-    }
-
-    /**
-     * Sets the hint text color, size, style from the specified TextAppearance resource.
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_hintTextAppearance
-     */
-    public void setHintTextAppearance(@StyleRes int resId) {
-        mCollapsingTextHelper.setCollapsedTextAppearance(resId);
-        mFocusedTextColor = mCollapsingTextHelper.getCollapsedTextColor();
-
-        if (mEditText != null) {
-            updateLabelState(false);
-            // Text size might have changed so update the top margin
-            updateInputLayoutMargins();
-        }
-    }
-
-    private void addIndicator(TextView indicator, int index) {
-        if (mIndicatorArea == null) {
-            mIndicatorArea = new LinearLayout(getContext());
-            mIndicatorArea.setOrientation(LinearLayout.HORIZONTAL);
-            addView(mIndicatorArea, LinearLayout.LayoutParams.MATCH_PARENT,
-                    LinearLayout.LayoutParams.WRAP_CONTENT);
-
-            // Add a flexible spacer in the middle so that the left/right views stay pinned
-            final Space spacer = new Space(getContext());
-            final LinearLayout.LayoutParams spacerLp = new LinearLayout.LayoutParams(0, 0, 1f);
-            mIndicatorArea.addView(spacer, spacerLp);
-
-            if (mEditText != null) {
-                adjustIndicatorPadding();
-            }
-        }
-        mIndicatorArea.setVisibility(View.VISIBLE);
-        mIndicatorArea.addView(indicator, index);
-        mIndicatorsAdded++;
-    }
-
-    private void adjustIndicatorPadding() {
-        // Add padding to the error and character counter so that they match the EditText
-        ViewCompat.setPaddingRelative(mIndicatorArea, ViewCompat.getPaddingStart(mEditText),
-                0, ViewCompat.getPaddingEnd(mEditText), mEditText.getPaddingBottom());
-    }
-
-    private void removeIndicator(TextView indicator) {
-        if (mIndicatorArea != null) {
-            mIndicatorArea.removeView(indicator);
-            if (--mIndicatorsAdded == 0) {
-                mIndicatorArea.setVisibility(View.GONE);
-            }
-        }
-    }
-
-    /**
-     * Whether the error functionality is enabled or not in this layout. Enabling this
-     * functionality before setting an error message via {@link #setError(CharSequence)}, will mean
-     * that this layout will not change size when an error is displayed.
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_errorEnabled
-     */
-    public void setErrorEnabled(boolean enabled) {
-        if (mErrorEnabled != enabled) {
-            if (mErrorView != null) {
-                mErrorView.animate().cancel();
-            }
-
-            if (enabled) {
-                mErrorView = new AppCompatTextView(getContext());
-                mErrorView.setId(R.id.textinput_error);
-                if (mTypeface != null) {
-                    mErrorView.setTypeface(mTypeface);
-                }
-                boolean useDefaultColor = false;
-                try {
-                    TextViewCompat.setTextAppearance(mErrorView, mErrorTextAppearance);
-
-                    if (Build.VERSION.SDK_INT >= 23
-                            && mErrorView.getTextColors().getDefaultColor() == Color.MAGENTA) {
-                        // Caused by our theme not extending from Theme.Design*. On API 23 and
-                        // above, unresolved theme attrs result in MAGENTA rather than an exception.
-                        // Flag so that we use a decent default
-                        useDefaultColor = true;
-                    }
-                } catch (Exception e) {
-                    // Caused by our theme not extending from Theme.Design*. Flag so that we use
-                    // a decent default
-                    useDefaultColor = true;
-                }
-                if (useDefaultColor) {
-                    // Probably caused by our theme not extending from Theme.Design*. Instead
-                    // we manually set something appropriate
-                    TextViewCompat.setTextAppearance(mErrorView,
-                            android.support.v7.appcompat.R.style.TextAppearance_AppCompat_Caption);
-                    mErrorView.setTextColor(ContextCompat.getColor(getContext(),
-                            android.support.v7.appcompat.R.color.error_color_material));
-                }
-                mErrorView.setVisibility(INVISIBLE);
-                ViewCompat.setAccessibilityLiveRegion(mErrorView,
-                        ViewCompat.ACCESSIBILITY_LIVE_REGION_POLITE);
-                addIndicator(mErrorView, 0);
-            } else {
-                mErrorShown = false;
-                updateEditTextBackground();
-                removeIndicator(mErrorView);
-                mErrorView = null;
-            }
-            mErrorEnabled = enabled;
-        }
-    }
-
-    /**
-     * Sets the text color and size for the error message from the specified
-     * TextAppearance resource.
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_errorTextAppearance
-     */
-    public void setErrorTextAppearance(@StyleRes int resId) {
-        mErrorTextAppearance = resId;
-        if (mErrorView != null) {
-            TextViewCompat.setTextAppearance(mErrorView, resId);
-        }
-    }
-
-    /**
-     * Returns whether the error functionality is enabled or not in this layout.
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_errorEnabled
-     *
-     * @see #setErrorEnabled(boolean)
-     */
-    public boolean isErrorEnabled() {
-        return mErrorEnabled;
-    }
-
-    /**
-     * Sets an error message that will be displayed below our {@link EditText}. If the
-     * {@code error} is {@code null}, the error message will be cleared.
-     * <p>
-     * If the error functionality has not been enabled via {@link #setErrorEnabled(boolean)}, then
-     * it will be automatically enabled if {@code error} is not empty.
-     *
-     * @param error Error message to display, or null to clear
-     *
-     * @see #getError()
-     */
-    public void setError(@Nullable final CharSequence error) {
-        // Only animate if we're enabled, laid out, and we have a different error message
-        setError(error, ViewCompat.isLaidOut(this) && isEnabled()
-                && (mErrorView == null || !TextUtils.equals(mErrorView.getText(), error)));
-    }
-
-    private void setError(@Nullable final CharSequence error, final boolean animate) {
-        mError = error;
-
-        if (!mErrorEnabled) {
-            if (TextUtils.isEmpty(error)) {
-                // If error isn't enabled, and the error is empty, just return
-                return;
-            }
-            // Else, we'll assume that they want to enable the error functionality
-            setErrorEnabled(true);
-        }
-
-        mErrorShown = !TextUtils.isEmpty(error);
-
-        // Cancel any on-going animation
-        mErrorView.animate().cancel();
-
-        if (mErrorShown) {
-            mErrorView.setText(error);
-            mErrorView.setVisibility(VISIBLE);
-
-            if (animate) {
-                if (mErrorView.getAlpha() == 1f) {
-                    // If it's currently 100% show, we'll animate it from 0
-                    mErrorView.setAlpha(0f);
-                }
-                mErrorView.animate()
-                        .alpha(1f)
-                        .setDuration(ANIMATION_DURATION)
-                        .setInterpolator(AnimationUtils.LINEAR_OUT_SLOW_IN_INTERPOLATOR)
-                        .setListener(new AnimatorListenerAdapter() {
-                            @Override
-                            public void onAnimationStart(Animator animator) {
-                                mErrorView.setVisibility(VISIBLE);
-                            }
-                        }).start();
-            } else {
-                // Set alpha to 1f, just in case
-                mErrorView.setAlpha(1f);
-            }
-        } else {
-            if (mErrorView.getVisibility() == VISIBLE) {
-                if (animate) {
-                    mErrorView.animate()
-                            .alpha(0f)
-                            .setDuration(ANIMATION_DURATION)
-                            .setInterpolator(AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR)
-                            .setListener(new AnimatorListenerAdapter() {
-                                @Override
-                                public void onAnimationEnd(Animator animator) {
-                                    mErrorView.setText(error);
-                                    mErrorView.setVisibility(INVISIBLE);
-                                }
-                            }).start();
-                } else {
-                    mErrorView.setText(error);
-                    mErrorView.setVisibility(INVISIBLE);
-                }
-            }
-        }
-
-        updateEditTextBackground();
-        updateLabelState(animate);
-    }
-
-    /**
-     * Whether the character counter functionality is enabled or not in this layout.
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_counterEnabled
-     */
-    public void setCounterEnabled(boolean enabled) {
-        if (mCounterEnabled != enabled) {
-            if (enabled) {
-                mCounterView = new AppCompatTextView(getContext());
-                mCounterView.setId(R.id.textinput_counter);
-                if (mTypeface != null) {
-                    mCounterView.setTypeface(mTypeface);
-                }
-                mCounterView.setMaxLines(1);
-                try {
-                    TextViewCompat.setTextAppearance(mCounterView, mCounterTextAppearance);
-                } catch (Exception e) {
-                    // Probably caused by our theme not extending from Theme.Design*. Instead
-                    // we manually set something appropriate
-                    TextViewCompat.setTextAppearance(mCounterView,
-                            android.support.v7.appcompat.R.style.TextAppearance_AppCompat_Caption);
-                    mCounterView.setTextColor(ContextCompat.getColor(getContext(),
-                            android.support.v7.appcompat.R.color.error_color_material));
-                }
-                addIndicator(mCounterView, -1);
-                if (mEditText == null) {
-                    updateCounter(0);
-                } else {
-                    updateCounter(mEditText.getText().length());
-                }
-            } else {
-                removeIndicator(mCounterView);
-                mCounterView = null;
-            }
-            mCounterEnabled = enabled;
-        }
-    }
-
-    /**
-     * Returns whether the character counter functionality is enabled or not in this layout.
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_counterEnabled
-     *
-     * @see #setCounterEnabled(boolean)
-     */
-    public boolean isCounterEnabled() {
-        return mCounterEnabled;
-    }
-
-    /**
-     * Sets the max length to display at the character counter.
-     *
-     * @param maxLength maxLength to display. Any value less than or equal to 0 will not be shown.
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_counterMaxLength
-     */
-    public void setCounterMaxLength(int maxLength) {
-        if (mCounterMaxLength != maxLength) {
-            if (maxLength > 0) {
-                mCounterMaxLength = maxLength;
-            } else {
-                mCounterMaxLength = INVALID_MAX_LENGTH;
-            }
-            if (mCounterEnabled) {
-                updateCounter(mEditText == null ? 0 : mEditText.getText().length());
-            }
-        }
-    }
-
-    @Override
-    public void setEnabled(boolean enabled) {
-        // Since we're set to addStatesFromChildren, we need to make sure that we set all
-        // children to enabled/disabled otherwise any enabled children will wipe out our disabled
-        // drawable state
-        recursiveSetEnabled(this, enabled);
-        super.setEnabled(enabled);
-    }
-
-    private static void recursiveSetEnabled(final ViewGroup vg, final boolean enabled) {
-        for (int i = 0, count = vg.getChildCount(); i < count; i++) {
-            final View child = vg.getChildAt(i);
-            child.setEnabled(enabled);
-            if (child instanceof ViewGroup) {
-                recursiveSetEnabled((ViewGroup) child, enabled);
-            }
-        }
-    }
-
-    /**
-     * Returns the max length shown at the character counter.
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_counterMaxLength
-     */
-    public int getCounterMaxLength() {
-        return mCounterMaxLength;
-    }
-
-    void updateCounter(int length) {
-        boolean wasCounterOverflowed = mCounterOverflowed;
-        if (mCounterMaxLength == INVALID_MAX_LENGTH) {
-            mCounterView.setText(String.valueOf(length));
-            mCounterOverflowed = false;
-        } else {
-            mCounterOverflowed = length > mCounterMaxLength;
-            if (wasCounterOverflowed != mCounterOverflowed) {
-                TextViewCompat.setTextAppearance(mCounterView, mCounterOverflowed
-                        ? mCounterOverflowTextAppearance : mCounterTextAppearance);
-            }
-            mCounterView.setText(getContext().getString(R.string.character_counter_pattern,
-                    length, mCounterMaxLength));
-        }
-        if (mEditText != null && wasCounterOverflowed != mCounterOverflowed) {
-            updateLabelState(false);
-            updateEditTextBackground();
-        }
-    }
-
-    private void updateEditTextBackground() {
-        if (mEditText == null) {
-            return;
-        }
-
-        Drawable editTextBackground = mEditText.getBackground();
-        if (editTextBackground == null) {
-            return;
-        }
-
-        ensureBackgroundDrawableStateWorkaround();
-
-        if (android.support.v7.widget.DrawableUtils.canSafelyMutateDrawable(editTextBackground)) {
-            editTextBackground = editTextBackground.mutate();
-        }
-
-        if (mErrorShown && mErrorView != null) {
-            // Set a color filter of the error color
-            editTextBackground.setColorFilter(
-                    AppCompatDrawableManager.getPorterDuffColorFilter(
-                            mErrorView.getCurrentTextColor(), PorterDuff.Mode.SRC_IN));
-        } else if (mCounterOverflowed && mCounterView != null) {
-            // Set a color filter of the counter color
-            editTextBackground.setColorFilter(
-                    AppCompatDrawableManager.getPorterDuffColorFilter(
-                            mCounterView.getCurrentTextColor(), PorterDuff.Mode.SRC_IN));
-        } else {
-            // Else reset the color filter and refresh the drawable state so that the
-            // normal tint is used
-            DrawableCompat.clearColorFilter(editTextBackground);
-            mEditText.refreshDrawableState();
-        }
-    }
-
-    private void ensureBackgroundDrawableStateWorkaround() {
-        final int sdk = Build.VERSION.SDK_INT;
-        if (sdk != 21 && sdk != 22) {
-            // The workaround is only required on API 21-22
-            return;
-        }
-        final Drawable bg = mEditText.getBackground();
-        if (bg == null) {
-            return;
-        }
-
-        if (!mHasReconstructedEditTextBackground) {
-            // This is gross. There is an issue in the platform which affects container Drawables
-            // where the first drawable retrieved from resources will propagate any changes
-            // (like color filter) to all instances from the cache. We'll try to workaround it...
-
-            final Drawable newBg = bg.getConstantState().newDrawable();
-
-            if (bg instanceof DrawableContainer) {
-                // If we have a Drawable container, we can try and set it's constant state via
-                // reflection from the new Drawable
-                mHasReconstructedEditTextBackground =
-                        DrawableUtils.setContainerConstantState(
-                                (DrawableContainer) bg, newBg.getConstantState());
-            }
-
-            if (!mHasReconstructedEditTextBackground) {
-                // If we reach here then we just need to set a brand new instance of the Drawable
-                // as the background. This has the unfortunate side-effect of wiping out any
-                // user set padding, but I'd hope that use of custom padding on an EditText
-                // is limited.
-                ViewCompat.setBackground(mEditText, newBg);
-                mHasReconstructedEditTextBackground = true;
-            }
-        }
-    }
-
-    static class SavedState extends AbsSavedState {
-        CharSequence error;
-        boolean isPasswordToggledVisible;
-
-        SavedState(Parcelable superState) {
-            super(superState);
-        }
-
-        SavedState(Parcel source, ClassLoader loader) {
-            super(source, loader);
-            error = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
-            isPasswordToggledVisible = (source.readInt() == 1);
-
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            super.writeToParcel(dest, flags);
-            TextUtils.writeToParcel(error, dest, flags);
-            dest.writeInt(isPasswordToggledVisible ? 1 : 0);
-        }
-
-        @Override
-        public String toString() {
-            return "TextInputLayout.SavedState{"
-                    + Integer.toHexString(System.identityHashCode(this))
-                    + " error=" + error + "}";
-        }
-
-        public static final Creator<SavedState> CREATOR = new ClassLoaderCreator<SavedState>() {
-            @Override
-            public SavedState createFromParcel(Parcel in, ClassLoader loader) {
-                return new SavedState(in, loader);
-            }
-
-            @Override
-            public SavedState createFromParcel(Parcel in) {
-                return new SavedState(in, null);
-            }
-
-            @Override
-            public SavedState[] newArray(int size) {
-                return new SavedState[size];
-            }
-        };
-    }
-
-    @Override
-    public Parcelable onSaveInstanceState() {
-        Parcelable superState = super.onSaveInstanceState();
-        SavedState ss = new SavedState(superState);
-        if (mErrorShown) {
-            ss.error = getError();
-        }
-        ss.isPasswordToggledVisible = mPasswordToggledVisible;
-        return ss;
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Parcelable state) {
-        if (!(state instanceof SavedState)) {
-            super.onRestoreInstanceState(state);
-            return;
-        }
-        SavedState ss = (SavedState) state;
-        super.onRestoreInstanceState(ss.getSuperState());
-        setError(ss.error);
-        if (ss.isPasswordToggledVisible) {
-            passwordVisibilityToggleRequested(true);
-        }
-        requestLayout();
-    }
-
-    @Override
-    protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
-        mRestoringSavedState = true;
-        super.dispatchRestoreInstanceState(container);
-        mRestoringSavedState = false;
-    }
-
-    /**
-     * Returns the error message that was set to be displayed with
-     * {@link #setError(CharSequence)}, or <code>null</code> if no error was set
-     * or if error displaying is not enabled.
-     *
-     * @see #setError(CharSequence)
-     */
-    @Nullable
-    public CharSequence getError() {
-        return mErrorEnabled ? mError : null;
-    }
-
-    /**
-     * Returns whether any hint state changes, due to being focused or non-empty text, are
-     * animated.
-     *
-     * @see #setHintAnimationEnabled(boolean)
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_hintAnimationEnabled
-     */
-    public boolean isHintAnimationEnabled() {
-        return mHintAnimationEnabled;
-    }
-
-    /**
-     * Set whether any hint state changes, due to being focused or non-empty text, are
-     * animated.
-     *
-     * @see #isHintAnimationEnabled()
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_hintAnimationEnabled
-     */
-    public void setHintAnimationEnabled(boolean enabled) {
-        mHintAnimationEnabled = enabled;
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        super.draw(canvas);
-
-        if (mHintEnabled) {
-            mCollapsingTextHelper.draw(canvas);
-        }
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        updatePasswordToggleView();
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-    }
-
-    private void updatePasswordToggleView() {
-        if (mEditText == null) {
-            // If there is no EditText, there is nothing to update
-            return;
-        }
-
-        if (shouldShowPasswordIcon()) {
-            if (mPasswordToggleView == null) {
-                mPasswordToggleView = (CheckableImageButton) LayoutInflater.from(getContext())
-                        .inflate(R.layout.design_text_input_password_icon, mInputFrame, false);
-                mPasswordToggleView.setImageDrawable(mPasswordToggleDrawable);
-                mPasswordToggleView.setContentDescription(mPasswordToggleContentDesc);
-                mInputFrame.addView(mPasswordToggleView);
-
-                mPasswordToggleView.setOnClickListener(new View.OnClickListener() {
-                    @Override
-                    public void onClick(View view) {
-                        passwordVisibilityToggleRequested(false);
-                    }
-                });
-            }
-
-            if (mEditText != null && ViewCompat.getMinimumHeight(mEditText) <= 0) {
-                // We should make sure that the EditText has the same min-height as the password
-                // toggle view. This ensure focus works properly, and there is no visual jump
-                // if the password toggle is enabled/disabled.
-                mEditText.setMinimumHeight(ViewCompat.getMinimumHeight(mPasswordToggleView));
-            }
-
-            mPasswordToggleView.setVisibility(VISIBLE);
-            mPasswordToggleView.setChecked(mPasswordToggledVisible);
-
-            // We need to add a dummy drawable as the end compound drawable so that the text is
-            // indented and doesn't display below the toggle view
-            if (mPasswordToggleDummyDrawable == null) {
-                mPasswordToggleDummyDrawable = new ColorDrawable();
-            }
-            mPasswordToggleDummyDrawable.setBounds(0, 0, mPasswordToggleView.getMeasuredWidth(), 1);
-
-            final Drawable[] compounds = TextViewCompat.getCompoundDrawablesRelative(mEditText);
-            // Store the user defined end compound drawable so that we can restore it later
-            if (compounds[2] != mPasswordToggleDummyDrawable) {
-                mOriginalEditTextEndDrawable = compounds[2];
-            }
-            TextViewCompat.setCompoundDrawablesRelative(mEditText, compounds[0], compounds[1],
-                    mPasswordToggleDummyDrawable, compounds[3]);
-
-            // Copy over the EditText's padding so that we match
-            mPasswordToggleView.setPadding(mEditText.getPaddingLeft(),
-                    mEditText.getPaddingTop(), mEditText.getPaddingRight(),
-                    mEditText.getPaddingBottom());
-        } else {
-            if (mPasswordToggleView != null && mPasswordToggleView.getVisibility() == VISIBLE) {
-                mPasswordToggleView.setVisibility(View.GONE);
-            }
-
-            if (mPasswordToggleDummyDrawable != null) {
-                // Make sure that we remove the dummy end compound drawable if it exists, and then
-                // clear it
-                final Drawable[] compounds = TextViewCompat.getCompoundDrawablesRelative(mEditText);
-                if (compounds[2] == mPasswordToggleDummyDrawable) {
-                    TextViewCompat.setCompoundDrawablesRelative(mEditText, compounds[0],
-                            compounds[1], mOriginalEditTextEndDrawable, compounds[3]);
-                    mPasswordToggleDummyDrawable = null;
-                }
-            }
-        }
-    }
-
-    /**
-     * Set the icon to use for the password visibility toggle button.
-     *
-     * <p>If you use an icon you should also set a description for its action
-     * using {@link #setPasswordVisibilityToggleContentDescription(CharSequence)}.
-     * This is used for accessibility.</p>
-     *
-     * @param resId resource id of the drawable to set, or 0 to clear the icon
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_passwordToggleDrawable
-     */
-    public void setPasswordVisibilityToggleDrawable(@DrawableRes int resId) {
-        setPasswordVisibilityToggleDrawable(resId != 0
-                ? AppCompatResources.getDrawable(getContext(), resId)
-                : null);
-    }
-
-    /**
-     * Set the icon to use for the password visibility toggle button.
-     *
-     * <p>If you use an icon you should also set a description for its action
-     * using {@link #setPasswordVisibilityToggleContentDescription(CharSequence)}.
-     * This is used for accessibility.</p>
-     *
-     * @param icon Drawable to set, may be null to clear the icon
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_passwordToggleDrawable
-     */
-    public void setPasswordVisibilityToggleDrawable(@Nullable Drawable icon) {
-        mPasswordToggleDrawable = icon;
-        if (mPasswordToggleView != null) {
-            mPasswordToggleView.setImageDrawable(icon);
-        }
-    }
-
-    /**
-     * Set a content description for the navigation button if one is present.
-     *
-     * <p>The content description will be read via screen readers or other accessibility
-     * systems to explain the action of the password visibility toggle.</p>
-     *
-     * @param resId Resource ID of a content description string to set,
-     *              or 0 to clear the description
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_passwordToggleContentDescription
-     */
-    public void setPasswordVisibilityToggleContentDescription(@StringRes int resId) {
-        setPasswordVisibilityToggleContentDescription(
-                resId != 0 ? getResources().getText(resId) : null);
-    }
-
-    /**
-     * Set a content description for the navigation button if one is present.
-     *
-     * <p>The content description will be read via screen readers or other accessibility
-     * systems to explain the action of the password visibility toggle.</p>
-     *
-     * @param description Content description to set, or null to clear the content description
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_passwordToggleContentDescription
-     */
-    public void setPasswordVisibilityToggleContentDescription(@Nullable CharSequence description) {
-        mPasswordToggleContentDesc = description;
-        if (mPasswordToggleView != null) {
-            mPasswordToggleView.setContentDescription(description);
-        }
-    }
-
-    /**
-     * Returns the icon currently used for the password visibility toggle button.
-     *
-     * @see #setPasswordVisibilityToggleDrawable(Drawable)
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_passwordToggleDrawable
-     */
-    @Nullable
-    public Drawable getPasswordVisibilityToggleDrawable() {
-        return mPasswordToggleDrawable;
-    }
-
-    /**
-     * Returns the currently configured content description for the password visibility
-     * toggle button.
-     *
-     * <p>This will be used to describe the navigation action to users through mechanisms
-     * such as screen readers.</p>
-     */
-    @Nullable
-    public CharSequence getPasswordVisibilityToggleContentDescription() {
-        return mPasswordToggleContentDesc;
-    }
-
-    /**
-     * Returns whether the password visibility toggle functionality is currently enabled.
-     *
-     * @see #setPasswordVisibilityToggleEnabled(boolean)
-     */
-    public boolean isPasswordVisibilityToggleEnabled() {
-        return mPasswordToggleEnabled;
-    }
-
-    /**
-     * Returns whether the password visibility toggle functionality is enabled or not.
-     *
-     * <p>When enabled, a button is placed at the end of the EditText which enables the user
-     * to switch between the field's input being visibly disguised or not.</p>
-     *
-     * @param enabled true to enable the functionality
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_passwordToggleEnabled
-     */
-    public void setPasswordVisibilityToggleEnabled(final boolean enabled) {
-        if (mPasswordToggleEnabled != enabled) {
-            mPasswordToggleEnabled = enabled;
-
-            if (!enabled && mPasswordToggledVisible && mEditText != null) {
-                // If the toggle is no longer enabled, but we remove the PasswordTransformation
-                // to make the password visible, add it back
-                mEditText.setTransformationMethod(PasswordTransformationMethod.getInstance());
-            }
-
-            // Reset the visibility tracking flag
-            mPasswordToggledVisible = false;
-
-            updatePasswordToggleView();
-        }
-    }
-
-    /**
-     * Applies a tint to the the password visibility toggle drawable. Does not modify the current
-     * tint mode, which is {@link PorterDuff.Mode#SRC_IN} by default.
-     *
-     * <p>Subsequent calls to {@link #setPasswordVisibilityToggleDrawable(Drawable)} will
-     * automatically mutate the drawable and apply the specified tint and tint mode using
-     * {@link DrawableCompat#setTintList(Drawable, ColorStateList)}.</p>
-     *
-     * @param tintList the tint to apply, may be null to clear tint
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_passwordToggleTint
-     */
-    public void setPasswordVisibilityToggleTintList(@Nullable ColorStateList tintList) {
-        mPasswordToggleTintList = tintList;
-        mHasPasswordToggleTintList = true;
-        applyPasswordToggleTint();
-    }
-
-    /**
-     * Specifies the blending mode used to apply the tint specified by
-     * {@link #setPasswordVisibilityToggleTintList(ColorStateList)} to the password
-     * visibility toggle drawable. The default mode is {@link PorterDuff.Mode#SRC_IN}.</p>
-     *
-     * @param mode the blending mode used to apply the tint, may be null to clear tint
-     *
-     * @attr ref android.support.design.R.styleable#TextInputLayout_passwordToggleTintMode
-     */
-    public void setPasswordVisibilityToggleTintMode(@Nullable PorterDuff.Mode mode) {
-        mPasswordToggleTintMode = mode;
-        mHasPasswordToggleTintMode = true;
-        applyPasswordToggleTint();
-    }
-
-    private void passwordVisibilityToggleRequested(boolean shouldSkipAnimations) {
-        if (mPasswordToggleEnabled) {
-            // Store the current cursor position
-            final int selection = mEditText.getSelectionEnd();
-
-            if (hasPasswordTransformation()) {
-                mEditText.setTransformationMethod(null);
-                mPasswordToggledVisible = true;
-            } else {
-                mEditText.setTransformationMethod(PasswordTransformationMethod.getInstance());
-                mPasswordToggledVisible = false;
-            }
-
-            mPasswordToggleView.setChecked(mPasswordToggledVisible);
-            if (shouldSkipAnimations) {
-                mPasswordToggleView.jumpDrawablesToCurrentState();
-            }
-
-            // And restore the cursor position
-            mEditText.setSelection(selection);
-        }
-    }
-
-    private boolean hasPasswordTransformation() {
-        return mEditText != null
-                && mEditText.getTransformationMethod() instanceof PasswordTransformationMethod;
-    }
-
-    private boolean shouldShowPasswordIcon() {
-        return mPasswordToggleEnabled && (hasPasswordTransformation() || mPasswordToggledVisible);
-    }
-
-    private void applyPasswordToggleTint() {
-        if (mPasswordToggleDrawable != null
-                && (mHasPasswordToggleTintList || mHasPasswordToggleTintMode)) {
-            mPasswordToggleDrawable = DrawableCompat.wrap(mPasswordToggleDrawable).mutate();
-
-            if (mHasPasswordToggleTintList) {
-                DrawableCompat.setTintList(mPasswordToggleDrawable, mPasswordToggleTintList);
-            }
-            if (mHasPasswordToggleTintMode) {
-                DrawableCompat.setTintMode(mPasswordToggleDrawable, mPasswordToggleTintMode);
-            }
-
-            if (mPasswordToggleView != null
-                    && mPasswordToggleView.getDrawable() != mPasswordToggleDrawable) {
-                mPasswordToggleView.setImageDrawable(mPasswordToggleDrawable);
-            }
-        }
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
-        super.onLayout(changed, left, top, right, bottom);
-
-        if (mHintEnabled && mEditText != null) {
-            final Rect rect = mTmpRect;
-            ViewGroupUtils.getDescendantRect(this, mEditText, rect);
-
-            final int l = rect.left + mEditText.getCompoundPaddingLeft();
-            final int r = rect.right - mEditText.getCompoundPaddingRight();
-
-            mCollapsingTextHelper.setExpandedBounds(
-                    l, rect.top + mEditText.getCompoundPaddingTop(),
-                    r, rect.bottom - mEditText.getCompoundPaddingBottom());
-
-            // Set the collapsed bounds to be the the full height (minus padding) to match the
-            // EditText's editable area
-            mCollapsingTextHelper.setCollapsedBounds(l, getPaddingTop(),
-                    r, bottom - top - getPaddingBottom());
-
-            mCollapsingTextHelper.recalculate();
-        }
-    }
-
-    private void collapseHint(boolean animate) {
-        if (mAnimator != null && mAnimator.isRunning()) {
-            mAnimator.cancel();
-        }
-        if (animate && mHintAnimationEnabled) {
-            animateToExpansionFraction(1f);
-        } else {
-            mCollapsingTextHelper.setExpansionFraction(1f);
-        }
-        mHintExpanded = false;
-    }
-
-    @Override
-    protected void drawableStateChanged() {
-        if (mInDrawableStateChanged) {
-            // Some of the calls below will update the drawable state of child views. Since we're
-            // using addStatesFromChildren we can get into infinite recursion, hence we'll just
-            // exit in this instance
-            return;
-        }
-
-        mInDrawableStateChanged = true;
-
-        super.drawableStateChanged();
-
-        final int[] state = getDrawableState();
-        boolean changed = false;
-
-        // Drawable state has changed so see if we need to update the label
-        updateLabelState(ViewCompat.isLaidOut(this) && isEnabled());
-
-        updateEditTextBackground();
-
-        if (mCollapsingTextHelper != null) {
-            changed |= mCollapsingTextHelper.setState(state);
-        }
-
-        if (changed) {
-            invalidate();
-        }
-
-        mInDrawableStateChanged = false;
-    }
-
-    private void expandHint(boolean animate) {
-        if (mAnimator != null && mAnimator.isRunning()) {
-            mAnimator.cancel();
-        }
-        if (animate && mHintAnimationEnabled) {
-            animateToExpansionFraction(0f);
-        } else {
-            mCollapsingTextHelper.setExpansionFraction(0f);
-        }
-        mHintExpanded = true;
-    }
-
-    @VisibleForTesting
-    void animateToExpansionFraction(final float target) {
-        if (mCollapsingTextHelper.getExpansionFraction() == target) {
-            return;
-        }
-        if (mAnimator == null) {
-            mAnimator = new ValueAnimator();
-            mAnimator.setInterpolator(AnimationUtils.LINEAR_INTERPOLATOR);
-            mAnimator.setDuration(ANIMATION_DURATION);
-            mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-                @Override
-                public void onAnimationUpdate(ValueAnimator animator) {
-                    mCollapsingTextHelper.setExpansionFraction((float) animator.getAnimatedValue());
-                }
-            });
-        }
-        mAnimator.setFloatValues(mCollapsingTextHelper.getExpansionFraction(), target);
-        mAnimator.start();
-    }
-
-    @VisibleForTesting
-    final boolean isHintExpanded() {
-        return mHintExpanded;
-    }
-
-    private class TextInputAccessibilityDelegate extends AccessibilityDelegateCompat {
-        TextInputAccessibilityDelegate() {
-        }
-
-        @Override
-        public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
-            super.onInitializeAccessibilityEvent(host, event);
-            event.setClassName(TextInputLayout.class.getSimpleName());
-        }
-
-        @Override
-        public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
-            super.onPopulateAccessibilityEvent(host, event);
-
-            final CharSequence text = mCollapsingTextHelper.getText();
-            if (!TextUtils.isEmpty(text)) {
-                event.getText().add(text);
-            }
-        }
-
-        @Override
-        public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
-            super.onInitializeAccessibilityNodeInfo(host, info);
-            info.setClassName(TextInputLayout.class.getSimpleName());
-
-            final CharSequence text = mCollapsingTextHelper.getText();
-            if (!TextUtils.isEmpty(text)) {
-                info.setText(text);
-            }
-            if (mEditText != null) {
-                info.setLabelFor(mEditText);
-            }
-            final CharSequence error = mErrorView != null ? mErrorView.getText() : null;
-            if (!TextUtils.isEmpty(error)) {
-                info.setContentInvalid(true);
-                info.setError(error);
-            }
-        }
-    }
-
-    private static boolean arrayContains(int[] array, int value) {
-        for (int v : array) {
-            if (v == value) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/design/src/android/support/design/widget/ThemeUtils.java b/design/src/android/support/design/widget/ThemeUtils.java
deleted file mode 100644
index 821dcb6..0000000
--- a/design/src/android/support/design/widget/ThemeUtils.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-
-class ThemeUtils {
-
-    private static final int[] APPCOMPAT_CHECK_ATTRS = {
-            android.support.v7.appcompat.R.attr.colorPrimary
-    };
-
-    static void checkAppCompatTheme(Context context) {
-        TypedArray a = context.obtainStyledAttributes(APPCOMPAT_CHECK_ATTRS);
-        final boolean failed = !a.hasValue(0);
-        a.recycle();
-        if (failed) {
-            throw new IllegalArgumentException("You need to use a Theme.AppCompat theme "
-                    + "(or descendant) with the design library.");
-        }
-    }
-}
diff --git a/design/src/android/support/design/widget/ViewOffsetBehavior.java b/design/src/android/support/design/widget/ViewOffsetBehavior.java
deleted file mode 100644
index 541de69..0000000
--- a/design/src/android/support/design/widget/ViewOffsetBehavior.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-
-/**
- * Behavior will automatically sets up a {@link ViewOffsetHelper} on a {@link View}.
- */
-class ViewOffsetBehavior<V extends View> extends CoordinatorLayout.Behavior<V> {
-
-    private ViewOffsetHelper mViewOffsetHelper;
-
-    private int mTempTopBottomOffset = 0;
-    private int mTempLeftRightOffset = 0;
-
-    public ViewOffsetBehavior() {}
-
-    public ViewOffsetBehavior(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    @Override
-    public boolean onLayoutChild(CoordinatorLayout parent, V child, int layoutDirection) {
-        // First let lay the child out
-        layoutChild(parent, child, layoutDirection);
-
-        if (mViewOffsetHelper == null) {
-            mViewOffsetHelper = new ViewOffsetHelper(child);
-        }
-        mViewOffsetHelper.onViewLayout();
-
-        if (mTempTopBottomOffset != 0) {
-            mViewOffsetHelper.setTopAndBottomOffset(mTempTopBottomOffset);
-            mTempTopBottomOffset = 0;
-        }
-        if (mTempLeftRightOffset != 0) {
-            mViewOffsetHelper.setLeftAndRightOffset(mTempLeftRightOffset);
-            mTempLeftRightOffset = 0;
-        }
-
-        return true;
-    }
-
-    protected void layoutChild(CoordinatorLayout parent, V child, int layoutDirection) {
-        // Let the parent lay it out by default
-        parent.onLayoutChild(child, layoutDirection);
-    }
-
-    public boolean setTopAndBottomOffset(int offset) {
-        if (mViewOffsetHelper != null) {
-            return mViewOffsetHelper.setTopAndBottomOffset(offset);
-        } else {
-            mTempTopBottomOffset = offset;
-        }
-        return false;
-    }
-
-    public boolean setLeftAndRightOffset(int offset) {
-        if (mViewOffsetHelper != null) {
-            return mViewOffsetHelper.setLeftAndRightOffset(offset);
-        } else {
-            mTempLeftRightOffset = offset;
-        }
-        return false;
-    }
-
-    public int getTopAndBottomOffset() {
-        return mViewOffsetHelper != null ? mViewOffsetHelper.getTopAndBottomOffset() : 0;
-    }
-
-    public int getLeftAndRightOffset() {
-        return mViewOffsetHelper != null ? mViewOffsetHelper.getLeftAndRightOffset() : 0;
-    }
-}
\ No newline at end of file
diff --git a/design/src/android/support/design/widget/ViewOffsetHelper.java b/design/src/android/support/design/widget/ViewOffsetHelper.java
deleted file mode 100644
index 088430a..0000000
--- a/design/src/android/support/design/widget/ViewOffsetHelper.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.support.v4.view.ViewCompat;
-import android.view.View;
-
-/**
- * Utility helper for moving a {@link android.view.View} around using
- * {@link android.view.View#offsetLeftAndRight(int)} and
- * {@link android.view.View#offsetTopAndBottom(int)}.
- * <p>
- * Also the setting of absolute offsets (similar to translationX/Y), rather than additive
- * offsets.
- */
-class ViewOffsetHelper {
-
-    private final View mView;
-
-    private int mLayoutTop;
-    private int mLayoutLeft;
-    private int mOffsetTop;
-    private int mOffsetLeft;
-
-    public ViewOffsetHelper(View view) {
-        mView = view;
-    }
-
-    public void onViewLayout() {
-        // Now grab the intended top
-        mLayoutTop = mView.getTop();
-        mLayoutLeft = mView.getLeft();
-
-        // And offset it as needed
-        updateOffsets();
-    }
-
-    private void updateOffsets() {
-        ViewCompat.offsetTopAndBottom(mView, mOffsetTop - (mView.getTop() - mLayoutTop));
-        ViewCompat.offsetLeftAndRight(mView, mOffsetLeft - (mView.getLeft() - mLayoutLeft));
-    }
-
-    /**
-     * Set the top and bottom offset for this {@link ViewOffsetHelper}'s view.
-     *
-     * @param offset the offset in px.
-     * @return true if the offset has changed
-     */
-    public boolean setTopAndBottomOffset(int offset) {
-        if (mOffsetTop != offset) {
-            mOffsetTop = offset;
-            updateOffsets();
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Set the left and right offset for this {@link ViewOffsetHelper}'s view.
-     *
-     * @param offset the offset in px.
-     * @return true if the offset has changed
-     */
-    public boolean setLeftAndRightOffset(int offset) {
-        if (mOffsetLeft != offset) {
-            mOffsetLeft = offset;
-            updateOffsets();
-            return true;
-        }
-        return false;
-    }
-
-    public int getTopAndBottomOffset() {
-        return mOffsetTop;
-    }
-
-    public int getLeftAndRightOffset() {
-        return mOffsetLeft;
-    }
-
-    public int getLayoutTop() {
-        return mLayoutTop;
-    }
-
-    public int getLayoutLeft() {
-        return mLayoutLeft;
-    }
-}
\ No newline at end of file
diff --git a/design/src/android/support/design/widget/ViewUtils.java b/design/src/android/support/design/widget/ViewUtils.java
deleted file mode 100644
index c09eac1..0000000
--- a/design/src/android/support/design/widget/ViewUtils.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.graphics.PorterDuff;
-
-class ViewUtils {
-    static PorterDuff.Mode parseTintMode(int value, PorterDuff.Mode defaultMode) {
-        switch (value) {
-            case 3:
-                return PorterDuff.Mode.SRC_OVER;
-            case 5:
-                return PorterDuff.Mode.SRC_IN;
-            case 9:
-                return PorterDuff.Mode.SRC_ATOP;
-            case 14:
-                return PorterDuff.Mode.MULTIPLY;
-            case 15:
-                return PorterDuff.Mode.SCREEN;
-            default:
-                return defaultMode;
-        }
-    }
-
-}
diff --git a/design/tests/AndroidManifest.xml b/design/tests/AndroidManifest.xml
deleted file mode 100755
index 756d7c1..0000000
--- a/design/tests/AndroidManifest.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 2015 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 xmlns:android="http://schemas.android.com/apk/res/android"
-          package="android.support.design.test">
-    <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
-
-    <application
-        android:supportsRtl="true"
-        android:theme="@style/Theme.Design">
-
-        <activity
-            android:name="android.support.design.widget.TabLayoutWithViewPagerActivity"
-            android:theme="@style/Theme.AppCompat.NoActionBar"/>
-
-        <activity
-            android:name="android.support.design.widget.SnackbarActivity"
-            android:theme="@style/Theme.AppCompat.NoActionBar"/>
-
-        <activity
-            android:name="android.support.design.widget.SnackbarActivityWithTranslucentNavBar"
-            android:theme="@style/Theme.TranslucentNavBar"/>
-
-        <activity
-            android:name="android.support.design.widget.SnackbarActivityWithFAB"
-            android:theme="@style/Theme.AppCompat.NoActionBar"/>
-
-        <activity
-            android:name="android.support.design.widget.DynamicCoordinatorLayoutActivity"
-            android:theme="@style/Theme.TranslucentStatus"/>
-
-        <activity
-            android:name="android.support.design.widget.TabLayoutPoolingActivity"
-            android:theme="@style/Theme.AppCompat.NoActionBar"/>
-
-        <activity
-            android:name="android.support.design.widget.BottomSheetBehaviorActivity"
-            android:theme="@style/Theme.AppCompat.NoActionBar"/>
-
-        <activity
-            android:name="android.support.design.widget.BottomSheetBehaviorWithInsetsActivity"
-            android:theme="@style/Theme.AppCompat.NoActionBar"/>
-
-        <activity
-            android:name="android.support.design.widget.BottomSheetDialogActivity"
-            android:theme="@style/Theme.AppCompat.NoActionBar"/>
-
-        <activity
-            android:name="android.support.design.widget.CoordinatorLayoutActivity"
-            android:theme="@style/Theme.AppCompat.NoActionBar"/>
-
-        <activity
-            android:name="android.support.design.widget.FloatingActionButtonActivity"
-            android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
-
-        <activity
-            android:name="android.support.design.widget.NavigationViewActivity"
-            android:theme="@style/Theme.AppCompat.NoActionBar"/>
-
-        <activity
-            android:name="android.support.design.widget.BottomNavigationViewActivity"
-            android:theme="@style/Theme.AppCompat.NoActionBar"/>
-
-        <activity
-            android:name="android.support.design.widget.TextInputLayoutActivity"
-            android:theme="@style/Theme.AppCompat.NoActionBar"/>
-
-        <activity
-            android:name="android.support.v7.app.AppCompatActivity"/>
-
-        <activity
-            android:name="android.support.design.widget.AppBarLayoutCollapsePinTestActivity"
-            android:theme="@style/Theme.TranslucentStatus"/>
-
-        <activity
-            android:name="android.support.design.widget.AppBarWithScrollbarsActivity"
-            android:theme="@style/Theme.AppCompat.Light.DarkActionBar"/>
-
-        <activity
-            android:name="android.support.design.widget.AppBarHorizontalScrollingActivity"
-            android:theme="@style/Theme.AppCompat.NoActionBar"/>
-
-    </application>
-
-</manifest>
diff --git a/design/tests/res/color/color_state_list_lilac.xml b/design/tests/res/color/color_state_list_lilac.xml
deleted file mode 100644
index f0b2791..0000000
--- a/design/tests/res/color/color_state_list_lilac.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_enabled="false" android:color="@color/lilac_disabled" />
-    <item android:color="@color/lilac_default"/>
-</selector>
-
diff --git a/design/tests/res/color/color_state_list_red_translucent.xml b/design/tests/res/color/color_state_list_red_translucent.xml
deleted file mode 100644
index fdf8b2b..0000000
--- a/design/tests/res/color/color_state_list_red_translucent.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:color="@color/red_translucent"/>
-</selector>
-
diff --git a/design/tests/res/color/color_state_list_sand.xml b/design/tests/res/color/color_state_list_sand.xml
deleted file mode 100644
index eb472c2..0000000
--- a/design/tests/res/color/color_state_list_sand.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_enabled="false" android:color="@color/sand_disabled" />
-    <item android:state_checked="true" android:color="@color/sand_checked" />
-    <item android:color="@color/sand_default" />
-</selector>
-
diff --git a/design/tests/res/color/color_state_list_themed.xml b/design/tests/res/color/color_state_list_themed.xml
deleted file mode 100644
index e17fa66..0000000
--- a/design/tests/res/color/color_state_list_themed.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:color="?attr/colorAccent"/>
-</selector>
-
diff --git a/design/tests/res/color/fab_tint.xml b/design/tests/res/color/fab_tint.xml
deleted file mode 100644
index 2ac659d..0000000
--- a/design/tests/res/color/fab_tint.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_selected="false" android:color="@color/sand_disabled" />
-    <item android:color="@color/sand_default" />
-</selector>
-
diff --git a/design/tests/res/drawable-hdpi/ic_account_circle_white_48dp.png b/design/tests/res/drawable-hdpi/ic_account_circle_white_48dp.png
deleted file mode 100644
index bfd4632..0000000
--- a/design/tests/res/drawable-hdpi/ic_account_circle_white_48dp.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-hdpi/ic_lightbulb_outline_white_24dp.png b/design/tests/res/drawable-hdpi/ic_lightbulb_outline_white_24dp.png
deleted file mode 100644
index c9dd4c1..0000000
--- a/design/tests/res/drawable-hdpi/ic_lightbulb_outline_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-mdpi/ic_account_circle_white_48dp.png b/design/tests/res/drawable-mdpi/ic_account_circle_white_48dp.png
deleted file mode 100644
index 246e0c8..0000000
--- a/design/tests/res/drawable-mdpi/ic_account_circle_white_48dp.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-mdpi/ic_lightbulb_outline_white_24dp.png b/design/tests/res/drawable-mdpi/ic_lightbulb_outline_white_24dp.png
deleted file mode 100644
index 91702b1..0000000
--- a/design/tests/res/drawable-mdpi/ic_lightbulb_outline_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-mdpi/test_drawable_blue.png b/design/tests/res/drawable-mdpi/test_drawable_blue.png
deleted file mode 100644
index 6350c14..0000000
--- a/design/tests/res/drawable-mdpi/test_drawable_blue.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-mdpi/test_drawable_green.png b/design/tests/res/drawable-mdpi/test_drawable_green.png
deleted file mode 100644
index e3afddb..0000000
--- a/design/tests/res/drawable-mdpi/test_drawable_green.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-mdpi/test_drawable_red.png b/design/tests/res/drawable-mdpi/test_drawable_red.png
deleted file mode 100644
index d95db88..0000000
--- a/design/tests/res/drawable-mdpi/test_drawable_red.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-nodpi/photo.jpg b/design/tests/res/drawable-nodpi/photo.jpg
deleted file mode 100644
index d5a2ef0..0000000
--- a/design/tests/res/drawable-nodpi/photo.jpg
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-xhdpi/ic_account_circle_white_48dp.png b/design/tests/res/drawable-xhdpi/ic_account_circle_white_48dp.png
deleted file mode 100644
index 07643f9..0000000
--- a/design/tests/res/drawable-xhdpi/ic_account_circle_white_48dp.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-xhdpi/ic_lightbulb_outline_white_24dp.png b/design/tests/res/drawable-xhdpi/ic_lightbulb_outline_white_24dp.png
deleted file mode 100644
index afc7e53..0000000
--- a/design/tests/res/drawable-xhdpi/ic_lightbulb_outline_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-xxhdpi/ic_account_circle_white_48dp.png b/design/tests/res/drawable-xxhdpi/ic_account_circle_white_48dp.png
deleted file mode 100644
index 1ac34a7..0000000
--- a/design/tests/res/drawable-xxhdpi/ic_account_circle_white_48dp.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-xxhdpi/ic_add.png b/design/tests/res/drawable-xxhdpi/ic_add.png
deleted file mode 100644
index a84106b..0000000
--- a/design/tests/res/drawable-xxhdpi/ic_add.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-xxhdpi/ic_airplay_black_24dp.png b/design/tests/res/drawable-xxhdpi/ic_airplay_black_24dp.png
deleted file mode 100644
index ddf2620..0000000
--- a/design/tests/res/drawable-xxhdpi/ic_airplay_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-xxhdpi/ic_album_black_24dp.png b/design/tests/res/drawable-xxhdpi/ic_album_black_24dp.png
deleted file mode 100644
index 60f59f5..0000000
--- a/design/tests/res/drawable-xxhdpi/ic_album_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-xxhdpi/ic_lightbulb_outline_white_24dp.png b/design/tests/res/drawable-xxhdpi/ic_lightbulb_outline_white_24dp.png
deleted file mode 100644
index 1c16761..0000000
--- a/design/tests/res/drawable-xxhdpi/ic_lightbulb_outline_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-xxxhdpi/ic_account_circle_white_48dp.png b/design/tests/res/drawable-xxxhdpi/ic_account_circle_white_48dp.png
deleted file mode 100644
index baa6045..0000000
--- a/design/tests/res/drawable-xxxhdpi/ic_account_circle_white_48dp.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable-xxxhdpi/ic_lightbulb_outline_white_24dp.png b/design/tests/res/drawable-xxxhdpi/ic_lightbulb_outline_white_24dp.png
deleted file mode 100644
index 983a253..0000000
--- a/design/tests/res/drawable-xxxhdpi/ic_lightbulb_outline_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/design/tests/res/drawable/test_background_blue.xml b/design/tests/res/drawable/test_background_blue.xml
deleted file mode 100644
index fe4bca2..0000000
--- a/design/tests/res/drawable/test_background_blue.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<shape
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <solid
-        android:color="@color/test_blue" />
-</shape>
\ No newline at end of file
diff --git a/design/tests/res/drawable/test_background_green.xml b/design/tests/res/drawable/test_background_green.xml
deleted file mode 100644
index b90d9bc..0000000
--- a/design/tests/res/drawable/test_background_green.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<shape
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <solid
-        android:color="@color/test_green" />
-</shape>
\ No newline at end of file
diff --git a/design/tests/res/drawable/vector_icon.xml b/design/tests/res/drawable/vector_icon.xml
deleted file mode 100644
index 19e97ee..0000000
--- a/design/tests/res/drawable/vector_icon.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="?attr/colorControlNormal">
-    <path
-            android:pathData="M19,6.41L17.59,5,12,10.59,6.41,5,5,6.41,10.59,12,5,17.59,6.41,19,12,13.41,17.59,19,19,17.59,13.41,12z"
-            android:fillColor="@android:color/white"/>
-</vector>
diff --git a/design/tests/res/layout/action_layout.xml b/design/tests/res/layout/action_layout.xml
deleted file mode 100644
index 8c4dc05..0000000
--- a/design/tests/res/layout/action_layout.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<android.support.v7.widget.SwitchCompat
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/toggle"
-    android:orientation="vertical"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent"
-    android:gravity="center_vertical"/>
diff --git a/design/tests/res/layout/action_layout_custom.xml b/design/tests/res/layout/action_layout_custom.xml
deleted file mode 100644
index 10a3268..0000000
--- a/design/tests/res/layout/action_layout_custom.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<TextView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@color/lilac_default"
-    android:text="@string/navigate_custom"/>
diff --git a/design/tests/res/layout/activity_coordinator_layout.xml b/design/tests/res/layout/activity_coordinator_layout.xml
deleted file mode 100644
index 93bf947..0000000
--- a/design/tests/res/layout/activity_coordinator_layout.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-             android:id="@+id/container"
-             android:layout_width="match_parent"
-             android:layout_height="match_parent">
-
-    <android.support.design.widget.CoordinatorLayout
-        android:id="@+id/coordinator"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" />
-
-</FrameLayout>
\ No newline at end of file
diff --git a/design/tests/res/layout/custom_snackbar_include.xml b/design/tests/res/layout/custom_snackbar_include.xml
deleted file mode 100644
index 4e610df..0000000
--- a/design/tests/res/layout/custom_snackbar_include.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
--->
-
-<android.support.design.widget.CustomSnackbarMainContent
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:theme="@style/ThemeOverlay.AppCompat.Dark"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:padding="8dp">
-
-    <ImageView
-        android:id="@+id/custom_snackbar_image_leading"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_marginRight="8dp"
-        android:src="@drawable/ic_account_circle_white_48dp" />
-
-    <ImageView
-        android:id="@+id/custom_snackbar_image_trailing"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentRight="true"
-        android:layout_marginTop="8dp"
-        android:src="@drawable/ic_lightbulb_outline_white_24dp" />
-
-    <TextView
-        android:id="@+id/custom_snackbar_title"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_toRightOf="@id/custom_snackbar_image_leading"
-        android:layout_toLeftOf="@id/custom_snackbar_image_trailing"
-        android:layout_marginTop="4dp"
-        android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
-        android:textStyle="bold"
-        android:singleLine="true" />
-
-    <TextView
-        android:id="@+id/custom_snackbar_subtitle"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_toRightOf="@id/custom_snackbar_image_leading"
-        android:layout_toLeftOf="@id/custom_snackbar_image_trailing"
-        android:layout_below="@id/custom_snackbar_title"
-        android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
-        android:singleLine="true" />
-
-</android.support.design.widget.CustomSnackbarMainContent>
diff --git a/design/tests/res/layout/design_appbar_anchored_fab_margin_bottom.xml b/design/tests/res/layout/design_appbar_anchored_fab_margin_bottom.xml
deleted file mode 100644
index aaed2f9..0000000
--- a/design/tests/res/layout/design_appbar_anchored_fab_margin_bottom.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <include layout="@layout/design_content_appbar_toolbar_collapse_pin" />
-
-    <android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        app:layout_anchor="@+id/app_bar"
-        app:layout_anchorGravity="bottom|center_horizontal"
-        android:src="@drawable/ic_add"
-        android:layout_marginBottom="@dimen/fab_margin"
-        android:clickable="true" />
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_anchored_fab_margin_left.xml b/design/tests/res/layout/design_appbar_anchored_fab_margin_left.xml
deleted file mode 100644
index 9fabb7b..0000000
--- a/design/tests/res/layout/design_appbar_anchored_fab_margin_left.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <include layout="@layout/design_content_appbar_toolbar_collapse_pin" />
-
-    <android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        app:layout_anchor="@+id/app_bar"
-        app:layout_anchorGravity="bottom|left"
-        android:src="@drawable/ic_add"
-        android:layout_marginLeft="@dimen/fab_margin"
-        android:clickable="true" />
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_anchored_fab_margin_right.xml b/design/tests/res/layout/design_appbar_anchored_fab_margin_right.xml
deleted file mode 100644
index ea2e1c0..0000000
--- a/design/tests/res/layout/design_appbar_anchored_fab_margin_right.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <include layout="@layout/design_content_appbar_toolbar_collapse_pin" />
-
-    <android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        app:layout_anchor="@+id/app_bar"
-        app:layout_anchorGravity="bottom|right"
-        android:src="@drawable/ic_add"
-        android:layout_marginRight="@dimen/fab_margin"
-        android:clickable="true" />
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_anchored_fab_margin_top.xml b/design/tests/res/layout/design_appbar_anchored_fab_margin_top.xml
deleted file mode 100644
index 763d013..0000000
--- a/design/tests/res/layout/design_appbar_anchored_fab_margin_top.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <include layout="@layout/design_content_appbar_toolbar_collapse_pin" />
-
-    <android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        app:layout_anchor="@+id/app_bar"
-        app:layout_anchorGravity="bottom|center_horizontal"
-        android:src="@drawable/ic_add"
-        android:layout_marginTop="@dimen/fab_margin"
-        android:clickable="true" />
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_dodge_left.xml b/design/tests/res/layout/design_appbar_dodge_left.xml
deleted file mode 100644
index 7f3ecb9..0000000
--- a/design/tests/res/layout/design_appbar_dodge_left.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
-  -->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <include layout="@layout/design_content_appbar_toolbar_collapse_pin" />
-
-    <android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:layout_gravity="bottom|left"
-        android:src="@drawable/ic_album_black_24dp"
-        app:layout_insetEdge="left"
-        android:clickable="true" />
-
-    <android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab2"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:layout_gravity="bottom|left"
-        android:src="@drawable/ic_airplay_black_24dp"
-        app:layout_dodgeInsetEdges="left"
-        android:clickable="true" />
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_dodge_right.xml b/design/tests/res/layout/design_appbar_dodge_right.xml
deleted file mode 100644
index 10815c0..0000000
--- a/design/tests/res/layout/design_appbar_dodge_right.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
-  -->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <include layout="@layout/design_content_appbar_toolbar_collapse_pin" />
-
-    <android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:layout_gravity="bottom|right"
-        android:src="@drawable/ic_album_black_24dp"
-        app:layout_insetEdge="right"
-        android:clickable="true" />
-
-    <android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab2"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:layout_gravity="bottom|right"
-        android:src="@drawable/ic_airplay_black_24dp"
-        app:layout_dodgeInsetEdges="right"
-        android:clickable="true" />
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_horizontal_scrolling.xml b/design/tests/res/layout/design_appbar_horizontal_scrolling.xml
deleted file mode 100644
index 131a07e..0000000
--- a/design/tests/res/layout/design_appbar_horizontal_scrolling.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
-  -->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <android.support.design.widget.AppBarLayout
-        android:id="@+id/app_bar"
-        android:layout_width="match_parent"
-        android:layout_height="200dp"
-        android:fitsSystemWindows="true">
-
-        <android.support.design.widget.CollapsingToolbarLayout
-            android:id="@+id/toolbar_layout"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:fitsSystemWindows="true"
-            app:contentScrim="?attr/colorPrimary"
-            app:layout_scrollFlags="scroll|exitUntilCollapsed">
-
-            <HorizontalScrollView
-                android:id="@+id/hsv"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content">
-
-                <LinearLayout
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:orientation="horizontal">
-
-                    <View
-                        android:layout_width="200dp"
-                        android:layout_height="200dp"
-                        android:background="#ff0000"/>
-
-                    <View
-                        android:layout_width="900dp"
-                        android:layout_height="200dp"
-                        android:background="#00ff00"/>
-
-                    <View
-                        android:layout_width="900dp"
-                        android:layout_height="200dp"
-                        android:background="#0000ff"/>
-                </LinearLayout>
-            </HorizontalScrollView>
-
-            <android.support.v7.widget.Toolbar
-                android:id="@+id/toolbar"
-                android:layout_width="match_parent"
-                android:layout_height="?attr/actionBarSize"
-                app:layout_collapseMode="pin"/>
-
-        </android.support.design.widget.CollapsingToolbarLayout>
-    </android.support.design.widget.AppBarLayout>
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        app:layout_behavior="@string/appbar_scrolling_view_behavior">
-
-        <Button
-            android:id="@+id/button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_margin="24dp"
-            android:text="@string/text1"/>
-
-    </FrameLayout>
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_toolbar_collapse_pin.xml b/design/tests/res/layout/design_appbar_toolbar_collapse_pin.xml
deleted file mode 100644
index e6cfb96..0000000
--- a/design/tests/res/layout/design_appbar_toolbar_collapse_pin.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <include layout="@layout/design_content_appbar_toolbar_collapse_pin" />
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_toolbar_collapse_pin_margins.xml b/design/tests/res/layout/design_appbar_toolbar_collapse_pin_margins.xml
deleted file mode 100644
index 4eed2e2..0000000
--- a/design/tests/res/layout/design_appbar_toolbar_collapse_pin_margins.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <android.support.design.widget.AppBarLayout
-        android:id="@+id/app_bar"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/appbar_height">
-
-        <android.support.design.widget.CollapsingToolbarLayout
-            android:id="@+id/collapsing_app_bar"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            app:layout_scrollFlags="scroll">
-
-            <android.support.v7.widget.Toolbar
-                android:id="@+id/toolbar"
-                android:layout_height="?attr/actionBarSize"
-                android:layout_width="match_parent"
-                android:layout_marginTop="20dp"
-                android:layout_marginBottom="20dp"
-                app:layout_collapseMode="pin"/>
-
-        </android.support.design.widget.CollapsingToolbarLayout>
-
-    </android.support.design.widget.AppBarLayout>
-
-    <include layout="@layout/include_appbar_scrollview" />
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_toolbar_collapse_pin_restore_test.xml b/design/tests/res/layout/design_appbar_toolbar_collapse_pin_restore_test.xml
deleted file mode 100644
index fbe031b..0000000
--- a/design/tests/res/layout/design_appbar_toolbar_collapse_pin_restore_test.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/coordinator_layout"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <android.support.design.widget.AppBarLayout
-        android:id="@+id/app_bar"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/appbar_height"
-        android:fitsSystemWindows="true"
-        app:expanded="true">
-
-        <android.support.design.widget.CollapsingToolbarLayout
-            android:id="@+id/collapsing_app_bar"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            app:layout_scrollFlags="scroll|exitUntilCollapsed">
-
-            <android.support.v7.widget.Toolbar
-                android:id="@+id/toolbar"
-                android:layout_height="?attr/actionBarSize"
-                android:layout_width="match_parent"
-                app:layout_collapseMode="pin"/>
-
-        </android.support.design.widget.CollapsingToolbarLayout>
-
-    </android.support.design.widget.AppBarLayout>
-
-    <include layout="@layout/include_appbar_scrollview" />
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_toolbar_collapse_pin_with_fab.xml b/design/tests/res/layout/design_appbar_toolbar_collapse_pin_with_fab.xml
deleted file mode 100644
index f5a2557..0000000
--- a/design/tests/res/layout/design_appbar_toolbar_collapse_pin_with_fab.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <include layout="@layout/design_content_appbar_toolbar_collapse_pin" />
-
-    <android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        app:layout_anchor="@+id/app_bar"
-        app:layout_anchorGravity="bottom|right|end"
-        android:layout_marginRight="16dp"
-        android:clickable="true"
-        app:backgroundTint="#FF0000"/>
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_toolbar_collapse_scroll.xml b/design/tests/res/layout/design_appbar_toolbar_collapse_scroll.xml
deleted file mode 100644
index 8c68021..0000000
--- a/design/tests/res/layout/design_appbar_toolbar_collapse_scroll.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <android.support.design.widget.AppBarLayout
-        android:id="@+id/app_bar"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/appbar_height"
-        android:fitsSystemWindows="true">
-
-        <android.support.design.widget.CollapsingToolbarLayout
-            android:id="@+id/collapsing_app_bar"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed">
-
-            <android.support.v7.widget.Toolbar
-                android:id="@+id/toolbar"
-                android:layout_height="?attr/actionBarSize"
-                android:layout_width="match_parent"
-                app:layout_collapseMode="pin"/>
-
-        </android.support.design.widget.CollapsingToolbarLayout>
-
-    </android.support.design.widget.AppBarLayout>
-
-    <include layout="@layout/include_appbar_scrollview" />
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_toolbar_collapse_scroll_enteralways.xml b/design/tests/res/layout/design_appbar_toolbar_collapse_scroll_enteralways.xml
deleted file mode 100644
index 43a8d51..0000000
--- a/design/tests/res/layout/design_appbar_toolbar_collapse_scroll_enteralways.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <android.support.design.widget.AppBarLayout
-        android:id="@+id/app_bar"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/appbar_height"
-        android:fitsSystemWindows="true">
-
-        <android.support.design.widget.CollapsingToolbarLayout
-            android:id="@+id/collapsing_app_bar"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            app:layout_scrollFlags="scroll|enterAlways">
-
-            <android.support.v7.widget.Toolbar
-                android:id="@+id/toolbar"
-                android:layout_height="?attr/actionBarSize"
-                android:layout_width="match_parent"
-                app:layout_collapseMode="pin"/>
-
-        </android.support.design.widget.CollapsingToolbarLayout>
-
-    </android.support.design.widget.AppBarLayout>
-
-    <include layout="@layout/include_appbar_scrollview" />
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_toolbar_collapse_sole_toolbar.xml b/design/tests/res/layout/design_appbar_toolbar_collapse_sole_toolbar.xml
deleted file mode 100644
index d2f3588..0000000
--- a/design/tests/res/layout/design_appbar_toolbar_collapse_sole_toolbar.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
-  -->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/col"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <android.support.design.widget.AppBarLayout
-        android:id="@+id/app_bar"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:fitsSystemWindows="true"
-        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
-
-        <android.support.design.widget.CollapsingToolbarLayout
-            android:id="@+id/collapsing_app_bar"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            app:layout_scrollFlags="scroll|exitUntilCollapsed">
-
-            <android.support.v7.widget.Toolbar
-                android:id="@+id/toolbar"
-                android:layout_width="match_parent"
-                android:layout_height="?attr/actionBarSize"
-                app:layout_collapseMode="pin"/>
-
-        </android.support.design.widget.CollapsingToolbarLayout>
-
-    </android.support.design.widget.AppBarLayout>
-
-    <include layout="@layout/include_appbar_scrollview"/>
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_toolbar_collapse_with_image.xml b/design/tests/res/layout/design_appbar_toolbar_collapse_with_image.xml
deleted file mode 100644
index a4d667f..0000000
--- a/design/tests/res/layout/design_appbar_toolbar_collapse_with_image.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <android.support.design.widget.AppBarLayout
-        android:id="@+id/app_bar"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/appbar_height"
-        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
-        android:fitsSystemWindows="true">
-
-        <android.support.design.widget.CollapsingToolbarLayout
-            android:id="@+id/collapsing_app_bar"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            app:layout_scrollFlags="scroll|exitUntilCollapsed">
-
-            <ImageView
-                android:id="@+id/app_bar_image"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                app:layout_collapseMode="parallax"
-                android:src="@drawable/photo"
-                android:scaleType="centerCrop"
-                android:fitsSystemWindows="true"/>
-
-            <android.support.v7.widget.Toolbar
-                android:id="@+id/toolbar"
-                android:layout_width="match_parent"
-                android:layout_height="?attr/actionBarSize"
-                app:layout_collapseMode="pin"/>
-
-        </android.support.design.widget.CollapsingToolbarLayout>
-
-    </android.support.design.widget.AppBarLayout>
-
-    <include layout="@layout/include_appbar_scrollview"/>
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_appbar_toolbar_scroll_fitsystemwindows_parent.xml b/design/tests/res/layout/design_appbar_toolbar_scroll_fitsystemwindows_parent.xml
deleted file mode 100644
index b41ab95..0000000
--- a/design/tests/res/layout/design_appbar_toolbar_scroll_fitsystemwindows_parent.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-
-    <android.support.design.widget.AppBarLayout
-        android:id="@+id/app_bar"
-        android:layout_height="wrap_content"
-        android:layout_width="match_parent">
-
-        <android.support.v7.widget.Toolbar
-            android:id="@+id/toolbar"
-            android:layout_height="?attr/actionBarSize"
-            android:layout_width="match_parent"
-            app:layout_scrollFlags="scroll|enterAlways"/>
-
-    </android.support.design.widget.AppBarLayout>
-
-    <include layout="@layout/include_appbar_scrollview"/>
-
-</android.support.design.widget.CoordinatorLayout>
-
diff --git a/design/tests/res/layout/design_appbar_toolbar_scroll_tabs_pinned.xml b/design/tests/res/layout/design_appbar_toolbar_scroll_tabs_pinned.xml
deleted file mode 100644
index cbb5ee0..0000000
--- a/design/tests/res/layout/design_appbar_toolbar_scroll_tabs_pinned.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <android.support.design.widget.AppBarLayout
-        android:id="@+id/app_bar"
-        android:layout_height="wrap_content"
-        android:layout_width="match_parent">
-
-        <android.support.v7.widget.Toolbar
-            android:id="@+id/toolbar"
-            android:layout_height="?attr/actionBarSize"
-            android:layout_width="match_parent"
-            app:layout_scrollFlags="scroll|enterAlways"/>
-
-        <android.support.design.widget.TabLayout
-            android:id="@+id/tabs"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            app:tabMode="scrollable"/>
-
-    </android.support.design.widget.AppBarLayout>
-
-    <include layout="@layout/include_appbar_scrollview"/>
-
-</android.support.design.widget.CoordinatorLayout>
-
diff --git a/design/tests/res/layout/design_appbar_toolbar_scroll_tabs_scroll.xml b/design/tests/res/layout/design_appbar_toolbar_scroll_tabs_scroll.xml
deleted file mode 100644
index 49b5597..0000000
--- a/design/tests/res/layout/design_appbar_toolbar_scroll_tabs_scroll.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <android.support.design.widget.AppBarLayout
-        android:id="@+id/app_bar"
-        android:layout_height="wrap_content"
-        android:layout_width="match_parent">
-
-        <android.support.v7.widget.Toolbar
-            android:id="@+id/toolbar"
-            android:layout_height="?attr/actionBarSize"
-            android:layout_width="match_parent"
-            app:layout_scrollFlags="scroll|enterAlways"/>
-
-        <android.support.design.widget.TabLayout
-            android:id="@+id/tabs"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            app:layout_scrollFlags="scroll|enterAlways"
-            app:tabMode="scrollable"/>
-
-    </android.support.design.widget.AppBarLayout>
-
-    <include layout="@layout/include_appbar_scrollview"/>
-
-</android.support.design.widget.CoordinatorLayout>
-
diff --git a/design/tests/res/layout/design_appbar_toolbar_scroll_tabs_scroll_snap.xml b/design/tests/res/layout/design_appbar_toolbar_scroll_tabs_scroll_snap.xml
deleted file mode 100644
index 0d067b1..0000000
--- a/design/tests/res/layout/design_appbar_toolbar_scroll_tabs_scroll_snap.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <android.support.design.widget.AppBarLayout
-        android:id="@+id/app_bar"
-        android:layout_height="wrap_content"
-        android:layout_width="match_parent">
-
-        <android.support.v7.widget.Toolbar
-            android:id="@+id/toolbar"
-            android:layout_height="?attr/actionBarSize"
-            android:layout_width="match_parent"
-            app:layout_scrollFlags="scroll|enterAlways|snap"/>
-
-        <android.support.design.widget.TabLayout
-            android:id="@+id/tabs"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            app:layout_scrollFlags="scroll|enterAlways|snap"
-            app:tabMode="scrollable"/>
-
-    </android.support.design.widget.AppBarLayout>
-
-    <include layout="@layout/include_appbar_scrollview"/>
-
-</android.support.design.widget.CoordinatorLayout>
-
diff --git a/design/tests/res/layout/design_bottom_navigation_view.xml b/design/tests/res/layout/design_bottom_navigation_view.xml
deleted file mode 100644
index 0e85aad..0000000
--- a/design/tests/res/layout/design_bottom_navigation_view.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-    <android.support.design.widget.BottomNavigationView
-        android:id="@+id/bottom_navigation"
-        android:layout_height="56dp"
-        android:layout_width="match_parent"
-        app:menu="@menu/bottom_navigation_view_content"
-        app:itemIconTint="@color/emerald_translucent"
-        app:itemTextColor="@color/emerald_text"
-        app:itemBackground="@color/sand_default" />
-</FrameLayout>
\ No newline at end of file
diff --git a/design/tests/res/layout/design_content_appbar_toolbar_collapse_pin.xml b/design/tests/res/layout/design_content_appbar_toolbar_collapse_pin.xml
deleted file mode 100644
index 961ce41..0000000
--- a/design/tests/res/layout/design_content_appbar_toolbar_collapse_pin.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<merge
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
-    <android.support.design.widget.AppBarLayout
-        android:id="@+id/app_bar"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/appbar_height"
-        android:fitsSystemWindows="true">
-
-        <android.support.design.widget.CollapsingToolbarLayout
-            android:id="@+id/collapsing_app_bar"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            app:layout_scrollFlags="scroll|exitUntilCollapsed">
-
-            <android.support.v7.widget.Toolbar
-                android:id="@+id/toolbar"
-                android:layout_height="?attr/actionBarSize"
-                android:layout_width="match_parent"
-                app:layout_collapseMode="pin"/>
-
-        </android.support.design.widget.CollapsingToolbarLayout>
-
-    </android.support.design.widget.AppBarLayout>
-
-    <include layout="@layout/include_appbar_scrollview" />
-</merge>
\ No newline at end of file
diff --git a/design/tests/res/layout/design_fab.xml b/design/tests/res/layout/design_fab.xml
deleted file mode 100644
index 44fe826..0000000
--- a/design/tests/res/layout/design_fab.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2015 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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-              xmlns:android="http://schemas.android.com/apk/res/android"
-              xmlns:app="http://schemas.android.com/apk/res-auto"
-              android:id="@+id/container"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:orientation="vertical">
-
-    <!-- Dummy view to steal the focus -->
-    <ImageButton
-        android:id="@+id/dummy_focus_vew"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"/>
-
-    <android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab_standard"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:layout_margin="16dp"
-        android:src="@drawable/ic_add"/>
-
-    <android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab_tint"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:layout_margin="16dp"
-        android:src="@drawable/ic_add"
-        app:backgroundTint="#FF00FF"/>
-
-    <android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab_state_tint"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:layout_margin="16dp"
-        android:src="@drawable/ic_add"
-        app:backgroundTint="@color/fab_tint"/>
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/design_navigation_view.xml b/design/tests/res/layout/design_navigation_view.xml
deleted file mode 100644
index 4f7147d..0000000
--- a/design/tests/res/layout/design_navigation_view.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<android.support.v4.widget.DrawerLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/drawer_layout"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:fitsSystemWindows="true">
-    <!-- As the main content view, the view below consumes the entire
-         space available using match_parent in both dimensions. Note that
-         this child does not specify android:layout_gravity attribute. -->
-    <FrameLayout
-        android:id="@+id/content"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" />
-
-    <!-- android:layout_gravity="start" tells DrawerLayout to treat
-         this as a sliding drawer on the starting side, which is
-         left for left-to-right locales. The navigation view extends
-         the full height of the container. A
-         solid background is used for contrast with the content view.
-         android:fitsSystemWindows="true" tells the system to have
-         DrawerLayout span the full height of the screen, including the
-         system status bar on Lollipop+ versions of the plaform. -->
-    <android.support.design.widget.NavigationTestView
-        android:id="@+id/start_drawer"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_gravity="start"
-        android:background="#333"
-        android:fitsSystemWindows="true"
-        app:menu="@menu/navigation_view_content"
-        app:itemIconTint="@color/emerald_translucent"
-        app:itemTextColor="@color/emerald_text"
-        app:itemBackground="@color/sand_default"
-        app:itemTextAppearance="@style/TextMediumStyle" />
-
-</android.support.v4.widget.DrawerLayout>
-
diff --git a/design/tests/res/layout/design_navigation_view_header1.xml b/design/tests/res/layout/design_navigation_view_header1.xml
deleted file mode 100644
index 2fd6f20..0000000
--- a/design/tests/res/layout/design_navigation_view_header1.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<View
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/header1"
-    android:layout_width="match_parent"
-    android:layout_height="120dip"
-    android:background="@color/test_red" />
-
diff --git a/design/tests/res/layout/design_navigation_view_header2.xml b/design/tests/res/layout/design_navigation_view_header2.xml
deleted file mode 100644
index 77ad32a..0000000
--- a/design/tests/res/layout/design_navigation_view_header2.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<View
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/header2"
-    android:layout_width="match_parent"
-    android:layout_height="100dip"
-    android:background="@color/test_blue" />
-
diff --git a/design/tests/res/layout/design_navigation_view_header3.xml b/design/tests/res/layout/design_navigation_view_header3.xml
deleted file mode 100644
index b1fd676..0000000
--- a/design/tests/res/layout/design_navigation_view_header3.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<View
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/header3"
-    android:layout_width="match_parent"
-    android:layout_height="80dip"
-    android:background="@color/test_green" />
-
diff --git a/design/tests/res/layout/design_navigation_view_header_switch.xml b/design/tests/res/layout/design_navigation_view_header_switch.xml
deleted file mode 100644
index 5bfe8fa..0000000
--- a/design/tests/res/layout/design_navigation_view_header_switch.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/header_frame"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:padding="16dp">
-
-    <android.support.v7.widget.SwitchCompat
-        android:id="@+id/header_toggle"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:fitsSystemWindows="true"/>
-
-</FrameLayout>
diff --git a/design/tests/res/layout/design_snackbar_with_fab.xml b/design/tests/res/layout/design_snackbar_with_fab.xml
deleted file mode 100644
index a06dc1b..0000000
--- a/design/tests/res/layout/design_snackbar_with_fab.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:layout_gravity="bottom|end"
-        android:layout_margin="16dp"
-        android:src="@drawable/ic_add"
-        android:clickable="true" />
-
-</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/design/tests/res/layout/design_tab_item_custom.xml b/design/tests/res/layout/design_tab_item_custom.xml
deleted file mode 100644
index f6ba30b..0000000
--- a/design/tests/res/layout/design_tab_item_custom.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<View xmlns:android="http://schemas.android.com/apk/res/android"
-          android:id="@+id/my_custom_tab"
-          android:layout_width="match_parent"
-          android:layout_height="match_parent" />
\ No newline at end of file
diff --git a/design/tests/res/layout/design_tabs.xml b/design/tests/res/layout/design_tabs.xml
deleted file mode 100644
index fbb24bd..0000000
--- a/design/tests/res/layout/design_tabs.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.TabLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content" />
diff --git a/design/tests/res/layout/design_tabs_fixed_width.xml b/design/tests/res/layout/design_tabs_fixed_width.xml
deleted file mode 100644
index 752034f..0000000
--- a/design/tests/res/layout/design_tabs_fixed_width.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<!-- Width is fixed to test scrolling -->
-<android.support.design.widget.TabLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/tabs"
-    android:layout_width="160dp"
-    android:layout_height="wrap_content"
-    app:tabMode="scrollable">
-
-    <android.support.design.widget.TabItem
-        android:text="Tab 0" />
-
-    <android.support.design.widget.TabItem
-        android:text="Tab 1" />
-
-    <android.support.design.widget.TabItem
-        android:text="Tab 2" />
-
-    <android.support.design.widget.TabItem
-        android:text="Tab 3" />
-
-    <android.support.design.widget.TabItem
-        android:text="Tab 4" />
-
-    <android.support.design.widget.TabItem
-        android:text="Tab 5" />
-
-    <android.support.design.widget.TabItem
-        android:text="Tab 6" />
-
-    <android.support.design.widget.TabItem
-        android:text="Tab 7" />
-
-</android.support.design.widget.TabLayout>
diff --git a/design/tests/res/layout/design_tabs_items.xml b/design/tests/res/layout/design_tabs_items.xml
deleted file mode 100644
index e67f3b6..0000000
--- a/design/tests/res/layout/design_tabs_items.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.TabLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-
-    <android.support.design.widget.TabItem
-            android:text="@string/tab_layout_text"/>
-
-    <android.support.design.widget.TabItem
-            android:icon="@android:drawable/star_on"/>
-
-    <android.support.design.widget.TabItem
-            android:layout="@layout/design_tab_item_custom"/>
-
-</android.support.design.widget.TabLayout>
\ No newline at end of file
diff --git a/design/tests/res/layout/design_tabs_twice.xml b/design/tests/res/layout/design_tabs_twice.xml
deleted file mode 100644
index 1421c10..0000000
--- a/design/tests/res/layout/design_tabs_twice.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/container"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <android.support.design.widget.TabLayout
-        android:id="@+id/tabs_1"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-
-        <android.support.design.widget.TabItem
-            android:text="@string/tab_layout_text"/>
-
-        <android.support.design.widget.TabItem
-            android:icon="@android:drawable/star_on"/>
-
-        <android.support.design.widget.TabItem
-            android:layout="@layout/design_tab_item_custom"/>
-
-    </android.support.design.widget.TabLayout>
-
-    <android.support.design.widget.TabLayout
-        android:id="@+id/tabs_2"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content" />
-
-</LinearLayout>
diff --git a/design/tests/res/layout/design_tabs_viewpager.xml b/design/tests/res/layout/design_tabs_viewpager.xml
deleted file mode 100644
index 9cc7bcb..0000000
--- a/design/tests/res/layout/design_tabs_viewpager.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2015 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.
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/container"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <android.support.v7.widget.Toolbar
-        android:id="@+id/toolbar"
-        android:layout_width="match_parent"
-        android:layout_height="?attr/actionBarSize"
-        android:background="?attr/colorPrimary"
-        app:contentInsetStart="72dp"/>
-
-    <include layout="@layout/tab_layout_unbound" />
-
-    <android.support.v4.view.ViewPager
-        android:id="@+id/tabs_viewpager"
-        android:layout_width="match_parent"
-        android:layout_height="0px"
-        android:layout_weight="1"/>
-
-</LinearLayout>
diff --git a/design/tests/res/layout/design_tabs_with_non_tabitems.xml b/design/tests/res/layout/design_tabs_with_non_tabitems.xml
deleted file mode 100644
index cb96715..0000000
--- a/design/tests/res/layout/design_tabs_with_non_tabitems.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<android.support.design.widget.TabLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content">
-
-    <TextView
-        android:text="@string/tab_layout_text"/>
-
-    <TextView
-        android:src="@android:drawable/star_on"/>
-
-    <include
-        layout="@layout/design_tab_item_custom"/>
-
-</android.support.design.widget.TabLayout>
\ No newline at end of file
diff --git a/design/tests/res/layout/design_text_input.xml b/design/tests/res/layout/design_text_input.xml
deleted file mode 100644
index 4dba825..0000000
--- a/design/tests/res/layout/design_text_input.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              xmlns:app="http://schemas.android.com/apk/res-auto"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:orientation="vertical"
-              android:padding="16dp">
-
-    <android.support.design.widget.TextInputLayout
-            android:id="@+id/textinput"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            app:errorEnabled="true">
-
-        <android.support.design.widget.TextInputEditText
-                android:id="@+id/textinput_edittext"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:imeOptions="flagNoExtractUi"
-                android:hint="@string/textinput_hint"/>
-
-    </android.support.design.widget.TextInputLayout>
-
-    <android.support.design.widget.TextInputLayout
-        android:id="@+id/textinput_password"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        app:passwordToggleEnabled="true">
-
-        <android.support.design.widget.TextInputEditText
-            android:id="@+id/textinput_edittext_pwd"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:imeOptions="flagNoExtractUi"
-            android:hint="@string/textinput_hint"
-            android:inputType="textPassword"/>
-
-    </android.support.design.widget.TextInputLayout>
-
-    <android.support.design.widget.TextInputLayout
-        android:id="@+id/textinput_noedittext"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"/>
-
-    <android.support.design.widget.TextInputLayout
-        android:id="@+id/textinput_with_text"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-
-        <android.support.design.widget.TextInputEditText
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:imeOptions="flagNoExtractUi"
-            android:hint="@string/textinput_hint"
-            android:text="@string/snackbar_text"/>
-
-    </android.support.design.widget.TextInputLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/design/tests/res/layout/dynamic_coordinator_layout.xml b/design/tests/res/layout/dynamic_coordinator_layout.xml
deleted file mode 100644
index a2253c7..0000000
--- a/design/tests/res/layout/dynamic_coordinator_layout.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!-- ViewStub that will be inflated to a CoordinatorLayout at test runtime. -->
-<ViewStub
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/coordinator_stub"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:inflatedId="@+id/coordinator_layout"
-    android:fitsSystemWindows="true" />
diff --git a/design/tests/res/layout/frame_layout.xml b/design/tests/res/layout/frame_layout.xml
deleted file mode 100644
index 45b3474..0000000
--- a/design/tests/res/layout/frame_layout.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-             android:layout_width="match_parent"
-             android:layout_height="match_parent"/>
diff --git a/design/tests/res/layout/include_appbar_scrollview.xml b/design/tests/res/layout/include_appbar_scrollview.xml
deleted file mode 100644
index cd6eca2..0000000
--- a/design/tests/res/layout/include_appbar_scrollview.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<android.support.v4.widget.NestedScrollView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/scrolling_content"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    app:layout_behavior="@string/appbar_scrolling_view_behavior">
-
-    <LinearLayout
-        android:id="@+id/scrolling_content_inner"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical">
-
-        <TextView
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center_horizontal"
-            android:text="@string/scroll_top" />
-
-        <TextView
-            android:id="@+id/textview_dialogue"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:padding="16dp"/>
-
-        <TextView
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center_horizontal"
-            android:text="@string/scroll_bottom" />
-
-    </LinearLayout>
-
-</android.support.v4.widget.NestedScrollView>
\ No newline at end of file
diff --git a/design/tests/res/layout/tab_layout_bound_max.xml b/design/tests/res/layout/tab_layout_bound_max.xml
deleted file mode 100644
index 9958edf..0000000
--- a/design/tests/res/layout/tab_layout_bound_max.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2015 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.
--->
-
-<android.support.design.widget.TabLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        android:id="@+id/tabs"
-        android:layout_height="wrap_content"
-        android:layout_width="match_parent"
-        app:tabMode="scrollable"
-        app:tabContentStart="72dp"
-        app:tabMaxWidth="@dimen/tab_width_limit_medium" />
diff --git a/design/tests/res/layout/tab_layout_bound_min.xml b/design/tests/res/layout/tab_layout_bound_min.xml
deleted file mode 100644
index a05bd64..0000000
--- a/design/tests/res/layout/tab_layout_bound_min.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2015 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.
--->
-
-<android.support.design.widget.TabLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        android:id="@+id/tabs"
-        android:layout_height="wrap_content"
-        android:layout_width="match_parent"
-        app:tabMode="scrollable"
-        app:tabContentStart="72dp"
-        app:tabMinWidth="@dimen/tab_width_limit_medium" />
diff --git a/design/tests/res/layout/tab_layout_bound_minmax.xml b/design/tests/res/layout/tab_layout_bound_minmax.xml
deleted file mode 100644
index 0e34286..0000000
--- a/design/tests/res/layout/tab_layout_bound_minmax.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2015 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.
--->
-
-<android.support.design.widget.TabLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        android:id="@+id/tabs"
-        android:layout_height="wrap_content"
-        android:layout_width="match_parent"
-        app:tabMode="scrollable"
-        app:tabContentStart="72dp"
-        app:tabMinWidth="@dimen/tab_width_limit_small"
-        app:tabMaxWidth="@dimen/tab_width_limit_large" />
diff --git a/design/tests/res/layout/tab_layout_unbound.xml b/design/tests/res/layout/tab_layout_unbound.xml
deleted file mode 100644
index fb51d4d..0000000
--- a/design/tests/res/layout/tab_layout_unbound.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2015 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.
--->
-
-<android.support.design.widget.TabLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        android:id="@+id/tabs"
-        android:layout_height="wrap_content"
-        android:layout_width="match_parent"
-        app:tabMode="scrollable"
-        app:tabContentStart="72dp"/>
diff --git a/design/tests/res/layout/test_design_bottom_sheet_behavior.xml b/design/tests/res/layout/test_design_bottom_sheet_behavior.xml
deleted file mode 100644
index 8a2835e..0000000
--- a/design/tests/res/layout/test_design_bottom_sheet_behavior.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<android.support.design.widget.CoordinatorLayout
-        android:id="@+id/coordinator"
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-    <LinearLayout
-            android:id="@+id/bottom_sheet"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="vertical"
-            android:background="#00f"
-            app:layout_behavior="@string/bottom_sheet_behavior"
-            app:behavior_peekHeight="@dimen/bottom_sheet_peek_height"
-            app:behavior_hideable="true">
-
-    </LinearLayout>
-
-    <android.support.design.widget.FloatingActionButton
-            android:id="@+id/fab"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:src="@drawable/ic_add"
-            app:layout_anchor="@id/bottom_sheet"
-            app:layout_anchorGravity="top|end"
-            app:useCompatPadding="true"
-            app:backgroundTint="#f00"/>
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/test_design_bottom_sheet_behavior_with_insets.xml b/design/tests/res/layout/test_design_bottom_sheet_behavior_with_insets.xml
deleted file mode 100644
index 442654c..0000000
--- a/design/tests/res/layout/test_design_bottom_sheet_behavior_with_insets.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<android.support.design.widget.CoordinatorLayout
-        android:id="@+id/coordinator"
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        android:fitsSystemWindows="true"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-    <LinearLayout
-            android:id="@+id/bottom_sheet"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="vertical"
-            android:background="#00f"
-            app:layout_behavior="@string/bottom_sheet_behavior"
-            app:behavior_peekHeight="@dimen/bottom_sheet_peek_height"
-            app:behavior_hideable="true">
-
-        <View
-            android:id="@+id/bottom_sheet_content"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:background="#f00"/>
-
-    </LinearLayout>
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/res/layout/test_design_snackbar.xml b/design/tests/res/layout/test_design_snackbar.xml
deleted file mode 100644
index cb3643a..0000000
--- a/design/tests/res/layout/test_design_snackbar.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:id="@+id/col"
-        android:fitsSystemWindows="true"/>
\ No newline at end of file
diff --git a/design/tests/res/layout/test_design_snackbar_fab.xml b/design/tests/res/layout/test_design_snackbar_fab.xml
deleted file mode 100644
index 68e5353..0000000
--- a/design/tests/res/layout/test_design_snackbar_fab.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<android.support.design.widget.CoordinatorLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:id="@+id/col">
-
-    <android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:layout_gravity="right|bottom"
-        android:src="@drawable/ic_add"/>
-
-</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/design/tests/res/menu/bottom_navigation_view_content.xml b/design/tests/res/menu/bottom_navigation_view_content.xml
deleted file mode 100644
index d61d6d8..0000000
--- a/design/tests/res/menu/bottom_navigation_view_content.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
-
-     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.
--->
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
-      xmlns:app="http://schemas.android.com/apk/res-auto">
-    <item android:id="@+id/destination_home"
-          android:icon="@drawable/test_drawable_red"
-          android:title="@string/navigate_home"
-          app:contentDescription="@string/navigate_home"
-          app:tooltipText="@string/navigate_home"/>
-    <item android:id="@+id/destination_profile"
-          android:icon="@drawable/test_drawable_green"
-          android:title="@string/navigate_profile"
-          app:contentDescription="@string/navigate_profile"
-          app:tooltipText="@string/navigate_profile"/>
-    <item android:id="@+id/destination_people"
-          android:icon="@drawable/test_drawable_blue"
-          android:title="@string/navigate_people"
-          app:contentDescription="@string/navigate_people"
-          app:tooltipText="@string/navigate_people"/>
-</menu>
diff --git a/design/tests/res/menu/navigation_view_content.xml b/design/tests/res/menu/navigation_view_content.xml
deleted file mode 100644
index 25fb016..0000000
--- a/design/tests/res/menu/navigation_view_content.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 Google Inc.
-
-     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.
--->
-<menu
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
-    <group android:checkableBehavior="single">
-        <item android:id="@+id/destination_home"
-              android:title="@string/navigate_home"
-              android:icon="@drawable/test_drawable_red" />
-        <item android:id="@+id/destination_profile"
-              android:title="@string/navigate_profile"
-              android:icon="@drawable/test_drawable_green" />
-        <item android:id="@+id/destination_people"
-              android:title="@string/navigate_people"
-              android:icon="@drawable/test_drawable_blue"
-              app:actionLayout="@layout/action_layout" />
-        <item android:id="@+id/destination_settings"
-              android:title="@string/navigate_settings" />
-        <item android:id="@+id/destination_custom"
-              app:actionLayout="@layout/action_layout_custom" />
-    </group>
-</menu>
diff --git a/design/tests/res/values/colors.xml b/design/tests/res/values/colors.xml
deleted file mode 100644
index ea8da2a..0000000
--- a/design/tests/res/values/colors.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<resources>
-    <color name="emerald_translucent">#8020A060</color>
-    <color name="emerald_text">#30B050</color>
-    <color name="red_translucent">#90FF2040</color>
-
-    <color name="lilac_default">#F080F0</color>
-    <color name="lilac_disabled">#F0A0FF</color>
-    <color name="sand_default">#F0B000</color>
-    <color name="sand_disabled">#FFC080</color>
-    <color name="sand_checked">#FFD0A0</color>
-
-    <color name="test_red">#FF6030</color>
-    <color name="test_green">#50E080</color>
-    <color name="test_blue">#3050CF</color>
-</resources>
diff --git a/design/tests/res/values/dimens.xml b/design/tests/res/values/dimens.xml
deleted file mode 100644
index 37c1f48..0000000
--- a/design/tests/res/values/dimens.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-<resources>
-    <dimen name="tab_width_limit_small">80dip</dimen>
-    <dimen name="tab_width_limit_medium">100dip</dimen>
-    <dimen name="tab_width_limit_large">120dip</dimen>
-    <dimen name="bottom_sheet_peek_height">256dp</dimen>
-
-    <dimen name="text_small_size">16sp</dimen>
-    <dimen name="text_medium_size">20sp</dimen>
-
-    <dimen name="drawable_small_size">12dip</dimen>
-    <dimen name="drawable_medium_size">16dip</dimen>
-    <dimen name="drawable_large_size">20dip</dimen>
-
-    <dimen name="appbar_height">160dip</dimen>
-    <dimen name="fab_margin">32dip</dimen>
-
-    <dimen name="fab_mini_height">40dp</dimen>
-    <dimen name="fab_normal_height">56dip</dimen>
-
-    <dimen name="custom_snackbar_max_width">-1px</dimen>
-</resources>
\ No newline at end of file
diff --git a/design/tests/res/values/ids.xml b/design/tests/res/values/ids.xml
deleted file mode 100644
index 52b8356..0000000
--- a/design/tests/res/values/ids.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-<resources>
-    <item name="page_0" type="id"/>
-    <item name="page_1" type="id"/>
-    <item name="page_2" type="id"/>
-    <item name="page_3" type="id"/>
-    <item name="page_4" type="id"/>
-    <item name="page_5" type="id"/>
-    <item name="page_6" type="id"/>
-    <item name="page_7" type="id"/>
-    <item name="page_8" type="id"/>
-    <item name="page_9" type="id"/>
-    <item name="textinputlayout" type="id"/>
-    <item name="textinputedittext" type="id"/>
-</resources>
\ No newline at end of file
diff --git a/design/tests/res/values/strings.xml b/design/tests/res/values/strings.xml
deleted file mode 100644
index 02763ec..0000000
--- a/design/tests/res/values/strings.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<resources>
-    <string name="tab_layout_text">Tab text!</string>
-
-    <string name="navigate_home">Home</string>
-    <string name="navigate_profile">Profile</string>
-    <string name="navigate_people">People</string>
-    <string name="navigate_custom">Custom</string>
-    <string name="navigate_settings">Settings</string>
-
-    <string name="snackbar_text">This is a test message</string>
-    <string name="snackbar_action">Undo</string>
-
-    <string name="text1">Text</string>
-
-    <string name="scroll_top">Top</string>
-    <string name="scroll_bottom">Bottom</string>
-    <string name="design_appbar_collapsing_toolbar_pin">AppBar/Collapsing Toolbar (pinned)</string>
-    <string name="design_appbar_collapsing_toolbar_scroll">AppBar/Collapsing Toolbar (scroll off)</string>
-    <string name="design_appbar_collapsing_toolbar_pin_fab">AppBar/Collapsing Toolbar (pinned with FAB)</string>
-    <string name="design_appbar_toolbar_scroll_tabs_scroll">AppBar/Toolbar Scroll + Tabs Scroll</string>
-    <string name="design_appbar_toolbar_scroll_tabs_scroll_snap">AppBar/Toolbar Scroll + Tabs Scroll + Snap</string>
-    <string name="design_appbar_toolbar_scroll_tabs_pin">AppBar/Toolbar Scroll + Tabs Pin</string>
-    <string name="design_appbar_collapsing_toolbar_pin_margins">AppBar/Collapsing Toolbar (pinned + margins)</string>
-    <string name="design_appbar_collapsing_toolbar_with_image">AppBar/Collapsing Toolbar + Parallax Image</string>
-    <string name="design_appbar_anchored_fab_margin_bottom">AppBar + anchored FAB with bottom margin</string>
-    <string name="design_appbar_anchored_fab_margin_top">AppBar + anchored FAB with top margin</string>
-    <string name="design_appbar_anchored_fab_margin_left">AppBar + anchored FAB with left margin</string>
-    <string name="design_appbar_anchored_fab_margin_right">AppBar + anchored FAB with right margin</string>
-
-    <string name="design_appbar_dodge_left">AppBar + FABs with dodge on left</string>
-    <string name="design_appbar_dodge_right">AppBar + FABs with dodge on right</string>
-
-    <string name="textinput_hint">Hint to the user</string>
-
-</resources>
\ No newline at end of file
diff --git a/design/tests/res/values/styles.xml b/design/tests/res/values/styles.xml
deleted file mode 100644
index eb6aee6..0000000
--- a/design/tests/res/values/styles.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<resources>
-    <style name="TextSmallStyle" parent="@android:style/TextAppearance">
-        <item name="android:textSize">@dimen/text_small_size</item>
-    </style>
-
-    <style name="TextMediumStyle" parent="@android:style/TextAppearance.Medium">
-        <item name="android:textSize">@dimen/text_medium_size</item>
-    </style>
-
-    <style name="Theme.TranslucentStatus" parent="Theme.AppCompat.Light.NoActionBar">
-        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
-        <item name="android:statusBarColor">@android:color/transparent</item>
-    </style>
-
-    <style name="Theme.TranslucentNavBar" parent="Theme.AppCompat.Light.NoActionBar">
-        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
-    </style>
-
-
-    <style name="TextAppearanceWithThemedCslTextColor" parent="@android:style/TextAppearance">
-        <item name="android:textColor">@color/color_state_list_themed</item>
-    </style>
-
-    <style name="AppBarWithScrollbars" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
-        <item name="android:scrollbars">horizontal</item>
-    </style>
-</resources>
\ No newline at end of file
diff --git a/design/tests/src/android/support/design/testutils/AppBarLayoutMatchers.java b/design/tests/src/android/support/design/testutils/AppBarLayoutMatchers.java
deleted file mode 100755
index 4d6fc63..0000000
--- a/design/tests/src/android/support/design/testutils/AppBarLayoutMatchers.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-import android.support.design.widget.AppBarLayout;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-public class AppBarLayoutMatchers {
-
-    /**
-     * Returns a matcher that matches AppBarLayouts which are collapsed.
-     */
-    public static Matcher isCollapsed() {
-        return new TypeSafeMatcher<AppBarLayout>() {
-            @Override
-            public void describeTo(Description description) {
-                description.appendText("AppBarLayout is collapsed");
-            }
-
-            @Override
-            protected boolean matchesSafely(AppBarLayout item) {
-                return item.getBottom() == (item.getHeight() - item.getTotalScrollRange());
-            }
-        };
-    }
-
-}
diff --git a/design/tests/src/android/support/design/testutils/BottomNavigationViewActions.java b/design/tests/src/android/support/design/testutils/BottomNavigationViewActions.java
deleted file mode 100644
index 31b527f..0000000
--- a/design/tests/src/android/support/design/testutils/BottomNavigationViewActions.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-
-import android.content.res.ColorStateList;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.IdRes;
-import android.support.annotation.Nullable;
-import android.support.design.widget.BottomNavigationView;
-import android.support.test.espresso.UiController;
-import android.support.test.espresso.ViewAction;
-import android.view.View;
-
-import org.hamcrest.Matcher;
-
-
-public class BottomNavigationViewActions {
-    /**
-     * Sets item icon tint list on the content of the bottom navigation view.
-     */
-    public static ViewAction setItemIconTintList(@Nullable final ColorStateList tint) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "Set item icon tint list";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                BottomNavigationView navigationView = (BottomNavigationView) view;
-                navigationView.setItemIconTintList(tint);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Sets icon for the menu item of the navigation view.
-     */
-    public static ViewAction setIconForMenuItem(@IdRes final int menuItemId,
-            final Drawable iconDrawable) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "Set menu item icon";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                BottomNavigationView navigationView = (BottomNavigationView) view;
-                navigationView.getMenu().findItem(menuItemId).setIcon(iconDrawable);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-}
diff --git a/design/tests/src/android/support/design/testutils/Cheeses.java b/design/tests/src/android/support/design/testutils/Cheeses.java
deleted file mode 100644
index 6215569..0000000
--- a/design/tests/src/android/support/design/testutils/Cheeses.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-public class Cheeses {
-
-    public static final String[] sCheeseStrings = {
-            "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
-            "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale",
-            "Aisy Cendre", "Allgauer Emmentaler", "Alverca", "Ambert", "American Cheese",
-            "Ami du Chambertin", "Anejo Enchilado", "Anneau du Vic-Bilh", "Anthoriro", "Appenzell",
-            "Aragon", "Ardi Gasna", "Ardrahan", "Armenian String", "Aromes au Gene de Marc",
-            "Asadero", "Asiago", "Aubisque Pyrenees", "Autun", "Avaxtskyr", "Baby Swiss",
-            "Babybel", "Baguette Laonnaise", "Bakers", "Baladi", "Balaton", "Bandal", "Banon",
-            "Barry's Bay Cheddar", "Basing", "Basket Cheese", "Bath Cheese", "Bavarian Bergkase",
-            "Baylough", "Beaufort", "Beauvoorde", "Beenleigh Blue", "Beer Cheese", "Bel Paese",
-            "Bergader", "Bergere Bleue", "Berkswell", "Beyaz Peynir", "Bierkase", "Bishop Kennedy",
-            "Blarney", "Bleu d'Auvergne", "Bleu de Gex", "Bleu de Laqueuille",
-            "Bleu de Septmoncel", "Bleu Des Causses", "Blue", "Blue Castello", "Blue Rathgore",
-            "Blue Vein (Australian)", "Blue Vein Cheeses", "Bocconcini", "Bocconcini (Australian)",
-            "Boeren Leidenkaas", "Bonchester", "Bosworth", "Bougon", "Boule Du Roves",
-            "Boulette d'Avesnes", "Boursault", "Boursin", "Bouyssou", "Bra", "Braudostur",
-            "Breakfast Cheese", "Brebis du Lavort", "Brebis du Lochois", "Brebis du Puyfaucon",
-            "Bresse Bleu", "Brick", "Brie", "Brie de Meaux", "Brie de Melun", "Brillat-Savarin",
-            "Brin", "Brin d' Amour", "Brin d'Amour", "Brinza (Burduf Brinza)",
-            "Briquette de Brebis", "Briquette du Forez", "Broccio", "Broccio Demi-Affine",
-            "Brousse du Rove", "Bruder Basil", "Brusselae Kaas (Fromage de Bruxelles)", "Bryndza",
-            "Buchette d'Anjou", "Buffalo", "Burgos", "Butte", "Butterkase", "Button (Innes)",
-            "Buxton Blue", "Cabecou", "Caboc", "Cabrales", "Cachaille", "Caciocavallo", "Caciotta",
-            "Caerphilly", "Cairnsmore", "Calenzana", "Cambazola", "Camembert de Normandie",
-            "Canadian Cheddar", "Canestrato", "Cantal", "Caprice des Dieux", "Capricorn Goat",
-            "Capriole Banon", "Carre de l'Est", "Casciotta di Urbino", "Cashel Blue", "Castellano",
-            "Castelleno", "Castelmagno", "Castelo Branco", "Castigliano", "Cathelain",
-            "Celtic Promise", "Cendre d'Olivet", "Cerney", "Chabichou", "Chabichou du Poitou",
-            "Chabis de Gatine", "Chaource", "Charolais", "Chaumes", "Cheddar",
-            "Cheddar Clothbound", "Cheshire", "Chevres", "Chevrotin des Aravis", "Chontaleno",
-            "Civray", "Coeur de Camembert au Calvados", "Coeur de Chevre", "Colby", "Cold Pack",
-            "Comte", "Coolea", "Cooleney", "Coquetdale", "Corleggy", "Cornish Pepper",
-            "Cotherstone", "Cotija", "Cottage Cheese", "Cottage Cheese (Australian)",
-            "Cougar Gold", "Coulommiers", "Coverdale", "Crayeux de Roncq", "Cream Cheese",
-            "Cream Havarti", "Crema Agria", "Crema Mexicana", "Creme Fraiche", "Crescenza",
-            "Croghan", "Crottin de Chavignol", "Crottin du Chavignol", "Crowdie", "Crowley",
-            "Cuajada", "Curd", "Cure Nantais", "Curworthy", "Cwmtawe Pecorino",
-            "Cypress Grove Chevre", "Danablu (Danish Blue)", "Danbo", "Danish Fontina",
-            "Daralagjazsky", "Dauphin", "Delice des Fiouves", "Denhany Dorset Drum", "Derby",
-            "Dessertnyj Belyj", "Devon Blue", "Devon Garland", "Dolcelatte", "Doolin",
-            "Doppelrhamstufel", "Dorset Blue Vinney", "Double Gloucester", "Double Worcester",
-            "Dreux a la Feuille", "Dry Jack", "Duddleswell", "Dunbarra", "Dunlop", "Dunsyre Blue",
-            "Duroblando", "Durrus", "Dutch Mimolette (Commissiekaas)", "Edam", "Edelpilz",
-            "Emental Grand Cru", "Emlett", "Emmental", "Epoisses de Bourgogne", "Esbareich",
-            "Esrom", "Etorki", "Evansdale Farmhouse Brie", "Evora De L'Alentejo", "Exmoor Blue",
-            "Explorateur", "Feta", "Feta (Australian)", "Figue", "Filetta", "Fin-de-Siecle",
-            "Finlandia Swiss", "Finn", "Fiore Sardo", "Fleur du Maquis", "Flor de Guia",
-            "Flower Marie", "Folded", "Folded cheese with mint", "Fondant de Brebis",
-            "Fontainebleau", "Fontal", "Fontina Val d'Aosta", "Formaggio di capra", "Fougerus",
-            "Four Herb Gouda", "Fourme d' Ambert", "Fourme de Haute Loire", "Fourme de Montbrison",
-            "Fresh Jack", "Fresh Mozzarella", "Fresh Ricotta", "Fresh Truffles", "Fribourgeois",
-            "Friesekaas", "Friesian", "Friesla", "Frinault", "Fromage a Raclette", "Fromage Corse",
-            "Fromage de Montagne de Savoie", "Fromage Frais", "Fruit Cream Cheese",
-            "Frying Cheese", "Fynbo", "Gabriel", "Galette du Paludier", "Galette Lyonnaise",
-            "Galloway Goat's Milk Gems", "Gammelost", "Gaperon a l'Ail", "Garrotxa", "Gastanberra",
-            "Geitost", "Gippsland Blue", "Gjetost", "Gloucester", "Golden Cross", "Gorgonzola",
-            "Gornyaltajski", "Gospel Green", "Gouda", "Goutu", "Gowrie", "Grabetto", "Graddost",
-            "Grafton Village Cheddar", "Grana", "Grana Padano", "Grand Vatel",
-            "Grataron d' Areches", "Gratte-Paille", "Graviera", "Greuilh", "Greve",
-            "Gris de Lille", "Gruyere", "Gubbeen", "Guerbigny", "Halloumi",
-            "Halloumy (Australian)", "Haloumi-Style Cheese", "Harbourne Blue", "Havarti",
-            "Heidi Gruyere", "Hereford Hop", "Herrgardsost", "Herriot Farmhouse", "Herve",
-            "Hipi Iti", "Hubbardston Blue Cow", "Hushallsost", "Iberico", "Idaho Goatster",
-            "Idiazabal", "Il Boschetto al Tartufo", "Ile d'Yeu", "Isle of Mull", "Jarlsberg",
-            "Jermi Tortes", "Jibneh Arabieh", "Jindi Brie", "Jubilee Blue", "Juustoleipa",
-            "Kadchgall", "Kaseri", "Kashta", "Kefalotyri", "Kenafa", "Kernhem", "Kervella Affine",
-            "Kikorangi", "King Island Cape Wickham Brie", "King River Gold", "Klosterkaese",
-            "Knockalara", "Kugelkase", "L'Aveyronnais", "L'Ecir de l'Aubrac", "La Taupiniere",
-            "La Vache Qui Rit", "Laguiole", "Lairobell", "Lajta", "Lanark Blue", "Lancashire",
-            "Langres", "Lappi", "Laruns", "Lavistown", "Le Brin", "Le Fium Orbo", "Le Lacandou",
-            "Le Roule", "Leafield", "Lebbene", "Leerdammer", "Leicester", "Leyden", "Limburger",
-            "Lincolnshire Poacher", "Lingot Saint Bousquet d'Orb", "Liptauer", "Little Rydings",
-            "Livarot", "Llanboidy", "Llanglofan Farmhouse", "Loch Arthur Farmhouse",
-            "Loddiswell Avondale", "Longhorn", "Lou Palou", "Lou Pevre", "Lyonnais", "Maasdam",
-            "Macconais", "Mahoe Aged Gouda", "Mahon", "Malvern", "Mamirolle", "Manchego",
-            "Manouri", "Manur", "Marble Cheddar", "Marbled Cheeses", "Maredsous", "Margotin",
-            "Maribo", "Maroilles", "Mascares", "Mascarpone", "Mascarpone (Australian)",
-            "Mascarpone Torta", "Matocq", "Maytag Blue", "Meira", "Menallack Farmhouse",
-            "Menonita", "Meredith Blue", "Mesost", "Metton (Cancoillotte)", "Meyer Vintage Gouda",
-            "Mihalic Peynir", "Milleens", "Mimolette", "Mine-Gabhar", "Mini Baby Bells", "Mixte",
-            "Molbo", "Monastery Cheeses", "Mondseer", "Mont D'or Lyonnais", "Montasio",
-            "Monterey Jack", "Monterey Jack Dry", "Morbier", "Morbier Cru de Montagne",
-            "Mothais a la Feuille", "Mozzarella", "Mozzarella (Australian)",
-            "Mozzarella di Bufala", "Mozzarella Fresh, in water", "Mozzarella Rolls", "Munster",
-            "Murol", "Mycella", "Myzithra", "Naboulsi", "Nantais", "Neufchatel",
-            "Neufchatel (Australian)", "Niolo", "Nokkelost", "Northumberland", "Oaxaca",
-            "Olde York", "Olivet au Foin", "Olivet Bleu", "Olivet Cendre",
-            "Orkney Extra Mature Cheddar", "Orla", "Oschtjepka", "Ossau Fermier", "Ossau-Iraty",
-            "Oszczypek", "Oxford Blue", "P'tit Berrichon", "Palet de Babligny", "Paneer", "Panela",
-            "Pannerone", "Pant ys Gawn", "Parmesan (Parmigiano)", "Parmigiano Reggiano",
-            "Pas de l'Escalette", "Passendale", "Pasteurized Processed", "Pate de Fromage",
-            "Patefine Fort", "Pave d'Affinois", "Pave d'Auge", "Pave de Chirac", "Pave du Berry",
-            "Pecorino", "Pecorino in Walnut Leaves", "Pecorino Romano", "Peekskill Pyramid",
-            "Pelardon des Cevennes", "Pelardon des Corbieres", "Penamellera", "Penbryn",
-            "Pencarreg", "Perail de Brebis", "Petit Morin", "Petit Pardou", "Petit-Suisse",
-            "Picodon de Chevre", "Picos de Europa", "Piora", "Pithtviers au Foin",
-            "Plateau de Herve", "Plymouth Cheese", "Podhalanski", "Poivre d'Ane", "Polkolbin",
-            "Pont l'Eveque", "Port Nicholson", "Port-Salut", "Postel", "Pouligny-Saint-Pierre",
-            "Pourly", "Prastost", "Pressato", "Prince-Jean", "Processed Cheddar", "Provolone",
-            "Provolone (Australian)", "Pyengana Cheddar", "Pyramide", "Quark",
-            "Quark (Australian)", "Quartirolo Lombardo", "Quatre-Vents", "Quercy Petit",
-            "Queso Blanco", "Queso Blanco con Frutas --Pina y Mango", "Queso de Murcia",
-            "Queso del Montsec", "Queso del Tietar", "Queso Fresco", "Queso Fresco (Adobera)",
-            "Queso Iberico", "Queso Jalapeno", "Queso Majorero", "Queso Media Luna",
-            "Queso Para Frier", "Queso Quesadilla", "Rabacal", "Raclette", "Ragusano", "Raschera",
-            "Reblochon", "Red Leicester", "Regal de la Dombes", "Reggianito", "Remedou",
-            "Requeson", "Richelieu", "Ricotta", "Ricotta (Australian)", "Ricotta Salata", "Ridder",
-            "Rigotte", "Rocamadour", "Rollot", "Romano", "Romans Part Dieu", "Roncal", "Roquefort",
-            "Roule", "Rouleau De Beaulieu", "Royalp Tilsit", "Rubens", "Rustinu", "Saaland Pfarr",
-            "Saanenkaese", "Saga", "Sage Derby", "Sainte Maure", "Saint-Marcellin",
-            "Saint-Nectaire", "Saint-Paulin", "Salers", "Samso", "San Simon", "Sancerre",
-            "Sap Sago", "Sardo", "Sardo Egyptian", "Sbrinz", "Scamorza", "Schabzieger", "Schloss",
-            "Selles sur Cher", "Selva", "Serat", "Seriously Strong Cheddar", "Serra da Estrela",
-            "Sharpam", "Shelburne Cheddar", "Shropshire Blue", "Siraz", "Sirene", "Smoked Gouda",
-            "Somerset Brie", "Sonoma Jack", "Sottocenare al Tartufo", "Soumaintrain",
-            "Sourire Lozerien", "Spenwood", "Sraffordshire Organic", "St. Agur Blue Cheese",
-            "Stilton", "Stinking Bishop", "String", "Sussex Slipcote", "Sveciaost", "Swaledale",
-            "Sweet Style Swiss", "Swiss", "Syrian (Armenian String)", "Tala", "Taleggio", "Tamie",
-            "Tasmania Highland Chevre Log", "Taupiniere", "Teifi", "Telemea", "Testouri",
-            "Tete de Moine", "Tetilla", "Texas Goat Cheese", "Tibet", "Tillamook Cheddar",
-            "Tilsit", "Timboon Brie", "Toma", "Tomme Brulee", "Tomme d'Abondance",
-            "Tomme de Chevre", "Tomme de Romans", "Tomme de Savoie", "Tomme des Chouans", "Tommes",
-            "Torta del Casar", "Toscanello", "Touree de L'Aubier", "Tourmalet",
-            "Trappe (Veritable)", "Trois Cornes De Vendee", "Tronchon", "Trou du Cru", "Truffe",
-            "Tupi", "Turunmaa", "Tymsboro", "Tyn Grug", "Tyning", "Ubriaco", "Ulloa",
-            "Vacherin-Fribourgeois", "Valencay", "Vasterbottenost", "Venaco", "Vendomois",
-            "Vieux Corse", "Vignotte", "Vulscombe", "Waimata Farmhouse Blue",
-            "Washed Rind Cheese (Australian)", "Waterloo", "Weichkaese", "Wellington",
-            "Wensleydale", "White Stilton", "Whitestone Farmhouse", "Wigmore", "Woodside Cabecou",
-            "Xanadu", "Xynotyro", "Yarg Cornish", "Yarra Valley Pyramid", "Yorkshire Blue",
-            "Zamorano", "Zanetti Grana Padano", "Zanetti Parmigiano Reggiano"
-    };
-
-}
diff --git a/design/tests/src/android/support/design/testutils/CollapsingToolbarLayoutActions.java b/design/tests/src/android/support/design/testutils/CollapsingToolbarLayoutActions.java
deleted file mode 100644
index 71dd150..0000000
--- a/design/tests/src/android/support/design/testutils/CollapsingToolbarLayoutActions.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-
-import android.support.annotation.ColorInt;
-import android.support.design.widget.CollapsingToolbarLayout;
-import android.support.test.espresso.UiController;
-import android.support.test.espresso.ViewAction;
-import android.view.View;
-
-import org.hamcrest.Matcher;
-
-public class CollapsingToolbarLayoutActions {
-
-    public static ViewAction setContentScrimColor(@ColorInt final int color) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "Set the content scrim to a color";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-                CollapsingToolbarLayout ctl = (CollapsingToolbarLayout) view;
-                ctl.setContentScrimColor(color);
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-}
diff --git a/design/tests/src/android/support/design/testutils/DrawerLayoutActions.java b/design/tests/src/android/support/design/testutils/DrawerLayoutActions.java
deleted file mode 100755
index e4ea867..0000000
--- a/design/tests/src/android/support/design/testutils/DrawerLayoutActions.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-import android.support.test.espresso.UiController;
-import android.support.test.espresso.ViewAction;
-import android.support.v4.widget.DrawerLayout;
-import android.view.View;
-import org.hamcrest.Matcher;
-
-import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
-
-public class DrawerLayoutActions {
-    /**
-     * Opens the drawer at the specified edge gravity.
-     */
-    public static ViewAction openDrawer(final int drawerEdgeGravity) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(DrawerLayout.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Opens the drawer";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                DrawerLayout drawerLayout = (DrawerLayout) view;
-                drawerLayout.openDrawer(drawerEdgeGravity);
-
-                // Wait for a full second to let the inner ViewDragHelper complete the operation
-                uiController.loopMainThreadForAtLeast(1000);
-            }
-        };
-    }
-
-    /**
-     * Closes the drawer at the specified edge gravity.
-     */
-    public static ViewAction closeDrawer(final int drawerEdgeGravity) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(DrawerLayout.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Closes the drawer";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                DrawerLayout drawerLayout = (DrawerLayout) view;
-                drawerLayout.closeDrawer(drawerEdgeGravity);
-
-                // Wait for a full second to let the inner ViewDragHelper complete the operation
-                uiController.loopMainThreadForAtLeast(1000);
-            }
-        };
-    }
-}
diff --git a/design/tests/src/android/support/design/testutils/FloatingActionButtonActions.java b/design/tests/src/android/support/design/testutils/FloatingActionButtonActions.java
deleted file mode 100644
index a166f6b..0000000
--- a/design/tests/src/android/support/design/testutils/FloatingActionButtonActions.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
-
-import android.content.res.ColorStateList;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.design.widget.CoordinatorLayout;
-import android.support.design.widget.FloatingActionButton;
-import android.support.test.espresso.UiController;
-import android.support.test.espresso.ViewAction;
-import android.view.View;
-
-import org.hamcrest.Matcher;
-
-public class FloatingActionButtonActions {
-
-    public static ViewAction setBackgroundTintColor(@ColorInt final int color) {
-        return setBackgroundTintList(ColorStateList.valueOf(color));
-    }
-
-    public static ViewAction setBackgroundTintList(@ColorInt final ColorStateList tint) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(FloatingActionButton.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Sets FloatingActionButton background tint";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                final FloatingActionButton fab = (FloatingActionButton) view;
-                fab.setBackgroundTintList(tint);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction setImageResource(@DrawableRes final int resId) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(FloatingActionButton.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Sets FloatingActionButton image resource";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                final FloatingActionButton fab = (FloatingActionButton) view;
-                fab.setImageResource(resId);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction setSize(@FloatingActionButton.Size final int size) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(FloatingActionButton.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Sets FloatingActionButton size";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                final FloatingActionButton fab = (FloatingActionButton) view;
-                fab.setSize(size);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction setCustomSize(final int size) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(FloatingActionButton.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Sets FloatingActionButton custom size";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                final FloatingActionButton fab = (FloatingActionButton) view;
-                fab.setCustomSize(size);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction setCompatElevation(final float size) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(FloatingActionButton.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Sets FloatingActionButton elevation";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                final FloatingActionButton fab = (FloatingActionButton) view;
-                fab.setCompatElevation(size);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction setLayoutGravity(final int gravity) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(View.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Sets Views layout_gravity";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                CoordinatorLayout.LayoutParams lp =
-                        (CoordinatorLayout.LayoutParams) view.getLayoutParams();
-                lp.gravity = gravity;
-                view.requestLayout();
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction hideThenShow(final int animDuration) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(FloatingActionButton.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Calls hide() then show()";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                FloatingActionButton fab = (FloatingActionButton) view;
-                fab.hide();
-                fab.show();
-
-                uiController.loopMainThreadForAtLeast(animDuration + 100);
-            }
-        };
-    }
-
-    public static ViewAction showThenHide(final int animDuration) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(FloatingActionButton.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Calls show() then hide()";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                FloatingActionButton fab = (FloatingActionButton) view;
-                fab.show();
-                fab.hide();
-
-                uiController.loopMainThreadForAtLeast(animDuration + 50);
-            }
-        };
-    }
-
-}
diff --git a/design/tests/src/android/support/design/testutils/NavigationViewActions.java b/design/tests/src/android/support/design/testutils/NavigationViewActions.java
deleted file mode 100644
index 6a05fab..0000000
--- a/design/tests/src/android/support/design/testutils/NavigationViewActions.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-
-import android.content.res.ColorStateList;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IdRes;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.StyleRes;
-import android.support.design.widget.NavigationView;
-import android.support.test.espresso.UiController;
-import android.support.test.espresso.ViewAction;
-import android.view.LayoutInflater;
-import android.view.View;
-
-import org.hamcrest.Matcher;
-
-public class NavigationViewActions {
-    /**
-     * Sets item text appearance on the content of the navigation view.
-     */
-    public static ViewAction setItemTextAppearance(final @StyleRes int resId) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "Set item text appearance";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                NavigationView navigationView = (NavigationView) view;
-                navigationView.setItemTextAppearance(resId);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Sets item text color on the content of the navigation view.
-     */
-    public static ViewAction setItemTextColor(final ColorStateList textColor) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "Set item text color";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                NavigationView navigationView = (NavigationView) view;
-                navigationView.setItemTextColor(textColor);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Sets item background on the content of the navigation view.
-     */
-    public static ViewAction setItemBackground(final @Nullable Drawable itemBackground) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "Set item background";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                NavigationView navigationView = (NavigationView) view;
-                navigationView.setItemBackground(itemBackground);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Sets item background on the content of the navigation view.
-     */
-    public static ViewAction setItemBackgroundResource(final @DrawableRes int resId) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "Set item background";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                NavigationView navigationView = (NavigationView) view;
-                navigationView.setItemBackgroundResource(resId);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Sets item icon tint list on the content of the navigation view.
-     */
-    public static ViewAction setItemIconTintList(final @Nullable ColorStateList tint) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "Set item icon tint list";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                NavigationView navigationView = (NavigationView) view;
-                navigationView.setItemIconTintList(tint);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Add the specified view as a header to the navigation view.
-     */
-    public static ViewAction addHeaderView(final @NonNull LayoutInflater inflater,
-            final @LayoutRes int res) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "Add header view";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                NavigationView navigationView = (NavigationView) view;
-                navigationView.addHeaderView(inflater.inflate(res, null, false));
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Inflates a view from the specified layout ID and adds it as a header to the navigation view.
-     */
-    public static ViewAction inflateHeaderView(final @LayoutRes int res) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "Inflate and add header view";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                NavigationView navigationView = (NavigationView) view;
-                navigationView.inflateHeaderView(res);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Removes a previously added header view from the navigation view.
-     */
-    public static ViewAction removeHeaderView(final @Nullable View headerView) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "Remove header view";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                NavigationView navigationView = (NavigationView) view;
-                navigationView.removeHeaderView(headerView);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Sets checked item on the navigation view.
-     */
-    public static ViewAction setCheckedItem(final @IdRes int id) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "Set checked item";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                NavigationView navigationView = (NavigationView) view;
-                navigationView.setCheckedItem(id);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Sets icon for the menu item of the navigation view.
-     */
-    public static ViewAction setIconForMenuItem(final @IdRes int menuItemId,
-            final Drawable iconDrawable) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "Set menu item icon";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                NavigationView navigationView = (NavigationView) view;
-                navigationView.getMenu().findItem(menuItemId).setIcon(iconDrawable);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Removes the specified menu item from the navigation view.
-     *
-     * @param menuItemId The ID of the menu item to be removed.
-     */
-    public static ViewAction removeMenuItem(final @IdRes int menuItemId) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(NavigationView.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Remove menu item " + menuItemId;
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-                NavigationView navigationView = (NavigationView) view;
-                navigationView.getMenu().removeItem(menuItemId);
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-}
diff --git a/design/tests/src/android/support/design/testutils/Shakespeare.java b/design/tests/src/android/support/design/testutils/Shakespeare.java
deleted file mode 100644
index 285a185..0000000
--- a/design/tests/src/android/support/design/testutils/Shakespeare.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-public final class Shakespeare {
-    /**
-     * Our data, part 1.
-     */
-    public static final String[] TITLES = {
-            "Henry IV (1)",
-            "Henry V",
-            "Henry VIII",
-            "Richard II",
-            "Richard III",
-            "Merchant of Venice",
-            "Othello",
-            "King Lear"
-    };
-
-    /**
-     * Our data, part 2.
-     */
-    public static final String[] DIALOGUE = {
-            "So shaken as we are, so wan with care," +
-            "Find we a time for frighted peace to pant," +
-            "And breathe short-winded accents of new broils" +
-            "To be commenced in strands afar remote." +
-            "No more the thirsty entrance of this soil" +
-            "Shall daub her lips with her own children's blood;" +
-            "Nor more shall trenching war channel her fields," +
-            "Nor bruise her flowerets with the armed hoofs" +
-            "Of hostile paces: those opposed eyes," +
-            "Which, like the meteors of a troubled heaven," +
-            "All of one nature, of one substance bred," +
-            "Did lately meet in the intestine shock" +
-            "And furious close of civil butchery" +
-            "Shall now, in mutual well-beseeming ranks," +
-            "March all one way and be no more opposed" +
-            "Against acquaintance, kindred and allies:" +
-            "The edge of war, like an ill-sheathed knife," +
-            "No more shall cut his master. Therefore, friends," +
-            "As far as to the sepulchre of Christ," +
-            "Whose soldier now, under whose blessed cross" +
-            "We are impressed and engaged to fight," +
-            "Forthwith a power of English shall we levy;" +
-            "Whose arms were moulded in their mothers' womb" +
-            "To chase these pagans in those holy fields" +
-            "Over whose acres walk'd those blessed feet" +
-            "Which fourteen hundred years ago were nail'd" +
-            "For our advantage on the bitter cross." +
-            "But this our purpose now is twelve month old," +
-            "And bootless 'tis to tell you we will go:" +
-            "Therefore we meet not now. Then let me hear" +
-            "Of you, my gentle cousin Westmoreland," +
-            "What yesternight our council did decree" +
-            "In forwarding this dear expedience.",
-
-            "Hear him but reason in divinity," +
-            "And all-admiring with an inward wish" +
-            "You would desire the king were made a prelate:" +
-            "Hear him debate of commonwealth affairs," +
-            "You would say it hath been all in all his study:" +
-            "List his discourse of war, and you shall hear" +
-            "A fearful battle render'd you in music:" +
-            "Turn him to any cause of policy," +
-            "The Gordian knot of it he will unloose," +
-            "Familiar as his garter: that, when he speaks," +
-            "The air, a charter'd libertine, is still," +
-            "And the mute wonder lurketh in men's ears," +
-            "To steal his sweet and honey'd sentences;" +
-            "So that the art and practic part of life" +
-            "Must be the mistress to this theoric:" +
-            "Which is a wonder how his grace should glean it," +
-            "Since his addiction was to courses vain," +
-            "His companies unletter'd, rude and shallow," +
-            "His hours fill'd up with riots, banquets, sports," +
-            "And never noted in him any study," +
-            "Any retirement, any sequestration" +
-            "From open haunts and popularity.",
-
-            "I come no more to make you laugh: things now," +
-            "That bear a weighty and a serious brow," +
-            "Sad, high, and working, full of state and woe," +
-            "Such noble scenes as draw the eye to flow," +
-            "We now present. Those that can pity, here" +
-            "May, if they think it well, let fall a tear;" +
-            "The subject will deserve it. Such as give" +
-            "Their money out of hope they may believe," +
-            "May here find truth too. Those that come to see" +
-            "Only a show or two, and so agree" +
-            "The play may pass, if they be still and willing," +
-            "I'll undertake may see away their shilling" +
-            "Richly in two short hours. Only they" +
-            "That come to hear a merry bawdy play," +
-            "A noise of targets, or to see a fellow" +
-            "In a long motley coat guarded with yellow," +
-            "Will be deceived; for, gentle hearers, know," +
-            "To rank our chosen truth with such a show" +
-            "As fool and fight is, beside forfeiting" +
-            "Our own brains, and the opinion that we bring," +
-            "To make that only true we now intend," +
-            "Will leave us never an understanding friend." +
-            "Therefore, for goodness' sake, and as you are known" +
-            "The first and happiest hearers of the town," +
-            "Be sad, as we would make ye: think ye see" +
-            "The very persons of our noble story" +
-            "As they were living; think you see them great," +
-            "And follow'd with the general throng and sweat" +
-            "Of thousand friends; then in a moment, see" +
-            "How soon this mightiness meets misery:" +
-            "And, if you can be merry then, I'll say" +
-            "A man may weep upon his wedding-day.",
-
-            "First, heaven be the record to my speech!" +
-            "In the devotion of a subject's love," +
-            "Tendering the precious safety of my prince," +
-            "And free from other misbegotten hate," +
-            "Come I appellant to this princely presence." +
-            "Now, Thomas Mowbray, do I turn to thee," +
-            "And mark my greeting well; for what I speak" +
-            "My body shall make good upon this earth," +
-            "Or my divine soul answer it in heaven." +
-            "Thou art a traitor and a miscreant," +
-            "Too good to be so and too bad to live," +
-            "Since the more fair and crystal is the sky," +
-            "The uglier seem the clouds that in it fly." +
-            "Once more, the more to aggravate the note," +
-            "With a foul traitor's name stuff I thy throat;" +
-            "And wish, so please my sovereign, ere I move," +
-            "What my tongue speaks my right drawn sword may prove.",
-
-            "Now is the winter of our discontent" +
-            "Made glorious summer by this sun of York;" +
-            "And all the clouds that lour'd upon our house" +
-            "In the deep bosom of the ocean buried." +
-            "Now are our brows bound with victorious wreaths;" +
-            "Our bruised arms hung up for monuments;" +
-            "Our stern alarums changed to merry meetings," +
-            "Our dreadful marches to delightful measures." +
-            "Grim-visaged war hath smooth'd his wrinkled front;" +
-            "And now, instead of mounting barded steeds" +
-            "To fright the souls of fearful adversaries," +
-            "He capers nimbly in a lady's chamber" +
-            "To the lascivious pleasing of a lute." +
-            "But I, that am not shaped for sportive tricks," +
-            "Nor made to court an amorous looking-glass;" +
-            "I, that am rudely stamp'd, and want love's majesty" +
-            "To strut before a wanton ambling nymph;" +
-            "I, that am curtail'd of this fair proportion," +
-            "Cheated of feature by dissembling nature," +
-            "Deformed, unfinish'd, sent before my time" +
-            "Into this breathing world, scarce half made up," +
-            "And that so lamely and unfashionable" +
-            "That dogs bark at me as I halt by them;" +
-            "Why, I, in this weak piping time of peace," +
-            "Have no delight to pass away the time," +
-            "Unless to spy my shadow in the sun" +
-            "And descant on mine own deformity:" +
-            "And therefore, since I cannot prove a lover," +
-            "To entertain these fair well-spoken days," +
-            "I am determined to prove a villain" +
-            "And hate the idle pleasures of these days." +
-            "Plots have I laid, inductions dangerous," +
-            "By drunken prophecies, libels and dreams," +
-            "To set my brother Clarence and the king" +
-            "In deadly hate the one against the other:" +
-            "And if King Edward be as true and just" +
-            "As I am subtle, false and treacherous," +
-            "This day should Clarence closely be mew'd up," +
-            "About a prophecy, which says that 'G'" +
-            "Of Edward's heirs the murderer shall be." +
-            "Dive, thoughts, down to my soul: here" +
-            "Clarence comes.",
-
-            "To bait fish withal: if it will feed nothing else," +
-            "it will feed my revenge. He hath disgraced me, and" +
-            "hindered me half a million; laughed at my losses," +
-            "mocked at my gains, scorned my nation, thwarted my" +
-            "bargains, cooled my friends, heated mine" +
-            "enemies; and what's his reason? I am a Jew. Hath" +
-            "not a Jew eyes? hath not a Jew hands, organs," +
-            "dimensions, senses, affections, passions? fed with" +
-            "the same food, hurt with the same weapons, subject" +
-            "to the same diseases, healed by the same means," +
-            "warmed and cooled by the same winter and summer, as" +
-            "a Christian is? If you prick us, do we not bleed?" +
-            "if you tickle us, do we not laugh? if you poison" +
-            "us, do we not die? and if you wrong us, shall we not" +
-            "revenge? If we are like you in the rest, we will" +
-            "resemble you in that. If a Jew wrong a Christian," +
-            "what is his humility? Revenge. If a Christian" +
-            "wrong a Jew, what should his sufferance be by" +
-            "Christian example? Why, revenge. The villany you" +
-            "teach me, I will execute, and it shall go hard but I" +
-            "will better the instruction.",
-
-            "Virtue! a fig! 'tis in ourselves that we are thus" +
-            "or thus. Our bodies are our gardens, to the which" +
-            "our wills are gardeners: so that if we will plant" +
-            "nettles, or sow lettuce, set hyssop and weed up" +
-            "thyme, supply it with one gender of herbs, or" +
-            "distract it with many, either to have it sterile" +
-            "with idleness, or manured with industry, why, the" +
-            "power and corrigible authority of this lies in our" +
-            "wills. If the balance of our lives had not one" +
-            "scale of reason to poise another of sensuality, the" +
-            "blood and baseness of our natures would conduct us" +
-            "to most preposterous conclusions: but we have" +
-            "reason to cool our raging motions, our carnal" +
-            "stings, our unbitted lusts, whereof I take this that" +
-            "you call love to be a sect or scion.",
-
-            "Blow, winds, and crack your cheeks! rage! blow!" +
-            "You cataracts and hurricanoes, spout" +
-            "Till you have drench'd our steeples, drown'd the cocks!" +
-            "You sulphurous and thought-executing fires," +
-            "Vaunt-couriers to oak-cleaving thunderbolts," +
-            "Singe my white head! And thou, all-shaking thunder," +
-            "Smite flat the thick rotundity o' the world!" +
-            "Crack nature's moulds, an germens spill at once," +
-            "That make ingrateful man!"
-    };
-}
diff --git a/design/tests/src/android/support/design/testutils/SnackbarUtils.java b/design/tests/src/android/support/design/testutils/SnackbarUtils.java
deleted file mode 100644
index 04aa878..0000000
--- a/design/tests/src/android/support/design/testutils/SnackbarUtils.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-import static android.support.design.testutils.TestUtilsActions.waitUntilIdle;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.matcher.ViewMatchers.isRoot;
-
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.design.widget.BaseTransientBottomBar;
-import android.support.design.widget.Snackbar;
-import android.support.test.espresso.Espresso;
-import android.support.test.espresso.IdlingResource;
-
-public class SnackbarUtils {
-    public interface TransientBottomBarAction {
-        void perform() throws Throwable;
-    }
-
-    private static class TransientBottomBarShownCallback
-            extends BaseTransientBottomBar.BaseCallback<BaseTransientBottomBar>
-            implements IdlingResource {
-        private boolean mIsShown = false;
-
-        @Nullable
-        private IdlingResource.ResourceCallback mCallback;
-
-        private boolean mNeedsIdle = false;
-
-        @Override
-        public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
-            mCallback = resourceCallback;
-        }
-
-        @Override
-        public String getName() {
-            return "Transient bottom bar shown callback";
-        }
-
-        @Override
-        public boolean isIdleNow() {
-            if (!mNeedsIdle) {
-                return true;
-            } else {
-                return mIsShown;
-            }
-        }
-
-        @Override
-        public void onShown(BaseTransientBottomBar transientBottomBar) {
-            mIsShown = true;
-            if (mCallback != null) {
-                mCallback.onTransitionToIdle();
-            }
-        }
-    }
-
-    private static class TransientBottomBarDismissedCallback
-            extends BaseTransientBottomBar.BaseCallback<BaseTransientBottomBar>
-            implements IdlingResource {
-        private boolean mIsDismissed = false;
-
-        @Nullable
-        private IdlingResource.ResourceCallback mCallback;
-
-        private boolean mNeedsIdle = false;
-
-        @Override
-        public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
-            mCallback = resourceCallback;
-        }
-
-        @Override
-        public String getName() {
-            return "Transient bottom bar dismissed callback";
-        }
-
-        @Override
-        public boolean isIdleNow() {
-            if (!mNeedsIdle) {
-                return true;
-            } else {
-                return mIsDismissed;
-            }
-        }
-
-        @Override
-        public void onDismissed(BaseTransientBottomBar transientBottomBar,
-                @DismissEvent int event) {
-            mIsDismissed = true;
-            if (mCallback != null) {
-                mCallback.onTransitionToIdle();
-            }
-        }
-    }
-
-    /**
-     * Helper method that shows that specified {@link Snackbar} and waits until
-     * it has been fully shown.
-     */
-    public static void showTransientBottomBarAndWaitUntilFullyShown(
-            @NonNull BaseTransientBottomBar transientBottomBar) {
-        TransientBottomBarShownCallback callback = new TransientBottomBarShownCallback();
-        transientBottomBar.addCallback(callback);
-        try {
-            // Register our listener as idling resource so that Espresso waits until the
-            // the bar has been fully shown
-            Espresso.registerIdlingResources(callback);
-            // Show the bar
-            transientBottomBar.show();
-            // Mark the callback to require waiting for idle state
-            callback.mNeedsIdle = true;
-            // Perform a dummy Espresso action that loops until the UI thread is idle. This
-            // effectively blocks us until the Snackbar has completed its sliding animation.
-            onView(isRoot()).perform(waitUntilIdle());
-            callback.mNeedsIdle = false;
-        } finally {
-            // Unregister our idling resource
-            Espresso.unregisterIdlingResources(callback);
-            // And remove our tracker listener from Snackbar
-            transientBottomBar.removeCallback(callback);
-        }
-    }
-
-    /**
-     * Helper method that dismissed that specified {@link Snackbar} and waits until
-     * it has been fully dismissed.
-     */
-    public static void dismissTransientBottomBarAndWaitUntilFullyDismissed(
-            @NonNull final BaseTransientBottomBar transientBottomBar) throws Throwable {
-        performActionAndWaitUntilFullyDismissed(transientBottomBar,
-                new TransientBottomBarAction() {
-                    @Override
-                    public void perform() throws Throwable {
-                        transientBottomBar.dismiss();
-                    }
-                });
-    }
-
-    /**
-     * Helper method that dismissed that specified {@link Snackbar} and waits until
-     * it has been fully dismissed.
-     */
-    public static void performActionAndWaitUntilFullyDismissed(
-            @NonNull BaseTransientBottomBar transientBottomBar,
-            @NonNull TransientBottomBarAction action) throws Throwable {
-        TransientBottomBarDismissedCallback callback = new TransientBottomBarDismissedCallback();
-        transientBottomBar.addCallback(callback);
-        try {
-            // Register our listener as idling resource so that Espresso waits until the
-            // the bar has been fully dismissed
-            Espresso.registerIdlingResources(callback);
-            // Run the action
-            action.perform();
-            // Mark the callback to require waiting for idle state
-            callback.mNeedsIdle = true;
-            // Perform a dummy Espresso action that loops until the UI thread is idle. This
-            // effectively blocks us until the Snackbar has completed its sliding animation.
-            onView(isRoot()).perform(waitUntilIdle());
-            callback.mNeedsIdle = false;
-        } finally {
-            // Unregister our idling resource
-            Espresso.unregisterIdlingResources(callback);
-            // And remove our tracker listener from Snackbar
-            transientBottomBar.removeCallback(null);
-        }
-    }
-
-    /**
-     * Helper method that waits until the given bar has been fully dismissed.
-     */
-    public static void waitUntilFullyDismissed(@NonNull BaseTransientBottomBar transientBottomBar) {
-        TransientBottomBarDismissedCallback callback = new TransientBottomBarDismissedCallback();
-        transientBottomBar.addCallback(callback);
-        try {
-            // Register our listener as idling resource so that Espresso waits until the
-            // the bar has been fully dismissed
-            Espresso.registerIdlingResources(callback);
-            // Mark the callback to require waiting for idle state
-            callback.mNeedsIdle = true;
-            // Perform a dummy Espresso action that loops until the UI thread is idle. This
-            // effectively blocks us until the Snackbar has completed its sliding animation.
-            onView(isRoot()).perform(waitUntilIdle());
-            callback.mNeedsIdle = false;
-        } finally {
-            // Unregister our idling resource
-            Espresso.unregisterIdlingResources(callback);
-            // And remove our tracker listener from Snackbar
-            transientBottomBar.removeCallback(null);
-        }
-    }
-}
diff --git a/design/tests/src/android/support/design/testutils/SwipeUtils.java b/design/tests/src/android/support/design/testutils/SwipeUtils.java
deleted file mode 100644
index cf92883..0000000
--- a/design/tests/src/android/support/design/testutils/SwipeUtils.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-import android.support.test.espresso.action.CoordinatesProvider;
-import android.support.test.espresso.action.GeneralSwipeAction;
-import android.support.test.espresso.action.Press;
-import android.support.test.espresso.action.Swipe;
-import android.view.View;
-
-public class SwipeUtils {
-
-    public static GeneralSwipeAction swipeUp(final int swipeX,
-            final int swipeStartY, final int swipeAmountY) {
-        return new GeneralSwipeAction(
-                Swipe.SLOW,
-                new CoordinatesProvider() {
-                    @Override
-                    public float[] calculateCoordinates(View view) {
-                        return new float[] { swipeX, swipeStartY };
-                    }
-                },
-                new CoordinatesProvider() {
-                    @Override
-                    public float[] calculateCoordinates(View view) {
-                        return new float[] { swipeX, swipeStartY - swipeAmountY };
-                    }
-                },
-                Press.FINGER
-        );
-    }
-
-    public static GeneralSwipeAction swipeDown(final int swipeX,
-            final int swipeStartY, final int swipeAmountY) {
-        return new GeneralSwipeAction(
-                Swipe.SLOW,
-                new CoordinatesProvider() {
-                    @Override
-                    public float[] calculateCoordinates(View view) {
-                        return new float[] { swipeX, swipeStartY };
-                    }
-                },
-                new CoordinatesProvider() {
-                    @Override
-                    public float[] calculateCoordinates(View view) {
-                        return new float[] { swipeX, swipeStartY + swipeAmountY };
-                    }
-                },
-                Press.FINGER
-        );
-    }
-
-
-}
diff --git a/design/tests/src/android/support/design/testutils/TabLayoutActions.java b/design/tests/src/android/support/design/testutils/TabLayoutActions.java
deleted file mode 100644
index 7c17850..0000000
--- a/design/tests/src/android/support/design/testutils/TabLayoutActions.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.testutils;
-
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayingAtLeast;
-
-import android.support.annotation.Nullable;
-import android.support.design.widget.TabLayout;
-import android.support.test.espresso.UiController;
-import android.support.test.espresso.ViewAction;
-import android.support.test.espresso.matcher.ViewMatchers;
-import android.support.v4.view.ViewPager;
-import android.view.View;
-
-import org.hamcrest.Matcher;
-
-public class TabLayoutActions {
-    /**
-     * Wires <code>TabLayout</code> to <code>ViewPager</code> content.
-     */
-    public static ViewAction setupWithViewPager(final @Nullable ViewPager viewPager) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayingAtLeast(90);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Setup with ViewPager content";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                TabLayout tabLayout = (TabLayout) view;
-                tabLayout.setupWithViewPager(viewPager);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Wires <code>TabLayout</code> to <code>ViewPager</code> content.
-     */
-    public static ViewAction setupWithViewPager(final @Nullable ViewPager viewPager,
-            final boolean autoRefresh) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayingAtLeast(90);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Setup with ViewPager content";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                TabLayout tabLayout = (TabLayout) view;
-                tabLayout.setupWithViewPager(viewPager, autoRefresh);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Selects the specified tab in the <code>TabLayout</code>.
-     */
-    public static ViewAction selectTab(final int tabIndex) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayingAtLeast(90);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Selects tab";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                TabLayout tabLayout = (TabLayout) view;
-                tabLayout.getTabAt(tabIndex).select();
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Sets the specified tab mode in the <code>TabLayout</code>.
-     */
-    public static ViewAction setTabMode(final int tabMode) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayingAtLeast(90);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Sets tab mode";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                TabLayout tabLayout = (TabLayout) view;
-                tabLayout.setTabMode(tabMode);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Calls <code>setScrollPosition(position, positionOffset, true)</code> on the
-     * <code>TabLayout</code>
-     */
-    public static ViewAction setScrollPosition(final int position, final float positionOffset) {
-        return new ViewAction() {
-
-            @Override
-            public Matcher<View> getConstraints() {
-                return ViewMatchers.isAssignableFrom(TabLayout.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "setScrollPosition(" + position + ", " + positionOffset + ", true)";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                TabLayout tabs = (TabLayout) view;
-                tabs.setScrollPosition(position, positionOffset, true);
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-}
diff --git a/design/tests/src/android/support/design/testutils/TestDrawable.java b/design/tests/src/android/support/design/testutils/TestDrawable.java
deleted file mode 100644
index 26b3bf0..0000000
--- a/design/tests/src/android/support/design/testutils/TestDrawable.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-import android.graphics.drawable.GradientDrawable;
-import android.support.annotation.ColorInt;
-
-/**
- * Custom drawable class that provides a reliable way for testing various tinting scenarios
- * across a range of platform versions. ColorDrawable doesn't support tinting on Kitkat and
- * below, and BitmapDrawable (PNG sources) appears to slightly alter green and blue channels
- * by a few units on some of the older platform versions (Gingerbread). Using GradientDrawable
- * allows doing reliable tests at the level of individual channels (alpha / red / green / blue)
- * for tinted and untinted icons in the testIconTinting method.
- */
-public class TestDrawable extends GradientDrawable {
-    private int mWidth;
-    private int mHeight;
-
-    public TestDrawable(@ColorInt int color, int width, int height) {
-        super(Orientation.TOP_BOTTOM, new int[] { color, color });
-        mWidth = width;
-        mHeight = height;
-    }
-
-    @Override
-    public int getIntrinsicWidth() {
-        return mWidth;
-    }
-
-    @Override
-    public int getIntrinsicHeight() {
-        return mHeight;
-    }
-}
diff --git a/design/tests/src/android/support/design/testutils/TestUtils.java b/design/tests/src/android/support/design/testutils/TestUtils.java
deleted file mode 100644
index 5b1eff7..0000000
--- a/design/tests/src/android/support/design/testutils/TestUtils.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-import static org.junit.Assert.fail;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.ColorInt;
-import android.support.annotation.NonNull;
-
-public class TestUtils {
-    /**
-     * Checks whether all the pixels in the specified drawable are of the same specified color.
-     *
-     * In case there is a color mismatch, the behavior of this method depends on the
-     * <code>throwExceptionIfFails</code> parameter. If it is <code>true</code>, this method will
-     * throw an <code>Exception</code> describing the mismatch. Otherwise this method will call
-     * <code>Assert.fail</code> with detailed description of the mismatch.
-     */
-    public static void assertAllPixelsOfColor(String failMessagePrefix, @NonNull Drawable drawable,
-            int drawableWidth, int drawableHeight, boolean callSetBounds, @ColorInt int color,
-            int allowedComponentVariance, boolean throwExceptionIfFails) {
-        assertAllPixelsOfColor(failMessagePrefix, drawable, drawableWidth, drawableHeight,
-                callSetBounds, color, null, allowedComponentVariance, throwExceptionIfFails);
-    }
-
-    public static void assertAllPixelsOfColor(String failMessagePrefix, @NonNull Drawable drawable,
-            int drawableWidth, int drawableHeight, boolean callSetBounds, @ColorInt int color,
-            Rect checkArea, int allowedComponentVariance, boolean throwExceptionIfFails) {
-
-        // Create a bitmap
-        Bitmap bitmap = Bitmap.createBitmap(drawableWidth, drawableHeight, Bitmap.Config.ARGB_8888);
-        // Create a canvas that wraps the bitmap
-        Canvas canvas = new Canvas(bitmap);
-        if (callSetBounds) {
-            // Configure the drawable to have bounds that match the passed size
-            drawable.setBounds(0, 0, drawableWidth, drawableHeight);
-        }
-
-        // And ask the drawable to draw itself to the canvas / bitmap
-        drawable.draw(canvas);
-
-        try {
-            int[] rowPixels = new int[drawableWidth];
-
-            final int firstRow = checkArea != null ? checkArea.top : 0;
-            final int lastRow = checkArea != null ? checkArea.bottom : drawableHeight - 1;
-            final int firstCol = checkArea != null ? checkArea.left : 0;
-            final int lastCol = checkArea != null ? checkArea.right : drawableWidth - 1;
-
-            final int expectedAlpha = Color.alpha(color);
-            final int expectedRed = Color.red(color);
-            final int expectedGreen = Color.green(color);
-            final int expectedBlue = Color.blue(color);
-
-            for (int row = firstRow; row <= lastRow; row++) {
-                bitmap.getPixels(rowPixels, 0, drawableWidth, 0, row, drawableWidth, 1);
-
-                for (int column = firstCol; column <= lastCol; column++) {
-                    int sourceAlpha = Color.alpha(rowPixels[column]);
-                    int sourceRed = Color.red(rowPixels[column]);
-                    int sourceGreen = Color.green(rowPixels[column]);
-                    int sourceBlue = Color.blue(rowPixels[column]);
-
-                    int varianceAlpha = Math.abs(sourceAlpha - expectedAlpha);
-                    int varianceRed = Math.abs(sourceRed - expectedRed);
-                    int varianceGreen = Math.abs(sourceGreen - expectedGreen);
-                    int varianceBlue = Math.abs(sourceBlue - expectedBlue);
-
-                    boolean isColorMatch = (varianceAlpha <= allowedComponentVariance)
-                            && (varianceRed <= allowedComponentVariance)
-                            && (varianceGreen <= allowedComponentVariance)
-                            && (varianceBlue <= allowedComponentVariance);
-
-                    if (!isColorMatch) {
-                        String mismatchDescription = failMessagePrefix
-                                + ": expected all drawable colors to be ["
-                                + expectedAlpha + "," + expectedRed + ","
-                                + expectedGreen + "," + expectedBlue
-                                + "] but at position (" + row + "," + column + ") found ["
-                                + sourceAlpha + "," + sourceRed + ","
-                                + sourceGreen + "," + sourceBlue + "]";
-                        if (throwExceptionIfFails) {
-                            throw new RuntimeException(mismatchDescription);
-                        } else {
-                            fail(mismatchDescription);
-                        }
-                    }
-                }
-            }
-        } finally {
-            bitmap.recycle();
-        }
-    }
-
-    public static int getThemeAttrColor(Context context, final int attr) {
-        TypedArray a = null;
-        try {
-            a = context.obtainStyledAttributes(new int[]{attr});
-            return a.getColor(0, 0);
-        } finally {
-            if (a != null) {
-                a.recycle();
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/design/tests/src/android/support/design/testutils/TestUtilsActions.java b/design/tests/src/android/support/design/testutils/TestUtilsActions.java
deleted file mode 100644
index a9d1233..0000000
--- a/design/tests/src/android/support/design/testutils/TestUtilsActions.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.testutils;
-
-import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayingAtLeast;
-import static android.support.test.espresso.matcher.ViewMatchers.isRoot;
-
-import android.graphics.drawable.Drawable;
-import android.os.Parcelable;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.MenuRes;
-import android.support.annotation.Nullable;
-import android.support.design.widget.CollapsingToolbarLayout;
-import android.support.design.widget.NavigationView;
-import android.support.design.widget.TabLayout;
-import android.support.test.espresso.UiController;
-import android.support.test.espresso.ViewAction;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.widget.TextViewCompat;
-import android.util.SparseArray;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import org.hamcrest.Matcher;
-
-public class TestUtilsActions {
-    /**
-     * Replaces an existing {@link TabLayout} with a new one inflated from the specified
-     * layout resource.
-     */
-    public static ViewAction replaceTabLayout(final @LayoutRes int tabLayoutResId) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayingAtLeast(90);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Replace TabLayout";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                final ViewGroup viewGroup = (ViewGroup) view;
-                final int childCount = viewGroup.getChildCount();
-                // Iterate over children and find TabLayout
-                for (int i = 0; i < childCount; i++) {
-                    View child = viewGroup.getChildAt(i);
-                    if (child instanceof TabLayout) {
-                        // Remove the existing TabLayout
-                        viewGroup.removeView(child);
-                        // Create a new one
-                        final LayoutInflater layoutInflater =
-                                LayoutInflater.from(view.getContext());
-                        final TabLayout newTabLayout = (TabLayout) layoutInflater.inflate(
-                                tabLayoutResId, viewGroup, false);
-                        // Make sure we're adding the new TabLayout at the same index
-                        viewGroup.addView(newTabLayout, i);
-                        break;
-                    }
-                }
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Sets layout direction on the view.
-     */
-    public static ViewAction setLayoutDirection(final int layoutDirection) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "set layout direction";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                ViewCompat.setLayoutDirection(view, layoutDirection);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Sets title on the {@link CollapsingToolbarLayout}.
-     */
-    public static ViewAction setTitle(final CharSequence title) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(CollapsingToolbarLayout.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "set toolbar title";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                CollapsingToolbarLayout collapsingToolbarLayout =
-                        (CollapsingToolbarLayout) view;
-                collapsingToolbarLayout.setTitle(title);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Sets text content on {@link TextView}
-     */
-    public static ViewAction setText(final @Nullable CharSequence text) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(TextView.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "TextView set text";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                TextView textView = (TextView) view;
-                textView.setText(text);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Adds tabs to {@link TabLayout}
-     */
-    public static ViewAction addTabs(final String... tabs) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(TabLayout.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "TabLayout add tabs";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                TabLayout tabLayout = (TabLayout) view;
-                for (int i = 0; i < tabs.length; i++) {
-                    tabLayout.addTab(tabLayout.newTab().setText(tabs[i]));
-                }
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Dummy Espresso action that waits until the UI thread is idle. This action can be performed
-     * on the root view to wait for an ongoing animation to be completed.
-     */
-    public static ViewAction waitUntilIdle() {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isRoot();
-            }
-
-            @Override
-            public String getDescription() {
-                return "wait for idle";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction setEnabled(final boolean enabled) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "set enabled";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                view.setEnabled(enabled);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction setClickable(final boolean clickable) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "set clickable";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                view.setClickable(clickable);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction setSelected(final boolean selected) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "set selected";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-                view.setSelected(selected);
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Sets compound drawables on {@link TextView}
-     */
-    public static ViewAction setCompoundDrawablesRelative(final @Nullable Drawable start,
-            final @Nullable Drawable top, final @Nullable Drawable end,
-            final @Nullable Drawable bottom) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(TextView.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "TextView set compound drawables relative";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                TextView textView = (TextView) view;
-                TextViewCompat.setCompoundDrawablesRelative(textView, start, top, end, bottom);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Restores the saved hierarchy state.
-     *
-     * @param container The saved hierarchy state.
-     */
-    public static ViewAction restoreHierarchyState(final SparseArray<Parcelable> container) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(View.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "restore the saved state";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-                view.restoreHierarchyState(container);
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Clears and inflates the menu.
-     *
-     * @param menuResId The menu resource XML to be used.
-     */
-    public static ViewAction reinflateMenu(final @MenuRes int menuResId) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(NavigationView.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "clear and inflate menu " + menuResId;
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-                final NavigationView nv = (NavigationView) view;
-                nv.getMenu().clear();
-                nv.inflateMenu(menuResId);
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-}
diff --git a/design/tests/src/android/support/design/testutils/TestUtilsMatchers.java b/design/tests/src/android/support/design/testutils/TestUtilsMatchers.java
deleted file mode 100644
index 46bb982..0000000
--- a/design/tests/src/android/support/design/testutils/TestUtilsMatchers.java
+++ /dev/null
@@ -1,564 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.testutils;
-
-import static org.junit.Assert.assertEquals;
-
-import android.content.res.Resources;
-import android.graphics.Color;
-import android.graphics.Rect;
-import android.graphics.Typeface;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.support.annotation.ColorInt;
-import android.support.annotation.IdRes;
-import android.support.annotation.NonNull;
-import android.support.design.widget.FloatingActionButton;
-import android.support.test.espresso.matcher.BoundedMatcher;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.widget.TextViewCompat;
-import android.support.v7.view.menu.MenuItemImpl;
-import android.view.Gravity;
-import android.view.Menu;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-public class TestUtilsMatchers {
-    /**
-     * Returns a matcher that matches Views that are not narrower than specified width in pixels.
-     */
-    public static Matcher<View> isNotNarrowerThan(final int minWidth) {
-        return new BoundedMatcher<View, View>(View.class) {
-            private String failedCheckDescription;
-
-            @Override
-            public void describeTo(final Description description) {
-                description.appendText(failedCheckDescription);
-            }
-
-            @Override
-            public boolean matchesSafely(final View view) {
-                final int viewWidth = view.getWidth();
-                if (viewWidth < minWidth) {
-                    failedCheckDescription =
-                            "width " + viewWidth + " is less than minimum " + minWidth;
-                    return false;
-                }
-                return true;
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches Views that are not wider than specified width in pixels.
-     */
-    public static Matcher<View> isNotWiderThan(final int maxWidth) {
-        return new BoundedMatcher<View, View>(View.class) {
-            private String failedCheckDescription;
-
-            @Override
-            public void describeTo(final Description description) {
-                description.appendText(failedCheckDescription);
-            }
-
-            @Override
-            public boolean matchesSafely(final View view) {
-                final int viewWidth = view.getWidth();
-                if (viewWidth > maxWidth) {
-                    failedCheckDescription =
-                            "width " + viewWidth + " is more than maximum " + maxWidth;
-                    return false;
-                }
-                return true;
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches TextViews with the specified text size.
-     */
-    public static Matcher withTextSize(final float textSize) {
-        return new BoundedMatcher<View, TextView>(TextView.class) {
-            private String failedCheckDescription;
-
-            @Override
-            public void describeTo(final Description description) {
-                description.appendText(failedCheckDescription);
-            }
-
-            @Override
-            public boolean matchesSafely(final TextView view) {
-                final float ourTextSize = view.getTextSize();
-                if (Math.abs(textSize - ourTextSize) > 1.0f) {
-                    failedCheckDescription =
-                            "text size " + ourTextSize + " is different than expected " + textSize;
-                    return false;
-                }
-                return true;
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches TextViews with the specified text color.
-     */
-    public static Matcher withTextColor(final @ColorInt int textColor) {
-        return new BoundedMatcher<View, TextView>(TextView.class) {
-            private String failedCheckDescription;
-
-            @Override
-            public void describeTo(final Description description) {
-                description.appendText(failedCheckDescription);
-            }
-
-            @Override
-            public boolean matchesSafely(final TextView view) {
-                final @ColorInt int ourTextColor = view.getCurrentTextColor();
-                if (ourTextColor != textColor) {
-                    int ourAlpha = Color.alpha(ourTextColor);
-                    int ourRed = Color.red(ourTextColor);
-                    int ourGreen = Color.green(ourTextColor);
-                    int ourBlue = Color.blue(ourTextColor);
-
-                    int expectedAlpha = Color.alpha(textColor);
-                    int expectedRed = Color.red(textColor);
-                    int expectedGreen = Color.green(textColor);
-                    int expectedBlue = Color.blue(textColor);
-
-                    failedCheckDescription =
-                            "expected color to be ["
-                                    + expectedAlpha + "," + expectedRed + ","
-                                    + expectedGreen + "," + expectedBlue
-                                    + "] but found ["
-                                    + ourAlpha + "," + ourRed + ","
-                                    + ourGreen + "," + ourBlue + "]";
-                    return false;
-                }
-                return true;
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches TextViews whose start drawable is filled with the specified
-     * fill color.
-     */
-    public static Matcher withStartDrawableFilledWith(final @ColorInt int fillColor,
-            final int allowedComponentVariance) {
-        return new BoundedMatcher<View, TextView>(TextView.class) {
-            private String failedCheckDescription;
-
-            @Override
-            public void describeTo(final Description description) {
-                description.appendText(failedCheckDescription);
-            }
-
-            @Override
-            public boolean matchesSafely(final TextView view) {
-                final Drawable[] compoundDrawables = view.getCompoundDrawables();
-                final boolean isRtl =
-                        (ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_RTL);
-                final Drawable startDrawable = isRtl ? compoundDrawables[2] : compoundDrawables[0];
-                if (startDrawable == null) {
-                    failedCheckDescription = "no start drawable";
-                    return false;
-                }
-                try {
-                    final Rect bounds = startDrawable.getBounds();
-                    TestUtils.assertAllPixelsOfColor("",
-                            startDrawable, bounds.width(), bounds.height(), true,
-                            fillColor, allowedComponentVariance, true);
-                } catch (Throwable t) {
-                    failedCheckDescription = t.getMessage();
-                    return false;
-                }
-                return true;
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches <code>ImageView</code>s which have drawable flat-filled
-     * with the specific color.
-     */
-    public static Matcher drawable(@ColorInt final int color, final int allowedComponentVariance) {
-        return new BoundedMatcher<View, ImageView>(ImageView.class) {
-            private String mFailedComparisonDescription;
-
-            @Override
-            public void describeTo(final Description description) {
-                description.appendText("with drawable of color: ");
-
-                description.appendText(mFailedComparisonDescription);
-            }
-
-            @Override
-            public boolean matchesSafely(final ImageView view) {
-                Drawable drawable = view.getDrawable();
-                if (drawable == null) {
-                    return false;
-                }
-
-                // One option is to check if we have a ColorDrawable and then call getColor
-                // but that API is v11+. Instead, we call our helper method that checks whether
-                // all pixels in a Drawable are of the same specified color.
-                try {
-                    TestUtils.assertAllPixelsOfColor("", drawable, view.getWidth(),
-                            view.getHeight(), true, color, allowedComponentVariance, true);
-                    // If we are here, the color comparison has passed.
-                    mFailedComparisonDescription = null;
-                    return true;
-                } catch (Throwable t) {
-                    // If we are here, the color comparison has failed.
-                    mFailedComparisonDescription = t.getMessage();
-                    return false;
-                }
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches Views with the specified background fill color.
-     */
-    public static Matcher withBackgroundFill(final @ColorInt int fillColor) {
-        return new BoundedMatcher<View, View>(View.class) {
-            private String failedCheckDescription;
-
-            @Override
-            public void describeTo(final Description description) {
-                description.appendText(failedCheckDescription);
-            }
-
-            @Override
-            public boolean matchesSafely(final View view) {
-                Drawable background = view.getBackground();
-                try {
-                    TestUtils.assertAllPixelsOfColor("",
-                            background, view.getWidth(), view.getHeight(), true,
-                            fillColor, 0, true);
-                } catch (Throwable t) {
-                    failedCheckDescription = t.getMessage();
-                    return false;
-                }
-                return true;
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches FloatingActionButtons with the specified custom size.
-     */
-    public static Matcher withFabCustomSize(final int customSize) {
-        return new BoundedMatcher<View, View>(View.class) {
-            private String mFailedCheckDescription;
-
-            @Override
-            public void describeTo(final Description description) {
-                description.appendText(mFailedCheckDescription);
-            }
-
-            @Override
-            public boolean matchesSafely(final View view) {
-                if (!(view instanceof FloatingActionButton)) {
-                    return false;
-                }
-
-                final FloatingActionButton fab = (FloatingActionButton) view;
-                if (Math.abs(fab.getCustomSize() - customSize) > 1.0f) {
-                    mFailedCheckDescription =
-                            "Custom size " + fab.getCustomSize() + " is different than expected "
-                                    + customSize;
-                    return false;
-                }
-                return true;
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches FloatingActionButtons with the specified background
-     * fill color.
-     */
-    public static Matcher withFabBackgroundFill(final @ColorInt int fillColor) {
-        return new BoundedMatcher<View, View>(View.class) {
-            private String failedCheckDescription;
-
-            @Override
-            public void describeTo(final Description description) {
-                description.appendText(failedCheckDescription);
-            }
-
-            @Override
-            public boolean matchesSafely(final View view) {
-                if (!(view instanceof FloatingActionButton)) {
-                    return false;
-                }
-
-                final FloatingActionButton fab = (FloatingActionButton) view;
-
-                // Since the FAB background is round, and may contain the shadow, we'll look at
-                // just the center half rect of the content area
-                final Rect area = new Rect();
-                fab.getContentRect(area);
-
-                final int rectHeightQuarter = area.height() / 4;
-                final int rectWidthQuarter = area.width() / 4;
-                area.left += rectWidthQuarter;
-                area.top += rectHeightQuarter;
-                area.right -= rectWidthQuarter;
-                area.bottom -= rectHeightQuarter;
-
-                try {
-                    TestUtils.assertAllPixelsOfColor("",
-                            fab.getBackground(), view.getWidth(), view.getHeight(), false,
-                            fillColor, area, 0, true);
-                } catch (Throwable t) {
-                    failedCheckDescription = t.getMessage();
-                    return false;
-                }
-                return true;
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches {@link View}s based on the given parent type.
-     *
-     * @param parentMatcher the type of the parent to match on
-     */
-    public static Matcher<View> isChildOfA(final Matcher<View> parentMatcher) {
-        return new TypeSafeMatcher<View>() {
-            @Override
-            public void describeTo(Description description) {
-                description.appendText("is child of a: ");
-                parentMatcher.describeTo(description);
-            }
-
-            @Override
-            public boolean matchesSafely(View view) {
-                final ViewParent viewParent = view.getParent();
-                if (!(viewParent instanceof View)) {
-                    return false;
-                }
-                if (parentMatcher.matches(viewParent)) {
-                    return true;
-                }
-                return false;
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches FloatingActionButtons with the specified content height
-     */
-    public static Matcher withFabContentHeight(final int size) {
-        return new BoundedMatcher<View, View>(View.class) {
-            private String failedCheckDescription;
-
-            @Override
-            public void describeTo(final Description description) {
-                description.appendText(failedCheckDescription);
-            }
-
-            @Override
-            public boolean matchesSafely(final View view) {
-                if (!(view instanceof FloatingActionButton)) {
-                    return false;
-                }
-
-                final FloatingActionButton fab = (FloatingActionButton) view;
-                final Rect area = new Rect();
-                fab.getContentRect(area);
-
-                return area.height() == size;
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches FloatingActionButtons with the specified gravity.
-     */
-    public static Matcher withFabContentAreaOnMargins(final int gravity) {
-        return new BoundedMatcher<View, View>(View.class) {
-            private String failedCheckDescription;
-
-            @Override
-            public void describeTo(final Description description) {
-                description.appendText(failedCheckDescription);
-            }
-
-            @Override
-            public boolean matchesSafely(final View view) {
-                if (!(view instanceof FloatingActionButton)) {
-                    return false;
-                }
-
-                final FloatingActionButton fab = (FloatingActionButton) view;
-                final ViewGroup.MarginLayoutParams lp =
-                        (ViewGroup.MarginLayoutParams) fab.getLayoutParams();
-                final ViewGroup parent = (ViewGroup) view.getParent();
-
-                final Rect area = new Rect();
-                fab.getContentRect(area);
-
-                final int absGravity = GravityCompat.getAbsoluteGravity(gravity,
-                        ViewCompat.getLayoutDirection(view));
-
-                try {
-                    switch (absGravity & Gravity.VERTICAL_GRAVITY_MASK) {
-                        case Gravity.TOP:
-                            assertEquals(lp.topMargin, fab.getTop() + area.top);
-                            break;
-                        case Gravity.BOTTOM:
-                            assertEquals(parent.getHeight() - lp.bottomMargin,
-                                    fab.getTop() + area.bottom);
-                            break;
-                    }
-                    switch (absGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
-                        case Gravity.LEFT:
-                            assertEquals(lp.leftMargin, fab.getLeft() + area.left);
-                            break;
-                        case Gravity.RIGHT:
-                            assertEquals(parent.getWidth() - lp.rightMargin,
-                                    fab.getLeft() + area.right);
-                            break;
-                    }
-                    return true;
-                } catch (Throwable t) {
-                    failedCheckDescription = t.getMessage();
-                    return false;
-                }
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches FloatingActionButtons with the specified content height
-     */
-    public static Matcher withCompoundDrawable(final int index, final Drawable expected) {
-        return new BoundedMatcher<View, View>(View.class) {
-            private String failedCheckDescription;
-
-            @Override
-            public void describeTo(final Description description) {
-                description.appendText(failedCheckDescription);
-            }
-
-            @Override
-            public boolean matchesSafely(final View view) {
-                if (!(view instanceof TextView)) {
-                    return false;
-                }
-
-                final TextView textView = (TextView) view;
-                return expected == TextViewCompat.getCompoundDrawablesRelative(textView)[index];
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches {@link View}s that are pressed.
-     */
-    public static Matcher<View> isPressed() {
-        return new TypeSafeMatcher<View>() {
-            @Override
-            public void describeTo(Description description) {
-                description.appendText("is pressed");
-            }
-
-            @Override
-            public boolean matchesSafely(View view) {
-                return view.isPressed();
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches views which have a z-value greater than 0. Also matches if
-     * the platform we're running on does not support z-values.
-     */
-    public static Matcher<View> hasZ() {
-        return new TypeSafeMatcher<View>() {
-            @Override
-            public void describeTo(Description description) {
-                description.appendText("has a z value greater than 0");
-            }
-
-            @Override
-            public boolean matchesSafely(View view) {
-                return Build.VERSION.SDK_INT < 21 || ViewCompat.getZ(view) > 0f;
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches TextViews with the specified typeface.
-     */
-    public static Matcher withTypeface(@NonNull final Typeface typeface) {
-        return new TypeSafeMatcher<TextView>(TextView.class) {
-            @Override
-            public void describeTo(final Description description) {
-                description.appendText("view with typeface: " + typeface);
-            }
-
-            @Override
-            public boolean matchesSafely(final TextView view) {
-                return typeface.equals(view.getTypeface());
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches the action view of the specified menu item.
-     *
-     * @param menu The menu
-     * @param id   The ID of the menu item
-     */
-    public static Matcher<View> isActionViewOf(@NonNull final Menu menu, @IdRes final int id) {
-        return new TypeSafeMatcher<View>() {
-
-            private Resources mResources;
-
-            @Override
-            protected boolean matchesSafely(View view) {
-                mResources = view.getResources();
-                MenuItemImpl item = (MenuItemImpl) menu.findItem(id);
-                return item != null && item.getActionView() == view;
-            }
-
-            @Override
-            public void describeTo(Description description) {
-                String name;
-                if (mResources != null) {
-                    name = mResources.getResourceName(id);
-                } else {
-                    name = Integer.toString(id);
-                }
-                description.appendText("is action view of menu item " + name);
-            }
-        };
-    }
-
-}
diff --git a/design/tests/src/android/support/design/testutils/TextInputLayoutActions.java b/design/tests/src/android/support/design/testutils/TextInputLayoutActions.java
deleted file mode 100755
index c4d4520..0000000
--- a/design/tests/src/android/support/design/testutils/TextInputLayoutActions.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
-
-import android.graphics.Typeface;
-import android.support.design.R;
-import android.support.design.widget.TextInputLayout;
-import android.support.test.espresso.UiController;
-import android.support.test.espresso.ViewAction;
-import android.support.test.espresso.matcher.ViewMatchers;
-import android.view.View;
-
-import org.hamcrest.Matcher;
-
-public class TextInputLayoutActions {
-
-    public static ViewAction setErrorEnabled(final boolean enabled) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(TextInputLayout.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Enables/disables the error";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                TextInputLayout layout = (TextInputLayout) view;
-                layout.setErrorEnabled(enabled);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction setError(final CharSequence error) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(TextInputLayout.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Sets the error";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                TextInputLayout layout = (TextInputLayout) view;
-                layout.setError(error);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction setErrorTextAppearance(final int resId) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(TextInputLayout.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Sets the error text appearance";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                TextInputLayout layout = (TextInputLayout) view;
-                layout.setErrorTextAppearance(resId);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction setTypeface(final Typeface typeface) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(TextInputLayout.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Sets the typeface";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                TextInputLayout layout = (TextInputLayout) view;
-                layout.setTypeface(typeface);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction setPasswordVisibilityToggleEnabled(final boolean enabled) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(TextInputLayout.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Sets the error";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                TextInputLayout layout = (TextInputLayout) view;
-                layout.setPasswordVisibilityToggleEnabled(enabled);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction setCounterEnabled(final boolean enabled) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(TextInputLayout.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Sets the counter enabled";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                TextInputLayout layout = (TextInputLayout) view;
-                layout.setCounterEnabled(enabled);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public static ViewAction setCounterMaxLength(final int maxLength) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(TextInputLayout.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Sets the counter max length";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                TextInputLayout layout = (TextInputLayout) view;
-                layout.setCounterMaxLength(maxLength);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Toggles password.
-     */
-    public static ViewAction clickPasswordToggle() {
-        return new ViewAction() {
-
-            @Override
-            public Matcher<View> getConstraints() {
-                return ViewMatchers.isAssignableFrom(TextInputLayout.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Clicks the password toggle";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                TextInputLayout textInputLayout = (TextInputLayout) view;
-                // Reach in and find the password toggle since we don't have a public API
-                // to get a reference to it
-                View passwordToggle = textInputLayout.findViewById(R.id.text_input_password_toggle);
-                passwordToggle.performClick();
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-}
diff --git a/design/tests/src/android/support/design/testutils/TextInputLayoutMatchers.java b/design/tests/src/android/support/design/testutils/TextInputLayoutMatchers.java
deleted file mode 100755
index d67e555..0000000
--- a/design/tests/src/android/support/design/testutils/TextInputLayoutMatchers.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-import android.support.design.R;
-import android.support.design.widget.CheckableImageButton;
-import android.support.design.widget.TextInputLayout;
-import android.text.TextUtils;
-import android.view.View;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-public class TextInputLayoutMatchers {
-
-    /**
-     * Returns a matcher that matches TextInputLayouts with non-empty content descriptions for
-     * the password toggle.
-     */
-    public static Matcher passwordToggleHasContentDescription() {
-        return new TypeSafeMatcher<TextInputLayout>() {
-            @Override
-            public void describeTo(Description description) {
-                description.appendText("TextInputLayout has non-empty content description"
-                        + "for password toggle.");
-            }
-
-            @Override
-            protected boolean matchesSafely(TextInputLayout item) {
-                // Reach in and find the password toggle since we don't have a public API
-                // to get a reference to it
-                View passwordToggle = item.findViewById(R.id.text_input_password_toggle);
-                return !TextUtils.isEmpty(item.getPasswordVisibilityToggleContentDescription())
-                    && !TextUtils.isEmpty(passwordToggle.getContentDescription());
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches TextInputLayouts with non-displayed password toggles
-     */
-    public static Matcher doesNotShowPasswordToggle() {
-        return new TypeSafeMatcher<TextInputLayout>() {
-            @Override
-            public void describeTo(Description description) {
-                description.appendText("TextInputLayout shows password toggle.");
-            }
-
-            @Override
-            protected boolean matchesSafely(TextInputLayout item) {
-                // Reach in and find the password toggle since we don't have a public API
-                // to get a reference to it
-                View passwordToggle = item.findViewById(R.id.text_input_password_toggle);
-                return passwordToggle.getVisibility() != View.VISIBLE;
-            }
-        };
-    }
-
-    /**
-     * Returns a matcher that matches TextInputLayouts with non-displayed password toggles
-     */
-    public static Matcher passwordToggleIsNotChecked() {
-        return new TypeSafeMatcher<TextInputLayout>() {
-            @Override
-            public void describeTo(Description description) {
-                description.appendText("TextInputLayout has checked password toggle.");
-            }
-
-            @Override
-            protected boolean matchesSafely(TextInputLayout item) {
-                // Reach in and find the password toggle since we don't have a public API
-                // to get a reference to it
-                CheckableImageButton passwordToggle = (CheckableImageButton) item.findViewById(
-                        R.id.text_input_password_toggle);
-                return !passwordToggle.isChecked();
-            }
-        };
-    }
-}
diff --git a/design/tests/src/android/support/design/testutils/ViewPagerActions.java b/design/tests/src/android/support/design/testutils/ViewPagerActions.java
deleted file mode 100644
index 1a147cf..0000000
--- a/design/tests/src/android/support/design/testutils/ViewPagerActions.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.testutils;
-
-import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayingAtLeast;
-
-import android.support.annotation.Nullable;
-import android.support.test.espresso.UiController;
-import android.support.test.espresso.ViewAction;
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.ViewPager;
-import android.view.View;
-
-import org.hamcrest.Matcher;
-
-public class ViewPagerActions {
-    /**
-     * Moves <code>ViewPager</code> to the right by one page.
-     */
-    public static ViewAction scrollRight() {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayingAtLeast(90);
-            }
-
-            @Override
-            public String getDescription() {
-                return "ViewPager scroll one page to the right";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                ViewPager viewPager = (ViewPager) view;
-                int current = viewPager.getCurrentItem();
-                viewPager.setCurrentItem(current + 1, false);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Moves <code>ViewPager</code> to the left by one page.
-     */
-    public static ViewAction scrollLeft() {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayingAtLeast(90);
-            }
-
-            @Override
-            public String getDescription() {
-                return "ViewPager scroll one page to the left";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                ViewPager viewPager = (ViewPager) view;
-                int current = viewPager.getCurrentItem();
-                viewPager.setCurrentItem(current - 1, false);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Moves <code>ViewPager</code> to the last page.
-     */
-    public static ViewAction scrollToLast() {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayingAtLeast(90);
-            }
-
-            @Override
-            public String getDescription() {
-                return "ViewPager scroll to last page";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                ViewPager viewPager = (ViewPager) view;
-                int size = viewPager.getAdapter().getCount();
-                if (size > 0) {
-                    viewPager.setCurrentItem(size - 1, false);
-                }
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Moves <code>ViewPager</code> to the first page.
-     */
-    public static ViewAction scrollToFirst() {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayingAtLeast(90);
-            }
-
-            @Override
-            public String getDescription() {
-                return "ViewPager scroll to first page";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                ViewPager viewPager = (ViewPager) view;
-                int size = viewPager.getAdapter().getCount();
-                if (size > 0) {
-                    viewPager.setCurrentItem(0, false);
-                }
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Moves <code>ViewPager</code> to specific page.
-     */
-    public static ViewAction scrollToPage(final int page) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isDisplayingAtLeast(90);
-            }
-
-            @Override
-            public String getDescription() {
-                return "ViewPager move to a specific page";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                ViewPager viewPager = (ViewPager) view;
-                viewPager.setCurrentItem(page, false);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    /**
-     * Sets the specified adapter on <code>ViewPager</code>.
-     */
-    public static ViewAction setAdapter(final @Nullable PagerAdapter adapter) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(ViewPager.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "ViewPager set adapter";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                ViewPager viewPager = (ViewPager) view;
-                viewPager.setAdapter(adapter);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-}
diff --git a/design/tests/src/android/support/design/testutils/ViewStructureImpl.java b/design/tests/src/android/support/design/testutils/ViewStructureImpl.java
deleted file mode 100644
index c7369e9..0000000
--- a/design/tests/src/android/support/design/testutils/ViewStructureImpl.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * 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 android.support.design.testutils;
-
-import android.graphics.Matrix;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.os.LocaleList;
-import android.view.ViewStructure;
-import android.view.ViewStructure.HtmlInfo.Builder;
-import android.view.autofill.AutofillId;
-import android.view.autofill.AutofillValue;
-
-/**
- * Simple implementation of {@link ViewStructure} that's easier to use than a Mockito mock.
- *
- * <p>Currently supports only {@code hint}, {@code className}, and child-related methods.
- */
-public class ViewStructureImpl extends ViewStructure {
-
-    private CharSequence mHint;
-    private String mClassName;
-    private ViewStructureImpl[] mChildren;
-
-    @Override
-    public void setHint(CharSequence hint) {
-        mHint = hint;
-    }
-
-    // Supported methods
-    @Override
-    public CharSequence getHint() {
-        return mHint;
-    }
-
-    @Override
-    public void setChildCount(int num) {
-        mChildren = new ViewStructureImpl[num];
-    }
-
-    @Override
-    public void setClassName(String className) {
-        mClassName = className;
-    }
-
-    public String getClassName() {
-        return mClassName;
-    }
-
-    @Override
-    public int addChildCount(int num) {
-        if (mChildren == null) {
-            setChildCount(num);
-            return 0;
-        }
-        final int start = mChildren.length;
-        ViewStructureImpl[] newArray = new ViewStructureImpl[start + num];
-        System.arraycopy(mChildren, 0, newArray, 0, start);
-        mChildren = newArray;
-        return start;
-    }
-
-    @Override
-    public int getChildCount() {
-        if (mChildren == null) {
-            return 0;
-        }
-        return mChildren.length;
-    }
-
-    public ViewStructureImpl getChildAt(int index) {
-        return mChildren[index];
-    }
-
-    @Override
-    public ViewStructure newChild(int index) {
-        final ViewStructureImpl child = new ViewStructureImpl();
-        mChildren[index] = child;
-        return child;
-    }
-
-    @Override
-    public ViewStructure asyncNewChild(int index) {
-        return newChild(index);
-    }
-
-
-    // Unsupported methods
-    @Override
-    public void setId(int id, String packageName, String typeName, String entryName) {
-    }
-
-    @Override
-    public void setDimens(int left, int top, int scrollX, int scrollY, int width, int height) {
-    }
-
-    @Override
-    public void setTransformation(Matrix matrix) {
-    }
-
-    @Override
-    public void setElevation(float elevation) {
-    }
-
-    @Override
-    public void setAlpha(float alpha) {
-    }
-
-    @Override
-    public void setVisibility(int visibility) {
-    }
-
-    public void setAssistBlocked(boolean state) {
-    }
-
-    @Override
-    public void setEnabled(boolean state) {
-    }
-
-    @Override
-    public void setClickable(boolean state) {
-    }
-
-    @Override
-    public void setLongClickable(boolean state) {
-    }
-
-    @Override
-    public void setContextClickable(boolean state) {
-    }
-
-    @Override
-    public void setFocusable(boolean state) {
-    }
-
-    @Override
-    public void setFocused(boolean state) {
-    }
-
-    @Override
-    public void setAccessibilityFocused(boolean state) {
-    }
-
-    @Override
-    public void setCheckable(boolean state) {
-    }
-
-    @Override
-    public void setChecked(boolean state) {
-    }
-
-    @Override
-    public void setSelected(boolean state) {
-    }
-
-    @Override
-    public void setActivated(boolean state) {
-    }
-
-    @Override
-    public void setOpaque(boolean opaque) {
-    }
-
-    @Override
-    public void setContentDescription(CharSequence contentDescription) {
-    }
-
-    @Override
-    public void setText(CharSequence text) {
-    }
-
-    @Override
-    public void setText(CharSequence text, int selectionStart, int selectionEnd) {
-    }
-
-    @Override
-    public void setTextStyle(float size, int fgColor, int bgColor, int style) {
-    }
-
-    @Override
-    public void setTextLines(int[] charOffsets, int[] baselines) {
-    }
-
-    @Override
-    public CharSequence getText() {
-        return null;
-    }
-
-    @Override
-    public int getTextSelectionStart() {
-        return 0;
-    }
-
-    @Override
-    public int getTextSelectionEnd() {
-        return 0;
-    }
-
-    @Override
-    public Bundle getExtras() {
-        return null;
-    }
-
-    @Override
-    public boolean hasExtras() {
-        return false;
-    }
-
-    @Override
-    public AutofillId getAutofillId() {
-        return null;
-    }
-
-    @Override
-    public void setAutofillId(AutofillId id) {
-    }
-
-    public void setAutofillId(ViewStructure parent, int virtualId) {
-    }
-
-    @Override
-    public void setAutofillId(AutofillId parentId, int virtualId) {
-    }
-
-    @Override
-    public void setAutofillType(int type) {
-    }
-
-    @Override
-    public void setAutofillHints(String[] hint) {
-    }
-
-    @Override
-    public void setAutofillValue(AutofillValue value) {
-    }
-
-    @Override
-    public void setAutofillOptions(CharSequence[] options) {
-    }
-
-    @Override
-    public void setInputType(int inputType) {
-    }
-
-    @Override
-    public void setDataIsSensitive(boolean sensitive) {
-    }
-
-    @Override
-    public void asyncCommit() {
-    }
-
-    public Rect getTempRect() {
-        return null;
-    }
-
-    @Override
-    public void setWebDomain(String domain) {
-    }
-
-    @Override
-    public void setLocaleList(LocaleList localeList) {
-    }
-
-    @Override
-    public Builder newHtmlInfoBuilder(String tagName) {
-        return null;
-    }
-
-    @Override
-    public void setHtmlInfo(HtmlInfo htmlInfo) {
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingActivity.java b/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingActivity.java
deleted file mode 100644
index 960dbd9..0000000
--- a/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingActivity.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.os.Bundle;
-import android.support.design.test.R;
-import android.support.v7.widget.Toolbar;
-
-public class AppBarHorizontalScrollingActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.design_appbar_horizontal_scrolling;
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
-        setSupportActionBar(toolbar);
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingTest.java b/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingTest.java
deleted file mode 100644
index ccda8b0..0000000
--- a/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.swipeLeft;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-
-import android.app.Activity;
-import android.app.Instrumentation;
-import android.os.SystemClock;
-import android.support.design.test.R;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.Button;
-import android.widget.HorizontalScrollView;
-
-import org.junit.Test;
-
-/**
- * Testing that if we have a {@link AppBarLayout} child that intercepts touch events (such as
- * {@link HorizontalScrollView} that handles horizontal swipes), that does not interfere with
- * event handling after the event sequence is no longer being intercepted by that child.
- */
-@LargeTest
-public class AppBarHorizontalScrollingTest extends
-        BaseInstrumentationTestCase<AppBarHorizontalScrollingActivity> {
-
-    public AppBarHorizontalScrollingTest() {
-        super(AppBarHorizontalScrollingActivity.class);
-    }
-
-    @Test
-    public void testScrollAndClick() throws Throwable {
-        final Activity activity = mActivityTestRule.getActivity();
-        final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
-
-        final Button button = activity.findViewById(R.id.button);
-        final View.OnClickListener mockClickListener = mock(View.OnClickListener.class);
-        button.setOnClickListener(mockClickListener);
-
-        // Emulate a click on the button to verify that the registered listener is invoked
-        // prior to performing a horizontal swipe across the app bar
-        final int[] buttonXY = new int[2];
-        button.getLocationOnScreen(buttonXY);
-        final int buttonWidth = button.getWidth();
-        final int buttonHeight = button.getHeight();
-        final float emulatedTapX = buttonXY[0] + buttonWidth / 2.0f;
-        final float emulatedTapY = buttonXY[1] + buttonHeight / 2.0f;
-
-        emulateButtonClick(instrumentation, emulatedTapX, emulatedTapY);
-        verify(mockClickListener).onClick(button);
-        reset(mockClickListener);
-
-        final HorizontalScrollView hsv = activity.findViewById(R.id.hsv);
-        final int scrollXBefore = hsv.getScrollX();
-        // Now scroll / swipe horizontally across our scrollable content in the app bar
-        onView(withId(R.id.app_bar)).perform(swipeLeft());
-        assertTrue("Horizontal scroll performed", hsv.getScrollX() > scrollXBefore);
-
-        // And emulate another click on the button to verify that the registered listener is still
-        // invoked immediately after performing the horizontal swipe across the app bar
-        emulateButtonClick(instrumentation, emulatedTapX, emulatedTapY);
-        verify(mockClickListener).onClick(button);
-    }
-
-    private void emulateButtonClick(Instrumentation instrumentation, float emulatedTapX,
-            float emulatedTapY) {
-        // Note that the reason to not use Espresso's click() view action is so that we can
-        // faithfully emulate what was happening in the reported bug. We don't want the events
-        // to be sent directly to the button, but rather be processed by the parent coordinator
-        // layout, so that we reproduce what is happening as the events are processed at the level
-        // of that parent.
-
-        // Inject DOWN event
-        long downTime = SystemClock.uptimeMillis();
-        MotionEvent eventDown = MotionEvent.obtain(
-                downTime, downTime, MotionEvent.ACTION_DOWN, emulatedTapX, emulatedTapY, 1);
-        instrumentation.sendPointerSync(eventDown);
-
-        // Inject MOVE event
-        long moveTime = SystemClock.uptimeMillis();
-        MotionEvent eventMove = MotionEvent.obtain(
-                moveTime, moveTime, MotionEvent.ACTION_MOVE, emulatedTapX, emulatedTapY, 1);
-        instrumentation.sendPointerSync(eventMove);
-
-        // Inject UP event
-        long upTime = SystemClock.uptimeMillis();
-        MotionEvent eventUp = MotionEvent.obtain(
-                upTime, upTime, MotionEvent.ACTION_UP, emulatedTapX, emulatedTapY, 1);
-        instrumentation.sendPointerSync(eventUp);
-
-        // Wait for the system to process all events in the queue
-        instrumentation.waitForIdleSync();
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/AppBarLayoutBaseTest.java b/design/tests/src/android/support/design/widget/AppBarLayoutBaseTest.java
deleted file mode 100644
index bd49506..0000000
--- a/design/tests/src/android/support/design/widget/AppBarLayoutBaseTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static android.support.design.testutils.CollapsingToolbarLayoutActions.setContentScrimColor;
-import static android.support.design.testutils.SwipeUtils.swipeDown;
-import static android.support.design.testutils.SwipeUtils.swipeUp;
-import static android.support.design.testutils.TestUtilsActions.setText;
-import static android.support.design.testutils.TestUtilsActions.setTitle;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-
-import static org.junit.Assert.assertEquals;
-
-import android.graphics.Color;
-import android.os.Build;
-import android.os.SystemClock;
-import android.support.annotation.CallSuper;
-import android.support.annotation.IdRes;
-import android.support.annotation.IntRange;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.StringRes;
-import android.support.design.test.R;
-import android.support.design.testutils.Shakespeare;
-import android.support.v4.view.ViewCompat;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.Toolbar;
-import android.text.TextUtils;
-import android.widget.TextView;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-public abstract class AppBarLayoutBaseTest extends BaseDynamicCoordinatorLayoutTest {
-
-    protected AppBarLayout mAppBar;
-
-    protected CollapsingToolbarLayout mCollapsingToolbar;
-
-    protected Toolbar mToolbar;
-
-    protected TextView mTextView;
-
-    protected float mDefaultElevationValue;
-
-    protected static void performVerticalSwipeUpGesture(@IdRes int containerId, final int swipeX,
-            final int swipeStartY, final int swipeAmountY) {
-        onView(withId(containerId)).perform(swipeUp(swipeX, swipeStartY, swipeAmountY));
-    }
-
-    protected static void performVerticalSwipeDownGesture(@IdRes int containerId, final int swipeX,
-            final int swipeStartY, final int swipeAmountY) {
-        onView(withId(containerId)).perform(swipeDown(swipeX, swipeStartY, swipeAmountY));
-    }
-
-    @CallSuper
-    protected void configureContent(@LayoutRes final int layoutResId,
-            @StringRes final int titleResId) throws Throwable {
-        onView(withId(R.id.coordinator_stub)).perform(inflateViewStub(layoutResId));
-
-        mAppBar = (AppBarLayout) mCoordinatorLayout.findViewById(R.id.app_bar);
-        mCollapsingToolbar =
-                (CollapsingToolbarLayout) mAppBar.findViewById(R.id.collapsing_app_bar);
-        mToolbar = (Toolbar) mAppBar.findViewById(R.id.toolbar);
-
-        final AppCompatActivity activity = mActivityTestRule.getActivity();
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                activity.setSupportActionBar(mToolbar);
-            }
-        });
-
-        final CharSequence activityTitle = activity.getString(titleResId);
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                activity.setTitle(activityTitle);
-            }
-        });
-
-        if (mCollapsingToolbar != null) {
-            onView(withId(R.id.collapsing_app_bar))
-                    .perform(setTitle(activityTitle))
-                    .perform(setContentScrimColor(Color.MAGENTA));
-        }
-
-        TextView dialog = (TextView) mCoordinatorLayout.findViewById(R.id.textview_dialogue);
-        if (dialog != null) {
-            onView(withId(R.id.textview_dialogue))
-                    .perform(setText(TextUtils.concat(Shakespeare.DIALOGUE)));
-        }
-
-        mDefaultElevationValue = mAppBar.getResources()
-                .getDimension(R.dimen.design_appbar_elevation);
-    }
-
-    protected void assertAppBarElevation(float expectedValue) {
-        if (Build.VERSION.SDK_INT >= 21) {
-            assertEquals(expectedValue, ViewCompat.getElevation(mAppBar), 0.05f);
-        }
-    }
-
-    protected void assertScrimAlpha(@IntRange(from = 0, to = 255) int alpha) {
-        SystemClock.sleep(300);
-        onView(withId(R.id.collapsing_app_bar))
-                .check(matches(withScrimAlpha(alpha)));
-    }
-
-    static Matcher withScrimAlpha(final int alpha) {
-        return new TypeSafeMatcher<CollapsingToolbarLayout>() {
-            @Override
-            public void describeTo(Description description) {
-                description.appendText(
-                        "CollapsingToolbarLayout has content scrim with alpha: " + alpha);
-            }
-
-            @Override
-            protected boolean matchesSafely(CollapsingToolbarLayout view) {
-                return alpha == view.getScrimAlpha();
-            }
-        };
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/AppBarLayoutCollapsePinTestActivity.java b/design/tests/src/android/support/design/widget/AppBarLayoutCollapsePinTestActivity.java
deleted file mode 100644
index d7ea68f..0000000
--- a/design/tests/src/android/support/design/widget/AppBarLayoutCollapsePinTestActivity.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-import android.support.v7.widget.Toolbar;
-
-public class AppBarLayoutCollapsePinTestActivity extends BaseTestActivity {
-
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.design_appbar_toolbar_collapse_pin_restore_test;
-    }
-
-    @Override
-    protected void onContentViewSet() {
-        Toolbar toolbar = findViewById(R.id.toolbar);
-        setSupportActionBar(toolbar);
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/AppBarWithAnchoredFabMarginsTest.java b/design/tests/src/android/support/design/widget/AppBarWithAnchoredFabMarginsTest.java
deleted file mode 100644
index 416eda1..0000000
--- a/design/tests/src/android/support/design/widget/AppBarWithAnchoredFabMarginsTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static org.junit.Assert.assertEquals;
-
-import android.support.design.test.R;
-import android.support.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-
-@SmallTest
-public class AppBarWithAnchoredFabMarginsTest extends AppBarLayoutBaseTest {
-    private int mFabMargin;
-
-    @Before
-    public void setup() {
-        mFabMargin = mActivityTestRule.getActivity().getResources().getDimensionPixelSize(
-                R.dimen.fab_margin);
-    }
-
-    @Test
-    public void testFabBottomMargin() throws Throwable {
-        configureContent(R.layout.design_appbar_anchored_fab_margin_bottom,
-                R.string.design_appbar_anchored_fab_margin_bottom);
-
-        final FloatingActionButton fab =
-                (FloatingActionButton) mCoordinatorLayout.findViewById(R.id.fab);
-        final CoordinatorLayout.LayoutParams fabLp =
-                (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
-        assertEquals(mAppBar.getId(), fabLp.getAnchorId());
-
-        final int[] appbarOnScreenXY = new int[2];
-        final int[] fabOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        fab.getLocationOnScreen(fabOnScreenXY);
-
-        // FAB is horizontally centered in the coordinate system of its anchor (app bar).
-        assertEquals(appbarOnScreenXY[0] + mAppBar.getWidth() / 2,
-                fabOnScreenXY[0] + fab.getWidth() / 2, 1);
-        // Bottom margin is in the coordinate space of the parent (CoordinatorLayout) and not
-        // the anchor. Since our FAB is far enough from the bottom edge of CoordinatorLayout,
-        // we are expecting the vertical center of the FAB to be aligned with the bottom edge
-        // of its anchor (app bar).
-        assertEquals(appbarOnScreenXY[1] + mAppBar.getHeight(),
-                fabOnScreenXY[1] + fab.getHeight() / 2, 1);
-    }
-
-    @Test
-    public void testFabTopMargin() throws Throwable {
-        configureContent(R.layout.design_appbar_anchored_fab_margin_top,
-                R.string.design_appbar_anchored_fab_margin_top);
-
-        final FloatingActionButton fab =
-                (FloatingActionButton) mCoordinatorLayout.findViewById(R.id.fab);
-        final CoordinatorLayout.LayoutParams fabLp =
-                (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
-        assertEquals(mAppBar.getId(), fabLp.getAnchorId());
-
-        final int[] appbarOnScreenXY = new int[2];
-        final int[] fabOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        fab.getLocationOnScreen(fabOnScreenXY);
-
-        // FAB is horizontally centered in the coordinate system of its anchor (app bar).
-        assertEquals(appbarOnScreenXY[0] + mAppBar.getWidth() / 2,
-                fabOnScreenXY[0] + fab.getWidth() / 2, 1);
-        // Top margin is in the coordinate space of the parent (CoordinatorLayout) and not
-        // the anchor. Since our FAB is far enough from the bottom edge of CoordinatorLayout,
-        // we are expecting the vertical center of the FAB to be aligned with the bottom edge
-        // of its anchor (app bar).
-        assertEquals(appbarOnScreenXY[1] + mAppBar.getHeight(),
-                fabOnScreenXY[1] + fab.getHeight() / 2, 1);
-    }
-
-    @Test
-    public void testFabLeftMargin() throws Throwable {
-        configureContent(R.layout.design_appbar_anchored_fab_margin_left,
-                R.string.design_appbar_anchored_fab_margin_left);
-
-        final FloatingActionButton fab =
-                (FloatingActionButton) mCoordinatorLayout.findViewById(R.id.fab);
-        final CoordinatorLayout.LayoutParams fabLp =
-                (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
-        assertEquals(mAppBar.getId(), fabLp.getAnchorId());
-
-        final int[] appbarOnScreenXY = new int[2];
-        final int[] fabOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        fab.getLocationOnScreen(fabOnScreenXY);
-
-        // FAB is left-aligned in the coordinate system of its anchor (app bar). In addition,
-        // its left margin "pushes" it away in the coordinate system of the parent
-        // (CoordinatorLayout)
-        assertEquals(appbarOnScreenXY[0] + mFabMargin, fabOnScreenXY[0], 1);
-        // FAB's vertical center should be aligned with the bottom edge of its anchor (app bar).
-        assertEquals(appbarOnScreenXY[1] + mAppBar.getHeight(),
-                fabOnScreenXY[1] + fab.getHeight() / 2, 1);
-    }
-
-    @Test
-    public void testFabRightMargin() throws Throwable {
-        configureContent(R.layout.design_appbar_anchored_fab_margin_right,
-                R.string.design_appbar_anchored_fab_margin_right);
-
-        final FloatingActionButton fab =
-                (FloatingActionButton) mCoordinatorLayout.findViewById(R.id.fab);
-        final CoordinatorLayout.LayoutParams fabLp =
-                (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
-        assertEquals(mAppBar.getId(), fabLp.getAnchorId());
-
-        final int[] appbarOnScreenXY = new int[2];
-        final int[] fabOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        fab.getLocationOnScreen(fabOnScreenXY);
-
-        // FAB is right-aligned in the coordinate system of its anchor (app bar). In addition,
-        // its right margin "pushes" it away in the coordinate system of the parent
-        // (CoordinatorLayout)
-        assertEquals(appbarOnScreenXY[0] + mAppBar.getWidth() - mFabMargin,
-                fabOnScreenXY[0] + fab.getWidth(), 1);
-        // FAB's vertical center should be aligned with the bottom edge of its anchor (app bar).
-        assertEquals(appbarOnScreenXY[1] + mAppBar.getHeight(),
-                fabOnScreenXY[1] + fab.getHeight() / 2, 1);
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/AppBarWithCollapsingToolbarStateRestoreTest.java b/design/tests/src/android/support/design/widget/AppBarWithCollapsingToolbarStateRestoreTest.java
deleted file mode 100644
index e8a29af..0000000
--- a/design/tests/src/android/support/design/widget/AppBarWithCollapsingToolbarStateRestoreTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static android.support.design.testutils.AppBarLayoutMatchers.isCollapsed;
-import static android.support.design.testutils.SwipeUtils.swipeUp;
-import static android.support.design.testutils.TestUtilsMatchers.hasZ;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-
-import android.support.design.test.R;
-import android.support.test.filters.LargeTest;
-import android.support.testutils.AppCompatActivityUtils;
-
-import org.junit.Before;
-import org.junit.Test;
-
-@LargeTest
-public class AppBarWithCollapsingToolbarStateRestoreTest
-        extends BaseInstrumentationTestCase<AppBarLayoutCollapsePinTestActivity> {
-
-    private AppBarLayoutCollapsePinTestActivity mActivity;
-
-    public AppBarWithCollapsingToolbarStateRestoreTest() {
-        super(AppBarLayoutCollapsePinTestActivity.class);
-    }
-
-    @Before
-    public void setup() {
-        mActivity = mActivityTestRule.getActivity();
-    }
-
-    @Test
-    public void testRecreateAndRestore() throws Throwable {
-        final AppBarLayout appBar = (AppBarLayout) mActivity.findViewById(R.id.app_bar);
-
-        // Swipe up and collapse the AppBarLayout
-        onView(withId(R.id.coordinator_layout))
-                .perform(swipeUp(
-                        appBar.getLeft() + (appBar.getWidth() / 2),
-                        appBar.getBottom() + 20,
-                        appBar.getHeight()));
-        onView(withId(R.id.app_bar))
-                .check(matches(hasZ()))
-                .check(matches(isCollapsed()));
-
-        mActivity = AppCompatActivityUtils.recreateActivity(mActivityTestRule, mActivity);
-        AppCompatActivityUtils.waitForExecution(mActivityTestRule);
-
-        // And check that the app bar still is restored correctly
-        onView(withId(R.id.app_bar))
-                .check(matches(hasZ()))
-                .check(matches(isCollapsed()));
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/AppBarWithCollapsingToolbarTest.java b/design/tests/src/android/support/design/widget/AppBarWithCollapsingToolbarTest.java
deleted file mode 100644
index a9fa46a..0000000
--- a/design/tests/src/android/support/design/widget/AppBarWithCollapsingToolbarTest.java
+++ /dev/null
@@ -1,590 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-
-import android.support.design.test.R;
-import android.support.test.filters.LargeTest;
-import android.support.testutils.PollingCheck;
-import android.widget.ImageView;
-
-import org.junit.Test;
-
-@LargeTest
-public class AppBarWithCollapsingToolbarTest extends AppBarLayoutBaseTest {
-
-    @Test
-    public void testPinnedToolbar() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_collapse_pin,
-                R.string.design_appbar_collapsing_toolbar_pin);
-
-        CollapsingToolbarLayout.LayoutParams toolbarLp =
-                (CollapsingToolbarLayout.LayoutParams) mToolbar.getLayoutParams();
-        assertEquals(CollapsingToolbarLayout.LayoutParams.COLLAPSE_MODE_PIN,
-                toolbarLp.getCollapseMode());
-
-        final int[] appbarOnScreenXY = new int[2];
-        final int[] coordinatorLayoutOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        mCoordinatorLayout.getLocationOnScreen(coordinatorLayoutOnScreenXY);
-
-        final int originalAppbarTop = appbarOnScreenXY[1];
-        final int originalAppbarBottom = appbarOnScreenXY[1] + mAppBar.getHeight();
-        final int centerX = appbarOnScreenXY[0] + mAppBar.getWidth() / 2;
-
-        final int toolbarHeight = mToolbar.getHeight();
-        final int appbarHeight = mAppBar.getHeight();
-        final int longSwipeAmount = 3 * appbarHeight / 2;
-        final int reallyLongSwipeAmount = 2 * appbarHeight;
-        final int shortSwipeAmount = toolbarHeight;
-
-        assertAppBarElevation(0f);
-        assertScrimAlpha(0);
-
-        // Perform a swipe-up gesture across the horizontal center of the screen.
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + longSwipeAmount / 2,
-                longSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should be visually snapped below the system status bar.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop + toolbarHeight + mAppBar.getTopInset(),
-                appbarOnScreenXY[1] + appbarHeight, 1);
-
-        // Perform another swipe-up gesture
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                appbarOnScreenXY[1] + appbarHeight + 5,
-                shortSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should still be visually snapped below the system status bar
-        // as it is in the pinned mode. Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop + toolbarHeight + mAppBar.getTopInset(),
-                appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-        assertScrimAlpha(255);
-
-        // Perform a short swipe-down gesture across the horizontal center of the screen.
-        // Note that the swipe down is a bit longer than the swipe up to check that the app bar
-        // is not starting to expand too early.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom - shortSwipeAmount,
-                3 * shortSwipeAmount / 2);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should still be visually snapped below the system status bar
-        // as it is in the pinned mode and we haven't fully swiped down the content below the
-        // app bar. Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop + toolbarHeight + mAppBar.getTopInset(),
-                appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-        assertScrimAlpha(255);
-
-        // Perform another swipe-down gesture across the horizontal center of the screen.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                reallyLongSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should be in its original position.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1], 1);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(0f);
-        assertScrimAlpha(0);
-
-        // Perform yet another swipe-down gesture across the horizontal center of the screen.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                longSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should still be in its original position.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1], 1);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(0f);
-        assertScrimAlpha(0);
-    }
-
-    @Test
-    public void testScrollingToolbar() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_collapse_scroll,
-                R.string.design_appbar_collapsing_toolbar_scroll);
-
-        CollapsingToolbarLayout.LayoutParams toolbarLp =
-                (CollapsingToolbarLayout.LayoutParams) mToolbar.getLayoutParams();
-        assertEquals(CollapsingToolbarLayout.LayoutParams.COLLAPSE_MODE_PIN,
-                toolbarLp.getCollapseMode());
-
-        final int[] appbarOnScreenXY = new int[2];
-        final int[] coordinatorLayoutOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        mCoordinatorLayout.getLocationOnScreen(coordinatorLayoutOnScreenXY);
-
-        final int topInset = mAppBar.getTopInset();
-
-        final int originalAppbarTop = appbarOnScreenXY[1];
-        final int originalAppbarBottom = appbarOnScreenXY[1] + mAppBar.getHeight();
-        final int centerX = appbarOnScreenXY[0] + mAppBar.getWidth() / 2;
-
-        final int toolbarHeight = mToolbar.getHeight();
-        final int appbarHeight = mAppBar.getHeight();
-        final int longSwipeAmount = 3 * appbarHeight / 2;
-        final int reallyLongSwipeAmount = 2 * appbarHeight;
-        final int shortSwipeAmount = toolbarHeight;
-
-        assertAppBarElevation(0f);
-        assertScrimAlpha(0);
-
-        // Perform a swipe-up gesture across the horizontal center of the screen, starting from
-        // just below the AppBarLayout
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + 20,
-                longSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should not be visually "present" on the screen, with its bottom
-        // edge aligned with the bottom of system status bar. If we're running on a device which
-        // supports a translucent status bar, we need to take the status bar height into account.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1] + appbarHeight - topInset, 1);
-        assertAppBarElevation(0f);
-        assertScrimAlpha(255);
-
-        // Perform another swipe-up gesture
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                shortSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should still be off the screen. Allow for off-by-a-pixel
-        // margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1] + appbarHeight - topInset, 1);
-        assertAppBarElevation(0f);
-        assertScrimAlpha(255);
-
-        // Perform a short swipe-down gesture across the horizontal center of the screen.
-        // Note that the swipe down is a bit longer than the swipe up to fully bring down
-        // the scrolled-away toolbar
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                3 * shortSwipeAmount / 2);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should be visually snapped below the system status bar as it
-        // in scrolling mode and we've swiped down, but not fully. Allow for off-by-a-pixel
-        // margin of error.
-        assertEquals(originalAppbarTop + toolbarHeight + topInset,
-                appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-        assertScrimAlpha(255);
-
-        // Perform another swipe-down gesture across the horizontal center of the screen.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                reallyLongSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should be in its original position.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1]);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight);
-        assertAppBarElevation(0f);
-        assertScrimAlpha(0);
-
-        // Perform yet another swipe-down gesture across the horizontal center of the screen.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                longSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should still be in its original position.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1], 1);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(0f);
-        assertScrimAlpha(0);
-    }
-
-    @Test
-    public void testScrollingToolbarEnterAlways() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_collapse_scroll_enteralways,
-                R.string.design_appbar_collapsing_toolbar_scroll);
-
-        final int[] appbarOnScreenXY = new int[2];
-        final int[] coordinatorLayoutOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        mCoordinatorLayout.getLocationOnScreen(coordinatorLayoutOnScreenXY);
-
-        final int topInset = mAppBar.getTopInset();
-
-        final int originalAppbarTop = appbarOnScreenXY[1];
-        final int originalAppbarBottom = appbarOnScreenXY[1] + mAppBar.getHeight();
-        final int centerX = appbarOnScreenXY[0] + mAppBar.getWidth() / 2;
-
-        final int toolbarHeight = mToolbar.getHeight();
-        final int appbarHeight = mAppBar.getHeight();
-        final int longSwipeAmount = 3 * appbarHeight / 2;
-        final int reallyLongSwipeAmount = 2 * appbarHeight;
-        final int shortSwipeAmount = toolbarHeight;
-
-        assertAppBarElevation(mDefaultElevationValue);
-        assertScrimAlpha(0);
-
-        // Perform a swipe-up gesture across the horizontal center of the screen, starting from
-        // just below the AppBarLayout
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + 20,
-                longSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should not be visually "present" on the screen, with its bottom
-        // edge aligned with the bottom of system status bar. If we're running on a device which
-        // supports a translucent status bar, we need to take the status bar height into account.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1] + appbarHeight - topInset, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-        assertScrimAlpha(255);
-
-        // Perform another swipe-up gesture
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                shortSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should still be off the screen. Allow for off-by-a-pixel
-        // margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1] + appbarHeight - topInset, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-        assertScrimAlpha(255);
-
-        // Perform a short swipe-down gesture across the horizontal center of the screen.
-        // Note that the swipe down is a bit longer than the swipe up to fully bring down
-        // the scrolled-away toolbar
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                3 * shortSwipeAmount / 2);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-
-        // At this point the app bar should be visually below the system status bar as it
-        // in scrolling mode and we've swiped down, not fully but more than collapsed
-        assertThat(appbarOnScreenXY[1] + appbarHeight,
-                is(greaterThan(originalAppbarTop + toolbarHeight + topInset)));
-        assertAppBarElevation(mDefaultElevationValue);
-        assertScrimAlpha(255);
-
-        // Perform another swipe-down gesture across the horizontal center of the screen.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                reallyLongSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should be in its original position.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1]);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight);
-        assertAppBarElevation(mDefaultElevationValue);
-        assertScrimAlpha(0);
-
-        // Perform yet another swipe-down gesture across the horizontal center of the screen.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                longSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should still be in its original position.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1], 1);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-        assertScrimAlpha(0);
-    }
-
-    @Test
-    public void testPinnedToolbarAndAnchoredFab() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_collapse_pin_with_fab,
-                R.string.design_appbar_collapsing_toolbar_pin_fab);
-
-        CollapsingToolbarLayout.LayoutParams toolbarLp =
-                (CollapsingToolbarLayout.LayoutParams) mToolbar.getLayoutParams();
-        assertEquals(CollapsingToolbarLayout.LayoutParams.COLLAPSE_MODE_PIN,
-                toolbarLp.getCollapseMode());
-
-        final FloatingActionButton fab =
-                (FloatingActionButton) mCoordinatorLayout.findViewById(R.id.fab);
-
-        final int[] appbarOnScreenXY = new int[2];
-        final int[] coordinatorLayoutOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        mCoordinatorLayout.getLocationOnScreen(coordinatorLayoutOnScreenXY);
-
-        final int originalAppbarBottom = appbarOnScreenXY[1] + mAppBar.getHeight();
-        final int centerX = appbarOnScreenXY[0] + mAppBar.getWidth() / 2;
-
-        final int appbarHeight = mAppBar.getHeight();
-        final int longSwipeAmount = 3 * appbarHeight / 2;
-
-        // Perform a swipe-up gesture across the horizontal center of the screen.
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + longSwipeAmount / 2,
-                longSwipeAmount);
-
-        // Since we the visibility change listener path is only exposed via direct calls to
-        // FloatingActionButton.show and not the internal path that FAB's behavior is using,
-        // this test needs to be tied to the internal implementation details of running animation
-        // that scales the FAB to 0/0 scales and interpolates its alpha to 0. Since that animation
-        // starts running partway through our swipe gesture and may complete a bit later then
-        // the swipe gesture, poll to catch the "final" state of the FAB.
-        PollingCheck.waitFor(new PollingCheck.PollingCheckCondition() {
-            @Override
-            public boolean canProceed() {
-                return fab.getScaleX() == 0.0f;
-            }
-        });
-
-        // At this point the FAB should be scaled to 0/0 and set at alpha 0. Since the relevant
-        // getter methods are only available on v11+, wrap the asserts with build version check.
-        assertEquals(0.0f, fab.getScaleX(), 0.0f);
-        assertEquals(0.0f, fab.getScaleY(), 0.0f);
-        assertEquals(0.0f, fab.getAlpha(), 0.0f);
-
-        // Perform a swipe-down gesture across the horizontal center of the screen.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                longSwipeAmount);
-
-        // Same as for swipe-up gesture.
-        PollingCheck.waitFor(new PollingCheck.PollingCheckCondition() {
-            @Override
-            public boolean canProceed() {
-                return fab.getScaleX() == 1.0f;
-            }
-        });
-
-        // At this point the FAB should be scaled back to its original size and be at full opacity.
-        assertEquals(1.0f, fab.getScaleX(), 0.0f);
-        assertEquals(1.0f, fab.getScaleY(), 0.0f);
-        assertEquals(1.0f, fab.getAlpha(), 0.0f);
-    }
-
-    @Test
-    public void testPinnedToolbarAndParallaxImage() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_collapse_with_image,
-                R.string.design_appbar_collapsing_toolbar_with_image);
-
-        final ImageView parallaxImageView =
-                (ImageView) mCoordinatorLayout.findViewById(R.id.app_bar_image);
-
-        // We have not set any padding on the ImageView, so ensure that none is set via
-        // window insets handling
-        assertEquals(0, parallaxImageView.getPaddingLeft());
-        assertEquals(0, parallaxImageView.getPaddingTop());
-        assertEquals(0, parallaxImageView.getPaddingRight());
-        assertEquals(0, parallaxImageView.getPaddingBottom());
-
-        CollapsingToolbarLayout.LayoutParams parallaxImageViewLp =
-                (CollapsingToolbarLayout.LayoutParams) parallaxImageView.getLayoutParams();
-        assertEquals(CollapsingToolbarLayout.LayoutParams.COLLAPSE_MODE_PARALLAX,
-                parallaxImageViewLp.getCollapseMode());
-
-        final float parallaxMultiplier = parallaxImageViewLp.getParallaxMultiplier();
-
-        final int[] appbarOnScreenXY = new int[2];
-        final int[] parallaxImageOnScreenXY = new int[2];
-        final int appbarHeight = mAppBar.getHeight();
-        final int toolbarHeight = mToolbar.getHeight();
-        final int parallaxImageHeight = parallaxImageView.getHeight();
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        parallaxImageView.getLocationOnScreen(parallaxImageOnScreenXY);
-
-        final int originalAppbarTop = appbarOnScreenXY[1];
-        final int originalAppbarBottom = appbarOnScreenXY[1] + mAppBar.getHeight();
-        final int originalParallaxImageTop = parallaxImageOnScreenXY[1];
-        final int centerX = appbarOnScreenXY[0] + mAppBar.getWidth() / 2;
-
-        // Test that at the beginning our image is top-aligned with the app bar
-        assertEquals(appbarOnScreenXY[1], parallaxImageOnScreenXY[1]);
-
-        // Swipe up by the toolbar's height
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                toolbarHeight);
-
-        // Test that the top edge of the image (in the screen coordinates) has "moved" by half
-        // the amount that the top edge of the app bar (in the screen coordinates) has.
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        parallaxImageView.getLocationOnScreen(parallaxImageOnScreenXY);
-        assertEquals(parallaxMultiplier * (appbarOnScreenXY[1] - originalAppbarTop),
-                parallaxImageOnScreenXY[1] - originalParallaxImageTop, 1);
-
-        // Swipe up by another toolbar's height
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                toolbarHeight);
-
-        // Test that the top edge of the image (in the screen coordinates) has "moved" by half
-        // the amount that the top edge of the app bar (in the screen coordinates) has.
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        parallaxImageView.getLocationOnScreen(parallaxImageOnScreenXY);
-        assertEquals(parallaxMultiplier * (appbarOnScreenXY[1] - originalAppbarTop),
-                parallaxImageOnScreenXY[1] - originalParallaxImageTop, 1);
-
-        // Swipe down by a different value (150% of the toolbar's height) to test parallax going the
-        // other way
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                3 * toolbarHeight / 2);
-
-        // Test that the top edge of the image (in the screen coordinates) has "moved" by half
-        // the amount that the top edge of the app bar (in the screen coordinates) has.
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        parallaxImageView.getLocationOnScreen(parallaxImageOnScreenXY);
-        assertEquals(parallaxMultiplier * (appbarOnScreenXY[1] - originalAppbarTop),
-                parallaxImageOnScreenXY[1] - originalParallaxImageTop, 1);
-    }
-
-    @Test
-    public void testAddViewWithDefaultLayoutParams() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_collapse_pin,
-                R.string.design_appbar_collapsing_toolbar_pin);
-
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                ImageView view = new ImageView(mCollapsingToolbar.getContext());
-                mCollapsingToolbar.addView(view);
-            }
-        });
-
-    }
-
-    @Test
-    public void testPinnedToolbarWithMargins() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_collapse_pin_margins,
-                R.string.design_appbar_collapsing_toolbar_pin_margins);
-
-        CollapsingToolbarLayout.LayoutParams toolbarLp =
-                (CollapsingToolbarLayout.LayoutParams) mToolbar.getLayoutParams();
-        assertEquals(CollapsingToolbarLayout.LayoutParams.COLLAPSE_MODE_PIN,
-                toolbarLp.getCollapseMode());
-
-        final int[] appbarOnScreenXY = new int[2];
-        final int[] toolbarOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        mToolbar.getLocationOnScreen(toolbarOnScreenXY);
-
-        final int originalAppbarTop = appbarOnScreenXY[1];
-        final int originalAppbarBottom = originalAppbarTop + mAppBar.getHeight();
-        final int centerX = appbarOnScreenXY[0] + mAppBar.getWidth() / 2;
-
-        final int toolbarHeight = mToolbar.getHeight();
-        final int toolbarVerticalMargins = toolbarLp.topMargin + toolbarLp.bottomMargin;
-        final int appbarHeight = mAppBar.getHeight();
-
-        // Perform a swipe-up gesture across the horizontal center of the screen.
-        int swipeAmount = appbarHeight - toolbarHeight - toolbarVerticalMargins;
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + (3 * swipeAmount / 2),
-                swipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        mToolbar.getLocationOnScreen(toolbarOnScreenXY);
-        // At this point the toolbar should be visually pinned to the bottom of the appbar layout,
-        // observing it's margins and top inset
-        // The toolbar should still be visually pinned to the bottom of the appbar layout
-        assertEquals(originalAppbarTop + mAppBar.getTopInset(),
-                toolbarOnScreenXY[1] - toolbarLp.topMargin, 1);
-
-        // Swipe up again, this time just 50% of the margin size
-        swipeAmount = toolbarVerticalMargins / 2;
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + (3 * swipeAmount / 2),
-                swipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        mToolbar.getLocationOnScreen(toolbarOnScreenXY);
-
-        // The toolbar should still be visually pinned to the bottom of the appbar layout
-        assertEquals(appbarOnScreenXY[1] + appbarHeight,
-                toolbarOnScreenXY[1] + toolbarHeight + toolbarLp.bottomMargin, 1);
-    }
-
-    @Test
-    public void testSingleToolbarWithInset() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_collapse_sole_toolbar,
-                R.string.design_appbar_collapsing_toolbar_pin_margins);
-
-        final int[] appbarOnScreenXY = new int[2];
-        final int[] toolbarOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        mToolbar.getLocationOnScreen(toolbarOnScreenXY);
-
-        assertEquals(appbarOnScreenXY[1] + mAppBar.getTopInset(), toolbarOnScreenXY[1], 1);
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/AppBarWithDodgingTest.java b/design/tests/src/android/support/design/widget/AppBarWithDodgingTest.java
deleted file mode 100644
index ad337d5..0000000
--- a/design/tests/src/android/support/design/widget/AppBarWithDodgingTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static org.junit.Assert.assertTrue;
-
-import android.graphics.Rect;
-import android.support.design.test.R;
-import android.support.test.filters.SmallTest;
-
-import org.junit.Test;
-
-@SmallTest
-public class AppBarWithDodgingTest extends AppBarLayoutBaseTest {
-    @Test
-    public void testLeftDodge() throws Throwable {
-        configureContent(R.layout.design_appbar_dodge_left,
-                R.string.design_appbar_dodge_left);
-
-        final FloatingActionButton fab = mCoordinatorLayout.findViewById(R.id.fab);
-        final FloatingActionButton fab2 = mCoordinatorLayout.findViewById(R.id.fab2);
-
-        final int[] fabOnScreenXY = new int[2];
-        final int[] fab2OnScreenXY = new int[2];
-        fab.getLocationOnScreen(fabOnScreenXY);
-        fab2.getLocationOnScreen(fab2OnScreenXY);
-
-        final Rect fabRect = new Rect();
-        final Rect fab2Rect = new Rect();
-        fab.getContentRect(fabRect);
-        fab2.getContentRect(fab2Rect);
-
-        // Our second FAB is configured to "dodge" the first one - to be displayed to the
-        // right of it
-        int firstRight = fabOnScreenXY[0] + fabRect.right;
-        int secondLeft = fab2OnScreenXY[0] + fab2Rect.left;
-        assertTrue("Second button left edge at " + secondLeft
-                        + " should be dodging the first button right edge at " + firstRight,
-                secondLeft >= firstRight);
-    }
-
-    @Test
-    public void testRightDodge() throws Throwable {
-        configureContent(R.layout.design_appbar_dodge_right,
-                R.string.design_appbar_dodge_right);
-
-        final FloatingActionButton fab = mCoordinatorLayout.findViewById(R.id.fab);
-        final FloatingActionButton fab2 = mCoordinatorLayout.findViewById(R.id.fab2);
-
-        final int[] fabOnScreenXY = new int[2];
-        final int[] fab2OnScreenXY = new int[2];
-        fab.getLocationOnScreen(fabOnScreenXY);
-        fab2.getLocationOnScreen(fab2OnScreenXY);
-
-        final Rect fabRect = new Rect();
-        final Rect fab2Rect = new Rect();
-        fab.getContentRect(fabRect);
-        fab2.getContentRect(fab2Rect);
-
-        // Our second FAB is configured to "dodge" the first one - to be displayed to the
-        // left of it
-        int firstLeft = fabOnScreenXY[0] + fabRect.left;
-        int secondRight = fab2OnScreenXY[0] + fab2Rect.right;
-        assertTrue("Second button right edge at " + secondRight
-                        + " should be dodging the first button left edge at " + firstLeft,
-                secondRight <= firstLeft);
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/AppBarWithScrollbarsActivity.java b/design/tests/src/android/support/design/widget/AppBarWithScrollbarsActivity.java
deleted file mode 100644
index bd693d4..0000000
--- a/design/tests/src/android/support/design/widget/AppBarWithScrollbarsActivity.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-
-public class AppBarWithScrollbarsActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.design_appbar_with_scrollbars;
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/AppBarWithScrollbarsTest.java b/design/tests/src/android/support/design/widget/AppBarWithScrollbarsTest.java
deleted file mode 100644
index f6fe8bf..0000000
--- a/design/tests/src/android/support/design/widget/AppBarWithScrollbarsTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.test.filters.SmallTest;
-
-import org.junit.Test;
-
-public class AppBarWithScrollbarsTest extends
-        BaseInstrumentationTestCase<AppBarWithScrollbarsActivity> {
-
-    public AppBarWithScrollbarsTest() {
-        super(AppBarWithScrollbarsActivity.class);
-    }
-
-    @Test
-    @SmallTest
-    public void testInflationNoCrash() {
-        // This is the implicit test for to check that AppBarLayout inflation doesn't crash
-        // when its theme has attributes that would cause onCreateDrawableState to be called
-        // during the super's constructor flow.
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/AppBarWithToolbarAndTabsTest.java b/design/tests/src/android/support/design/widget/AppBarWithToolbarAndTabsTest.java
deleted file mode 100644
index 23ef7c5..0000000
--- a/design/tests/src/android/support/design/widget/AppBarWithToolbarAndTabsTest.java
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static android.support.design.testutils.TestUtilsActions.addTabs;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-
-import static org.junit.Assert.assertEquals;
-
-import android.os.SystemClock;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.StringRes;
-import android.support.design.test.R;
-import android.support.design.testutils.Cheeses;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.Suppress;
-
-import org.junit.Test;
-
-@LargeTest
-public class AppBarWithToolbarAndTabsTest extends AppBarLayoutBaseTest {
-    private TabLayout mTabLayout;
-
-    @Override
-    protected void configureContent(@LayoutRes int layoutResId, @StringRes int titleResId)
-            throws Throwable {
-        super.configureContent(layoutResId, titleResId);
-
-        mTabLayout = (TabLayout) mAppBar.findViewById(R.id.tabs);
-        String[] tabTitles = new String[5];
-        System.arraycopy(Cheeses.sCheeseStrings, 0, tabTitles, 0, 5);
-        onView(withId(R.id.tabs)).perform(addTabs(tabTitles));
-    }
-
-    @Test
-    public void testScrollingToolbarAndScrollingTabs() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_scroll_tabs_scroll,
-                R.string.design_appbar_toolbar_scroll_tabs_scroll);
-
-        final int[] appbarOnScreenXY = new int[2];
-        final int[] coordinatorLayoutOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        mCoordinatorLayout.getLocationOnScreen(coordinatorLayoutOnScreenXY);
-
-        final int originalAppbarTop = appbarOnScreenXY[1];
-        final int originalAppbarBottom = appbarOnScreenXY[1] + mAppBar.getHeight();
-        final int centerX = appbarOnScreenXY[0] + mAppBar.getWidth() / 2;
-
-        final int toolbarHeight = mToolbar.getHeight();
-        final int tabsHeight = mTabLayout.getHeight();
-        final int appbarHeight = mAppBar.getHeight();
-        final int longSwipeAmount = 3 * appbarHeight / 2;
-        final int shortSwipeAmount = toolbarHeight;
-
-        // Perform a swipe-up gesture across the horizontal center of the screen, starting from
-        // just below the AppBarLayout
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + 20,
-                longSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should not be visually "present" on the screen, with its bottom
-        // edge aligned with the system status bar. Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform another swipe-up gesture
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                shortSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should still be off the screen. Allow for off-by-a-pixel
-        // margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform a long swipe-down gesture across the horizontal center of the screen.
-        // Note that the swipe down is a bit longer than the swipe up to fully bring down
-        // the scrolled-away toolbar and tab layout
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                longSwipeAmount * 3 / 2);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should be visually snapped below the system status bar as it
-        // in scrolling mode and we've swiped down. Allow for off-by-a-pixel
-        // margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1], 1);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform another swipe-down gesture across the horizontal center of the screen.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                longSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should be in its original position.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1], 1);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform yet another swipe-down gesture across the horizontal center of the screen.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                longSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should still be in its original position.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1], 1);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-    }
-
-    @Test
-    public void testScrollingToolbarAndPinnedTabs() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_scroll_tabs_pinned,
-                R.string.design_appbar_toolbar_scroll_tabs_pin);
-
-        final int[] appbarOnScreenXY = new int[2];
-        final int[] coordinatorLayoutOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        mCoordinatorLayout.getLocationOnScreen(coordinatorLayoutOnScreenXY);
-
-        final int originalAppbarTop = appbarOnScreenXY[1];
-        final int originalAppbarBottom = appbarOnScreenXY[1] + mAppBar.getHeight();
-        final int centerX = appbarOnScreenXY[0] + mAppBar.getWidth() / 2;
-
-        final int toolbarHeight = mToolbar.getHeight();
-        final int tabsHeight = mTabLayout.getHeight();
-        final int appbarHeight = mAppBar.getHeight();
-        final int longSwipeAmount = 3 * appbarHeight / 2;
-        final int shortSwipeAmount = toolbarHeight;
-
-        // Perform a swipe-up gesture across the horizontal center of the screen, starting from
-        // just below the AppBarLayout
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + 20,
-                longSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the tab bar should be visually snapped below the system status bar.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop + tabsHeight, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform another swipe-up gesture
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                shortSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the tab bar should still be visually snapped below the system status bar
-        // as it is in the pinned mode. Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop + tabsHeight, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform a short swipe-down gesture across the horizontal center of the screen.
-        // Note that the swipe down is a bit longer than the swipe up to fully bring down
-        // the scrolled-away toolbar and tab layout
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom - shortSwipeAmount,
-                3 * shortSwipeAmount / 2);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should be in its original position as it
-        // in scrolling mode and we've swiped down. Allow for off-by-a-pixel
-        // margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1], 1);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform another swipe-down gesture across the horizontal center of the screen.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                longSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should be in its original position.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1], 1);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform yet another swipe-down gesture across the horizontal center of the screen.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                longSwipeAmount);
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should still be in its original position.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1], 1);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-    }
-
-    @Suppress
-    @FlakyTest(bugId = 30701044)
-    @LargeTest
-    @Test
-    public void testSnappingToolbarAndSnappingTabs() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_scroll_tabs_scroll_snap,
-                R.string.design_appbar_toolbar_scroll_tabs_scroll_snap);
-
-        final int[] appbarOnScreenXY = new int[2];
-        final int[] coordinatorLayoutOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        mCoordinatorLayout.getLocationOnScreen(coordinatorLayoutOnScreenXY);
-
-        final int originalAppbarTop = appbarOnScreenXY[1];
-        final int originalAppbarBottom = appbarOnScreenXY[1] + mAppBar.getHeight();
-        final int centerX = appbarOnScreenXY[0] + mAppBar.getWidth() / 2;
-
-        final int toolbarHeight = mToolbar.getHeight();
-        final int tabsHeight = mTabLayout.getHeight();
-        final int appbarHeight = mAppBar.getHeight();
-
-        // Since AppBarLayout doesn't expose a way to track snap animations, the three possible
-        // options are
-        // a) track how vertical offsets and invalidation is propagated through the
-        // view hierarchy and wait until there are no more events of that kind
-        // b) run a dummy Espresso action that waits until the main thread is idle
-        // c) sleep for a hardcoded period of time to "wait" until the snap animation is done
-        // In this test method we go with option b)
-
-        // Perform a swipe-up gesture across the horizontal center of the screen. The amount
-        // of swipe is 25% of the toolbar height and we expect the snap behavior to "move"
-        // the app bar back to its original position.
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + toolbarHeight,
-                toolbarHeight / 4);
-
-        // Wait for the snap animation to be done
-        waitForSnapAnimationToFinish();
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should be in its original position as it
-        // in snapping mode and we haven't swiped "enough". Allow for off-by-a-pixel
-        // margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1], 1);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform a slightly longer swipe-up gesture, this time by 75% of the toolbar height.
-        // We expect the snap behavior to move the app bar to snap the tab layout below the
-        // system status bar.
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + toolbarHeight,
-                3 * toolbarHeight / 4);
-
-        // Wait for the snap animation to be done
-        waitForSnapAnimationToFinish();
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should "snap" the toolbar away and align the tab layout below
-        // the system status bar. Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop + tabsHeight, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform a short swipe-up gesture, this time by 25% of the tab layout height. We expect
-        // snap behavior to move the app bar back to snap the tab layout below the system status
-        // bar.
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + toolbarHeight,
-                tabsHeight / 4);
-
-        // Wait for the snap animation to be done
-        waitForSnapAnimationToFinish();
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should "snap" back to align the tab layout below
-        // the system status bar. Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop + tabsHeight, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform a longer swipe-up gesture, this time by 75% of the tab layout height. We expect
-        // snap behavior to move the app bar fully away from the screen.
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + toolbarHeight,
-                3 * tabsHeight / 4);
-
-        // Wait for the snap animation to be done
-        waitForSnapAnimationToFinish();
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should not be visually "present" on the screen, with its bottom
-        // edge aligned with the system status bar. Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform a short swipe-down gesture by 25% of the tab layout height. We expect
-        // snap behavior to move the app bar back fully away from the screen.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + toolbarHeight,
-                tabsHeight / 4);
-
-        // Wait for the snap animation to be done
-        waitForSnapAnimationToFinish();
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should still not be visually "present" on the screen, with
-        // its bottom edge aligned with the system status bar. Allow for off-by-a-pixel margin
-        // of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform a longer swipe-up gesture, this time by 75% of the tab layout height. We expect
-        // snap behavior to move the app bar to snap the tab layout below the system status
-        // bar.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + toolbarHeight,
-                3 * tabsHeight / 4);
-
-        // Wait for the snap animation to be done
-        waitForSnapAnimationToFinish();
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should "snap" the toolbar away and align the tab layout below
-        // the system status bar. Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop + tabsHeight, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform a short swipe-down gesture by 25% of the toolbar height. We expect
-        // snap behavior to align the tab layout below the system status bar
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + toolbarHeight,
-                toolbarHeight / 4);
-
-        // Wait for the snap animation to be done
-        waitForSnapAnimationToFinish();
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should still align the tab layout below
-        // the system status bar. Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop + tabsHeight, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-
-        // Perform a longer swipe-up gesture, this time by 75% of the toolbar height. We expect
-        // snap behavior to move the app bar back to its original place (fully visible).
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + toolbarHeight,
-                3 * tabsHeight / 4);
-
-        // Wait for the snap animation to be done
-        waitForSnapAnimationToFinish();
-
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        // At this point the app bar should be in its original position.
-        // Allow for off-by-a-pixel margin of error.
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1], 1);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight, 1);
-        assertAppBarElevation(mDefaultElevationValue);
-    }
-
-    private void waitForSnapAnimationToFinish() {
-        final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior)
-                ((CoordinatorLayout.LayoutParams) mAppBar.getLayoutParams()).getBehavior();
-        while (behavior.isOffsetAnimatorRunning()) {
-            SystemClock.sleep(16);
-        }
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/AppBarWithToolbarTest.java b/design/tests/src/android/support/design/widget/AppBarWithToolbarTest.java
deleted file mode 100644
index fd5cd26..0000000
--- a/design/tests/src/android/support/design/widget/AppBarWithToolbarTest.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-
-import static org.junit.Assert.assertEquals;
-
-import android.graphics.Rect;
-import android.support.design.test.R;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.MediumTest;
-import android.support.v4.view.ViewCompat;
-import android.view.View;
-import android.view.ViewGroup;
-
-import org.junit.Test;
-
-@MediumTest
-public class AppBarWithToolbarTest extends AppBarLayoutBaseTest {
-
-    /**
-     * Tests a Toolbar with fitSystemWindows = undefined, with a fitSystemWindows = true parent
-     */
-    @LargeTest
-    @Test
-    public void testScrollToolbarWithFitSystemWindowsParent() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_scroll_fitsystemwindows_parent,
-                R.string.design_appbar_toolbar_scroll_tabs_pin);
-
-        final int[] appbarOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-
-        final int originalAppbarTop = appbarOnScreenXY[1];
-        final int originalAppbarBottom = appbarOnScreenXY[1] + mAppBar.getHeight();
-        final int centerX = appbarOnScreenXY[0] + mAppBar.getWidth() / 2;
-
-        final int appbarHeight = mAppBar.getHeight();
-        final int longSwipeAmount = 3 * appbarHeight / 2;
-
-        // Perform a swipe-up gesture across the horizontal center of the screen.
-        performVerticalSwipeUpGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom + 3 * longSwipeAmount / 2,
-                longSwipeAmount);
-
-        // At this point the tab bar should be visually snapped below the system status bar.
-        // Allow for off-by-a-pixel margin of error.
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1] + appbarHeight, 1);
-
-        // Perform yet another swipe-down gesture across the horizontal center of the screen.
-        performVerticalSwipeDownGesture(
-                R.id.coordinator_layout,
-                centerX,
-                originalAppbarBottom,
-                longSwipeAmount);
-
-        // At this point the app bar should still be in its original position.
-        // Allow for off-by-a-pixel margin of error.
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-        assertEquals(originalAppbarTop, appbarOnScreenXY[1], 1);
-        assertEquals(originalAppbarBottom, appbarOnScreenXY[1] + appbarHeight, 1);
-    }
-
-    /**
-     * Tests a AppBarLayout + scrolling content with fitSystemWindows = undefined,
-     * with a fitSystemWindows = true parent
-     */
-    @Test
-    public void testScrollingContentPositionWithFitSystemWindowsParent() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_scroll_fitsystemwindows_parent,
-                R.string.design_appbar_toolbar_scroll_tabs_pin);
-
-        final int[] appbarOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-
-        final View scrollingContent = mCoordinatorLayout.findViewById(R.id.scrolling_content);
-        final int[] scrollingContentOnScreenXY = new int[2];
-        scrollingContent.getLocationOnScreen(scrollingContentOnScreenXY);
-
-        // Assert that they have the same left
-        assertEquals(appbarOnScreenXY[0], scrollingContentOnScreenXY[0]);
-        // ...and the same width
-        assertEquals(mAppBar.getWidth(), scrollingContent.getWidth());
-        // ...and are vertically stacked
-        assertEquals(mAppBar.getBottom(), scrollingContent.getTop());
-    }
-
-    /**
-     * Tests a AppBarLayout + scrolling content with fitSystemWindows = undefined,
-     * with a fitSystemWindows = true parent, in RTL
-     */
-    @Test
-    public void testScrollingContentPositionWithFitSystemWindowsParentInRtl() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_scroll_fitsystemwindows_parent,
-                R.string.design_appbar_toolbar_scroll_tabs_pin);
-
-        // Force RTL
-        onView(withId(R.id.app_bar)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
-
-        final int[] appbarOnScreenXY = new int[2];
-        mAppBar.getLocationOnScreen(appbarOnScreenXY);
-
-        final View scrollingContent = mCoordinatorLayout.findViewById(R.id.scrolling_content);
-        final int[] scrollingContentOnScreenXY = new int[2];
-        scrollingContent.getLocationOnScreen(scrollingContentOnScreenXY);
-
-        // Assert that they have the same left
-        assertEquals(appbarOnScreenXY[0], scrollingContentOnScreenXY[0]);
-        // ...and the same width
-        assertEquals(mAppBar.getWidth(), scrollingContent.getWidth());
-        // ...and are vertically stacked
-        assertEquals(mAppBar.getBottom(), scrollingContent.getTop());
-    }
-
-    @Test
-    public void testRequestRectangleWithChildThatDoesNotRequireScroll() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_scroll_fitsystemwindows_parent,
-                R.string.design_appbar_toolbar_scroll_tabs_pin);
-
-        final View scrollingContent = mCoordinatorLayout.findViewById(R.id.scrolling_content);
-
-        // Get the initial XY
-        final int[] originalScrollingXY = new int[2];
-        scrollingContent.getLocationInWindow(originalScrollingXY);
-
-        // Now request that the first child has its full rectangle displayed
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                final ViewGroup scrollingContentInner = (ViewGroup) scrollingContent
-                        .findViewById(R.id.scrolling_content_inner);
-                View child = scrollingContentInner.getChildAt(0);
-                Rect rect = new Rect(0, 0, child.getWidth(), child.getHeight());
-                child.requestRectangleOnScreen(rect, true);
-            }
-        });
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
-        final int[] newScrollingXY = new int[2];
-        scrollingContent.getLocationInWindow(newScrollingXY);
-
-        // Assert that the scrolling view has not moved
-        assertEquals(originalScrollingXY[0], newScrollingXY[0]);
-        assertEquals(originalScrollingXY[1], newScrollingXY[1]);
-    }
-
-    @Test
-    public void testRequestRectangleWithChildThatDoesRequireScroll() throws Throwable {
-        configureContent(R.layout.design_appbar_toolbar_scroll_fitsystemwindows_parent,
-                R.string.design_appbar_toolbar_scroll_tabs_pin);
-
-        final View scrollingContent = mCoordinatorLayout.findViewById(R.id.scrolling_content);
-
-        // Get the initial XY
-        final int[] originalScrollingXY = new int[2];
-        scrollingContent.getLocationInWindow(originalScrollingXY);
-
-        // Now request that the first child has its full rectangle displayed
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                final ViewGroup scrollingContentInner = (ViewGroup) scrollingContent
-                        .findViewById(R.id.scrolling_content_inner);
-                View child = scrollingContentInner
-                        .getChildAt(scrollingContentInner.getChildCount() - 1);
-                Rect rect = new Rect(0, 0, child.getWidth(), child.getHeight());
-                child.requestRectangleOnScreen(rect, true);
-            }
-        });
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
-        final int[] newScrollingXY = new int[2];
-        scrollingContent.getLocationInWindow(newScrollingXY);
-
-        // Assert that the appbar has collapsed vertically
-        assertEquals(originalScrollingXY[0], newScrollingXY[0]);
-        assertEquals(originalScrollingXY[1] - mAppBar.getHeight(), newScrollingXY[1]);
-    }
-
-}
diff --git a/design/tests/src/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java b/design/tests/src/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java
deleted file mode 100755
index 32cef17..0000000
--- a/design/tests/src/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
-
-import static org.hamcrest.CoreMatchers.allOf;
-import static org.hamcrest.Matchers.any;
-
-import android.support.annotation.LayoutRes;
-import android.support.design.test.R;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.espresso.UiController;
-import android.support.test.espresso.ViewAction;
-import android.support.v4.view.ViewCompat;
-import android.view.View;
-import android.view.ViewStub;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-import org.junit.After;
-
-/**
- * Base class for tests that are exercising various aspects of {@link CoordinatorLayout}.
- */
-public abstract class BaseDynamicCoordinatorLayoutTest
-        extends BaseInstrumentationTestCase<DynamicCoordinatorLayoutActivity> {
-    protected CoordinatorLayout mCoordinatorLayout;
-
-    public BaseDynamicCoordinatorLayoutTest() {
-        super(DynamicCoordinatorLayoutActivity.class);
-    }
-
-    @UiThreadTest
-    @After
-    public void tearDown() {
-        // Now that the test is done, replace the activity content view with ViewStub so
-        // that it's ready to be replaced for the next test.
-        final DynamicCoordinatorLayoutActivity activity = mActivityTestRule.getActivity();
-        activity.setContentView(R.layout.dynamic_coordinator_layout);
-        mCoordinatorLayout = null;
-    }
-
-    /**
-     * Matches views that have parents.
-     */
-    private Matcher<View> hasParent() {
-        return new TypeSafeMatcher<View>() {
-            @Override
-            public void describeTo(Description description) {
-                description.appendText("has parent");
-            }
-
-            @Override
-            public boolean matchesSafely(View view) {
-                return view.getParent() != null;
-            }
-        };
-    }
-
-    /**
-     * Inflates the <code>ViewStub</code> with the passed layout resource.
-     */
-    protected ViewAction inflateViewStub(final @LayoutRes int layoutResId) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return allOf(isAssignableFrom(ViewStub.class), hasParent());
-            }
-
-            @Override
-            public String getDescription() {
-                return "Inflates view stub";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                ViewStub viewStub = (ViewStub) view;
-                viewStub.setLayoutResource(layoutResId);
-                viewStub.inflate();
-
-                mCoordinatorLayout = (CoordinatorLayout) mActivityTestRule.getActivity()
-                        .findViewById(viewStub.getInflatedId());
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    protected ViewAction setLayoutDirection(final int layoutDir) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return any(View.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Sets layout direction";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                ViewCompat.setLayoutDirection(view, layoutDir);
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/BaseInstrumentationTestCase.java b/design/tests/src/android/support/design/widget/BaseInstrumentationTestCase.java
deleted file mode 100644
index e06fa0a..0000000
--- a/design/tests/src/android/support/design/widget/BaseInstrumentationTestCase.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.app.Activity;
-import android.support.test.rule.BootlegActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.Rule;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public abstract class BaseInstrumentationTestCase<A extends Activity> {
-    @Rule
-    public final BootlegActivityTestRule<A> mActivityTestRule;
-
-    protected BaseInstrumentationTestCase(Class<A> activityClass) {
-        mActivityTestRule = new BootlegActivityTestRule<>(activityClass);
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/BaseTestActivity.java b/design/tests/src/android/support/design/widget/BaseTestActivity.java
deleted file mode 100755
index e1e44e2..0000000
--- a/design/tests/src/android/support/design/widget/BaseTestActivity.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.os.Bundle;
-import android.support.annotation.LayoutRes;
-import android.support.testutils.RecreatedAppCompatActivity;
-import android.view.WindowManager;
-
-abstract class BaseTestActivity extends RecreatedAppCompatActivity {
-
-    private boolean mDestroyed;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        overridePendingTransition(0, 0);
-
-        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-        final int contentView = getContentViewLayoutResId();
-        if (contentView > 0) {
-            setContentView(contentView);
-        }
-        onContentViewSet();
-        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-    }
-
-    @Override
-    public void finish() {
-        super.finish();
-        overridePendingTransition(0, 0);
-    }
-
-    @LayoutRes
-    protected abstract int getContentViewLayoutResId();
-
-    protected void onContentViewSet() {}
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        mDestroyed = true;
-    }
-
-    @Override
-    public boolean isDestroyed() {
-        return mDestroyed;
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/BottomNavigationViewActivity.java b/design/tests/src/android/support/design/widget/BottomNavigationViewActivity.java
deleted file mode 100644
index 2afe695..0000000
--- a/design/tests/src/android/support/design/widget/BottomNavigationViewActivity.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-
-public class BottomNavigationViewActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.design_bottom_navigation_view;
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/BottomNavigationViewTest.java b/design/tests/src/android/support/design/widget/BottomNavigationViewTest.java
deleted file mode 100644
index 3365fac..0000000
--- a/design/tests/src/android/support/design/widget/BottomNavigationViewTest.java
+++ /dev/null
@@ -1,465 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static android.support.design.testutils.BottomNavigationViewActions.setIconForMenuItem;
-import static android.support.design.testutils.BottomNavigationViewActions.setItemIconTintList;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-
-import static org.hamcrest.core.AllOf.allOf;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-import android.app.Activity;
-import android.content.res.Resources;
-import android.os.Build;
-import android.os.Parcelable;
-import android.support.annotation.ColorInt;
-import android.support.design.test.R;
-import android.support.design.testutils.TestDrawable;
-import android.support.design.testutils.TestUtilsMatchers;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.SdkSuppress;
-import android.support.test.filters.SmallTest;
-import android.support.v4.content.res.ResourcesCompat;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.PointerIcon;
-import android.view.View;
-import android.view.ViewGroup;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class BottomNavigationViewTest
-        extends BaseInstrumentationTestCase<BottomNavigationViewActivity> {
-    private static final int[] MENU_CONTENT_ITEM_IDS = { R.id.destination_home,
-            R.id.destination_profile, R.id.destination_people };
-    private Map<Integer, String> mMenuStringContent;
-
-    private BottomNavigationView mBottomNavigation;
-
-    public BottomNavigationViewTest() {
-        super(BottomNavigationViewActivity.class);
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        final BottomNavigationViewActivity activity = mActivityTestRule.getActivity();
-        mBottomNavigation = (BottomNavigationView) activity.findViewById(R.id.bottom_navigation);
-
-        final Resources res = activity.getResources();
-        mMenuStringContent = new HashMap<>(MENU_CONTENT_ITEM_IDS.length);
-        mMenuStringContent.put(R.id.destination_home, res.getString(R.string.navigate_home));
-        mMenuStringContent.put(R.id.destination_profile, res.getString(R.string.navigate_profile));
-        mMenuStringContent.put(R.id.destination_people, res.getString(R.string.navigate_people));
-    }
-
-    @UiThreadTest
-    @Test
-    @SmallTest
-    public void testAddItemsWithoutMenuInflation() {
-        BottomNavigationView navigation = new BottomNavigationView(mActivityTestRule.getActivity());
-        mActivityTestRule.getActivity().setContentView(navigation);
-        navigation.getMenu().add("Item1");
-        navigation.getMenu().add("Item2");
-        assertEquals(2, navigation.getMenu().size());
-        navigation.getMenu().removeItem(0);
-        navigation.getMenu().removeItem(0);
-        assertEquals(0, navigation.getMenu().size());
-    }
-
-    @Test
-    @SmallTest
-    public void testBasics() {
-        // Check the contents of the Menu object
-        final Menu menu = mBottomNavigation.getMenu();
-        assertNotNull("Menu should not be null", menu);
-        assertEquals("Should have matching number of items", MENU_CONTENT_ITEM_IDS.length,
-                menu.size());
-        for (int i = 0; i < MENU_CONTENT_ITEM_IDS.length; i++) {
-            final MenuItem currItem = menu.getItem(i);
-            assertEquals("ID for Item #" + i, MENU_CONTENT_ITEM_IDS[i], currItem.getItemId());
-        }
-
-    }
-
-    @Test
-    @LargeTest
-    public void testNavigationSelectionListener() {
-        BottomNavigationView.OnNavigationItemSelectedListener mockedListener =
-                mock(BottomNavigationView.OnNavigationItemSelectedListener.class);
-        mBottomNavigation.setOnNavigationItemSelectedListener(mockedListener);
-
-        // Make the listener return true to allow selecting the item.
-        when(mockedListener.onNavigationItemSelected(any(MenuItem.class))).thenReturn(true);
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_profile)),
-                isDescendantOfA(withId(R.id.bottom_navigation)), isDisplayed())).perform(click());
-        // Verify our listener has been notified of the click
-        verify(mockedListener, times(1)).onNavigationItemSelected(
-                mBottomNavigation.getMenu().findItem(R.id.destination_profile));
-        // Verify the item is now selected
-        assertTrue(mBottomNavigation.getMenu().findItem(R.id.destination_profile).isChecked());
-
-        // Select the same item again
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_profile)),
-                isDescendantOfA(withId(R.id.bottom_navigation)), isDisplayed())).perform(click());
-        // Verify our listener has been notified of the click
-        verify(mockedListener, times(2)).onNavigationItemSelected(
-                mBottomNavigation.getMenu().findItem(R.id.destination_profile));
-        // Verify the item is still selected
-        assertTrue(mBottomNavigation.getMenu().findItem(R.id.destination_profile).isChecked());
-
-        // Make the listener return false to disallow selecting the item.
-        when(mockedListener.onNavigationItemSelected(any(MenuItem.class))).thenReturn(false);
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_people)),
-                isDescendantOfA(withId(R.id.bottom_navigation)), isDisplayed())).perform(click());
-        // Verify our listener has been notified of the click
-        verify(mockedListener, times(1)).onNavigationItemSelected(
-                mBottomNavigation.getMenu().findItem(R.id.destination_people));
-        // Verify the previous item is still selected
-        assertFalse(mBottomNavigation.getMenu().findItem(R.id.destination_people).isChecked());
-        assertTrue(mBottomNavigation.getMenu().findItem(R.id.destination_profile).isChecked());
-
-        // Set null listener to test that the next click is not going to notify the
-        // previously set listener and will allow selecting items.
-        mBottomNavigation.setOnNavigationItemSelectedListener(null);
-
-        // Click one of our items
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_home)),
-                isDescendantOfA(withId(R.id.bottom_navigation)), isDisplayed())).perform(click());
-        // Verify that our previous listener has not been notified of the click
-        verifyNoMoreInteractions(mockedListener);
-        // Verify the correct item is now selected.
-        assertTrue(mBottomNavigation.getMenu().findItem(R.id.destination_home).isChecked());
-    }
-
-    @UiThreadTest
-    @Test
-    @SmallTest
-    public void testSetSelectedItemId() {
-        BottomNavigationView.OnNavigationItemSelectedListener mockedListener =
-                mock(BottomNavigationView.OnNavigationItemSelectedListener.class);
-        mBottomNavigation.setOnNavigationItemSelectedListener(mockedListener);
-
-        // Make the listener return true to allow selecting the item.
-        when(mockedListener.onNavigationItemSelected(any(MenuItem.class))).thenReturn(true);
-        // Programmatically select an item
-        mBottomNavigation.setSelectedItemId(R.id.destination_profile);
-        // Verify our listener has been notified of the click
-        verify(mockedListener, times(1)).onNavigationItemSelected(
-                mBottomNavigation.getMenu().findItem(R.id.destination_profile));
-        // Verify the item is now selected
-        assertTrue(mBottomNavigation.getMenu().findItem(R.id.destination_profile).isChecked());
-
-        // Select the same item
-        mBottomNavigation.setSelectedItemId(R.id.destination_profile);
-        // Verify our listener has been notified of the click
-        verify(mockedListener, times(2)).onNavigationItemSelected(
-                mBottomNavigation.getMenu().findItem(R.id.destination_profile));
-        // Verify the item is still selected
-        assertTrue(mBottomNavigation.getMenu().findItem(R.id.destination_profile).isChecked());
-
-        // Make the listener return false to disallow selecting the item.
-        when(mockedListener.onNavigationItemSelected(any(MenuItem.class))).thenReturn(false);
-        // Programmatically select an item
-        mBottomNavigation.setSelectedItemId(R.id.destination_people);
-        // Verify our listener has been notified of the click
-        verify(mockedListener, times(1)).onNavigationItemSelected(
-                mBottomNavigation.getMenu().findItem(R.id.destination_people));
-        // Verify the previous item is still selected
-        assertFalse(mBottomNavigation.getMenu().findItem(R.id.destination_people).isChecked());
-        assertTrue(mBottomNavigation.getMenu().findItem(R.id.destination_profile).isChecked());
-
-        // Set null listener to test that the next click is not going to notify the
-        // previously set listener and will allow selecting items.
-        mBottomNavigation.setOnNavigationItemSelectedListener(null);
-
-        // Select one of our items
-        mBottomNavigation.setSelectedItemId(R.id.destination_home);
-        // Verify that our previous listener has not been notified of the click
-        verifyNoMoreInteractions(mockedListener);
-        // Verify the correct item is now selected.
-        assertTrue(mBottomNavigation.getMenu().findItem(R.id.destination_home).isChecked());
-    }
-
-    @Test
-    @SmallTest
-    public void testNavigationReselectionListener() {
-        // Add an OnNavigationItemReselectedListener
-        BottomNavigationView.OnNavigationItemReselectedListener reselectedListener =
-                mock(BottomNavigationView.OnNavigationItemReselectedListener.class);
-        mBottomNavigation.setOnNavigationItemReselectedListener(reselectedListener);
-
-        // Select an item
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_profile)),
-                isDescendantOfA(withId(R.id.bottom_navigation)), isDisplayed())).perform(click());
-        // Verify the item is now selected
-        assertTrue(mBottomNavigation.getMenu().findItem(R.id.destination_profile).isChecked());
-        // Verify the listener was not called
-        verify(reselectedListener, never()).onNavigationItemReselected(any(MenuItem.class));
-
-        // Select the same item again
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_profile)),
-                isDescendantOfA(withId(R.id.bottom_navigation)), isDisplayed())).perform(click());
-        // Verify the item is still selected
-        assertTrue(mBottomNavigation.getMenu().findItem(R.id.destination_profile).isChecked());
-        // Verify the listener was called
-        verify(reselectedListener, times(1)).onNavigationItemReselected(
-                mBottomNavigation.getMenu().findItem(R.id.destination_profile));
-
-        // Add an OnNavigationItemSelectedListener
-        BottomNavigationView.OnNavigationItemSelectedListener selectedListener =
-                mock(BottomNavigationView.OnNavigationItemSelectedListener.class);
-        mBottomNavigation.setOnNavigationItemSelectedListener(selectedListener);
-        // Make the listener return true to allow selecting the item.
-        when(selectedListener.onNavigationItemSelected(any(MenuItem.class))).thenReturn(true);
-
-        // Select another item
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_people)),
-                isDescendantOfA(withId(R.id.bottom_navigation)), isDisplayed())).perform(click());
-        // Verify the item is now selected
-        assertTrue(mBottomNavigation.getMenu().findItem(R.id.destination_people).isChecked());
-        // Verify the correct listeners were called
-        verify(selectedListener, times(1)).onNavigationItemSelected(
-                mBottomNavigation.getMenu().findItem(R.id.destination_people));
-        verify(reselectedListener, never()).onNavigationItemReselected(
-                mBottomNavigation.getMenu().findItem(R.id.destination_people));
-
-        // Select the same item again
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_people)),
-                isDescendantOfA(withId(R.id.bottom_navigation)), isDisplayed())).perform(click());
-        // Verify the item is still selected
-        assertTrue(mBottomNavigation.getMenu().findItem(R.id.destination_people).isChecked());
-        // Verify the correct listeners were called
-        verifyNoMoreInteractions(selectedListener);
-        verify(reselectedListener, times(1)).onNavigationItemReselected(
-                mBottomNavigation.getMenu().findItem(R.id.destination_people));
-
-        // Remove the OnNavigationItemReselectedListener
-        mBottomNavigation.setOnNavigationItemReselectedListener(null);
-
-        // Select the same item again
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_people)),
-                isDescendantOfA(withId(R.id.bottom_navigation)), isDisplayed())).perform(click());
-        // Verify the item is still selected
-        assertTrue(mBottomNavigation.getMenu().findItem(R.id.destination_people).isChecked());
-        // Verify the reselectedListener was not called
-        verifyNoMoreInteractions(reselectedListener);
-    }
-
-    @UiThreadTest
-    @Test
-    @SmallTest
-    public void testSelectedItemIdWithEmptyMenu() {
-        // First item initially selected
-        assertEquals(R.id.destination_home, mBottomNavigation.getSelectedItemId());
-
-        // Remove all the items
-        for (int id : mMenuStringContent.keySet()) {
-            mBottomNavigation.getMenu().removeItem(id);
-        }
-        // Verify selected ID is zero
-        assertEquals(0, mBottomNavigation.getSelectedItemId());
-
-        // Add an item
-        mBottomNavigation.getMenu().add(0, R.id.destination_home, 0, R.string.navigate_home);
-        // Verify item is selected
-        assertEquals(R.id.destination_home, mBottomNavigation.getSelectedItemId());
-
-        // Try selecting an invalid ID
-        mBottomNavigation.setSelectedItemId(R.id.destination_people);
-        // Verify the view has not changed
-        assertEquals(R.id.destination_home, mBottomNavigation.getSelectedItemId());
-    }
-
-    @Test
-    @SmallTest
-    public void testIconTinting() {
-        final Resources res = mActivityTestRule.getActivity().getResources();
-        @ColorInt final int redFill = ResourcesCompat.getColor(res, R.color.test_red, null);
-        @ColorInt final int greenFill = ResourcesCompat.getColor(res, R.color.test_green, null);
-        @ColorInt final int blueFill = ResourcesCompat.getColor(res, R.color.test_blue, null);
-        final int iconSize = res.getDimensionPixelSize(R.dimen.drawable_small_size);
-        onView(withId(R.id.bottom_navigation)).perform(setIconForMenuItem(R.id.destination_home,
-                new TestDrawable(redFill, iconSize, iconSize)));
-        onView(withId(R.id.bottom_navigation)).perform(setIconForMenuItem(R.id.destination_profile,
-                new TestDrawable(greenFill, iconSize, iconSize)));
-        onView(withId(R.id.bottom_navigation)).perform(setIconForMenuItem(R.id.destination_people,
-                new TestDrawable(blueFill, iconSize, iconSize)));
-
-        @ColorInt final int defaultTintColor = ResourcesCompat.getColor(res,
-                R.color.emerald_translucent, null);
-
-        // We're allowing a margin of error in checking the color of the items' icons.
-        // This is due to the translucent color being used in the icon tinting
-        // and off-by-one discrepancies of SRC_IN when it's compositing
-        // translucent color. Note that all the checks below are written for the current
-        // logic on BottomNavigationView that uses the default SRC_IN tint mode - effectively
-        // replacing all non-transparent pixels in the destination (original icon) with
-        // our translucent tint color.
-        final int allowedComponentVariance = 1;
-
-        // Note that here we're tying ourselves to the implementation details of the internal
-        // structure of the BottomNavigationView. Specifically, we're checking the drawable the
-        // ImageView with id R.id.icon. If the internal implementation of BottomNavigationView
-        // changes, the second Matcher in the lookups below will need to be tweaked.
-        onView(allOf(withId(R.id.icon), isDescendantOfA(withId(R.id.destination_home)))).check(
-                matches(TestUtilsMatchers.drawable(defaultTintColor, allowedComponentVariance)));
-        onView(allOf(withId(R.id.icon), isDescendantOfA(withId(R.id.destination_profile)))).check(
-                matches(TestUtilsMatchers.drawable(defaultTintColor, allowedComponentVariance)));
-        onView(allOf(withId(R.id.icon), isDescendantOfA(withId(R.id.destination_people)))).check(
-                matches(TestUtilsMatchers.drawable(defaultTintColor, allowedComponentVariance)));
-
-        @ColorInt final int newTintColor = ResourcesCompat.getColor(res,
-                R.color.red_translucent, null);
-        onView(withId(R.id.bottom_navigation)).perform(setItemIconTintList(
-                ResourcesCompat.getColorStateList(res, R.color.color_state_list_red_translucent,
-                        null)));
-        // Check that all menu items with icons now have icons tinted with the newly set color
-        onView(allOf(withId(R.id.icon), isDescendantOfA(withId(R.id.destination_home)))).check(
-                matches(TestUtilsMatchers.drawable(newTintColor, allowedComponentVariance)));
-        onView(allOf(withId(R.id.icon), isDescendantOfA(withId(R.id.destination_profile)))).check(
-                matches(TestUtilsMatchers.drawable(newTintColor, allowedComponentVariance)));
-        onView(allOf(withId(R.id.icon), isDescendantOfA(withId(R.id.destination_people)))).check(
-                matches(TestUtilsMatchers.drawable(newTintColor, allowedComponentVariance)));
-
-        // And now remove all icon tinting
-        onView(withId(R.id.bottom_navigation)).perform(setItemIconTintList(null));
-        // And verify that all menu items with icons now have the original colors for their icons.
-        // Note that since there is no tinting at this point, we don't allow any color variance
-        // in these checks.
-        onView(allOf(withId(R.id.icon), isDescendantOfA(withId(R.id.destination_home)))).check(
-                matches(TestUtilsMatchers.drawable(redFill, allowedComponentVariance)));
-        onView(allOf(withId(R.id.icon), isDescendantOfA(withId(R.id.destination_profile)))).check(
-                matches(TestUtilsMatchers.drawable(greenFill, allowedComponentVariance)));
-        onView(allOf(withId(R.id.icon), isDescendantOfA(withId(R.id.destination_people)))).check(
-                matches(TestUtilsMatchers.drawable(blueFill, allowedComponentVariance)));
-    }
-
-    @UiThreadTest
-    @Test
-    @SmallTest
-    public void testItemChecking() throws Throwable {
-        final Menu menu = mBottomNavigation.getMenu();
-        assertTrue(menu.getItem(0).isChecked());
-        checkAndVerifyExclusiveItem(menu, R.id.destination_home);
-        checkAndVerifyExclusiveItem(menu, R.id.destination_profile);
-        checkAndVerifyExclusiveItem(menu, R.id.destination_people);
-    }
-
-    @UiThreadTest
-    @Test
-    @SmallTest
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
-    public void testPointerIcon() throws Throwable {
-        final Activity activity = mActivityTestRule.getActivity();
-        final PointerIcon expectedIcon = PointerIcon.getSystemIcon(activity, PointerIcon.TYPE_HAND);
-        final MotionEvent event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_HOVER_MOVE, 0, 0, 0);
-        final Menu menu = mBottomNavigation.getMenu();
-        for (int i = 0; i < menu.size(); i++) {
-            final MenuItem item = menu.getItem(i);
-            assertTrue(item.isEnabled());
-            final View itemView = activity.findViewById(item.getItemId());
-            assertEquals(expectedIcon, itemView.onResolvePointerIcon(event, 0));
-            item.setEnabled(false);
-            assertEquals(null, itemView.onResolvePointerIcon(event, 0));
-            item.setEnabled(true);
-            assertEquals(expectedIcon, itemView.onResolvePointerIcon(event, 0));
-        }
-    }
-
-    @UiThreadTest
-    @Test
-    @SmallTest
-    public void testClearingMenu() throws Throwable {
-        mBottomNavigation.getMenu().clear();
-        assertEquals(0, mBottomNavigation.getMenu().size());
-        mBottomNavigation.inflateMenu(R.menu.bottom_navigation_view_content);
-        assertEquals(3, mBottomNavigation.getMenu().size());
-    }
-
-    @Test
-    @SmallTest
-    public void testSavedState() throws Throwable {
-        // Select an item other than the first
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_profile)),
-                isDescendantOfA(withId(R.id.bottom_navigation)), isDisplayed())).perform(click());
-        assertTrue(mBottomNavigation.getMenu().findItem(R.id.destination_profile).isChecked());
-        // Save the state
-        final Parcelable state = mBottomNavigation.onSaveInstanceState();
-
-        // Restore the state into a fresh BottomNavigationView
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                BottomNavigationView testView =
-                        new BottomNavigationView(mActivityTestRule.getActivity());
-                testView.inflateMenu(R.menu.bottom_navigation_view_content);
-                testView.onRestoreInstanceState(state);
-                assertTrue(testView.getMenu().findItem(R.id.destination_profile).isChecked());
-            }
-        });
-    }
-
-    @UiThreadTest
-    @Test
-    @SmallTest
-    public void testContentDescription() {
-        ViewGroup menuView = (ViewGroup) mBottomNavigation.getChildAt(0);
-        final int count = menuView.getChildCount();
-        for (int i = 0; i < count; i++) {
-            View child = menuView.getChildAt(i);
-            // We're using the same strings for content description
-            assertEquals(mMenuStringContent.get(child.getId()),
-                    child.getContentDescription().toString());
-        }
-
-        menuView.getChildAt(0).getContentDescription();
-    }
-
-    private void checkAndVerifyExclusiveItem(final Menu menu, final int id) throws Throwable {
-        menu.findItem(id).setChecked(true);
-        for (int i = 0; i < menu.size(); i++) {
-            final MenuItem item = menu.getItem(i);
-            if (item.getItemId() == id) {
-                assertTrue(item.isChecked());
-            } else {
-                assertFalse(item.isChecked());
-            }
-        }
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/BottomSheetBehaviorActivity.java b/design/tests/src/android/support/design/widget/BottomSheetBehaviorActivity.java
deleted file mode 100644
index 6ab6287..0000000
--- a/design/tests/src/android/support/design/widget/BottomSheetBehaviorActivity.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.content.Intent;
-import android.support.design.test.R;
-import android.widget.LinearLayout;
-
-
-public class BottomSheetBehaviorActivity extends BaseTestActivity {
-
-    public static String EXTRA_INITIAL_STATE = "initial_state";
-
-    CoordinatorLayout mCoordinatorLayout;
-
-    LinearLayout mBottomSheet;
-
-    BottomSheetBehavior mBehavior;
-
-    FloatingActionButton mFab;
-
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.test_design_bottom_sheet_behavior;
-    }
-
-    @Override
-    protected void onContentViewSet() {
-        mCoordinatorLayout = findViewById(R.id.coordinator);
-        mBottomSheet = findViewById(R.id.bottom_sheet);
-        mBehavior = BottomSheetBehavior.from(mBottomSheet);
-        mFab = findViewById(R.id.fab);
-        Intent intent = getIntent();
-        if (intent != null) {
-            int initialState = intent.getIntExtra(EXTRA_INITIAL_STATE, -1);
-            if (initialState != -1) {
-                //noinspection ResourceType
-                mBehavior.setState(initialState);
-            }
-        }
-    }
-
-}
diff --git a/design/tests/src/android/support/design/widget/BottomSheetBehaviorInitialStateTest.java b/design/tests/src/android/support/design/widget/BottomSheetBehaviorInitialStateTest.java
deleted file mode 100644
index a59aa87..0000000
--- a/design/tests/src/android/support/design/widget/BottomSheetBehaviorInitialStateTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.core.Is.is;
-
-import android.content.Context;
-import android.content.Intent;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class BottomSheetBehaviorInitialStateTest {
-
-    @Rule
-    public final ActivityTestRule<BottomSheetBehaviorActivity> mActivityTestRule
-            = new ActivityTestRule<>(BottomSheetBehaviorActivity.class, true, false);
-
-    @Test
-    public void testSetStateExpanded() {
-        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-        Intent intent = new Intent(context, BottomSheetBehaviorActivity.class);
-        intent.putExtra(BottomSheetBehaviorActivity.EXTRA_INITIAL_STATE,
-                BottomSheetBehavior.STATE_EXPANDED);
-        mActivityTestRule.launchActivity(intent);
-        BottomSheetBehaviorActivity activity = mActivityTestRule.getActivity();
-        assertThat(activity.mBehavior.getState(), is(BottomSheetBehavior.STATE_EXPANDED));
-        assertThat(activity.mBottomSheet.getTop(), is(0));
-    }
-
-
-    @Test
-    public void testSetStateHidden() {
-        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-        Intent intent = new Intent(context, BottomSheetBehaviorActivity.class);
-        intent.putExtra(BottomSheetBehaviorActivity.EXTRA_INITIAL_STATE,
-                BottomSheetBehavior.STATE_HIDDEN);
-        mActivityTestRule.launchActivity(intent);
-        BottomSheetBehaviorActivity activity = mActivityTestRule.getActivity();
-        assertThat(activity.mBehavior.getState(), is(BottomSheetBehavior.STATE_HIDDEN));
-        assertThat(activity.mBottomSheet.getTop(), is(activity.mCoordinatorLayout.getHeight()));
-    }
-
-}
diff --git a/design/tests/src/android/support/design/widget/BottomSheetBehaviorTest.java b/design/tests/src/android/support/design/widget/BottomSheetBehaviorTest.java
deleted file mode 100644
index 4a27d0c..0000000
--- a/design/tests/src/android/support/design/widget/BottomSheetBehaviorTest.java
+++ /dev/null
@@ -1,806 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.greaterThanOrEqualTo;
-import static org.hamcrest.Matchers.lessThanOrEqualTo;
-import static org.junit.Assert.fail;
-
-import android.content.Context;
-import android.os.SystemClock;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.design.test.R;
-import android.support.test.espresso.Espresso;
-import android.support.test.espresso.IdlingResource;
-import android.support.test.espresso.NoMatchingViewException;
-import android.support.test.espresso.UiController;
-import android.support.test.espresso.ViewAction;
-import android.support.test.espresso.ViewAssertion;
-import android.support.test.espresso.action.CoordinatesProvider;
-import android.support.test.espresso.action.GeneralLocation;
-import android.support.test.espresso.action.GeneralSwipeAction;
-import android.support.test.espresso.action.MotionEvents;
-import android.support.test.espresso.action.PrecisionDescriber;
-import android.support.test.espresso.action.Press;
-import android.support.test.espresso.action.Swipe;
-import android.support.test.espresso.action.ViewActions;
-import android.support.test.espresso.assertion.ViewAssertions;
-import android.support.test.espresso.matcher.ViewMatchers;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.widget.NestedScrollView;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-
-import org.hamcrest.Matcher;
-import org.hamcrest.Matchers;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class BottomSheetBehaviorTest extends
-        BaseInstrumentationTestCase<BottomSheetBehaviorActivity> {
-
-    public static class Callback extends BottomSheetBehavior.BottomSheetCallback
-            implements IdlingResource {
-
-        private boolean mIsIdle;
-
-        private IdlingResource.ResourceCallback mResourceCallback;
-
-        public Callback(BottomSheetBehavior behavior) {
-            behavior.setBottomSheetCallback(this);
-            int state = behavior.getState();
-            mIsIdle = isIdleState(state);
-        }
-
-        @Override
-        public void onStateChanged(@NonNull View bottomSheet,
-                @BottomSheetBehavior.State int newState) {
-            boolean wasIdle = mIsIdle;
-            mIsIdle = isIdleState(newState);
-            if (!wasIdle && mIsIdle && mResourceCallback != null) {
-                mResourceCallback.onTransitionToIdle();
-            }
-        }
-
-        @Override
-        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
-            assertThat(slideOffset, is(greaterThanOrEqualTo(-1f)));
-            assertThat(slideOffset, is(lessThanOrEqualTo(1f)));
-        }
-
-        @Override
-        public String getName() {
-            return Callback.class.getSimpleName();
-        }
-
-        @Override
-        public boolean isIdleNow() {
-            return mIsIdle;
-        }
-
-        @Override
-        public void registerIdleTransitionCallback(IdlingResource.ResourceCallback callback) {
-            mResourceCallback = callback;
-        }
-
-        private boolean isIdleState(int state) {
-            return state != BottomSheetBehavior.STATE_DRAGGING &&
-                    state != BottomSheetBehavior.STATE_SETTLING;
-        }
-
-    }
-
-    /**
-     * Wait for a FAB to change its visibility (either shown or hidden).
-     */
-    private static class OnVisibilityChangedListener extends
-            FloatingActionButton.OnVisibilityChangedListener implements IdlingResource {
-
-        private final boolean mShown;
-        private boolean mIsIdle;
-        private ResourceCallback mResourceCallback;
-
-        OnVisibilityChangedListener(boolean shown) {
-            mShown = shown;
-        }
-
-        private void transitionToIdle() {
-            if (!mIsIdle) {
-                mIsIdle = true;
-                if (mResourceCallback != null) {
-                    mResourceCallback.onTransitionToIdle();
-                }
-            }
-        }
-
-        @Override
-        public void onShown(FloatingActionButton fab) {
-            if (mShown) {
-                transitionToIdle();
-            }
-        }
-
-        @Override
-        public void onHidden(FloatingActionButton fab) {
-            if (!mShown) {
-                transitionToIdle();
-            }
-        }
-
-        @Override
-        public String getName() {
-            return OnVisibilityChangedListener.class.getSimpleName();
-        }
-
-        @Override
-        public boolean isIdleNow() {
-            return mIsIdle;
-        }
-
-        @Override
-        public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
-            mResourceCallback = resourceCallback;
-        }
-    }
-
-    /**
-     * This is like {@link GeneralSwipeAction}, but it does not send ACTION_UP at the end.
-     */
-    private static class DragAction implements ViewAction {
-
-        private static final int STEPS = 10;
-        private static final int DURATION = 100;
-
-        private final CoordinatesProvider mStart;
-        private final CoordinatesProvider mEnd;
-        private final PrecisionDescriber mPrecisionDescriber;
-
-        public DragAction(CoordinatesProvider start, CoordinatesProvider end,
-                PrecisionDescriber precisionDescriber) {
-            mStart = start;
-            mEnd = end;
-            mPrecisionDescriber = precisionDescriber;
-        }
-
-        @Override
-        public Matcher<View> getConstraints() {
-            return Matchers.any(View.class);
-        }
-
-        @Override
-        public String getDescription() {
-            return "drag";
-        }
-
-        @Override
-        public void perform(UiController uiController, View view) {
-            float[] precision = mPrecisionDescriber.describePrecision();
-            float[] start = mStart.calculateCoordinates(view);
-            float[] end = mEnd.calculateCoordinates(view);
-            float[][] steps = interpolate(start, end, STEPS);
-            int delayBetweenMovements = DURATION / steps.length;
-            // Down
-            MotionEvent downEvent = MotionEvents.sendDown(uiController, start, precision).down;
-            try {
-                for (int i = 0; i < steps.length; i++) {
-                    // Wait
-                    long desiredTime = downEvent.getDownTime() + (long)(delayBetweenMovements * i);
-                    long timeUntilDesired = desiredTime - SystemClock.uptimeMillis();
-                    if (timeUntilDesired > 10L) {
-                        uiController.loopMainThreadForAtLeast(timeUntilDesired);
-                    }
-                    // Move
-                    if (!MotionEvents.sendMovement(uiController, downEvent, steps[i])) {
-                        MotionEvents.sendCancel(uiController, downEvent);
-                        throw new RuntimeException("Cannot drag: failed to send a move event.");
-                    }
-                }
-                int duration = ViewConfiguration.getPressedStateDuration();
-                if (duration > 0) {
-                    uiController.loopMainThreadForAtLeast((long) duration);
-                }
-            } finally {
-                downEvent.recycle();
-            }
-        }
-
-        private static float[][] interpolate(float[] start, float[] end, int steps) {
-            Assert.assertTrue(1 < start.length);
-            Assert.assertTrue(1 < end.length);
-            float[][] res = new float[steps][2];
-            for(int i = 1; i < steps + 1; ++i) {
-                res[i - 1][0] = start[0] + (end[0] - start[0]) * (float)i / ((float)steps + 2.0F);
-                res[i - 1][1] = start[1] + (end[1] - start[1]) * (float)i / ((float)steps + 2.0F);
-            }
-            return res;
-        }
-    }
-
-    private static class AddViewAction implements ViewAction {
-
-        private final int mLayout;
-
-        public AddViewAction(@LayoutRes int layout) {
-            mLayout = layout;
-        }
-
-        @Override
-        public Matcher<View> getConstraints() {
-            return ViewMatchers.isAssignableFrom(ViewGroup.class);
-        }
-
-        @Override
-        public String getDescription() {
-            return "add view";
-        }
-
-        @Override
-        public void perform(UiController uiController, View view) {
-            ViewGroup parent = (ViewGroup) view;
-            View child = LayoutInflater.from(view.getContext()).inflate(mLayout, parent, false);
-            parent.addView(child);
-        }
-    }
-
-    private Callback mCallback;
-
-    public BottomSheetBehaviorTest() {
-        super(BottomSheetBehaviorActivity.class);
-    }
-
-    @Test
-    @SmallTest
-    public void testInitialSetup() {
-        BottomSheetBehavior behavior = getBehavior();
-        assertThat(behavior.getState(), is(BottomSheetBehavior.STATE_COLLAPSED));
-        CoordinatorLayout coordinatorLayout = getCoordinatorLayout();
-        ViewGroup bottomSheet = getBottomSheet();
-        assertThat(bottomSheet.getTop(),
-                is(coordinatorLayout.getHeight() - behavior.getPeekHeight()));
-    }
-
-    @Test
-    @MediumTest
-    public void testSetStateExpandedToCollapsed() throws Throwable {
-        checkSetState(BottomSheetBehavior.STATE_EXPANDED, ViewMatchers.isDisplayed());
-        checkSetState(BottomSheetBehavior.STATE_COLLAPSED, ViewMatchers.isDisplayed());
-    }
-
-    @Test
-    @MediumTest
-    public void testSetStateHiddenToCollapsed() throws Throwable {
-        checkSetState(BottomSheetBehavior.STATE_HIDDEN, not(ViewMatchers.isDisplayed()));
-        checkSetState(BottomSheetBehavior.STATE_COLLAPSED, ViewMatchers.isDisplayed());
-    }
-
-    @Test
-    @MediumTest
-    public void testSetStateCollapsedToCollapsed() throws Throwable {
-        checkSetState(BottomSheetBehavior.STATE_COLLAPSED, ViewMatchers.isDisplayed());
-    }
-
-    @Test
-    @LargeTest
-    public void testSwipeDownToCollapse() throws Throwable {
-        checkSetState(BottomSheetBehavior.STATE_EXPANDED, ViewMatchers.isDisplayed());
-        Espresso.onView(ViewMatchers.withId(R.id.bottom_sheet))
-                .perform(DesignViewActions.withCustomConstraints(new GeneralSwipeAction(
-                        Swipe.FAST,
-                        // Manually calculate the starting coordinates to make sure that the touch
-                        // actually falls onto the view on Gingerbread
-                        new CoordinatesProvider() {
-                            @Override
-                            public float[] calculateCoordinates(View view) {
-                                int[] location = new int[2];
-                                view.getLocationInWindow(location);
-                                return new float[]{
-                                        view.getWidth() / 2,
-                                        location[1] + 1
-                                };
-                            }
-                        },
-                        // Manually calculate the ending coordinates to make sure that the bottom
-                        // sheet is collapsed, not hidden
-                        new CoordinatesProvider() {
-                            @Override
-                            public float[] calculateCoordinates(View view) {
-                                BottomSheetBehavior behavior = getBehavior();
-                                return new float[]{
-                                        // x: center of the bottom sheet
-                                        view.getWidth() / 2,
-                                        // y: just above the peek height
-                                        view.getHeight() - behavior.getPeekHeight()};
-                            }
-                        }, Press.FINGER), ViewMatchers.isDisplayingAtLeast(5)));
-        registerIdlingResourceCallback();
-        try {
-            Espresso.onView(ViewMatchers.withId(R.id.bottom_sheet))
-                    .check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
-            assertThat(getBehavior().getState(), is(BottomSheetBehavior.STATE_COLLAPSED));
-        } finally {
-            unregisterIdlingResourceCallback();
-        }
-    }
-
-    @Test
-    @MediumTest
-    public void testSwipeDownToHide() {
-        Espresso.onView(ViewMatchers.withId(R.id.bottom_sheet))
-                .perform(DesignViewActions.withCustomConstraints(ViewActions.swipeDown(),
-                        ViewMatchers.isDisplayingAtLeast(5)));
-        registerIdlingResourceCallback();
-        try {
-            Espresso.onView(ViewMatchers.withId(R.id.bottom_sheet))
-                    .check(ViewAssertions.matches(not(ViewMatchers.isDisplayed())));
-            assertThat(getBehavior().getState(), is(BottomSheetBehavior.STATE_HIDDEN));
-        } finally {
-            unregisterIdlingResourceCallback();
-        }
-    }
-
-    @Test
-    @LargeTest
-    public void testSkipCollapsed() throws Throwable {
-        getBehavior().setSkipCollapsed(true);
-        checkSetState(BottomSheetBehavior.STATE_EXPANDED, ViewMatchers.isDisplayed());
-        Espresso.onView(ViewMatchers.withId(R.id.bottom_sheet))
-                .perform(DesignViewActions.withCustomConstraints(new GeneralSwipeAction(
-                        Swipe.FAST,
-                        // Manually calculate the starting coordinates to make sure that the touch
-                        // actually falls onto the view on Gingerbread
-                        new CoordinatesProvider() {
-                            @Override
-                            public float[] calculateCoordinates(View view) {
-                                int[] location = new int[2];
-                                view.getLocationInWindow(location);
-                                return new float[]{
-                                        view.getWidth() / 2,
-                                        location[1] + 1
-                                };
-                            }
-                        },
-                        // Manually calculate the ending coordinates to make sure that the bottom
-                        // sheet is collapsed, not hidden
-                        new CoordinatesProvider() {
-                            @Override
-                            public float[] calculateCoordinates(View view) {
-                                BottomSheetBehavior behavior = getBehavior();
-                                return new float[]{
-                                        // x: center of the bottom sheet
-                                        view.getWidth() / 2,
-                                        // y: just above the peek height
-                                        view.getHeight() - behavior.getPeekHeight()};
-                            }
-                        }, Press.FINGER), ViewMatchers.isDisplayingAtLeast(5)));
-        registerIdlingResourceCallback();
-        try {
-            Espresso.onView(ViewMatchers.withId(R.id.bottom_sheet))
-                    .check(ViewAssertions.matches(not(ViewMatchers.isDisplayed())));
-            assertThat(getBehavior().getState(), is(BottomSheetBehavior.STATE_HIDDEN));
-        } finally {
-            unregisterIdlingResourceCallback();
-        }
-    }
-
-    @Test
-    @MediumTest
-    public void testSwipeUpToExpand() {
-        Espresso.onView(ViewMatchers.withId(R.id.bottom_sheet))
-                .perform(DesignViewActions.withCustomConstraints(
-                        new GeneralSwipeAction(Swipe.FAST,
-                                GeneralLocation.VISIBLE_CENTER, new CoordinatesProvider() {
-                            @Override
-                            public float[] calculateCoordinates(View view) {
-                                return new float[]{view.getWidth() / 2, 0};
-                            }
-                        }, Press.FINGER),
-                        ViewMatchers.isDisplayingAtLeast(5)));
-        registerIdlingResourceCallback();
-        try {
-            Espresso.onView(ViewMatchers.withId(R.id.bottom_sheet))
-                    .check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
-            assertThat(getBehavior().getState(), is(BottomSheetBehavior.STATE_EXPANDED));
-        } finally {
-            unregisterIdlingResourceCallback();
-        }
-    }
-
-    @Test
-    @MediumTest
-    public void testInvisible() throws Throwable {
-        // Make the bottomsheet invisible
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                getBottomSheet().setVisibility(View.INVISIBLE);
-                assertThat(getBehavior().getState(), is(BottomSheetBehavior.STATE_COLLAPSED));
-            }
-        });
-        // Swipe up as if to expand it
-        Espresso.onView(ViewMatchers.withId(R.id.bottom_sheet))
-                .perform(DesignViewActions.withCustomConstraints(
-                        new GeneralSwipeAction(Swipe.FAST,
-                                GeneralLocation.VISIBLE_CENTER, new CoordinatesProvider() {
-                            @Override
-                            public float[] calculateCoordinates(View view) {
-                                return new float[]{view.getWidth() / 2, 0};
-                            }
-                        }, Press.FINGER),
-                        not(ViewMatchers.isDisplayed())));
-        // Check that the bottom sheet stays the same collapsed state
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                assertThat(getBehavior().getState(), is(BottomSheetBehavior.STATE_COLLAPSED));
-            }
-        });
-    }
-
-    @Test
-    @MediumTest
-    public void testInvisibleThenVisible() throws Throwable {
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                // The bottom sheet is initially invisible
-                getBottomSheet().setVisibility(View.INVISIBLE);
-                // Then it becomes visible when the CoL is touched
-                getCoordinatorLayout().setOnTouchListener(new View.OnTouchListener() {
-                    @Override
-                    public boolean onTouch(View view, MotionEvent e) {
-                        if (e.getAction() == MotionEvent.ACTION_DOWN) {
-                            getBottomSheet().setVisibility(View.VISIBLE);
-                            return true;
-                        }
-                        return false;
-                    }
-                });
-                assertThat(getBehavior().getState(), is(BottomSheetBehavior.STATE_COLLAPSED));
-            }
-        });
-        // Drag over the CoL
-        Espresso.onView(ViewMatchers.withId(R.id.coordinator))
-                // Drag (and not release)
-                .perform(new DragAction(
-                        GeneralLocation.BOTTOM_CENTER,
-                        GeneralLocation.TOP_CENTER,
-                        Press.FINGER))
-                .check(new ViewAssertion() {
-                    @Override
-                    public void check(View view, NoMatchingViewException e) {
-                        // The bottom sheet should not react to the touch events
-                        assertThat(getBottomSheet(), is(ViewMatchers.isDisplayed()));
-                        assertThat(getBehavior().getState(),
-                                is(BottomSheetBehavior.STATE_COLLAPSED));
-                    }
-                });
-    }
-
-    @Test
-    @LargeTest
-    public void testNestedScroll() throws Throwable {
-        final ViewGroup bottomSheet = getBottomSheet();
-        final BottomSheetBehavior behavior = getBehavior();
-        final NestedScrollView scroll = new NestedScrollView(mActivityTestRule.getActivity());
-        // Set up nested scrolling area
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                bottomSheet.addView(scroll, new ViewGroup.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
-                final View view = new View(mActivityTestRule.getActivity());
-                // Make sure that the NestedScrollView is always scrollable
-                view.setMinimumHeight(bottomSheet.getHeight() + 1000);
-                scroll.addView(view);
-                assertThat(behavior.getState(), is(BottomSheetBehavior.STATE_COLLAPSED));
-                // The scroll offset is 0 at first
-                assertThat(scroll.getScrollY(), is(0));
-            }
-        });
-        // Swipe from the very bottom of the bottom sheet to the top edge of the screen so that the
-        // scrolling content is also scrolled
-        Espresso.onView(ViewMatchers.withId(R.id.coordinator))
-                .perform(new GeneralSwipeAction(Swipe.SLOW,
-                        new CoordinatesProvider() {
-                            @Override
-                            public float[] calculateCoordinates(View view) {
-                                return new float[]{view.getWidth() / 2, view.getHeight() - 1};
-                            }
-                        },
-                        new CoordinatesProvider() {
-                            @Override
-                            public float[] calculateCoordinates(View view) {
-                                return new float[]{view.getWidth() / 2, 1};
-                            }
-                        }, Press.FINGER));
-        registerIdlingResourceCallback();
-        try {
-            Espresso.onView(ViewMatchers.withId(R.id.bottom_sheet))
-                    .check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
-            mActivityTestRule.runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    assertThat(behavior.getState(), is(BottomSheetBehavior.STATE_EXPANDED));
-                    // This confirms that the nested scrolling area was scrolled continuously after
-                    // the bottom sheet is expanded.
-                    assertThat(scroll.getScrollY(), is(not(0)));
-                }
-            });
-        } finally {
-            unregisterIdlingResourceCallback();
-        }
-    }
-
-    @Test
-    @MediumTest
-    public void testDragOutside() {
-        // Swipe up outside of the bottom sheet
-        Espresso.onView(ViewMatchers.withId(R.id.coordinator))
-                .perform(DesignViewActions.withCustomConstraints(
-                        new GeneralSwipeAction(Swipe.FAST,
-                                // Just above the bottom sheet
-                                new CoordinatesProvider() {
-                                    @Override
-                                    public float[] calculateCoordinates(View view) {
-                                        return new float[]{
-                                                view.getWidth() / 2,
-                                                view.getHeight() - getBehavior().getPeekHeight() - 9
-                                        };
-                                    }
-                                },
-                                // Top of the CoordinatorLayout
-                                new CoordinatesProvider() {
-                                    @Override
-                                    public float[] calculateCoordinates(View view) {
-                                        return new float[]{view.getWidth() / 2, 1};
-                                    }
-                                }, Press.FINGER),
-                        ViewMatchers.isDisplayed()));
-        registerIdlingResourceCallback();
-        try {
-            Espresso.onView(ViewMatchers.withId(R.id.bottom_sheet))
-                    .check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
-            // The bottom sheet should remain collapsed
-            assertThat(getBehavior().getState(), is(BottomSheetBehavior.STATE_COLLAPSED));
-        } finally {
-            unregisterIdlingResourceCallback();
-        }
-    }
-
-    @Test
-    @MediumTest
-    public void testLayoutWhileDragging() {
-        Espresso.onView(ViewMatchers.withId(R.id.bottom_sheet))
-                // Drag (and not release)
-                .perform(new DragAction(
-                        GeneralLocation.VISIBLE_CENTER,
-                        GeneralLocation.TOP_CENTER,
-                        Press.FINGER))
-                // Check that the bottom sheet is in STATE_DRAGGING
-                .check(new ViewAssertion() {
-                    @Override
-                    public void check(View view, NoMatchingViewException e) {
-                        assertThat(view, is(ViewMatchers.isDisplayed()));
-                        BottomSheetBehavior behavior = BottomSheetBehavior.from(view);
-                        assertThat(behavior.getState(), is(BottomSheetBehavior.STATE_DRAGGING));
-                    }
-                })
-                // Add a new view
-                .perform(new AddViewAction(R.layout.frame_layout))
-                // Check that the newly added view is properly laid out
-                .check(new ViewAssertion() {
-                    @Override
-                    public void check(View view, NoMatchingViewException e) {
-                        ViewGroup parent = (ViewGroup) view;
-                        assertThat(parent.getChildCount(), is(1));
-                        View child = parent.getChildAt(0);
-                        assertThat(ViewCompat.isLaidOut(child), is(true));
-                    }
-                });
-    }
-
-    @Test
-    @MediumTest
-    public void testFabVisibility() {
-        withFabVisibilityChange(false, new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    checkSetState(BottomSheetBehavior.STATE_EXPANDED, ViewMatchers.isDisplayed());
-                } catch (Throwable throwable) {
-                    fail(throwable.getMessage());
-                }
-            }
-        });
-        withFabVisibilityChange(true, new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    checkSetState(BottomSheetBehavior.STATE_COLLAPSED, ViewMatchers.isDisplayed());
-                } catch (Throwable throwable) {
-                    fail(throwable.getMessage());
-                }
-            }
-        });
-    }
-
-    @Test
-    @MediumTest
-    public void testAutoPeekHeight() throws Throwable {
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                getBehavior().setPeekHeight(BottomSheetBehavior.PEEK_HEIGHT_AUTO);
-            }
-        });
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                CoordinatorLayout col = getCoordinatorLayout();
-                assertThat(getBottomSheet().getTop(),
-                        is(Math.min(col.getWidth() * 9 / 16,
-                                col.getHeight() - getBehavior().getPeekHeightMin())));
-            }
-        });
-    }
-
-    @Test
-    @MediumTest
-    public void testAutoPeekHeightHide() throws Throwable {
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                getBehavior().setHideable(true);
-                getBehavior().setPeekHeight(0);
-                getBehavior().setPeekHeight(BottomSheetBehavior.PEEK_HEIGHT_AUTO);
-            }
-        });
-        checkSetState(BottomSheetBehavior.STATE_HIDDEN, not(ViewMatchers.isDisplayed()));
-    }
-
-    @Test
-    @MediumTest
-    public void testDynamicContent() throws Throwable {
-        registerIdlingResourceCallback();
-        try {
-            mActivityTestRule.runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    ViewGroup.LayoutParams params = getBottomSheet().getLayoutParams();
-                    params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
-                    getBottomSheet().setLayoutParams(params);
-                    View view = new View(getBottomSheet().getContext());
-                    int size = getBehavior().getPeekHeight() * 2;
-                    getBottomSheet().addView(view, new ViewGroup.LayoutParams(size, size));
-                    assertThat(getBottomSheet().getChildCount(), is(1));
-                    // Shrink the content height.
-                    ViewGroup.LayoutParams lp = view.getLayoutParams();
-                    lp.height = (int) (size * 0.8);
-                    view.setLayoutParams(lp);
-                    // Immediately expand the bottom sheet.
-                    getBehavior().setState(BottomSheetBehavior.STATE_EXPANDED);
-                }
-            });
-            Espresso.onView(ViewMatchers.withId(R.id.bottom_sheet))
-                    .check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
-            assertThat(getBehavior().getState(), is(BottomSheetBehavior.STATE_EXPANDED));
-            // Make sure that the bottom sheet is not floating above the bottom.
-            assertThat(getBottomSheet().getBottom(), is(getCoordinatorLayout().getBottom()));
-        } finally {
-            unregisterIdlingResourceCallback();
-        }
-    }
-
-    @Test
-    @MediumTest
-    public void testExpandedPeekHeight() throws Throwable {
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                // Make the peek height as tall as the bottom sheet.
-                BottomSheetBehavior behavior = getBehavior();
-                behavior.setPeekHeight(getBottomSheet().getHeight());
-                assertThat(behavior.getState(), is(BottomSheetBehavior.STATE_COLLAPSED));
-            }
-        });
-        // Both of these will not animate the sheet , but the state should be changed.
-        checkSetState(BottomSheetBehavior.STATE_EXPANDED, ViewMatchers.isDisplayed());
-        checkSetState(BottomSheetBehavior.STATE_COLLAPSED, ViewMatchers.isDisplayed());
-    }
-
-    @Test
-    @SmallTest
-    public void testFindScrollingChildEnabled() {
-        Context context = mActivityTestRule.getActivity();
-        NestedScrollView disabledParent = new NestedScrollView(context);
-        disabledParent.setNestedScrollingEnabled(false);
-        NestedScrollView enabledChild = new NestedScrollView(context);
-        enabledChild.setNestedScrollingEnabled(true);
-        disabledParent.addView(enabledChild);
-
-        View scrollingChild = getBehavior().findScrollingChild(disabledParent);
-        assertThat(scrollingChild, is((View) enabledChild));
-    }
-
-    private void checkSetState(final int state, Matcher<View> matcher) throws Throwable {
-        registerIdlingResourceCallback();
-        try {
-            mActivityTestRule.runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    getBehavior().setState(state);
-                }
-            });
-            Espresso.onView(ViewMatchers.withId(R.id.bottom_sheet))
-                    .check(ViewAssertions.matches(matcher));
-            assertThat(getBehavior().getState(), is(state));
-        } finally {
-            unregisterIdlingResourceCallback();
-        }
-    }
-
-    private void registerIdlingResourceCallback() {
-        // This cannot be done in setUp(), or swiping action cannot be executed.
-        mCallback = new Callback(getBehavior());
-        Espresso.registerIdlingResources(mCallback);
-    }
-
-    private void unregisterIdlingResourceCallback() {
-        if (mCallback != null) {
-            Espresso.unregisterIdlingResources(mCallback);
-            mCallback = null;
-        }
-    }
-
-    private void withFabVisibilityChange(boolean shown, Runnable action) {
-        OnVisibilityChangedListener listener = new OnVisibilityChangedListener(shown);
-        CoordinatorLayout.LayoutParams lp =
-                (CoordinatorLayout.LayoutParams) mActivityTestRule.getActivity().mFab
-                        .getLayoutParams();
-        FloatingActionButton.Behavior behavior = (FloatingActionButton.Behavior) lp.getBehavior();
-        behavior.setInternalAutoHideListener(listener);
-        Espresso.registerIdlingResources(listener);
-        try {
-            action.run();
-        } finally {
-            Espresso.unregisterIdlingResources(listener);
-        }
-    }
-
-    private ViewGroup getBottomSheet() {
-        return mActivityTestRule.getActivity().mBottomSheet;
-    }
-
-    private BottomSheetBehavior getBehavior() {
-        return mActivityTestRule.getActivity().mBehavior;
-    }
-
-    private CoordinatorLayout getCoordinatorLayout() {
-        return mActivityTestRule.getActivity().mCoordinatorLayout;
-    }
-
-}
diff --git a/design/tests/src/android/support/design/widget/BottomSheetBehaviorTouchTest.java b/design/tests/src/android/support/design/widget/BottomSheetBehaviorTouchTest.java
deleted file mode 100644
index 51ab0fa..0000000
--- a/design/tests/src/android/support/design/widget/BottomSheetBehaviorTouchTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.CoreMatchers.sameInstance;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.espresso.Espresso;
-import android.support.test.espresso.NoMatchingViewException;
-import android.support.test.espresso.ViewAssertion;
-import android.support.test.espresso.action.ViewActions;
-import android.support.test.filters.MediumTest;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.FrameLayout;
-
-import org.junit.Before;
-import org.junit.Test;
-
-@MediumTest
-public class BottomSheetBehaviorTouchTest extends
-        BaseInstrumentationTestCase<CoordinatorLayoutActivity> {
-
-    private static final int PEEK_HEIGHT = 100;
-
-    private FrameLayout mBottomSheet;
-
-    private BottomSheetBehavior<FrameLayout> mBehavior;
-
-    private boolean mDown;
-
-    private View.OnTouchListener mOnTouchListener = new View.OnTouchListener() {
-
-        @Override
-        public boolean onTouch(View v, MotionEvent event) {
-            switch (event.getActionMasked()) {
-                case MotionEvent.ACTION_DOWN:
-                    mDown = true;
-                    break;
-            }
-            return true;
-        }
-
-    };
-
-    public BottomSheetBehaviorTouchTest() {
-        super(CoordinatorLayoutActivity.class);
-    }
-
-    @UiThreadTest
-    @Before
-    public void setUpBottomSheet() {
-        CoordinatorLayoutActivity activity = mActivityTestRule.getActivity();
-        activity.mContainer.setOnTouchListener(mOnTouchListener);
-        mBottomSheet = new FrameLayout(activity);
-        CoordinatorLayout.LayoutParams params = new CoordinatorLayout.LayoutParams(
-                CoordinatorLayout.LayoutParams.MATCH_PARENT,
-                CoordinatorLayout.LayoutParams.MATCH_PARENT);
-        mBehavior = new BottomSheetBehavior<>();
-        mBehavior.setPeekHeight(PEEK_HEIGHT);
-        params.setBehavior(mBehavior);
-        activity.mCoordinatorLayout.addView(mBottomSheet, params);
-    }
-
-    @Test
-    public void testSetUp() {
-        assertThat(mBottomSheet, is(notNullValue()));
-        assertThat(mBehavior, is(sameInstance(BottomSheetBehavior.from(mBottomSheet))));
-    }
-
-    @Test
-    public void testTouchCoordinatorLayout() {
-        final CoordinatorLayoutActivity activity = mActivityTestRule.getActivity();
-        mDown = false;
-        Espresso.onView(sameInstance((View) activity.mCoordinatorLayout))
-                .perform(ViewActions.click())  // Click outside the bottom sheet
-                .check(new ViewAssertion() {
-                    @Override
-                    public void check(View view, NoMatchingViewException e) {
-                        assertThat(e, is(nullValue()));
-                        assertThat(view, is(notNullValue()));
-                        // Check that the touch event fell through to the container
-                        assertThat(mDown, is(true));
-                    }
-                });
-    }
-
-}
diff --git a/design/tests/src/android/support/design/widget/BottomSheetBehaviorWithInsetsActivity.java b/design/tests/src/android/support/design/widget/BottomSheetBehaviorWithInsetsActivity.java
deleted file mode 100644
index c1ab21d..0000000
--- a/design/tests/src/android/support/design/widget/BottomSheetBehaviorWithInsetsActivity.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-import android.view.View;
-
-
-public class BottomSheetBehaviorWithInsetsActivity extends BottomSheetBehaviorActivity {
-
-    View mBottomSheetContent;
-
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.test_design_bottom_sheet_behavior_with_insets;
-    }
-
-    @Override
-    protected void onContentViewSet() {
-        super.onContentViewSet();
-        mBottomSheetContent = findViewById(R.id.bottom_sheet_content);
-    }
-
-}
diff --git a/design/tests/src/android/support/design/widget/BottomSheetBehaviorWithInsetsTest.java b/design/tests/src/android/support/design/widget/BottomSheetBehaviorWithInsetsTest.java
deleted file mode 100644
index f77542e..0000000
--- a/design/tests/src/android/support/design/widget/BottomSheetBehaviorWithInsetsTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-import android.support.test.filters.SmallTest;
-import android.support.v4.view.ViewCompat;
-import android.view.ViewGroup;
-
-import org.junit.Test;
-
-public class BottomSheetBehaviorWithInsetsTest extends
-        BaseInstrumentationTestCase<BottomSheetBehaviorWithInsetsActivity> {
-
-    public BottomSheetBehaviorWithInsetsTest() {
-        super(BottomSheetBehaviorWithInsetsActivity.class);
-    }
-
-    @Test
-    @SmallTest
-    public void testFitsSystemWindows() {
-        BottomSheetBehaviorWithInsetsActivity activity = mActivityTestRule.getActivity();
-        ViewCompat.setFitsSystemWindows(activity.mCoordinatorLayout, true);
-        assertThat(activity.mBehavior.getState(), is(BottomSheetBehavior.STATE_COLLAPSED));
-        ViewGroup bottomSheet = activity.mBottomSheet;
-        assertThat(bottomSheet.getTop(),
-                is(activity.mCoordinatorLayout.getHeight() - activity.mBehavior.getPeekHeight()));
-        assertThat(activity.mBottomSheetContent.getTop(), is(0));
-    }
-
-}
diff --git a/design/tests/src/android/support/design/widget/BottomSheetDialogActivity.java b/design/tests/src/android/support/design/widget/BottomSheetDialogActivity.java
deleted file mode 100644
index ab273c2..0000000
--- a/design/tests/src/android/support/design/widget/BottomSheetDialogActivity.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-
-public class BottomSheetDialogActivity extends BaseTestActivity {
-
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.frame_layout;
-    }
-
-}
-
diff --git a/design/tests/src/android/support/design/widget/BottomSheetDialogTest.java b/design/tests/src/android/support/design/widget/BottomSheetDialogTest.java
deleted file mode 100644
index 8ca9b1d..0000000
--- a/design/tests/src/android/support/design/widget/BottomSheetDialogTest.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.lessThan;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.timeout;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.SystemClock;
-import android.support.design.test.R;
-import android.support.test.espresso.Espresso;
-import android.support.test.espresso.UiController;
-import android.support.test.espresso.ViewAction;
-import android.support.test.espresso.action.ViewActions;
-import android.support.test.espresso.assertion.ViewAssertions;
-import android.support.test.espresso.matcher.ViewMatchers;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.MediumTest;
-import android.support.v7.widget.AppCompatTextView;
-import android.view.View;
-import android.widget.FrameLayout;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-import org.junit.Test;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-
-public class BottomSheetDialogTest extends
-        BaseInstrumentationTestCase<BottomSheetDialogActivity> {
-
-    private BottomSheetDialog mDialog;
-
-    public BottomSheetDialogTest() {
-        super(BottomSheetDialogActivity.class);
-    }
-
-    @Test
-    @MediumTest
-    public void testBasicDialogSetup() throws Throwable {
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                showDialog();
-                // Confirms that the dialog is shown
-                assertThat(mDialog.isShowing(), is(true));
-                FrameLayout bottomSheet = (FrameLayout) mDialog
-                        .findViewById(R.id.design_bottom_sheet);
-                assertThat(bottomSheet, is(notNullValue()));
-                BottomSheetBehavior<FrameLayout> behavior = BottomSheetBehavior.from(bottomSheet);
-                assertThat(behavior.isHideable(), is(true));
-                assertThat(behavior, is(notNullValue()));
-                // Modal bottom sheets have auto peek height by default.
-                assertThat(behavior.getPeekHeight(), is(BottomSheetBehavior.PEEK_HEIGHT_AUTO));
-            }
-        });
-        // Click outside the bottom sheet
-        Espresso.onView(ViewMatchers.withId(R.id.touch_outside))
-                .perform(ViewActions.click());
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                // Confirm that the dialog is no longer shown
-                assertThat(mDialog.isShowing(), is(false));
-            }
-        });
-    }
-
-    @Test
-    @MediumTest
-    public void testTouchInside() throws Throwable {
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                showDialog();
-                // Confirms that the dialog is shown
-                assertThat(mDialog.isShowing(), is(true));
-                FrameLayout bottomSheet = (FrameLayout) mDialog
-                        .findViewById(R.id.design_bottom_sheet);
-                // The bottom sheet is not clickable
-                assertNotNull(bottomSheet);
-                assertThat(bottomSheet.isClickable(), is(false));
-            }
-        });
-        // Click on the bottom sheet
-        Espresso.onView(ViewMatchers.withId(R.id.design_bottom_sheet))
-                .perform(ViewActions.click());
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                // Confirm that touch didn't fall through as outside touch
-                assertThat(mDialog.isShowing(), is(true));
-            }
-        });
-    }
-
-    @Test
-    @MediumTest
-    public void testClickContent() throws Throwable {
-        final View.OnClickListener mockListener = mock(View.OnClickListener.class);
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                showDialog();
-                // Confirms that the dialog is shown
-                assertThat(mDialog.isShowing(), is(true));
-                FrameLayout bottomSheet = (FrameLayout) mDialog
-                        .findViewById(R.id.design_bottom_sheet);
-                // Set up an OnClickListener to the content of the bottom sheet
-                assertNotNull(bottomSheet);
-                View child = bottomSheet.getChildAt(0);
-                child.setOnClickListener(mockListener);
-            }
-        });
-        // Click on the bottom sheet; since the whole sheet is occupied with its only child, this
-        // clicks the child
-        Espresso.onView(ViewMatchers.withParent(ViewMatchers.withId(R.id.design_bottom_sheet)))
-                .perform(ViewActions.click());
-        verify(mockListener, times(1)).onClick(any(View.class));
-    }
-
-    @Test
-    @MediumTest
-    public void testShortDialog() throws Throwable {
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                showDialog();
-            }
-        });
-        // This ensures that the views are laid out before assertions below
-        Espresso.onView(ViewMatchers.withId(R.id.design_bottom_sheet))
-                .perform(setTallPeekHeight())
-                .check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                FrameLayout bottomSheet = (FrameLayout) mDialog
-                        .findViewById(R.id.design_bottom_sheet);
-                CoordinatorLayout coordinator = (CoordinatorLayout) bottomSheet.getParent();
-                BottomSheetBehavior<FrameLayout> behavior = BottomSheetBehavior.from(bottomSheet);
-                assertThat(bottomSheet, is(notNullValue()));
-                assertThat(coordinator, is(notNullValue()));
-                assertThat(behavior, is(notNullValue()));
-                // This bottom sheet is shorter than the peek height
-                assertThat(bottomSheet.getHeight(), is(lessThan(behavior.getPeekHeight())));
-                // Confirm that the bottom sheet is bottom-aligned
-                assertThat(bottomSheet.getTop(),
-                        is(coordinator.getHeight() - bottomSheet.getHeight()));
-            }
-        });
-    }
-
-    @Test
-    @MediumTest
-    public void testNonCancelableDialog() throws Throwable {
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                showDialog();
-                mDialog.setCancelable(false);
-            }
-        });
-        // Click outside the bottom sheet
-        Espresso.onView(ViewMatchers.withId(R.id.touch_outside))
-                .perform(ViewActions.click());
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                FrameLayout bottomSheet = (FrameLayout) mDialog
-                        .findViewById(R.id.design_bottom_sheet);
-                BottomSheetBehavior<FrameLayout> behavior = BottomSheetBehavior.from(bottomSheet);
-                assertThat(behavior.isHideable(), is(false));
-                assertThat(mDialog.isShowing(), is(true));
-                mDialog.cancel();
-                assertThat(mDialog.isShowing(), is(false));
-            }
-        });
-    }
-
-    @Test
-    @MediumTest
-    public void testHideBottomSheet() throws Throwable {
-        final AtomicBoolean canceled = new AtomicBoolean(false);
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                showDialog();
-                mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
-                    @Override
-                    public void onCancel(DialogInterface dialogInterface) {
-                        canceled.set(true);
-                    }
-                });
-            }
-        });
-        Espresso.onView(ViewMatchers.withId(R.id.design_bottom_sheet))
-                .perform(setState(BottomSheetBehavior.STATE_HIDDEN));
-        // The dialog should be canceled
-        long start = System.currentTimeMillis();
-        while (!canceled.get()) {
-            SystemClock.sleep(31);
-            if (System.currentTimeMillis() - start > 3000) {
-                fail("Timed out while waiting for the dialog to be canceled.");
-            }
-        }
-    }
-
-    @SuppressWarnings("WrongConstant")
-    @Test
-    @LargeTest
-    public void testHideThenShow() throws Throwable {
-        // Hide the bottom sheet and wait for the dialog to be canceled.
-        final DialogInterface.OnCancelListener onCancelListener = mock(
-                DialogInterface.OnCancelListener.class);
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                showDialog();
-                mDialog.setOnCancelListener(onCancelListener);
-            }
-        });
-        Espresso.onView(ViewMatchers.withId(R.id.design_bottom_sheet))
-                .perform(setState(BottomSheetBehavior.STATE_HIDDEN));
-        verify(onCancelListener, timeout(3000)).onCancel(any(DialogInterface.class));
-        // Reshow the same dialog instance and wait for the bottom sheet to be collapsed.
-        final BottomSheetBehavior.BottomSheetCallback callback = mock(
-                BottomSheetBehavior.BottomSheetCallback.class);
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                BottomSheetBehavior.from(mDialog.findViewById(R.id.design_bottom_sheet))
-                        .setBottomSheetCallback(callback);
-                mDialog.show(); // Show the same dialog again.
-            }
-        });
-        verify(callback, timeout(3000)).onStateChanged(any(View.class),
-                eq(BottomSheetBehavior.STATE_SETTLING));
-        verify(callback, timeout(3000)).onStateChanged(any(View.class),
-                eq(BottomSheetBehavior.STATE_COLLAPSED));
-    }
-
-    private void showDialog() {
-        Context context = mActivityTestRule.getActivity();
-        mDialog = new BottomSheetDialog(context);
-        AppCompatTextView text = new AppCompatTextView(context);
-        StringBuilder builder = new StringBuilder();
-        builder.append("It is fine today. ");
-        text.setText(builder);
-        mDialog.setContentView(text);
-        mDialog.show();
-    }
-
-    private static ViewAction setTallPeekHeight() {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return ViewMatchers.isDisplayed();
-            }
-
-            @Override
-            public String getDescription() {
-                return "set tall peek height";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                BottomSheetBehavior behavior = BottomSheetBehavior.from(view);
-                behavior.setPeekHeight(view.getHeight() + 100);
-            }
-        };
-    }
-
-    private static ViewAction setState(@BottomSheetBehavior.State final int state) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isBottomSheet();
-            }
-
-            @Override
-            public String getDescription() {
-                return "set state to " + state;
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                BottomSheetBehavior.from(view).setState(state);
-            }
-        };
-    }
-
-    private static Matcher<View> isBottomSheet() {
-        return new TypeSafeMatcher<View>() {
-            @Override
-            protected boolean matchesSafely(View view) {
-                return BottomSheetBehavior.from(view) != null;
-            }
-
-            @Override
-            public void describeTo(Description description) {
-                description.appendText("is a bottom sheet");
-            }
-        };
-    }
-
-}
-
diff --git a/design/tests/src/android/support/design/widget/CoordinatorLayoutActivity.java b/design/tests/src/android/support/design/widget/CoordinatorLayoutActivity.java
deleted file mode 100644
index a42ac8d..0000000
--- a/design/tests/src/android/support/design/widget/CoordinatorLayoutActivity.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-import android.widget.FrameLayout;
-
-public class CoordinatorLayoutActivity extends BaseTestActivity {
-
-    FrameLayout mContainer;
-    CoordinatorLayout mCoordinatorLayout;
-
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.activity_coordinator_layout;
-    }
-
-    @Override
-    protected void onContentViewSet() {
-        mContainer = findViewById(R.id.container);
-        mCoordinatorLayout = findViewById(R.id.coordinator);
-    }
-
-}
diff --git a/design/tests/src/android/support/design/widget/CustomSnackbar.java b/design/tests/src/android/support/design/widget/CustomSnackbar.java
deleted file mode 100644
index caa1dc4..0000000
--- a/design/tests/src/android/support/design/widget/CustomSnackbar.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-import android.view.View;
-import android.widget.TextView;
-
-/**
- * Sample code for a custom snackbar that shows two separate text views and two images
- * in the main content area.
- */
-public class CustomSnackbar extends BaseTransientBottomBar<CustomSnackbar> {
-    public CustomSnackbar(CoordinatorLayout parent, View content,
-            BaseTransientBottomBar.ContentViewCallback contentViewCallback) {
-        super(parent, content, contentViewCallback);
-    }
-
-    /** Sets the title of this custom snackbar. */
-    public CustomSnackbar setTitle(String title) {
-        TextView titleView = (TextView) getView().findViewById(R.id.custom_snackbar_title);
-        titleView.setText(title);
-        return this;
-    }
-
-    /** Sets the subtitle of this custom snackbar. */
-    public CustomSnackbar setSubtitle(String subtitle) {
-        TextView subtitleView = (TextView) getView().findViewById(R.id.custom_snackbar_subtitle);
-        subtitleView.setText(subtitle);
-        return this;
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/CustomSnackbarMainContent.java b/design/tests/src/android/support/design/widget/CustomSnackbarMainContent.java
deleted file mode 100644
index 8435bf7..0000000
--- a/design/tests/src/android/support/design/widget/CustomSnackbarMainContent.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.content.Context;
-import android.support.design.test.R;
-import android.util.AttributeSet;
-import android.widget.RelativeLayout;
-
-/**
- * Layout for the custom snackbar that shows two separate text views and two images
- * in the main content area.
- */
-public class CustomSnackbarMainContent extends RelativeLayout {
-    private final int mMaxWidth;
-
-    public CustomSnackbarMainContent(Context context) {
-        this(context, null);
-    }
-
-    public CustomSnackbarMainContent(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public CustomSnackbarMainContent(Context context, AttributeSet attrs,
-            int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-
-        mMaxWidth = context.getResources().getDimensionPixelSize(R.dimen.custom_snackbar_max_width);
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
-        if ((mMaxWidth > 0) && (getMeasuredWidth() > mMaxWidth)) {
-            super.onMeasure(MeasureSpec.makeMeasureSpec(mMaxWidth, MeasureSpec.EXACTLY),
-                    heightMeasureSpec);
-        }
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/CustomSnackbarTest.java b/design/tests/src/android/support/design/widget/CustomSnackbarTest.java
deleted file mode 100644
index cc6ed1a..0000000
--- a/design/tests/src/android/support/design/widget/CustomSnackbarTest.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static android.support.design.testutils.TestUtilsActions.setLayoutDirection;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.swipeLeft;
-import static android.support.test.espresso.action.ViewActions.swipeRight;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
-import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-
-import static org.hamcrest.core.AllOf.allOf;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-import android.support.annotation.Nullable;
-import android.support.design.test.R;
-import android.support.design.testutils.SnackbarUtils;
-import android.support.test.espresso.ViewAction;
-import android.support.test.espresso.ViewInteraction;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.MediumTest;
-import android.support.v4.view.ViewCompat;
-import android.view.LayoutInflater;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class CustomSnackbarTest extends BaseInstrumentationTestCase<SnackbarActivity> {
-    private static final String TITLE_TEXT = "Test title";
-    private static final String SUBTITLE_TEXT = "Test subtitle";
-
-    private CoordinatorLayout mCoordinatorLayout;
-
-    private interface DismissAction {
-        void dismiss(CustomSnackbar snackbar);
-    }
-
-    public CustomSnackbarTest() {
-        super(SnackbarActivity.class);
-    }
-
-    @Before
-    public void setup() {
-        mCoordinatorLayout =
-                (CoordinatorLayout) mActivityTestRule.getActivity().findViewById(R.id.col);
-    }
-
-    private void verifySnackbarContent(final CustomSnackbar snackbar, final String expectedTitle,
-            final String expectedSubtitle) throws Throwable {
-        // Show the snackbar
-        SnackbarUtils.showTransientBottomBarAndWaitUntilFullyShown(snackbar);
-
-        // Verify that we're showing the title
-        withText(expectedTitle).matches(allOf(
-                isDescendantOfA(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                isDescendantOfA(isAssignableFrom(CustomSnackbarMainContent.class)),
-                isCompletelyDisplayed()));
-
-        // Verify that we're showing the subtitle
-        withText(expectedSubtitle).matches(allOf(
-                isDescendantOfA(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                isDescendantOfA(isAssignableFrom(CustomSnackbarMainContent.class)),
-                isCompletelyDisplayed()));
-
-        // Dismiss the snackbar
-        SnackbarUtils.dismissTransientBottomBarAndWaitUntilFullyDismissed(snackbar);
-    }
-
-    private CustomSnackbar makeCustomSnackbar() {
-        final LayoutInflater inflater = LayoutInflater.from(mCoordinatorLayout.getContext());
-        final CustomSnackbarMainContent content =
-                (CustomSnackbarMainContent) inflater.inflate(
-                        R.layout.custom_snackbar_include, mCoordinatorLayout, false);
-        final BaseTransientBottomBar.ContentViewCallback contentViewCallback =
-                new BaseTransientBottomBar.ContentViewCallback() {
-                    @Override
-                    public void animateContentIn(int delay, int duration) {
-                        content.setAlpha(0f);
-                        content.animate().alpha(1f).setDuration(duration)
-                                .setStartDelay(delay).start();
-                    }
-
-                    @Override
-                    public void animateContentOut(int delay, int duration) {
-                        content.setAlpha(1f);
-                        content.animate().alpha(0f).setDuration(duration)
-                                .setStartDelay(delay).start();
-                    }
-                };
-        return new CustomSnackbar(mCoordinatorLayout, content, contentViewCallback);
-    }
-
-    @Test
-    @LargeTest
-    public void testBasicContent() throws Throwable {
-        // Verify different combinations of snackbar content (title / subtitle and action)
-        // and duration
-
-        // Short duration
-        verifySnackbarContent(
-                makeCustomSnackbar().setTitle(TITLE_TEXT)
-                        .setSubtitle(SUBTITLE_TEXT).setDuration(Snackbar.LENGTH_SHORT),
-                TITLE_TEXT, SUBTITLE_TEXT);
-
-        // Long duration
-        verifySnackbarContent(
-                makeCustomSnackbar().setTitle(TITLE_TEXT)
-                        .setSubtitle(SUBTITLE_TEXT).setDuration(Snackbar.LENGTH_LONG),
-                TITLE_TEXT, SUBTITLE_TEXT);
-
-        // Indefinite duration
-        verifySnackbarContent(
-                makeCustomSnackbar().setTitle(TITLE_TEXT)
-                        .setSubtitle(SUBTITLE_TEXT).setDuration(Snackbar.LENGTH_INDEFINITE),
-                TITLE_TEXT, SUBTITLE_TEXT);
-    }
-
-    private void verifyDismissCallback(final ViewInteraction interaction,
-            @Nullable final ViewAction action, @Nullable final DismissAction dismissAction,
-            final int length, @Snackbar.Callback.DismissEvent final int expectedEvent)
-            throws Throwable {
-        final BaseTransientBottomBar.BaseCallback mockCallback =
-                mock(BaseTransientBottomBar.BaseCallback.class);
-        final CustomSnackbar snackbar = makeCustomSnackbar().setTitle(TITLE_TEXT)
-                .setSubtitle(SUBTITLE_TEXT).setDuration(length)
-                .addCallback(mockCallback);
-
-        // Show the snackbar
-        SnackbarUtils.showTransientBottomBarAndWaitUntilFullyShown(snackbar);
-        // Verify that our onShown has been called
-        verify(mockCallback, times(1)).onShown(snackbar);
-        // and that the snackbar is either shown or queued to be shown
-        assertTrue(snackbar.isShownOrQueued());
-        // and also check that we have the intended title / subtitle displayed somewhere in
-        // our hierarchy
-        onView(withText(TITLE_TEXT)).check(matches(isCompletelyDisplayed()));
-        onView(withText(SUBTITLE_TEXT)).check(matches(isCompletelyDisplayed()));
-
-        // Now perform the UI interaction
-        SnackbarUtils.performActionAndWaitUntilFullyDismissed(snackbar,
-                new SnackbarUtils.TransientBottomBarAction() {
-                    @Override
-                    public void perform() throws Throwable {
-                        if (action != null) {
-                            interaction.perform(action);
-                        } else if (dismissAction != null) {
-                            mActivityTestRule.runOnUiThread(new Runnable() {
-                                @Override
-                                public void run() {
-                                    dismissAction.dismiss(snackbar);
-                                }
-                            });
-                        }
-                    }
-                });
-
-        // Verify that our onDismissed has been called
-        verify(mockCallback, times(1)).onDismissed(snackbar, expectedEvent);
-        verifyNoMoreInteractions(mockCallback);
-        // and that the snackbar is neither shown nor queued to be shown
-        assertFalse(snackbar.isShownOrQueued());
-    }
-
-    @Test
-    @MediumTest
-    public void testDismissViaSwipe() throws Throwable {
-        verifyDismissCallback(
-                onView(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                swipeRight(),
-                null,
-                Snackbar.LENGTH_LONG,
-                Snackbar.Callback.DISMISS_EVENT_SWIPE);
-    }
-
-    @Test
-    @MediumTest
-    public void testDismissViaSwipeRtl() throws Throwable {
-        onView(withId(R.id.col)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
-        if (ViewCompat.getLayoutDirection(mCoordinatorLayout) == ViewCompat.LAYOUT_DIRECTION_RTL) {
-            // On devices that support RTL layout, the start-to-end dismiss swipe is done
-            // with swipeLeft() action
-            verifyDismissCallback(
-                    onView(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                    swipeLeft(),
-                    null,
-                    Snackbar.LENGTH_LONG,
-                    Snackbar.Callback.DISMISS_EVENT_SWIPE);
-        }
-    }
-
-    @Test
-    @MediumTest
-    public void testDismissViaApi() throws Throwable {
-        verifyDismissCallback(
-                onView(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                null,
-                new DismissAction() {
-                    @Override
-                    public void dismiss(CustomSnackbar snackbar) {
-                        snackbar.dismiss();
-                    }
-                },
-                Snackbar.LENGTH_LONG,
-                Snackbar.Callback.DISMISS_EVENT_MANUAL);
-    }
-
-    @Test
-    @LargeTest
-    public void testDismissViaTimeout() throws Throwable {
-        verifyDismissCallback(
-                onView(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                null,
-                null,
-                Snackbar.LENGTH_LONG,
-                Snackbar.Callback.DISMISS_EVENT_TIMEOUT);
-    }
-
-    @Test
-    @MediumTest
-    public void testDismissViaAnotherSnackbar() throws Throwable {
-        final CustomSnackbar anotherSnackbar =
-                makeCustomSnackbar().setTitle("Different title")
-                        .setSubtitle("Different subtitle").setDuration(Snackbar.LENGTH_SHORT);
-
-        // Our dismiss action is to show another snackbar (and verify that the original snackbar
-        // is now dismissed with CONSECUTIVE event)
-        verifyDismissCallback(
-                onView(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                null,
-                new DismissAction() {
-                    @Override
-                    public void dismiss(CustomSnackbar snackbar) {
-                        anotherSnackbar.show();
-                    }
-                },
-                Snackbar.LENGTH_LONG,
-                Snackbar.Callback.DISMISS_EVENT_CONSECUTIVE);
-
-        // And dismiss the second snackbar to get back to clean state
-        SnackbarUtils.dismissTransientBottomBarAndWaitUntilFullyDismissed(anotherSnackbar);
-    }
-
-    @Test
-    @MediumTest
-    public void testMultipleCallbacks() throws Throwable {
-        final CustomSnackbar snackbar = makeCustomSnackbar().setTitle(TITLE_TEXT)
-                .setSubtitle(SUBTITLE_TEXT).setDuration(Snackbar.LENGTH_INDEFINITE);
-        final BaseTransientBottomBar.BaseCallback mockCallback1 =
-                mock(BaseTransientBottomBar.BaseCallback.class);
-        final BaseTransientBottomBar.BaseCallback mockCallback2 =
-                mock(BaseTransientBottomBar.BaseCallback.class);
-        snackbar.addCallback(mockCallback1);
-        snackbar.addCallback(mockCallback2);
-
-        SnackbarUtils.showTransientBottomBarAndWaitUntilFullyShown(snackbar);
-        verify(mockCallback1, times(1)).onShown(snackbar);
-        verify(mockCallback2, times(1)).onShown(snackbar);
-
-        SnackbarUtils.dismissTransientBottomBarAndWaitUntilFullyDismissed(snackbar);
-        verify(mockCallback1, times(1)).onDismissed(snackbar,
-                BaseTransientBottomBar.BaseCallback.DISMISS_EVENT_MANUAL);
-        verify(mockCallback2, times(1)).onDismissed(snackbar,
-                BaseTransientBottomBar.BaseCallback.DISMISS_EVENT_MANUAL);
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/DesignViewActions.java b/design/tests/src/android/support/design/widget/DesignViewActions.java
deleted file mode 100644
index 4ae608a..0000000
--- a/design/tests/src/android/support/design/widget/DesignViewActions.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import org.hamcrest.Matcher;
-
-import android.support.test.espresso.UiController;
-import android.support.test.espresso.ViewAction;
-import android.support.test.espresso.matcher.ViewMatchers;
-import android.view.View;
-
-public final class DesignViewActions {
-
-    private DesignViewActions() {
-    }
-
-    /**
-     * Overwrites the constraints of the specified {@link ViewAction}.
-     */
-    public static ViewAction withCustomConstraints(final ViewAction action,
-            final Matcher<View> constraints) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return constraints;
-            }
-
-            @Override
-            public String getDescription() {
-                return action.getDescription();
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                action.perform(uiController, view);
-            }
-        };
-    }
-
-    public static ViewAction setVisibility(final int visibility) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return ViewMatchers.isEnabled();
-            }
-
-            @Override
-            public String getDescription() {
-                return "Set view visibility";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-                view.setVisibility(visibility);
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-}
diff --git a/design/tests/src/android/support/design/widget/DynamicCoordinatorLayoutActivity.java b/design/tests/src/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
deleted file mode 100644
index f26ef12..0000000
--- a/design/tests/src/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-
-/**
- * Test activity for testing various aspects of {@link CoordinatorLayout}.
- */
-public class DynamicCoordinatorLayoutActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.dynamic_coordinator_layout;
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/FloatingActionButtonActivity.java b/design/tests/src/android/support/design/widget/FloatingActionButtonActivity.java
deleted file mode 100644
index 3a32827..0000000
--- a/design/tests/src/android/support/design/widget/FloatingActionButtonActivity.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-
-public class FloatingActionButtonActivity extends BaseTestActivity {
-
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.design_fab;
-    }
-
-}
diff --git a/design/tests/src/android/support/design/widget/FloatingActionButtonTest.java b/design/tests/src/android/support/design/widget/FloatingActionButtonTest.java
deleted file mode 100644
index f7e9286..0000000
--- a/design/tests/src/android/support/design/widget/FloatingActionButtonTest.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static android.support.design.testutils.FloatingActionButtonActions.hideThenShow;
-import static android.support.design.testutils.FloatingActionButtonActions.setBackgroundTintColor;
-import static android.support.design.testutils.FloatingActionButtonActions.setBackgroundTintList;
-import static android.support.design.testutils.FloatingActionButtonActions.setCompatElevation;
-import static android.support.design.testutils.FloatingActionButtonActions.setCustomSize;
-import static android.support.design.testutils.FloatingActionButtonActions.setImageResource;
-import static android.support.design.testutils.FloatingActionButtonActions.setLayoutGravity;
-import static android.support.design.testutils.FloatingActionButtonActions.setSize;
-import static android.support.design.testutils.FloatingActionButtonActions.showThenHide;
-import static android.support.design.testutils.TestUtilsActions.setClickable;
-import static android.support.design.testutils.TestUtilsActions.setEnabled;
-import static android.support.design.testutils.TestUtilsActions.setSelected;
-import static android.support.design.testutils.TestUtilsMatchers.isPressed;
-import static android.support.design.testutils.TestUtilsMatchers.withFabBackgroundFill;
-import static android.support.design.testutils.TestUtilsMatchers.withFabContentAreaOnMargins;
-import static android.support.design.testutils.TestUtilsMatchers.withFabContentHeight;
-import static android.support.design.testutils.TestUtilsMatchers.withFabCustomSize;
-import static android.support.design.widget.DesignViewActions.setVisibility;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-
-import static org.hamcrest.Matchers.not;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import android.app.Activity;
-import android.content.res.ColorStateList;
-import android.graphics.Color;
-import android.graphics.Rect;
-import android.support.design.test.R;
-import android.support.design.testutils.TestUtils;
-import android.support.test.espresso.action.CoordinatesProvider;
-import android.support.test.espresso.action.GeneralSwipeAction;
-import android.support.test.espresso.action.Press;
-import android.support.test.espresso.action.Swipe;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
-import android.support.v4.content.ContextCompat;
-import android.view.Gravity;
-import android.view.View;
-
-import org.junit.Test;
-
-public class FloatingActionButtonTest
-        extends BaseInstrumentationTestCase<FloatingActionButtonActivity> {
-
-    public FloatingActionButtonTest() {
-        super(FloatingActionButtonActivity.class);
-    }
-
-    @SmallTest
-    @Test
-    public void testDefaultBackgroundTint() {
-        final int colorAccent = TestUtils.getThemeAttrColor(
-                mActivityTestRule.getActivity(), R.attr.colorAccent);
-        onView(withId(R.id.fab_standard))
-                .check(matches(withFabBackgroundFill(colorAccent)));
-    }
-
-    @SmallTest
-    @Test
-    public void testSetTintOnDefaultBackgroundTint() {
-        onView(withId(R.id.fab_standard))
-                .perform(setBackgroundTintColor(Color.GREEN))
-                .check(matches(withFabBackgroundFill(Color.GREEN)));
-    }
-
-    @SmallTest
-    @Test
-    public void testDeclaredBackgroundTint() {
-        onView(withId(R.id.fab_tint))
-                .check(matches(withFabBackgroundFill(Color.MAGENTA)));
-    }
-
-    @SmallTest
-    @Test
-    public void testSetTintOnDeclaredBackgroundTint() {
-        onView(withId(R.id.fab_tint))
-                .perform(setBackgroundTintColor(Color.GREEN))
-                .check(matches(withFabBackgroundFill(Color.GREEN)));
-    }
-
-    @SmallTest
-    @Test
-    public void testSetStatefulTintAcrossStateChanges() {
-        final Activity activity = mActivityTestRule.getActivity();
-
-        final ColorStateList tint = ContextCompat.getColorStateList(activity, R.color.fab_tint);
-        final int normal = ContextCompat.getColor(activity, R.color.sand_default);
-        final int notSelected = ContextCompat.getColor(activity, R.color.sand_disabled);
-
-        // First set the background tint list to the ColorStateList
-        onView(withId(R.id.fab_standard))
-                .perform(setBackgroundTintList(tint));
-
-        // Assert that the background is tinted correctly across state changes
-        onView(withId(R.id.fab_standard))
-                .perform(setSelected(true))
-                .check(matches(withFabBackgroundFill(normal)))
-                .perform(setSelected(false))
-                .check(matches(withFabBackgroundFill(notSelected)))
-                .perform(setSelected(true))
-                .check(matches(withFabBackgroundFill(normal)));
-    }
-
-    @SmallTest
-    @Test
-    public void testDeclaredStatefulTintAcrossStateChanges() {
-        final Activity activity = mActivityTestRule.getActivity();
-        final int normal = ContextCompat.getColor(activity, R.color.sand_default);
-        final int disabled = ContextCompat.getColor(activity, R.color.sand_disabled);
-
-        // Assert that the background is tinted correctly across state changes
-        onView(withId(R.id.fab_state_tint))
-                .perform(setSelected(true))
-                .check(matches(withFabBackgroundFill(normal)))
-                .perform(setSelected(false))
-                .check(matches(withFabBackgroundFill(disabled)));
-    }
-
-    @SmallTest
-    @Test
-    public void setVectorDrawableSrc() {
-        onView(withId(R.id.fab_standard))
-                .perform(setImageResource(R.drawable.vector_icon));
-    }
-
-    @SmallTest
-    @Test
-    public void testSetMiniSize() {
-        final int miniSize = mActivityTestRule.getActivity().getResources()
-                .getDimensionPixelSize(R.dimen.fab_mini_height);
-
-        onView(withId(R.id.fab_standard))
-                .perform(setSize(FloatingActionButton.SIZE_MINI))
-                .check(matches(withFabContentHeight(miniSize)));
-    }
-
-    @SmallTest
-    @Test
-    public void testSetSizeToggle() {
-        final int miniSize = mActivityTestRule.getActivity().getResources()
-                .getDimensionPixelSize(R.dimen.fab_mini_height);
-        final int normalSize = mActivityTestRule.getActivity().getResources()
-                .getDimensionPixelSize(R.dimen.fab_normal_height);
-
-        onView(withId(R.id.fab_standard))
-                .perform(setSize(FloatingActionButton.SIZE_MINI))
-                .check(matches(withFabContentHeight(miniSize)));
-
-        onView(withId(R.id.fab_standard))
-                .perform(setSize(FloatingActionButton.SIZE_NORMAL))
-                .check(matches(withFabContentHeight(normalSize)));
-    }
-
-    @SmallTest
-    @Test
-    public void testOffset() {
-        onView(withId(R.id.fab_standard))
-                .perform(setLayoutGravity(Gravity.LEFT | Gravity.TOP))
-                .check(matches(withFabContentAreaOnMargins(Gravity.LEFT | Gravity.TOP)));
-
-        onView(withId(R.id.fab_standard))
-                .perform(setLayoutGravity(Gravity.RIGHT | Gravity.BOTTOM))
-                .check(matches(withFabContentAreaOnMargins(Gravity.RIGHT | Gravity.BOTTOM)));
-    }
-
-    @SmallTest
-    @Test
-    public void testHideShow() {
-        onView(withId(R.id.fab_standard))
-                .perform(setVisibility(View.VISIBLE))
-                .perform(hideThenShow(FloatingActionButtonImpl.SHOW_HIDE_ANIM_DURATION))
-                .check(matches(isDisplayed()));
-    }
-
-    @MediumTest
-    @Test
-    public void testShowHide() {
-        onView(withId(R.id.fab_standard))
-                .perform(setVisibility(View.GONE))
-                .perform(showThenHide(FloatingActionButtonImpl.SHOW_HIDE_ANIM_DURATION))
-                .check(matches(not(isDisplayed())));
-    }
-
-    @LargeTest
-    @Test
-    public void testClickableTouchAndDragOffView() {
-        onView(withId(R.id.fab_standard))
-                .perform(setClickable(true))
-                .perform(new GeneralSwipeAction(
-                        Swipe.SLOW,
-                        new CoordinatesProvider() {
-                            @Override
-                            public float[] calculateCoordinates(View view) {
-                                // Create coordinators that in the center of the FAB's content area
-                                final FloatingActionButton fab = (FloatingActionButton) view;
-
-                                final int[] xy = new int[2];
-                                fab.getLocationOnScreen(xy);
-                                final Rect rect = new Rect();
-                                fab.getContentRect(rect);
-
-                                return new float[] {
-                                        xy[0] + rect.centerX(),
-                                        xy[1] + rect.centerY()
-                                };
-                            }
-                        },
-                        new CoordinatesProvider() {
-                            @Override
-                            public float[] calculateCoordinates(View view) {
-                                // Create coordinators that in the center horizontally, but well
-                                // below the view vertically (by 50% of the height)
-                                final int[] xy = new int[2];
-                                view.getLocationOnScreen(xy);
-
-                                return new float[]{
-                                        xy[0] + (view.getWidth() / 2f),
-                                        xy[1] + (view.getHeight() * 1.5f)
-                                };
-                            }
-                        },
-                        Press.FINGER))
-                .check(matches(not(isPressed())));
-    }
-
-    @MediumTest
-    @Test
-    public void testOnClickListener() {
-        final View.OnClickListener listener = mock(View.OnClickListener.class);
-        final View view = mActivityTestRule.getActivity().findViewById(R.id.fab_standard);
-        view.setOnClickListener(listener);
-
-        // Click on the fab
-        onView(withId(R.id.fab_standard)).perform(click());
-
-        // And verify that the listener was invoked once
-        verify(listener, times(1)).onClick(view);
-    }
-
-    @SmallTest
-    @Test
-    public void testSetCompatElevation() {
-        onView(withId(R.id.fab_standard))
-                .perform(setEnabled(false))
-                .perform(setCompatElevation(0));
-
-        onView(withId(R.id.fab_standard))
-                .perform(setEnabled(true))
-                .perform(setCompatElevation(8));
-    }
-
-    @SmallTest
-    @Test
-    public void testSetCustomSize() {
-        onView(withId(R.id.fab_standard))
-                .perform(setCustomSize(10))
-                .check(matches(withFabCustomSize(10)));
-
-        onView(withId(R.id.fab_standard))
-                .perform(setCustomSize(20))
-                .check(matches(withFabCustomSize(20)));
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/NavigationTestView.java b/design/tests/src/android/support/design/widget/NavigationTestView.java
deleted file mode 100644
index af3d69e..0000000
--- a/design/tests/src/android/support/design/widget/NavigationTestView.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.content.Context;
-import android.support.v4.view.WindowInsetsCompat;
-import android.util.AttributeSet;
-
-/**
- * Expose hasSystemWindowInsets() for testing.
- */
-public class NavigationTestView extends NavigationView {
-
-    boolean mHashSystemWindowInsets;
-
-    public NavigationTestView(Context context) {
-        this(context, null);
-    }
-
-    public NavigationTestView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public NavigationTestView(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-    }
-
-    @Override
-    protected void onInsetsChanged(WindowInsetsCompat insets) {
-        super.onInsetsChanged(insets);
-        mHashSystemWindowInsets = insets.hasSystemWindowInsets();
-    }
-
-    public boolean hasSystemWindowInsets() {
-        return mHashSystemWindowInsets;
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/NavigationViewActivity.java b/design/tests/src/android/support/design/widget/NavigationViewActivity.java
deleted file mode 100644
index c3e810c..0000000
--- a/design/tests/src/android/support/design/widget/NavigationViewActivity.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-
-public class NavigationViewActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.design_navigation_view;
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/NavigationViewTest.java b/design/tests/src/android/support/design/widget/NavigationViewTest.java
deleted file mode 100755
index 5ac3580..0000000
--- a/design/tests/src/android/support/design/widget/NavigationViewTest.java
+++ /dev/null
@@ -1,651 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static android.support.design.testutils.DrawerLayoutActions.closeDrawer;
-import static android.support.design.testutils.DrawerLayoutActions.openDrawer;
-import static android.support.design.testutils.NavigationViewActions.addHeaderView;
-import static android.support.design.testutils.NavigationViewActions.inflateHeaderView;
-import static android.support.design.testutils.NavigationViewActions.removeHeaderView;
-import static android.support.design.testutils.NavigationViewActions.removeMenuItem;
-import static android.support.design.testutils.NavigationViewActions.setCheckedItem;
-import static android.support.design.testutils.NavigationViewActions.setIconForMenuItem;
-import static android.support.design.testutils.NavigationViewActions.setItemBackground;
-import static android.support.design.testutils.NavigationViewActions.setItemBackgroundResource;
-import static android.support.design.testutils.NavigationViewActions.setItemIconTintList;
-import static android.support.design.testutils.NavigationViewActions.setItemTextAppearance;
-import static android.support.design.testutils.NavigationViewActions.setItemTextColor;
-import static android.support.design.testutils.TestUtilsActions.reinflateMenu;
-import static android.support.design.testutils.TestUtilsActions.restoreHierarchyState;
-import static android.support.design.testutils.TestUtilsMatchers.isActionViewOf;
-import static android.support.design.testutils.TestUtilsMatchers.isChildOfA;
-import static android.support.design.testutils.TestUtilsMatchers.withBackgroundFill;
-import static android.support.design.testutils.TestUtilsMatchers.withStartDrawableFilledWith;
-import static android.support.design.testutils.TestUtilsMatchers.withTextColor;
-import static android.support.design.testutils.TestUtilsMatchers.withTextSize;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.Visibility;
-import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
-import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
-import static android.support.test.espresso.matcher.ViewMatchers.isChecked;
-import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.isNotChecked;
-import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-
-import static org.hamcrest.core.AllOf.allOf;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-import android.content.res.Resources;
-import android.os.Build;
-import android.os.Parcelable;
-import android.support.annotation.ColorInt;
-import android.support.annotation.IdRes;
-import android.support.design.test.R;
-import android.support.design.testutils.TestDrawable;
-import android.support.test.filters.LargeTest;
-import android.support.v4.content.res.ResourcesCompat;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.widget.DrawerLayout;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.SwitchCompat;
-import android.util.SparseArray;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.TextView;
-
-import org.hamcrest.Matcher;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-@LargeTest
-public class NavigationViewTest
-        extends BaseInstrumentationTestCase<NavigationViewActivity> {
-    private static final int[] MENU_CONTENT_ITEM_IDS = { R.id.destination_home,
-            R.id.destination_profile, R.id.destination_people, R.id.destination_settings };
-    private Map<Integer, String> mMenuStringContent;
-
-    private DrawerLayout mDrawerLayout;
-
-    private NavigationTestView mNavigationView;
-
-    public NavigationViewTest() {
-        super(NavigationViewActivity.class);
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        final NavigationViewActivity activity = mActivityTestRule.getActivity();
-        mDrawerLayout = (DrawerLayout) activity.findViewById(R.id.drawer_layout);
-        mNavigationView = (NavigationTestView) mDrawerLayout.findViewById(R.id.start_drawer);
-
-        // Close the drawer to reset the state for the next test
-        onView(withId(R.id.drawer_layout)).perform(closeDrawer(GravityCompat.START));
-
-        final Resources res = activity.getResources();
-        mMenuStringContent = new HashMap<>(MENU_CONTENT_ITEM_IDS.length);
-        mMenuStringContent.put(R.id.destination_home, res.getString(R.string.navigate_home));
-        mMenuStringContent.put(R.id.destination_profile, res.getString(R.string.navigate_profile));
-        mMenuStringContent.put(R.id.destination_people, res.getString(R.string.navigate_people));
-        mMenuStringContent.put(R.id.destination_settings,
-                res.getString(R.string.navigate_settings));
-    }
-
-    @Test
-    public void testBasics() {
-        // Open our drawer
-        onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START));
-
-        // Check the contents of the Menu object
-        final Menu menu = mNavigationView.getMenu();
-        assertNotNull("Menu should not be null", menu);
-        assertEquals("Should have matching number of items", MENU_CONTENT_ITEM_IDS.length + 1,
-                menu.size());
-        for (int i = 0; i < MENU_CONTENT_ITEM_IDS.length; i++) {
-            final MenuItem currItem = menu.getItem(i);
-            assertEquals("ID for Item #" + i, MENU_CONTENT_ITEM_IDS[i], currItem.getItemId());
-        }
-
-        // Check that we have the expected menu items in our NavigationView
-        for (int i = 0; i < MENU_CONTENT_ITEM_IDS.length; i++) {
-            onView(allOf(withText(mMenuStringContent.get(MENU_CONTENT_ITEM_IDS[i])),
-                    isDescendantOfA(withId(R.id.start_drawer)))).check(matches(isDisplayed()));
-        }
-    }
-
-    @Test
-    public void testWillNotDraw() {
-        // Open our drawer
-        onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START));
-
-        if (Build.VERSION.SDK_INT >= 21) {
-            if (mNavigationView.hasSystemWindowInsets()) {
-                assertFalse(mNavigationView.willNotDraw());
-            } else {
-                assertTrue(mNavigationView.willNotDraw());
-            }
-        } else {
-            assertTrue(mNavigationView.willNotDraw());
-        }
-    }
-
-    @Test
-    public void testTextAppearance() {
-        // Open our drawer
-        onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START));
-
-        final Resources res = mActivityTestRule.getActivity().getResources();
-        final int defaultTextSize = res.getDimensionPixelSize(R.dimen.text_medium_size);
-
-        // Check the default style of the menu items in our NavigationView
-        for (int i = 0; i < MENU_CONTENT_ITEM_IDS.length; i++) {
-            onView(allOf(withText(mMenuStringContent.get(MENU_CONTENT_ITEM_IDS[i])),
-                    isDescendantOfA(withId(R.id.start_drawer)))).check(
-                    matches(withTextSize(defaultTextSize)));
-        }
-
-        // Set a new text appearance on our NavigationView
-        onView(withId(R.id.start_drawer)).perform(setItemTextAppearance(R.style.TextSmallStyle));
-
-        // And check that all the menu items have the new style
-        final int newTextSize = res.getDimensionPixelSize(R.dimen.text_small_size);
-        for (int i = 0; i < MENU_CONTENT_ITEM_IDS.length; i++) {
-            onView(allOf(withText(mMenuStringContent.get(MENU_CONTENT_ITEM_IDS[i])),
-                    isDescendantOfA(withId(R.id.start_drawer)))).check(
-                    matches(withTextSize(newTextSize)));
-        }
-    }
-
-    @Test
-    public void testTextColor() {
-        // Open our drawer
-        onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START));
-
-        final Resources res = mActivityTestRule.getActivity().getResources();
-        final @ColorInt int defaultTextColor = ResourcesCompat.getColor(res,
-                R.color.emerald_text, null);
-
-        // Check the default text color of the menu items in our NavigationView
-        for (int i = 0; i < MENU_CONTENT_ITEM_IDS.length; i++) {
-            onView(allOf(withText(mMenuStringContent.get(MENU_CONTENT_ITEM_IDS[i])),
-                    isDescendantOfA(withId(R.id.start_drawer)))).check(
-                    matches(withTextColor(defaultTextColor)));
-        }
-
-        // Set a new text color on our NavigationView
-        onView(withId(R.id.start_drawer)).perform(setItemTextColor(
-                ResourcesCompat.getColorStateList(res, R.color.color_state_list_lilac, null)));
-
-        // And check that all the menu items have the new color
-        final @ColorInt int newTextColor = ResourcesCompat.getColor(res,
-                R.color.lilac_default, null);
-        for (int i = 0; i < MENU_CONTENT_ITEM_IDS.length; i++) {
-            onView(allOf(withText(mMenuStringContent.get(MENU_CONTENT_ITEM_IDS[i])),
-                    isDescendantOfA(withId(R.id.start_drawer)))).check(
-                    matches(withTextColor(newTextColor)));
-        }
-    }
-
-    @Test
-    public void testBackground() {
-        // Open our drawer
-        onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START));
-
-        final Resources res = mActivityTestRule.getActivity().getResources();
-        final @ColorInt int defaultFillColor = ResourcesCompat.getColor(res,
-                R.color.sand_default, null);
-
-        // Check the default fill color of the menu items in our NavigationView
-        for (int i = 0; i < MENU_CONTENT_ITEM_IDS.length; i++) {
-            // Note that here we're tying ourselves to the implementation details of the
-            // internal structure of the NavigationView. Specifically, we're looking at the
-            // direct child of RecyclerView which is expected to have the background set
-            // on it. If the internal implementation of NavigationView changes, the second
-            // Matcher below will need to be tweaked.
-            Matcher menuItemMatcher = allOf(
-                    hasDescendant(withText(mMenuStringContent.get(MENU_CONTENT_ITEM_IDS[i]))),
-                    isChildOfA(isAssignableFrom(RecyclerView.class)),
-                    isDescendantOfA(withId(R.id.start_drawer)));
-
-            onView(menuItemMatcher).check(matches(withBackgroundFill(defaultFillColor)));
-        }
-
-        // Set a new background (flat fill color) on our NavigationView
-        onView(withId(R.id.start_drawer)).perform(setItemBackgroundResource(
-                R.drawable.test_background_blue));
-
-        // And check that all the menu items have the new fill
-        final @ColorInt int newFillColorBlue = ResourcesCompat.getColor(res,
-                R.color.test_blue, null);
-        for (int i = 0; i < MENU_CONTENT_ITEM_IDS.length; i++) {
-            Matcher menuItemMatcher = allOf(
-                    hasDescendant(withText(mMenuStringContent.get(MENU_CONTENT_ITEM_IDS[i]))),
-                    isChildOfA(isAssignableFrom(RecyclerView.class)),
-                    isDescendantOfA(withId(R.id.start_drawer)));
-
-            onView(menuItemMatcher).check(matches(withBackgroundFill(newFillColorBlue)));
-        }
-
-        // Set another new background on our NavigationView
-        onView(withId(R.id.start_drawer)).perform(setItemBackground(
-                ResourcesCompat.getDrawable(res, R.drawable.test_background_green, null)));
-
-        // And check that all the menu items have the new fill
-        final @ColorInt int newFillColorGreen = ResourcesCompat.getColor(res,
-                R.color.test_green, null);
-        for (int i = 0; i < MENU_CONTENT_ITEM_IDS.length; i++) {
-            Matcher menuItemMatcher = allOf(
-                    hasDescendant(withText(mMenuStringContent.get(MENU_CONTENT_ITEM_IDS[i]))),
-                    isChildOfA(isAssignableFrom(RecyclerView.class)),
-                    isDescendantOfA(withId(R.id.start_drawer)));
-
-            onView(menuItemMatcher).check(matches(withBackgroundFill(newFillColorGreen)));
-        }
-    }
-
-    @Test
-    public void testIconTinting() {
-        // Open our drawer
-        onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START));
-
-        final Resources res = mActivityTestRule.getActivity().getResources();
-        final @ColorInt int redFill = ResourcesCompat.getColor(res, R.color.test_red, null);
-        final @ColorInt int greenFill = ResourcesCompat.getColor(res, R.color.test_green, null);
-        final @ColorInt int blueFill = ResourcesCompat.getColor(res, R.color.test_blue, null);
-        final int iconSize = res.getDimensionPixelSize(R.dimen.drawable_small_size);
-        onView(withId(R.id.start_drawer)).perform(setIconForMenuItem(R.id.destination_home,
-                new TestDrawable(redFill, iconSize, iconSize)));
-        onView(withId(R.id.start_drawer)).perform(setIconForMenuItem(R.id.destination_profile,
-                new TestDrawable(greenFill, iconSize, iconSize)));
-        onView(withId(R.id.start_drawer)).perform(setIconForMenuItem(R.id.destination_people,
-                new TestDrawable(blueFill, iconSize, iconSize)));
-
-        final @ColorInt int defaultTintColor = ResourcesCompat.getColor(res,
-                R.color.emerald_translucent, null);
-
-        // We're allowing a margin of error in checking the color of the items' icons.
-        // This is due to the translucent color being used in the icon tinting
-        // and off-by-one discrepancies of SRC_IN when it's compositing
-        // translucent color. Note that all the checks below are written for the current
-        // logic on NavigationView that uses the default SRC_IN tint mode - effectively
-        // replacing all non-transparent pixels in the destination (original icon) with
-        // our translucent tint color.
-        final int allowedComponentVariance = 1;
-
-        // Note that here we're tying ourselves to the implementation details of the
-        // internal structure of the NavigationView. Specifically, we're checking the
-        // start drawable of the text view with the specific text. If the internal
-        // implementation of NavigationView changes, the second Matcher in the lookups
-        // below will need to be tweaked.
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_home)),
-                isDescendantOfA(withId(R.id.start_drawer)))).check(matches(
-                    withStartDrawableFilledWith(defaultTintColor, allowedComponentVariance)));
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_profile)),
-                isDescendantOfA(withId(R.id.start_drawer)))).check(matches(
-                    withStartDrawableFilledWith(defaultTintColor, allowedComponentVariance)));
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_people)),
-                isDescendantOfA(withId(R.id.start_drawer)))).check(matches(
-                    withStartDrawableFilledWith(defaultTintColor, allowedComponentVariance)));
-
-        final @ColorInt int newTintColor = ResourcesCompat.getColor(res,
-                R.color.red_translucent, null);
-
-        onView(withId(R.id.start_drawer)).perform(setItemIconTintList(
-                ResourcesCompat.getColorStateList(res, R.color.color_state_list_red_translucent,
-                        null)));
-        // Check that all menu items with icons now have icons tinted with the newly set color
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_home)),
-                isDescendantOfA(withId(R.id.start_drawer)))).check(matches(
-                    withStartDrawableFilledWith(newTintColor, allowedComponentVariance)));
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_profile)),
-                isDescendantOfA(withId(R.id.start_drawer)))).check(matches(
-                    withStartDrawableFilledWith(newTintColor, allowedComponentVariance)));
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_people)),
-                isDescendantOfA(withId(R.id.start_drawer)))).check(matches(
-                    withStartDrawableFilledWith(newTintColor, allowedComponentVariance)));
-
-        // And now remove all icon tinting
-        onView(withId(R.id.start_drawer)).perform(setItemIconTintList(null));
-        // And verify that all menu items with icons now have the original colors for their icons.
-        // Note that since there is no tinting at this point, we don't allow any color variance
-        // in these checks.
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_home)),
-                isDescendantOfA(withId(R.id.start_drawer)))).check(matches(
-                    withStartDrawableFilledWith(redFill, 0)));
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_profile)),
-                isDescendantOfA(withId(R.id.start_drawer)))).check(matches(
-                    withStartDrawableFilledWith(greenFill, 0)));
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_people)),
-                isDescendantOfA(withId(R.id.start_drawer)))).check(matches(
-                    withStartDrawableFilledWith(blueFill, 0)));
-    }
-
-    /**
-     * Gets the list of header IDs (which can be empty) and verifies that the actual header content
-     * of our navigation view matches the expected header content.
-     */
-    private void verifyHeaders(@IdRes int ... expectedHeaderIds) {
-        final int expectedHeaderCount = (expectedHeaderIds != null) ? expectedHeaderIds.length : 0;
-        final int actualHeaderCount = mNavigationView.getHeaderCount();
-        assertEquals("Header count", expectedHeaderCount, actualHeaderCount);
-
-        if (expectedHeaderCount > 0) {
-            for (int i = 0; i < expectedHeaderCount; i++) {
-                final View currentHeader = mNavigationView.getHeaderView(i);
-                assertEquals("Header at #" + i, expectedHeaderIds[i], currentHeader.getId());
-            }
-        }
-    }
-
-    @Test
-    public void testHeaders() {
-        // Open our drawer
-        onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START));
-
-        // We should have no headers at the start
-        verifyHeaders();
-
-        // Inflate one header and check that it's there in the navigation view
-        onView(withId(R.id.start_drawer)).perform(
-                inflateHeaderView(R.layout.design_navigation_view_header1));
-        verifyHeaders(R.id.header1);
-
-        final LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
-
-        // Add one more header and check that it's there in the navigation view
-        onView(withId(R.id.start_drawer)).perform(
-                addHeaderView(inflater, R.layout.design_navigation_view_header2));
-        verifyHeaders(R.id.header1, R.id.header2);
-
-        final View header1 = mNavigationView.findViewById(R.id.header1);
-        // Remove the first header and check that we still have the second header
-        onView(withId(R.id.start_drawer)).perform(removeHeaderView(header1));
-        verifyHeaders(R.id.header2);
-
-        // Add one more header and check that we now have two headers
-        onView(withId(R.id.start_drawer)).perform(
-                inflateHeaderView(R.layout.design_navigation_view_header3));
-        verifyHeaders(R.id.header2, R.id.header3);
-
-        // Add another "copy" of the header from the just-added layout and check that we now
-        // have three headers
-        onView(withId(R.id.start_drawer)).perform(
-                addHeaderView(inflater, R.layout.design_navigation_view_header3));
-        verifyHeaders(R.id.header2, R.id.header3, R.id.header3);
-    }
-
-    @Test
-    public void testHeaderState() {
-        // Open our drawer
-        onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START));
-
-        // Inflate a header with a toggle switch and check that it's there in the navigation view
-        onView(withId(R.id.start_drawer)).perform(
-                inflateHeaderView(R.layout.design_navigation_view_header_switch));
-        verifyHeaders(R.id.header_frame);
-
-        onView(withId(R.id.header_toggle))
-                .check(matches(isNotChecked()))
-                .perform(click())
-                .check(matches(isChecked()));
-
-        // Save the current state
-        SparseArray<Parcelable> container = new SparseArray<>();
-        mNavigationView.saveHierarchyState(container);
-
-        // Remove the header
-        final View header = mNavigationView.findViewById(R.id.header_frame);
-        onView(withId(R.id.start_drawer)).perform(removeHeaderView(header));
-        verifyHeaders();
-
-        // Inflate the header again
-        onView(withId(R.id.start_drawer)).perform(
-                inflateHeaderView(R.layout.design_navigation_view_header_switch));
-        verifyHeaders(R.id.header_frame);
-
-        // Restore the saved state
-        onView(withId(R.id.start_drawer)).perform(
-                restoreHierarchyState(container));
-
-        // Confirm that the state was restored
-        onView(withId(R.id.header_toggle))
-                .check(matches(isChecked()));
-    }
-
-    @Test
-    public void testActionViewState() {
-        // Open our drawer
-        onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START));
-
-        final Menu menu = mNavigationView.getMenu();
-        onView(isActionViewOf(menu, R.id.destination_people))
-                .check(matches(isNotChecked())) // Not checked by default
-                .perform(click())               // Check it
-                .check(matches(isChecked()));
-
-        // Remove the other action view to simulate the case where it is not yet inflated
-        onView(isActionViewOf(menu, R.id.destination_custom))
-                .check(matches(isDisplayed()));
-        onView(withId(R.id.start_drawer))
-                .perform(removeMenuItem(R.id.destination_custom));
-
-        // Save the current state
-        SparseArray<Parcelable> container = new SparseArray<>();
-        mNavigationView.saveHierarchyState(container);
-
-        // Restore the saved state
-        onView(withId(R.id.start_drawer))
-                .perform(reinflateMenu(R.menu.navigation_view_content))
-                .perform(restoreHierarchyState(container));
-
-        // Checked state should be restored
-        onView(isActionViewOf(menu, R.id.destination_people))
-                .check(matches(isChecked()));
-    }
-
-    @Test
-    public void testNavigationSelectionListener() {
-        // Open our drawer
-        onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START));
-
-        // Click one of our items
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_people)),
-                isDescendantOfA(withId(R.id.start_drawer)))).perform(click());
-        // Check that the drawer is still open
-        assertTrue("Drawer is still open after click",
-                mDrawerLayout.isDrawerOpen(GravityCompat.START));
-
-        // Register a listener
-        NavigationView.OnNavigationItemSelectedListener mockedListener =
-                mock(NavigationView.OnNavigationItemSelectedListener.class);
-        mNavigationView.setNavigationItemSelectedListener(mockedListener);
-
-        // Click one of our items
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_profile)),
-                isDescendantOfA(withId(R.id.start_drawer)))).perform(click());
-        // Check that the drawer is still open
-        assertTrue("Drawer is still open after click",
-                mDrawerLayout.isDrawerOpen(GravityCompat.START));
-        // And that our listener has been notified of the click
-        verify(mockedListener, times(1)).onNavigationItemSelected(
-                mNavigationView.getMenu().findItem(R.id.destination_profile));
-
-        // Set null listener to test that the next click is not going to notify the
-        // previously set listener
-        mNavigationView.setNavigationItemSelectedListener(null);
-
-        // Click one of our items
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_settings)),
-                isDescendantOfA(withId(R.id.start_drawer)))).perform(click());
-        // Check that the drawer is still open
-        assertTrue("Drawer is still open after click",
-                mDrawerLayout.isDrawerOpen(GravityCompat.START));
-        // And that our previous listener has not been notified of the click
-        verifyNoMoreInteractions(mockedListener);
-    }
-
-    private void verifyCheckedAppearance(@IdRes int checkedItemId,
-            @ColorInt int uncheckedItemForeground, @ColorInt int checkedItemForeground,
-            @ColorInt int uncheckedItemBackground, @ColorInt int checkedItemBackground) {
-        for (int i = 0; i < MENU_CONTENT_ITEM_IDS.length; i++) {
-            final boolean expectedToBeChecked = (MENU_CONTENT_ITEM_IDS[i] == checkedItemId);
-            final @ColorInt int expectedItemForeground =
-                    expectedToBeChecked ? checkedItemForeground : uncheckedItemForeground;
-            final @ColorInt int expectedItemBackground =
-                    expectedToBeChecked ? checkedItemBackground : uncheckedItemBackground;
-
-            // For the background fill check we need to select a view that has its background
-            // set by the current implementation (see disclaimer in testBackground)
-            Matcher menuItemMatcher = allOf(
-                    hasDescendant(withText(mMenuStringContent.get(MENU_CONTENT_ITEM_IDS[i]))),
-                    isChildOfA(isAssignableFrom(RecyclerView.class)),
-                    isDescendantOfA(withId(R.id.start_drawer)));
-            onView(menuItemMatcher).check(matches(withBackgroundFill(expectedItemBackground)));
-
-            // And for the foreground color check we need to select a view with the text content
-            Matcher menuItemTextMatcher = allOf(
-                    withText(mMenuStringContent.get(MENU_CONTENT_ITEM_IDS[i])),
-                    isDescendantOfA(withId(R.id.start_drawer)));
-            onView(menuItemTextMatcher).check(matches(withTextColor(expectedItemForeground)));
-        }
-    }
-
-    @Test
-    public void testCheckedAppearance() {
-        // Open our drawer
-        onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START));
-
-        // Reconfigure our navigation view to use foreground (text) and background visuals
-        // with explicitly different colors for the checked state
-        final Resources res = mActivityTestRule.getActivity().getResources();
-        onView(withId(R.id.start_drawer)).perform(setItemTextColor(
-                ResourcesCompat.getColorStateList(res, R.color.color_state_list_sand, null)));
-        onView(withId(R.id.start_drawer)).perform(setItemBackgroundResource(
-                R.drawable.test_drawable_state_list));
-
-        final @ColorInt int uncheckedItemForeground = ResourcesCompat.getColor(res,
-                R.color.sand_default, null);
-        final @ColorInt int checkedItemForeground = ResourcesCompat.getColor(res,
-                R.color.sand_checked, null);
-        final @ColorInt int uncheckedItemBackground = ResourcesCompat.getColor(res,
-                R.color.test_green, null);
-        final @ColorInt int checkedItemBackground = ResourcesCompat.getColor(res,
-                R.color.test_blue, null);
-
-        // Verify that all items are rendered with unchecked visuals
-        verifyCheckedAppearance(0, uncheckedItemForeground, checkedItemForeground,
-                uncheckedItemBackground, checkedItemBackground);
-
-        // Mark one of the items as checked
-        onView(withId(R.id.start_drawer)).perform(setCheckedItem(R.id.destination_profile));
-        // And verify that it's now rendered with checked visuals
-        verifyCheckedAppearance(R.id.destination_profile,
-                uncheckedItemForeground, checkedItemForeground,
-                uncheckedItemBackground, checkedItemBackground);
-
-        // Register a navigation listener that "marks" the selected item
-        mNavigationView.setNavigationItemSelectedListener(
-                new NavigationView.OnNavigationItemSelectedListener() {
-                    @Override
-                    public boolean onNavigationItemSelected(MenuItem item) {
-                        return true;
-                    }
-                });
-
-        // Click one of our items
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_people)),
-                isDescendantOfA(withId(R.id.start_drawer)))).perform(click());
-        // and verify that it's now checked
-        verifyCheckedAppearance(R.id.destination_people,
-                uncheckedItemForeground, checkedItemForeground,
-                uncheckedItemBackground, checkedItemBackground);
-
-        // Register a navigation listener that doesn't "mark" the selected item
-        mNavigationView.setNavigationItemSelectedListener(
-                new NavigationView.OnNavigationItemSelectedListener() {
-                    @Override
-                    public boolean onNavigationItemSelected(MenuItem item) {
-                        return false;
-                    }
-                });
-
-        // Click another items
-        onView(allOf(withText(mMenuStringContent.get(R.id.destination_settings)),
-                isDescendantOfA(withId(R.id.start_drawer)))).perform(click());
-        // and verify that the checked state remains on the previously clicked item
-        // since the current navigation listener returns false from its callback
-        // implementation
-        verifyCheckedAppearance(R.id.destination_people,
-                uncheckedItemForeground, checkedItemForeground,
-                uncheckedItemBackground, checkedItemBackground);
-    }
-
-    @Test
-    public void testActionLayout() {
-        // Open our drawer
-        onView(withId(R.id.drawer_layout)).perform(openDrawer(GravityCompat.START));
-
-        // There are four conditions to "find" the menu item with action layout (switch):
-        // 1. Is in the NavigationView
-        // 2. Is direct child of a class that extends RecyclerView
-        // 3. Has a child with "people" text
-        // 4. Has fully displayed child that extends SwitchCompat
-        // Note that condition 2 makes a certain assumption about the internal implementation
-        // details of the NavigationMenu, while conditions 3 and 4 aim to be as generic as
-        // possible and to not rely on the internal details of the current layout implementation
-        // of an individual menu item in NavigationMenu.
-        Matcher menuItemMatcher = allOf(
-                isDescendantOfA(withId(R.id.start_drawer)),
-                isChildOfA(isAssignableFrom(RecyclerView.class)),
-                hasDescendant(withText(mMenuStringContent.get(R.id.destination_people))),
-                hasDescendant(allOf(
-                        isAssignableFrom(SwitchCompat.class),
-                        isCompletelyDisplayed())));
-
-        // While we don't need to perform any action on our row, the invocation of perform()
-        // makes our matcher actually run. If for some reason NavigationView fails to inflate and
-        // display our SwitchCompat action layout, the next line will fail in the matcher pass.
-        onView(menuItemMatcher).perform(click());
-
-        // Check that the full custom view is displayed without title and icon.
-        final Resources res = mActivityTestRule.getActivity().getResources();
-        Matcher customItemMatcher = allOf(
-                isDescendantOfA(withId(R.id.start_drawer)),
-                isChildOfA(isAssignableFrom(RecyclerView.class)),
-                hasDescendant(withText(res.getString(R.string.navigate_custom))),
-                hasDescendant(allOf(
-                        isAssignableFrom(TextView.class),
-                        withEffectiveVisibility(Visibility.GONE))));
-        onView(customItemMatcher).perform(click());
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/SnackbarActivity.java b/design/tests/src/android/support/design/widget/SnackbarActivity.java
deleted file mode 100644
index 5d8e118..0000000
--- a/design/tests/src/android/support/design/widget/SnackbarActivity.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-
-public class SnackbarActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.test_design_snackbar;
-    }
-}
\ No newline at end of file
diff --git a/design/tests/src/android/support/design/widget/SnackbarActivityWithFAB.java b/design/tests/src/android/support/design/widget/SnackbarActivityWithFAB.java
deleted file mode 100644
index 817af4b..0000000
--- a/design/tests/src/android/support/design/widget/SnackbarActivityWithFAB.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-
-public class SnackbarActivityWithFAB extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.test_design_snackbar_fab;
-    }
-}
\ No newline at end of file
diff --git a/design/tests/src/android/support/design/widget/SnackbarActivityWithTranslucentNavBar.java b/design/tests/src/android/support/design/widget/SnackbarActivityWithTranslucentNavBar.java
deleted file mode 100644
index 7ccf69c..0000000
--- a/design/tests/src/android/support/design/widget/SnackbarActivityWithTranslucentNavBar.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-
-public class SnackbarActivityWithTranslucentNavBar extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.test_design_snackbar;
-    }
-}
\ No newline at end of file
diff --git a/design/tests/src/android/support/design/widget/SnackbarTest.java b/design/tests/src/android/support/design/widget/SnackbarTest.java
deleted file mode 100644
index 0d0a891..0000000
--- a/design/tests/src/android/support/design/widget/SnackbarTest.java
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static android.support.design.testutils.TestUtilsActions.setLayoutDirection;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.action.ViewActions.swipeLeft;
-import static android.support.test.espresso.action.ViewActions.swipeRight;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
-import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-
-import static org.hamcrest.core.AllOf.allOf;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-import android.content.res.Resources;
-import android.support.annotation.Nullable;
-import android.support.annotation.StringRes;
-import android.support.design.test.R;
-import android.support.design.testutils.SnackbarUtils;
-import android.support.test.espresso.ViewAction;
-import android.support.test.espresso.ViewInteraction;
-import android.support.test.espresso.action.CoordinatesProvider;
-import android.support.test.espresso.action.GeneralSwipeAction;
-import android.support.test.espresso.action.Press;
-import android.support.test.espresso.action.Swipe;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.MediumTest;
-import android.support.v4.view.ViewCompat;
-import android.text.TextUtils;
-import android.view.View;
-
-import org.junit.Before;
-import org.junit.Test;
-
-@MediumTest
-public class SnackbarTest extends BaseInstrumentationTestCase<SnackbarActivity> {
-    private static final String MESSAGE_TEXT = "Test Message";
-    private static final @StringRes int MESSAGE_ID = R.string.snackbar_text;
-    private static final String ACTION_TEXT = "Action";
-    private static final @StringRes int ACTION_ID = R.string.snackbar_action;
-
-    private CoordinatorLayout mCoordinatorLayout;
-
-    private interface DismissAction {
-        void dismiss(Snackbar snackbar);
-    }
-
-    public SnackbarTest() {
-        super(SnackbarActivity.class);
-    }
-
-    @Before
-    public void setup() {
-        mCoordinatorLayout =
-                (CoordinatorLayout) mActivityTestRule.getActivity().findViewById(R.id.col);
-    }
-
-    private void verifySnackbarContent(final Snackbar snackbar, final String expectedMessage,
-            final String expectedAction) throws Throwable {
-        // Show the snackbar
-        SnackbarUtils.showTransientBottomBarAndWaitUntilFullyShown(snackbar);
-
-        // Verify that we're showing the message
-        withText(expectedMessage).matches(allOf(
-                isDescendantOfA(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                isCompletelyDisplayed()));
-
-        // If the action is not empty, verify that we're showing it
-        if (!TextUtils.isEmpty(expectedAction)) {
-            withText(expectedAction).matches(allOf(
-                    isDescendantOfA(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                    isCompletelyDisplayed()));
-        }
-
-        // Dismiss the snackbar
-        SnackbarUtils.dismissTransientBottomBarAndWaitUntilFullyDismissed(snackbar);
-    }
-
-    @LargeTest
-    @Test
-    public void testBasicContent() throws Throwable {
-        // Verify different combinations of snackbar content (message and action) and duration
-
-        final Resources res = mActivityTestRule.getActivity().getResources();
-        final String resolvedMessage = res.getString(MESSAGE_ID);
-        final String resolvedAction = res.getString(ACTION_ID);
-
-        // String message and no action
-        verifySnackbarContent(
-                Snackbar.make(mCoordinatorLayout, MESSAGE_TEXT, Snackbar.LENGTH_SHORT),
-                MESSAGE_TEXT, null);
-
-        // Resource message and no action
-        verifySnackbarContent(
-                Snackbar.make(mCoordinatorLayout, MESSAGE_ID, Snackbar.LENGTH_LONG),
-                resolvedMessage, null);
-
-        // String message and string action
-        verifySnackbarContent(
-                Snackbar.make(mCoordinatorLayout, MESSAGE_TEXT, Snackbar.LENGTH_INDEFINITE)
-                        .setAction(ACTION_TEXT, mock(View.OnClickListener.class)),
-                MESSAGE_TEXT, ACTION_TEXT);
-
-        // String message and resource action
-        verifySnackbarContent(
-                Snackbar.make(mCoordinatorLayout, MESSAGE_TEXT, Snackbar.LENGTH_SHORT)
-                        .setAction(ACTION_ID, mock(View.OnClickListener.class)),
-                MESSAGE_TEXT, resolvedAction);
-
-        // Resource message and resource action
-        verifySnackbarContent(
-                Snackbar.make(mCoordinatorLayout, MESSAGE_ID, Snackbar.LENGTH_LONG)
-                        .setAction(ACTION_ID, mock(View.OnClickListener.class)),
-                resolvedMessage, resolvedAction);
-    }
-
-    private void verifyDismissCallback(final ViewInteraction interaction,
-            final @Nullable ViewAction action, final @Nullable DismissAction dismissAction,
-            final int length, @Snackbar.Callback.DismissEvent final int expectedEvent)
-            throws Throwable {
-        final BaseTransientBottomBar.BaseCallback mockCallback =
-                mock(BaseTransientBottomBar.BaseCallback.class);
-        final Snackbar snackbar = Snackbar.make(mCoordinatorLayout, MESSAGE_TEXT, length)
-                .setAction(ACTION_TEXT, mock(View.OnClickListener.class))
-                .addCallback(mockCallback);
-
-        // Show the snackbar
-        SnackbarUtils.showTransientBottomBarAndWaitUntilFullyShown(snackbar);
-        // Verify that our onShown has been called
-        verify(mockCallback, times(1)).onShown(snackbar);
-        // and that the snackbar is either shown or queued to be shown
-        assertTrue(snackbar.isShownOrQueued());
-        // and also check that we have the intended message / action displayed somewhere in
-        // our hierarchy
-        onView(withText(MESSAGE_TEXT)).check(matches(isCompletelyDisplayed()));
-        onView(withText(ACTION_TEXT)).check(matches(isCompletelyDisplayed()));
-
-        // Now perform the UI interaction
-        SnackbarUtils.performActionAndWaitUntilFullyDismissed(snackbar,
-                new SnackbarUtils.TransientBottomBarAction() {
-                    @Override
-                    public void perform() throws Throwable {
-                        if (action != null) {
-                            interaction.perform(action);
-                        } else if (dismissAction != null) {
-                            mActivityTestRule.runOnUiThread(new Runnable() {
-                                @Override
-                                public void run() {
-                                    dismissAction.dismiss(snackbar);
-                                }
-                            });
-                        }
-                    }
-                });
-
-        // Verify that our onDismissed has been called
-        verify(mockCallback, times(1)).onDismissed(snackbar, expectedEvent);
-        verifyNoMoreInteractions(mockCallback);
-        // and that the snackbar is neither shown nor queued to be shown
-        assertFalse(snackbar.isShownOrQueued());
-    }
-
-    @Test
-    public void testDismissViaActionClick() throws Throwable {
-        verifyDismissCallback(
-                onView(withId(R.id.snackbar_action)),
-                click(),
-                null,
-                Snackbar.LENGTH_LONG,
-                Snackbar.Callback.DISMISS_EVENT_ACTION);
-    }
-
-    @Test
-    public void testDismissViaSwipe() throws Throwable {
-        verifyDismissCallback(
-                onView(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                swipeRight(),
-                null,
-                Snackbar.LENGTH_LONG,
-                Snackbar.Callback.DISMISS_EVENT_SWIPE);
-    }
-
-    @Test
-    public void testDismissViaSwipeRtl() throws Throwable {
-        onView(withId(R.id.col)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
-        if (ViewCompat.getLayoutDirection(mCoordinatorLayout) == ViewCompat.LAYOUT_DIRECTION_RTL) {
-            // On devices that support RTL layout, the start-to-end dismiss swipe is done
-            // with swipeLeft() action
-            verifyDismissCallback(
-                    onView(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                    swipeLeft(),
-                    null,
-                    Snackbar.LENGTH_LONG,
-                    Snackbar.Callback.DISMISS_EVENT_SWIPE);
-        }
-    }
-
-    @Test
-    public void testDismissViaApi() throws Throwable {
-        verifyDismissCallback(
-                onView(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                null,
-                new DismissAction() {
-                    @Override
-                    public void dismiss(Snackbar snackbar) {
-                        snackbar.dismiss();
-                    }
-                },
-                Snackbar.LENGTH_LONG,
-                Snackbar.Callback.DISMISS_EVENT_MANUAL);
-    }
-
-    @LargeTest
-    @Test
-    public void testDismissViaTimeout() throws Throwable {
-        verifyDismissCallback(
-                onView(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                null,
-                null,
-                Snackbar.LENGTH_LONG,
-                Snackbar.Callback.DISMISS_EVENT_TIMEOUT);
-    }
-
-    @LargeTest
-    @Test
-    public void testSwipeUpDismissesViaTimeout() throws Throwable {
-        verifyDismissCallback(
-                onView(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                // This is a swipe up, from the middle center of the view, to above the view
-                // (outside the bounds)
-                new GeneralSwipeAction(
-                        Swipe.SLOW,
-                        new CoordinatesProvider() {
-                            @Override
-                            public float[] calculateCoordinates(View view) {
-                                final int[] loc = new int[2];
-                                view.getLocationOnScreen(loc);
-                                return new float[]{
-                                        loc[0] + view.getWidth() / 2,
-                                        loc[1] + view.getHeight() / 2};
-                            }
-                        },
-                        new CoordinatesProvider() {
-                            @Override
-                            public float[] calculateCoordinates(View view) {
-                                final int[] loc = new int[2];
-                                view.getLocationOnScreen(loc);
-                                return new float[]{
-                                        loc[0] + view.getWidth() / 2,
-                                        loc[1] - view.getHeight()};
-                            }
-                        },
-                        Press.FINGER
-                ),
-                null,
-                Snackbar.LENGTH_SHORT,
-                Snackbar.Callback.DISMISS_EVENT_TIMEOUT);
-    }
-
-    @Test
-    public void testDismissViaAnotherSnackbar() throws Throwable {
-        final Snackbar anotherSnackbar =
-                Snackbar.make(mCoordinatorLayout, "A different message", Snackbar.LENGTH_SHORT);
-
-        // Our dismiss action is to show another snackbar (and verify that the original snackbar
-        // is now dismissed with CONSECUTIVE event)
-        verifyDismissCallback(
-                onView(isAssignableFrom(Snackbar.SnackbarLayout.class)),
-                null,
-                new DismissAction() {
-                    @Override
-                    public void dismiss(Snackbar snackbar) {
-                        anotherSnackbar.show();
-                    }
-                },
-                Snackbar.LENGTH_LONG,
-                Snackbar.Callback.DISMISS_EVENT_CONSECUTIVE);
-
-        // And dismiss the second snackbar to get back to clean state
-        SnackbarUtils.dismissTransientBottomBarAndWaitUntilFullyDismissed(anotherSnackbar);
-    }
-
-    @Test
-    public void testActionClickListener() {
-        final View.OnClickListener mockClickListener = mock(View.OnClickListener.class);
-        final Snackbar snackbar =
-                Snackbar.make(mCoordinatorLayout, MESSAGE_TEXT, Snackbar.LENGTH_SHORT)
-                    .setAction(ACTION_TEXT, mockClickListener);
-
-        // Show the snackbar
-        SnackbarUtils.showTransientBottomBarAndWaitUntilFullyShown(snackbar);
-        // perform the action click
-        onView(withId(R.id.snackbar_action)).perform(click());
-        // and verify that our click listener has been called
-        verify(mockClickListener, times(1)).onClick(any(View.class));
-    }
-
-    @Test
-    public void testSetCallback() throws Throwable {
-        final Snackbar snackbar =
-                Snackbar.make(mCoordinatorLayout, MESSAGE_TEXT, Snackbar.LENGTH_INDEFINITE)
-                        .setAction(ACTION_TEXT, mock(View.OnClickListener.class));
-        final Snackbar.Callback mockCallback = spy(new Snackbar.Callback());
-        snackbar.setCallback(mockCallback);
-
-        SnackbarUtils.showTransientBottomBarAndWaitUntilFullyShown(snackbar);
-        verify(mockCallback, times(1)).onShown(snackbar);
-
-        SnackbarUtils.dismissTransientBottomBarAndWaitUntilFullyDismissed(snackbar);
-        verify(mockCallback, times(1)).onDismissed(snackbar,
-                BaseTransientBottomBar.BaseCallback.DISMISS_EVENT_MANUAL);
-    }
-
-    @Test
-    public void testSingleCallback() throws Throwable {
-        final Snackbar snackbar =
-                Snackbar.make(mCoordinatorLayout, MESSAGE_TEXT, Snackbar.LENGTH_INDEFINITE)
-                        .setAction(ACTION_TEXT, mock(View.OnClickListener.class));
-        final BaseTransientBottomBar.BaseCallback mockCallback1 =
-                mock(BaseTransientBottomBar.BaseCallback.class);
-        final BaseTransientBottomBar.BaseCallback mockCallback2 =
-                mock(BaseTransientBottomBar.BaseCallback.class);
-        snackbar.addCallback(mockCallback1);
-
-        SnackbarUtils.showTransientBottomBarAndWaitUntilFullyShown(snackbar);
-        verify(mockCallback1, times(1)).onShown(snackbar);
-        verify(mockCallback2, never()).onShown(snackbar);
-
-        SnackbarUtils.dismissTransientBottomBarAndWaitUntilFullyDismissed(snackbar);
-        verify(mockCallback1, times(1)).onDismissed(snackbar,
-                BaseTransientBottomBar.BaseCallback.DISMISS_EVENT_MANUAL);
-        verify(mockCallback2, never()).onDismissed(snackbar,
-                BaseTransientBottomBar.BaseCallback.DISMISS_EVENT_MANUAL);
-    }
-
-    @Test
-    public void testMultipleCallbacks() throws Throwable {
-        final Snackbar snackbar =
-                Snackbar.make(mCoordinatorLayout, MESSAGE_TEXT, Snackbar.LENGTH_INDEFINITE)
-                        .setAction(ACTION_TEXT, mock(View.OnClickListener.class));
-        final BaseTransientBottomBar.BaseCallback mockCallback1 =
-                mock(BaseTransientBottomBar.BaseCallback.class);
-        final BaseTransientBottomBar.BaseCallback mockCallback2 =
-                mock(BaseTransientBottomBar.BaseCallback.class);
-        snackbar.addCallback(mockCallback1);
-        snackbar.addCallback(mockCallback2);
-
-        SnackbarUtils.showTransientBottomBarAndWaitUntilFullyShown(snackbar);
-        verify(mockCallback1, times(1)).onShown(snackbar);
-        verify(mockCallback2, times(1)).onShown(snackbar);
-
-        SnackbarUtils.dismissTransientBottomBarAndWaitUntilFullyDismissed(snackbar);
-        verify(mockCallback1, times(1)).onDismissed(snackbar,
-                BaseTransientBottomBar.BaseCallback.DISMISS_EVENT_MANUAL);
-        verify(mockCallback2, times(1)).onDismissed(snackbar,
-                BaseTransientBottomBar.BaseCallback.DISMISS_EVENT_MANUAL);
-    }
-
-    @Test
-    public void testMultipleCallbacksWithRemoval() throws Throwable {
-        final Snackbar snackbar =
-                Snackbar.make(mCoordinatorLayout, MESSAGE_TEXT, Snackbar.LENGTH_INDEFINITE)
-                        .setAction(ACTION_TEXT, mock(View.OnClickListener.class));
-        final BaseTransientBottomBar.BaseCallback mockCallback1 =
-                mock(BaseTransientBottomBar.BaseCallback.class);
-        final BaseTransientBottomBar.BaseCallback mockCallback2 =
-                mock(BaseTransientBottomBar.BaseCallback.class);
-        snackbar.addCallback(mockCallback1);
-        snackbar.addCallback(mockCallback2);
-
-        SnackbarUtils.showTransientBottomBarAndWaitUntilFullyShown(snackbar);
-        verify(mockCallback1, times(1)).onShown(snackbar);
-        verify(mockCallback2, times(1)).onShown(snackbar);
-
-        snackbar.removeCallback(mockCallback2);
-
-        SnackbarUtils.dismissTransientBottomBarAndWaitUntilFullyDismissed(snackbar);
-        verify(mockCallback1, times(1)).onDismissed(snackbar,
-                BaseTransientBottomBar.BaseCallback.DISMISS_EVENT_MANUAL);
-        verify(mockCallback2, never()).onDismissed(snackbar,
-                BaseTransientBottomBar.BaseCallback.DISMISS_EVENT_MANUAL);
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/SnackbarTestWithFAB.java b/design/tests/src/android/support/design/widget/SnackbarTestWithFAB.java
deleted file mode 100644
index 5ffe3ca..0000000
--- a/design/tests/src/android/support/design/widget/SnackbarTestWithFAB.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static org.junit.Assert.assertEquals;
-
-import android.support.design.test.R;
-import android.support.design.testutils.SnackbarUtils;
-import android.support.test.filters.LargeTest;
-import android.view.View;
-
-import org.junit.Before;
-import org.junit.Test;
-
-@LargeTest
-public class SnackbarTestWithFAB extends BaseInstrumentationTestCase<SnackbarActivityWithFAB> {
-
-    private static final String MESSAGE_TEXT = "Test Message";
-
-    private CoordinatorLayout mCoordinatorLayout;
-
-    public SnackbarTestWithFAB() {
-        super(SnackbarActivityWithFAB.class);
-    }
-
-    @Before
-    public void setup() {
-        mCoordinatorLayout =
-                (CoordinatorLayout) mActivityTestRule.getActivity().findViewById(R.id.col);
-    }
-
-    @Test
-    public void testShortSnackbarDodgesFab() {
-        final int[] originalFabPosition = new int[2];
-        final View fab = mCoordinatorLayout.findViewById(R.id.fab);
-        fab.getLocationOnScreen(originalFabPosition);
-
-        // Show a simple Snackbar and wait for it to be shown
-        final Snackbar snackbar = Snackbar.make(mCoordinatorLayout, MESSAGE_TEXT,
-                Snackbar.LENGTH_SHORT);
-        SnackbarUtils.showTransientBottomBarAndWaitUntilFullyShown(snackbar);
-
-        // Now check that the FAB has shifted up to make space for the Snackbar
-        final int[] fabPosition = new int[2];
-        fab.getLocationOnScreen(fabPosition);
-        assertEquals(originalFabPosition[0], fabPosition[0]);
-        assertEquals(originalFabPosition[1] - snackbar.getView().getHeight(), fabPosition[1]);
-
-        // Now wait until the Snackbar has been dismissed
-        SnackbarUtils.waitUntilFullyDismissed(snackbar);
-
-        // And check that the FAB is back in its original position
-        fab.getLocationOnScreen(fabPosition);
-        assertEquals(originalFabPosition[0], fabPosition[0]);
-        assertEquals(originalFabPosition[1], fabPosition[1]);
-    }
-
-    @Test
-    public void testIndefiniteSnackbarDodgesFab() throws Throwable {
-        final int[] originalFabPosition = new int[2];
-        final View fab = mCoordinatorLayout.findViewById(R.id.fab);
-        fab.getLocationOnScreen(originalFabPosition);
-
-        // Show a simple Snackbar and wait for it to be shown
-        final Snackbar snackbar = Snackbar.make(mCoordinatorLayout, MESSAGE_TEXT,
-                Snackbar.LENGTH_INDEFINITE);
-        SnackbarUtils.showTransientBottomBarAndWaitUntilFullyShown(snackbar);
-
-        // Now check that the FAB has shifted up to make space for the Snackbar
-        final int[] fabPosition = new int[2];
-        fab.getLocationOnScreen(fabPosition);
-        assertEquals(originalFabPosition[0], fabPosition[0]);
-        assertEquals(originalFabPosition[1] - snackbar.getView().getHeight(), fabPosition[1]);
-
-        // Now dismiss the Snackbar and wait for it to be dismissed
-        SnackbarUtils.dismissTransientBottomBarAndWaitUntilFullyDismissed(snackbar);
-
-        // And check that the FAB is back in its original position
-        fab.getLocationOnScreen(fabPosition);
-        assertEquals(originalFabPosition[0], fabPosition[0]);
-        assertEquals(originalFabPosition[1], fabPosition[1]);
-    }
-
-}
diff --git a/design/tests/src/android/support/design/widget/SnackbarTestWithTranslucentNavBar.java b/design/tests/src/android/support/design/widget/SnackbarTestWithTranslucentNavBar.java
deleted file mode 100644
index 07a8d0f..0000000
--- a/design/tests/src/android/support/design/widget/SnackbarTestWithTranslucentNavBar.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import android.support.design.test.R;
-import android.support.design.testutils.SnackbarUtils;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SdkSuppress;
-import android.support.v4.view.WindowInsetsCompat;
-import android.view.View;
-
-import org.junit.Before;
-import org.junit.Test;
-
-@SdkSuppress(minSdkVersion = 21)
-public class SnackbarTestWithTranslucentNavBar
-        extends BaseInstrumentationTestCase<SnackbarActivityWithTranslucentNavBar> {
-
-    private static final String MESSAGE_TEXT = "Test Message";
-
-    private CoordinatorLayout mCoordinatorLayout;
-
-    public SnackbarTestWithTranslucentNavBar() {
-        super(SnackbarActivityWithTranslucentNavBar.class);
-    }
-
-    @Before
-    public void setup() {
-        mCoordinatorLayout =
-                (CoordinatorLayout) mActivityTestRule.getActivity().findViewById(R.id.col);
-    }
-
-    @Test
-    @MediumTest
-    public void testDrawsAboveNavigationBar() {
-        // Show a simple Snackbar and wait for it to be shown
-        final Snackbar snackbar = Snackbar.make(mCoordinatorLayout, MESSAGE_TEXT,
-                Snackbar.LENGTH_SHORT);
-        SnackbarUtils.showTransientBottomBarAndWaitUntilFullyShown(snackbar);
-
-        final WindowInsetsCompat colLastInsets = mCoordinatorLayout.getLastWindowInsets();
-        assertNotNull(colLastInsets);
-
-        // Check that the Snackbar view has padding set to display above the nav bar
-        final View view = snackbar.getView();
-        assertNotNull(view);
-        assertEquals(colLastInsets.getSystemWindowInsetBottom(), view.getPaddingBottom());
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/TabLayoutPoolingActivity.java b/design/tests/src/android/support/design/widget/TabLayoutPoolingActivity.java
deleted file mode 100644
index 2108235..0000000
--- a/design/tests/src/android/support/design/widget/TabLayoutPoolingActivity.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-
-public class TabLayoutPoolingActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.design_tabs_twice;
-    }
-}
\ No newline at end of file
diff --git a/design/tests/src/android/support/design/widget/TabLayoutPoolingTest.java b/design/tests/src/android/support/design/widget/TabLayoutPoolingTest.java
deleted file mode 100755
index a805a2e..0000000
--- a/design/tests/src/android/support/design/widget/TabLayoutPoolingTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static org.junit.Assert.assertTrue;
-
-import android.app.Activity;
-import android.support.design.test.R;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.SmallTest;
-
-import org.junit.Test;
-
-public class TabLayoutPoolingTest extends BaseInstrumentationTestCase<TabLayoutPoolingActivity> {
-
-    public TabLayoutPoolingTest() {
-        super(TabLayoutPoolingActivity.class);
-    }
-
-    @UiThreadTest
-    @SmallTest
-    @Test
-    public void testUsingTabsFromOtherInstance() {
-        final Activity activity = mActivityTestRule.getActivity();
-
-        // TabLayout1 has items added via the layout, so we'll just check they're
-        // there first
-        final TabLayout tabLayout1 = (TabLayout) activity.findViewById(R.id.tabs_1);
-        assertTrue(tabLayout1.getTabCount() > 0);
-
-        // Now remove all tabs. TabLayout will pool the Tab instances...
-        tabLayout1.removeAllTabs();
-
-        // Now add some tabs to the second TabLayout and make sure that we don't crash
-        final TabLayout tabLayout2 = (TabLayout) activity.findViewById(R.id.tabs_2);
-        tabLayout2.addTab(tabLayout2.newTab());
-        tabLayout2.addTab(tabLayout2.newTab());
-        tabLayout2.addTab(tabLayout2.newTab());
-    }
-
-}
diff --git a/design/tests/src/android/support/design/widget/TabLayoutTest.java b/design/tests/src/android/support/design/widget/TabLayoutTest.java
deleted file mode 100755
index 730ff56..0000000
--- a/design/tests/src/android/support/design/widget/TabLayoutTest.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static android.support.design.testutils.TabLayoutActions.selectTab;
-import static android.support.design.testutils.TabLayoutActions.setScrollPosition;
-import static android.support.design.testutils.TestUtilsActions.setLayoutDirection;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.os.Build;
-import android.support.design.test.R;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.espresso.Espresso;
-import android.support.test.espresso.IdlingResource;
-import android.support.test.espresso.NoMatchingViewException;
-import android.support.test.espresso.ViewAssertion;
-import android.support.test.filters.SdkSuppress;
-import android.support.test.filters.SmallTest;
-import android.support.v4.view.ViewCompat;
-import android.support.v7.app.AppCompatActivity;
-import android.view.InflateException;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.PointerIcon;
-import android.view.View;
-
-import org.junit.Test;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-@SmallTest
-public class TabLayoutTest extends BaseInstrumentationTestCase<AppCompatActivity> {
-    public TabLayoutTest() {
-        super(AppCompatActivity.class);
-    }
-
-    @Test
-    @UiThreadTest
-    public void testInflateTabLayoutWithTabItems() {
-        final LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
-        final TabLayout tabLayout = (TabLayout) inflater.inflate(R.layout.design_tabs_items, null);
-
-        assertEquals(3, tabLayout.getTabCount());
-
-        // Tab 0 has text, but no icon or custom view
-        TabLayout.Tab tab = tabLayout.getTabAt(0);
-        assertEquals(mActivityTestRule.getActivity().getString(R.string.tab_layout_text),
-                tab.getText());
-        assertNull(tab.getIcon());
-        assertNull(tab.getCustomView());
-
-        // Tab 1 has an icon, but no text or custom view
-        tab = tabLayout.getTabAt(1);
-        assertNull(tab.getText());
-        assertNotNull(tab.getIcon());
-        assertNull(tab.getCustomView());
-
-        // Tab 2 has a custom view, but no text or icon
-        tab = tabLayout.getTabAt(2);
-        assertNull(tab.getText());
-        assertNull(tab.getIcon());
-        assertNotNull(tab.getCustomView());
-        assertEquals(R.id.my_custom_tab, tab.getCustomView().getId());
-    }
-
-    @Test
-    @UiThreadTest
-    public void testInflateTabLayoutWithNonTabItem() throws Throwable {
-        try {
-            final LayoutInflater inflater =
-                    LayoutInflater.from(mActivityTestRule.getActivity());
-            inflater.inflate(R.layout.design_tabs_with_non_tabitems, null);
-        } catch (Throwable throwable) {
-            assertTrue(throwable instanceof InflateException
-                    || throwable instanceof IllegalArgumentException);
-        }
-    }
-
-    @Test
-    @UiThreadTest
-    public void testTabWithCustomLayoutSelection1() {
-        final TabLayout.OnTabSelectedListener mockListener =
-                mock(TabLayout.OnTabSelectedListener.class);
-        final LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
-
-        final TabLayout tabLayout = (TabLayout) inflater.inflate(R.layout.design_tabs, null);
-        tabLayout.addOnTabSelectedListener(mockListener);
-        final TabLayout.Tab tab = tabLayout.newTab();
-        tab.setCustomView(R.layout.design_tab_item_custom);
-        tabLayout.addTab(tab);
-        verify(mockListener, times(1)).onTabSelected(eq(tab));
-        verify(mockListener, times(0)).onTabUnselected(any(TabLayout.Tab.class));
-
-        assertNotNull("Tab has custom view", tab.getCustomView());
-        assertEquals("First tab is selected", 0, tabLayout.getSelectedTabPosition());
-        assertTabCustomViewSelected(tabLayout);
-    }
-
-    @Test
-    @UiThreadTest
-    public void testTabWithCustomLayoutSelection2() {
-        final TabLayout.OnTabSelectedListener mockListener =
-                mock(TabLayout.OnTabSelectedListener.class);
-        final LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
-
-        final TabLayout tabLayout = (TabLayout) inflater.inflate(R.layout.design_tabs, null);
-        tabLayout.addOnTabSelectedListener(mockListener);
-        final TabLayout.Tab tab = tabLayout.newTab();
-        tabLayout.addTab(tab);
-        verify(mockListener, times(1)).onTabSelected(eq(tab));
-        verify(mockListener, times(0)).onTabUnselected(any(TabLayout.Tab.class));
-        tab.setCustomView(R.layout.design_tab_item_custom);
-
-        assertNotNull("Tab has custom view", tab.getCustomView());
-        assertEquals("First tab is selected", 0, tabLayout.getSelectedTabPosition());
-        assertTabCustomViewSelected(tabLayout);
-    }
-
-    @Test
-    @UiThreadTest
-    public void testMultipleTabsWithCustomLayoutSelection1() {
-        final TabLayout.OnTabSelectedListener mockListener =
-                mock(TabLayout.OnTabSelectedListener.class);
-        final LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
-        final TabLayout tabs = (TabLayout) inflater.inflate(R.layout.design_tabs, null);
-        tabs.addOnTabSelectedListener(mockListener);
-
-        final TabLayout.Tab tab1 = tabs.newTab().setCustomView(R.layout.design_tab_item_custom);
-        tabs.addTab(tab1);
-        verify(mockListener, times(1)).onTabSelected(eq(tab1));
-        verify(mockListener, times(0)).onTabUnselected(any(TabLayout.Tab.class));
-        final TabLayout.Tab tab2 = tabs.newTab().setCustomView(R.layout.design_tab_item_custom);
-        tabs.addTab(tab2, true);
-        verify(mockListener, times(1)).onTabSelected(eq(tab2));
-        verify(mockListener, times(1)).onTabUnselected(eq(tab1));
-        final TabLayout.Tab tab3 = tabs.newTab().setCustomView(R.layout.design_tab_item_custom);
-        tabs.addTab(tab3);
-        verifyNoMoreInteractions(mockListener);
-
-        assertEquals("Second tab is selected", 1, tabs.getSelectedTabPosition());
-        assertTabCustomViewSelected(tabs);
-    }
-
-    @Test
-    @UiThreadTest
-    public void testMultipleTabsWithCustomLayoutSelection2() {
-        final TabLayout.OnTabSelectedListener mockListener =
-                mock(TabLayout.OnTabSelectedListener.class);
-        final LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
-        final TabLayout tabs = (TabLayout) inflater.inflate(R.layout.design_tabs, null);
-        tabs.addOnTabSelectedListener(mockListener);
-
-        final TabLayout.Tab tab1 = tabs.newTab();
-        tabs.addTab(tab1);
-        verify(mockListener, times(1)).onTabSelected(eq(tab1));
-        verify(mockListener, times(0)).onTabUnselected(any(TabLayout.Tab.class));
-        final TabLayout.Tab tab2 = tabs.newTab();
-        tabs.addTab(tab2, true);
-        verify(mockListener, times(1)).onTabSelected(eq(tab2));
-        verify(mockListener, times(1)).onTabUnselected(eq(tab1));
-        final TabLayout.Tab tab3 = tabs.newTab();
-        tabs.addTab(tab3);
-        verifyNoMoreInteractions(mockListener);
-
-        tabs.getTabAt(0).setCustomView(R.layout.design_tab_item_custom);
-        tabs.getTabAt(1).setCustomView(R.layout.design_tab_item_custom);
-        tabs.getTabAt(2).setCustomView(R.layout.design_tab_item_custom);
-
-        assertEquals("Second tab is selected", 1, tabs.getSelectedTabPosition());
-        assertTabCustomViewSelected(tabs);
-    }
-
-    @Test
-    @UiThreadTest
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
-    public void testPointerIcon() {
-        final LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
-        final TabLayout tabLayout = (TabLayout) inflater.inflate(R.layout.design_tabs_items, null);
-        final PointerIcon expectedIcon =
-                PointerIcon.getSystemIcon(mActivityTestRule.getActivity(), PointerIcon.TYPE_HAND);
-
-        final int tabCount = tabLayout.getTabCount();
-        assertEquals(3, tabCount);
-
-        final MotionEvent event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_HOVER_MOVE, 0, 0, 0);
-        for (int i = 0; i < tabCount; i++) {
-            assertEquals(expectedIcon, tabLayout.getTabAt(i).mView.onResolvePointerIcon(event, 0));
-        }
-    }
-
-    private static void assertTabCustomViewSelected(final TabLayout tabLayout) {
-        for (int i = 0, count = tabLayout.getTabCount(); i < count; i++) {
-            final TabLayout.Tab tab = tabLayout.getTabAt(i);
-            final View tabCustomView = tab.getCustomView();
-            if (tabCustomView != null) {
-                assertEquals(tab.isSelected(), tabCustomView.isSelected());
-            }
-        }
-    }
-
-    @Test
-    public void setScrollPositionLtr() throws Throwable {
-        testSetScrollPosition(true);
-    }
-
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.JELLY_BEAN_MR1)
-    @Test
-    public void setScrollPositionRtl() throws Throwable {
-        testSetScrollPosition(false);
-    }
-
-    private void testSetScrollPosition(final boolean isLtr) throws Throwable {
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mActivityTestRule.getActivity().setContentView(R.layout.design_tabs_fixed_width);
-            }
-        });
-        final TabLayout tabs = (TabLayout) mActivityTestRule.getActivity().findViewById(R.id.tabs);
-        assertEquals(TabLayout.MODE_SCROLLABLE, tabs.getTabMode());
-
-        final TabLayoutScrollIdlingResource idler = new TabLayoutScrollIdlingResource(tabs);
-        Espresso.registerIdlingResources(idler);
-
-        // We're going to call setScrollPosition() incrementally, as if scrolling between one tab
-        // and the next. Use the middle tab for best results. The positionOffsets should be in the
-        // range [0, 1), so the final call will wrap to 0 but use the next tab's position.
-        final int middleTab = tabs.getTabCount() / 2;
-        final int[] positions = {middleTab, middleTab, middleTab, middleTab, middleTab + 1};
-        final float[] positionOffsets = {0f, .25f, .5f, .75f, 0f};
-
-        // Set layout direction
-        onView(withId(R.id.tabs)).perform(setLayoutDirection(
-                isLtr ? ViewCompat.LAYOUT_DIRECTION_LTR : ViewCompat.LAYOUT_DIRECTION_RTL));
-        // Make sure it's scrolled all the way to the start
-        onView(withId(R.id.tabs)).perform(selectTab(0));
-
-        // Perform a series of setScrollPosition() calls
-        final AtomicInteger lastScrollX = new AtomicInteger(tabs.getScrollX());
-        for (int i = 0; i < positions.length; i++) {
-            onView(withId(R.id.tabs))
-                    .perform(setScrollPosition(positions[i], positionOffsets[i]))
-                    .check(new ViewAssertion() {
-                        @Override
-                        public void check(View view, NoMatchingViewException notFoundException) {
-                            if (view == null) {
-                                throw notFoundException;
-                            }
-                            // Verify increasing or decreasing scroll X values
-                            int sx = view.getScrollX();
-                            assertTrue(isLtr ? sx > lastScrollX.get() : sx < lastScrollX.get());
-                            lastScrollX.set(sx);
-                        }
-                    });
-        }
-
-        Espresso.unregisterIdlingResources(idler);
-    }
-
-    static class TabLayoutScrollIdlingResource implements IdlingResource {
-
-        private boolean mIsIdle = true;
-        private ResourceCallback mCallback;
-
-        TabLayoutScrollIdlingResource(final TabLayout tabLayout) {
-            tabLayout.setScrollAnimatorListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationStart(Animator animator) {
-                    setIdle(false);
-                }
-
-                @Override
-                public void onAnimationEnd(Animator animator) {
-                    setIdle(true);
-                }
-            });
-        }
-
-        @Override
-        public String getName() {
-            return "TabLayoutScrollIdlingResource";
-        }
-
-        @Override
-        public boolean isIdleNow() {
-            return mIsIdle;
-        }
-
-        @Override
-        public void registerIdleTransitionCallback(ResourceCallback callback) {
-            mCallback = callback;
-        }
-
-        private void setIdle(boolean idle) {
-            boolean wasIdle = mIsIdle;
-            mIsIdle = idle;
-            if (mIsIdle && !wasIdle && mCallback != null) {
-                mCallback.onTransitionToIdle();
-            }
-        }
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/TabLayoutWithViewPagerActivity.java b/design/tests/src/android/support/design/widget/TabLayoutWithViewPagerActivity.java
deleted file mode 100644
index 39db827..0000000
--- a/design/tests/src/android/support/design/widget/TabLayoutWithViewPagerActivity.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-import android.support.v7.widget.Toolbar;
-
-public class TabLayoutWithViewPagerActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.design_tabs_viewpager;
-    }
-
-    @Override
-    protected void onContentViewSet() {
-        Toolbar toolbar = findViewById(R.id.toolbar);
-        setSupportActionBar(toolbar);
-        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/TabLayoutWithViewPagerTest.java b/design/tests/src/android/support/design/widget/TabLayoutWithViewPagerTest.java
deleted file mode 100755
index b169dad..0000000
--- a/design/tests/src/android/support/design/widget/TabLayoutWithViewPagerTest.java
+++ /dev/null
@@ -1,628 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import static android.support.design.testutils.TabLayoutActions.setupWithViewPager;
-import static android.support.design.testutils.ViewPagerActions.setAdapter;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
-import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
-import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withParent;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-
-import static org.hamcrest.Matchers.allOf;
-import static org.hamcrest.Matchers.not;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-import android.content.res.Resources;
-import android.graphics.Color;
-import android.support.annotation.DimenRes;
-import android.support.annotation.LayoutRes;
-import android.support.design.test.R;
-import android.support.design.testutils.TabLayoutActions;
-import android.support.design.testutils.TestUtilsActions;
-import android.support.design.testutils.TestUtilsMatchers;
-import android.support.design.testutils.ViewPagerActions;
-import android.support.test.espresso.UiController;
-import android.support.test.espresso.ViewAction;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.SmallTest;
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.ViewPager;
-import android.util.Pair;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.HorizontalScrollView;
-import android.widget.TextView;
-
-import org.hamcrest.Matcher;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.ArrayList;
-
-public class TabLayoutWithViewPagerTest
-        extends BaseInstrumentationTestCase<TabLayoutWithViewPagerActivity> {
-    private TabLayout mTabLayout;
-
-    private ViewPager mViewPager;
-
-    private ColorPagerAdapter mDefaultPagerAdapter;
-
-    protected static class BasePagerAdapter<Q> extends PagerAdapter {
-        protected ArrayList<Pair<String, Q>> mEntries = new ArrayList<>();
-
-        public void add(String title, Q content) {
-            mEntries.add(new Pair<>(title, content));
-        }
-
-        @Override
-        public int getCount() {
-            return mEntries.size();
-        }
-
-        protected void configureInstantiatedItem(View view, int position) {
-            switch (position) {
-                case 0:
-                    view.setId(R.id.page_0);
-                    break;
-                case 1:
-                    view.setId(R.id.page_1);
-                    break;
-                case 2:
-                    view.setId(R.id.page_2);
-                    break;
-                case 3:
-                    view.setId(R.id.page_3);
-                    break;
-                case 4:
-                    view.setId(R.id.page_4);
-                    break;
-                case 5:
-                    view.setId(R.id.page_5);
-                    break;
-                case 6:
-                    view.setId(R.id.page_6);
-                    break;
-                case 7:
-                    view.setId(R.id.page_7);
-                    break;
-                case 8:
-                    view.setId(R.id.page_8);
-                    break;
-                case 9:
-                    view.setId(R.id.page_9);
-                    break;
-            }
-        }
-
-        @Override
-        public void destroyItem(ViewGroup container, int position, Object object) {
-            // The adapter is also responsible for removing the view.
-            container.removeView(((ViewHolder) object).view);
-        }
-
-        @Override
-        public int getItemPosition(Object object) {
-            return ((ViewHolder) object).position;
-        }
-
-        @Override
-        public boolean isViewFromObject(View view, Object object) {
-            return ((ViewHolder) object).view == view;
-        }
-
-        @Override
-        public CharSequence getPageTitle(int position) {
-            return mEntries.get(position).first;
-        }
-
-        protected static class ViewHolder {
-            final View view;
-            final int position;
-
-            public ViewHolder(View view, int position) {
-                this.view = view;
-                this.position = position;
-            }
-        }
-    }
-
-    protected static class ColorPagerAdapter extends BasePagerAdapter<Integer> {
-        @Override
-        public Object instantiateItem(ViewGroup container, int position) {
-            final View view = new View(container.getContext());
-            view.setBackgroundColor(mEntries.get(position).second);
-            configureInstantiatedItem(view, position);
-
-            // Unlike ListView adapters, the ViewPager adapter is responsible
-            // for adding the view to the container.
-            container.addView(view);
-
-            return new ViewHolder(view, position);
-        }
-    }
-
-    protected static class TextPagerAdapter extends BasePagerAdapter<String> {
-        @Override
-        public Object instantiateItem(ViewGroup container, int position) {
-            final TextView view = new TextView(container.getContext());
-            view.setText(mEntries.get(position).second);
-            configureInstantiatedItem(view, position);
-
-            // Unlike ListView adapters, the ViewPager adapter is responsible
-            // for adding the view to the container.
-            container.addView(view);
-
-            return new ViewHolder(view, position);
-        }
-    }
-
-    private static <Q> ViewAction addItemToPager(final String title, final Q content) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(ViewPager.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Add item and notify on content change";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                final ViewPager viewPager = (ViewPager) view;
-                final BasePagerAdapter<Q> viewPagerAdapter =
-                        (BasePagerAdapter<Q>) viewPager.getAdapter();
-                viewPagerAdapter.add(title, content);
-                viewPagerAdapter.notifyDataSetChanged();
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    private static <Q> ViewAction addItemsToPager(final String[] title, final Q[] content) {
-        return new ViewAction() {
-            @Override
-            public Matcher<View> getConstraints() {
-                return isAssignableFrom(ViewPager.class);
-            }
-
-            @Override
-            public String getDescription() {
-                return "Add items and notify on content change";
-            }
-
-            @Override
-            public void perform(UiController uiController, View view) {
-                uiController.loopMainThreadUntilIdle();
-
-                final ViewPager viewPager = (ViewPager) view;
-                final BasePagerAdapter<Q> viewPagerAdapter =
-                        (BasePagerAdapter<Q>) viewPager.getAdapter();
-                int itemCount = title.length;
-                for (int i = 0; i < itemCount; i++) {
-                    viewPagerAdapter.add(title[i], content[i]);
-                }
-                viewPagerAdapter.notifyDataSetChanged();
-
-                uiController.loopMainThreadUntilIdle();
-            }
-        };
-    }
-
-    public TabLayoutWithViewPagerTest() {
-        super(TabLayoutWithViewPagerActivity.class);
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        final TabLayoutWithViewPagerActivity activity = mActivityTestRule.getActivity();
-        mTabLayout = (TabLayout) activity.findViewById(R.id.tabs);
-        mViewPager = (ViewPager) activity.findViewById(R.id.tabs_viewpager);
-
-        mDefaultPagerAdapter = new ColorPagerAdapter();
-        mDefaultPagerAdapter.add("Red", Color.RED);
-        mDefaultPagerAdapter.add("Green", Color.GREEN);
-        mDefaultPagerAdapter.add("Blue", Color.BLUE);
-
-        // Configure view pager
-        onView(withId(R.id.tabs_viewpager)).perform(
-                setAdapter(mDefaultPagerAdapter),
-                ViewPagerActions.scrollToPage(0));
-    }
-
-    private void setupTabLayoutWithViewPager() {
-        // And wire the tab layout to it
-        onView(withId(R.id.tabs)).perform(setupWithViewPager(mViewPager));
-    }
-
-    /**
-     * Verifies that selecting pages in <code>ViewPager</code> also updates the tab selection
-     * in the wired <code>TabLayout</code>
-     */
-    private void verifyViewPagerSelection() {
-        int itemCount = mViewPager.getAdapter().getCount();
-
-        onView(withId(R.id.tabs_viewpager)).perform(ViewPagerActions.scrollToPage(0));
-        assertEquals("Selected page", 0, mViewPager.getCurrentItem());
-        assertEquals("Selected tab", 0, mTabLayout.getSelectedTabPosition());
-
-        // Scroll tabs to the right
-        for (int i = 0; i < (itemCount - 1); i++) {
-            // Scroll one tab to the right
-            onView(withId(R.id.tabs_viewpager)).perform(ViewPagerActions.scrollRight());
-            final int expectedCurrentTabIndex = i + 1;
-            assertEquals("Scroll right #" + i, expectedCurrentTabIndex,
-                    mViewPager.getCurrentItem());
-            assertEquals("Selected tab after scrolling right #" + i, expectedCurrentTabIndex,
-                    mTabLayout.getSelectedTabPosition());
-        }
-
-        // Scroll tabs to the left
-        for (int i = 0; i < (itemCount - 1); i++) {
-            // Scroll one tab to the left
-            onView(withId(R.id.tabs_viewpager)).perform(ViewPagerActions.scrollLeft());
-            final int expectedCurrentTabIndex = itemCount - i - 2;
-            assertEquals("Scroll left #" + i, expectedCurrentTabIndex, mViewPager.getCurrentItem());
-            assertEquals("Selected tab after scrolling left #" + i, expectedCurrentTabIndex,
-                    mTabLayout.getSelectedTabPosition());
-        }
-    }
-
-    /**
-     * Verifies that selecting pages in <code>ViewPager</code> also updates the tab selection
-     * in the wired <code>TabLayout</code>
-     */
-    private void verifyTabLayoutSelection() {
-        int itemCount = mTabLayout.getTabCount();
-
-        onView(withId(R.id.tabs_viewpager)).perform(ViewPagerActions.scrollToPage(0));
-        assertEquals("Selected tab", 0, mTabLayout.getSelectedTabPosition());
-        assertEquals("Selected page", 0, mViewPager.getCurrentItem());
-
-        // Select tabs "going" to the right. Note that the first loop iteration tests the
-        // scenario of "selecting" the first tab when it's already selected.
-        for (int i = 0; i < itemCount; i++) {
-            onView(withId(R.id.tabs)).perform(TabLayoutActions.selectTab(i));
-            assertEquals("Selected tab after selecting #" + i, i,
-                    mTabLayout.getSelectedTabPosition());
-            assertEquals("Select tab #" + i, i, mViewPager.getCurrentItem());
-        }
-
-        // Select tabs "going" to the left. Note that the first loop iteration tests the
-        // scenario of "selecting" the last tab when it's already selected.
-        for (int i = itemCount - 1; i >= 0; i--) {
-            onView(withId(R.id.tabs)).perform(TabLayoutActions.selectTab(i));
-            assertEquals("Scroll left #" + i, i, mViewPager.getCurrentItem());
-            assertEquals("Selected tab after scrolling left #" + i, i,
-                    mTabLayout.getSelectedTabPosition());
-        }
-    }
-
-    @Test
-    @SmallTest
-    public void testBasics() {
-        setupTabLayoutWithViewPager();
-
-        final int itemCount = mViewPager.getAdapter().getCount();
-
-        assertEquals("Matching item count", itemCount, mTabLayout.getTabCount());
-
-        for (int i = 0; i < itemCount; i++) {
-            assertEquals("Tab #" +i, mViewPager.getAdapter().getPageTitle(i),
-                    mTabLayout.getTabAt(i).getText());
-        }
-
-        assertEquals("Selected tab", mViewPager.getCurrentItem(),
-                mTabLayout.getSelectedTabPosition());
-
-        verifyViewPagerSelection();
-    }
-
-    @Test
-    @SmallTest
-    public void testInteraction() {
-        setupTabLayoutWithViewPager();
-
-        assertEquals("Default selected page", 0, mViewPager.getCurrentItem());
-        assertEquals("Default selected tab", 0, mTabLayout.getSelectedTabPosition());
-
-        verifyTabLayoutSelection();
-    }
-
-    @Test
-    @SmallTest
-    public void testAdapterContentChange() {
-        setupTabLayoutWithViewPager();
-
-        // Verify that we have the expected initial adapter
-        PagerAdapter initialAdapter = mViewPager.getAdapter();
-        assertEquals("Initial adapter class", ColorPagerAdapter.class, initialAdapter.getClass());
-        assertEquals("Initial adapter page count", 3, initialAdapter.getCount());
-
-        // Add two more entries to our adapter
-        onView(withId(R.id.tabs_viewpager)).perform(
-                addItemsToPager(new String[] { "Yellow", "Magenta"},
-                        new Integer[] { Color.YELLOW, Color.MAGENTA }));
-
-        // We have more comprehensive test coverage for changing the ViewPager adapter in v4/tests.
-        // Here we are focused on testing the continuous integration of TabLayout with the new
-        // content of ViewPager
-
-        final int newItemCount = mDefaultPagerAdapter.getCount();
-        assertEquals("Matching item count", newItemCount, mTabLayout.getTabCount());
-
-        for (int i = 0; i < newItemCount; i++) {
-            assertEquals("Tab #" +i, mViewPager.getAdapter().getPageTitle(i),
-                    mTabLayout.getTabAt(i).getText());
-        }
-
-        verifyViewPagerSelection();
-        verifyTabLayoutSelection();
-    }
-
-    @Test
-    @SmallTest
-    public void testAdapterContentChangeWithAutoRefreshDisabled() {
-        onView(withId(R.id.tabs)).perform(setupWithViewPager(mViewPager, false));
-
-        // Verify that we have the expected initial adapter
-        PagerAdapter initialAdapter = mViewPager.getAdapter();
-        assertEquals("Initial adapter class", ColorPagerAdapter.class, initialAdapter.getClass());
-        assertEquals("Initial adapter page count", 3, initialAdapter.getCount());
-
-        // Add two entries to our adapter
-        onView(withId(R.id.tabs_viewpager)).perform(
-                addItemsToPager(new String[] { "Yellow", "Magenta"},
-                        new Integer[] { Color.YELLOW, Color.MAGENTA }));
-
-        // Assert that the TabLayout did not update and add the new items
-        final int newItemCount = mDefaultPagerAdapter.getCount();
-        assertNotEquals("Matching item count", newItemCount, mTabLayout.getTabCount());
-    }
-
-    @Test
-    @SmallTest
-    public void testBasicAutoRefreshDisabled() {
-        onView(withId(R.id.tabs)).perform(setupWithViewPager(mViewPager, false));
-
-        // Check that the TabLayout has the same number of items are the adapter
-        PagerAdapter initialAdapter = mViewPager.getAdapter();
-        assertEquals("Initial adapter page count", initialAdapter.getCount(),
-                mTabLayout.getTabCount());
-
-        // Add two more entries to our adapter
-        mDefaultPagerAdapter.add("Yellow", Color.YELLOW);
-        mDefaultPagerAdapter.add("Magenta", Color.MAGENTA);
-        final int newItemCount = mDefaultPagerAdapter.getCount();
-
-        // Assert that the TabLayout did not update and add the new items
-        assertNotEquals("Matching item count", newItemCount, mTabLayout.getTabCount());
-
-        // Now setup again to update the tabs
-        onView(withId(R.id.tabs)).perform(setupWithViewPager(mViewPager, false));
-
-        // Assert that the TabLayout updated and added the new items
-        assertEquals("Matching item count", newItemCount, mTabLayout.getTabCount());
-    }
-
-    @Test
-    @SmallTest
-    public void testAdapterChange() {
-        setupTabLayoutWithViewPager();
-
-        // Verify that we have the expected initial adapter
-        PagerAdapter initialAdapter = mViewPager.getAdapter();
-        assertEquals("Initial adapter class", ColorPagerAdapter.class, initialAdapter.getClass());
-        assertEquals("Initial adapter page count", 3, initialAdapter.getCount());
-
-        // Create a new adapter
-        TextPagerAdapter newAdapter = new TextPagerAdapter();
-        final int newItemCount = 6;
-        for (int i = 0; i < newItemCount; i++) {
-            newAdapter.add("Title " + i, "Body " + i);
-        }
-        // And set it on the ViewPager
-        onView(withId(R.id.tabs_viewpager)).perform(setAdapter(newAdapter),
-                ViewPagerActions.scrollToPage(0));
-
-        // As TabLayout doesn't track adapter changes, we need to re-wire the new adapter
-        onView(withId(R.id.tabs)).perform(setupWithViewPager(mViewPager));
-
-        // We have more comprehensive test coverage for changing the ViewPager adapter in v4/tests.
-        // Here we are focused on testing the integration of TabLayout with the new
-        // content of ViewPager
-
-        assertEquals("Matching item count", newItemCount, mTabLayout.getTabCount());
-
-        for (int i = 0; i < newItemCount; i++) {
-            assertEquals("Tab #" +i, mViewPager.getAdapter().getPageTitle(i),
-                    mTabLayout.getTabAt(i).getText());
-        }
-
-        verifyViewPagerSelection();
-        verifyTabLayoutSelection();
-    }
-
-    @Test
-    @LargeTest
-    public void testFixedTabMode() {
-        // Create a new adapter (with no content)
-        final TextPagerAdapter newAdapter = new TextPagerAdapter();
-        // And set it on the ViewPager
-        onView(withId(R.id.tabs_viewpager)).perform(setAdapter(newAdapter));
-        // As TabLayout doesn't track adapter changes, we need to re-wire the new adapter
-        onView(withId(R.id.tabs)).perform(setupWithViewPager(mViewPager));
-
-        // Set fixed mode on the TabLayout
-        onView(withId(R.id.tabs)).perform(TabLayoutActions.setTabMode(TabLayout.MODE_FIXED));
-        assertEquals("Fixed tab mode", TabLayout.MODE_FIXED, mTabLayout.getTabMode());
-
-        // Add a bunch of tabs and verify that all of them are visible on the screen
-        for (int i = 0; i < 8; i++) {
-            onView(withId(R.id.tabs_viewpager)).perform(addItemToPager("Title " + i, "Body " + i));
-
-            int expectedTabCount = i + 1;
-            assertEquals("Tab count after adding #" + i, expectedTabCount,
-                    mTabLayout.getTabCount());
-            assertEquals("Page count after adding #" + i, expectedTabCount,
-                    mViewPager.getAdapter().getCount());
-
-            verifyViewPagerSelection();
-            verifyTabLayoutSelection();
-
-            // Check that all tabs are fully visible (the content may or may not be elided)
-            for (int j = 0; j < expectedTabCount; j++) {
-                onView(allOf(isDescendantOfA(withId(R.id.tabs)), withText("Title " + j))).
-                        check(matches(isCompletelyDisplayed()));
-            }
-        }
-    }
-
-    /**
-     * Helper method to verify support for min and max tab width on TabLayout in scrollable mode.
-     * It replaces the TabLayout based on the passed layout resource ID and then adds a bunch of
-     * tab titles to the wired ViewPager with progressively longer texts. After each tab is added
-     * this method then checks that all tab views respect the minimum and maximum tab width set
-     * on TabLayout.
-     *
-     * @param tabLayoutResId Layout resource for the TabLayout to be wired to the ViewPager.
-     * @param tabMinWidthResId If non zero, points to the dimension resource to use for tab min
-     * width check.
-     * @param tabMaxWidthResId If non zero, points to the dimension resource to use for tab max
-     * width check.
-     */
-    private void verifyMinMaxTabWidth(@LayoutRes int tabLayoutResId, @DimenRes int tabMinWidthResId,
-            @DimenRes int tabMaxWidthResId) {
-        setupTabLayoutWithViewPager();
-
-        assertEquals("Scrollable tab mode", TabLayout.MODE_SCROLLABLE, mTabLayout.getTabMode());
-
-        final Resources res = mActivityTestRule.getActivity().getResources();
-        final int minTabWidth = (tabMinWidthResId == 0) ? -1 :
-                res.getDimensionPixelSize(tabMinWidthResId);
-        final int maxTabWidth = (tabMaxWidthResId == 0) ? -1 :
-                res.getDimensionPixelSize(tabMaxWidthResId);
-
-        // Create a new adapter (with no content)
-        final TextPagerAdapter newAdapter = new TextPagerAdapter();
-        // And set it on the ViewPager
-        onView(withId(R.id.tabs_viewpager)).perform(setAdapter(newAdapter));
-
-        // Replace the default TabLayout with the passed one
-        onView(withId(R.id.container)).perform(TestUtilsActions.replaceTabLayout(tabLayoutResId));
-
-        // Now that we have a new TabLayout, wire it to the new content of our ViewPager
-        onView(withId(R.id.tabs)).perform(setupWithViewPager(mViewPager));
-
-        // Since TabLayout doesn't expose a getter for fetching the configured max tab width,
-        // start adding a variety of tabs with progressively longer tab titles and test that
-        // no tab is wider than the configured max width. Before we start that test,
-        // verify that we're in the scrollable mode so that each tab title gets as much width
-        // as needed to display its text.
-        assertEquals("Scrollable tab mode", TabLayout.MODE_SCROLLABLE, mTabLayout.getTabMode());
-
-        final StringBuilder tabTitleBuilder = new StringBuilder();
-        for (int i = 0; i < 40; i++) {
-            final char titleComponent = (char) ('A' + i);
-            for (int j = 0; j <= (i + 1); j++) {
-                tabTitleBuilder.append(titleComponent);
-            }
-            final String tabTitle = tabTitleBuilder.toString();
-            onView(withId(R.id.tabs_viewpager)).perform(addItemToPager(tabTitle, "Body " + i));
-
-            int expectedTabCount = i + 1;
-            // Check that all tabs are at least as wide as min width *and* at most as wide as max
-            // width specified in the XML for the newly loaded TabLayout
-            for (int j = 0; j < expectedTabCount; j++) {
-                // Find the view that is our tab title. It should be:
-                // 1. Descendant of our TabLayout
-                // 2. But not a direct child of the horizontal scroller
-                // 3. With just-added title text
-                // These conditions make sure that we're selecting the "top-level" tab view
-                // instead of the inner (and narrower) TextView
-                Matcher<View> tabMatcher = allOf(
-                        isDescendantOfA(withId(R.id.tabs)),
-                        not(withParent(isAssignableFrom(HorizontalScrollView.class))),
-                        hasDescendant(withText(tabTitle)));
-                if (minTabWidth >= 0) {
-                    onView(tabMatcher).check(matches(
-                            TestUtilsMatchers.isNotNarrowerThan(minTabWidth)));
-                }
-                if (maxTabWidth >= 0) {
-                    onView(tabMatcher).check(matches(
-                            TestUtilsMatchers.isNotWiderThan(maxTabWidth)));
-                }
-            }
-
-            // Reset the title builder for the next tab
-            tabTitleBuilder.setLength(0);
-            tabTitleBuilder.trimToSize();
-        }
-
-    }
-
-    @Test
-    @LargeTest
-    public void testMinTabWidth() {
-        verifyMinMaxTabWidth(R.layout.tab_layout_bound_min, R.dimen.tab_width_limit_medium, 0);
-    }
-
-    @Test
-    @LargeTest
-    public void testMaxTabWidth() {
-        verifyMinMaxTabWidth(R.layout.tab_layout_bound_max, 0, R.dimen.tab_width_limit_medium);
-    }
-
-    @Test
-    @LargeTest
-    public void testMinMaxTabWidth() {
-        verifyMinMaxTabWidth(R.layout.tab_layout_bound_minmax, R.dimen.tab_width_limit_small,
-                R.dimen.tab_width_limit_large);
-    }
-
-    @Test
-    @SmallTest
-    public void testSetupAfterViewPagerScrolled() {
-        // Scroll to the last item
-        final int selected = mViewPager.getAdapter().getCount() - 1;
-        onView(withId(R.id.tabs_viewpager)).perform(ViewPagerActions.scrollToPage(selected));
-
-        // Now setup the TabLayout with the ViewPager
-        setupTabLayoutWithViewPager();
-
-        assertEquals("Selected page", selected, mViewPager.getCurrentItem());
-        assertEquals("Selected tab", selected, mTabLayout.getSelectedTabPosition());
-    }
-
-    @Test
-    @SmallTest
-    public void testEmptyAdapter() {
-        ColorPagerAdapter adapter = new ColorPagerAdapter();
-        onView(withId(R.id.tabs_viewpager)).perform(setAdapter(adapter));
-    }
-
-}
diff --git a/design/tests/src/android/support/design/widget/TextInputLayoutActivity.java b/design/tests/src/android/support/design/widget/TextInputLayoutActivity.java
deleted file mode 100644
index 613ae6e..0000000
--- a/design/tests/src/android/support/design/widget/TextInputLayoutActivity.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import android.support.design.test.R;
-
-public class TextInputLayoutActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.design_text_input;
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/TextInputLayoutPseudoLocaleTest.java b/design/tests/src/android/support/design/widget/TextInputLayoutPseudoLocaleTest.java
deleted file mode 100755
index 9d705db..0000000
--- a/design/tests/src/android/support/design/widget/TextInputLayoutPseudoLocaleTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static android.support.test.InstrumentationRegistry.getContext;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.typeText;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-
-import android.content.Context;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.support.design.test.R;
-import android.support.test.filters.MediumTest;
-
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import java.util.Locale;
-
-@MediumTest
-public class TextInputLayoutPseudoLocaleTest extends
-        BaseInstrumentationTestCase<TextInputLayoutActivity> {
-
-    private static final String ORIGINAL_LANGUAGE = Locale.getDefault().getLanguage();
-    private static final String ORIGINAL_COUNTRY = Locale.getDefault().getLanguage();
-
-    @BeforeClass
-    public static void setup() {
-        // Change language to pseudo locale.
-        setLocale("ar", "XB", getContext());
-    }
-
-    public TextInputLayoutPseudoLocaleTest() {
-        super(TextInputLayoutActivity.class);
-    }
-
-    private static void setLocale(String language,  String country,  Context context) {
-        context = context.getApplicationContext();
-        Resources resources = context.getResources();
-        Configuration configuration = resources.getConfiguration();
-        configuration.setLocale(new Locale(language, country));
-        resources.updateConfiguration(configuration, resources.getDisplayMetrics());
-    }
-
-    @Test
-    public void testSimpleEdit() {
-        // Type some text
-        onView(withId(R.id.textinput_edittext)).perform(typeText("123"));
-    }
-
-    @AfterClass
-    public static void  cleanup() {
-        setLocale(ORIGINAL_LANGUAGE, ORIGINAL_COUNTRY, getContext());
-    }
-}
diff --git a/design/tests/src/android/support/design/widget/TextInputLayoutTest.java b/design/tests/src/android/support/design/widget/TextInputLayoutTest.java
deleted file mode 100755
index 5969235..0000000
--- a/design/tests/src/android/support/design/widget/TextInputLayoutTest.java
+++ /dev/null
@@ -1,559 +0,0 @@
-/*
- * 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 android.support.design.widget;
-
-import static android.support.design.testutils.TestUtilsActions.setCompoundDrawablesRelative;
-import static android.support.design.testutils.TestUtilsActions.setEnabled;
-import static android.support.design.testutils.TestUtilsMatchers.withCompoundDrawable;
-import static android.support.design.testutils.TestUtilsMatchers.withTextColor;
-import static android.support.design.testutils.TestUtilsMatchers.withTypeface;
-import static android.support.design.testutils.TextInputLayoutActions.clickPasswordToggle;
-import static android.support.design.testutils.TextInputLayoutActions.setCounterEnabled;
-import static android.support.design.testutils.TextInputLayoutActions.setCounterMaxLength;
-import static android.support.design.testutils.TextInputLayoutActions.setError;
-import static android.support.design.testutils.TextInputLayoutActions.setErrorEnabled;
-import static android.support.design.testutils.TextInputLayoutActions.setErrorTextAppearance;
-import static android.support.design.testutils.TextInputLayoutActions
-        .setPasswordVisibilityToggleEnabled;
-import static android.support.design.testutils.TextInputLayoutActions.setTypeface;
-import static android.support.design.testutils.TextInputLayoutMatchers.doesNotShowPasswordToggle;
-import static android.support.design.testutils.TextInputLayoutMatchers
-        .passwordToggleHasContentDescription;
-import static android.support.design.testutils.TextInputLayoutMatchers.passwordToggleIsNotChecked;
-import static android.support.test.InstrumentationRegistry.getInstrumentation;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.action.ViewActions.typeText;
-import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.contrib.AccessibilityChecks.accessibilityAssertion;
-import static android.support.test.espresso.matcher.ViewMatchers.hasFocus;
-import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.isEnabled;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-
-import static org.hamcrest.Matchers.not;
-import static org.hamcrest.core.AllOf.allOf;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import android.app.Activity;
-import android.content.Context;
-import android.graphics.Color;
-import android.graphics.Typeface;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.os.Parcelable;
-import android.support.design.test.R;
-import android.support.design.testutils.TestUtils;
-import android.support.design.testutils.ViewStructureImpl;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.espresso.NoMatchingViewException;
-import android.support.test.espresso.ViewAssertion;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SdkSuppress;
-import android.support.testutils.AppCompatActivityUtils;
-import android.support.testutils.RecreatedAppCompatActivity;
-import android.support.v4.widget.TextViewCompat;
-import android.text.method.PasswordTransformationMethod;
-import android.text.method.TransformationMethod;
-import android.util.AttributeSet;
-import android.util.SparseArray;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.inputmethod.EditorInfo;
-import android.widget.EditText;
-
-import org.junit.Test;
-
-@MediumTest
-public class TextInputLayoutTest extends BaseInstrumentationTestCase<TextInputLayoutActivity> {
-
-    private static final String ERROR_MESSAGE_1 = "An error has occured";
-    private static final String ERROR_MESSAGE_2 = "Some other error has occured";
-
-    private static final String INPUT_TEXT = "Random input text";
-
-    private static final Typeface CUSTOM_TYPEFACE = Typeface.SANS_SERIF;
-
-    public class TestTextInputLayout extends TextInputLayout {
-        public int animateToExpansionFractionCount = 0;
-        public float animateToExpansionFractionRecentValue = -1;
-
-        public TestTextInputLayout(Context context) {
-            super(context);
-        }
-
-        public TestTextInputLayout(Context context, AttributeSet attrs) {
-            super(context, attrs);
-        }
-
-        public TestTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) {
-            super(context, attrs, defStyleAttr);
-        }
-
-        @Override
-        protected void animateToExpansionFraction(float target) {
-            super.animateToExpansionFraction(target);
-            animateToExpansionFractionRecentValue = target;
-            animateToExpansionFractionCount++;
-        }
-    }
-
-    public TextInputLayoutTest() {
-        super(TextInputLayoutActivity.class);
-    }
-
-    @Test
-    public void testTypingTextCollapsesHint() {
-        // Type some text
-        onView(withId(R.id.textinput_edittext)).perform(typeText(INPUT_TEXT));
-        // ...and check that the hint has collapsed
-        onView(withId(R.id.textinput)).check(isHintExpanded(false));
-    }
-
-    @Test
-    public void testSetErrorEnablesErrorIsDisplayed() {
-        onView(withId(R.id.textinput)).perform(setError(ERROR_MESSAGE_1));
-        onView(withText(ERROR_MESSAGE_1)).check(matches(isDisplayed()));
-    }
-
-    @Test
-    public void testDisabledErrorIsNotDisplayed() {
-        // First show an error, and then disable error functionality
-        onView(withId(R.id.textinput))
-                .perform(setError(ERROR_MESSAGE_1))
-                .perform(setErrorEnabled(false));
-
-        // Check that the error is no longer there
-        onView(withText(ERROR_MESSAGE_1)).check(doesNotExist());
-    }
-
-    @Test
-    public void testSetErrorOnDisabledSetErrorIsDisplayed() {
-        // First show an error, and then disable error functionality
-        onView(withId(R.id.textinput))
-                .perform(setError(ERROR_MESSAGE_1))
-                .perform(setErrorEnabled(false));
-
-        // Now show a different error message
-        onView(withId(R.id.textinput)).perform(setError(ERROR_MESSAGE_2));
-        // And check that it is displayed
-        onView(withText(ERROR_MESSAGE_2)).check(matches(isDisplayed()));
-    }
-
-    @Test
-    public void testPasswordToggleClick() {
-        // Type some text on the EditText
-        onView(withId(R.id.textinput_edittext_pwd)).perform(typeText(INPUT_TEXT));
-
-        final Activity activity = mActivityTestRule.getActivity();
-        final EditText textInput = (EditText) activity.findViewById(R.id.textinput_edittext_pwd);
-
-        // Assert that the password is disguised
-        assertNotEquals(INPUT_TEXT, textInput.getLayout().getText().toString());
-
-        // Now click the toggle button
-        onView(withId(R.id.textinput_password)).perform(clickPasswordToggle());
-
-        // And assert that the password is not disguised
-        assertEquals(INPUT_TEXT, textInput.getLayout().getText().toString());
-    }
-
-    @Test
-    public void testPasswordToggleDisable() {
-        final Activity activity = mActivityTestRule.getActivity();
-        final EditText textInput = (EditText) activity.findViewById(R.id.textinput_edittext_pwd);
-
-        // Set some text on the EditText
-        onView(withId(R.id.textinput_edittext_pwd))
-                .perform(typeText(INPUT_TEXT));
-        // Assert that the password is disguised
-        assertNotEquals(INPUT_TEXT, textInput.getLayout().getText().toString());
-
-        // Disable the password toggle
-        onView(withId(R.id.textinput_password))
-                .perform(setPasswordVisibilityToggleEnabled(false));
-
-        // Check that the password toggle view is not visible
-        onView(withId(R.id.textinput_password)).check(matches(doesNotShowPasswordToggle()));
-        // ...and that the password is disguised still
-        assertNotEquals(INPUT_TEXT, textInput.getLayout().getText().toString());
-    }
-
-    @Test
-    public void testPasswordToggleDisableWhenVisible() {
-        final Activity activity = mActivityTestRule.getActivity();
-        final EditText textInput = (EditText) activity.findViewById(R.id.textinput_edittext_pwd);
-
-        // Type some text on the EditText
-        onView(withId(R.id.textinput_edittext_pwd)).perform(typeText(INPUT_TEXT));
-        // Assert that the password is disguised
-        assertNotEquals(INPUT_TEXT, textInput.getLayout().getText().toString());
-
-        // Now click the toggle button
-        onView(withId(R.id.textinput_password)).perform(clickPasswordToggle());
-        // Disable the password toggle
-        onView(withId(R.id.textinput_password))
-                .perform(setPasswordVisibilityToggleEnabled(false));
-
-        // Check that the password is disguised again
-        assertNotEquals(INPUT_TEXT, textInput.getLayout().getText().toString());
-    }
-
-    @Test
-    public void testPasswordToggleMaintainsCompoundDrawables() {
-        // Set a known set of test compound drawables on the EditText
-        final Drawable start = new ColorDrawable(Color.RED);
-        final Drawable top = new ColorDrawable(Color.GREEN);
-        final Drawable end = new ColorDrawable(Color.BLUE);
-        final Drawable bottom = new ColorDrawable(Color.BLACK);
-        onView(withId(R.id.textinput_edittext_pwd))
-                .perform(setCompoundDrawablesRelative(start, top, end, bottom));
-
-        // Enable the password toggle and check that the start, top and bottom drawables are
-        // maintained
-        onView(withId(R.id.textinput_password))
-                .perform(setPasswordVisibilityToggleEnabled(true));
-        onView(withId(R.id.textinput_edittext_pwd))
-                .check(matches(withCompoundDrawable(0, start)))
-                .check(matches(withCompoundDrawable(1, top)))
-                .check(matches(not(withCompoundDrawable(2, end))))
-                .check(matches(withCompoundDrawable(3, bottom)));
-
-        // Now disable the password toggle and check that all of the original compound drawables
-        // are set
-        onView(withId(R.id.textinput_password))
-                .perform(setPasswordVisibilityToggleEnabled(false));
-        onView(withId(R.id.textinput_edittext_pwd))
-                .check(matches(withCompoundDrawable(0, start)))
-                .check(matches(withCompoundDrawable(1, top)))
-                .check(matches(withCompoundDrawable(2, end)))
-                .check(matches(withCompoundDrawable(3, bottom)));
-    }
-
-    @Test
-    public void testPasswordToggleIsHiddenAfterReenable() {
-        final Activity activity = mActivityTestRule.getActivity();
-        final EditText textInput = (EditText) activity.findViewById(R.id.textinput_edittext_pwd);
-
-        // Type some text on the EditText and then click the toggle button
-        onView(withId(R.id.textinput_edittext_pwd)).perform(typeText(INPUT_TEXT));
-        onView(withId(R.id.textinput_password)).perform(clickPasswordToggle());
-
-        // Disable the password toggle, and then re-enable it
-        onView(withId(R.id.textinput_password))
-                .perform(setPasswordVisibilityToggleEnabled(false))
-                .perform(setPasswordVisibilityToggleEnabled(true));
-
-        // Check that the password is disguised and the toggle button reflects the same state
-        assertNotEquals(INPUT_TEXT, textInput.getLayout().getText().toString());
-        onView(withId(R.id.textinput_password)).check(matches(passwordToggleIsNotChecked()));
-    }
-
-    @Test
-    public void testSetEnabledFalse() {
-        // First click on the EditText, so that it is focused and the hint collapses...
-        onView(withId(R.id.textinput_edittext)).perform(click());
-
-        // Now disable the TextInputLayout and check that the hint expands
-        onView(withId(R.id.textinput))
-                .perform(setEnabled(false))
-                .check(isHintExpanded(true));
-
-        // Finally check that the EditText is no longer enabled
-        onView(withId(R.id.textinput_edittext)).check(matches(not(isEnabled())));
-    }
-
-    @Test
-    public void testSetEnabledFalseWithText() {
-        // First set some text, then disable the TextInputLayout
-        onView(withId(R.id.textinput_edittext))
-                .perform(typeText(INPUT_TEXT));
-        onView(withId(R.id.textinput)).perform(setEnabled(false));
-
-        // Now check that the EditText is no longer enabled
-        onView(withId(R.id.textinput_edittext)).check(matches(not(isEnabled())));
-    }
-
-    @UiThreadTest
-    @Test
-    public void testExtractUiHintSet() {
-        final Activity activity = mActivityTestRule.getActivity();
-
-        // Set a hint on the TextInputLayout
-        final TextInputLayout layout = (TextInputLayout) activity.findViewById(R.id.textinput);
-        layout.setHint(INPUT_TEXT);
-
-        final EditText editText = (EditText) activity.findViewById(R.id.textinput_edittext);
-
-        // Now manually pass in a EditorInfo to the EditText and make sure it updates the
-        // hintText to our known value
-        final EditorInfo info = new EditorInfo();
-        editText.onCreateInputConnection(info);
-
-        assertEquals(INPUT_TEXT, info.hintText);
-    }
-
-    @UiThreadTest
-    @Test
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-    public void testDispatchProvideAutofillStructure() {
-        final Activity activity = mActivityTestRule.getActivity();
-
-        final TextInputLayout layout = activity.findViewById(R.id.textinput);
-
-        final ViewStructureImpl structure = new ViewStructureImpl();
-        layout.dispatchProvideAutofillStructure(structure, 0);
-
-        assertEquals(2, structure.getChildCount()); // EditText and TextView
-
-        // Asserts the structure.
-        final ViewStructureImpl childStructure = structure.getChildAt(0);
-        assertEquals(EditText.class.getName(), childStructure.getClassName());
-        assertEquals("Hint to the user", childStructure.getHint());
-
-        // Make sure the widget's hint was restored.
-        assertEquals("Hint to the user", layout.getHint());
-        final EditText editText = activity.findViewById(R.id.textinput_edittext);
-        assertNull(editText.getHint());
-    }
-
-    /**
-     * Regression test for b/31663756.
-     */
-    @UiThreadTest
-    @Test
-    public void testDrawableStateChanged() {
-        final Activity activity = mActivityTestRule.getActivity();
-        final TextInputLayout layout = (TextInputLayout) activity.findViewById(R.id.textinput);
-
-        // Force a drawable state change.
-        layout.drawableStateChanged();
-    }
-
-    @UiThreadTest
-    @Test
-    public void testSaveRestoreStateAnimation() {
-        final Activity activity = mActivityTestRule.getActivity();
-        final TestTextInputLayout layout = new TestTextInputLayout(activity);
-        layout.setId(R.id.textinputlayout);
-        final TextInputEditText editText = new TextInputEditText(activity);
-        editText.setText(INPUT_TEXT);
-        editText.setId(R.id.textinputedittext);
-        layout.addView(editText);
-
-        SparseArray<Parcelable> container = new SparseArray<>();
-        layout.saveHierarchyState(container);
-        layout.restoreHierarchyState(container);
-        assertEquals("Expected no animations since we simply saved/restored state",
-                0, layout.animateToExpansionFractionCount);
-
-        editText.setText("");
-        assertEquals("Expected one call to animate because we cleared text in editText",
-                1, layout.animateToExpansionFractionCount);
-        assertEquals(0f, layout.animateToExpansionFractionRecentValue, 0f);
-
-        container = new SparseArray<>();
-        layout.saveHierarchyState(container);
-        layout.restoreHierarchyState(container);
-        assertEquals("Expected no additional animations since we simply saved/restored state",
-                1, layout.animateToExpansionFractionCount);
-    }
-
-    @UiThreadTest
-    @Test
-    public void testMaintainsLeftRightCompoundDrawables() throws Throwable {
-        final Activity activity = mActivityTestRule.getActivity();
-
-        // Set a known set of test compound drawables on the EditText
-        final Drawable left = new ColorDrawable(Color.RED);
-        final Drawable top = new ColorDrawable(Color.GREEN);
-        final Drawable right = new ColorDrawable(Color.BLUE);
-        final Drawable bottom = new ColorDrawable(Color.BLACK);
-
-        final TextInputEditText editText = new TextInputEditText(activity);
-        editText.setCompoundDrawables(left, top, right, bottom);
-
-        // Now add the EditText to a TextInputLayout
-        TextInputLayout til = (TextInputLayout)
-                activity.findViewById(R.id.textinput_noedittext);
-        til.addView(editText);
-
-        // Finally assert that all of the drawables are untouched
-        final Drawable[] compoundDrawables = editText.getCompoundDrawables();
-        assertSame(left, compoundDrawables[0]);
-        assertSame(top, compoundDrawables[1]);
-        assertSame(right, compoundDrawables[2]);
-        assertSame(bottom, compoundDrawables[3]);
-    }
-
-    @UiThreadTest
-    @Test
-    public void testMaintainsStartEndCompoundDrawables() throws Throwable {
-        final Activity activity = mActivityTestRule.getActivity();
-
-        // Set a known set of test compound drawables on the EditText
-        final Drawable start = new ColorDrawable(Color.RED);
-        final Drawable top = new ColorDrawable(Color.GREEN);
-        final Drawable end = new ColorDrawable(Color.BLUE);
-        final Drawable bottom = new ColorDrawable(Color.BLACK);
-
-        final TextInputEditText editText = new TextInputEditText(activity);
-        TextViewCompat.setCompoundDrawablesRelative(editText, start, top, end, bottom);
-
-        // Now add the EditText to a TextInputLayout
-        TextInputLayout til = (TextInputLayout)
-                activity.findViewById(R.id.textinput_noedittext);
-        til.addView(editText);
-
-        // Finally assert that all of the drawables are untouched
-        final Drawable[] compoundDrawables = TextViewCompat.getCompoundDrawablesRelative(editText);
-        assertSame(start, compoundDrawables[0]);
-        assertSame(top, compoundDrawables[1]);
-        assertSame(end, compoundDrawables[2]);
-        assertSame(bottom, compoundDrawables[3]);
-    }
-
-    @Test
-    public void testPasswordToggleHasDefaultContentDescription() {
-        // Check that the TextInputLayout says that it has a content description and that the
-        // underlying toggle has content description as well
-        onView(withId(R.id.textinput_password))
-                .check(matches(passwordToggleHasContentDescription()));
-    }
-
-    /**
-     * Simple test that uses AccessibilityChecks to check that the password toggle icon is
-     * 'accessible'.
-     */
-    @Test
-    public void testPasswordToggleIsAccessible() {
-        onView(allOf(withId(R.id.text_input_password_toggle),
-                isDescendantOfA(withId(R.id.textinput_password)))).check(accessibilityAssertion());
-    }
-
-    @Test
-    public void testSetTypefaceUpdatesErrorView() {
-        onView(withId(R.id.textinput))
-                .perform(setErrorEnabled(true))
-                .perform(setError(ERROR_MESSAGE_1))
-                .perform(setTypeface(CUSTOM_TYPEFACE));
-
-        // Check that the error message is updated
-        onView(withText(ERROR_MESSAGE_1))
-                .check(matches(withTypeface(CUSTOM_TYPEFACE)));
-    }
-
-    @Test
-    public void testSetTypefaceUpdatesCharacterCountView() {
-        // Turn on character counting
-        onView(withId(R.id.textinput))
-                .perform(setCounterEnabled(true), setCounterMaxLength(10))
-                .perform(setTypeface(CUSTOM_TYPEFACE));
-
-        // Check that the counter message is updated
-        onView(withId(R.id.textinput_counter))
-                .check(matches(withTypeface(CUSTOM_TYPEFACE)));
-    }
-
-    @Test
-    public void testThemedColorStateListForErrorTextColor() {
-        final Activity activity = mActivityTestRule.getActivity();
-        final int textColor = TestUtils.getThemeAttrColor(activity, R.attr.colorAccent);
-
-        onView(withId(R.id.textinput))
-                .perform(setErrorEnabled(true))
-                .perform(setError(ERROR_MESSAGE_1))
-                .perform(setErrorTextAppearance(R.style.TextAppearanceWithThemedCslTextColor));
-
-        onView(withText(ERROR_MESSAGE_1))
-                .check(matches(withTextColor(textColor)));
-    }
-
-    @Test
-    public void testTextSetViaAttributeCollapsedHint() {
-        onView(withId(R.id.textinput_with_text)).check(isHintExpanded(false));
-    }
-
-    @Test
-    public void testFocusMovesToEditTextWithPasswordEnabled() {
-        // Focus the preceding EditText
-        onView(withId(R.id.textinput_edittext))
-                .perform(click())
-                .check(matches(hasFocus()));
-
-        // Then send a TAB to focus the next view
-        getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_TAB);
-
-        // And check that the EditText is focused
-        onView(withId(R.id.textinput_edittext_pwd))
-                .check(matches(hasFocus()));
-    }
-
-    @Test
-    @LargeTest
-    public void testSaveAndRestorePasswordVisibility() throws Throwable {
-        // Type some text on the EditText
-        onView(withId(R.id.textinput_edittext_pwd)).perform(typeText(INPUT_TEXT));
-        onView(withId(R.id.textinput_password)).check(isPasswordToggledVisible(false));
-
-        // Toggle password to be shown as plain text
-        onView(withId(R.id.textinput_password)).perform(clickPasswordToggle());
-        onView(withId(R.id.textinput_password)).check(isPasswordToggledVisible(true));
-
-        RecreatedAppCompatActivity activity = mActivityTestRule.getActivity();
-        AppCompatActivityUtils.recreateActivity(mActivityTestRule, activity);
-        AppCompatActivityUtils.waitForExecution(mActivityTestRule);
-
-        // Check that the password is still toggled to be shown as plain text
-        onView(withId(R.id.textinput_password)).check(isPasswordToggledVisible(true));
-    }
-
-    static ViewAssertion isHintExpanded(final boolean expanded) {
-        return new ViewAssertion() {
-            @Override
-            public void check(View view, NoMatchingViewException noViewFoundException) {
-                assertTrue(view instanceof TextInputLayout);
-                assertEquals(expanded, ((TextInputLayout) view).isHintExpanded());
-            }
-        };
-    }
-
-    static ViewAssertion isPasswordToggledVisible(final boolean isToggledVisible) {
-        return new ViewAssertion() {
-            @Override
-            public void check(View view, NoMatchingViewException noViewFoundException) {
-                assertTrue(view instanceof TextInputLayout);
-                EditText editText = ((TextInputLayout) view).getEditText();
-                TransformationMethod transformationMethod = editText.getTransformationMethod();
-                if (isToggledVisible) {
-                    assertNull(transformationMethod);
-                } else {
-                    assertEquals(PasswordTransformationMethod.getInstance(), transformationMethod);
-                }
-            }
-        };
-    }
-}
diff --git a/design/tests/src/android/support/test/rule/BootlegActivityTestRule.java b/design/tests/src/android/support/test/rule/BootlegActivityTestRule.java
deleted file mode 100644
index b12edfa..0000000
--- a/design/tests/src/android/support/test/rule/BootlegActivityTestRule.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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 android.support.test.rule;
-
-import android.app.Activity;
-import android.support.annotation.NonNull;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.intercepting.SingleActivityFactory;
-
-/**
- * An extension of existing {@link ActivityTestRule} that contains a fix for finishActivity()
- * method (cr/138555678).
- *
- * Remove this once we move to Android Test Runner 0.7.
- */
-public class BootlegActivityTestRule<T extends Activity> extends ActivityTestRule {
-    public BootlegActivityTestRule(Class activityClass) {
-        super(activityClass);
-    }
-
-    public BootlegActivityTestRule(Class<T> activityClass, boolean initialTouchMode) {
-        super(activityClass, initialTouchMode);
-    }
-
-    public BootlegActivityTestRule(Class<T> activityClass, boolean initialTouchMode,
-            boolean launchActivity) {
-        super(activityClass, initialTouchMode, launchActivity);
-    }
-
-    public BootlegActivityTestRule(
-            SingleActivityFactory activityFactory,
-            boolean initialTouchMode, boolean launchActivity) {
-        super(activityFactory, initialTouchMode, launchActivity);
-    }
-
-    public BootlegActivityTestRule(Class<T> activityClass,
-            @NonNull String targetPackage, int launchFlags,
-            boolean initialTouchMode, boolean launchActivity) {
-        super(activityClass, targetPackage, launchFlags, initialTouchMode, launchActivity);
-    }
-
-    @Override
-    public void finishActivity() {
-        super.finishActivity();
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-    }
-
-    @Override
-    public T getActivity() {
-        return (T) super.getActivity();
-    }
-}
diff --git a/development/unbundled-build b/development/unbundled-build
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/development/unbundled-build
diff --git a/dynamic-animation/Android.mk b/dynamic-animation/Android.mk
deleted file mode 100644
index 98e8f45..0000000
--- a/dynamic-animation/Android.mk
+++ /dev/null
@@ -1,30 +0,0 @@
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-dynamic-animation
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-compat
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/dynamic-animation/api/27.1.0.txt b/dynamic-animation/api/27.1.0.txt
new file mode 100644
index 0000000..73d20b8
--- /dev/null
+++ b/dynamic-animation/api/27.1.0.txt
@@ -0,0 +1,103 @@
+package android.support.animation {
+
+  public abstract class DynamicAnimation<T extends android.support.animation.DynamicAnimation<T>> {
+    method public T addEndListener(android.support.animation.DynamicAnimation.OnAnimationEndListener);
+    method public T addUpdateListener(android.support.animation.DynamicAnimation.OnAnimationUpdateListener);
+    method public void cancel();
+    method public float getMinimumVisibleChange();
+    method public boolean isRunning();
+    method public void removeEndListener(android.support.animation.DynamicAnimation.OnAnimationEndListener);
+    method public void removeUpdateListener(android.support.animation.DynamicAnimation.OnAnimationUpdateListener);
+    method public T setMaxValue(float);
+    method public T setMinValue(float);
+    method public T setMinimumVisibleChange(float);
+    method public T setStartValue(float);
+    method public T setStartVelocity(float);
+    method public void start();
+    field public static final android.support.animation.DynamicAnimation.ViewProperty ALPHA;
+    field public static final float MIN_VISIBLE_CHANGE_ALPHA = 0.00390625f;
+    field public static final float MIN_VISIBLE_CHANGE_PIXELS = 1.0f;
+    field public static final float MIN_VISIBLE_CHANGE_ROTATION_DEGREES = 0.1f;
+    field public static final float MIN_VISIBLE_CHANGE_SCALE = 0.002f;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty ROTATION;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty ROTATION_X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty ROTATION_Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty SCALE_X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty SCALE_Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty SCROLL_X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty SCROLL_Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty TRANSLATION_X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty TRANSLATION_Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty TRANSLATION_Z;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty Z;
+  }
+
+  public static abstract interface DynamicAnimation.OnAnimationEndListener {
+    method public abstract void onAnimationEnd(android.support.animation.DynamicAnimation, boolean, float, float);
+  }
+
+  public static abstract interface DynamicAnimation.OnAnimationUpdateListener {
+    method public abstract void onAnimationUpdate(android.support.animation.DynamicAnimation, float, float);
+  }
+
+  public static abstract class DynamicAnimation.ViewProperty extends android.support.animation.FloatPropertyCompat {
+  }
+
+  public final class FlingAnimation extends android.support.animation.DynamicAnimation {
+    ctor public FlingAnimation(android.support.animation.FloatValueHolder);
+    ctor public FlingAnimation(K, android.support.animation.FloatPropertyCompat<K>);
+    method public float getFriction();
+    method public android.support.animation.FlingAnimation setFriction(float);
+    method public android.support.animation.FlingAnimation setMaxValue(float);
+    method public android.support.animation.FlingAnimation setMinValue(float);
+    method public android.support.animation.FlingAnimation setStartVelocity(float);
+  }
+
+  public abstract class FloatPropertyCompat<T> {
+    ctor public FloatPropertyCompat(java.lang.String);
+    method public static <T> android.support.animation.FloatPropertyCompat<T> createFloatPropertyCompat(android.util.FloatProperty<T>);
+    method public abstract float getValue(T);
+    method public abstract void setValue(T, float);
+  }
+
+  public final class FloatValueHolder {
+    ctor public FloatValueHolder();
+    ctor public FloatValueHolder(float);
+    method public float getValue();
+    method public void setValue(float);
+  }
+
+  public final class SpringAnimation extends android.support.animation.DynamicAnimation {
+    ctor public SpringAnimation(android.support.animation.FloatValueHolder);
+    ctor public SpringAnimation(K, android.support.animation.FloatPropertyCompat<K>);
+    ctor public SpringAnimation(K, android.support.animation.FloatPropertyCompat<K>, float);
+    method public void animateToFinalPosition(float);
+    method public boolean canSkipToEnd();
+    method public android.support.animation.SpringForce getSpring();
+    method public android.support.animation.SpringAnimation setSpring(android.support.animation.SpringForce);
+    method public void skipToEnd();
+  }
+
+  public final class SpringForce {
+    ctor public SpringForce();
+    ctor public SpringForce(float);
+    method public float getDampingRatio();
+    method public float getFinalPosition();
+    method public float getStiffness();
+    method public android.support.animation.SpringForce setDampingRatio(float);
+    method public android.support.animation.SpringForce setFinalPosition(float);
+    method public android.support.animation.SpringForce setStiffness(float);
+    field public static final float DAMPING_RATIO_HIGH_BOUNCY = 0.2f;
+    field public static final float DAMPING_RATIO_LOW_BOUNCY = 0.75f;
+    field public static final float DAMPING_RATIO_MEDIUM_BOUNCY = 0.5f;
+    field public static final float DAMPING_RATIO_NO_BOUNCY = 1.0f;
+    field public static final float STIFFNESS_HIGH = 10000.0f;
+    field public static final float STIFFNESS_LOW = 200.0f;
+    field public static final float STIFFNESS_MEDIUM = 1500.0f;
+    field public static final float STIFFNESS_VERY_LOW = 50.0f;
+  }
+
+}
+
diff --git a/emoji/Android.mk b/emoji/Android.mk
deleted file mode 100644
index 337f5b9..0000000
--- a/emoji/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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.
-
-LOCAL_PATH:= $(call my-dir)
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/emoji/appcompat/Android.mk b/emoji/appcompat/Android.mk
deleted file mode 100644
index 0ef8cb7..0000000
--- a/emoji/appcompat/Android.mk
+++ /dev/null
@@ -1,42 +0,0 @@
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-emoji-appcompat \
-#       android-support-v7-appcompat \
-#       android-support-emoji \
-#       android-support-compat
-#
-# in their makefiles to include the resources and their dependencies in their package.
-#
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-emoji-appcompat
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-v7-appcompat \
-    android-support-emoji \
-    android-support-compat
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/emoji/appcompat/api/27.1.0.txt b/emoji/appcompat/api/27.1.0.txt
new file mode 100644
index 0000000..2c5e5c0
--- /dev/null
+++ b/emoji/appcompat/api/27.1.0.txt
@@ -0,0 +1,24 @@
+package android.support.text.emoji.widget {
+
+  public class EmojiAppCompatButton extends android.support.v7.widget.AppCompatButton {
+    ctor public EmojiAppCompatButton(android.content.Context);
+    ctor public EmojiAppCompatButton(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiAppCompatButton(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class EmojiAppCompatEditText extends android.support.v7.widget.AppCompatEditText {
+    ctor public EmojiAppCompatEditText(android.content.Context);
+    ctor public EmojiAppCompatEditText(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiAppCompatEditText(android.content.Context, android.util.AttributeSet, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(int);
+  }
+
+  public class EmojiAppCompatTextView extends android.support.v7.widget.AppCompatTextView {
+    ctor public EmojiAppCompatTextView(android.content.Context);
+    ctor public EmojiAppCompatTextView(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiAppCompatTextView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+}
+
diff --git a/emoji/bundled/Android.mk b/emoji/bundled/Android.mk
deleted file mode 100644
index c5c1ac9..0000000
--- a/emoji/bundled/Android.mk
+++ /dev/null
@@ -1,40 +0,0 @@
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-emoji-bundled \
-#       android-support-emoji \
-#       android-support-compat
-#
-# in their makefiles to include the resources and their dependencies in their package.
-#
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-emoji-bundled
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-emoji \
-    android-support-compat
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/emoji/bundled/api/27.1.0.txt b/emoji/bundled/api/27.1.0.txt
new file mode 100644
index 0000000..8812247
--- /dev/null
+++ b/emoji/bundled/api/27.1.0.txt
@@ -0,0 +1,8 @@
+package android.support.text.emoji.bundled {
+
+  public class BundledEmojiCompatConfig extends android.support.text.emoji.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji/core/Android.mk b/emoji/core/Android.mk
deleted file mode 100644
index 89426f0..0000000
--- a/emoji/core/Android.mk
+++ /dev/null
@@ -1,41 +0,0 @@
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-emoji \
-#       android-support-compat
-#
-# in their makefiles to include the resources and their dependencies in their package.
-#
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-emoji
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/src/main/res
-LOCAL_STATIC_JAVA_LIBRARIES := \
-    noto-emoji-compat-java
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-compat
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/emoji/core/api/27.1.0.txt b/emoji/core/api/27.1.0.txt
new file mode 100644
index 0000000..40bd7d8
--- /dev/null
+++ b/emoji/core/api/27.1.0.txt
@@ -0,0 +1,136 @@
+package android.support.text.emoji {
+
+  public class EmojiCompat {
+    method public static android.support.text.emoji.EmojiCompat get();
+    method public java.lang.String getAssetSignature();
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, int, int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method public boolean hasEmojiGlyph(java.lang.CharSequence);
+    method public boolean hasEmojiGlyph(java.lang.CharSequence, int);
+    method public static android.support.text.emoji.EmojiCompat init(android.support.text.emoji.EmojiCompat.Config);
+    method public java.lang.CharSequence process(java.lang.CharSequence);
+    method public java.lang.CharSequence process(java.lang.CharSequence, int, int);
+    method public java.lang.CharSequence process(java.lang.CharSequence, int, int, int);
+    method public java.lang.CharSequence process(java.lang.CharSequence, int, int, int, int);
+    method public void registerInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
+    field public static final java.lang.String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final java.lang.String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public static abstract class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(android.support.text.emoji.EmojiCompat.MetadataRepoLoader);
+    method protected final android.support.text.emoji.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public android.support.text.emoji.EmojiCompat.Config registerInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
+    method public android.support.text.emoji.EmojiCompat.Config setEmojiSpanIndicatorColor(int);
+    method public android.support.text.emoji.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public android.support.text.emoji.EmojiCompat.Config setReplaceAll(boolean);
+    method public android.support.text.emoji.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public android.support.text.emoji.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer>);
+    method public android.support.text.emoji.EmojiCompat.Config unregisterInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
+  }
+
+  public static abstract class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(java.lang.Throwable);
+    method public void onInitialized();
+  }
+
+  public static abstract interface EmojiCompat.MetadataRepoLoader {
+    method public abstract void load(android.support.text.emoji.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public static abstract class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(java.lang.Throwable);
+    method public abstract void onLoaded(android.support.text.emoji.MetadataRepo);
+  }
+
+  public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, java.lang.CharSequence, int, int, android.graphics.Paint.FontMetricsInt);
+  }
+
+  public class FontRequestEmojiCompatConfig extends android.support.text.emoji.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, android.support.v4.provider.FontRequest);
+    method public android.support.text.emoji.FontRequestEmojiCompatConfig setHandler(android.os.Handler);
+    method public android.support.text.emoji.FontRequestEmojiCompatConfig setRetryPolicy(android.support.text.emoji.FontRequestEmojiCompatConfig.RetryPolicy);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends android.support.text.emoji.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public static abstract class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  public final class MetadataRepo {
+    method public static android.support.text.emoji.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static android.support.text.emoji.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static android.support.text.emoji.MetadataRepo create(android.content.res.AssetManager, java.lang.String) throws java.io.IOException;
+  }
+
+}
+
+package android.support.text.emoji.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet, int);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet, int, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet, int);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet, int, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(int);
+  }
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    method public android.text.method.KeyListener getKeyListener(android.text.method.KeyListener);
+    method public int getMaxEmojiCount();
+    method public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+    method public void setMaxEmojiCount(int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet, int, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet, int);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet, int, int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    method public android.text.InputFilter[] getFilters(android.text.InputFilter[]);
+    method public void setAllCaps(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod wrapTransformationMethod(android.text.method.TransformationMethod);
+  }
+
+}
+
diff --git a/exifinterface/Android.mk b/exifinterface/Android.mk
deleted file mode 100644
index 18ffcf3..0000000
--- a/exifinterface/Android.mk
+++ /dev/null
@@ -1,34 +0,0 @@
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must include it with
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := android-support-exifinterface
-#
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-exifinterface
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/exifinterface/api/27.1.0.txt b/exifinterface/api/27.1.0.txt
new file mode 100644
index 0000000..8533011
--- /dev/null
+++ b/exifinterface/api/27.1.0.txt
@@ -0,0 +1,332 @@
+package android.support.media {
+
+  public class ExifInterface {
+    ctor public ExifInterface(java.lang.String) throws java.io.IOException;
+    ctor public ExifInterface(java.io.InputStream) throws java.io.IOException;
+    method public void flipHorizontally();
+    method public void flipVertically();
+    method public double getAltitude(double);
+    method public java.lang.String getAttribute(java.lang.String);
+    method public double getAttributeDouble(java.lang.String, double);
+    method public int getAttributeInt(java.lang.String, int);
+    method public deprecated boolean getLatLong(float[]);
+    method public double[] getLatLong();
+    method public int getRotationDegrees();
+    method public byte[] getThumbnail();
+    method public android.graphics.Bitmap getThumbnailBitmap();
+    method public byte[] getThumbnailBytes();
+    method public long[] getThumbnailRange();
+    method public boolean hasThumbnail();
+    method public boolean isFlipped();
+    method public boolean isThumbnailCompressed();
+    method public void resetOrientation();
+    method public void rotate(int);
+    method public void saveAttributes() throws java.io.IOException;
+    method public void setAltitude(double);
+    method public void setAttribute(java.lang.String, java.lang.String);
+    method public void setGpsInfo(android.location.Location);
+    method public void setLatLong(double, double);
+    field public static final short ALTITUDE_ABOVE_SEA_LEVEL = 0; // 0x0
+    field public static final short ALTITUDE_BELOW_SEA_LEVEL = 1; // 0x1
+    field public static final int[] BITS_PER_SAMPLE_GREYSCALE_1;
+    field public static final int[] BITS_PER_SAMPLE_GREYSCALE_2;
+    field public static final int[] BITS_PER_SAMPLE_RGB;
+    field public static final int COLOR_SPACE_S_RGB = 1; // 0x1
+    field public static final int COLOR_SPACE_UNCALIBRATED = 65535; // 0xffff
+    field public static final short CONTRAST_HARD = 2; // 0x2
+    field public static final short CONTRAST_NORMAL = 0; // 0x0
+    field public static final short CONTRAST_SOFT = 1; // 0x1
+    field public static final int DATA_DEFLATE_ZIP = 8; // 0x8
+    field public static final int DATA_HUFFMAN_COMPRESSED = 2; // 0x2
+    field public static final int DATA_JPEG = 6; // 0x6
+    field public static final int DATA_JPEG_COMPRESSED = 7; // 0x7
+    field public static final int DATA_LOSSY_JPEG = 34892; // 0x884c
+    field public static final int DATA_PACK_BITS_COMPRESSED = 32773; // 0x8005
+    field public static final int DATA_UNCOMPRESSED = 1; // 0x1
+    field public static final short EXPOSURE_MODE_AUTO = 0; // 0x0
+    field public static final short EXPOSURE_MODE_AUTO_BRACKET = 2; // 0x2
+    field public static final short EXPOSURE_MODE_MANUAL = 1; // 0x1
+    field public static final short EXPOSURE_PROGRAM_ACTION = 6; // 0x6
+    field public static final short EXPOSURE_PROGRAM_APERTURE_PRIORITY = 3; // 0x3
+    field public static final short EXPOSURE_PROGRAM_CREATIVE = 5; // 0x5
+    field public static final short EXPOSURE_PROGRAM_LANDSCAPE_MODE = 8; // 0x8
+    field public static final short EXPOSURE_PROGRAM_MANUAL = 1; // 0x1
+    field public static final short EXPOSURE_PROGRAM_NORMAL = 2; // 0x2
+    field public static final short EXPOSURE_PROGRAM_NOT_DEFINED = 0; // 0x0
+    field public static final short EXPOSURE_PROGRAM_PORTRAIT_MODE = 7; // 0x7
+    field public static final short EXPOSURE_PROGRAM_SHUTTER_PRIORITY = 4; // 0x4
+    field public static final short FILE_SOURCE_DSC = 3; // 0x3
+    field public static final short FILE_SOURCE_OTHER = 0; // 0x0
+    field public static final short FILE_SOURCE_REFLEX_SCANNER = 2; // 0x2
+    field public static final short FILE_SOURCE_TRANSPARENT_SCANNER = 1; // 0x1
+    field public static final short FLAG_FLASH_FIRED = 1; // 0x1
+    field public static final short FLAG_FLASH_MODE_AUTO = 24; // 0x18
+    field public static final short FLAG_FLASH_MODE_COMPULSORY_FIRING = 8; // 0x8
+    field public static final short FLAG_FLASH_MODE_COMPULSORY_SUPPRESSION = 16; // 0x10
+    field public static final short FLAG_FLASH_NO_FLASH_FUNCTION = 32; // 0x20
+    field public static final short FLAG_FLASH_RED_EYE_SUPPORTED = 64; // 0x40
+    field public static final short FLAG_FLASH_RETURN_LIGHT_DETECTED = 6; // 0x6
+    field public static final short FLAG_FLASH_RETURN_LIGHT_NOT_DETECTED = 4; // 0x4
+    field public static final short FORMAT_CHUNKY = 1; // 0x1
+    field public static final short FORMAT_PLANAR = 2; // 0x2
+    field public static final short GAIN_CONTROL_HIGH_GAIN_DOWN = 4; // 0x4
+    field public static final short GAIN_CONTROL_HIGH_GAIN_UP = 2; // 0x2
+    field public static final short GAIN_CONTROL_LOW_GAIN_DOWN = 3; // 0x3
+    field public static final short GAIN_CONTROL_LOW_GAIN_UP = 1; // 0x1
+    field public static final short GAIN_CONTROL_NONE = 0; // 0x0
+    field public static final java.lang.String GPS_DIRECTION_MAGNETIC = "M";
+    field public static final java.lang.String GPS_DIRECTION_TRUE = "T";
+    field public static final java.lang.String GPS_DISTANCE_KILOMETERS = "K";
+    field public static final java.lang.String GPS_DISTANCE_MILES = "M";
+    field public static final java.lang.String GPS_DISTANCE_NAUTICAL_MILES = "N";
+    field public static final java.lang.String GPS_MEASUREMENT_2D = "2";
+    field public static final java.lang.String GPS_MEASUREMENT_3D = "3";
+    field public static final short GPS_MEASUREMENT_DIFFERENTIAL_CORRECTED = 1; // 0x1
+    field public static final java.lang.String GPS_MEASUREMENT_INTERRUPTED = "V";
+    field public static final java.lang.String GPS_MEASUREMENT_IN_PROGRESS = "A";
+    field public static final short GPS_MEASUREMENT_NO_DIFFERENTIAL = 0; // 0x0
+    field public static final java.lang.String GPS_SPEED_KILOMETERS_PER_HOUR = "K";
+    field public static final java.lang.String GPS_SPEED_KNOTS = "N";
+    field public static final java.lang.String GPS_SPEED_MILES_PER_HOUR = "M";
+    field public static final java.lang.String LATITUDE_NORTH = "N";
+    field public static final java.lang.String LATITUDE_SOUTH = "S";
+    field public static final short LIGHT_SOURCE_CLOUDY_WEATHER = 10; // 0xa
+    field public static final short LIGHT_SOURCE_COOL_WHITE_FLUORESCENT = 14; // 0xe
+    field public static final short LIGHT_SOURCE_D50 = 23; // 0x17
+    field public static final short LIGHT_SOURCE_D55 = 20; // 0x14
+    field public static final short LIGHT_SOURCE_D65 = 21; // 0x15
+    field public static final short LIGHT_SOURCE_D75 = 22; // 0x16
+    field public static final short LIGHT_SOURCE_DAYLIGHT = 1; // 0x1
+    field public static final short LIGHT_SOURCE_DAYLIGHT_FLUORESCENT = 12; // 0xc
+    field public static final short LIGHT_SOURCE_DAY_WHITE_FLUORESCENT = 13; // 0xd
+    field public static final short LIGHT_SOURCE_FINE_WEATHER = 9; // 0x9
+    field public static final short LIGHT_SOURCE_FLASH = 4; // 0x4
+    field public static final short LIGHT_SOURCE_FLUORESCENT = 2; // 0x2
+    field public static final short LIGHT_SOURCE_ISO_STUDIO_TUNGSTEN = 24; // 0x18
+    field public static final short LIGHT_SOURCE_OTHER = 255; // 0xff
+    field public static final short LIGHT_SOURCE_SHADE = 11; // 0xb
+    field public static final short LIGHT_SOURCE_STANDARD_LIGHT_A = 17; // 0x11
+    field public static final short LIGHT_SOURCE_STANDARD_LIGHT_B = 18; // 0x12
+    field public static final short LIGHT_SOURCE_STANDARD_LIGHT_C = 19; // 0x13
+    field public static final short LIGHT_SOURCE_TUNGSTEN = 3; // 0x3
+    field public static final short LIGHT_SOURCE_UNKNOWN = 0; // 0x0
+    field public static final short LIGHT_SOURCE_WARM_WHITE_FLUORESCENT = 16; // 0x10
+    field public static final short LIGHT_SOURCE_WHITE_FLUORESCENT = 15; // 0xf
+    field public static final java.lang.String LONGITUDE_EAST = "E";
+    field public static final java.lang.String LONGITUDE_WEST = "W";
+    field public static final short METERING_MODE_AVERAGE = 1; // 0x1
+    field public static final short METERING_MODE_CENTER_WEIGHT_AVERAGE = 2; // 0x2
+    field public static final short METERING_MODE_MULTI_SPOT = 4; // 0x4
+    field public static final short METERING_MODE_OTHER = 255; // 0xff
+    field public static final short METERING_MODE_PARTIAL = 6; // 0x6
+    field public static final short METERING_MODE_PATTERN = 5; // 0x5
+    field public static final short METERING_MODE_SPOT = 3; // 0x3
+    field public static final short METERING_MODE_UNKNOWN = 0; // 0x0
+    field public static final int ORIENTATION_FLIP_HORIZONTAL = 2; // 0x2
+    field public static final int ORIENTATION_FLIP_VERTICAL = 4; // 0x4
+    field public static final int ORIENTATION_NORMAL = 1; // 0x1
+    field public static final int ORIENTATION_ROTATE_180 = 3; // 0x3
+    field public static final int ORIENTATION_ROTATE_270 = 8; // 0x8
+    field public static final int ORIENTATION_ROTATE_90 = 6; // 0x6
+    field public static final int ORIENTATION_TRANSPOSE = 5; // 0x5
+    field public static final int ORIENTATION_TRANSVERSE = 7; // 0x7
+    field public static final int ORIENTATION_UNDEFINED = 0; // 0x0
+    field public static final int ORIGINAL_RESOLUTION_IMAGE = 0; // 0x0
+    field public static final int PHOTOMETRIC_INTERPRETATION_BLACK_IS_ZERO = 1; // 0x1
+    field public static final int PHOTOMETRIC_INTERPRETATION_RGB = 2; // 0x2
+    field public static final int PHOTOMETRIC_INTERPRETATION_WHITE_IS_ZERO = 0; // 0x0
+    field public static final int PHOTOMETRIC_INTERPRETATION_YCBCR = 6; // 0x6
+    field public static final int REDUCED_RESOLUTION_IMAGE = 1; // 0x1
+    field public static final short RENDERED_PROCESS_CUSTOM = 1; // 0x1
+    field public static final short RENDERED_PROCESS_NORMAL = 0; // 0x0
+    field public static final short RESOLUTION_UNIT_CENTIMETERS = 3; // 0x3
+    field public static final short RESOLUTION_UNIT_INCHES = 2; // 0x2
+    field public static final short SATURATION_HIGH = 0; // 0x0
+    field public static final short SATURATION_LOW = 0; // 0x0
+    field public static final short SATURATION_NORMAL = 0; // 0x0
+    field public static final short SCENE_CAPTURE_TYPE_LANDSCAPE = 1; // 0x1
+    field public static final short SCENE_CAPTURE_TYPE_NIGHT = 3; // 0x3
+    field public static final short SCENE_CAPTURE_TYPE_PORTRAIT = 2; // 0x2
+    field public static final short SCENE_CAPTURE_TYPE_STANDARD = 0; // 0x0
+    field public static final short SCENE_TYPE_DIRECTLY_PHOTOGRAPHED = 1; // 0x1
+    field public static final short SENSITIVITY_TYPE_ISO_SPEED = 3; // 0x3
+    field public static final short SENSITIVITY_TYPE_REI = 2; // 0x2
+    field public static final short SENSITIVITY_TYPE_REI_AND_ISO = 6; // 0x6
+    field public static final short SENSITIVITY_TYPE_SOS = 1; // 0x1
+    field public static final short SENSITIVITY_TYPE_SOS_AND_ISO = 5; // 0x5
+    field public static final short SENSITIVITY_TYPE_SOS_AND_REI = 4; // 0x4
+    field public static final short SENSITIVITY_TYPE_SOS_AND_REI_AND_ISO = 7; // 0x7
+    field public static final short SENSITIVITY_TYPE_UNKNOWN = 0; // 0x0
+    field public static final short SENSOR_TYPE_COLOR_SEQUENTIAL = 5; // 0x5
+    field public static final short SENSOR_TYPE_COLOR_SEQUENTIAL_LINEAR = 8; // 0x8
+    field public static final short SENSOR_TYPE_NOT_DEFINED = 1; // 0x1
+    field public static final short SENSOR_TYPE_ONE_CHIP = 2; // 0x2
+    field public static final short SENSOR_TYPE_THREE_CHIP = 4; // 0x4
+    field public static final short SENSOR_TYPE_TRILINEAR = 7; // 0x7
+    field public static final short SENSOR_TYPE_TWO_CHIP = 3; // 0x3
+    field public static final short SHARPNESS_HARD = 2; // 0x2
+    field public static final short SHARPNESS_NORMAL = 0; // 0x0
+    field public static final short SHARPNESS_SOFT = 1; // 0x1
+    field public static final short SUBJECT_DISTANCE_RANGE_CLOSE_VIEW = 2; // 0x2
+    field public static final short SUBJECT_DISTANCE_RANGE_DISTANT_VIEW = 3; // 0x3
+    field public static final short SUBJECT_DISTANCE_RANGE_MACRO = 1; // 0x1
+    field public static final short SUBJECT_DISTANCE_RANGE_UNKNOWN = 0; // 0x0
+    field public static final java.lang.String TAG_APERTURE_VALUE = "ApertureValue";
+    field public static final java.lang.String TAG_ARTIST = "Artist";
+    field public static final java.lang.String TAG_BITS_PER_SAMPLE = "BitsPerSample";
+    field public static final java.lang.String TAG_BODY_SERIAL_NUMBER = "BodySerialNumber";
+    field public static final java.lang.String TAG_BRIGHTNESS_VALUE = "BrightnessValue";
+    field public static final java.lang.String TAG_CAMARA_OWNER_NAME = "CameraOwnerName";
+    field public static final java.lang.String TAG_CFA_PATTERN = "CFAPattern";
+    field public static final java.lang.String TAG_COLOR_SPACE = "ColorSpace";
+    field public static final java.lang.String TAG_COMPONENTS_CONFIGURATION = "ComponentsConfiguration";
+    field public static final java.lang.String TAG_COMPRESSED_BITS_PER_PIXEL = "CompressedBitsPerPixel";
+    field public static final java.lang.String TAG_COMPRESSION = "Compression";
+    field public static final java.lang.String TAG_CONTRAST = "Contrast";
+    field public static final java.lang.String TAG_COPYRIGHT = "Copyright";
+    field public static final java.lang.String TAG_CUSTOM_RENDERED = "CustomRendered";
+    field public static final java.lang.String TAG_DATETIME = "DateTime";
+    field public static final java.lang.String TAG_DATETIME_DIGITIZED = "DateTimeDigitized";
+    field public static final java.lang.String TAG_DATETIME_ORIGINAL = "DateTimeOriginal";
+    field public static final java.lang.String TAG_DEFAULT_CROP_SIZE = "DefaultCropSize";
+    field public static final java.lang.String TAG_DEVICE_SETTING_DESCRIPTION = "DeviceSettingDescription";
+    field public static final java.lang.String TAG_DIGITAL_ZOOM_RATIO = "DigitalZoomRatio";
+    field public static final java.lang.String TAG_DNG_VERSION = "DNGVersion";
+    field public static final java.lang.String TAG_EXIF_VERSION = "ExifVersion";
+    field public static final java.lang.String TAG_EXPOSURE_BIAS_VALUE = "ExposureBiasValue";
+    field public static final java.lang.String TAG_EXPOSURE_INDEX = "ExposureIndex";
+    field public static final java.lang.String TAG_EXPOSURE_MODE = "ExposureMode";
+    field public static final java.lang.String TAG_EXPOSURE_PROGRAM = "ExposureProgram";
+    field public static final java.lang.String TAG_EXPOSURE_TIME = "ExposureTime";
+    field public static final java.lang.String TAG_FILE_SOURCE = "FileSource";
+    field public static final java.lang.String TAG_FLASH = "Flash";
+    field public static final java.lang.String TAG_FLASHPIX_VERSION = "FlashpixVersion";
+    field public static final java.lang.String TAG_FLASH_ENERGY = "FlashEnergy";
+    field public static final java.lang.String TAG_FOCAL_LENGTH = "FocalLength";
+    field public static final java.lang.String TAG_FOCAL_LENGTH_IN_35MM_FILM = "FocalLengthIn35mmFilm";
+    field public static final java.lang.String TAG_FOCAL_PLANE_RESOLUTION_UNIT = "FocalPlaneResolutionUnit";
+    field public static final java.lang.String TAG_FOCAL_PLANE_X_RESOLUTION = "FocalPlaneXResolution";
+    field public static final java.lang.String TAG_FOCAL_PLANE_Y_RESOLUTION = "FocalPlaneYResolution";
+    field public static final java.lang.String TAG_F_NUMBER = "FNumber";
+    field public static final java.lang.String TAG_GAIN_CONTROL = "GainControl";
+    field public static final java.lang.String TAG_GAMMA = "Gamma";
+    field public static final java.lang.String TAG_GPS_ALTITUDE = "GPSAltitude";
+    field public static final java.lang.String TAG_GPS_ALTITUDE_REF = "GPSAltitudeRef";
+    field public static final java.lang.String TAG_GPS_AREA_INFORMATION = "GPSAreaInformation";
+    field public static final java.lang.String TAG_GPS_DATESTAMP = "GPSDateStamp";
+    field public static final java.lang.String TAG_GPS_DEST_BEARING = "GPSDestBearing";
+    field public static final java.lang.String TAG_GPS_DEST_BEARING_REF = "GPSDestBearingRef";
+    field public static final java.lang.String TAG_GPS_DEST_DISTANCE = "GPSDestDistance";
+    field public static final java.lang.String TAG_GPS_DEST_DISTANCE_REF = "GPSDestDistanceRef";
+    field public static final java.lang.String TAG_GPS_DEST_LATITUDE = "GPSDestLatitude";
+    field public static final java.lang.String TAG_GPS_DEST_LATITUDE_REF = "GPSDestLatitudeRef";
+    field public static final java.lang.String TAG_GPS_DEST_LONGITUDE = "GPSDestLongitude";
+    field public static final java.lang.String TAG_GPS_DEST_LONGITUDE_REF = "GPSDestLongitudeRef";
+    field public static final java.lang.String TAG_GPS_DIFFERENTIAL = "GPSDifferential";
+    field public static final java.lang.String TAG_GPS_DOP = "GPSDOP";
+    field public static final java.lang.String TAG_GPS_H_POSITIONING_ERROR = "GPSHPositioningError";
+    field public static final java.lang.String TAG_GPS_IMG_DIRECTION = "GPSImgDirection";
+    field public static final java.lang.String TAG_GPS_IMG_DIRECTION_REF = "GPSImgDirectionRef";
+    field public static final java.lang.String TAG_GPS_LATITUDE = "GPSLatitude";
+    field public static final java.lang.String TAG_GPS_LATITUDE_REF = "GPSLatitudeRef";
+    field public static final java.lang.String TAG_GPS_LONGITUDE = "GPSLongitude";
+    field public static final java.lang.String TAG_GPS_LONGITUDE_REF = "GPSLongitudeRef";
+    field public static final java.lang.String TAG_GPS_MAP_DATUM = "GPSMapDatum";
+    field public static final java.lang.String TAG_GPS_MEASURE_MODE = "GPSMeasureMode";
+    field public static final java.lang.String TAG_GPS_PROCESSING_METHOD = "GPSProcessingMethod";
+    field public static final java.lang.String TAG_GPS_SATELLITES = "GPSSatellites";
+    field public static final java.lang.String TAG_GPS_SPEED = "GPSSpeed";
+    field public static final java.lang.String TAG_GPS_SPEED_REF = "GPSSpeedRef";
+    field public static final java.lang.String TAG_GPS_STATUS = "GPSStatus";
+    field public static final java.lang.String TAG_GPS_TIMESTAMP = "GPSTimeStamp";
+    field public static final java.lang.String TAG_GPS_TRACK = "GPSTrack";
+    field public static final java.lang.String TAG_GPS_TRACK_REF = "GPSTrackRef";
+    field public static final java.lang.String TAG_GPS_VERSION_ID = "GPSVersionID";
+    field public static final java.lang.String TAG_IMAGE_DESCRIPTION = "ImageDescription";
+    field public static final java.lang.String TAG_IMAGE_LENGTH = "ImageLength";
+    field public static final java.lang.String TAG_IMAGE_UNIQUE_ID = "ImageUniqueID";
+    field public static final java.lang.String TAG_IMAGE_WIDTH = "ImageWidth";
+    field public static final java.lang.String TAG_INTEROPERABILITY_INDEX = "InteroperabilityIndex";
+    field public static final java.lang.String TAG_ISO_SPEED = "ISOSpeed";
+    field public static final java.lang.String TAG_ISO_SPEED_LATITUDE_YYY = "ISOSpeedLatitudeyyy";
+    field public static final java.lang.String TAG_ISO_SPEED_LATITUDE_ZZZ = "ISOSpeedLatitudezzz";
+    field public static final deprecated java.lang.String TAG_ISO_SPEED_RATINGS = "ISOSpeedRatings";
+    field public static final java.lang.String TAG_JPEG_INTERCHANGE_FORMAT = "JPEGInterchangeFormat";
+    field public static final java.lang.String TAG_JPEG_INTERCHANGE_FORMAT_LENGTH = "JPEGInterchangeFormatLength";
+    field public static final java.lang.String TAG_LENS_MAKE = "LensMake";
+    field public static final java.lang.String TAG_LENS_MODEL = "LensModel";
+    field public static final java.lang.String TAG_LENS_SERIAL_NUMBER = "LensSerialNumber";
+    field public static final java.lang.String TAG_LENS_SPECIFICATION = "LensSpecification";
+    field public static final java.lang.String TAG_LIGHT_SOURCE = "LightSource";
+    field public static final java.lang.String TAG_MAKE = "Make";
+    field public static final java.lang.String TAG_MAKER_NOTE = "MakerNote";
+    field public static final java.lang.String TAG_MAX_APERTURE_VALUE = "MaxApertureValue";
+    field public static final java.lang.String TAG_METERING_MODE = "MeteringMode";
+    field public static final java.lang.String TAG_MODEL = "Model";
+    field public static final java.lang.String TAG_NEW_SUBFILE_TYPE = "NewSubfileType";
+    field public static final java.lang.String TAG_OECF = "OECF";
+    field public static final java.lang.String TAG_ORF_ASPECT_FRAME = "AspectFrame";
+    field public static final java.lang.String TAG_ORF_PREVIEW_IMAGE_LENGTH = "PreviewImageLength";
+    field public static final java.lang.String TAG_ORF_PREVIEW_IMAGE_START = "PreviewImageStart";
+    field public static final java.lang.String TAG_ORF_THUMBNAIL_IMAGE = "ThumbnailImage";
+    field public static final java.lang.String TAG_ORIENTATION = "Orientation";
+    field public static final java.lang.String TAG_PHOTOGRAPHIC_SENSITIVITY = "PhotographicSensitivity";
+    field public static final java.lang.String TAG_PHOTOMETRIC_INTERPRETATION = "PhotometricInterpretation";
+    field public static final java.lang.String TAG_PIXEL_X_DIMENSION = "PixelXDimension";
+    field public static final java.lang.String TAG_PIXEL_Y_DIMENSION = "PixelYDimension";
+    field public static final java.lang.String TAG_PLANAR_CONFIGURATION = "PlanarConfiguration";
+    field public static final java.lang.String TAG_PRIMARY_CHROMATICITIES = "PrimaryChromaticities";
+    field public static final java.lang.String TAG_RECOMMENDED_EXPOSURE_INDEX = "RecommendedExposureIndex";
+    field public static final java.lang.String TAG_REFERENCE_BLACK_WHITE = "ReferenceBlackWhite";
+    field public static final java.lang.String TAG_RELATED_SOUND_FILE = "RelatedSoundFile";
+    field public static final java.lang.String TAG_RESOLUTION_UNIT = "ResolutionUnit";
+    field public static final java.lang.String TAG_ROWS_PER_STRIP = "RowsPerStrip";
+    field public static final java.lang.String TAG_RW2_ISO = "ISO";
+    field public static final java.lang.String TAG_RW2_JPG_FROM_RAW = "JpgFromRaw";
+    field public static final java.lang.String TAG_RW2_SENSOR_BOTTOM_BORDER = "SensorBottomBorder";
+    field public static final java.lang.String TAG_RW2_SENSOR_LEFT_BORDER = "SensorLeftBorder";
+    field public static final java.lang.String TAG_RW2_SENSOR_RIGHT_BORDER = "SensorRightBorder";
+    field public static final java.lang.String TAG_RW2_SENSOR_TOP_BORDER = "SensorTopBorder";
+    field public static final java.lang.String TAG_SAMPLES_PER_PIXEL = "SamplesPerPixel";
+    field public static final java.lang.String TAG_SATURATION = "Saturation";
+    field public static final java.lang.String TAG_SCENE_CAPTURE_TYPE = "SceneCaptureType";
+    field public static final java.lang.String TAG_SCENE_TYPE = "SceneType";
+    field public static final java.lang.String TAG_SENSING_METHOD = "SensingMethod";
+    field public static final java.lang.String TAG_SENSITIVITY_TYPE = "SensitivityType";
+    field public static final java.lang.String TAG_SHARPNESS = "Sharpness";
+    field public static final java.lang.String TAG_SHUTTER_SPEED_VALUE = "ShutterSpeedValue";
+    field public static final java.lang.String TAG_SOFTWARE = "Software";
+    field public static final java.lang.String TAG_SPATIAL_FREQUENCY_RESPONSE = "SpatialFrequencyResponse";
+    field public static final java.lang.String TAG_SPECTRAL_SENSITIVITY = "SpectralSensitivity";
+    field public static final java.lang.String TAG_STANDARD_OUTPUT_SENSITIVITY = "StandardOutputSensitivity";
+    field public static final java.lang.String TAG_STRIP_BYTE_COUNTS = "StripByteCounts";
+    field public static final java.lang.String TAG_STRIP_OFFSETS = "StripOffsets";
+    field public static final java.lang.String TAG_SUBFILE_TYPE = "SubfileType";
+    field public static final java.lang.String TAG_SUBJECT_AREA = "SubjectArea";
+    field public static final java.lang.String TAG_SUBJECT_DISTANCE = "SubjectDistance";
+    field public static final java.lang.String TAG_SUBJECT_DISTANCE_RANGE = "SubjectDistanceRange";
+    field public static final java.lang.String TAG_SUBJECT_LOCATION = "SubjectLocation";
+    field public static final java.lang.String TAG_SUBSEC_TIME = "SubSecTime";
+    field public static final java.lang.String TAG_SUBSEC_TIME_DIGITIZED = "SubSecTimeDigitized";
+    field public static final java.lang.String TAG_SUBSEC_TIME_ORIGINAL = "SubSecTimeOriginal";
+    field public static final java.lang.String TAG_THUMBNAIL_IMAGE_LENGTH = "ThumbnailImageLength";
+    field public static final java.lang.String TAG_THUMBNAIL_IMAGE_WIDTH = "ThumbnailImageWidth";
+    field public static final java.lang.String TAG_TRANSFER_FUNCTION = "TransferFunction";
+    field public static final java.lang.String TAG_USER_COMMENT = "UserComment";
+    field public static final java.lang.String TAG_WHITE_BALANCE = "WhiteBalance";
+    field public static final java.lang.String TAG_WHITE_POINT = "WhitePoint";
+    field public static final java.lang.String TAG_X_RESOLUTION = "XResolution";
+    field public static final java.lang.String TAG_Y_CB_CR_COEFFICIENTS = "YCbCrCoefficients";
+    field public static final java.lang.String TAG_Y_CB_CR_POSITIONING = "YCbCrPositioning";
+    field public static final java.lang.String TAG_Y_CB_CR_SUB_SAMPLING = "YCbCrSubSampling";
+    field public static final java.lang.String TAG_Y_RESOLUTION = "YResolution";
+    field public static final deprecated int WHITEBALANCE_AUTO = 0; // 0x0
+    field public static final deprecated int WHITEBALANCE_MANUAL = 1; // 0x1
+    field public static final short WHITE_BALANCE_AUTO = 0; // 0x0
+    field public static final short WHITE_BALANCE_MANUAL = 1; // 0x1
+    field public static final short Y_CB_CR_POSITIONING_CENTERED = 1; // 0x1
+    field public static final short Y_CB_CR_POSITIONING_CO_SITED = 2; // 0x2
+  }
+
+}
+
diff --git a/fragment/Android.mk b/fragment/Android.mk
deleted file mode 100644
index adb6764..0000000
--- a/fragment/Android.mk
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (C) 2011 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-fragment \
-#       android-support-compat \
-#       android-support-media-compat \
-#       android-support-core-ui \
-#       android-support-core-utils
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-fragment
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := \
-    $(call all-java-files-under, src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-compat \
-    android-support-core-ui \
-    android-support-core-utils
-LOCAL_STATIC_ANDROID_LIBRARIES := \
-    android-arch-lifecycle-livedata-core \
-    android-arch-lifecycle-viewmodel
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/fragment/api/27.1.0.txt b/fragment/api/27.1.0.txt
new file mode 100644
index 0000000..5df18f8
--- /dev/null
+++ b/fragment/api/27.1.0.txt
@@ -0,0 +1,404 @@
+package android.support.v4.app {
+
+  public class DialogFragment extends android.support.v4.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
+    ctor public DialogFragment();
+    method public void dismiss();
+    method public void dismissAllowingStateLoss();
+    method public android.app.Dialog getDialog();
+    method public boolean getShowsDialog();
+    method public int getTheme();
+    method public boolean isCancelable();
+    method public void onCancel(android.content.DialogInterface);
+    method public android.app.Dialog onCreateDialog(android.os.Bundle);
+    method public void onDismiss(android.content.DialogInterface);
+    method public void setCancelable(boolean);
+    method public void setShowsDialog(boolean);
+    method public void setStyle(int, int);
+    method public void show(android.support.v4.app.FragmentManager, java.lang.String);
+    method public int show(android.support.v4.app.FragmentTransaction, java.lang.String);
+    method public void showNow(android.support.v4.app.FragmentManager, java.lang.String);
+    field public static final int STYLE_NORMAL = 0; // 0x0
+    field public static final int STYLE_NO_FRAME = 2; // 0x2
+    field public static final int STYLE_NO_INPUT = 3; // 0x3
+    field public static final int STYLE_NO_TITLE = 1; // 0x1
+  }
+
+  public class Fragment implements android.content.ComponentCallbacks android.arch.lifecycle.LifecycleOwner android.view.View.OnCreateContextMenuListener android.arch.lifecycle.ViewModelStoreOwner {
+    ctor public Fragment();
+    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public final boolean equals(java.lang.Object);
+    method public final android.support.v4.app.FragmentActivity getActivity();
+    method public boolean getAllowEnterTransitionOverlap();
+    method public boolean getAllowReturnTransitionOverlap();
+    method public final android.os.Bundle getArguments();
+    method public final android.support.v4.app.FragmentManager getChildFragmentManager();
+    method public android.content.Context getContext();
+    method public java.lang.Object getEnterTransition();
+    method public java.lang.Object getExitTransition();
+    method public final android.support.v4.app.FragmentManager getFragmentManager();
+    method public final java.lang.Object getHost();
+    method public final int getId();
+    method public final android.view.LayoutInflater getLayoutInflater();
+    method public android.arch.lifecycle.Lifecycle getLifecycle();
+    method public android.support.v4.app.LoaderManager getLoaderManager();
+    method public final android.support.v4.app.Fragment getParentFragment();
+    method public java.lang.Object getReenterTransition();
+    method public final android.content.res.Resources getResources();
+    method public final boolean getRetainInstance();
+    method public java.lang.Object getReturnTransition();
+    method public java.lang.Object getSharedElementEnterTransition();
+    method public java.lang.Object getSharedElementReturnTransition();
+    method public final java.lang.String getString(int);
+    method public final java.lang.String getString(int, java.lang.Object...);
+    method public final java.lang.String getTag();
+    method public final android.support.v4.app.Fragment getTargetFragment();
+    method public final int getTargetRequestCode();
+    method public final java.lang.CharSequence getText(int);
+    method public boolean getUserVisibleHint();
+    method public android.view.View getView();
+    method public android.arch.lifecycle.ViewModelStore getViewModelStore();
+    method public final int hashCode();
+    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String);
+    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
+    method public final boolean isAdded();
+    method public final boolean isDetached();
+    method public final boolean isHidden();
+    method public final boolean isInLayout();
+    method public final boolean isRemoving();
+    method public final boolean isResumed();
+    method public final boolean isStateSaved();
+    method public final boolean isVisible();
+    method public void onActivityCreated(android.os.Bundle);
+    method public void onActivityResult(int, int, android.content.Intent);
+    method public void onAttach(android.content.Context);
+    method public deprecated void onAttach(android.app.Activity);
+    method public void onAttachFragment(android.support.v4.app.Fragment);
+    method public void onConfigurationChanged(android.content.res.Configuration);
+    method public boolean onContextItemSelected(android.view.MenuItem);
+    method public void onCreate(android.os.Bundle);
+    method public android.view.animation.Animation onCreateAnimation(int, boolean, int);
+    method public android.animation.Animator onCreateAnimator(int, boolean, int);
+    method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
+    method public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
+    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onDestroy();
+    method public void onDestroyOptionsMenu();
+    method public void onDestroyView();
+    method public void onDetach();
+    method public android.view.LayoutInflater onGetLayoutInflater(android.os.Bundle);
+    method public void onHiddenChanged(boolean);
+    method public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
+    method public deprecated void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
+    method public void onLowMemory();
+    method public void onMultiWindowModeChanged(boolean);
+    method public boolean onOptionsItemSelected(android.view.MenuItem);
+    method public void onOptionsMenuClosed(android.view.Menu);
+    method public void onPause();
+    method public void onPictureInPictureModeChanged(boolean);
+    method public void onPrepareOptionsMenu(android.view.Menu);
+    method public void onRequestPermissionsResult(int, java.lang.String[], int[]);
+    method public void onResume();
+    method public void onSaveInstanceState(android.os.Bundle);
+    method public void onStart();
+    method public void onStop();
+    method public void onViewCreated(android.view.View, android.os.Bundle);
+    method public void onViewStateRestored(android.os.Bundle);
+    method public void postponeEnterTransition();
+    method public void registerForContextMenu(android.view.View);
+    method public final void requestPermissions(java.lang.String[], int);
+    method public final android.support.v4.app.FragmentActivity requireActivity();
+    method public final android.content.Context requireContext();
+    method public final android.support.v4.app.FragmentManager requireFragmentManager();
+    method public final java.lang.Object requireHost();
+    method public void setAllowEnterTransitionOverlap(boolean);
+    method public void setAllowReturnTransitionOverlap(boolean);
+    method public void setArguments(android.os.Bundle);
+    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
+    method public void setEnterTransition(java.lang.Object);
+    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
+    method public void setExitTransition(java.lang.Object);
+    method public void setHasOptionsMenu(boolean);
+    method public void setInitialSavedState(android.support.v4.app.Fragment.SavedState);
+    method public void setMenuVisibility(boolean);
+    method public void setReenterTransition(java.lang.Object);
+    method public void setRetainInstance(boolean);
+    method public void setReturnTransition(java.lang.Object);
+    method public void setSharedElementEnterTransition(java.lang.Object);
+    method public void setSharedElementReturnTransition(java.lang.Object);
+    method public void setTargetFragment(android.support.v4.app.Fragment, int);
+    method public void setUserVisibleHint(boolean);
+    method public boolean shouldShowRequestPermissionRationale(java.lang.String);
+    method public void startActivity(android.content.Intent);
+    method public void startActivity(android.content.Intent, android.os.Bundle);
+    method public void startActivityForResult(android.content.Intent, int);
+    method public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
+    method public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    method public void startPostponedEnterTransition();
+    method public void unregisterForContextMenu(android.view.View);
+  }
+
+  public static class Fragment.InstantiationException extends java.lang.RuntimeException {
+    ctor public Fragment.InstantiationException(java.lang.String, java.lang.Exception);
+  }
+
+  public static class Fragment.SavedState implements android.os.Parcelable {
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.app.Fragment.SavedState> CREATOR;
+  }
+
+  public class FragmentActivity extends android.support.v4.app.SupportActivity implements android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback android.support.v4.app.ActivityCompat.RequestPermissionsRequestCodeValidator android.arch.lifecycle.ViewModelStoreOwner {
+    ctor public FragmentActivity();
+    method public java.lang.Object getLastCustomNonConfigurationInstance();
+    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
+    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
+    method public android.arch.lifecycle.ViewModelStore getViewModelStore();
+    method public void onAttachFragment(android.support.v4.app.Fragment);
+    method public void onMultiWindowModeChanged(boolean);
+    method public void onPictureInPictureModeChanged(boolean);
+    method protected void onResumeFragments();
+    method public java.lang.Object onRetainCustomNonConfigurationInstance();
+    method public final java.lang.Object onRetainNonConfigurationInstance();
+    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
+    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
+    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
+    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int, android.os.Bundle);
+    method public void startIntentSenderFromFragment(android.support.v4.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    method public void supportFinishAfterTransition();
+    method public deprecated void supportInvalidateOptionsMenu();
+    method public void supportPostponeEnterTransition();
+    method public void supportStartPostponedEnterTransition();
+    method public final void validateRequestPermissionsRequestCode(int);
+  }
+
+  public abstract class FragmentContainer {
+    ctor public FragmentContainer();
+    method public android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
+    method public abstract android.view.View onFindViewById(int);
+    method public abstract boolean onHasView();
+  }
+
+  public class FragmentController {
+    method public void attachHost(android.support.v4.app.Fragment);
+    method public static android.support.v4.app.FragmentController createController(android.support.v4.app.FragmentHostCallback<?>);
+    method public void dispatchActivityCreated();
+    method public void dispatchConfigurationChanged(android.content.res.Configuration);
+    method public boolean dispatchContextItemSelected(android.view.MenuItem);
+    method public void dispatchCreate();
+    method public boolean dispatchCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
+    method public void dispatchDestroy();
+    method public void dispatchDestroyView();
+    method public void dispatchLowMemory();
+    method public void dispatchMultiWindowModeChanged(boolean);
+    method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
+    method public void dispatchOptionsMenuClosed(android.view.Menu);
+    method public void dispatchPause();
+    method public void dispatchPictureInPictureModeChanged(boolean);
+    method public boolean dispatchPrepareOptionsMenu(android.view.Menu);
+    method public void dispatchReallyStop();
+    method public void dispatchResume();
+    method public void dispatchStart();
+    method public void dispatchStop();
+    method public deprecated void doLoaderDestroy();
+    method public deprecated void doLoaderRetain();
+    method public deprecated void doLoaderStart();
+    method public deprecated void doLoaderStop(boolean);
+    method public deprecated void dumpLoaders(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public boolean execPendingActions();
+    method public android.support.v4.app.Fragment findFragmentByWho(java.lang.String);
+    method public java.util.List<android.support.v4.app.Fragment> getActiveFragments(java.util.List<android.support.v4.app.Fragment>);
+    method public int getActiveFragmentsCount();
+    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
+    method public deprecated android.support.v4.app.LoaderManager getSupportLoaderManager();
+    method public void noteStateNotSaved();
+    method public android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
+    method public deprecated void reportLoaderStart();
+    method public deprecated void restoreAllState(android.os.Parcelable, java.util.List<android.support.v4.app.Fragment>);
+    method public void restoreAllState(android.os.Parcelable, android.support.v4.app.FragmentManagerNonConfig);
+    method public deprecated void restoreLoaderNonConfig(android.support.v4.util.SimpleArrayMap<java.lang.String, android.support.v4.app.LoaderManager>);
+    method public deprecated android.support.v4.util.SimpleArrayMap<java.lang.String, android.support.v4.app.LoaderManager> retainLoaderNonConfig();
+    method public android.support.v4.app.FragmentManagerNonConfig retainNestedNonConfig();
+    method public deprecated java.util.List<android.support.v4.app.Fragment> retainNonConfig();
+    method public android.os.Parcelable saveAllState();
+  }
+
+  public abstract class FragmentHostCallback<E> extends android.support.v4.app.FragmentContainer {
+    ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int);
+    method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public android.view.View onFindViewById(int);
+    method public abstract E onGetHost();
+    method public android.view.LayoutInflater onGetLayoutInflater();
+    method public int onGetWindowAnimations();
+    method public boolean onHasView();
+    method public boolean onHasWindowAnimations();
+    method public void onRequestPermissionsFromFragment(android.support.v4.app.Fragment, java.lang.String[], int);
+    method public boolean onShouldSaveFragmentState(android.support.v4.app.Fragment);
+    method public boolean onShouldShowRequestPermissionRationale(java.lang.String);
+    method public void onStartActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
+    method public void onStartActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int, android.os.Bundle);
+    method public void onStartIntentSenderFromFragment(android.support.v4.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    method public void onSupportInvalidateOptionsMenu();
+  }
+
+  public abstract class FragmentManager {
+    ctor public FragmentManager();
+    method public abstract void addOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
+    method public abstract android.support.v4.app.FragmentTransaction beginTransaction();
+    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public static void enableDebugLogging(boolean);
+    method public abstract boolean executePendingTransactions();
+    method public abstract android.support.v4.app.Fragment findFragmentById(int);
+    method public abstract android.support.v4.app.Fragment findFragmentByTag(java.lang.String);
+    method public abstract android.support.v4.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
+    method public abstract int getBackStackEntryCount();
+    method public abstract android.support.v4.app.Fragment getFragment(android.os.Bundle, java.lang.String);
+    method public abstract java.util.List<android.support.v4.app.Fragment> getFragments();
+    method public abstract android.support.v4.app.Fragment getPrimaryNavigationFragment();
+    method public abstract boolean isDestroyed();
+    method public abstract boolean isStateSaved();
+    method public abstract void popBackStack();
+    method public abstract void popBackStack(java.lang.String, int);
+    method public abstract void popBackStack(int, int);
+    method public abstract boolean popBackStackImmediate();
+    method public abstract boolean popBackStackImmediate(java.lang.String, int);
+    method public abstract boolean popBackStackImmediate(int, int);
+    method public abstract void putFragment(android.os.Bundle, java.lang.String, android.support.v4.app.Fragment);
+    method public abstract void registerFragmentLifecycleCallbacks(android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks, boolean);
+    method public abstract void removeOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
+    method public abstract android.support.v4.app.Fragment.SavedState saveFragmentInstanceState(android.support.v4.app.Fragment);
+    method public abstract void unregisterFragmentLifecycleCallbacks(android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks);
+    field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
+  }
+
+  public static abstract interface FragmentManager.BackStackEntry {
+    method public abstract java.lang.CharSequence getBreadCrumbShortTitle();
+    method public abstract int getBreadCrumbShortTitleRes();
+    method public abstract java.lang.CharSequence getBreadCrumbTitle();
+    method public abstract int getBreadCrumbTitleRes();
+    method public abstract int getId();
+    method public abstract java.lang.String getName();
+  }
+
+  public static abstract class FragmentManager.FragmentLifecycleCallbacks {
+    ctor public FragmentManager.FragmentLifecycleCallbacks();
+    method public void onFragmentActivityCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
+    method public void onFragmentAttached(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.content.Context);
+    method public void onFragmentCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
+    method public void onFragmentDestroyed(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentDetached(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentPaused(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentPreAttached(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.content.Context);
+    method public void onFragmentPreCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
+    method public void onFragmentResumed(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentSaveInstanceState(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
+    method public void onFragmentStarted(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentStopped(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentViewCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.view.View, android.os.Bundle);
+    method public void onFragmentViewDestroyed(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+  }
+
+  public static abstract interface FragmentManager.OnBackStackChangedListener {
+    method public abstract void onBackStackChanged();
+  }
+
+  public class FragmentManagerNonConfig {
+  }
+
+  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
+    ctor public FragmentPagerAdapter(android.support.v4.app.FragmentManager);
+    method public abstract android.support.v4.app.Fragment getItem(int);
+    method public long getItemId(int);
+    method public boolean isViewFromObject(android.view.View, java.lang.Object);
+  }
+
+  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
+    ctor public FragmentStatePagerAdapter(android.support.v4.app.FragmentManager);
+    method public abstract android.support.v4.app.Fragment getItem(int);
+    method public boolean isViewFromObject(android.view.View, java.lang.Object);
+  }
+
+  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
+    ctor public FragmentTabHost(android.content.Context);
+    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
+    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
+    method public void onTabChanged(java.lang.String);
+    method public deprecated void setup();
+    method public void setup(android.content.Context, android.support.v4.app.FragmentManager);
+    method public void setup(android.content.Context, android.support.v4.app.FragmentManager, int);
+  }
+
+  public abstract class FragmentTransaction {
+    ctor public FragmentTransaction();
+    method public abstract android.support.v4.app.FragmentTransaction add(android.support.v4.app.Fragment, java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment, java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction addToBackStack(java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction attach(android.support.v4.app.Fragment);
+    method public abstract int commit();
+    method public abstract int commitAllowingStateLoss();
+    method public abstract void commitNow();
+    method public abstract void commitNowAllowingStateLoss();
+    method public abstract android.support.v4.app.FragmentTransaction detach(android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction disallowAddToBackStack();
+    method public abstract android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment);
+    method public abstract boolean isAddToBackStackAllowed();
+    method public abstract boolean isEmpty();
+    method public abstract android.support.v4.app.FragmentTransaction remove(android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment, java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction runOnCommit(java.lang.Runnable);
+    method public abstract deprecated android.support.v4.app.FragmentTransaction setAllowOptimization(boolean);
+    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(int);
+    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
+    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(int);
+    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
+    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int);
+    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int, int, int);
+    method public abstract android.support.v4.app.FragmentTransaction setPrimaryNavigationFragment(android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction setReorderingAllowed(boolean);
+    method public abstract android.support.v4.app.FragmentTransaction setTransition(int);
+    method public abstract android.support.v4.app.FragmentTransaction setTransitionStyle(int);
+    method public abstract android.support.v4.app.FragmentTransaction show(android.support.v4.app.Fragment);
+    field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
+    field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
+    field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
+    field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
+    field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
+    field public static final int TRANSIT_NONE = 0; // 0x0
+    field public static final int TRANSIT_UNSET = -1; // 0xffffffff
+  }
+
+  public class ListFragment extends android.support.v4.app.Fragment {
+    ctor public ListFragment();
+    method public android.widget.ListAdapter getListAdapter();
+    method public android.widget.ListView getListView();
+    method public long getSelectedItemId();
+    method public int getSelectedItemPosition();
+    method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
+    method public void setEmptyText(java.lang.CharSequence);
+    method public void setListAdapter(android.widget.ListAdapter);
+    method public void setListShown(boolean);
+    method public void setListShownNoAnimation(boolean);
+    method public void setSelection(int);
+  }
+
+  public abstract class LoaderManager {
+    ctor public LoaderManager();
+    method public abstract void destroyLoader(int);
+    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public static void enableDebugLogging(boolean);
+    method public abstract <D> android.support.v4.content.Loader<D> getLoader(int);
+    method public boolean hasRunningLoaders();
+    method public abstract <D> android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
+    method public abstract <D> android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
+  }
+
+  public static abstract interface LoaderManager.LoaderCallbacks<D> {
+    method public abstract android.support.v4.content.Loader<D> onCreateLoader(int, android.os.Bundle);
+    method public abstract void onLoadFinished(android.support.v4.content.Loader<D>, D);
+    method public abstract void onLoaderReset(android.support.v4.content.Loader<D>);
+  }
+
+}
+
diff --git a/fragment/src/androidTest/java/android/support/v4/app/LoaderViewModelTest.java b/fragment/src/androidTest/java/android/support/v4/app/LoaderViewModelTest.java
index b53f7dd..911e169 100644
--- a/fragment/src/androidTest/java/android/support/v4/app/LoaderViewModelTest.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/LoaderViewModelTest.java
@@ -17,6 +17,7 @@
 package android.support.v4.app;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import android.content.Context;
@@ -63,6 +64,8 @@
         assertFalse("LoaderInfo shouldn't be destroyed before onCleared", info.mDestroyed);
         loaderViewModel.onCleared();
         assertTrue("LoaderInfo should be destroyed after onCleared", info.mDestroyed);
+        assertNull("LoaderInfo should be removed from LoaderViewModel after onCleared",
+                loaderViewModel.getLoader(0));
     }
 
     private class AlwaysRunningLoaderInfo extends LoaderManagerImpl.LoaderInfo<Boolean> {
diff --git a/fragment/src/androidTest/java/android/support/v4/app/test/LoaderActivity.java b/fragment/src/androidTest/java/android/support/v4/app/test/LoaderActivity.java
index cb02efd..3ae5bab 100644
--- a/fragment/src/androidTest/java/android/support/v4/app/test/LoaderActivity.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/test/LoaderActivity.java
@@ -33,6 +33,8 @@
 
 public class LoaderActivity extends RecreatedActivity
         implements LoaderManager.LoaderCallbacks<String> {
+    private static final int TEXT_LOADER_ID = 14;
+
     public TextView textView;
     public TextView textViewB;
 
@@ -55,7 +57,7 @@
     @Override
     protected void onResume() {
         super.onResume();
-        getSupportLoaderManager().initLoader(0, null, this);
+        getSupportLoaderManager().initLoader(TEXT_LOADER_ID, null, this);
     }
 
     @NonNull
@@ -96,7 +98,7 @@
         @Override
         public void onCreate(@Nullable Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
-            getLoaderManager().initLoader(0, null, this);
+            getLoaderManager().initLoader(TEXT_LOADER_ID, null, this);
         }
 
         @Nullable
diff --git a/fragment/src/main/java/android/support/v4/app/LoaderManagerImpl.java b/fragment/src/main/java/android/support/v4/app/LoaderManagerImpl.java
index 951d908..fdde79f 100644
--- a/fragment/src/main/java/android/support/v4/app/LoaderManagerImpl.java
+++ b/fragment/src/main/java/android/support/v4/app/LoaderManagerImpl.java
@@ -294,6 +294,7 @@
                 LoaderInfo info = mLoaders.valueAt(index);
                 info.destroy();
             }
+            mLoaders.clear();
         }
 
         public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
diff --git a/graphics/Android.mk b/graphics/Android.mk
deleted file mode 100644
index 365b3b1..0000000
--- a/graphics/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2015 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.
-
-LOCAL_PATH:= $(call my-dir)
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/graphics/OWNERS b/graphics/OWNERS
deleted file mode 100644
index 4e6deac..0000000
--- a/graphics/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-ztenghui@google.com
\ No newline at end of file
diff --git a/graphics/drawable/Android.mk b/graphics/drawable/Android.mk
deleted file mode 100644
index 6667dd9..0000000
--- a/graphics/drawable/Android.mk
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright (C) 2015 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# ---------------------------------------------
-#
-# Static vector drawable library
-#
-# ---------------------------------------------
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-vectordrawable
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, static/src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/static/res
-LOCAL_MANIFEST_FILE := static/AndroidManifest.xml
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-compat
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-# ---------------------------------------------
-#
-# Animated vector drawable library
-#
-# ---------------------------------------------
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-animatedvectordrawable
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, animated/src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/animated/res
-LOCAL_MANIFEST_FILE := animated/AndroidManifest.xml
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-compat \
-    android-support-vectordrawable \
-    android-support-core-ui
-LOCAL_AAPT_FLAGS := --no-version-vectors --add-javadoc-annotation doconly
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/graphics/drawable/animated/api/27.1.0.txt b/graphics/drawable/animated/api/27.1.0.txt
new file mode 100644
index 0000000..ebdc90b
--- /dev/null
+++ b/graphics/drawable/animated/api/27.1.0.txt
@@ -0,0 +1,34 @@
+package android.support.graphics.drawable {
+
+  public abstract interface Animatable2Compat implements android.graphics.drawable.Animatable {
+    method public abstract void clearAnimationCallbacks();
+    method public abstract void registerAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+    method public abstract boolean unregisterAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+  }
+
+  public static abstract class Animatable2Compat.AnimationCallback {
+    ctor public Animatable2Compat.AnimationCallback();
+    method public void onAnimationEnd(android.graphics.drawable.Drawable);
+    method public void onAnimationStart(android.graphics.drawable.Drawable);
+  }
+
+  public class AnimatedVectorDrawableCompat extends android.graphics.drawable.Drawable implements android.support.graphics.drawable.Animatable2Compat android.support.v4.graphics.drawable.TintAwareDrawable {
+    method public void clearAnimationCallbacks();
+    method public static void clearAnimationCallbacks(android.graphics.drawable.Drawable);
+    method public static android.support.graphics.drawable.AnimatedVectorDrawableCompat create(android.content.Context, int);
+    method public static android.support.graphics.drawable.AnimatedVectorDrawableCompat 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 int getOpacity();
+    method public boolean isRunning();
+    method public void registerAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+    method public static void registerAnimationCallback(android.graphics.drawable.Drawable, android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void start();
+    method public void stop();
+    method public boolean unregisterAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+    method public static boolean unregisterAnimationCallback(android.graphics.drawable.Drawable, android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+  }
+
+}
+
diff --git a/graphics/drawable/animated/src/main/java/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java b/graphics/drawable/animated/src/main/java/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
index cff61bc..bc521cc 100644
--- a/graphics/drawable/animated/src/main/java/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
+++ b/graphics/drawable/animated/src/main/java/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
@@ -118,6 +118,9 @@
  *         <td>trimPathStart</td>
  *     </tr>
  *     <tr>
+ *         <td>trimPathEnd</td>
+ *     </tr>
+ *     <tr>
  *         <td>trimPathOffset</td>
  *     </tr>
  * </table>
diff --git a/graphics/drawable/static/api/27.1.0.txt b/graphics/drawable/static/api/27.1.0.txt
new file mode 100644
index 0000000..2fe60b8
--- /dev/null
+++ b/graphics/drawable/static/api/27.1.0.txt
@@ -0,0 +1,13 @@
+package android.support.graphics.drawable {
+
+  public class VectorDrawableCompat extends android.graphics.drawable.Drawable implements android.support.v4.graphics.drawable.TintAwareDrawable {
+    method public static android.support.graphics.drawable.VectorDrawableCompat create(android.content.res.Resources, int, android.content.res.Resources.Theme);
+    method public static android.support.graphics.drawable.VectorDrawableCompat createFromXmlInner(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 int getOpacity();
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter);
+  }
+
+}
+
diff --git a/graphics/drawable/static/src/main/java/android/support/graphics/drawable/AndroidResources.java b/graphics/drawable/static/src/main/java/android/support/graphics/drawable/AndroidResources.java
index 31370a2..804c623 100644
--- a/graphics/drawable/static/src/main/java/android/support/graphics/drawable/AndroidResources.java
+++ b/graphics/drawable/static/src/main/java/android/support/graphics/drawable/AndroidResources.java
@@ -89,8 +89,7 @@
 
     public static final int[] STYLEABLE_ANIMATOR = {
             0x01010141, 0x01010198, 0x010101be, 0x010101bf,
-            0x010101c0, 0x010102de, 0x010102df, 0x010102e0,
-            0x0111009c
+            0x010101c0, 0x010102de, 0x010102df, 0x010102e0
     };
 
     public static final int STYLEABLE_ANIMATOR_INTERPOLATOR = 0;
@@ -101,7 +100,6 @@
     public static final int STYLEABLE_ANIMATOR_VALUE_FROM = 5;
     public static final int STYLEABLE_ANIMATOR_VALUE_TO = 6;
     public static final int STYLEABLE_ANIMATOR_VALUE_TYPE = 7;
-    public static final int STYLEABLE_ANIMATOR_REMOVE_BEFORE_M_RELEASE = 8;
     public static final int[] STYLEABLE_ANIMATOR_SET = {
             0x010102e2
     };
diff --git a/include-composite-deps.gradle b/include-composite-deps.gradle
new file mode 100644
index 0000000..c8a795f
--- /dev/null
+++ b/include-composite-deps.gradle
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+
+
+// This file is part of a a workaround for https://github.com/gradle/gradle/issues/1909 to enable
+// including this Support Library build as an included build. See include-support-library.gradle
+// for usage instructions.
+
+boolean currentBuildIsRootBuild = (gradle.parent == null)
+
+// Add included builds. This only works if this is currently the root build, so this script should
+// be applied to several builds and will only enable itself when part of the root build.
+if (currentBuildIsRootBuild) {
+  String buildScriptDir = buildscript.sourceFile.parent
+  File externalRoot = new File(buildScriptDir, '../../external')
+
+  includeBuild(new File(externalRoot, 'doclava'))
+  includeBuild(new File(externalRoot, 'jdiff'))
+}
+
+
diff --git a/include-support-library.gradle b/include-support-library.gradle
new file mode 100644
index 0000000..fec8041
--- /dev/null
+++ b/include-support-library.gradle
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+
+// This file enables using Support Library in a Composite Build. More information about Composite
+// Builds can be found at https://docs.gradle.org/current/userguide/composite_builds.html .
+// This file is a workaround for https://github.com/gradle/gradle/issues/1909 .
+
+// Projects that want to include the build of Support Library should apply this file to their
+// settings.gradle . For example, if Support Library is at the file path ~/support-library, then
+// to include Support Library in your build, add this line to the bottom of your settings.gradle:
+//
+//   apply(from:'~/support-library/frameworks/support/include-support-library.gradle')
+
+String buildScriptDir = buildscript.sourceFile.parent
+
+// include any builds required by Support Library
+apply(from:new File(buildScriptDir, 'include-composite-deps.gradle'))
+
+// include Support Library itself
+includeBuild(buildScriptDir)
+
diff --git a/jetifier/OWNERS b/jetifier/OWNERS
new file mode 100644
index 0000000..8ae348f
--- /dev/null
+++ b/jetifier/OWNERS
@@ -0,0 +1 @@
+pavlis@google.com
diff --git a/jetifier/jetifier/build.gradle b/jetifier/jetifier/build.gradle
index 0f13962..e69de29 100644
--- a/jetifier/jetifier/build.gradle
+++ b/jetifier/jetifier/build.gradle
@@ -1,133 +0,0 @@
-/*
- * 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
- */
-
-buildscript {
-    ext.supportRootFolder = "${project.projectDir}/../.."
-    def prebuiltsDir = "${ext.supportRootFolder}/../../prebuilts"
-    repositories {
-        maven {
-            url "${prebuiltsDir}/tools/common/m2/repository"
-        }
-    }
-
-    ext.kotlin_version = '1.2.0'
-
-    dependencies {
-        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
-    }
-}
-
-// upload anchor for subprojects to upload their artifacts to the local repo.
-task(mainUpload)
-
-subprojects {
-    group 'androidx.tools.jetifier'
-
-    ext.supportRootFolder = "${project.projectDir}/../../.."
-    def prebuiltsDir = "${ext.supportRootFolder}/../../prebuilts"
-    repositories {
-        maven {
-            url "${prebuiltsDir}/tools/common/m2/repository"
-        }
-    }
-
-    apply plugin: 'kotlin'
-
-    compileKotlin {
-        kotlinOptions.jvmTarget = "1.8"
-    }
-    compileTestKotlin {
-        kotlinOptions.jvmTarget = "1.8"
-    }
-
-    dependencies {
-        compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
-    }
-}
-
-ext.runningInBuildServer = System.env.DIST_DIR != null && System.env.OUT_DIR != null
-def setupOutDirs() {
-    /*
-     * With the build server you are given two env variables.
-     * The OUT_DIR is a temporary directory you can use to put things during the build.
-     * The DIST_DIR is where you want to save things from the build.
-     *
-     * The build server will copy the contents of DIST_DIR to somewhere and make it available.
-     */
-    if (ext.runningInBuildServer) {
-        buildDir = new File(System.env.OUT_DIR + '/gradle/frameworks/support/build')
-                .getCanonicalFile()
-        project.ext.distDir = new File(System.env.DIST_DIR).getCanonicalFile()
-        // the build server does not pass the build number so we infer it from the last folder of
-        // the dist path.
-        ext.buildNumber = project.ext.distDir.getName()
-
-        // the build server should always print out full stack traces for any failures.
-        gradle.startParameter.showStacktrace = ShowStacktrace.ALWAYS
-    } else {
-        buildDir = file("${ext.supportRootFolder}/../../out/host/gradle/frameworks/support/jetifier/build")
-        project.ext.distDir = new File("${ext.supportRootFolder}/../../out/dist")
-        ext.buildNumber = 0
-    }
-
-    ext.repoDir = "file://$project.buildDir/repo"
-
-    subprojects {
-        // Change buildDir so that all plugins pick up the new value.
-        project.buildDir = new File("$project.parent.buildDir/../$project.name/build")
-        project.ext.distDir = new File("${ext.supportRootFolder}/../../out/dist")
-    }
-}
-
-def configureBuildOnServer() {
-    def buildOnServerTask = rootProject.tasks.create("buildOnServer")
-    rootProject.tasks.whenTaskAdded { task ->
-        if ("build".equals(task.name)) {
-            buildOnServerTask.dependsOn task
-        }
-    }
-    subprojects {
-        project.tasks.whenTaskAdded { task ->
-            if ("fatJar".equals(task.name)) {
-                buildOnServerTask.dependsOn task
-            }
-        }
-    }
-    buildOnServerTask.dependsOn "createArchive"
-}
-
-setupOutDirs()
-configureBuildOnServer()
-
-// anchor for prepare repo. This is post unzip.
-task prepareRepo() {
-    description "This task clears the repo folder to ensure that we run a fresh build every" +
-            " time we create arhives. Otherwise, snapshots will accumulate in the builds folder."
-    doFirst {
-        file(rootProject.ext.repoDir).deleteDir()
-        file(rootProject.ext.repoDir).mkdirs()
-    }
-}
-
-task createArchive(type : Zip) {
-    description "Creates a maven repository that includes just the libraries compiled in this" +
-            " project, without any history from prebuilts."
-    from rootProject.ext.repoDir
-    destinationDir rootProject.ext.distDir
-    into 'm2repository'
-    baseName = String.format("top-of-tree-m2repository-%s", project.ext.buildNumber)
-    dependsOn mainUpload
-}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/build.gradle b/jetifier/jetifier/core/build.gradle
index 72edcfa..2bf4d08 100644
--- a/jetifier/jetifier/core/build.gradle
+++ b/jetifier/jetifier/core/build.gradle
@@ -14,26 +14,31 @@
  * limitations under the License
  */
 
-apply plugin: 'maven'
+import static android.support.dependencies.DependenciesKt.KOTLIN_STDLIB
 
-version '0.2'
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportKotlinLibraryPlugin")
+}
 
 dependencies {
     compile("org.ow2.asm:asm:5.2")
     compile("org.ow2.asm:asm-commons:5.2")
     compile("com.google.code.gson:gson:2.8.0")
     compile("org.jdom:jdom2:2.0.6")
+    compile(KOTLIN_STDLIB)
     testCompile("junit:junit:4.12")
     testCompile("com.google.truth:truth:0.31")
 }
 
-uploadArchives {
-    repositories {
-        mavenDeployer {
-            repository(url: rootProject.ext.repoDir)
-        }
-    }
+supportLibrary {
+    name = "Android Jetifier Core"
+    publish = true
+    mavenVersion = LibraryVersions.JETIFIER
+    mavenGroup = LibraryGroups.JETIFIER
+    generateDocs = false
+    inceptionYear = "2017"
+    description = "Android Jetifier Core"
 }
-
-rootProject.mainUpload.dependsOn tasks["uploadArchives"]
-tasks["uploadArchives"].dependsOn rootProject.prepareRepo
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt
index 5af8fb2..aa2e1e3 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt
@@ -23,6 +23,7 @@
 import android.support.tools.jetifier.core.transform.TransformationContext
 import android.support.tools.jetifier.core.transform.Transformer
 import android.support.tools.jetifier.core.transform.bytecode.ByteCodeTransformer
+import android.support.tools.jetifier.core.transform.metainf.MetaInfTransformer
 import android.support.tools.jetifier.core.transform.pom.PomDocument
 import android.support.tools.jetifier.core.transform.pom.PomScanner
 import android.support.tools.jetifier.core.transform.proguard.ProGuardTransformer
@@ -30,7 +31,6 @@
 import android.support.tools.jetifier.core.utils.Log
 import java.io.File
 import java.io.FileNotFoundException
-import java.nio.file.Files
 import java.nio.file.Path
 
 /**
@@ -38,20 +38,75 @@
  * the registered [Transformer]s over the set and creates new archives that will contain the
  * transformed files.
  */
-class Processor(private val config : Config) : ArchiveItemVisitor {
+class Processor private constructor (
+    private val context: TransformationContext,
+    private val transformers: List<Transformer>
+) : ArchiveItemVisitor {
 
     companion object {
         private const val TAG = "Processor"
-    }
 
-    private val context = TransformationContext(config)
+        /**
+         * Value of "restrictToPackagePrefixes" config for reversed jetification.
+         */
+        private const val REVERSE_RESTRICT_TO_PACKAGE = "androidx"
 
-    private val transformers = listOf(
+        /**
+         * Transformers to be used when refactoring general libraries.
+         */
+        private fun createTransformers(context: TransformationContext) = listOf(
             // Register your transformers here
             ByteCodeTransformer(context),
             XmlResourcesTransformer(context),
             ProGuardTransformer(context)
-    )
+        )
+
+        /**
+         * Transformers to be used when refactoring the support library itself.
+         */
+        private fun createSLTransformers(context: TransformationContext) = listOf(
+            // Register your transformers here
+            ByteCodeTransformer(context),
+            XmlResourcesTransformer(context),
+            ProGuardTransformer(context),
+            MetaInfTransformer(context)
+        )
+
+        /**
+         * Creates a new instance of the [Processor].
+         * [config] Transformation configuration
+         * [reversedMode] Whether the processor should run in reversed mode
+         * [rewritingSupportLib] Whether we are rewriting the support library itself
+         */
+        fun createProcessor(
+            config: Config,
+            reversedMode: Boolean = false,
+            rewritingSupportLib: Boolean = false
+        ): Processor {
+            var newConfig = config
+
+            if (reversedMode) {
+                newConfig = Config(
+                    restrictToPackagePrefixes = listOf(REVERSE_RESTRICT_TO_PACKAGE),
+                    rewriteRules = config.rewriteRules,
+                    slRules = config.slRules,
+                    pomRewriteRules = emptyList(), // TODO: This will need a new set of rules
+                    typesMap = config.typesMap.reverseMapOrDie(),
+                    proGuardMap = config.proGuardMap.reverseMapOrDie(),
+                    packageMap = config.packageMap.reverse()
+                )
+            }
+
+            val context = TransformationContext(newConfig, rewritingSupportLib, reversedMode)
+            val transformers = if (rewritingSupportLib) {
+                createSLTransformers(context)
+            } else {
+                createTransformers(context)
+            }
+
+            return Processor(context, transformers)
+        }
+    }
 
     /**
      * Transforms the input libraries given in [inputLibraries] using all the registered
@@ -62,7 +117,17 @@
      * - [XmlResourcesTransformer] for java native code
      * - [ProGuardTransformer] for PorGuard files
      */
-    fun transform(inputLibraries: Set<File>, outputPath: Path) : TransformationResult {
+    fun transform(inputLibraries: Set<File>,
+            outputPath: Path,
+            outputIsDir: Boolean
+    ): TransformationResult {
+        // 0) Validate arguments
+        if (!outputIsDir && inputLibraries.size > 1) {
+            throw IllegalArgumentException("Cannot process more than 1 library (" + inputLibraries +
+                    ") when it is requested tha the destination (" + outputPath +
+                    ") be made a file")
+        }
+
         // 1) Extract and load all libraries
         val libraries = loadLibraries(inputLibraries)
 
@@ -70,10 +135,10 @@
         val pomFiles = scanPomFiles(libraries)
 
         // 3) Transform all the libraries
-        libraries.forEach{ transformLibrary(it) }
+        libraries.forEach { transformLibrary(it) }
 
-        if (context.wasErrorFound()) {
-            throw IllegalArgumentException("There were ${context.mappingNotFoundFailuresCount}" +
+        if (context.errorsTotal() > 0) {
+            throw IllegalArgumentException("There were ${context.errorsTotal()}" +
                 " errors found during the remapping. Check the logs for more details.")
         }
 
@@ -84,7 +149,13 @@
         transformPomFiles(pomFiles)
 
         // 5) Repackage the libraries back to archives
-        val outputLibraries = libraries.map{ it.writeSelfToDir(outputPath) }.toSet()
+        val outputLibraries = libraries.map {
+            if (outputIsDir) {
+                it.writeSelfToDir(outputPath)
+            } else {
+                it.writeSelfToFile(outputPath)
+            }
+        }.toSet()
 
         // TODO: Filter out only the libraries that have been really changed
         return TransformationResult(
@@ -92,7 +163,7 @@
             filesToAdd = outputLibraries)
     }
 
-    private fun loadLibraries(inputLibraries : Iterable<File>) : List<Archive> {
+    private fun loadLibraries(inputLibraries: Iterable<File>): List<Archive> {
         val libraries = mutableListOf<Archive>()
         for (library in inputLibraries) {
             if (!library.canRead()) {
@@ -104,8 +175,8 @@
         return libraries.toList()
     }
 
-    private fun scanPomFiles(libraries: List<Archive>) : List<PomDocument> {
-        val scanner = PomScanner(config)
+    private fun scanPomFiles(libraries: List<Archive>): List<PomDocument> {
+        val scanner = PomScanner(context.config)
 
         libraries.forEach { scanner.scanArchiveForPomFile(it) }
         if (scanner.wasErrorFound()) {
@@ -118,7 +189,7 @@
 
     private fun transformPomFiles(files: List<PomDocument>) {
         files.forEach {
-            it.applyRules(config.pomRewriteRules)
+            it.applyRules(context.config.pomRewriteRules)
             it.saveBackToFileIfNeeded()
         }
     }
@@ -127,11 +198,12 @@
         Log.i(TAG, "Started new transformation")
         Log.i(TAG, "- Input file: %s", archive.relativePath)
 
+        context.libraryName = archive.fileName
         archive.accept(this)
     }
 
     override fun visit(archive: Archive) {
-        archive.files.forEach{ it.accept(this) }
+        archive.files.forEach { it.accept(this) }
     }
 
     override fun visit(archiveFile: ArchiveFile) {
@@ -145,5 +217,4 @@
         Log.i(TAG, "[Applied: %s] %s", transformer.javaClass.simpleName, archiveFile.relativePath)
         transformer.runTransform(archiveFile)
     }
-
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/Archive.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/Archive.kt
index 70ea68c..bac2ffb 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/Archive.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/Archive.kt
@@ -53,16 +53,21 @@
     }
 
     @Throws(IOException::class)
-    fun writeSelfToDir(outputDirPath: Path) : File {
+    fun writeSelfToDir(outputDirPath: Path): File {
         val outputPath = Paths.get(outputDirPath.toString(), fileName)
 
+        return writeSelfToFile(outputPath)
+    }
+
+    @Throws(IOException::class)
+    fun writeSelfToFile(outputPath: Path): File {
         if (Files.exists(outputPath)) {
             Log.i(TAG, "Deleting old output file")
             Files.delete(outputPath)
         }
 
         // Create directories if they don't exist yet
-        Files.createDirectories(outputDirPath)
+        Files.createDirectories(outputPath.parent)
 
         Log.i(TAG, "Writing archive: %s", outputPath.toUri())
         val file = outputPath.toFile()
@@ -88,7 +93,6 @@
         out.finish()
     }
 
-
     object Builder {
 
         @Throws(IOException::class)
@@ -102,8 +106,7 @@
         }
 
         @Throws(IOException::class)
-        private fun extractArchive(inputStream: InputStream, relativePath: Path)
-                : Archive {
+        private fun extractArchive(inputStream: InputStream, relativePath: Path): Archive {
             val zipIn = ZipInputStream(inputStream)
             val files = mutableListOf<ArchiveItem>()
 
@@ -136,9 +139,8 @@
             return ArchiveFile(relativePath, data)
         }
 
-        private fun isArchive(zipEntry: ZipEntry) : Boolean {
+        private fun isArchive(zipEntry: ZipEntry): Boolean {
             return ARCHIVE_EXTENSIONS.any { zipEntry.name.endsWith(it, ignoreCase = true) }
         }
-
     }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveFile.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveFile.kt
index 3054b71..8443773 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveFile.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveFile.kt
@@ -23,9 +23,13 @@
 /**
  * Represents a file in the archive that is not an archive.
  */
-class ArchiveFile(override val relativePath: Path, var data: ByteArray) : ArchiveItem {
+class ArchiveFile(relativePath: Path, var data: ByteArray) : ArchiveItem {
 
-    override val fileName: String = relativePath.fileName.toString()
+    override var relativePath = relativePath
+        private set
+
+    override var fileName: String = relativePath.fileName.toString()
+        private set
 
     override fun accept(visitor: ArchiveItemVisitor) {
         visitor.visit(this)
@@ -36,4 +40,8 @@
         outputStream.write(data)
     }
 
+    fun updateRelativePath(newRelativePath: Path) {
+        this.relativePath = newRelativePath
+        this.fileName = relativePath.fileName.toString()
+    }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/config/Config.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/config/Config.kt
index 8d70d87..007130d 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/config/Config.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/config/Config.kt
@@ -19,6 +19,7 @@
 import android.support.tools.jetifier.core.rules.RewriteRule
 import android.support.tools.jetifier.core.transform.pom.PomRewriteRule
 import android.support.tools.jetifier.core.map.TypesMap
+import android.support.tools.jetifier.core.transform.PackageMap
 import android.support.tools.jetifier.core.transform.proguard.ProGuardTypesMap
 import com.google.gson.annotations.SerializedName
 
@@ -27,38 +28,44 @@
  *
  * [restrictToPackagePrefixes] Package prefixes that limit the scope of the rewriting
  * [rewriteRules] Rules to scan support libraries to generate [TypesMap]
+ * [slRules] List of rules used when rewriting the support library itself in the reversed mode to
+ * ignore packages that don't need rewriting anymore.
  * [pomRewriteRules] Rules to rewrite POM files
  * [typesMap] Map of all java types and fields to be used to rewrite libraries.
+ * [packageMap] Package map to be used to rewrite packages, used only during the support library
+ * rewrite.
  */
 data class Config(
         val restrictToPackagePrefixes: List<String>,
         val rewriteRules: List<RewriteRule>,
+        val slRules: List<RewriteRule>,
         val pomRewriteRules: List<PomRewriteRule>,
         val typesMap: TypesMap,
-        val proGuardMap: ProGuardTypesMap) {
+        val proGuardMap: ProGuardTypesMap,
+        val packageMap: PackageMap = PackageMap(PackageMap.DEFAULT_RULES)) {
 
     companion object {
         /** Path to the default config file located within the jar file. */
         const val DEFAULT_CONFIG_RES_PATH = "/default.generated.config"
     }
 
-    fun setNewMap(mappings: TypesMap) : Config {
-        return Config(
-            restrictToPackagePrefixes, rewriteRules, pomRewriteRules, mappings, proGuardMap)
+    fun setNewMap(mappings: TypesMap): Config {
+        return Config(restrictToPackagePrefixes, rewriteRules, slRules, pomRewriteRules,
+            mappings, proGuardMap)
     }
 
     /** Returns JSON data model of this class */
-    fun toJson() : JsonData {
+    fun toJson(): JsonData {
         return JsonData(
             restrictToPackagePrefixes,
             rewriteRules.map { it.toJson() }.toList(),
+            slRules.map { it.toJson() }.toList(),
             pomRewriteRules.map { it.toJson() }.toList(),
             typesMap.toJson(),
             proGuardMap.toJson()
         )
     }
 
-
     /**
      * JSON data model for [Config].
      */
@@ -69,6 +76,9 @@
             @SerializedName("rules")
             val rules: List<RewriteRule.JsonData?>,
 
+            @SerializedName("slRules")
+            val slRules: List<RewriteRule.JsonData?>?,
+
             @SerializedName("pomRules")
             val pomRules: List<PomRewriteRule.JsonData?>,
 
@@ -79,15 +89,15 @@
             val proGuardMap: ProGuardTypesMap.JsonData? = null) {
 
         /** Creates instance of [Config] */
-        fun toConfig() : Config {
+        fun toConfig(): Config {
             return Config(
-                restrictToPackages.filterNotNull(),
-                rules.filterNotNull().map { it.toRule() },
-                pomRules.filterNotNull().map { it.toRule() },
-                mappings?.toMappings() ?: TypesMap.EMPTY,
-                proGuardMap?.toMappings() ?: ProGuardTypesMap.EMPTY
+                restrictToPackagePrefixes = restrictToPackages.filterNotNull(),
+                rewriteRules = rules.filterNotNull().map { it.toRule() },
+                slRules = slRules?.filterNotNull()?.map { it.toRule() } ?: listOf(),
+                pomRewriteRules = pomRules.filterNotNull().map { it.toRule() },
+                typesMap = mappings?.toMappings() ?: TypesMap.EMPTY,
+                proGuardMap = proGuardMap?.toMappings() ?: ProGuardTypesMap.EMPTY
             )
         }
     }
-
 }
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/LibraryMapGenerator.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/LibraryMapGenerator.kt
index e52009f..c9d8f9f 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/LibraryMapGenerator.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/LibraryMapGenerator.kt
@@ -42,9 +42,7 @@
      * Creates the [TypesMap] based on the meta-data aggregated via previous [scanFile] calls
      */
     fun generateMap(): TypesMap {
-        val map = remapper.createTypesMap()
-        map.validateThatMapIsReversibleOrDie()
-        return map
+        return remapper.createTypesMap()
     }
 
     override fun visit(archive: Archive) {
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/MapGeneratorRemapper.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/MapGeneratorRemapper.kt
index 10abe1e..369cf91 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/MapGeneratorRemapper.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/MapGeneratorRemapper.kt
@@ -17,18 +17,16 @@
 package android.support.tools.jetifier.core.map
 
 import android.support.tools.jetifier.core.config.Config
-import android.support.tools.jetifier.core.rules.JavaField
 import android.support.tools.jetifier.core.rules.JavaType
 import android.support.tools.jetifier.core.transform.bytecode.CoreRemapper
-import android.support.tools.jetifier.core.transform.bytecode.asm.CustomClassRemapper
 import android.support.tools.jetifier.core.transform.bytecode.asm.CustomRemapper
 import android.support.tools.jetifier.core.utils.Log
 import org.objectweb.asm.ClassVisitor
-import java.util.regex.Pattern
+import org.objectweb.asm.commons.ClassRemapper
 
 /**
  * Hooks to asm remapping to collect data for [TypesMap] by applying all the [RewriteRule]s from the
- * given [config] on all discovered and eligible types and fields.
+ * given [config] on all discovered and eligible types.
  */
 class MapGeneratorRemapper(private val config: Config) : CoreRemapper {
 
@@ -36,26 +34,13 @@
         private const val TAG: String = "MapGeneratorRemapper"
     }
 
-    private val typesRewritesMap = hashMapOf<JavaType, JavaType>()
-    private val fieldsRewritesMap = hashMapOf<JavaField, JavaField>()
+    private val typesRewritesMap = mutableMapOf<JavaType, JavaType>()
 
     var isMapNotComplete = false
         private set
 
-    /**
-     * Ignore mPrefix types and anything that contains $ as these are internal fields that won't be
-     * ever referenced.
-     */
-    private val ignoredFields = Pattern.compile("(^m[A-Z]+.*$)|(.*\\$.*)")
-
-    /**
-     * Ignores types ending with '$digit' as these are private inner classes and won't be ever
-     * referenced.
-     */
-    private val ignoredTypes = Pattern.compile("^(.*)\\$[0-9]+$")
-
-    fun createClassRemapper(visitor: ClassVisitor): CustomClassRemapper {
-        return CustomClassRemapper(visitor, CustomRemapper(this))
+    fun createClassRemapper(visitor: ClassVisitor): ClassRemapper {
+        return ClassRemapper(visitor, CustomRemapper(this))
     }
 
     override fun rewriteType(type: JavaType): JavaType {
@@ -67,10 +52,6 @@
             return type
         }
 
-        if (isTypeIgnored(type)) {
-            return type
-        }
-
         // Try to find a rule
         for (rule in config.rewriteRules) {
             val typeRewriteResult = rule.apply(type)
@@ -92,58 +73,16 @@
         return type
     }
 
-    override fun rewriteField(field: JavaField): JavaField {
-        if (!isTypeSupported(field.owner)) {
-            return field
-        }
-
-        if (isTypeIgnored(field.owner) || isFieldIgnored(field)) {
-            return field
-        }
-
-        if (fieldsRewritesMap.contains(field)) {
-            return field
-        }
-
-        // Try to find a rule
-        for (rule in config.rewriteRules) {
-            val fieldRewriteResult = rule.apply(field)
-            if (fieldRewriteResult.isIgnored) {
-                Log.i(TAG, "Ignoring: " + field)
-                return field
-            }
-            if (fieldRewriteResult.result == null) {
-                continue
-            }
-            fieldsRewritesMap.put(field, fieldRewriteResult.result)
-            Log.i(TAG, "  map: %s -> %s", field, fieldRewriteResult.result)
-            return fieldRewriteResult.result
-        }
-
-        isMapNotComplete = true
-        Log.e(TAG, "No rule for: " + field)
-        fieldsRewritesMap.put(field, field) // Identity
-        return field
-    }
-
     override fun rewriteString(value: String): String {
         // We don't build map from strings
         return value
     }
 
     fun createTypesMap(): TypesMap {
-        return TypesMap(typesRewritesMap, fieldsRewritesMap)
+        return TypesMap(typesRewritesMap)
     }
 
     private fun isTypeSupported(type: JavaType): Boolean {
         return config.restrictToPackagePrefixes.any { type.fullName.startsWith(it) }
     }
-
-    private fun isTypeIgnored(type: JavaType): Boolean {
-        return ignoredTypes.matcher(type.fullName).matches()
-    }
-
-    private fun isFieldIgnored(field: JavaField): Boolean {
-        return ignoredFields.matcher(field.name).matches()
-    }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/TypesMap.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/TypesMap.kt
index b33d4bc..c5f221e 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/TypesMap.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/map/TypesMap.kt
@@ -16,54 +16,35 @@
 
 package android.support.tools.jetifier.core.map
 
-import android.support.tools.jetifier.core.rules.JavaField
 import android.support.tools.jetifier.core.rules.JavaType
 import android.support.tools.jetifier.core.rules.RewriteRule
 import android.support.tools.jetifier.core.utils.Log
 
 /**
- * Contains all the mappings needed to rewrite java types and fields.
+ * Contains all the mappings needed to rewrite java types.
  *
  * These mappings are generated by the preprocessor from existing support libraries and by applying
  * the given [RewriteRule]s.
  */
 data class TypesMap(
-        val types: Map<JavaType, JavaType>,
-        val fields: Map<JavaField, JavaField>) {
+        val types: Map<JavaType, JavaType>) {
 
     companion object {
         private const val TAG = "TypesMap"
 
-        val EMPTY = TypesMap(emptyMap(), emptyMap())
+        val EMPTY = TypesMap(emptyMap())
     }
 
     /** Returns JSON data model of this class */
     fun toJson(): JsonData {
-        return JsonData(
-                types = types.map { it.key.fullName to it.value.fullName }
-                        .toMap(),
-                fields = mapFields())
-    }
-
-    private fun mapFields(): Map<String, Map<String, List<String>>> {
-        val rawMap = mutableMapOf<String, MutableMap<String, MutableList<String>>>()
-
-        fields.forEach {
-            rawMap
-                .getOrPut(it.key.owner.fullName, { mutableMapOf() })
-                .getOrPut(it.value.owner.fullName, { mutableListOf() })
-                .add(it.key.name)
-        }
-        return rawMap
+        return JsonData(types.map { it.key.fullName to it.value.fullName }.toMap())
     }
 
     /**
-     * Validates that the current map can be used in reversed mode (values become keys). Throws
-     * exception if the map does not satisfy that.
+     * Creates reversed version of this map (values become keys). Throws exception if the map does
+     * not satisfy that.
      */
-    fun validateThatMapIsReversibleOrDie() {
-        Log.i(TAG, "Validating that the map is reversible")
-
+    fun reverseMapOrDie(): TypesMap {
         val typesReversed = mutableMapOf<JavaType, JavaType>()
         for ((from, to) in types) {
             val conflictFrom = typesReversed[to]
@@ -74,29 +55,32 @@
             typesReversed[to] = from
         }
 
-        val fieldsReversed = mutableMapOf<JavaField, JavaField>()
-        for ((from, to) in fields) {
-            val conflictFrom = fieldsReversed[to]
-            if (conflictFrom != null) {
-                Log.e(TAG, "Conflict: %s -> (%s, %s)", to, from, conflictFrom)
-                continue
-            }
-            fieldsReversed[to] = from
+        if (types.size != typesReversed.size) {
+            throw IllegalArgumentException("Types map is not reversible as conflicts were found! " +
+                "See the log for more details.")
         }
 
-        if (types.size != typesReversed.size || fields.size != fieldsReversed.size) {
-            throw IllegalArgumentException(
-                "Map is not reversible as conflicts were found! See the log for more details.")
+        return TypesMap(types= typesReversed)
+    }
+
+    fun mergetWith(typesMap: TypesMap): TypesMap {
+        val mergedMap = mutableMapOf<JavaType, JavaType>()
+        mergedMap.putAll(types)
+        typesMap.types.forEach {
+            if (mergedMap.containsKey(it.key)) {
+                throw RuntimeException("Failed to merge the given types maps as there is" +
+                    " a duplicity with key '${it.key.fullName}' for values '${it.value}' and " +
+                    "'${mergedMap[it.key]}'.")
+            }
+            mergedMap.put(it.key, it.value)
         }
-        Log.i(TAG, "Map is reversible. Success!")
+        return TypesMap(mergedMap)
     }
 
     /**
      * JSON data model for [TypesMap].
      */
-    data class JsonData(
-            val types: Map<String, String>,
-            val fields: Map<String, Map<String, List<String>>>) {
+    data class JsonData(val types: Map<String, String>) {
 
         /** Creates instance of [TypesMap] */
         fun toMappings(): TypesMap {
@@ -104,18 +88,6 @@
                 types = types
                     .orEmpty()
                     .map { JavaType(it.key) to JavaType(it.value) }
-                    .toMap(),
-                fields = fields
-                    .orEmpty().entries
-                    .flatMap {
-                        top ->
-                        top.value.flatMap {
-                            mid ->
-                            mid.value.map {
-                                JavaField(top.key, it) to JavaField(mid.key, it)
-                            }
-                        }
-                    }
                     .toMap())
         }
     }
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/JavaField.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/JavaField.kt
deleted file mode 100644
index c423f0a..0000000
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/JavaField.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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 android.support.tools.jetifier.core.rules
-
-/**
- * Wrapper for Java field declaration.
- */
-data class JavaField(val owner : JavaType, val name : String) {
-
-    constructor(owner : String, name : String) : this(JavaType(owner), name)
-
-
-    fun renameOwner(newOwner: JavaType) = JavaField(newOwner, name)
-
-    override fun toString() = owner.toString() + "." + name
-
-}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/JavaType.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/JavaType.kt
index d7a077b..744ec29 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/JavaType.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/JavaType.kt
@@ -18,6 +18,8 @@
 
 /**
  * Wrapper for Java type declaration.
+ *
+ * For packages use [PackageName].
  */
 data class JavaType(val fullName: String) {
 
@@ -29,17 +31,15 @@
 
     companion object {
         /** Creates the type from notation where packages are separated using '.' */
-        fun fromDotVersion(fullName: String) : JavaType {
+        fun fromDotVersion(fullName: String): JavaType {
             return JavaType(fullName.replace('.', '/'))
         }
     }
 
     /** Returns the type as a string where packages are separated using '.' */
-    fun toDotNotation() : String {
+    fun toDotNotation(): String {
         return fullName.replace('/', '.')
     }
 
-
     override fun toString() = fullName
-
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/JavaTypeXmlRef.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/JavaTypeXmlRef.kt
deleted file mode 100644
index 9d58046..0000000
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/JavaTypeXmlRef.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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 android.support.tools.jetifier.core.rules
-
-/**
- * Wrapper for Java type reference used in XML.
- *
- * In XML we use '.' as a package separator.
- */
-data class JavaTypeXmlRef(val fullName : String) {
-
-    constructor(type: JavaType)
-        : this(type.fullName.replace('/', '.'))
-
-    fun toJavaType() : JavaType {
-        return JavaType(fullName.replace('.', '/'))
-    }
-
-    override fun toString() = fullName
-}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/PackageName.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/PackageName.kt
new file mode 100644
index 0000000..c42f995
--- /dev/null
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/PackageName.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 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 android.support.tools.jetifier.core.rules
+
+/**
+ * Wrapper for Java package name declaration.
+ */
+data class PackageName(val fullName: String) {
+
+    init {
+        if (fullName.contains('.')) {
+            throw IllegalArgumentException("The type does not support '.' as a package separator!")
+        }
+    }
+
+    companion object {
+        /** Creates the package from notation where packages are separated using '.' */
+        fun fromDotVersion(fullName: String): PackageName {
+            return PackageName(fullName.replace('.', '/'))
+        }
+    }
+
+    /** Returns the package as a string where packages are separated using '.' */
+    fun toDotNotation(): String {
+        return fullName.replace('/', '.')
+    }
+
+    override fun toString() = fullName
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/RewriteRule.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/RewriteRule.kt
index 40497d8..0a7fbde 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/RewriteRule.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/rules/RewriteRule.kt
@@ -16,11 +16,12 @@
 
 package android.support.tools.jetifier.core.rules
 
+import android.support.tools.jetifier.core.transform.proguard.ProGuardType
 import com.google.gson.annotations.SerializedName
 import java.util.regex.Pattern
 
 /**
- * Rule that rewrites a Java type or field based on the given arguments.
+ * Rule that rewrites a Java type based on the given arguments.
  *
  * Used in the preprocessor when generating [TypesMap].
  *
@@ -28,62 +29,52 @@
  * is "$". Used to match the input type.
  * @param to A string to be used as a replacement if the 'from' pattern is matched. It can also
  * apply groups matched from the original pattern using {x} annotation, e.g. {0}.
- * @param fieldSelectors Collection of regular expressions that are used to match fields. If the
- * type is matched (using 'from') and the field is matched (or the list of fields selectors is
- * empty) the field's type gets rewritten according to the 'to' parameter.
  */
 class RewriteRule(
         private val from: String,
-        private val to: String,
-        private val fieldSelectors: List<String> = emptyList()) {
+        private val to: String) {
+
+    companion object {
+        const val IGNORE_RUNTIME = "ignore"
+        const val IGNORE_PREPROCESSOR_ONLY = "ignoreInPreprocessorOnly"
+    }
 
     // We escape '$' so we don't conflict with regular expression symbols.
     private val inputPattern = Pattern.compile("^${from.replace("$", "\\$")}$")
     private val outputPattern = to.replace("$", "\$")
 
-    private val fields = fieldSelectors.map { Pattern.compile("^$it$") }
+    /*
+     * Whether this is any type of an ignore rule.
+     */
+    fun isIgnoreRule() = isRuntimeIgnoreRule() || isPreprocessorOnlyIgnoreRule()
+
+    /*
+     * Whether this rules is an ignore rule.
+     *
+     * Any type matched to [from] will be in such case ignored by the preprocessor (thus missing
+     * from the map) but it will be also ignored during rewriting.
+     */
+    fun isRuntimeIgnoreRule() = to == IGNORE_RUNTIME
+
+    /*
+     * Whether this rule is an ignore rule that should be used only in the preprocessor.
+     *
+     * That means that error is still thrown if [from] is found in a library that is being
+     * rewritten. Use this for types that are internal to support library. This is weaker version of
+     * [isRuntimeIgnoreRule].
+     */
+    fun isPreprocessorOnlyIgnoreRule() = to == IGNORE_PREPROCESSOR_ONLY
 
     /**
      * Rewrites the given java type. Returns null if this rule is not applicable for the given type.
      */
     fun apply(input: JavaType): TypeRewriteResult {
-        if (fields.isNotEmpty()) {
-            return TypeRewriteResult.NOT_APPLIED
-        }
-
-        return applyInternal(input)
-    }
-
-    /**
-     * Rewrites the given field type. Returns null if this rule is not applicable for the given
-     * type.
-     */
-    fun apply(inputField: JavaField): FieldRewriteResult {
-        val typeRewriteResult = applyInternal(inputField.owner)
-
-        if (typeRewriteResult.isIgnored) {
-            return FieldRewriteResult.IGNORED
-        }
-        if (typeRewriteResult.result == null) {
-            return FieldRewriteResult.NOT_APPLIED
-        }
-
-        val isFieldInTheFilter = fields.isEmpty()
-                || fields.any { it.matcher(inputField.name).matches() }
-        if (!isFieldInTheFilter) {
-            return FieldRewriteResult.NOT_APPLIED
-        }
-
-        return FieldRewriteResult(inputField.renameOwner(typeRewriteResult.result))
-    }
-
-    private fun applyInternal(input: JavaType): TypeRewriteResult {
         val matcher = inputPattern.matcher(input.fullName)
         if (!matcher.matches()) {
             return TypeRewriteResult.NOT_APPLIED
         }
 
-        if (to == "ignore") {
+        if (isIgnoreRule()) {
             return TypeRewriteResult.IGNORED
         }
 
@@ -95,13 +86,25 @@
         return TypeRewriteResult(JavaType(result))
     }
 
+    /*
+     * Returns whether this rule is an ignore rule and applies to the given proGuard type.
+     */
+    fun doesThisIgnoreProGuard(type: ProGuardType): Boolean {
+        if (!isIgnoreRule()) {
+            return false
+        }
+
+        val matcher = inputPattern.matcher(type.value)
+        return matcher.matches()
+    }
+
     override fun toString(): String {
-        return "$inputPattern -> $outputPattern " + fields.joinToString { it.toString() }
+        return "$inputPattern -> $outputPattern "
     }
 
     /** Returns JSON data model of this class */
     fun toJson(): JsonData {
-        return JsonData(from, to, fieldSelectors)
+        return JsonData(from, to)
     }
 
     /**
@@ -112,14 +115,11 @@
             val from: String,
 
             @SerializedName("to")
-            val to: String,
-
-            @SerializedName("fieldSelectors")
-            val fieldSelectors: List<String>? = null) {
+            val to: String) {
 
         /** Creates instance of [RewriteRule] */
         fun toRule(): RewriteRule {
-            return RewriteRule(from, to, fieldSelectors.orEmpty())
+            return RewriteRule(from, to)
         }
     }
 
@@ -134,16 +134,4 @@
             val IGNORED = TypeRewriteResult(result = null, isIgnored = true)
         }
     }
-
-    /**
-     * Result of java field rewrite using [RewriteRule]
-     */
-    data class FieldRewriteResult(val result: JavaField?, val isIgnored: Boolean = false) {
-
-        companion object {
-            val NOT_APPLIED = FieldRewriteResult(result = null, isIgnored = false)
-
-            val IGNORED = FieldRewriteResult(result = null, isIgnored = true)
-        }
-    }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/PackageMap.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/PackageMap.kt
new file mode 100644
index 0000000..639dfb8
--- /dev/null
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/PackageMap.kt
@@ -0,0 +1,201 @@
+/*
+ * 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 android.support.tools.jetifier.core.transform
+
+import android.support.tools.jetifier.core.rules.PackageName
+
+/**
+ * Package map to be used to rewrite packages. The rewrite rules allow duplicities where the
+ * artifact name prefix defined in a rule determines if such rule should be used or skipped.
+ * The priority is determined only by the order (top to bottom). Having a rule with no file prefix
+ * as first means that it is always applied.
+ *
+ * We use this only for the support library rewriting to rewrite packages in manifest files.
+ */
+class PackageMap(private val rules: List<PackageRule>) {
+
+    companion object {
+        val DEFAULT_RULES = listOf(
+            PackageRule(
+                from = "android/support/exifinterface",
+                to = "android/support/exifinterface"
+            ),
+            PackageRule(
+                from = "android/support/graphics/drawable",
+                to = "androidx/graphics/drawable"
+            ),
+            PackageRule(
+                from = "android/support/graphics/drawable/animated",
+                to = "androidx/graphics/drawable/animated"
+            ),
+            PackageRule(
+                from = "androidx/media/tv",
+                to = "androidx/media/tv"
+            ),
+            PackageRule(
+                from = "androidx/view/textclassifier",
+                to = "androidx/view/textclassifier"
+            ),
+            PackageRule(
+                from = "androidx/widget/recyclerview/selection",
+                to = "androidx/widget/recyclerview/selection"),
+            PackageRule(
+                from = "android/support/v4",
+                to = "android/support/v4"
+            ),
+            PackageRule(
+                from = "android/support/v7/palette",
+                to = "android/support/v7/palette"
+            ),
+            PackageRule(
+                from = "android/support/v7/cardview",
+                to = "android/support/v7/cardview"
+            ),
+            PackageRule(
+                from = "android/support/v7/mediarouter",
+                to = "android/support/v7/mediarouter"
+            ),
+            PackageRule(
+                from = "android/support/v7/appcompat",
+                to = "android/support/v7/appcompat"
+            ),
+            PackageRule(
+                from = "android/support/v7/recyclerview",
+                to = "android/support/v7/recyclerview"
+            ),
+            PackageRule(
+                from = "android/support/v7/gridlayout",
+                to = "android/support/v7/gridlayout"
+            ),
+            PackageRule(
+                from = "android/support/v13",
+                to = "android/support/v13"
+            ),
+            PackageRule(
+                from = "android/support/v7/preference",
+                to = "androidx/preference",
+                filePrefix = "preference-v7"
+            ),
+            PackageRule(
+                from = "android/support/v14/preference",
+                to = "androidx/preference",
+                filePrefix = "preference-v14"
+            ),
+            PackageRule(
+                from = "android/support/v17/lexanback",
+                to = "androidx/leanback"
+            ),
+            PackageRule(
+                from = "android/support/v17/preference",
+                to = "androidx/leanback/preference"
+            ),
+            PackageRule(
+                from = "android/support/compat",
+                to = "android/support/compat"
+            ),
+            PackageRule(
+                from = "android/support/mediacompat",
+                to = "android/support/mediacompat"
+            ),
+            PackageRule(
+                from = "android/support/fragment",
+                to = "android/support/fragment"
+            ),
+            PackageRule(
+                from = "android/support/coreutils",
+                to = "android/support/coreutils"
+            ),
+            PackageRule(
+                from = "android/support/dynamicanimation",
+                to = "android/support/dynamicanimation"
+            ),
+            PackageRule(
+                from = "android/support/customtabs",
+                to = "androidx/browser/customtabs"
+            ),
+            PackageRule(
+                from = "android/support/coreui",
+                to = "android/support/coreui"
+            ),
+            PackageRule(
+                from = "android/support/content",
+                to = "android/support/content"
+            ),
+            PackageRule(
+                from = "android/support/transition",
+                to = "androidx/transition"
+            ),
+            PackageRule(
+                from = "android/support/v17/leanback",
+                to = "androidx/leanback"
+            ),
+            PackageRule(
+                from = "android/support/recommendation",
+                to = "android/support/recommendation"
+            ),
+            PackageRule(
+                from = "android/support/wear",
+                to = "androidx/wear"
+            ),
+            PackageRule(
+                from = "android/support/design",
+                to = "androidx/design"
+            ),
+            PackageRule(
+                from = "androidx/text/emoji",
+                to = "androidx/text/emoji"
+            ),
+            PackageRule(
+                from = "androidx/text/emoji/appcompat",
+                to = "androidx/text/emoji/appcompat"
+            ),
+            PackageRule(
+                from = "androidx/text/emoji/bundled",
+                to = "androidx/text/emoji/bundled"
+            )
+        )
+
+        val EMPTY = PackageMap(emptyList())
+    }
+
+    /**
+     * Creates reversed version of this map (from becomes to and vice versa).
+     */
+    fun reverse(): PackageMap {
+        return PackageMap(rules
+            .map { PackageRule(from = it.to, to = it.from, filePrefix = it.filePrefix) }
+            .toList())
+    }
+
+    /**
+     * Returns a new package name for the given [fromPackage] defined in artifact being called
+     * [libraryName].
+     */
+    fun getPackageFor(fromPackage: PackageName, libraryName: String): PackageName? {
+        val rule = rules.find {
+            it.from == fromPackage.fullName
+                && (it.filePrefix == null
+                || libraryName.startsWith(it.filePrefix, ignoreCase = true))
+        }
+        if (rule != null) {
+            return PackageName(rule.to)
+        }
+        return null
+    }
+
+    data class PackageRule(val from: String, val to: String, val filePrefix: String? = null)
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/TransformationContext.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/TransformationContext.kt
index 3f8af95..08a22a4 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/TransformationContext.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/TransformationContext.kt
@@ -18,13 +18,18 @@
 
 import android.support.tools.jetifier.core.config.Config
 import android.support.tools.jetifier.core.rules.JavaType
+import android.support.tools.jetifier.core.rules.RewriteRule.TypeRewriteResult
 import android.support.tools.jetifier.core.transform.proguard.ProGuardType
 import java.util.regex.Pattern
 
 /**
  * Context to share the transformation state between individual [Transformer]s.
  */
-class TransformationContext(val config: Config) {
+class TransformationContext(
+    val config: Config,
+    val rewritingSupportLib: Boolean = false,
+    val isInReversedMode: Boolean = false
+) {
 
     // Merges all packages prefixes into one regEx pattern
     private val packagePrefixPattern = Pattern.compile(
@@ -38,19 +43,38 @@
     var proGuardMappingNotFoundFailuresCount = 0
         private set
 
-    /** Returns whether any errors were found during the transformation process */
-    fun wasErrorFound() = mappingNotFoundFailuresCount > 0
+    /** Counter for [reportNoPackageMappingFoundFailure] calls. */
+    var packageMappingNotFoundFailuresCounts = 0
+
+    var libraryName: String = ""
+
+    private var runtimeIgnoreRules =
+        (
+            if (rewritingSupportLib) {
+                config.slRules
+            } else {
+                config.rewriteRules
+            }
+        )
+        .filter { it.isRuntimeIgnoreRule() }
+        .toTypedArray()
+
+    /** Total amount of errors found during the transformation process */
+    fun errorsTotal() = mappingNotFoundFailuresCount + proGuardMappingNotFoundFailuresCount +
+        packageMappingNotFoundFailuresCounts
 
     /**
      * Returns whether the given type is eligible for rewrite.
      *
      * If not, the transformers should ignore it.
      */
-    fun isEligibleForRewrite(type: JavaType) : Boolean {
-        if (config.restrictToPackagePrefixes.isEmpty()) {
+    fun isEligibleForRewrite(type: JavaType): Boolean {
+        if (!isEligibleForRewriteInternal(type.fullName)) {
             return false
         }
-        return packagePrefixPattern.matcher(type.fullName).matches()
+
+        val isIgnored = runtimeIgnoreRules.any { it.apply(type) == TypeRewriteResult.IGNORED }
+        return !isIgnored
     }
 
     /**
@@ -60,15 +84,24 @@
      * like *.v7 are not matched by prefix support.v7. So don't rely on it and use
      * the [ProGuardTypesMap] as first.
      */
-    fun isEligibleForRewrite(type: ProGuardType) : Boolean {
+    fun isEligibleForRewrite(type: ProGuardType): Boolean {
+        if (!isEligibleForRewriteInternal(type.value)) {
+            return false
+        }
+
+        val isIgnored = runtimeIgnoreRules.any { it.doesThisIgnoreProGuard(type) }
+        return !isIgnored
+    }
+
+    private fun isEligibleForRewriteInternal(type: String): Boolean {
         if (config.restrictToPackagePrefixes.isEmpty()) {
             return false
         }
-        return packagePrefixPattern.matcher(type.value).matches()
+        return packagePrefixPattern.matcher(type).matches()
     }
 
     /**
-     * Used to report that there was a reference found that satisfies [isEligibleForRewrite] but no
+     * Reports that there was a reference found that satisfies [isEligibleForRewrite] but no
      * mapping was found to rewrite it.
      */
     fun reportNoMappingFoundFailure() {
@@ -76,10 +109,18 @@
     }
 
     /**
-     * Used to report that there was a reference found in the ProGuard file that satisfies
+     * Reports that there was a reference found in a ProGuard file that satisfies
      * [isEligibleForRewrite] but no mapping was found to rewrite it.
      */
     fun reportNoProGuardMappingFoundFailure() {
         proGuardMappingNotFoundFailuresCount++
     }
+
+    /**
+     * Reports that there was a package reference found in a manifest file during a support library
+     * artifact rewrite but no mapping was found for it.
+     */
+    fun reportNoPackageMappingFoundFailure() {
+        packageMappingNotFoundFailuresCounts++
+    }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/ByteCodeTransformer.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/ByteCodeTransformer.kt
index 33235e0..296ce49 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/ByteCodeTransformer.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/ByteCodeTransformer.kt
@@ -17,7 +17,6 @@
 package android.support.tools.jetifier.core.transform.bytecode
 
 import android.support.tools.jetifier.core.archive.ArchiveFile
-import android.support.tools.jetifier.core.config.Config
 import android.support.tools.jetifier.core.transform.TransformationContext
 import android.support.tools.jetifier.core.transform.Transformer
 import org.objectweb.asm.ClassReader
@@ -30,7 +29,6 @@
 
     private val remapper: CoreRemapperImpl = CoreRemapperImpl(context)
 
-
     override fun canTransform(file: ArchiveFile) = file.isClassFile()
 
     override fun runTransform(file: ArchiveFile) {
@@ -42,5 +40,6 @@
         reader.accept(visitor, 0 /* flags */)
 
         file.data = writer.toByteArray()
+        file.updateRelativePath(remapper.rewritePath(file.relativePath))
     }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapper.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapper.kt
index 38ce393..1b91088 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapper.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapper.kt
@@ -16,7 +16,6 @@
 
 package android.support.tools.jetifier.core.transform.bytecode
 
-import android.support.tools.jetifier.core.rules.JavaField
 import android.support.tools.jetifier.core.rules.JavaType
 
 /**
@@ -25,7 +24,5 @@
 interface CoreRemapper {
     fun rewriteType(type: JavaType): JavaType
 
-    fun rewriteField(field: JavaField): JavaField
-
     fun rewriteString(value: String): String
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt
index 71c4e9e..2ff0081 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt
@@ -17,13 +17,13 @@
 package android.support.tools.jetifier.core.transform.bytecode
 
 import android.support.tools.jetifier.core.map.TypesMap
-import android.support.tools.jetifier.core.rules.JavaField
 import android.support.tools.jetifier.core.rules.JavaType
 import android.support.tools.jetifier.core.transform.TransformationContext
-import android.support.tools.jetifier.core.transform.bytecode.asm.CustomClassRemapper
 import android.support.tools.jetifier.core.transform.bytecode.asm.CustomRemapper
 import android.support.tools.jetifier.core.utils.Log
 import org.objectweb.asm.ClassVisitor
+import org.objectweb.asm.commons.ClassRemapper
+import java.nio.file.Path
 
 /**
  * Applies mappings defined in [TypesMap] during the remapping process.
@@ -36,8 +36,8 @@
 
     private val typesMap = context.config.typesMap
 
-    fun createClassRemapper(visitor: ClassVisitor): CustomClassRemapper {
-        return CustomClassRemapper(visitor, CustomRemapper(this))
+    fun createClassRemapper(visitor: ClassVisitor): ClassRemapper {
+        return ClassRemapper(visitor, CustomRemapper(this))
     }
 
     override fun rewriteType(type: JavaType): JavaType {
@@ -56,22 +56,6 @@
         return type
     }
 
-    override fun rewriteField(field: JavaField): JavaField {
-        if (!context.isEligibleForRewrite(field.owner)) {
-            return field
-        }
-
-        val result = typesMap.fields[field]
-        if (result != null) {
-            Log.i(TAG, "  map: %s -> %s", field, result)
-            return result
-        }
-
-        context.reportNoMappingFoundFailure()
-        Log.e(TAG, "No mapping for: " + field)
-        return field
-    }
-
     override fun rewriteString(value: String): String {
         val type = JavaType.fromDotVersion(value)
         if (!context.isEligibleForRewrite(type)) {
@@ -87,5 +71,25 @@
         // We do not treat string content mismatches as errors
         return value
     }
-}
 
+    fun rewritePath(path: Path): Path {
+        if (!context.rewritingSupportLib) {
+            return path
+        }
+
+        val owner = path.toFile().path.replace('\\', '/').removeSuffix(".class")
+        val type = JavaType(owner)
+        if (!context.isEligibleForRewrite(type)) {
+            return path
+        }
+
+        val result = rewriteType(type)
+        if (result != type) {
+            return path.fileSystem.getPath(result.fullName + ".class")
+        }
+
+        context.reportNoMappingFoundFailure()
+        Log.e(TAG, "No mapping for: " + type)
+        return path
+    }
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/asm/CustomClassRemapper.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/asm/CustomClassRemapper.kt
deleted file mode 100644
index 692e65d..0000000
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/asm/CustomClassRemapper.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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 android.support.tools.jetifier.core.transform.bytecode.asm
-
-import org.objectweb.asm.ClassVisitor
-import org.objectweb.asm.FieldVisitor
-import org.objectweb.asm.MethodVisitor
-import org.objectweb.asm.Opcodes
-import org.objectweb.asm.commons.ClassRemapper
-
-/**
- * Currently only adds field context awareness into [ClassRemapper] and substitutes the default
- * method remapper with [CustomMethodRemapper]
- */
-class CustomClassRemapper(cv: ClassVisitor, private val customRemapper: CustomRemapper)
-    : ClassRemapper(Opcodes.ASM5, cv, customRemapper) {
-
-    override fun visitField(access: Int,
-                            name: String,
-                            desc: String?,
-                            signature: String?,
-                            value: Any?) : FieldVisitor? {
-        cv ?: return null
-
-        val field = customRemapper.mapField(className, name)
-        val fieldVisitor = cv.visitField(
-                access,
-                field.name,
-                remapper.mapDesc(desc),
-                remapper.mapSignature(signature, true),
-                remapper.mapValue(value))
-
-        fieldVisitor ?: return null
-
-        return createFieldRemapper(fieldVisitor)
-    }
-
-    override fun createMethodRemapper(mv: MethodVisitor) : MethodVisitor {
-        return CustomMethodRemapper(mv, customRemapper)
-    }
-}
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/asm/CustomMethodRemapper.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/asm/CustomMethodRemapper.kt
deleted file mode 100644
index cc60cbf..0000000
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/asm/CustomMethodRemapper.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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 android.support.tools.jetifier.core.transform.bytecode.asm
-
-import org.objectweb.asm.MethodVisitor
-import org.objectweb.asm.Opcodes
-import org.objectweb.asm.commons.MethodRemapper
-
-/**
- * Currently only adds field context awareness into [MethodRemapper]
- */
-internal class CustomMethodRemapper(mv:MethodVisitor,
-                                    private val customRemapper: CustomRemapper)
-    : MethodRemapper(Opcodes.ASM5, mv, customRemapper) {
-
-    override fun visitFieldInsn(opcode: Int, owner: String, name: String, desc: String?) {
-        mv ?: return
-
-        val field = customRemapper.mapField(owner, name)
-        mv.visitFieldInsn(opcode, field.owner.fullName, field.name, remapper.mapDesc(desc))
-    }
-}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/asm/CustomRemapper.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/asm/CustomRemapper.kt
index aba4725..a54e8bd 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/asm/CustomRemapper.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/asm/CustomRemapper.kt
@@ -16,13 +16,12 @@
 
 package android.support.tools.jetifier.core.transform.bytecode.asm
 
-import android.support.tools.jetifier.core.rules.JavaField
 import android.support.tools.jetifier.core.rules.JavaType
 import android.support.tools.jetifier.core.transform.bytecode.CoreRemapper
 import org.objectweb.asm.commons.Remapper
 
 /**
- * Extends [Remapper] with a capability to rewrite field names together with their owner.
+ * Extends [Remapper] to allow further customizations.
  */
 class CustomRemapper(private val remapper: CoreRemapper) : Remapper() {
 
@@ -38,12 +37,4 @@
 
         return remapper.rewriteString(stringMaybe)
     }
-
-    fun mapField(ownerName: String, fieldName: String): JavaField {
-        return remapper.rewriteField(JavaField(ownerName, fieldName))
-    }
-
-    override fun mapFieldName(owner: String?, name: String, desc: String?): String {
-        throw RuntimeException("This should not be called")
-    }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformer.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformer.kt
new file mode 100644
index 0000000..3220dae
--- /dev/null
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformer.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 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 android.support.tools.jetifier.core.transform.metainf
+
+import android.support.tools.jetifier.core.archive.ArchiveFile
+import android.support.tools.jetifier.core.transform.TransformationContext
+import android.support.tools.jetifier.core.transform.Transformer
+import java.nio.charset.StandardCharsets
+
+/**
+ * Transformer for META-INF/(.*).version files.
+ *
+ * Replaces version files from the META-INF directory. This should be used only for processing
+ * of the support library itself.
+ */
+class MetaInfTransformer internal constructor(
+    private val context: TransformationContext
+) : Transformer {
+
+    companion object {
+        const val FROM_VERSION = "28.0.0-SNAPSHOT"
+
+        const val TO_VERSION = "1.0.0-SNAPSHOT"
+
+        const val META_INF_DIR = "meta-inf"
+
+        const val VERSION_FILE_SUFFIX = ".version"
+    }
+
+    override fun canTransform(file: ArchiveFile): Boolean {
+        return context.rewritingSupportLib
+            && file.relativePath.toString().contains(META_INF_DIR, ignoreCase = true)
+            && file.fileName.endsWith(VERSION_FILE_SUFFIX, ignoreCase = true)
+    }
+
+    override fun runTransform(file: ArchiveFile) {
+        val sb = StringBuilder(file.data.toString(StandardCharsets.UTF_8))
+
+        var from = FROM_VERSION
+        var to = TO_VERSION
+        if (context.isInReversedMode) {
+            from = TO_VERSION
+            to = FROM_VERSION
+        }
+
+        if (sb.toString() != from) {
+            return
+        }
+
+        file.data = to.toByteArray()
+    }
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTypesMap.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTypesMap.kt
index 03d6282..f232a35 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTypesMap.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTypesMap.kt
@@ -16,28 +16,56 @@
 
 package android.support.tools.jetifier.core.transform.proguard
 
+import android.support.tools.jetifier.core.utils.Log
+
 /**
  * Contains custom mappings to map support library types referenced in ProGuard to new ones.
  */
 data class ProGuardTypesMap(val rules: Map<ProGuardType, ProGuardType>) {
 
     companion object {
+        const val TAG = "ProGuardTypesMap"
+
         val EMPTY = ProGuardTypesMap(emptyMap())
     }
 
     /** Returns JSON data model of this class */
-    fun toJson() : JsonData {
+    fun toJson(): JsonData {
         return JsonData(rules.map { it.key.value to it.value.value }.toMap())
     }
 
     /**
      * JSON data model for [ProGuardTypesMap].
      */
-    data class JsonData(val rules: Map<String, String>)  {
+    data class JsonData(val rules: Map<String, String>) {
 
         /** Creates instance of [ProGuardTypesMap] */
-        fun toMappings() : ProGuardTypesMap {
-            return ProGuardTypesMap(rules.map { ProGuardType(it.key) to ProGuardType(it.value) }.toMap())
+        fun toMappings(): ProGuardTypesMap {
+            return ProGuardTypesMap(
+                rules.map { ProGuardType(it.key) to ProGuardType(it.value) }.toMap())
         }
     }
+
+    /**
+     * Creates reversed version of this map (values become keys). Throws exception if the map does
+     * not satisfy that.
+     */
+    fun reverseMapOrDie(): ProGuardTypesMap {
+        val reversed = mutableMapOf<ProGuardType, ProGuardType>()
+        for ((from, to) in rules) {
+            val conflictFrom = reversed[to]
+            if (conflictFrom != null) {
+                Log.e(TAG, "Conflict: %s -> (%s, %s)", to, from, conflictFrom)
+                continue
+            }
+            reversed[to] = from
+        }
+
+        if (rules.size != reversed.size || rules.size != reversed.size) {
+            throw IllegalArgumentException("Types map is not reversible as conflicts were found! " +
+                "See the log for more details.")
+        }
+
+        return ProGuardTypesMap(reversed)
+    }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/patterns/ReplacersRunner.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/patterns/ReplacersRunner.kt
index 54501f9..bd2fc12 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/patterns/ReplacersRunner.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/patterns/ReplacersRunner.kt
@@ -27,7 +27,7 @@
      * The replacers have to be distinct as this method can't guarantee that output of one replacer
      * won't be matched by another replacer.
      */
-    fun applyReplacers(input : String) : String {
+    fun applyReplacers(input: String): String {
         val sb = StringBuilder()
         var lastSeenChar = 0
         var processedInput = input
@@ -37,7 +37,7 @@
 
             while (matcher.find()) {
                 if (lastSeenChar < matcher.start()) {
-                    sb.append(input, lastSeenChar, matcher.start())
+                    sb.append(processedInput, lastSeenChar, matcher.start())
                 }
 
                 val result = replacer.runReplacements(matcher)
@@ -57,8 +57,6 @@
             processedInput = sb.toString()
             sb.setLength(0)
         }
-
         return processedInput
     }
-
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformer.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformer.kt
index 0a29828..4f81c71 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformer.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformer.kt
@@ -18,7 +18,8 @@
 
 import android.support.tools.jetifier.core.archive.ArchiveFile
 import android.support.tools.jetifier.core.map.TypesMap
-import android.support.tools.jetifier.core.rules.JavaTypeXmlRef
+import android.support.tools.jetifier.core.rules.JavaType
+import android.support.tools.jetifier.core.rules.PackageName
 import android.support.tools.jetifier.core.transform.TransformationContext
 import android.support.tools.jetifier.core.transform.Transformer
 import android.support.tools.jetifier.core.utils.Log
@@ -40,10 +41,13 @@
         const val TAG = "XmlResourcesTransformer"
 
         const val PATTERN_TYPE_GROUP = 1
+
+        const val MANIFEST_FILE_NAME = "AndroidManifest.xml"
     }
 
     /**
-     * List of regular expression patterns used to find support library references in XML files.
+     * List of regular expression patterns used to find support library types references in XML
+     * files.
      *
      * Matches xml tags in form of:
      * 1. '<(/)prefix(SOMETHING)'.
@@ -57,42 +61,39 @@
         Pattern.compile("<view[^>]*class=\"([a-zA-Z0-9.\$_]+)\"[^>]*>")
     )
 
+    /**
+     * List of regular expression patterns used to find support library package references in
+     * manifest files.
+     *
+     * Matches xml tag in form of:
+     * 1. <manifest package="package.name" ...>
+     */
+    private val packagePatterns = listOf(
+        Pattern.compile("<manifest[^>]*package=\"([a-zA-Z0-9._]+)\"[^>]*>")
+    )
+
     private val typesMap = context.config.typesMap
 
     override fun canTransform(file: ArchiveFile) = file.isXmlFile() && !file.isPomFile()
 
     override fun runTransform(file: ArchiveFile) {
-        file.data = transform(file.data)
-    }
+        val isManifestFile = file.fileName.equals(MANIFEST_FILE_NAME, ignoreCase = true)
+        val charset = getCharset(file.data)
+        val sb = StringBuilder(file.data.toString(charset))
 
-    fun transform(data: ByteArray) : ByteArray {
-        var changesDone = false
+        var changesDone = replaceWithPatterns(sb, patterns, { rewriteType(it) })
 
-        val charset = getCharset(data)
-        val sb = StringBuilder(data.toString(charset))
-        for (pattern in patterns) {
-            var matcher = pattern.matcher(sb)
-            while (matcher.find()) {
-                val typeToReplace = JavaTypeXmlRef(matcher.group(PATTERN_TYPE_GROUP))
-                val result = rewriteType(typeToReplace)
-                if (result == typeToReplace) {
-                    continue
-                }
-                sb.replace(matcher.start(PATTERN_TYPE_GROUP), matcher.end(PATTERN_TYPE_GROUP),
-                    result.fullName)
-                changesDone = true
-                matcher = pattern.matcher(sb)
-            }
+        if (isManifestFile && context.rewritingSupportLib) {
+            changesDone = replaceWithPatterns(sb, packagePatterns,
+                { rewritePackage(it, context.libraryName) }) || changesDone
         }
 
         if (changesDone) {
-            return sb.toString().toByteArray(charset)
+            file.data = sb.toString().toByteArray(charset)
         }
-
-        return data
     }
 
-    fun getCharset(data: ByteArray) : Charset {
+    fun getCharset(data: ByteArray): Charset {
         data.inputStream().use {
             val xmlReader = XMLInputFactory.newInstance().createXMLStreamReader(it)
 
@@ -107,20 +108,78 @@
         }
     }
 
-    fun rewriteType(type: JavaTypeXmlRef): JavaTypeXmlRef {
-        val javaType = type.toJavaType()
-        if (!context.isEligibleForRewrite(javaType)) {
-            return type
+    /**
+     * For each pattern in [patterns] matching a portion of the string represented by [sb], applies
+     * [mappingFunction] to the match and puts the result back into [sb].
+     */
+    private fun replaceWithPatterns(
+        sb: StringBuilder,
+        patterns: List<Pattern>,
+        mappingFunction: (String) -> String
+    ): Boolean {
+        var changesDone = false
+
+        for (pattern in patterns) {
+            var lastSeenChar = 0
+            val processedInput = sb.toString()
+            sb.setLength(0)
+            val matcher = pattern.matcher(processedInput)
+
+            while (matcher.find()) {
+                if (lastSeenChar < matcher.start()) {
+                    sb.append(processedInput, lastSeenChar, matcher.start())
+                }
+
+                val toReplace = matcher.group(PATTERN_TYPE_GROUP)
+                val matched = matcher.group(0)
+                val replacement = mappingFunction(toReplace)
+                changesDone = changesDone || replacement != toReplace
+
+                val localStart = matcher.start(PATTERN_TYPE_GROUP) - matcher.start()
+                val localEnd = matcher.end(PATTERN_TYPE_GROUP) - matcher.start()
+
+                val result = matched.replaceRange(
+                    startIndex = localStart,
+                    endIndex = localEnd,
+                    replacement = replacement)
+
+                sb.append(result)
+                lastSeenChar = matcher.end()
+            }
+
+            if (lastSeenChar <= processedInput.length - 1) {
+                sb.append(processedInput, lastSeenChar, processedInput.length)
+            }
         }
 
-        val result = typesMap.types[javaType]
+        return changesDone
+    }
+
+    private fun rewriteType(typeName: String): String {
+        val type = JavaType.fromDotVersion(typeName)
+        if (!context.isEligibleForRewrite(type)) {
+            return typeName
+        }
+
+        val result = typesMap.types[type]
         if (result != null) {
             Log.i(TAG, "  map: %s -> %s", type, result)
-            return JavaTypeXmlRef(result)
+            return result.toDotNotation()
         }
 
         context.reportNoMappingFoundFailure()
         Log.e(TAG, "No mapping for: " + type)
-        return type
+        return typeName
+    }
+
+    private fun rewritePackage(packageName: String, archiveName: String): String {
+        val pckg = PackageName.fromDotVersion(packageName)
+        val result = context.config.packageMap.getPackageFor(pckg, archiveName)
+        if (result != null) {
+            return result.toDotNotation()
+        }
+        context.reportNoPackageMappingFoundFailure()
+        Log.e(TAG, "No mapping for package: '$pckg' in artifact: '$archiveName'")
+        return packageName
     }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/utils/Log.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/utils/Log.kt
index 902dea4..b1bb0af 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/utils/Log.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/utils/Log.kt
@@ -18,17 +18,17 @@
 
 object Log {
 
-    var currentLevel : LogLevel = LogLevel.INFO
+    var currentLevel: LogLevel = LogLevel.INFO
 
-    var logConsumer : LogConsumer = StdOutLogConsumer()
+    var logConsumer: LogConsumer = StdOutLogConsumer()
 
     fun setLevel(level: String?) {
         currentLevel = when (level) {
+            "error" -> LogLevel.ERROR
             "debug" -> LogLevel.DEBUG
             "verbose" -> LogLevel.VERBOSE
             else -> LogLevel.INFO
         }
-
     }
 
     fun e(tag: String, message: String, vararg args: Any?) {
@@ -54,5 +54,4 @@
             logConsumer.verbose("[$tag] $message".format(*args))
         }
     }
-
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/resources/default.config b/jetifier/jetifier/core/src/main/resources/default.config
index a64d7eb..54d561c 100644
--- a/jetifier/jetifier/core/src/main/resources/default.config
+++ b/jetifier/jetifier/core/src/main/resources/default.config
@@ -15,93 +15,206 @@
 {
     # Skip packages that don't match the following regex
     restrictToPackagePrefixes: [
-        "android/support/"
+        "android/support/",
+        "android/arch"
     ],
     rules: [
         # Ignore
         {
             from: "(.*)BuildConfig",
-            to: "ignore"
-        },
-        {
-            from: "android/support/v7/preference/R(.*)",
-            to: "ignore"
+            to: "ignoreInPreprocessorOnly"
         },
         {
             from: "(.*)/package-info",
+            to: "ignoreInPreprocessorOnly"
+        },
+        {
+            from: "android/support/test/(.*)",
             to: "ignore"
         },
 
         # Legacy
         {
-            from: "android/support/v13/app/FragmentTabHost(.*)",
-            to: "androidx/app/legacy/FragmentTabHost{0}"
+            from: "android/support/v4/app/ActionBarDrawerToggle(.*)",
+            to: "androidx/legacy/app/ActionBarDrawerToggle{0}"
+        },
+        {
+            from: "android/support/v13/view/ViewCompat(.*)",
+            to: "androidx/legacy/view/ViewCompat{0}"
+        },
+        {
+            from: "android/support/v13/app/ActivityCompat(.*)",
+            to: "androidx/legacy/app/ActivityCompat{0}"
+        },
+        {
+            from: "android/support/v13/app/FragmentCompat(.*)",
+            to: "androidx/legacy/app/FragmentCompat{0}"
         },
         {
             from: "android/support/v13/app/FragmentPagerAdapter(.*)",
-            to: "androidx/app/legacy/FragmentPagerAdapter{0}"
+            to: "androidx/legacy/app/FragmentPagerAdapter{0}"
         },
         {
             from: "android/support/v13/app/FragmentStatePagerAdapter(.*)",
-            to: "androidx/app/legacy/FragmentStatePagerAdapter{0}"
+            to: "androidx/legacy/app/FragmentStatePagerAdapter{0}"
         },
         {
-            from: "android/support/v4/app/ActionBarDrawerToggle(.*)",
-            to: "androidx/app/legacy/ActionBarDrawerToggle{0}"
-        },
-        {
-            from: "android/support/v4/app/ActivityCompat(.*)",
-            to: "androidx/app/legacy/ActivityCompat{0}"
-        },
-        {
-            from: "android/support/v4/view/ViewCompat(.*)",
-            to: "androidx/view/legacy/ViewCompat{0}"
+            from: "android/support/v13/app/FragmentTabHost(.*)",
+            to: "androidx/legacy/app/FragmentTabHost{0}"
         },
 
-        # Internal
+        # Re-map Recycler view
         {
-            from: "android/support/v4/graphics/drawable/DrawableWrapper",
-            to: "androidx/graphics/drawable/internal/DrawableWrapper"
+            from: "android/support/v7/widget/AdapterHelper(.*)",
+            to: "androidx/widget/recyclerview/AdapterHelper{0}"
         },
         {
-            from: "android/support/v7/widget/ListViewCompat(.*)",
-            to: "androidx/widget/internal/ListViewCompat{0}"
+            from: "android/support/v7/widget/ChildHelper(.*)",
+            to: "androidx/widget/recyclerview/ChildHelper{0}"
+        },
+        {
+            from: "android/support/v7/widget/DefaultItemAnimator(.*)",
+            to: "androidx/widget/recyclerview/DefaultItemAnimator{0}"
+        },
+        {
+            from: "android/support/v7/widget/DividerItemDecoration(.*)",
+            to: "androidx/widget/recyclerview/DividerItemDecoration{0}"
+        },
+        {
+            from: "android/support/v7/widget/FastScroller(.*)",
+            to: "androidx/widget/recyclerview/FastScroller{0}"
+        },
+        {
+            from: "android/support/v7/widget/GapWorker(.*)",
+            to: "androidx/widget/recyclerview/GapWorker{0}"
+        },
+        {
+            from: "android/support/v7/widget/GridLayoutManager(.*)",
+            to: "androidx/widget/recyclerview/GridLayoutManager{0}"
+        },
+        {
+            from: "android/support/v7/widget/LayoutState(.*)",
+            to: "androidx/widget/recyclerview/LayoutState{0}"
+        },
+        {
+            from: "android/support/v7/widget/LinearLayoutManager(.*)",
+            to: "androidx/widget/recyclerview/LinearLayoutManager{0}"
+        },
+        {
+            from: "android/support/v7/widget/LinearSmoothScroller(.*)",
+            to: "androidx/widget/recyclerview/LinearSmoothScroller{0}"
+        },
+        {
+            from: "android/support/v7/widget/LinearSnapHelper(.*)",
+            to: "androidx/widget/recyclerview/LinearSnapHelper{0}"
+        },
+        {
+            from: "android/support/v7/widget/OpReorderer(.*)",
+            to: "androidx/widget/recyclerview/OpReorderer{0}"
+        },
+        {
+            from: "android/support/v7/widget/OrientationHelper(.*)",
+            to: "androidx/widget/recyclerview/OrientationHelper{0}"
+        },
+        {
+            from: "android/support/v7/widget/PagerSnapHelper(.*)",
+            to: "androidx/widget/recyclerview/PagerSnapHelper{0}"
+        },
+        {
+            from: "android/support/v7/widget/PositionMap(.*)",
+            to: "androidx/widget/recyclerview/PositionMap{0}"
+        },
+        {
+            from: "android/support/v7/widget/RecyclerViewAccessibilityDelegate(.*)",
+            to: "androidx/widget/recyclerview/RecyclerViewAccessibilityDelegate{0}"
+        },
+        {
+            from: "android/support/v7/widget/RecyclerView(.*)",
+            to: "androidx/widget/recyclerview/RecyclerView{0}"
+        },
+        {
+            from: "android/support/v7/widget/ScrollbarHelper(.*)",
+            to: "androidx/widget/recyclerview/ScrollbarHelper{0}"
+        },
+        {
+            from: "android/support/v7/widget/SimpleItemAnimator(.*)",
+            to: "androidx/widget/recyclerview/SimpleItemAnimator{0}"
+        },
+        {
+            from: "android/support/v7/widget/SnapHelper(.*)",
+            to: "androidx/widget/recyclerview/SnapHelper{0}"
+        },
+        {
+            from: "android/support/v7/widget/StaggeredGridLayoutManager(.*)",
+            to: "androidx/widget/recyclerview/StaggeredGridLayoutManager{0}"
+        },
+        {
+            from: "android/support/v7/widget/ViewBoundsCheck(.*)",
+            to: "androidx/widget/recyclerview/ViewBoundsCheck{0}"
+        },
+        {
+            from: "android/support/v7/widget/ViewInfoStore(.*)",
+            to: "androidx/widget/recyclerview/ViewInfoStore{0}"
+        },
+        {
+            from: "android/support/v7/widget/helper/(.*)",
+            to: "androidx/widget/recyclerview/{0}"
+        },
+        {
+            from: "android/support/v7/widget/util/SortedListAdapterCallback",
+            to: "androidx/widget/recyclerview/SortedListAdapterCallback"
+        },
+        {
+            from: "android/support/v7/recyclerview/extensions/(.*)",
+            to: "androidx/widget/recyclerview/{0}"
+        },
+        {
+            from: "android/support/v7/util/(.*)",
+            to: "androidx/widget/recyclerview/{0}"
         },
 
         # Re-map
         {
-            from: "android/support/design/widget/CoordinatorLayout",
-            to: "androidx/widget/CoordinatorLayout"
+            from: "android/support/design/widget/CoordinatorLayout(.*)",
+            to: "androidx/widget/CoordinatorLayout{0}"
         },
         {
-            from: "android/support/design/widget/DirectedAcyclicGraph",
-            to: "androidx/widget/DirectedAcyclicGraph"
+            from: "android/support/design/widget/DirectedAcyclicGraph(.*)",
+            to: "androidx/widget/DirectedAcyclicGraph{0}"
         },
         {
-            from: "android/support/design/widget/ViewGroupUtils",
-            to: "androidx/widget/ViewGroupUtils"
+            from: "android/support/design/widget/ViewGroupUtils(.*)",
+            to: "androidx/widget/ViewGroupUtils{0}"
         },
         {
-            from: "android/support/v4/view/ViewPager",
-            to: "androidx/widget/ViewPager"
+            from: "android/support/constraint/(.*)",
+            to: "androidx/widget/constraint/{0}"
         },
         {
-            from: "android/support/v4/view/PagerAdapter",
-            to: "androidx/widget/PagerAdapter"
+            from: "android/support/v4/view/ViewPager(.*)",
+            to: "androidx/widget/ViewPager{0}"
         },
         {
-            from: "android/support/v4/view/PagerTabStrip",
-            to: "androidx/widget/PagerTabStrip"
+            from: "android/support/v4/view/PagerAdapter(.*)",
+            to: "androidx/widget/PagerAdapter{0}"
         },
         {
-            from: "android/support/v4/view/PagerTitleStrip",
-            to: "androidx/widget/PagerTitleStrip"
+            from: "android/support/v4/view/PagerTabStrip(.*)",
+            to: "androidx/widget/PagerTabStrip{0}"
+        },
+        {
+            from: "android/support/v4/view/PagerTitleStrip(.*)",
+            to: "androidx/widget/PagerTitleStrip{0}"
         },
         {
             from: "android/support/v17/preference/(.*)",
             to: "androidx/leanback/preference/{0}"
         },
         {
+            from: "android/support/v17/internal/widget/OutlineOnlyWithChildrenFrameLayout(.*)",
+            to: "androidx/leanback/preference/internal/OutlineOnlyWithChildrenFrameLayout{0}"
+        },
+        {
             from: "android/support/customtabs/(.*)",
             to: "androidx/browser/customtabs/{0}"
         },
@@ -110,22 +223,30 @@
             to: "androidx/{0}"
         },
         {
-            from: "android/support/v7/graphics/ColorCutQuantizer",
-            to: "androidx/graphics/palette/ColorCutQuantizer"
+            from: "android/support/v7/graphics/ColorCutQuantizer(.*)",
+            to: "androidx/graphics/palette/ColorCutQuantizer{0}"
         },
         {
-            from: "android/support/v7/graphics/Palette",
-            to: "androidx/graphics/palette/Palette"
+            from: "android/support/v7/graphics/Palette(.*)",
+            to: "androidx/graphics/palette/Palette{0}"
         },
         {
-            from: "android/support/v7/graphics/Target",
-            to: "androidx/graphics/palette/Target"
+            from: "android/support/v7/graphics/Target(.*)",
+            to: "androidx/graphics/palette/Target{0}"
+        },
+        {
+            from: "android/support/v7/internal/widget/PreferenceImageView(.*)",
+            to: "androidx/preference/internal/PreferenceImageView{0}"
         },
         {
             from: "android/support/v7/(.*)",
             to: "androidx/{0}"
         },
         {
+            from: "android/support/v8/(.*)",
+            to: "androidx/{0}"
+        },
+        {
             from: "android/support/v13/(.*)",
             to: "androidx/{0}"
         },
@@ -138,8 +259,12 @@
             to: "androidx/{0}"
         },
         {
+            from: "android/support/content/(.*)",
+            to: "androidx/util/contentpaging/{0}"
+        },
+        {
             from: "android/support/percent/(.*)",
-            to: "androidx/{0}"
+            to: "androidx/widget/{0}"
         },
         {
             from: "android/support/(.*)",
@@ -148,6 +273,33 @@
         {
             from: "android/arch/(.*)",
             to: "androidx/{0}"
+        },
+        {
+            from: "android/databinding/(.*)",
+            to: "androidx/databinding/{0}"
+        }
+    ],
+    slRules: [
+        # Ignore
+        {
+            from: "(.*)/package-info",
+            to: "ignore"
+        },
+        {
+            from: "androidx/text/emoji/flatbuffer/(.*)",
+            to: "ignore"
+        },
+        {
+            from: "androidx/textclassifier/(.*)",
+            to: "ignore"
+        },
+        {
+            from: "androidx/widget/recyclerview/selection/(.*)",
+            to: "ignore"
+        },
+        {
+            from: "androidx/browser/browseractions/(.*)",
+            to: "ignore"
         }
     ],
     pomRules: [
@@ -286,6 +438,10 @@
             from: { groupId: "com.android.support", artifactId: "support-vector-drawable", version: "27.0.1" },
             to: [{ groupId: "com.androidx", artifactId: "vector-drawable", version: "28.0.0" }]
         },
+	{
+	    from: { groupId: "com.android.support", artifactId: "textclassifier", version: "28.0.0" },
+	    to: [{ groupId: "com.androidx.view.textclassifier", artifactId: "textclassifier", version: "28.0.0" }]
+	},
         {
             from: { groupId: "com.android.support", artifactId: "transition", version: "27.0.1" },
             to: [{ groupId: "com.androidx", artifactId: "transition", version: "28.0.0" }]
@@ -298,5 +454,20 @@
             from: { groupId: "com.android.support", artifactId: "wearable", version: "26.0.0-alpha1" },
             to: [{ groupId: "com.androidx", artifactId: "wearable", version: "28.0.0" }]
         }
-    ]
-}
\ No newline at end of file
+    ],
+    map: {
+        # Types added in 28.0.0 (missing in 27.1.0)
+        types: {
+            "android/support/v4/app/NotificationCompat$Action$SemanticAction": "androidx/app/NotificationCompat$Action$SemanticAction",
+            "android/support/v4/graphics/TypefaceCompatApi28Impl": "androidx/graphics/TypefaceCompatApi28Impl",
+            "android/support/v7/util/AdapterListUpdateCallback": "androidx/widget/recyclerview/AdapterListUpdateCallback",
+            "android/support/v7/recyclerview/extensions/ListAdapterConfig$Builder$MainThreadExecutor": "androidx/widget/recyclerview/ListAdapterConfig$Builder$MainThreadExecutor"
+        }
+    },
+    proGuardMap: {
+        rules: {
+            "android/support/transition/ChangeBounds$*": "androidx/transition/ChangeBounds$*",
+            "android/support/graphics/drawable/VectorDrawableCompat$*": "androidx/graphics/drawable/VectorDrawableCompat$*"
+        }
+    }
+}
diff --git a/jetifier/jetifier/core/src/main/resources/default.generated.config b/jetifier/jetifier/core/src/main/resources/default.generated.config
index d74d4c7..6e447a5 100644
--- a/jetifier/jetifier/core/src/main/resources/default.generated.config
+++ b/jetifier/jetifier/core/src/main/resources/default.generated.config
@@ -1,4 +1,4 @@
-# Copyright (C) 2017 The Android Open Source Project
+# Copyright (C) 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.
@@ -18,163 +18,283 @@
 
 {
   "restrictToPackagePrefixes": [
-    "android/support/"
+    "android/support/",
+    "android/arch"
   ],
   "rules": [
     {
       "from": "(.*)BuildConfig",
-      "to": "ignore",
-      "fieldSelectors": []
-    },
-    {
-      "from": "android/support/v7/preference/R(.*)",
-      "to": "ignore",
-      "fieldSelectors": []
+      "to": "ignoreInPreprocessorOnly"
     },
     {
       "from": "(.*)/package-info",
-      "to": "ignore",
-      "fieldSelectors": []
+      "to": "ignoreInPreprocessorOnly"
     },
     {
-      "from": "android/support/v13/app/FragmentTabHost(.*)",
-      "to": "androidx/app/legacy/FragmentTabHost{0}",
-      "fieldSelectors": []
-    },
-    {
-      "from": "android/support/v13/app/FragmentPagerAdapter(.*)",
-      "to": "androidx/app/legacy/FragmentPagerAdapter{0}",
-      "fieldSelectors": []
-    },
-    {
-      "from": "android/support/v13/app/FragmentStatePagerAdapter(.*)",
-      "to": "androidx/app/legacy/FragmentStatePagerAdapter{0}",
-      "fieldSelectors": []
+      "from": "android/support/test/(.*)",
+      "to": "ignore"
     },
     {
       "from": "android/support/v4/app/ActionBarDrawerToggle(.*)",
-      "to": "androidx/app/legacy/ActionBarDrawerToggle{0}",
-      "fieldSelectors": []
+      "to": "androidx/legacy/app/ActionBarDrawerToggle{0}"
     },
     {
-      "from": "android/support/v4/app/ActivityCompat(.*)",
-      "to": "androidx/app/legacy/ActivityCompat{0}",
-      "fieldSelectors": []
+      "from": "android/support/v13/view/ViewCompat(.*)",
+      "to": "androidx/legacy/view/ViewCompat{0}"
     },
     {
-      "from": "android/support/v4/view/ViewCompat(.*)",
-      "to": "androidx/view/legacy/ViewCompat{0}",
-      "fieldSelectors": []
+      "from": "android/support/v13/app/ActivityCompat(.*)",
+      "to": "androidx/legacy/app/ActivityCompat{0}"
     },
     {
-      "from": "android/support/v4/graphics/drawable/DrawableWrapper",
-      "to": "androidx/graphics/drawable/internal/DrawableWrapper",
-      "fieldSelectors": []
+      "from": "android/support/v13/app/FragmentCompat(.*)",
+      "to": "androidx/legacy/app/FragmentCompat{0}"
     },
     {
-      "from": "android/support/v7/widget/ListViewCompat(.*)",
-      "to": "androidx/widget/internal/ListViewCompat{0}",
-      "fieldSelectors": []
+      "from": "android/support/v13/app/FragmentPagerAdapter(.*)",
+      "to": "androidx/legacy/app/FragmentPagerAdapter{0}"
     },
     {
-      "from": "android/support/design/widget/CoordinatorLayout",
-      "to": "androidx/widget/CoordinatorLayout",
-      "fieldSelectors": []
+      "from": "android/support/v13/app/FragmentStatePagerAdapter(.*)",
+      "to": "androidx/legacy/app/FragmentStatePagerAdapter{0}"
     },
     {
-      "from": "android/support/design/widget/DirectedAcyclicGraph",
-      "to": "androidx/widget/DirectedAcyclicGraph",
-      "fieldSelectors": []
+      "from": "android/support/v13/app/FragmentTabHost(.*)",
+      "to": "androidx/legacy/app/FragmentTabHost{0}"
     },
     {
-      "from": "android/support/design/widget/ViewGroupUtils",
-      "to": "androidx/widget/ViewGroupUtils",
-      "fieldSelectors": []
+      "from": "android/support/v7/widget/AdapterHelper(.*)",
+      "to": "androidx/widget/recyclerview/AdapterHelper{0}"
     },
     {
-      "from": "android/support/v4/view/ViewPager",
-      "to": "androidx/widget/ViewPager",
-      "fieldSelectors": []
+      "from": "android/support/v7/widget/ChildHelper(.*)",
+      "to": "androidx/widget/recyclerview/ChildHelper{0}"
     },
     {
-      "from": "android/support/v4/view/PagerAdapter",
-      "to": "androidx/widget/PagerAdapter",
-      "fieldSelectors": []
+      "from": "android/support/v7/widget/DefaultItemAnimator(.*)",
+      "to": "androidx/widget/recyclerview/DefaultItemAnimator{0}"
     },
     {
-      "from": "android/support/v4/view/PagerTabStrip",
-      "to": "androidx/widget/PagerTabStrip",
-      "fieldSelectors": []
+      "from": "android/support/v7/widget/DividerItemDecoration(.*)",
+      "to": "androidx/widget/recyclerview/DividerItemDecoration{0}"
     },
     {
-      "from": "android/support/v4/view/PagerTitleStrip",
-      "to": "androidx/widget/PagerTitleStrip",
-      "fieldSelectors": []
+      "from": "android/support/v7/widget/FastScroller(.*)",
+      "to": "androidx/widget/recyclerview/FastScroller{0}"
+    },
+    {
+      "from": "android/support/v7/widget/GapWorker(.*)",
+      "to": "androidx/widget/recyclerview/GapWorker{0}"
+    },
+    {
+      "from": "android/support/v7/widget/GridLayoutManager(.*)",
+      "to": "androidx/widget/recyclerview/GridLayoutManager{0}"
+    },
+    {
+      "from": "android/support/v7/widget/LayoutState(.*)",
+      "to": "androidx/widget/recyclerview/LayoutState{0}"
+    },
+    {
+      "from": "android/support/v7/widget/LinearLayoutManager(.*)",
+      "to": "androidx/widget/recyclerview/LinearLayoutManager{0}"
+    },
+    {
+      "from": "android/support/v7/widget/LinearSmoothScroller(.*)",
+      "to": "androidx/widget/recyclerview/LinearSmoothScroller{0}"
+    },
+    {
+      "from": "android/support/v7/widget/LinearSnapHelper(.*)",
+      "to": "androidx/widget/recyclerview/LinearSnapHelper{0}"
+    },
+    {
+      "from": "android/support/v7/widget/OpReorderer(.*)",
+      "to": "androidx/widget/recyclerview/OpReorderer{0}"
+    },
+    {
+      "from": "android/support/v7/widget/OrientationHelper(.*)",
+      "to": "androidx/widget/recyclerview/OrientationHelper{0}"
+    },
+    {
+      "from": "android/support/v7/widget/PagerSnapHelper(.*)",
+      "to": "androidx/widget/recyclerview/PagerSnapHelper{0}"
+    },
+    {
+      "from": "android/support/v7/widget/PositionMap(.*)",
+      "to": "androidx/widget/recyclerview/PositionMap{0}"
+    },
+    {
+      "from": "android/support/v7/widget/RecyclerViewAccessibilityDelegate(.*)",
+      "to": "androidx/widget/recyclerview/RecyclerViewAccessibilityDelegate{0}"
+    },
+    {
+      "from": "android/support/v7/widget/RecyclerView(.*)",
+      "to": "androidx/widget/recyclerview/RecyclerView{0}"
+    },
+    {
+      "from": "android/support/v7/widget/ScrollbarHelper(.*)",
+      "to": "androidx/widget/recyclerview/ScrollbarHelper{0}"
+    },
+    {
+      "from": "android/support/v7/widget/SimpleItemAnimator(.*)",
+      "to": "androidx/widget/recyclerview/SimpleItemAnimator{0}"
+    },
+    {
+      "from": "android/support/v7/widget/SnapHelper(.*)",
+      "to": "androidx/widget/recyclerview/SnapHelper{0}"
+    },
+    {
+      "from": "android/support/v7/widget/StaggeredGridLayoutManager(.*)",
+      "to": "androidx/widget/recyclerview/StaggeredGridLayoutManager{0}"
+    },
+    {
+      "from": "android/support/v7/widget/ViewBoundsCheck(.*)",
+      "to": "androidx/widget/recyclerview/ViewBoundsCheck{0}"
+    },
+    {
+      "from": "android/support/v7/widget/ViewInfoStore(.*)",
+      "to": "androidx/widget/recyclerview/ViewInfoStore{0}"
+    },
+    {
+      "from": "android/support/v7/widget/helper/(.*)",
+      "to": "androidx/widget/recyclerview/{0}"
+    },
+    {
+      "from": "android/support/v7/widget/util/SortedListAdapterCallback",
+      "to": "androidx/widget/recyclerview/SortedListAdapterCallback"
+    },
+    {
+      "from": "android/support/v7/recyclerview/extensions/(.*)",
+      "to": "androidx/widget/recyclerview/{0}"
+    },
+    {
+      "from": "android/support/v7/util/(.*)",
+      "to": "androidx/widget/recyclerview/{0}"
+    },
+    {
+      "from": "android/support/design/widget/CoordinatorLayout(.*)",
+      "to": "androidx/widget/CoordinatorLayout{0}"
+    },
+    {
+      "from": "android/support/design/widget/DirectedAcyclicGraph(.*)",
+      "to": "androidx/widget/DirectedAcyclicGraph{0}"
+    },
+    {
+      "from": "android/support/design/widget/ViewGroupUtils(.*)",
+      "to": "androidx/widget/ViewGroupUtils{0}"
+    },
+    {
+      "from": "android/support/constraint/(.*)",
+      "to": "androidx/widget/constraint/{0}"
+    },
+    {
+      "from": "android/support/v4/view/ViewPager(.*)",
+      "to": "androidx/widget/ViewPager{0}"
+    },
+    {
+      "from": "android/support/v4/view/PagerAdapter(.*)",
+      "to": "androidx/widget/PagerAdapter{0}"
+    },
+    {
+      "from": "android/support/v4/view/PagerTabStrip(.*)",
+      "to": "androidx/widget/PagerTabStrip{0}"
+    },
+    {
+      "from": "android/support/v4/view/PagerTitleStrip(.*)",
+      "to": "androidx/widget/PagerTitleStrip{0}"
     },
     {
       "from": "android/support/v17/preference/(.*)",
-      "to": "androidx/leanback/preference/{0}",
-      "fieldSelectors": []
+      "to": "androidx/leanback/preference/{0}"
+    },
+    {
+      "from": "android/support/v17/internal/widget/OutlineOnlyWithChildrenFrameLayout(.*)",
+      "to": "androidx/leanback/preference/internal/OutlineOnlyWithChildrenFrameLayout{0}"
     },
     {
       "from": "android/support/customtabs/(.*)",
-      "to": "androidx/browser/customtabs/{0}",
-      "fieldSelectors": []
+      "to": "androidx/browser/customtabs/{0}"
     },
     {
       "from": "android/support/v4/(.*)",
-      "to": "androidx/{0}",
-      "fieldSelectors": []
+      "to": "androidx/{0}"
     },
     {
-      "from": "android/support/v7/graphics/ColorCutQuantizer",
-      "to": "androidx/graphics/palette/ColorCutQuantizer",
-      "fieldSelectors": []
+      "from": "android/support/v7/graphics/ColorCutQuantizer(.*)",
+      "to": "androidx/graphics/palette/ColorCutQuantizer{0}"
     },
     {
-      "from": "android/support/v7/graphics/Palette",
-      "to": "androidx/graphics/palette/Palette",
-      "fieldSelectors": []
+      "from": "android/support/v7/graphics/Palette(.*)",
+      "to": "androidx/graphics/palette/Palette{0}"
     },
     {
-      "from": "android/support/v7/graphics/Target",
-      "to": "androidx/graphics/palette/Target",
-      "fieldSelectors": []
+      "from": "android/support/v7/graphics/Target(.*)",
+      "to": "androidx/graphics/palette/Target{0}"
+    },
+    {
+      "from": "android/support/v7/internal/widget/PreferenceImageView(.*)",
+      "to": "androidx/preference/internal/PreferenceImageView{0}"
     },
     {
       "from": "android/support/v7/(.*)",
-      "to": "androidx/{0}",
-      "fieldSelectors": []
+      "to": "androidx/{0}"
+    },
+    {
+      "from": "android/support/v8/(.*)",
+      "to": "androidx/{0}"
     },
     {
       "from": "android/support/v13/(.*)",
-      "to": "androidx/{0}",
-      "fieldSelectors": []
+      "to": "androidx/{0}"
     },
     {
       "from": "android/support/v14/(.*)",
-      "to": "androidx/{0}",
-      "fieldSelectors": []
+      "to": "androidx/{0}"
     },
     {
       "from": "android/support/v17/(.*)",
-      "to": "androidx/{0}",
-      "fieldSelectors": []
+      "to": "androidx/{0}"
+    },
+    {
+      "from": "android/support/content/(.*)",
+      "to": "androidx/util/contentpaging/{0}"
     },
     {
       "from": "android/support/percent/(.*)",
-      "to": "androidx/{0}",
-      "fieldSelectors": []
+      "to": "androidx/widget/{0}"
     },
     {
       "from": "android/support/(.*)",
-      "to": "androidx/{0}",
-      "fieldSelectors": []
+      "to": "androidx/{0}"
     },
     {
       "from": "android/arch/(.*)",
-      "to": "androidx/{0}",
-      "fieldSelectors": []
+      "to": "androidx/{0}"
+    },
+    {
+      "from": "android/databinding/(.*)",
+      "to": "androidx/databinding/{0}"
+    }
+  ],
+  "slRules": [
+    {
+      "from": "(.*)/package-info",
+      "to": "ignore"
+    },
+    {
+      "from": "androidx/text/emoji/flatbuffer/(.*)",
+      "to": "ignore"
+    },
+    {
+      "from": "androidx/textclassifier/(.*)",
+      "to": "ignore"
+    },
+    {
+      "from": "androidx/widget/recyclerview/selection/(.*)",
+      "to": "ignore"
+    },
+    {
+      "from": "androidx/browser/browseractions/(.*)",
+      "to": "ignore"
     }
   ],
   "pomRules": [
@@ -690,13356 +810,4147 @@
   ],
   "map": {
     "types": {
-      "android/support/v4/provider/FontsContractCompat$Columns": "androidx/provider/FontsContractCompat$Columns",
-      "android/support/design/widget/AppBarLayout$Behavior$SavedState": "androidx/design/widget/AppBarLayout$Behavior$SavedState",
-      "android/support/v4/internal/view/SupportMenu": "androidx/internal/view/SupportMenu",
-      "android/support/v4/media/MediaDescriptionCompat": "androidx/media/MediaDescriptionCompat",
-      "android/support/transition/ChangeTransform$GhostListener": "androidx/transition/ChangeTransform$GhostListener",
-      "android/support/design/widget/BaseTransientBottomBar$BaseCallback": "androidx/design/widget/BaseTransientBottomBar$BaseCallback",
-      "android/support/v4/print/PrintHelper$ColorMode": "androidx/print/PrintHelper$ColorMode",
-      "android/support/annotation/RequiresPermission$Write": "androidx/annotation/RequiresPermission$Write",
-      "android/support/v7/widget/FastScroller$AnimatorUpdater": "androidx/widget/FastScroller$AnimatorUpdater",
-      "android/support/multidex/MultiDex$V14": "androidx/multidex/MultiDex$V14",
-      "android/support/v17/leanback/app/BrowseSupportFragment$MainFragmentAdapterRegistry": "androidx/leanback/app/BrowseSupportFragment$MainFragmentAdapterRegistry",
-      "android/support/v7/preference/PreferenceDataStore": "androidx/preference/PreferenceDataStore",
-      "android/support/v17/leanback/app/DetailsBackgroundVideoHelper$PlaybackControlStateCallback": "androidx/leanback/app/DetailsBackgroundVideoHelper$PlaybackControlStateCallback",
-      "android/support/v4/content/LocalBroadcastManager": "androidx/content/LocalBroadcastManager",
-      "android/support/v7/view/ActionBarPolicy": "androidx/view/ActionBarPolicy",
-      "android/support/v4/content/Loader$OnLoadCanceledListener": "androidx/content/Loader$OnLoadCanceledListener",
-      "android/support/v4/view/GestureDetectorCompat$GestureDetectorCompatImplBase": "androidx/view/GestureDetectorCompat$GestureDetectorCompatImplBase",
-      "android/support/v4/app/SharedElementCallback$OnSharedElementsReadyListener": "androidx/app/SharedElementCallback$OnSharedElementsReadyListener",
-      "android/support/v7/app/MediaRouteVolumeSlider": "androidx/app/MediaRouteVolumeSlider",
-      "android/support/multidex/MultiDex$V19": "androidx/multidex/MultiDex$V19",
-      "android/support/v17/leanback/widget/StaggeredGridDefault": "androidx/leanback/widget/StaggeredGridDefault",
-      "android/support/v17/leanback/widget/GuidedActionAdapter$ActionOnKeyListener": "androidx/leanback/widget/GuidedActionAdapter$ActionOnKeyListener",
-      "android/support/design/widget/BottomNavigationView$OnNavigationItemReselectedListener": "androidx/design/widget/BottomNavigationView$OnNavigationItemReselectedListener",
-      "android/support/app/recommendation/ContentRecommendation$ContentPricing": "androidx/app/recommendation/ContentRecommendation$ContentPricing",
-      "android/support/v17/leanback/widget/BaseCardView$LayoutParams": "androidx/leanback/widget/BaseCardView$LayoutParams",
-      "android/support/text/emoji/MetadataListReader": "androidx/text/emoji/MetadataListReader",
-      "android/support/v7/appcompat/R$drawable": "androidx/appcompat/R$drawable",
-      "android/support/design/widget/BaseTransientBottomBar$OnAttachStateChangeListener": "androidx/design/widget/BaseTransientBottomBar$OnAttachStateChangeListener",
-      "android/support/v4/view/GravityCompat": "androidx/view/GravityCompat",
-      "android/support/v7/view/menu/SubMenuWrapperICS": "androidx/view/menu/SubMenuWrapperICS",
-      "android/support/graphics/drawable/VectorDrawableCompat": "androidx/graphics/drawable/VectorDrawableCompat",
-      "android/support/v4/view/AsyncLayoutInflater$InflateRequest": "androidx/view/AsyncLayoutInflater$InflateRequest",
-      "android/support/v17/leanback/app/HeadersFragment$NoOverlappingFrameLayout": "androidx/leanback/app/HeadersFragment$NoOverlappingFrameLayout",
-      "android/support/v17/leanback/widget/ShadowHelperJbmr2": "androidx/leanback/widget/ShadowHelperJbmr2",
-      "android/support/design/internal/ScrimInsetsFrameLayout": "androidx/design/internal/ScrimInsetsFrameLayout",
-      "android/support/v17/leanback/widget/HorizontalHoverCardSwitcher": "androidx/leanback/widget/HorizontalHoverCardSwitcher",
-      "android/support/v7/widget/RecyclerView$Recycler": "androidx/widget/RecyclerView$Recycler",
-      "android/support/v7/widget/FastScroller$State": "androidx/widget/FastScroller$State",
-      "android/support/v7/media/SystemMediaRouteProvider$JellybeanMr2Impl": "androidx/media/SystemMediaRouteProvider$JellybeanMr2Impl",
-      "android/support/wear/R$id": "androidx/wear/R$id",
-      "android/support/v17/leanback/widget/FocusHighlight": "androidx/leanback/widget/FocusHighlight",
-      "android/support/v7/view/menu/ExpandedMenuView": "androidx/view/menu/ExpandedMenuView",
-      "android/support/graphics/drawable/PathInterpolatorCompat": "androidx/graphics/drawable/PathInterpolatorCompat",
-      "android/support/v17/leanback/widget/MediaItemActionPresenter": "androidx/leanback/widget/MediaItemActionPresenter",
-      "android/support/v4/content/Loader$OnLoadCompleteListener": "androidx/content/Loader$OnLoadCompleteListener",
-      "android/support/v17/leanback/widget/NonOverlappingLinearLayout": "androidx/leanback/widget/NonOverlappingLinearLayout",
-      "android/support/v7/view/menu/MenuItemWrapperICS$CollapsibleActionViewWrapper": "androidx/view/menu/MenuItemWrapperICS$CollapsibleActionViewWrapper",
-      "android/support/v4/widget/SlidingPaneLayout$SlidingPanelLayoutImplJB": "androidx/widget/SlidingPaneLayout$SlidingPanelLayoutImplJB",
-      "android/support/v17/leanback/app/ErrorFragment": "androidx/leanback/app/ErrorFragment",
-      "android/support/v7/view/menu/MenuItemWrapperICS$OnActionExpandListenerWrapper": "androidx/view/menu/MenuItemWrapperICS$OnActionExpandListenerWrapper",
-      "android/support/v7/app/AppCompatActivity": "androidx/app/AppCompatActivity",
-      "android/support/v17/preference/LeanbackSettingsFragment$DummyFragment": "androidx/leanback/preference/LeanbackSettingsFragment$DummyFragment",
-      "android/support/app/recommendation/ContentRecommendation$IntentType": "androidx/app/recommendation/ContentRecommendation$IntentType",
-      "android/support/v17/leanback/widget/PlaybackControlsRowView": "androidx/leanback/widget/PlaybackControlsRowView",
-      "android/support/v4/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicLocale": "androidx/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicLocale",
-      "android/support/v4/util/SparseArrayCompat": "androidx/util/SparseArrayCompat",
-      "android/support/v4/net/TrafficStatsCompat": "androidx/net/TrafficStatsCompat",
-      "android/support/design/widget/TabLayout$Tab": "androidx/design/widget/TabLayout$Tab",
-      "android/support/v7/view/CollapsibleActionView": "androidx/view/CollapsibleActionView",
-      "android/support/v17/leanback/R$id": "androidx/leanback/R$id",
-      "android/support/v4/content/MimeTypeFilter": "androidx/content/MimeTypeFilter",
-      "android/support/media/tv/TvContractCompat$WatchNextPrograms$WatchNextType": "androidx/media/tv/TvContractCompat$WatchNextPrograms$WatchNextType",
-      "android/support/transition/ViewUtilsImpl": "androidx/transition/ViewUtilsImpl",
-      "android/support/v17/leanback/app/DetailsFragment$SetSelectionRunnable": "androidx/leanback/app/DetailsFragment$SetSelectionRunnable",
-      "android/support/v7/app/MediaRouteControllerDialog$ClickListener": "androidx/app/MediaRouteControllerDialog$ClickListener",
-      "android/support/design/widget/VisibilityAwareImageButton": "androidx/design/widget/VisibilityAwareImageButton",
-      "android/support/transition/ViewGroupUtilsImpl": "androidx/transition/ViewGroupUtilsImpl",
-      "android/support/v7/widget/SearchView$SearchAutoComplete": "androidx/widget/SearchView$SearchAutoComplete",
-      "android/support/v17/leanback/widget/GuidedActionAdapterGroup": "androidx/leanback/widget/GuidedActionAdapterGroup",
-      "android/support/v7/widget/AppCompatBackgroundHelper": "androidx/widget/AppCompatBackgroundHelper",
-      "android/support/v4/widget/EdgeEffectCompat$EdgeEffectApi21Impl": "androidx/widget/EdgeEffectCompat$EdgeEffectApi21Impl",
-      "android/support/v17/leanback/R$fraction": "androidx/leanback/R$fraction",
-      "android/support/wear/widget/drawer/WearableActionDrawerMenu": "androidx/wear/widget/drawer/WearableActionDrawerMenu",
-      "android/support/v4/content/IntentCompat": "androidx/content/IntentCompat",
-      "android/support/compat/R": "androidx/compat/R",
-      "android/support/v7/widget/RecyclerView$ViewCacheExtension": "androidx/widget/RecyclerView$ViewCacheExtension",
-      "android/support/v7/widget/DecorContentParent": "androidx/widget/DecorContentParent",
-      "android/support/design/widget/BaseTransientBottomBar$Behavior": "androidx/design/widget/BaseTransientBottomBar$Behavior",
-      "android/support/design/widget/TabLayout$ViewPagerOnTabSelectedListener": "androidx/design/widget/TabLayout$ViewPagerOnTabSelectedListener",
-      "android/support/v7/preference/EditTextPreference$SavedState": "androidx/preference/EditTextPreference$SavedState",
-      "android/support/design/widget/ShadowViewDelegate": "androidx/design/widget/ShadowViewDelegate",
-      "android/support/v7/app/AlertController$ButtonHandler": "androidx/app/AlertController$ButtonHandler",
-      "android/support/v4/widget/AutoScrollHelper$ScrollAnimationRunnable": "androidx/widget/AutoScrollHelper$ScrollAnimationRunnable",
-      "android/support/v7/view/menu/ShowableListMenu": "androidx/view/menu/ShowableListMenu",
-      "android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper": "androidx/leanback/widget/DetailsOverviewSharedElementHelper",
-      "android/support/v7/widget/MenuPopupWindow$MenuDropDownListView": "androidx/widget/MenuPopupWindow$MenuDropDownListView",
-      "android/support/v17/leanback/transition/LeanbackTransitionHelper": "androidx/leanback/transition/LeanbackTransitionHelper",
-      "android/support/design/widget/BottomSheetDialogFragment": "androidx/design/widget/BottomSheetDialogFragment",
-      "android/support/v4/app/NotificationCompat$Extender": "androidx/app/NotificationCompat$Extender",
-      "android/support/v4/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicInternal": "androidx/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicInternal",
-      "android/support/wear/widget/SwipeDismissLayout$OnPreSwipeListener": "androidx/wear/widget/SwipeDismissLayout$OnPreSwipeListener",
-      "android/support/v4/graphics/BitmapCompat$BitmapCompatApi18Impl": "androidx/graphics/BitmapCompat$BitmapCompatApi18Impl",
-      "android/support/v4/view/ViewCompat$AutofillImportance": "androidx/view/legacy/ViewCompat$AutofillImportance",
-      "android/support/v4/app/AppOpsManagerCompat": "androidx/app/AppOpsManagerCompat",
-      "android/support/annotation/FractionRes": "androidx/annotation/FractionRes",
-      "android/support/media/instantvideo/widget/InstantVideoView": "androidx/media/instantvideo/widget/InstantVideoView",
-      "android/support/design/internal/NavigationMenuPresenter$NormalViewHolder": "androidx/design/internal/NavigationMenuPresenter$NormalViewHolder",
-      "android/support/v4/view/accessibility/AccessibilityRecordCompat": "androidx/view/accessibility/AccessibilityRecordCompat",
-      "android/support/v7/view/menu/MenuWrapperFactory": "androidx/view/menu/MenuWrapperFactory",
-      "android/support/v17/leanback/app/HeadersSupportFragment$NoOverlappingFrameLayout": "androidx/leanback/app/HeadersSupportFragment$NoOverlappingFrameLayout",
-      "android/support/v7/widget/ScrollingTabContainerView$VisibilityAnimListener": "androidx/widget/ScrollingTabContainerView$VisibilityAnimListener",
-      "android/support/v4/media/MediaBrowserServiceCompatApi26$ResultWrapper": "androidx/media/MediaBrowserServiceCompatApi26$ResultWrapper",
-      "android/support/v4/media/MediaBrowserServiceCompat$ResultFlags": "androidx/media/MediaBrowserServiceCompat$ResultFlags",
-      "android/support/v4/media/session/MediaControllerCompat$MediaControllerImplApi21$ExtraBinderRequestResultReceiver": "androidx/media/session/MediaControllerCompat$MediaControllerImplApi21$ExtraBinderRequestResultReceiver",
-      "android/support/v17/leanback/widget/OnChildSelectedListener": "androidx/leanback/widget/OnChildSelectedListener",
-      "android/support/v4/os/LocaleListHelper": "androidx/os/LocaleListHelper",
-      "android/support/v7/widget/ChildHelper": "androidx/widget/ChildHelper",
-      "android/support/v17/leanback/widget/BaseOnItemViewClickedListener": "androidx/leanback/widget/BaseOnItemViewClickedListener",
-      "android/support/v17/leanback/widget/VerticalGridPresenter": "androidx/leanback/widget/VerticalGridPresenter",
-      "android/support/v7/widget/Toolbar$LayoutParams": "androidx/widget/Toolbar$LayoutParams",
-      "android/support/v4/provider/SelfDestructiveThread": "androidx/provider/SelfDestructiveThread",
-      "android/support/v17/leanback/widget/DetailsParallax": "androidx/leanback/widget/DetailsParallax",
-      "android/support/v4/content/pm/ActivityInfoCompat": "androidx/content/pm/ActivityInfoCompat",
-      "android/support/percent/PercentFrameLayout$LayoutParams": "androidx/PercentFrameLayout$LayoutParams",
-      "android/support/v7/widget/RecyclerView$ItemAnimator$ItemAnimatorFinishedListener": "androidx/widget/RecyclerView$ItemAnimator$ItemAnimatorFinishedListener",
-      "android/support/v4/media/MediaBrowserCompat$ConnectionCallback": "androidx/media/MediaBrowserCompat$ConnectionCallback",
-      "android/support/design/widget/ThemeUtils": "androidx/design/widget/ThemeUtils",
-      "android/support/wear/widget/drawer/RecyclerViewFlingWatcher": "androidx/wear/widget/drawer/RecyclerViewFlingWatcher",
-      "android/support/v4/app/SupportActivity": "androidx/app/SupportActivity",
-      "android/support/transition/TransitionUtils": "androidx/transition/TransitionUtils",
-      "android/support/v4/graphics/TypefaceCompatApi21Impl": "androidx/graphics/TypefaceCompatApi21Impl",
-      "android/support/v7/media/MediaRouter$CallbackRecord": "androidx/media/MediaRouter$CallbackRecord",
-      "android/support/wear/widget/drawer/NestedScrollViewFlingWatcher": "androidx/wear/widget/drawer/NestedScrollViewFlingWatcher",
-      "android/support/v4/graphics/drawable/TintAwareDrawable": "androidx/graphics/drawable/TintAwareDrawable",
-      "android/support/text/emoji/widget/EmojiTextViewHelper$HelperInternal": "androidx/text/emoji/widget/EmojiTextViewHelper$HelperInternal",
-      "android/support/transition/Styleable": "androidx/transition/Styleable",
-      "android/support/v17/leanback/widget/BaseCardView": "androidx/leanback/widget/BaseCardView",
-      "android/support/v17/leanback/app/DetailsSupportFragment": "androidx/leanback/app/DetailsSupportFragment",
-      "android/support/design/internal/NavigationMenuPresenter$NavigationMenuSeparatorItem": "androidx/design/internal/NavigationMenuPresenter$NavigationMenuSeparatorItem",
-      "android/support/app/recommendation/ContentRecommendation$IntentData": "androidx/app/recommendation/ContentRecommendation$IntentData",
-      "android/support/wear/widget/drawer/WearableDrawerLayout$DrawerStateCallback": "androidx/wear/widget/drawer/WearableDrawerLayout$DrawerStateCallback",
-      "android/support/wear/widget/CircularProgressLayoutController$CircularProgressTimer": "androidx/wear/widget/CircularProgressLayoutController$CircularProgressTimer",
-      "android/support/v4/widget/CircleImageView": "androidx/widget/CircleImageView",
-      "android/support/v17/leanback/app/BaseRowFragment": "androidx/leanback/app/BaseRowFragment",
-      "android/support/text/emoji/EmojiCompat$ReplaceStrategy": "androidx/text/emoji/EmojiCompat$ReplaceStrategy",
-      "android/support/v7/widget/ViewInfoStore$InfoRecord": "androidx/widget/ViewInfoStore$InfoRecord",
-      "android/support/transition/TransitionInflater": "androidx/transition/TransitionInflater",
-      "android/support/v17/leanback/media/PlaybackControlGlue$UpdatePlaybackStateHandler": "androidx/leanback/media/PlaybackControlGlue$UpdatePlaybackStateHandler",
-      "android/support/v7/widget/RecyclerView$State$LayoutState": "androidx/widget/RecyclerView$State$LayoutState",
-      "android/support/v17/leanback/widget/RoundedRectHelper": "androidx/leanback/widget/RoundedRectHelper",
-      "android/support/v4/app/ServiceCompat": "androidx/app/ServiceCompat",
-      "android/support/percent/PercentRelativeLayout$LayoutParams": "androidx/PercentRelativeLayout$LayoutParams",
-      "android/support/v17/leanback/widget/RowHeaderPresenter": "androidx/leanback/widget/RowHeaderPresenter",
-      "android/support/v7/widget/SearchView$UpdatableTouchDelegate": "androidx/widget/SearchView$UpdatableTouchDelegate",
-      "android/support/media/tv/TvContractCompat$PreviewProgramColumns$AspectRatio": "androidx/media/tv/TvContractCompat$PreviewProgramColumns$AspectRatio",
-      "android/support/text/emoji/EmojiMetadata$HasGlyph": "androidx/text/emoji/EmojiMetadata$HasGlyph",
-      "android/support/media/tv/BasePreviewProgram$Builder": "androidx/media/tv/BasePreviewProgram$Builder",
-      "android/support/multidex/ZipUtil$CentralDirectory": "androidx/multidex/ZipUtil$CentralDirectory",
-      "android/support/v7/widget/helper/ItemTouchUIUtil": "androidx/widget/helper/ItemTouchUIUtil",
-      "android/support/v4/widget/DrawerLayout$ChildAccessibilityDelegate": "androidx/widget/DrawerLayout$ChildAccessibilityDelegate",
-      "android/support/v7/media/SystemMediaRouteProvider": "androidx/media/SystemMediaRouteProvider",
-      "android/support/v4/app/LoaderManagerImpl": "androidx/app/LoaderManagerImpl",
-      "android/support/media/ExifInterface$IfdType": "androidx/media/ExifInterface$IfdType",
-      "android/support/v4/widget/CompoundButtonCompat$CompoundButtonCompatBaseImpl": "androidx/widget/CompoundButtonCompat$CompoundButtonCompatBaseImpl",
-      "android/support/v4/graphics/drawable/DrawableWrapperApi14": "androidx/graphics/drawable/DrawableWrapperApi14",
-      "android/support/wear/widget/drawer/WearableDrawerLayout$BottomDrawerDraggerCallback": "androidx/wear/widget/drawer/WearableDrawerLayout$BottomDrawerDraggerCallback",
-      "android/support/v4/view/TintableBackgroundView": "androidx/view/TintableBackgroundView",
-      "android/support/v17/leanback/graphics/BoundsRule": "androidx/leanback/graphics/BoundsRule",
-      "android/support/v17/leanback/widget/RecyclerViewParallax$ChildPositionProperty": "androidx/leanback/widget/RecyclerViewParallax$ChildPositionProperty",
-      "android/support/v4/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicImpl": "androidx/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicImpl",
-      "android/support/v17/leanback/widget/PlaybackControlsPresenter": "androidx/leanback/widget/PlaybackControlsPresenter",
-      "android/support/v7/app/ActionBarDrawerToggle": "androidx/app/ActionBarDrawerToggle",
-      "android/support/design/internal/BaselineLayout": "androidx/design/internal/BaselineLayout",
-      "android/support/v7/preference/PreferenceScreen": "androidx/preference/PreferenceScreen",
-      "android/support/v4/graphics/drawable/DrawableWrapperApi19": "androidx/graphics/drawable/DrawableWrapperApi19",
-      "android/support/v17/leanback/app/DetailsFragment": "androidx/leanback/app/DetailsFragment",
-      "android/support/annotation/ColorLong": "androidx/annotation/ColorLong",
-      "android/support/annotation/IntRange": "androidx/annotation/IntRange",
-      "android/support/v7/widget/LinearLayoutCompat$DividerMode": "androidx/widget/LinearLayoutCompat$DividerMode",
+      "android/support/v17/leanback/animation/LogAccelerateInterpolator": "androidx/leanback/animation/LogAccelerateInterpolator",
       "android/support/annotation/RestrictTo": "androidx/annotation/RestrictTo",
-      "android/support/v4/media/session/PlaybackStateCompat": "androidx/media/session/PlaybackStateCompat",
-      "android/support/v17/leanback/widget/RecyclerViewParallax": "androidx/leanback/widget/RecyclerViewParallax",
-      "android/support/v7/widget/ChildHelper$Callback": "androidx/widget/ChildHelper$Callback",
-      "android/support/v17/leanback/widget/DetailsOverviewLogoPresenter": "androidx/leanback/widget/DetailsOverviewLogoPresenter",
-      "android/support/constraint/Guideline": "androidx/constraint/Guideline",
-      "android/support/design/widget/CircularBorderDrawable": "androidx/design/widget/CircularBorderDrawable",
-      "android/support/text/emoji/widget/EmojiInputConnection": "androidx/text/emoji/widget/EmojiInputConnection",
-      "android/support/v4/widget/ImageViewCompat$ImageViewCompatImpl": "androidx/widget/ImageViewCompat$ImageViewCompatImpl",
-      "android/support/v17/leanback/widget/ItemBridgeAdapterShadowOverlayWrapper": "androidx/leanback/widget/ItemBridgeAdapterShadowOverlayWrapper",
-      "android/support/v7/view/menu/MenuBuilder": "androidx/view/menu/MenuBuilder",
-      "android/support/v7/media/MediaRouteDiscoveryRequest": "androidx/media/MediaRouteDiscoveryRequest",
-      "android/support/design/widget/AppBarLayout$ScrollingViewBehavior": "androidx/design/widget/AppBarLayout$ScrollingViewBehavior",
-      "android/support/v17/leanback/widget/PersistentFocusWrapper$SavedState": "androidx/leanback/widget/PersistentFocusWrapper$SavedState",
-      "android/support/v7/widget/RecyclerView$ItemAnimator$ItemAnimatorListener": "androidx/widget/RecyclerView$ItemAnimator$ItemAnimatorListener",
-      "android/support/v17/leanback/media/PlaybackBannerControlGlue": "androidx/leanback/media/PlaybackBannerControlGlue",
-      "android/support/design/internal/NavigationMenuPresenter$ViewHolder": "androidx/design/internal/NavigationMenuPresenter$ViewHolder",
-      "android/support/v7/widget/AppCompatDrawableManager$VdcInflateDelegate": "androidx/widget/AppCompatDrawableManager$VdcInflateDelegate",
-      "android/support/graphics/drawable/AndroidResources": "androidx/graphics/drawable/AndroidResources",
-      "android/support/v7/widget/RecyclerView$RecyclerViewDataObserver": "androidx/widget/RecyclerView$RecyclerViewDataObserver",
-      "android/support/design/R$integer": "androidx/design/R$integer",
-      "android/support/v4/app/AppLaunchChecker": "androidx/app/AppLaunchChecker",
-      "android/support/v17/leanback/transition/ParallaxTransition": "androidx/leanback/transition/ParallaxTransition",
-      "android/support/text/emoji/widget/SpannableBuilder": "androidx/text/emoji/widget/SpannableBuilder",
-      "android/support/text/emoji/widget/ExtractButtonCompat": "androidx/text/emoji/widget/ExtractButtonCompat",
-      "android/support/v17/leanback/app/ListRowDataAdapter$QueueBasedDataObserver": "androidx/leanback/app/ListRowDataAdapter$QueueBasedDataObserver",
-      "android/support/content/ContentPager$QueryRunner": "androidx/content/ContentPager$QueryRunner",
-      "android/support/v4/app/FragmentTabHost$SavedState": "androidx/app/FragmentTabHost$SavedState",
-      "android/support/v7/widget/OpReorderer$Callback": "androidx/widget/OpReorderer$Callback",
-      "android/support/multidex/MultiDexExtractor$ExtractedDex": "androidx/multidex/MultiDexExtractor$ExtractedDex",
-      "android/support/design/widget/SwipeDismissBehavior": "androidx/design/widget/SwipeDismissBehavior",
-      "android/support/v4/content/FileProvider": "androidx/content/FileProvider",
-      "android/support/v17/leanback/app/BrowseFragment$BrowseTransitionListener": "androidx/leanback/app/BrowseFragment$BrowseTransitionListener",
-      "android/support/design/widget/ViewOffsetBehavior": "androidx/design/widget/ViewOffsetBehavior",
-      "android/support/v17/leanback/app/ListRowDataAdapter$SimpleDataObserver": "androidx/leanback/app/ListRowDataAdapter$SimpleDataObserver",
-      "android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat": "androidx/accessibilityservice/AccessibilityServiceInfoCompat",
-      "android/support/v7/widget/ScrollbarHelper": "androidx/widget/ScrollbarHelper",
-      "android/support/v17/leanback/widget/BaseCardView$InfoAlphaAnimation": "androidx/leanback/widget/BaseCardView$InfoAlphaAnimation",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$RepeatAction": "androidx/leanback/widget/PlaybackControlsRow$RepeatAction",
-      "android/support/v7/widget/LinearSnapHelper": "androidx/widget/LinearSnapHelper",
-      "android/support/v7/view/menu/BaseWrapper": "androidx/view/menu/BaseWrapper",
-      "android/support/wear/utils/MetadataConstants": "androidx/wear/utils/MetadataConstants",
-      "android/support/v7/widget/RecyclerView$ItemAnimator": "androidx/widget/RecyclerView$ItemAnimator",
-      "android/support/v17/leanback/media/PlaybackGlueHost$HostCallback": "androidx/leanback/media/PlaybackGlueHost$HostCallback",
-      "android/support/v7/widget/ActionMenuPresenter$ActionMenuPopupCallback": "androidx/widget/ActionMenuPresenter$ActionMenuPopupCallback",
-      "android/support/v7/widget/GridLayout$Interval": "androidx/widget/GridLayout$Interval",
-      "android/support/v17/leanback/widget/GuidedActionsStylist$ViewHolder": "androidx/leanback/widget/GuidedActionsStylist$ViewHolder",
-      "android/support/v4/app/Fragment$InstantiationException": "androidx/app/Fragment$InstantiationException",
-      "android/support/v14/preference/EditTextPreferenceDialogFragment": "androidx/preference/EditTextPreferenceDialogFragment",
-      "android/support/text/emoji/EmojiCompat$CompatInternal": "androidx/text/emoji/EmojiCompat$CompatInternal",
-      "android/support/v4/app/FragmentManagerNonConfig": "androidx/app/FragmentManagerNonConfig",
-      "android/support/v7/media/MediaRouter$GlobalMediaRouter": "androidx/media/MediaRouter$GlobalMediaRouter",
-      "android/support/transition/Styleable$TransitionManager": "androidx/transition/Styleable$TransitionManager",
-      "android/support/v4/content/res/ConfigurationHelper": "androidx/content/res/ConfigurationHelper",
-      "android/support/v7/app/MediaRouteDiscoveryFragment": "androidx/app/MediaRouteDiscoveryFragment",
-      "android/support/v7/media/MediaRouteSelector": "androidx/media/MediaRouteSelector",
-      "android/support/v4/media/session/MediaControllerCompat$MediaControllerImplApi21": "androidx/media/session/MediaControllerCompat$MediaControllerImplApi21",
-      "android/support/v17/leanback/widget/ControlBar": "androidx/leanback/widget/ControlBar",
-      "android/support/v4/media/session/MediaControllerCompat$MediaControllerImplApi24": "androidx/media/session/MediaControllerCompat$MediaControllerImplApi24",
-      "android/support/app/recommendation/ContentRecommendation$ContentStatus": "androidx/app/recommendation/ContentRecommendation$ContentStatus",
-      "android/support/v4/media/session/MediaControllerCompat$MediaControllerImplApi23": "androidx/media/session/MediaControllerCompat$MediaControllerImplApi23",
-      "android/support/v4/media/MediaMetadataCompat": "androidx/media/MediaMetadataCompat",
-      "android/support/v4/util/CircularIntArray": "androidx/util/CircularIntArray",
-      "android/support/transition/Slide$CalculateSlide": "androidx/transition/Slide$CalculateSlide",
-      "android/support/transition/GhostViewUtils": "androidx/transition/GhostViewUtils",
-      "android/support/design/widget/NavigationView$OnNavigationItemSelectedListener": "androidx/design/widget/NavigationView$OnNavigationItemSelectedListener",
-      "android/support/v4/hardware/fingerprint/FingerprintManagerCompat$CryptoObject": "androidx/hardware/fingerprint/FingerprintManagerCompat$CryptoObject",
-      "android/support/media/tv/TvContractCompat$Programs": "androidx/media/tv/TvContractCompat$Programs",
-      "android/support/v4/provider/FontsContractCompat": "androidx/provider/FontsContractCompat",
-      "android/support/v4/content/res/FontResourcesParserCompat$ProviderResourceEntry": "androidx/content/res/FontResourcesParserCompat$ProviderResourceEntry",
-      "android/support/v17/leanback/widget/BaseGridView": "androidx/leanback/widget/BaseGridView",
-      "android/support/design/R": "androidx/design/R",
-      "android/support/annotation/GuardedBy": "androidx/annotation/GuardedBy",
-      "android/support/v17/leanback/widget/ListRowPresenter$ViewHolder": "androidx/leanback/widget/ListRowPresenter$ViewHolder",
-      "android/support/constraint/solver/widgets/ConstraintWidgetContainer": "androidx/constraint/solver/widgets/ConstraintWidgetContainer",
-      "android/support/wear/widget/drawer/WearableDrawerView$DrawerState": "androidx/wear/widget/drawer/WearableDrawerView$DrawerState",
-      "android/support/v7/widget/LinearLayoutManager$SavedState": "androidx/widget/LinearLayoutManager$SavedState",
-      "android/support/v4/util/LongSparseArray": "androidx/util/LongSparseArray",
-      "android/support/media/tv/TvContractCompat$ProgramColumns$ReviewRatingStyle": "androidx/media/tv/TvContractCompat$ProgramColumns$ReviewRatingStyle",
-      "android/support/v7/media/MediaRouter$GlobalMediaRouter$RemoteControlClientRecord": "androidx/media/MediaRouter$GlobalMediaRouter$RemoteControlClientRecord",
-      "android/support/v7/widget/TintResources": "androidx/widget/TintResources",
-      "android/support/v7/util/ThreadUtil$MainThreadCallback": "androidx/util/ThreadUtil$MainThreadCallback",
-      "android/support/animation/DynamicAnimation$MassState": "androidx/animation/DynamicAnimation$MassState",
-      "android/support/v4/widget/PopupWindowCompat": "androidx/widget/PopupWindowCompat",
-      "android/support/design/widget/FloatingActionButton$Behavior": "androidx/design/widget/FloatingActionButton$Behavior",
-      "android/support/v7/preference/PreferenceFragmentCompat$DividerDecoration": "androidx/preference/PreferenceFragmentCompat$DividerDecoration",
-      "android/support/transition/Styleable$PatternPathMotion": "androidx/transition/Styleable$PatternPathMotion",
-      "android/support/v4/media/session/MediaSessionCompat$Callback$CallbackHandler": "androidx/media/session/MediaSessionCompat$Callback$CallbackHandler",
-      "android/support/v4/app/INotificationSideChannel": "androidx/app/INotificationSideChannel",
-      "android/support/media/tv/TvContractCompat$Channels$VideoFormat": "androidx/media/tv/TvContractCompat$Channels$VideoFormat",
-      "android/support/v17/preference/LeanbackSettingsFragment$RootViewOnKeyListener": "androidx/leanback/preference/LeanbackSettingsFragment$RootViewOnKeyListener",
-      "android/support/v7/widget/ActionMenuView$MenuBuilderCallback": "androidx/widget/ActionMenuView$MenuBuilderCallback",
-      "android/support/design/widget/TabLayout$Mode": "androidx/design/widget/TabLayout$Mode",
-      "android/support/transition/ChangeTransform$Transforms": "androidx/transition/ChangeTransform$Transforms",
-      "android/support/v4/media/MediaBrowserServiceCompatApi21$ResultWrapper": "androidx/media/MediaBrowserServiceCompatApi21$ResultWrapper",
-      "android/support/v17/leanback/transition/TranslationAnimationCreator$TransitionPositionListener": "androidx/leanback/transition/TranslationAnimationCreator$TransitionPositionListener",
-      "android/support/text/emoji/widget/EmojiEditText": "androidx/text/emoji/widget/EmojiEditText",
-      "android/support/wear/R$styleable": "androidx/wear/R$styleable",
-      "android/support/v17/leanback/app/BrowseSupportFragment$FragmentHost": "androidx/leanback/app/BrowseSupportFragment$FragmentHost",
-      "android/support/transition/Scene": "androidx/transition/Scene",
-      "android/support/text/emoji/widget/EmojiTransformationMethod": "androidx/text/emoji/widget/EmojiTransformationMethod",
-      "android/support/v4/view/ViewCompat$ResolvedLayoutDirectionMode": "androidx/view/legacy/ViewCompat$ResolvedLayoutDirectionMode",
-      "android/support/v7/appcompat/R": "androidx/appcompat/R",
-      "android/support/v4/media/session/MediaSessionCompatApi24$Callback": "androidx/media/session/MediaSessionCompatApi24$Callback",
-      "android/support/v7/widget/RecyclerView": "androidx/widget/RecyclerView",
-      "android/support/v4/view/accessibility/AccessibilityManagerCompat$AccessibilityStateChangeListenerCompat": "androidx/view/accessibility/AccessibilityManagerCompat$AccessibilityStateChangeListenerCompat",
-      "android/support/v17/leanback/widget/FragmentAnimationProvider": "androidx/leanback/widget/FragmentAnimationProvider",
-      "android/support/v7/widget/ActivityChooserModel": "androidx/widget/ActivityChooserModel",
-      "android/support/media/tv/TvContractCompat$PreviewProgramColumns$InteractionType": "androidx/media/tv/TvContractCompat$PreviewProgramColumns$InteractionType",
-      "android/support/transition/Transition$TransitionListener": "androidx/transition/Transition$TransitionListener",
-      "android/support/v17/leanback/widget/PlaybackControlsRowPresenter$ViewHolder": "androidx/leanback/widget/PlaybackControlsRowPresenter$ViewHolder",
-      "android/support/design/widget/CoordinatorLayout": "androidx/widget/CoordinatorLayout",
-      "android/support/content/Query": "androidx/content/Query",
-      "android/support/v17/leanback/app/BackgroundManager$EmptyDrawable": "androidx/leanback/app/BackgroundManager$EmptyDrawable",
-      "android/support/v17/leanback/app/PlaybackSupportFragment$OnFadeCompleteListener": "androidx/leanback/app/PlaybackSupportFragment$OnFadeCompleteListener",
-      "android/support/v17/leanback/app/BrowseSupportFragment$MainFragmentAdapter": "androidx/leanback/app/BrowseSupportFragment$MainFragmentAdapter",
-      "android/support/v4/media/MediaBrowserCompat$ItemReceiver": "androidx/media/MediaBrowserCompat$ItemReceiver",
-      "android/support/transition/Styleable$VisibilityTransition": "androidx/transition/Styleable$VisibilityTransition",
-      "android/support/transition/TransitionValues": "androidx/transition/TransitionValues",
-      "android/support/v4/content/res/FontResourcesParserCompat$FamilyResourceEntry": "androidx/content/res/FontResourcesParserCompat$FamilyResourceEntry",
-      "android/support/v17/leanback/app/RowsSupportFragment$MainFragmentAdapter": "androidx/leanback/app/RowsSupportFragment$MainFragmentAdapter",
-      "android/support/v17/leanback/widget/Visibility": "androidx/leanback/widget/Visibility",
-      "android/support/design/widget/AppBarLayout$LayoutParams": "androidx/design/widget/AppBarLayout$LayoutParams",
-      "android/support/v4/media/MediaBrowserCompat$SubscriptionCallback$StubApi26": "androidx/media/MediaBrowserCompat$SubscriptionCallback$StubApi26",
-      "android/support/v4/widget/AutoScrollHelper$ClampedScroller": "androidx/widget/AutoScrollHelper$ClampedScroller",
-      "android/support/v7/preference/PreferenceFragmentCompat$OnPreferenceStartScreenCallback": "androidx/preference/PreferenceFragmentCompat$OnPreferenceStartScreenCallback",
-      "android/support/v7/graphics/Palette$Builder": "androidx/graphics/Palette$Builder",
-      "android/support/v4/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat": "androidx/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat",
-      "android/support/design/widget/StateListAnimator$Tuple": "androidx/design/widget/StateListAnimator$Tuple",
-      "android/support/v4/view/accessibility/AccessibilityManagerCompat$TouchExplorationStateChangeListener": "androidx/view/accessibility/AccessibilityManagerCompat$TouchExplorationStateChangeListener",
-      "android/support/text/emoji/EmojiCompat$SpanFactory": "androidx/text/emoji/EmojiCompat$SpanFactory",
-      "android/support/media/tv/TvContractCompat$Channels$Type": "androidx/media/tv/TvContractCompat$Channels$Type",
-      "android/support/v7/widget/GridLayout$LayoutParams": "androidx/widget/GridLayout$LayoutParams",
-      "android/support/v4/media/MediaBrowserCompat$SubscriptionCallback$StubApi21": "androidx/media/MediaBrowserCompat$SubscriptionCallback$StubApi21",
-      "android/support/v17/leanback/widget/WindowAlignment$Axis": "androidx/leanback/widget/WindowAlignment$Axis",
-      "android/support/v17/leanback/widget/ControlBarPresenter": "androidx/leanback/widget/ControlBarPresenter",
-      "android/support/constraint/ConstraintSet": "androidx/constraint/ConstraintSet",
-      "android/support/v17/leanback/transition/TransitionHelperKitkat": "androidx/leanback/transition/TransitionHelperKitkat",
-      "android/support/wear/widget/ScrollManager": "androidx/wear/widget/ScrollManager",
-      "android/support/content/ContentPager$QueryRunner$Callback": "androidx/content/ContentPager$QueryRunner$Callback",
-      "android/support/v4/graphics/TypefaceCompat$TypefaceCompatImpl": "androidx/graphics/TypefaceCompat$TypefaceCompatImpl",
-      "android/support/v7/widget/ContentFrameLayout": "androidx/widget/ContentFrameLayout",
-      "android/support/v4/app/ActionBarDrawerToggle$SetIndicatorInfo": "androidx/app/legacy/ActionBarDrawerToggle$SetIndicatorInfo",
-      "android/support/v4/util/TimeUtils": "androidx/util/TimeUtils",
-      "android/support/v7/widget/ActionBarBackgroundDrawableV21": "androidx/widget/ActionBarBackgroundDrawableV21",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$SkipNextAction": "androidx/leanback/widget/PlaybackControlsRow$SkipNextAction",
-      "android/support/design/internal/ParcelableSparseArray": "androidx/design/internal/ParcelableSparseArray",
-      "android/support/media/tv/Channel$Builder": "androidx/media/tv/Channel$Builder",
-      "android/support/v7/widget/AppCompatCompoundButtonHelper": "androidx/widget/AppCompatCompoundButtonHelper",
-      "android/support/v4/media/MediaBrowserCompatApi23$ItemCallback": "androidx/media/MediaBrowserCompatApi23$ItemCallback",
-      "android/support/v4/app/ActionBarDrawerToggle$Delegate": "androidx/app/legacy/ActionBarDrawerToggle$Delegate",
-      "android/support/graphics/drawable/AnimationUtilsCompat": "androidx/graphics/drawable/AnimationUtilsCompat",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$ShuffleAction": "androidx/leanback/widget/PlaybackControlsRow$ShuffleAction",
-      "android/support/v4/app/JobIntentService$JobServiceEngineImpl$WrapperWorkItem": "androidx/app/JobIntentService$JobServiceEngineImpl$WrapperWorkItem",
-      "android/support/v7/media/SystemMediaRouteProvider$SyncCallback": "androidx/media/SystemMediaRouteProvider$SyncCallback",
-      "android/support/v7/util/AsyncListUtil$ViewCallback": "androidx/util/AsyncListUtil$ViewCallback",
-      "android/support/v4/view/ViewPager$OnAdapterChangeListener": "androidx/view/ViewPager$OnAdapterChangeListener",
-      "android/support/v7/media/RegisteredMediaRouteProviderWatcher": "androidx/media/RegisteredMediaRouteProviderWatcher",
-      "android/support/transition/Fade$FadeAnimatorListener": "androidx/transition/Fade$FadeAnimatorListener",
-      "android/support/v4/content/res/FontResourcesParserCompat$FetchStrategy": "androidx/content/res/FontResourcesParserCompat$FetchStrategy",
-      "android/support/v17/leanback/graphics/FitWidthBitmapDrawable": "androidx/leanback/graphics/FitWidthBitmapDrawable",
-      "android/support/v7/widget/CardViewDelegate": "androidx/widget/CardViewDelegate",
-      "android/support/v4/media/MediaBrowserCompat$ItemCallback": "androidx/media/MediaBrowserCompat$ItemCallback",
-      "android/support/design/widget/BottomSheetDialog": "androidx/design/widget/BottomSheetDialog",
-      "android/support/v17/leanback/system/Settings$Customizations": "androidx/leanback/system/Settings$Customizations",
-      "android/support/design/widget/FloatingActionButtonImpl$InternalVisibilityChangedListener": "androidx/design/widget/FloatingActionButtonImpl$InternalVisibilityChangedListener",
-      "android/support/v7/media/RemotePlaybackClient$SessionActionCallback": "androidx/media/RemotePlaybackClient$SessionActionCallback",
-      "android/support/wear/ambient/AmbientDelegate$AmbientCallback": "androidx/wear/ambient/AmbientDelegate$AmbientCallback",
-      "android/support/v4/widget/FocusStrategy$BoundsAdapter": "androidx/widget/FocusStrategy$BoundsAdapter",
-      "android/support/v17/leanback/widget/DividerPresenter": "androidx/leanback/widget/DividerPresenter",
-      "android/support/text/emoji/EmojiProcessor$GlyphChecker": "androidx/text/emoji/EmojiProcessor$GlyphChecker",
-      "android/support/v7/preference/PreferenceFragmentCompat": "androidx/preference/PreferenceFragmentCompat",
-      "android/support/v7/widget/TooltipPopup": "androidx/widget/TooltipPopup",
-      "android/support/v4/view/accessibility/AccessibilityNodeProviderCompat": "androidx/view/accessibility/AccessibilityNodeProviderCompat",
-      "android/support/v4/media/MediaBrowserCompat$SearchCallback": "androidx/media/MediaBrowserCompat$SearchCallback",
-      "android/support/v4/media/session/IMediaControllerCallback": "androidx/media/session/IMediaControllerCallback",
-      "android/support/compat/R$styleable": "androidx/compat/R$styleable",
-      "android/support/v7/view/menu/MenuBuilder$ItemInvoker": "androidx/view/menu/MenuBuilder$ItemInvoker",
-      "android/support/v17/leanback/widget/MultiActionsProvider$MultiAction": "androidx/leanback/widget/MultiActionsProvider$MultiAction",
-      "android/support/v7/gridlayout/R$dimen": "androidx/gridlayout/R$dimen",
-      "android/support/v4/app/FragmentManagerImpl$FragmentTag": "androidx/app/FragmentManagerImpl$FragmentTag",
-      "android/support/v4/media/MediaDescriptionCompat$Builder": "androidx/media/MediaDescriptionCompat$Builder",
-      "android/support/v17/leanback/widget/PlaybackControlsPresenter$BoundData": "androidx/leanback/widget/PlaybackControlsPresenter$BoundData",
-      "android/support/v7/app/MediaRouteChooserDialog$RouteComparator": "androidx/app/MediaRouteChooserDialog$RouteComparator",
-      "android/support/v7/app/ActionBar": "androidx/app/ActionBar",
-      "android/support/design/widget/HeaderBehavior$FlingRunnable": "androidx/design/widget/HeaderBehavior$FlingRunnable",
-      "android/support/v7/widget/GapWorker$Task": "androidx/widget/GapWorker$Task",
-      "android/support/v4/view/AsyncLayoutInflater$InflateThread": "androidx/view/AsyncLayoutInflater$InflateThread",
-      "android/support/v17/leanback/R$string": "androidx/leanback/R$string",
-      "android/support/v4/content/LocalBroadcastManager$BroadcastRecord": "androidx/content/LocalBroadcastManager$BroadcastRecord",
-      "android/support/wear/widget/drawer/AbsListViewFlingWatcher": "androidx/wear/widget/drawer/AbsListViewFlingWatcher",
-      "android/support/v17/leanback/widget/ActionPresenterSelector$ActionViewHolder": "androidx/leanback/widget/ActionPresenterSelector$ActionViewHolder",
-      "android/support/v17/leanback/widget/ImageCardView": "androidx/leanback/widget/ImageCardView",
-      "android/support/v4/app/AlarmManagerCompat": "androidx/app/AlarmManagerCompat",
-      "android/support/v7/app/MediaRouterThemeHelper$ControllerColorType": "androidx/app/MediaRouterThemeHelper$ControllerColorType",
-      "android/support/v4/widget/SlidingPaneLayout$SlidingPanelLayoutImplBase": "androidx/widget/SlidingPaneLayout$SlidingPanelLayoutImplBase",
-      "android/support/v4/view/WindowCompat": "androidx/view/WindowCompat",
-      "android/support/v7/widget/ThemedSpinnerAdapter$Helper": "androidx/widget/ThemedSpinnerAdapter$Helper",
-      "android/support/v4/media/session/MediaControllerCompat$Callback$StubCompat": "androidx/media/session/MediaControllerCompat$Callback$StubCompat",
-      "android/support/v4/widget/NestedScrollView$AccessibilityDelegate": "androidx/widget/NestedScrollView$AccessibilityDelegate",
-      "android/support/annotation/MainThread": "androidx/annotation/MainThread",
-      "android/support/v17/leanback/app/RowsFragment$RowViewHolderExtra": "androidx/leanback/app/RowsFragment$RowViewHolderExtra",
-      "android/support/v17/leanback/widget/MultiActionsProvider": "androidx/leanback/widget/MultiActionsProvider",
-      "android/support/v7/mediarouter/R$id": "androidx/mediarouter/R$id",
-      "android/support/v4/view/ViewCompat$NestedScrollType": "androidx/view/legacy/ViewCompat$NestedScrollType",
-      "android/support/v4/text/TextDirectionHeuristicsCompat$TextDirectionAlgorithm": "androidx/text/TextDirectionHeuristicsCompat$TextDirectionAlgorithm",
-      "android/support/v4/media/session/MediaControllerCompatApi21$CallbackProxy": "androidx/media/session/MediaControllerCompatApi21$CallbackProxy",
-      "android/support/customtabs/TrustedWebUtils": "androidx/browser/customtabs/TrustedWebUtils",
-      "android/support/v4/text/BidiFormatter$Builder": "androidx/text/BidiFormatter$Builder",
-      "android/support/design/widget/TabLayout$TabView": "androidx/design/widget/TabLayout$TabView",
-      "android/support/wear/internal/widget/drawer/SinglePageUi$OnSelectedClickHandler": "androidx/wear/internal/widget/drawer/SinglePageUi$OnSelectedClickHandler",
-      "android/support/v17/leanback/widget/BrowseFrameLayout": "androidx/leanback/widget/BrowseFrameLayout",
-      "android/support/v4/widget/ImageViewCompat$BaseViewCompatImpl": "androidx/widget/ImageViewCompat$BaseViewCompatImpl",
-      "android/support/customtabs/PostMessageService": "androidx/browser/customtabs/PostMessageService",
-      "android/support/annotation/FontRes": "androidx/annotation/FontRes",
-      "android/support/transition/ViewGroupUtilsApi14": "androidx/transition/ViewGroupUtilsApi14",
-      "android/support/v4/view/ViewParentCompat": "androidx/view/ViewParentCompat",
-      "android/support/v17/leanback/widget/SectionRow": "androidx/leanback/widget/SectionRow",
-      "android/support/v7/preference/DropDownPreference": "androidx/preference/DropDownPreference",
-      "android/support/v4/widget/DrawerLayout$SavedState": "androidx/widget/DrawerLayout$SavedState",
-      "android/support/transition/AnimatorUtilsApi14": "androidx/transition/AnimatorUtilsApi14",
-      "android/support/transition/AnimatorUtilsApi19": "androidx/transition/AnimatorUtilsApi19",
-      "android/support/constraint/solver/widgets/ConstraintAnchor$Strength": "androidx/constraint/solver/widgets/ConstraintAnchor$Strength",
-      "android/support/v7/widget/RecyclerView$SmoothScroller": "androidx/widget/RecyclerView$SmoothScroller",
-      "android/support/design/R$drawable": "androidx/design/R$drawable",
-      "android/support/v7/util/BatchingListUpdateCallback": "androidx/util/BatchingListUpdateCallback",
-      "android/support/v17/leanback/app/BrandedSupportFragment": "androidx/leanback/app/BrandedSupportFragment",
-      "android/support/transition/ViewGroupUtilsApi18": "androidx/transition/ViewGroupUtilsApi18",
-      "android/support/v17/leanback/app/BrowseFragment$FragmentHost": "androidx/leanback/app/BrowseFragment$FragmentHost",
-      "android/support/v17/leanback/widget/MediaNowPlayingView": "androidx/leanback/widget/MediaNowPlayingView",
-      "android/support/v4/app/ActivityCompat$PermissionCompatDelegate": "androidx/app/legacy/ActivityCompat$PermissionCompatDelegate",
-      "android/support/v7/app/ActionBar$TabListener": "androidx/app/ActionBar$TabListener",
-      "android/support/design/widget/CoordinatorLayout$HierarchyChangeListener": "androidx/design/widget/CoordinatorLayout$HierarchyChangeListener",
-      "android/support/v7/app/AppCompatDelegateImplV9": "androidx/app/AppCompatDelegateImplV9",
-      "android/support/v4/app/LoaderManager$LoaderCallbacks": "androidx/app/LoaderManager$LoaderCallbacks",
-      "android/support/v4/view/MenuItemCompat$MenuItemCompatBaseImpl": "androidx/view/MenuItemCompat$MenuItemCompatBaseImpl",
-      "android/support/design/widget/BaseTransientBottomBar$SnackbarBaseLayout": "androidx/design/widget/BaseTransientBottomBar$SnackbarBaseLayout",
-      "android/support/text/emoji/EmojiCompat$CompatInternal19": "androidx/text/emoji/EmojiCompat$CompatInternal19",
-      "android/support/wear/R$fraction": "androidx/wear/R$fraction",
-      "android/support/v7/widget/DividerItemDecoration": "androidx/widget/DividerItemDecoration",
-      "android/support/v4/view/MenuItemCompat$OnActionExpandListener": "androidx/view/MenuItemCompat$OnActionExpandListener",
-      "android/support/v4/widget/SlidingPaneLayout$SlidingPanelLayoutImpl": "androidx/widget/SlidingPaneLayout$SlidingPanelLayoutImpl",
-      "android/support/v4/graphics/PathParser$ExtractFloatResult": "androidx/graphics/PathParser$ExtractFloatResult",
-      "android/support/graphics/drawable/ArgbEvaluator": "androidx/graphics/drawable/ArgbEvaluator",
-      "android/support/v17/leanback/widget/ShadowHelper": "androidx/leanback/widget/ShadowHelper",
-      "android/support/design/widget/FloatingActionButtonImpl$ElevateToTranslationZAnimation": "androidx/design/widget/FloatingActionButtonImpl$ElevateToTranslationZAnimation",
-      "android/support/v4/app/NotificationManagerCompat$SideChannelManager": "androidx/app/NotificationManagerCompat$SideChannelManager",
-      "android/support/v17/leanback/widget/PlaybackRowPresenter$ViewHolder": "androidx/leanback/widget/PlaybackRowPresenter$ViewHolder",
-      "android/support/v17/leanback/media/PlaybackBaseControlGlue": "androidx/leanback/media/PlaybackBaseControlGlue",
-      "android/support/v7/app/MediaRouteButton": "androidx/app/MediaRouteButton",
-      "android/support/v4/view/PagerTabStrip": "androidx/widget/PagerTabStrip",
-      "android/support/v7/widget/ActivityChooserView$InnerLayout": "androidx/widget/ActivityChooserView$InnerLayout",
-      "android/support/v17/leanback/widget/TitleHelper": "androidx/leanback/widget/TitleHelper",
-      "android/support/v7/media/RegisteredMediaRouteProvider": "androidx/media/RegisteredMediaRouteProvider",
-      "android/support/v4/print/PrintHelper$PrintHelperStub": "androidx/print/PrintHelper$PrintHelperStub",
-      "android/support/v7/media/MediaRouter": "androidx/media/MediaRouter",
-      "android/support/v4/widget/ViewDragHelper": "androidx/widget/ViewDragHelper",
-      "android/support/v4/media/MediaBrowserCompat$MediaItem": "androidx/media/MediaBrowserCompat$MediaItem",
-      "android/support/app/recommendation/ContentRecommendation$ContentMaturity": "androidx/app/recommendation/ContentRecommendation$ContentMaturity",
-      "android/support/v7/widget/SwitchCompat": "androidx/widget/SwitchCompat",
-      "android/support/v7/media/MediaSessionStatus": "androidx/media/MediaSessionStatus",
-      "android/support/v17/leanback/widget/picker/Picker$PickerScrollArrayAdapter": "androidx/leanback/widget/picker/Picker$PickerScrollArrayAdapter",
-      "android/support/v4/util/Pools": "androidx/util/Pools",
-      "android/support/v4/widget/SlidingPaneLayout$SavedState": "androidx/widget/SlidingPaneLayout$SavedState",
-      "android/support/v7/widget/ViewStubCompat$OnInflateListener": "androidx/widget/ViewStubCompat$OnInflateListener",
-      "android/support/design/widget/ViewOffsetHelper": "androidx/design/widget/ViewOffsetHelper",
-      "android/support/design/widget/FloatingActionButton$OnVisibilityChangedListener": "androidx/design/widget/FloatingActionButton$OnVisibilityChangedListener",
-      "android/support/v4/app/FragmentManagerImpl$PopBackStackState": "androidx/app/FragmentManagerImpl$PopBackStackState",
-      "android/support/v7/media/MediaRouterJellybeanMr1$ActiveScanWorkaround": "androidx/media/MediaRouterJellybeanMr1$ActiveScanWorkaround",
-      "android/support/v17/leanback/widget/TitleViewAdapter": "androidx/leanback/widget/TitleViewAdapter",
-      "android/support/design/widget/TabLayout": "androidx/design/widget/TabLayout",
-      "android/support/v4/view/MenuItemCompat$MenuVersionImpl": "androidx/view/MenuItemCompat$MenuVersionImpl",
-      "android/support/v7/app/MediaRouteButton$MediaRouterCallback": "androidx/app/MediaRouteButton$MediaRouterCallback",
-      "android/support/v4/media/MediaDescriptionCompatApi21$Builder": "androidx/media/MediaDescriptionCompatApi21$Builder",
-      "android/support/design/widget/TabLayout$TabGravity": "androidx/design/widget/TabLayout$TabGravity",
-      "android/support/v17/leanback/widget/AbstractDetailsDescriptionPresenter": "androidx/leanback/widget/AbstractDetailsDescriptionPresenter",
-      "android/support/v7/widget/RecyclerView$RecycledViewPool$ScrapData": "androidx/widget/RecyclerView$RecycledViewPool$ScrapData",
-      "android/support/v17/leanback/media/MediaControllerAdapter": "androidx/leanback/media/MediaControllerAdapter",
-      "android/support/wear/internal/widget/drawer/MultiPagePresenter$Ui": "androidx/wear/internal/widget/drawer/MultiPagePresenter$Ui",
-      "android/support/v7/app/ToolbarActionBar": "androidx/app/ToolbarActionBar",
-      "android/support/v7/widget/ViewBoundsCheck$Callback": "androidx/widget/ViewBoundsCheck$Callback",
-      "android/support/text/emoji/widget/EmojiExtractEditText": "androidx/text/emoji/widget/EmojiExtractEditText",
-      "android/support/v4/app/FrameMetricsAggregator": "androidx/app/FrameMetricsAggregator",
-      "android/support/constraint/R": "androidx/constraint/R",
-      "android/support/v7/mediarouter/R$string": "androidx/mediarouter/R$string",
-      "android/support/text/emoji/bundled/BundledEmojiCompatConfig$InitRunnable": "androidx/text/emoji/bundled/BundledEmojiCompatConfig$InitRunnable",
-      "android/support/v17/leanback/transition/TransitionHelper$TransitionHelperApi21Impl": "androidx/leanback/transition/TransitionHelper$TransitionHelperApi21Impl",
-      "android/support/v7/widget/LinearLayoutManager": "androidx/widget/LinearLayoutManager",
-      "android/support/graphics/drawable/VectorDrawableCompat$VGroup": "androidx/graphics/drawable/VectorDrawableCompat$VGroup",
-      "android/support/v17/leanback/app/BackgroundManager": "androidx/leanback/app/BackgroundManager",
-      "android/support/v17/leanback/app/VideoFragmentGlueHost": "androidx/leanback/app/VideoFragmentGlueHost",
-      "android/support/v4/net/ConnectivityManagerCompat": "androidx/net/ConnectivityManagerCompat",
-      "android/support/annotation/NonNull": "androidx/annotation/NonNull",
-      "android/support/transition/ImageViewUtilsApi21": "androidx/transition/ImageViewUtilsApi21",
-      "android/support/v7/widget/Toolbar$SavedState": "androidx/widget/Toolbar$SavedState",
-      "android/support/v7/util/ThreadUtil$BackgroundCallback": "androidx/util/ThreadUtil$BackgroundCallback",
-      "android/support/v17/leanback/app/BaseFragment": "androidx/leanback/app/BaseFragment",
-      "android/support/v4/view/AccessibilityDelegateCompat$AccessibilityDelegateApi16Impl": "androidx/view/AccessibilityDelegateCompat$AccessibilityDelegateApi16Impl",
-      "android/support/v7/media/MediaRouterJellybeanMr2$UserRouteInfo": "androidx/media/MediaRouterJellybeanMr2$UserRouteInfo",
-      "android/support/v7/widget/DefaultItemAnimator$ChangeInfo": "androidx/widget/DefaultItemAnimator$ChangeInfo",
-      "android/support/v4/hardware/display/DisplayManagerCompat$DisplayManagerCompatApi14Impl": "androidx/hardware/display/DisplayManagerCompat$DisplayManagerCompatApi14Impl",
-      "android/support/v7/cardview/R": "androidx/cardview/R",
-      "android/support/v4/app/NotificationCompat": "androidx/app/NotificationCompat",
-      "android/support/v17/leanback/transition/TransitionHelper$TransitionHelperKitkatImpl": "androidx/leanback/transition/TransitionHelper$TransitionHelperKitkatImpl",
-      "android/support/v4/widget/CircularProgressDrawable$Ring": "androidx/widget/CircularProgressDrawable$Ring",
-      "android/support/v17/leanback/app/BrowseSupportFragment$ListRowFragmentFactory": "androidx/leanback/app/BrowseSupportFragment$ListRowFragmentFactory",
-      "android/support/v7/widget/LinearLayoutManager$AnchorInfo": "androidx/widget/LinearLayoutManager$AnchorInfo",
-      "android/support/v4/media/MediaBrowserCompatApi26$SubscriptionCallbackProxy": "androidx/media/MediaBrowserCompatApi26$SubscriptionCallbackProxy",
-      "android/support/v4/view/ViewCompat$ViewCompatApi19Impl": "androidx/view/legacy/ViewCompat$ViewCompatApi19Impl",
-      "android/support/v4/view/accessibility/AccessibilityNodeInfoCompat": "androidx/view/accessibility/AccessibilityNodeInfoCompat",
-      "android/support/v4/os/IResultReceiver$Stub$Proxy": "androidx/os/IResultReceiver$Stub$Proxy",
-      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter$BoundData": "androidx/leanback/widget/PlaybackTransportRowPresenter$BoundData",
-      "android/support/transition/TransitionSet": "androidx/transition/TransitionSet",
-      "android/support/v7/graphics/drawable/DrawableWrapper": "androidx/graphics/drawable/DrawableWrapper",
-      "android/support/v7/media/MediaRouterJellybean$UserRouteInfo": "androidx/media/MediaRouterJellybean$UserRouteInfo",
-      "android/support/v7/app/MediaRouteActionProvider": "androidx/app/MediaRouteActionProvider",
-      "android/support/compat/R$layout": "androidx/compat/R$layout",
-      "android/support/v17/leanback/widget/ViewHolderTask": "androidx/leanback/widget/ViewHolderTask",
-      "android/support/v7/graphics/ColorCutQuantizer$Vbox": "androidx/graphics/ColorCutQuantizer$Vbox",
-      "android/support/text/emoji/EmojiProcessor$CodepointIndexFinder": "androidx/text/emoji/EmojiProcessor$CodepointIndexFinder",
-      "android/support/v4/content/CursorLoader": "androidx/content/CursorLoader",
-      "android/support/text/emoji/widget/EditTextAttributeHelper": "androidx/text/emoji/widget/EditTextAttributeHelper",
-      "android/support/wear/internal/widget/ResourcesUtil": "androidx/wear/internal/widget/ResourcesUtil",
-      "android/support/wear/R$array": "androidx/wear/R$array",
-      "android/support/v7/widget/RecyclerView$RecycledViewPool": "androidx/widget/RecyclerView$RecycledViewPool",
-      "android/support/transition/ImageViewUtilsApi14": "androidx/transition/ImageViewUtilsApi14",
-      "android/support/v7/gridlayout/R": "androidx/gridlayout/R",
-      "android/support/text/emoji/FontRequestEmojiCompatConfig": "androidx/text/emoji/FontRequestEmojiCompatConfig",
-      "android/support/text/emoji/EmojiMetadata": "androidx/text/emoji/EmojiMetadata",
-      "android/support/v4/widget/SlidingPaneLayout$DisableLayerRunnable": "androidx/widget/SlidingPaneLayout$DisableLayerRunnable",
-      "android/support/v4/util/Pools$SynchronizedPool": "androidx/util/Pools$SynchronizedPool",
-      "android/support/v17/leanback/graphics/BoundsRule$ValueRule": "androidx/leanback/graphics/BoundsRule$ValueRule",
-      "android/support/v7/widget/ActivityChooserView$ActivityChooserViewAdapter": "androidx/widget/ActivityChooserView$ActivityChooserViewAdapter",
-      "android/support/v7/mediarouter/R": "androidx/mediarouter/R",
-      "android/support/text/emoji/FontRequestEmojiCompatConfig$ExponentialBackoffRetryPolicy": "androidx/text/emoji/FontRequestEmojiCompatConfig$ExponentialBackoffRetryPolicy",
-      "android/support/v7/widget/AppCompatImageView": "androidx/widget/AppCompatImageView",
-      "android/support/v17/preference/R$layout": "androidx/leanback/preference/R$layout",
-      "android/support/v4/provider/FontsContractCompat$FontFamilyResult$FontResultStatus": "androidx/provider/FontsContractCompat$FontFamilyResult$FontResultStatus",
-      "android/support/graphics/drawable/VectorDrawableCompat$VPathRenderer": "androidx/graphics/drawable/VectorDrawableCompat$VPathRenderer",
-      "android/support/v4/app/JobIntentService$CompatWorkEnqueuer": "androidx/app/JobIntentService$CompatWorkEnqueuer",
-      "android/support/v17/leanback/app/BrowseSupportFragment$SetSelectionRunnable": "androidx/leanback/app/BrowseSupportFragment$SetSelectionRunnable",
-      "android/support/v4/media/MediaDescriptionCompatApi23$Builder": "androidx/media/MediaDescriptionCompatApi23$Builder",
-      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter": "androidx/leanback/widget/DetailsOverviewRowPresenter",
-      "android/support/text/emoji/FontRequestEmojiCompatConfig$RetryPolicy": "androidx/text/emoji/FontRequestEmojiCompatConfig$RetryPolicy",
-      "android/support/v7/widget/ScrollingTabContainerView$TabView": "androidx/widget/ScrollingTabContainerView$TabView",
-      "android/support/annotation/DrawableRes": "androidx/annotation/DrawableRes",
-      "android/support/v4/view/ViewPager$LayoutParams": "androidx/view/ViewPager$LayoutParams",
-      "android/support/v17/leanback/widget/MediaItemActionPresenter$ViewHolder": "androidx/leanback/widget/MediaItemActionPresenter$ViewHolder",
-      "android/support/v7/app/AlertDialog$Builder": "androidx/app/AlertDialog$Builder",
-      "android/support/v4/util/Preconditions": "androidx/util/Preconditions",
-      "android/support/v4/app/FragmentTabHost": "androidx/app/FragmentTabHost",
-      "android/support/v17/leanback/widget/BaseGridView$OnTouchInterceptListener": "androidx/leanback/widget/BaseGridView$OnTouchInterceptListener",
-      "android/support/text/emoji/EmojiCompat$ListenerDispatcher": "androidx/text/emoji/EmojiCompat$ListenerDispatcher",
-      "android/support/wear/widget/drawer/WearableActionDrawerMenu$WearableActionDrawerMenuListener": "androidx/wear/widget/drawer/WearableActionDrawerMenu$WearableActionDrawerMenuListener",
-      "android/support/v4/app/INotificationSideChannel$Stub$Proxy": "androidx/app/INotificationSideChannel$Stub$Proxy",
-      "android/support/media/tv/TvContractCompat$Programs$Genres$Genre": "androidx/media/tv/TvContractCompat$Programs$Genres$Genre",
-      "android/support/text/emoji/widget/EmojiTextWatcher$InitCallbackImpl": "androidx/text/emoji/widget/EmojiTextWatcher$InitCallbackImpl",
-      "android/support/v17/leanback/widget/ParallaxTarget$DirectPropertyTarget": "androidx/leanback/widget/ParallaxTarget$DirectPropertyTarget",
-      "android/support/v7/app/ToolbarActionBar$ToolbarCallbackWrapper": "androidx/app/ToolbarActionBar$ToolbarCallbackWrapper",
-      "android/support/v4/widget/CompoundButtonCompat": "androidx/widget/CompoundButtonCompat",
-      "android/support/v4/content/ContentResolverCompat": "androidx/content/ContentResolverCompat",
-      "android/support/v17/leanback/widget/NonOverlappingRelativeLayout": "androidx/leanback/widget/NonOverlappingRelativeLayout",
-      "android/support/text/emoji/EmojiCompat$MetadataRepoLoaderCallback": "androidx/text/emoji/EmojiCompat$MetadataRepoLoaderCallback",
-      "android/support/v4/app/FragmentStatePagerAdapter": "androidx/app/FragmentStatePagerAdapter",
-      "android/support/v17/leanback/app/PlaybackSupportFragment": "androidx/leanback/app/PlaybackSupportFragment",
-      "android/support/v7/app/OverlayListView": "androidx/app/OverlayListView",
-      "android/support/v7/mediarouter/R$styleable": "androidx/mediarouter/R$styleable",
-      "android/support/v7/widget/DrawableUtils": "androidx/widget/DrawableUtils",
-      "android/support/v4/content/ModernAsyncTask$AsyncTaskResult": "androidx/content/ModernAsyncTask$AsyncTaskResult",
-      "android/support/v4/app/SharedElementCallback": "androidx/app/SharedElementCallback",
-      "android/support/text/emoji/widget/EmojiKeyListener": "androidx/text/emoji/widget/EmojiKeyListener",
-      "android/support/v17/leanback/transition/FadeAndShortSlide$CalculateSlide": "androidx/leanback/transition/FadeAndShortSlide$CalculateSlide",
-      "android/support/v7/widget/ActionMenuPresenter$ActionButtonSubmenu": "androidx/widget/ActionMenuPresenter$ActionButtonSubmenu",
-      "android/support/v4/media/MediaMetadataCompat$Builder": "androidx/media/MediaMetadataCompat$Builder",
-      "android/support/design/widget/BottomSheetBehavior$SavedState": "androidx/design/widget/BottomSheetBehavior$SavedState",
-      "android/support/v4/media/session/MediaControllerCompatApi21$PlaybackInfo": "androidx/media/session/MediaControllerCompatApi21$PlaybackInfo",
-      "android/support/v7/widget/ActionMenuPresenter$PopupPresenterCallback": "androidx/widget/ActionMenuPresenter$PopupPresenterCallback",
-      "android/support/media/ExifInterface$ByteOrderedDataOutputStream": "androidx/media/ExifInterface$ByteOrderedDataOutputStream",
-      "android/support/v17/leanback/widget/Grid$Location": "androidx/leanback/widget/Grid$Location",
-      "android/support/v7/media/MediaRouterJellybeanMr1$CallbackProxy": "androidx/media/MediaRouterJellybeanMr1$CallbackProxy",
-      "android/support/v17/leanback/R$raw": "androidx/leanback/R$raw",
-      "android/support/media/tv/TvContractCompat$PreviewProgramColumns": "androidx/media/tv/TvContractCompat$PreviewProgramColumns",
-      "android/support/v17/leanback/widget/SeekBar$AccessibilitySeekListener": "androidx/leanback/widget/SeekBar$AccessibilitySeekListener",
-      "android/support/v4/print/PrintHelper$PrintHelperVersionImpl": "androidx/print/PrintHelper$PrintHelperVersionImpl",
-      "android/support/v17/leanback/app/ProgressBarManager": "androidx/leanback/app/ProgressBarManager",
-      "android/support/v7/app/MediaRouteChooserDialogFragment": "androidx/app/MediaRouteChooserDialogFragment",
-      "android/support/v4/content/FileProvider$SimplePathStrategy": "androidx/content/FileProvider$SimplePathStrategy",
-      "android/support/v17/leanback/app/BackgroundManager$BackgroundContinuityService": "androidx/leanback/app/BackgroundManager$BackgroundContinuityService",
-      "android/support/v4/media/session/IMediaSession$Stub": "androidx/media/session/IMediaSession$Stub",
-      "android/support/v4/widget/TintableImageSourceView": "androidx/widget/TintableImageSourceView",
-      "android/support/transition/ViewOverlayApi14$OverlayViewGroup": "androidx/transition/ViewOverlayApi14$OverlayViewGroup",
-      "android/support/design/widget/FloatingActionButtonImpl": "androidx/design/widget/FloatingActionButtonImpl",
-      "android/support/text/emoji/widget/EmojiEditableFactory": "androidx/text/emoji/widget/EmojiEditableFactory",
-      "android/support/transition/Visibility$Mode": "androidx/transition/Visibility$Mode",
-      "android/support/v17/leanback/widget/PagingIndicator$Dot": "androidx/leanback/widget/PagingIndicator$Dot",
-      "android/support/design/internal/NavigationSubMenu": "androidx/design/internal/NavigationSubMenu",
-      "android/support/v17/leanback/widget/AbstractDetailsDescriptionPresenter$ViewHolder": "androidx/leanback/widget/AbstractDetailsDescriptionPresenter$ViewHolder",
-      "android/support/v4/media/AudioAttributesCompat$AudioManagerHidden": "androidx/media/AudioAttributesCompat$AudioManagerHidden",
-      "android/support/v7/preference/CheckBoxPreference": "androidx/preference/CheckBoxPreference",
-      "android/support/design/widget/FloatingActionButtonLollipop$AlwaysStatefulGradientDrawable": "androidx/design/widget/FloatingActionButtonLollipop$AlwaysStatefulGradientDrawable",
-      "android/support/v4/media/RatingCompat$StarStyle": "androidx/media/RatingCompat$StarStyle",
-      "android/support/v7/preference/PreferenceGroup$PreferencePositionCallback": "androidx/preference/PreferenceGroup$PreferencePositionCallback",
-      "android/support/design/widget/BottomNavigationView": "androidx/design/widget/BottomNavigationView",
-      "android/support/v17/leanback/media/MediaPlayerAdapter": "androidx/leanback/media/MediaPlayerAdapter",
-      "android/support/v7/widget/SuggestionsAdapter$ChildViewCache": "androidx/widget/SuggestionsAdapter$ChildViewCache",
-      "android/support/v4/media/session/MediaSessionCompat$Callback$StubApi21": "androidx/media/session/MediaSessionCompat$Callback$StubApi21",
-      "android/support/v7/widget/ListPopupWindow$PopupScrollListener": "androidx/widget/ListPopupWindow$PopupScrollListener",
-      "android/support/v4/app/NotificationCompat$MessagingStyle": "androidx/app/NotificationCompat$MessagingStyle",
-      "android/support/wear/widget/SwipeDismissLayout$OnSwipeProgressChangedListener": "androidx/wear/widget/SwipeDismissLayout$OnSwipeProgressChangedListener",
-      "android/support/v7/media/RemotePlaybackClient$OnMessageReceivedListener": "androidx/media/RemotePlaybackClient$OnMessageReceivedListener",
-      "android/support/v7/util/MessageThreadUtil$SyncQueueItem": "androidx/util/MessageThreadUtil$SyncQueueItem",
-      "android/support/v4/view/MarginLayoutParamsCompat": "androidx/view/MarginLayoutParamsCompat",
-      "android/support/v4/media/session/MediaSessionCompat$Callback$StubApi24": "androidx/media/session/MediaSessionCompat$Callback$StubApi24",
-      "android/support/v17/leanback/widget/CheckableImageView": "androidx/leanback/widget/CheckableImageView",
-      "android/support/v4/media/session/MediaSessionCompat$Callback$StubApi23": "androidx/media/session/MediaSessionCompat$Callback$StubApi23",
-      "android/support/v7/widget/ThemeUtils": "androidx/widget/ThemeUtils",
-      "android/support/v7/preference/Preference$BaseSavedState": "androidx/preference/Preference$BaseSavedState",
-      "android/support/v4/widget/DrawerLayout$AccessibilityDelegate": "androidx/widget/DrawerLayout$AccessibilityDelegate",
-      "android/support/v4/app/ActivityOptionsCompat": "androidx/app/ActivityOptionsCompat",
-      "android/support/v4/media/session/PlaybackStateCompat$State": "androidx/media/session/PlaybackStateCompat$State",
-      "android/support/v7/widget/RecyclerView$ItemAnimator$ItemHolderInfo": "androidx/widget/RecyclerView$ItemAnimator$ItemHolderInfo",
-      "android/support/constraint/solver/widgets/ConstraintAnchor$Type": "androidx/constraint/solver/widgets/ConstraintAnchor$Type",
-      "android/support/v4/widget/TextViewCompat$TextViewCompatApi17Impl": "androidx/widget/TextViewCompat$TextViewCompatApi17Impl",
-      "android/support/v17/leanback/widget/ImeKeyMonitor": "androidx/leanback/widget/ImeKeyMonitor",
-      "android/support/v17/leanback/app/BrowseSupportFragment$MainFragmentRowsAdapter": "androidx/leanback/app/BrowseSupportFragment$MainFragmentRowsAdapter",
-      "android/support/v4/app/ActivityCompat": "androidx/app/legacy/ActivityCompat",
-      "android/support/v4/util/ObjectsCompat": "androidx/util/ObjectsCompat",
-      "android/support/v4/app/SupportActivity$ExtraData": "androidx/app/SupportActivity$ExtraData",
-      "android/support/v4/media/MediaBrowserProtocol": "androidx/media/MediaBrowserProtocol",
-      "android/support/design/widget/CollapsingTextHelper": "androidx/design/widget/CollapsingTextHelper",
-      "android/support/v14/preference/SwitchPreference$Listener": "androidx/preference/SwitchPreference$Listener",
-      "android/support/v7/preference/SwitchPreferenceCompat$Listener": "androidx/preference/SwitchPreferenceCompat$Listener",
-      "android/support/wear/internal/widget/drawer/SinglePageUi": "androidx/wear/internal/widget/drawer/SinglePageUi",
-      "android/support/v4/view/NestedScrollingChild2": "androidx/view/NestedScrollingChild2",
-      "android/support/customtabs/ICustomTabsService": "androidx/browser/customtabs/ICustomTabsService",
-      "android/support/text/emoji/widget/EmojiAppCompatTextView": "androidx/text/emoji/widget/EmojiAppCompatTextView",
-      "android/support/v7/media/MediaRouterJellybean$RouteGroup": "androidx/media/MediaRouterJellybean$RouteGroup",
-      "android/support/v4/widget/DrawerLayout": "androidx/widget/DrawerLayout",
-      "android/support/v4/os/CancellationSignal$OnCancelListener": "androidx/os/CancellationSignal$OnCancelListener",
-      "android/support/v4/view/ViewCompat$ViewCompatApi17Impl": "androidx/view/legacy/ViewCompat$ViewCompatApi17Impl",
-      "android/support/v4/app/JobIntentService$CompatJobEngine": "androidx/app/JobIntentService$CompatJobEngine",
-      "android/support/v4/media/MediaBrowserCompat$CustomActionCallback": "androidx/media/MediaBrowserCompat$CustomActionCallback",
-      "android/support/v4/media/app/NotificationCompat$DecoratedMediaCustomViewStyle": "androidx/media/app/NotificationCompat$DecoratedMediaCustomViewStyle",
-      "android/support/v7/app/ActionBarDrawerToggle$Delegate": "androidx/app/ActionBarDrawerToggle$Delegate",
-      "android/support/v17/leanback/R$anim": "androidx/leanback/R$anim",
-      "android/support/v13/app/FragmentCompat$FragmentCompatBaseImpl": "androidx/app/FragmentCompat$FragmentCompatBaseImpl",
-      "android/support/v7/widget/SearchView$OnCloseListener": "androidx/widget/SearchView$OnCloseListener",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$OnPlaybackProgressCallback": "androidx/leanback/widget/PlaybackControlsRow$OnPlaybackProgressCallback",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$MoreActions": "androidx/leanback/widget/PlaybackControlsRow$MoreActions",
-      "android/support/v7/widget/ActivityChooserModel$ActivityResolveInfo": "androidx/widget/ActivityChooserModel$ActivityResolveInfo",
-      "android/support/annotation/AnimRes": "androidx/annotation/AnimRes",
-      "android/support/animation/Force": "androidx/animation/Force",
-      "android/support/v17/leanback/util/StateMachine$Event": "androidx/leanback/util/StateMachine$Event",
-      "android/support/v17/leanback/app/BrowseFragment$MainFragmentRowsAdapter": "androidx/leanback/app/BrowseFragment$MainFragmentRowsAdapter",
-      "android/support/v4/graphics/BitmapCompat": "androidx/graphics/BitmapCompat",
-      "android/support/v4/app/NotificationCompat$NotificationVisibility": "androidx/app/NotificationCompat$NotificationVisibility",
-      "android/support/v17/leanback/app/PlaybackFragment$SetSelectionRunnable": "androidx/leanback/app/PlaybackFragment$SetSelectionRunnable",
-      "android/support/v7/media/RegisteredMediaRouteProviderWatcher$Callback": "androidx/media/RegisteredMediaRouteProviderWatcher$Callback",
-      "android/support/v4/view/ViewCompat$FocusDirection": "androidx/view/legacy/ViewCompat$FocusDirection",
-      "android/support/design/widget/BottomSheetBehavior$SettleRunnable": "androidx/design/widget/BottomSheetBehavior$SettleRunnable",
-      "android/support/v17/leanback/widget/RoundedRectHelperApi21$RoundedRectOutlineProvider": "androidx/leanback/widget/RoundedRectHelperApi21$RoundedRectOutlineProvider",
-      "android/support/wear/widget/drawer/FlingWatcherFactory": "androidx/wear/widget/drawer/FlingWatcherFactory",
-      "android/support/v4/app/NotificationManagerCompat$Task": "androidx/app/NotificationManagerCompat$Task",
-      "android/support/animation/FlingAnimation$DragForce": "androidx/animation/FlingAnimation$DragForce",
-      "android/support/v7/widget/GridLayout$MutableInt": "androidx/widget/GridLayout$MutableInt",
-      "android/support/v7/util/DiffUtil": "androidx/util/DiffUtil",
-      "android/support/v4/app/FragmentManagerImpl$OpGenerator": "androidx/app/FragmentManagerImpl$OpGenerator",
-      "android/support/v4/view/ViewPager": "androidx/widget/ViewPager",
-      "android/support/v7/widget/TintTypedArray": "androidx/widget/TintTypedArray",
-      "android/support/text/emoji/widget/EmojiAppCompatEditText": "androidx/text/emoji/widget/EmojiAppCompatEditText",
-      "android/support/v4/view/ViewGroupCompat$ViewGroupCompatApi21Impl": "androidx/view/ViewGroupCompat$ViewGroupCompatApi21Impl",
-      "android/support/v4/media/MediaBrowserServiceCompat$ConnectionRecord": "androidx/media/MediaBrowserServiceCompat$ConnectionRecord",
-      "android/support/v7/view/menu/ActionMenuItemView": "androidx/view/menu/ActionMenuItemView",
-      "android/support/v4/app/NotificationCompatExtras": "androidx/app/NotificationCompatExtras",
-      "android/support/v7/view/menu/ListMenuPresenter": "androidx/view/menu/ListMenuPresenter",
-      "android/support/v14/preference/R": "androidx/preference/R",
-      "android/support/annotation/RequiresPermission": "androidx/annotation/RequiresPermission",
-      "android/support/v4/app/JobIntentService$GenericWorkItem": "androidx/app/JobIntentService$GenericWorkItem",
-      "android/support/v7/widget/RecyclerView$SmoothScroller$Action": "androidx/widget/RecyclerView$SmoothScroller$Action",
-      "android/support/design/R$attr": "androidx/design/R$attr",
-      "android/support/v4/content/SharedPreferencesCompat$EditorCompat$Helper": "androidx/content/SharedPreferencesCompat$EditorCompat$Helper",
-      "android/support/constraint/solver/widgets/ConstraintWidget": "androidx/constraint/solver/widgets/ConstraintWidget",
-      "android/support/design/widget/NavigationView": "androidx/design/widget/NavigationView",
-      "android/support/v4/media/session/PlaybackStateCompatApi22": "androidx/media/session/PlaybackStateCompatApi22",
-      "android/support/v4/media/session/PlaybackStateCompatApi21": "androidx/media/session/PlaybackStateCompatApi21",
-      "android/support/media/instantvideo/preload/InstantVideoPreloadManager$InternalVideoPreloaderFactory": "androidx/media/instantvideo/preload/InstantVideoPreloadManager$InternalVideoPreloaderFactory",
-      "android/support/design/widget/BaseTransientBottomBar": "androidx/design/widget/BaseTransientBottomBar",
-      "android/support/wear/internal/widget/drawer/WearableNavigationDrawerPresenter": "androidx/wear/internal/widget/drawer/WearableNavigationDrawerPresenter",
-      "android/support/v4/media/session/MediaControllerCompat$Callback$StubApi21": "androidx/media/session/MediaControllerCompat$Callback$StubApi21",
-      "android/support/wear/widget/drawer/ScrollViewFlingWatcher": "androidx/wear/widget/drawer/ScrollViewFlingWatcher",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$FastForwardAction": "androidx/leanback/widget/PlaybackControlsRow$FastForwardAction",
-      "android/support/v7/widget/ActionBarOverlayLayout": "androidx/widget/ActionBarOverlayLayout",
-      "android/support/v4/app/FragmentTabHost$TabInfo": "androidx/app/FragmentTabHost$TabInfo",
-      "android/support/v7/widget/GridLayout$Bounds": "androidx/widget/GridLayout$Bounds",
-      "android/support/v7/app/ActionBar$OnMenuVisibilityListener": "androidx/app/ActionBar$OnMenuVisibilityListener",
-      "android/support/customtabs/PostMessageServiceConnection": "androidx/browser/customtabs/PostMessageServiceConnection",
-      "android/support/design/widget/TextInputLayout$TextInputAccessibilityDelegate": "androidx/design/widget/TextInputLayout$TextInputAccessibilityDelegate",
-      "android/support/v7/preference/Preference$OnPreferenceClickListener": "androidx/preference/Preference$OnPreferenceClickListener",
-      "android/support/v7/media/MediaRouterJellybean$RouteCategory": "androidx/media/MediaRouterJellybean$RouteCategory",
-      "android/support/v4/text/TextDirectionHeuristicCompat": "androidx/text/TextDirectionHeuristicCompat",
-      "android/support/v4/view/PointerIconCompat": "androidx/view/PointerIconCompat",
-      "android/support/design/internal/NavigationMenuPresenter$NavigationMenuAdapter": "androidx/design/internal/NavigationMenuPresenter$NavigationMenuAdapter",
-      "android/support/v17/leanback/widget/BaseCardView$AnimationBase": "androidx/leanback/widget/BaseCardView$AnimationBase",
-      "android/support/v7/widget/ScrollingTabContainerView": "androidx/widget/ScrollingTabContainerView",
-      "android/support/v4/text/util/LinkifyCompat": "androidx/text/util/LinkifyCompat",
-      "android/support/annotation/RequiresPermission$Read": "androidx/annotation/RequiresPermission$Read",
-      "android/support/customtabs/CustomTabsService$Result": "androidx/browser/customtabs/CustomTabsService$Result",
-      "android/support/v7/app/MediaRouteControllerDialog": "androidx/app/MediaRouteControllerDialog",
-      "android/support/v17/leanback/app/BrowseFragment": "androidx/leanback/app/BrowseFragment",
-      "android/support/v17/leanback/widget/OnChildViewHolderSelectedListener": "androidx/leanback/widget/OnChildViewHolderSelectedListener",
-      "android/support/design/internal/NavigationMenuPresenter$SubheaderViewHolder": "androidx/design/internal/NavigationMenuPresenter$SubheaderViewHolder",
-      "android/support/v7/mediarouter/R$attr": "androidx/mediarouter/R$attr",
-      "android/support/v7/widget/ActivityChooserView$Callbacks": "androidx/widget/ActivityChooserView$Callbacks",
-      "android/support/v4/widget/TextViewCompat$TextViewCompatApi16Impl": "androidx/widget/TextViewCompat$TextViewCompatApi16Impl",
-      "android/support/v4/content/AsyncTaskLoader$LoadTask": "androidx/content/AsyncTaskLoader$LoadTask",
-      "android/support/v17/leanback/widget/GuidedActionAdapter$ActionOnFocusListener": "androidx/leanback/widget/GuidedActionAdapter$ActionOnFocusListener",
-      "android/support/v7/media/SystemMediaRouteProvider$LegacyImpl": "androidx/media/SystemMediaRouteProvider$LegacyImpl",
-      "android/support/transition/ViewUtils": "androidx/transition/ViewUtils",
-      "android/support/v17/leanback/app/RowsSupportFragment$RowViewHolderExtra": "androidx/leanback/app/RowsSupportFragment$RowViewHolderExtra",
-      "android/support/v17/leanback/widget/ActionPresenterSelector$TwoLineActionPresenter": "androidx/leanback/widget/ActionPresenterSelector$TwoLineActionPresenter",
-      "android/support/v7/recyclerview/R$dimen": "androidx/recyclerview/R$dimen",
-      "android/support/v7/app/TwilightCalculator": "androidx/app/TwilightCalculator",
-      "android/support/v17/leanback/widget/ResizingTextView": "androidx/leanback/widget/ResizingTextView",
-      "android/support/design/widget/ViewUtilsLollipop": "androidx/design/widget/ViewUtilsLollipop",
-      "android/support/media/tv/TvContractCompat$PreviewProgramColumns$Availability": "androidx/media/tv/TvContractCompat$PreviewProgramColumns$Availability",
-      "android/support/v7/media/RemotePlaybackClient$ActionCallback": "androidx/media/RemotePlaybackClient$ActionCallback",
-      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$Listener": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$Listener",
-      "android/support/v4/app/FragmentManagerImpl$AnimatorOnHWLayerIfNeededListener": "androidx/app/FragmentManagerImpl$AnimatorOnHWLayerIfNeededListener",
-      "android/support/v17/leanback/transition/TransitionHelper": "androidx/leanback/transition/TransitionHelper",
-      "android/support/v7/view/SupportActionModeWrapper$CallbackWrapper": "androidx/view/SupportActionModeWrapper$CallbackWrapper",
-      "android/support/v13/app/FragmentStatePagerAdapter": "androidx/app/legacy/FragmentStatePagerAdapter",
-      "android/support/v7/graphics/Palette$PaletteAsyncListener": "androidx/graphics/Palette$PaletteAsyncListener",
-      "android/support/v4/media/MediaBrowserServiceCompat": "androidx/media/MediaBrowserServiceCompat",
-      "android/support/v4/widget/NestedScrollView": "androidx/widget/NestedScrollView",
-      "android/support/v4/media/MediaBrowserCompat$ItemCallback$StubApi23": "androidx/media/MediaBrowserCompat$ItemCallback$StubApi23",
-      "android/support/v4/text/BidiFormatter$DirectionalityEstimator": "androidx/text/BidiFormatter$DirectionalityEstimator",
-      "android/support/text/emoji/FontRequestEmojiCompatConfig$FontRequestMetadataLoader": "androidx/text/emoji/FontRequestEmojiCompatConfig$FontRequestMetadataLoader",
-      "android/support/transition/ChangeClipBounds": "androidx/transition/ChangeClipBounds",
-      "android/support/v7/widget/PositionMap": "androidx/widget/PositionMap",
-      "android/support/v17/leanback/widget/ItemBridgeAdapter$ViewHolder": "androidx/leanback/widget/ItemBridgeAdapter$ViewHolder",
-      "android/support/v7/widget/TintContextWrapper": "androidx/widget/TintContextWrapper",
-      "android/support/v7/widget/MenuItemHoverListener": "androidx/widget/MenuItemHoverListener",
-      "android/support/v4/app/RemoteInputCompatBase": "androidx/app/RemoteInputCompatBase",
-      "android/support/v17/leanback/media/SurfaceHolderGlueHost": "androidx/leanback/media/SurfaceHolderGlueHost",
-      "android/support/v7/widget/LinearLayoutManager$LayoutChunkResult": "androidx/widget/LinearLayoutManager$LayoutChunkResult",
-      "android/support/v7/view/menu/MenuPresenter": "androidx/view/menu/MenuPresenter",
-      "android/support/v7/media/MediaRouterJellybean": "androidx/media/MediaRouterJellybean",
-      "android/support/annotation/ArrayRes": "androidx/annotation/ArrayRes",
-      "android/support/v4/media/session/MediaSessionCompat$ResultReceiverWrapper": "androidx/media/session/MediaSessionCompat$ResultReceiverWrapper",
-      "android/support/v17/leanback/widget/FocusHighlightHelper": "androidx/leanback/widget/FocusHighlightHelper",
-      "android/support/v4/media/session/MediaControllerCompatApi21$TransportControls": "androidx/media/session/MediaControllerCompatApi21$TransportControls",
-      "android/support/v4/media/MediaBrowserCompatApi21$SubscriptionCallbackProxy": "androidx/media/MediaBrowserCompatApi21$SubscriptionCallbackProxy",
-      "android/support/v7/mediarouter/R$dimen": "androidx/mediarouter/R$dimen",
-      "android/support/v4/app/NotificationManagerCompat$CancelTask": "androidx/app/NotificationManagerCompat$CancelTask",
-      "android/support/design/widget/BottomSheetBehavior$BottomSheetCallback": "androidx/design/widget/BottomSheetBehavior$BottomSheetCallback",
-      "android/support/v4/os/LocaleListCompat": "androidx/os/LocaleListCompat",
-      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplBase$MediaServiceConnection": "androidx/media/MediaBrowserCompat$MediaBrowserImplBase$MediaServiceConnection",
-      "android/support/design/internal/BottomNavigationPresenter": "androidx/design/internal/BottomNavigationPresenter",
-      "android/support/v7/view/SupportMenuInflater": "androidx/view/SupportMenuInflater",
-      "android/support/v4/app/ActivityOptionsCompat$ActivityOptionsCompatApi16Impl": "androidx/app/ActivityOptionsCompat$ActivityOptionsCompatApi16Impl",
-      "android/support/transition/AutoTransition": "androidx/transition/AutoTransition",
-      "android/support/v7/widget/RoundRectDrawable": "androidx/widget/RoundRectDrawable",
-      "android/support/graphics/drawable/VectorDrawableCompat$VFullPath": "androidx/graphics/drawable/VectorDrawableCompat$VFullPath",
-      "android/support/v4/widget/ListViewAutoScrollHelper": "androidx/widget/ListViewAutoScrollHelper",
-      "android/support/v4/media/MediaBrowserCompatApi21$MediaItem": "androidx/media/MediaBrowserCompatApi21$MediaItem",
-      "android/support/transition/FloatArrayEvaluator": "androidx/transition/FloatArrayEvaluator",
-      "android/support/design/widget/CollapsingToolbarLayout$OffsetUpdateListener": "androidx/design/widget/CollapsingToolbarLayout$OffsetUpdateListener",
-      "android/support/v7/preference/PreferenceManager$OnPreferenceTreeClickListener": "androidx/preference/PreferenceManager$OnPreferenceTreeClickListener",
-      "android/support/v17/leanback/widget/Parallax": "androidx/leanback/widget/Parallax",
-      "android/support/v4/media/MediaBrowserCompat$ConnectionCallback$StubApi21": "androidx/media/MediaBrowserCompat$ConnectionCallback$StubApi21",
-      "android/support/v4/os/CancellationSignal": "androidx/os/CancellationSignal",
-      "android/support/v17/leanback/media/PlaybackGlue$PlayerCallback": "androidx/leanback/media/PlaybackGlue$PlayerCallback",
-      "android/support/v4/widget/CompoundButtonCompat$CompoundButtonCompatApi21Impl": "androidx/widget/CompoundButtonCompat$CompoundButtonCompatApi21Impl",
-      "android/support/design/internal/BottomNavigationItemView": "androidx/design/internal/BottomNavigationItemView",
-      "android/support/v4/view/ViewGroupCompat$ViewGroupCompatApi18Impl": "androidx/view/ViewGroupCompat$ViewGroupCompatApi18Impl",
-      "android/support/text/emoji/flatbuffer/Struct": "androidx/text/emoji/flatbuffer/Struct",
-      "android/support/v17/leanback/widget/VerticalGridPresenter$VerticalGridItemBridgeAdapter": "androidx/leanback/widget/VerticalGridPresenter$VerticalGridItemBridgeAdapter",
-      "android/support/v4/view/ViewCompat$ViewCompatApi21Impl": "androidx/view/legacy/ViewCompat$ViewCompatApi21Impl",
-      "android/support/v17/leanback/widget/SearchEditText$OnKeyboardDismissListener": "androidx/leanback/widget/SearchEditText$OnKeyboardDismissListener",
-      "android/support/annotation/AttrRes": "androidx/annotation/AttrRes",
-      "android/support/v17/leanback/app/BrowseFragment$FragmentHostImpl": "androidx/leanback/app/BrowseFragment$FragmentHostImpl",
-      "android/support/v4/graphics/PathParser": "androidx/graphics/PathParser",
-      "android/support/v17/leanback/app/BackgroundManager$BitmapDrawable": "androidx/leanback/app/BackgroundManager$BitmapDrawable",
-      "android/support/v4/util/MapCollections$ArrayIterator": "androidx/util/MapCollections$ArrayIterator",
-      "android/support/v4/view/AsyncLayoutInflater": "androidx/view/AsyncLayoutInflater",
-      "android/support/v4/media/MediaBrowserServiceCompat$Result": "androidx/media/MediaBrowserServiceCompat$Result",
-      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImpl": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImpl",
-      "android/support/v17/leanback/app/RowsFragment$MainFragmentAdapter": "androidx/leanback/app/RowsFragment$MainFragmentAdapter",
-      "android/support/v17/internal/widget/OutlineOnlyWithChildrenFrameLayout": "androidx/internal/widget/OutlineOnlyWithChildrenFrameLayout",
-      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplApi21$ExtraSession": "androidx/media/session/MediaSessionCompat$MediaSessionImplApi21$ExtraSession",
-      "android/support/v17/leanback/util/MathUtil": "androidx/leanback/util/MathUtil",
-      "android/support/v4/app/RemoteInputCompatBase$RemoteInput$Factory": "androidx/app/RemoteInputCompatBase$RemoteInput$Factory",
-      "android/support/animation/DynamicAnimation": "androidx/animation/DynamicAnimation",
-      "android/support/transition/Visibility": "androidx/transition/Visibility",
-      "android/support/v4/widget/PopupWindowCompat$PopupWindowCompatApi21Impl": "androidx/widget/PopupWindowCompat$PopupWindowCompatApi21Impl",
-      "android/support/v7/app/AppCompatViewInflater": "androidx/app/AppCompatViewInflater",
-      "android/support/v7/widget/ListPopupWindow$PopupTouchInterceptor": "androidx/widget/ListPopupWindow$PopupTouchInterceptor",
-      "android/support/v4/app/ServiceCompat$StopForegroundFlags": "androidx/app/ServiceCompat$StopForegroundFlags",
-      "android/support/graphics/drawable/VectorDrawableCompat$VClipPath": "androidx/graphics/drawable/VectorDrawableCompat$VClipPath",
-      "android/support/v7/app/MediaRouteControllerDialog$VolumeGroupAdapter": "androidx/app/MediaRouteControllerDialog$VolumeGroupAdapter",
-      "android/support/design/R$style": "androidx/design/R$style",
-      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi26": "androidx/media/MediaBrowserCompat$MediaBrowserImplApi26",
-      "android/support/constraint/R$styleable": "androidx/constraint/R$styleable",
-      "android/support/v7/media/MediaRouterJellybeanMr1$RouteInfo": "androidx/media/MediaRouterJellybeanMr1$RouteInfo",
-      "android/support/v4/widget/CircleImageView$OvalShadow": "androidx/widget/CircleImageView$OvalShadow",
-      "android/support/v7/preference/ListPreferenceDialogFragmentCompat": "androidx/preference/ListPreferenceDialogFragmentCompat",
-      "android/support/v7/preference/PreferenceFragmentCompat$OnPreferenceStartFragmentCallback": "androidx/preference/PreferenceFragmentCompat$OnPreferenceStartFragmentCallback",
-      "android/support/v4/view/PagerTitleStrip$PageListener": "androidx/view/PagerTitleStrip$PageListener",
-      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi21": "androidx/media/MediaBrowserCompat$MediaBrowserImplApi21",
-      "android/support/v7/app/AppCompatDelegate$ApplyableNightMode": "androidx/app/AppCompatDelegate$ApplyableNightMode",
-      "android/support/customtabs/ICustomTabsCallback": "androidx/browser/customtabs/ICustomTabsCallback",
-      "android/support/v17/preference/LeanbackListPreferenceDialogFragment": "androidx/leanback/preference/LeanbackListPreferenceDialogFragment",
-      "android/support/v17/leanback/widget/PresenterSwitcher": "androidx/leanback/widget/PresenterSwitcher",
-      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi23": "androidx/media/MediaBrowserCompat$MediaBrowserImplApi23",
-      "android/support/v17/leanback/widget/ShadowOverlayHelper$Options": "androidx/leanback/widget/ShadowOverlayHelper$Options",
-      "android/support/v4/text/TextDirectionHeuristicsCompat$FirstStrong": "androidx/text/TextDirectionHeuristicsCompat$FirstStrong",
-      "android/support/v7/widget/AppCompatSeekBar": "androidx/widget/AppCompatSeekBar",
-      "android/support/v17/leanback/widget/Util": "androidx/leanback/widget/Util",
-      "android/support/v4/util/MapCollections": "androidx/util/MapCollections",
-      "android/support/v4/widget/NestedScrollView$SavedState": "androidx/widget/NestedScrollView$SavedState",
-      "android/support/v7/widget/SimpleItemAnimator": "androidx/widget/SimpleItemAnimator",
-      "android/support/v4/media/MediaMetadataCompatApi21$Builder": "androidx/media/MediaMetadataCompatApi21$Builder",
-      "android/support/design/widget/DrawableUtils": "androidx/design/widget/DrawableUtils",
-      "android/support/wear/internal/widget/drawer/SinglePagePresenter": "androidx/wear/internal/widget/drawer/SinglePagePresenter",
-      "android/support/v4/app/FragmentContainer": "androidx/app/FragmentContainer",
-      "android/support/v7/media/MediaRouteProviderDescriptor": "androidx/media/MediaRouteProviderDescriptor",
-      "android/support/v4/media/session/PlaybackStateCompat$Actions": "androidx/media/session/PlaybackStateCompat$Actions",
-      "android/support/v14/preference/ListPreferenceDialogFragment": "androidx/preference/ListPreferenceDialogFragment",
-      "android/support/v4/widget/SwipeRefreshLayout$OnChildScrollUpCallback": "androidx/widget/SwipeRefreshLayout$OnChildScrollUpCallback",
-      "android/support/v4/media/AudioAttributesCompatApi21": "androidx/media/AudioAttributesCompatApi21",
-      "android/support/v7/media/MediaRouter$Callback": "androidx/media/MediaRouter$Callback",
-      "android/support/v4/content/pm/ShortcutInfoCompat$Builder": "androidx/content/pm/ShortcutInfoCompat$Builder",
-      "android/support/v7/util/SortedList$BatchedCallback": "androidx/util/SortedList$BatchedCallback",
-      "android/support/v7/cardview/R$style": "androidx/cardview/R$style",
-      "android/support/v7/media/MediaRouter$GlobalMediaRouter$ProviderCallback": "androidx/media/MediaRouter$GlobalMediaRouter$ProviderCallback",
-      "android/support/v4/widget/SimpleCursorAdapter$ViewBinder": "androidx/widget/SimpleCursorAdapter$ViewBinder",
-      "android/support/v7/util/TileList$Tile": "androidx/util/TileList$Tile",
-      "android/support/v17/leanback/widget/ItemBridgeAdapter$AdapterListener": "androidx/leanback/widget/ItemBridgeAdapter$AdapterListener",
-      "android/support/v4/widget/SlidingPaneLayout$DragHelperCallback": "androidx/widget/SlidingPaneLayout$DragHelperCallback",
-      "android/support/v4/media/MediaBrowserCompat$SearchResultReceiver": "androidx/media/MediaBrowserCompat$SearchResultReceiver",
-      "android/support/v17/leanback/widget/PlaybackRowPresenter": "androidx/leanback/widget/PlaybackRowPresenter",
-      "android/support/v7/media/MediaRouteProvider$ProviderMetadata": "androidx/media/MediaRouteProvider$ProviderMetadata",
-      "android/support/text/emoji/flatbuffer/MetadataList": "androidx/text/emoji/flatbuffer/MetadataList",
-      "android/support/v4/provider/TreeDocumentFile": "androidx/provider/TreeDocumentFile",
-      "android/support/v7/media/MediaSessionStatus$Builder": "androidx/media/MediaSessionStatus$Builder",
-      "android/support/text/emoji/widget/EmojiTextWatcher": "androidx/text/emoji/widget/EmojiTextWatcher",
-      "android/support/v17/leanback/app/GuidedStepSupportFragment": "androidx/leanback/app/GuidedStepSupportFragment",
-      "android/support/v17/leanback/widget/BrowseFrameLayout$OnFocusSearchListener": "androidx/leanback/widget/BrowseFrameLayout$OnFocusSearchListener",
-      "android/support/animation/AnimationHandler": "androidx/animation/AnimationHandler",
-      "android/support/wear/widget/drawer/WearableActionDrawerView": "androidx/wear/widget/drawer/WearableActionDrawerView",
-      "android/support/v4/media/MediaBrowserCompat$CustomActionResultReceiver": "androidx/media/MediaBrowserCompat$CustomActionResultReceiver",
-      "android/support/v7/widget/AppCompatSeekBarHelper": "androidx/widget/AppCompatSeekBarHelper",
-      "android/support/v4/widget/SlidingPaneLayout$AccessibilityDelegate": "androidx/widget/SlidingPaneLayout$AccessibilityDelegate",
-      "android/support/v17/leanback/widget/TitleViewAdapter$Provider": "androidx/leanback/widget/TitleViewAdapter$Provider",
-      "android/support/v7/widget/GridLayoutManager$SpanSizeLookup": "androidx/widget/GridLayoutManager$SpanSizeLookup",
-      "android/support/v4/content/res/ResourcesCompat$FontCallback": "androidx/content/res/ResourcesCompat$FontCallback",
-      "android/support/v4/util/CircularArray": "androidx/util/CircularArray",
-      "android/support/v17/leanback/util/StateMachine$State": "androidx/leanback/util/StateMachine$State",
-      "android/support/text/emoji/widget/EmojiTextView": "androidx/text/emoji/widget/EmojiTextView",
-      "android/support/v4/widget/CursorAdapter$MyDataSetObserver": "androidx/widget/CursorAdapter$MyDataSetObserver",
-      "android/support/v4/os/LocaleListCompat$LocaleListCompatBaseImpl": "androidx/os/LocaleListCompat$LocaleListCompatBaseImpl",
-      "android/support/v4/app/TaskStackBuilder$SupportParentable": "androidx/app/TaskStackBuilder$SupportParentable",
-      "android/support/v17/leanback/media/PlaybackControlGlue": "androidx/leanback/media/PlaybackControlGlue",
-      "android/support/v17/leanback/widget/GuidedActionEditText": "androidx/leanback/widget/GuidedActionEditText",
-      "android/support/v4/util/Pools$SimplePool": "androidx/util/Pools$SimplePool",
-      "android/support/v17/leanback/widget/ControlButtonPresenterSelector$ControlButtonPresenter": "androidx/leanback/widget/ControlButtonPresenterSelector$ControlButtonPresenter",
-      "android/support/v17/leanback/widget/PlaybackControlsPresenter$ViewHolder": "androidx/leanback/widget/PlaybackControlsPresenter$ViewHolder",
-      "android/support/wear/widget/drawer/WearableDrawerLayout": "androidx/wear/widget/drawer/WearableDrawerLayout",
-      "android/support/v7/widget/ActionBarContainer": "androidx/widget/ActionBarContainer",
-      "android/support/v7/widget/ShareActionProvider$ShareActivityChooserModelPolicy": "androidx/widget/ShareActionProvider$ShareActivityChooserModelPolicy",
-      "android/support/transition/ObjectAnimatorUtilsApi21": "androidx/transition/ObjectAnimatorUtilsApi21",
-      "android/support/v17/leanback/widget/BaseOnItemViewSelectedListener": "androidx/leanback/widget/BaseOnItemViewSelectedListener",
-      "android/support/v7/widget/StaggeredGridLayoutManager$LayoutParams": "androidx/widget/StaggeredGridLayoutManager$LayoutParams",
-      "android/support/v7/mediarouter/R$interpolator": "androidx/mediarouter/R$interpolator",
-      "android/support/v4/media/VolumeProviderCompatApi21": "androidx/media/VolumeProviderCompatApi21",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$PictureInPictureAction": "androidx/leanback/widget/PlaybackControlsRow$PictureInPictureAction",
-      "android/support/v7/util/MessageThreadUtil": "androidx/util/MessageThreadUtil",
-      "android/support/v4/util/LogWriter": "androidx/util/LogWriter",
-      "android/support/v7/preference/PreferenceDialogFragmentCompat": "androidx/preference/PreferenceDialogFragmentCompat",
-      "android/support/transition/ViewOverlayApi14": "androidx/transition/ViewOverlayApi14",
-      "android/support/v4/graphics/TypefaceCompatUtil": "androidx/graphics/TypefaceCompatUtil",
-      "android/support/media/tv/BasePreviewProgram": "androidx/media/tv/BasePreviewProgram",
-      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder$DetailsOverviewRowListener": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder$DetailsOverviewRowListener",
-      "android/support/v7/widget/AlertDialogLayout": "androidx/widget/AlertDialogLayout",
-      "android/support/v7/widget/ActionBarOverlayLayout$LayoutParams": "androidx/widget/ActionBarOverlayLayout$LayoutParams",
-      "android/support/v4/view/NestedScrollingParentHelper": "androidx/view/NestedScrollingParentHelper",
-      "android/support/transition/ObjectAnimatorUtilsApi14": "androidx/transition/ObjectAnimatorUtilsApi14",
-      "android/support/text/emoji/EmojiCompat": "androidx/text/emoji/EmojiCompat",
-      "android/support/v4/media/MediaBrowserServiceCompatApi23$ServiceCompatProxy": "androidx/media/MediaBrowserServiceCompatApi23$ServiceCompatProxy",
-      "android/support/v17/leanback/widget/FocusHighlightHelper$FocusAnimator": "androidx/leanback/widget/FocusHighlightHelper$FocusAnimator",
-      "android/support/v17/leanback/app/PlaybackSupportFragment$SetSelectionRunnable": "androidx/leanback/app/PlaybackSupportFragment$SetSelectionRunnable",
-      "android/support/v4/widget/PopupWindowCompat$PopupWindowCompatApi23Impl": "androidx/widget/PopupWindowCompat$PopupWindowCompatApi23Impl",
-      "android/support/v7/preference/SwitchPreferenceCompat": "androidx/preference/SwitchPreferenceCompat",
-      "android/support/wear/widget/drawer/FlingWatcherFactory$FlingListener": "androidx/wear/widget/drawer/FlingWatcherFactory$FlingListener",
-      "android/support/v7/widget/ShareActionProvider": "androidx/widget/ShareActionProvider",
-      "android/support/v7/content/res/AppCompatResources": "androidx/content/res/AppCompatResources",
-      "android/support/transition/ViewOverlayApi18": "androidx/transition/ViewOverlayApi18",
-      "android/support/v7/widget/ListPopupWindow$ResizePopupRunnable": "androidx/widget/ListPopupWindow$ResizePopupRunnable",
-      "android/support/compat/R$integer": "androidx/compat/R$integer",
-      "android/support/v4/app/ActionBarDrawerToggle$SlideDrawable": "androidx/app/legacy/ActionBarDrawerToggle$SlideDrawable",
-      "android/support/transition/ChangeTransform$PathAnimatorMatrix": "androidx/transition/ChangeTransform$PathAnimatorMatrix",
-      "android/support/v17/leanback/graphics/ColorFilterDimmer": "androidx/leanback/graphics/ColorFilterDimmer",
-      "android/support/v7/media/MediaRouteDescriptor": "androidx/media/MediaRouteDescriptor",
-      "android/support/v14/preference/PreferenceFragment$ScrollToPreferenceObserver": "androidx/preference/PreferenceFragment$ScrollToPreferenceObserver",
-      "android/support/v4/media/MediaBrowserCompatApi21$SubscriptionCallback": "androidx/media/MediaBrowserCompatApi21$SubscriptionCallback",
-      "android/support/v7/view/menu/MenuHelper": "androidx/view/menu/MenuHelper",
-      "android/support/v17/leanback/widget/SpeechOrbView": "androidx/leanback/widget/SpeechOrbView",
-      "android/support/v7/media/SystemMediaRouteProvider$JellybeanImpl$SystemRouteController": "androidx/media/SystemMediaRouteProvider$JellybeanImpl$SystemRouteController",
-      "android/support/v7/widget/FitWindowsFrameLayout": "androidx/widget/FitWindowsFrameLayout",
-      "android/support/v7/preference/TwoStatePreference$SavedState": "androidx/preference/TwoStatePreference$SavedState",
-      "android/support/v17/leanback/widget/ShadowOverlayHelper$Builder": "androidx/leanback/widget/ShadowOverlayHelper$Builder",
-      "android/support/v17/leanback/widget/InvisibleRowPresenter": "androidx/leanback/widget/InvisibleRowPresenter",
-      "android/support/design/internal/NavigationMenuPresenter$SeparatorViewHolder": "androidx/design/internal/NavigationMenuPresenter$SeparatorViewHolder",
-      "android/support/design/widget/BaseTransientBottomBar$Duration": "androidx/design/widget/BaseTransientBottomBar$Duration",
-      "android/support/v7/widget/helper/ItemTouchUIUtilImpl": "androidx/widget/helper/ItemTouchUIUtilImpl",
-      "android/support/v17/leanback/widget/GuidedActionsRelativeLayout$InterceptKeyEventListener": "androidx/leanback/widget/GuidedActionsRelativeLayout$InterceptKeyEventListener",
-      "android/support/v4/os/IResultReceiver": "androidx/os/IResultReceiver",
-      "android/support/v17/leanback/widget/ShadowHelperApi21": "androidx/leanback/widget/ShadowHelperApi21",
-      "android/support/v17/leanback/widget/RowPresenter": "androidx/leanback/widget/RowPresenter",
-      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplBase": "androidx/media/MediaBrowserCompat$MediaBrowserImplBase",
-      "android/support/v4/app/BackStackRecord": "androidx/app/BackStackRecord",
-      "android/support/v4/view/WindowInsetsCompat": "androidx/view/WindowInsetsCompat",
-      "android/support/graphics/drawable/AnimatedVectorDrawableCompat": "androidx/graphics/drawable/AnimatedVectorDrawableCompat",
-      "android/support/v17/leanback/widget/PlaybackControlsRowPresenter": "androidx/leanback/widget/PlaybackControlsRowPresenter",
-      "android/support/transition/VisibilityPropagation": "androidx/transition/VisibilityPropagation",
-      "android/support/v17/leanback/media/PlaybackTransportControlGlue": "androidx/leanback/media/PlaybackTransportControlGlue",
-      "android/support/wear/widget/BoxInsetLayout$LayoutParams$BoxedEdges": "androidx/wear/widget/BoxInsetLayout$LayoutParams$BoxedEdges",
-      "android/support/annotation/LayoutRes": "androidx/annotation/LayoutRes",
-      "android/support/v4/widget/CursorAdapter": "androidx/widget/CursorAdapter",
-      "android/support/wear/ambient/AmbientMode$AmbientCallback": "androidx/wear/ambient/AmbientMode$AmbientCallback",
-      "android/support/v4/media/MediaBrowserServiceCompatApi21$BrowserRoot": "androidx/media/MediaBrowserServiceCompatApi21$BrowserRoot",
-      "android/support/v7/view/menu/MenuItemWrapperJB": "androidx/view/menu/MenuItemWrapperJB",
-      "android/support/text/emoji/widget/EmojiAppCompatButton": "androidx/text/emoji/widget/EmojiAppCompatButton",
-      "android/support/v4/view/ActionProvider$SubUiVisibilityListener": "androidx/view/ActionProvider$SubUiVisibilityListener",
-      "android/support/wear/widget/drawer/WearableActionDrawerMenu$WearableActionDrawerMenuItem$MenuItemChangedListener": "androidx/wear/widget/drawer/WearableActionDrawerMenu$WearableActionDrawerMenuItem$MenuItemChangedListener",
-      "android/support/v4/media/MediaBrowserCompat$ServiceBinderWrapper": "androidx/media/MediaBrowserCompat$ServiceBinderWrapper",
-      "android/support/v13/app/ActivityCompat": "androidx/app/ActivityCompat",
-      "android/support/v4/widget/ImageViewCompat$LollipopViewCompatImpl": "androidx/widget/ImageViewCompat$LollipopViewCompatImpl",
-      "android/support/annotation/UiThread": "androidx/annotation/UiThread",
-      "android/support/v4/media/session/MediaControllerCompatApi24": "androidx/media/session/MediaControllerCompatApi24",
-      "android/support/v7/media/RemoteControlClientCompat$JellybeanImpl$VolumeCallbackWrapper": "androidx/media/RemoteControlClientCompat$JellybeanImpl$VolumeCallbackWrapper",
-      "android/support/v4/media/session/MediaControllerCompatApi23": "androidx/media/session/MediaControllerCompatApi23",
-      "android/support/v4/media/session/MediaControllerCompatApi21": "androidx/media/session/MediaControllerCompatApi21",
-      "android/support/v4/print/PrintHelper$ScaleMode": "androidx/print/PrintHelper$ScaleMode",
-      "android/support/v7/widget/SearchView$SavedState": "androidx/widget/SearchView$SavedState",
-      "android/support/v7/widget/AppCompatDrawableManager$AvdcInflateDelegate": "androidx/widget/AppCompatDrawableManager$AvdcInflateDelegate",
-      "android/support/v7/preference/TwoStatePreference": "androidx/preference/TwoStatePreference",
-      "android/support/text/emoji/EmojiCompat$LoadState": "androidx/text/emoji/EmojiCompat$LoadState",
-      "android/support/v17/leanback/widget/HorizontalGridView": "androidx/leanback/widget/HorizontalGridView",
-      "android/support/v7/view/menu/ListMenuItemView": "androidx/view/menu/ListMenuItemView",
-      "android/support/transition/Styleable$TransitionSet": "androidx/transition/Styleable$TransitionSet",
-      "android/support/v17/leanback/app/PlaybackFragment$OnFadeCompleteListener": "androidx/leanback/app/PlaybackFragment$OnFadeCompleteListener",
-      "android/support/v7/widget/ActivityChooserModel$PersistHistoryAsyncTask": "androidx/widget/ActivityChooserModel$PersistHistoryAsyncTask",
-      "android/support/v4/util/ArraySet": "androidx/util/ArraySet",
-      "android/support/v7/widget/FastScroller$AnimationState": "androidx/widget/FastScroller$AnimationState",
-      "android/support/v7/widget/RecyclerView$ChildDrawingOrderCallback": "androidx/widget/RecyclerView$ChildDrawingOrderCallback",
-      "android/support/text/emoji/flatbuffer/Constants": "androidx/text/emoji/flatbuffer/Constants",
-      "android/support/v4/widget/DrawerLayout$LayoutParams": "androidx/widget/DrawerLayout$LayoutParams",
-      "android/support/v4/app/TaskStackBuilder": "androidx/app/TaskStackBuilder",
-      "android/support/v7/widget/ListPopupWindow$PopupDataSetObserver": "androidx/widget/ListPopupWindow$PopupDataSetObserver",
-      "android/support/v4/media/session/MediaSessionCompatApi24$CallbackProxy": "androidx/media/session/MediaSessionCompatApi24$CallbackProxy",
-      "android/support/v17/leanback/app/RowsSupportFragment$MainFragmentRowsAdapter": "androidx/leanback/app/RowsSupportFragment$MainFragmentRowsAdapter",
-      "android/support/v17/leanback/widget/picker/DatePicker": "androidx/leanback/widget/picker/DatePicker",
-      "android/support/v17/leanback/widget/SearchBar$SearchBarPermissionListener": "androidx/leanback/widget/SearchBar$SearchBarPermissionListener",
-      "android/support/v7/media/MediaItemMetadata": "androidx/media/MediaItemMetadata",
-      "android/support/v17/leanback/widget/ListRowPresenter": "androidx/leanback/widget/ListRowPresenter",
-      "android/support/v17/leanback/media/PlaybackBannerControlGlue$ACTION_": "androidx/leanback/media/PlaybackBannerControlGlue$ACTION_",
-      "android/support/v4/app/RemoteInput": "androidx/app/RemoteInput",
-      "android/support/text/emoji/MetadataListReader$ByteBufferReader": "androidx/text/emoji/MetadataListReader$ByteBufferReader",
-      "android/support/v17/leanback/widget/SearchEditText": "androidx/leanback/widget/SearchEditText",
-      "android/support/v4/app/NotificationCompat$CarExtender$UnreadConversation$Builder": "androidx/app/NotificationCompat$CarExtender$UnreadConversation$Builder",
-      "android/support/v7/preference/SeekBarPreference": "androidx/preference/SeekBarPreference",
-      "android/support/v17/leanback/R$transition": "androidx/leanback/R$transition",
-      "android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory": "androidx/graphics/drawable/RoundedBitmapDrawableFactory",
-      "android/support/v7/widget/PositionMap$ContainerHelpers": "androidx/widget/PositionMap$ContainerHelpers",
-      "android/support/v4/view/accessibility/AccessibilityManagerCompat$AccessibilityStateChangeListenerWrapper": "androidx/view/accessibility/AccessibilityManagerCompat$AccessibilityStateChangeListenerWrapper",
-      "android/support/design/widget/ViewUtils": "androidx/design/widget/ViewUtils",
-      "android/support/v4/widget/CompoundButtonCompat$CompoundButtonCompatApi23Impl": "androidx/widget/CompoundButtonCompat$CompoundButtonCompatApi23Impl",
-      "android/support/v7/widget/StaggeredGridLayoutManager$SavedState": "androidx/widget/StaggeredGridLayoutManager$SavedState",
-      "android/support/transition/PathMotion": "androidx/transition/PathMotion",
-      "android/support/wear/widget/drawer/WearableDrawerView": "androidx/wear/widget/drawer/WearableDrawerView",
-      "android/support/v4/media/VolumeProviderCompat$ControlType": "androidx/media/VolumeProviderCompat$ControlType",
-      "android/support/v4/view/animation/PathInterpolatorApi14": "androidx/view/animation/PathInterpolatorApi14",
-      "android/support/animation/AnimationHandler$FrameCallbackProvider16": "androidx/animation/AnimationHandler$FrameCallbackProvider16",
-      "android/support/v4/view/animation/FastOutSlowInInterpolator": "androidx/view/animation/FastOutSlowInInterpolator",
-      "android/support/animation/AnimationHandler$FrameCallbackProvider14": "androidx/animation/AnimationHandler$FrameCallbackProvider14",
-      "android/support/customtabs/CustomTabsServiceConnection": "androidx/browser/customtabs/CustomTabsServiceConnection",
-      "android/support/v17/leanback/app/BackgroundFragment": "androidx/leanback/app/BackgroundFragment",
-      "android/support/v17/leanback/widget/FocusHighlightHelper$BrowseItemFocusHighlight": "androidx/leanback/widget/FocusHighlightHelper$BrowseItemFocusHighlight",
-      "android/support/v17/leanback/app/HeadersFragment$OnHeaderClickedListener": "androidx/leanback/app/HeadersFragment$OnHeaderClickedListener",
-      "android/support/v7/media/MediaRouter$RouteInfo": "androidx/media/MediaRouter$RouteInfo",
-      "android/support/v14/preference/PreferenceFragment": "androidx/preference/PreferenceFragment",
-      "android/support/v4/media/session/PlaybackStateCompat$MediaKeyAction": "androidx/media/session/PlaybackStateCompat$MediaKeyAction",
-      "android/support/v17/leanback/widget/TitleView": "androidx/leanback/widget/TitleView",
-      "android/support/graphics/drawable/VectorDrawableCompat$VPath": "androidx/graphics/drawable/VectorDrawableCompat$VPath",
-      "android/support/v17/leanback/widget/AbstractMediaItemPresenter$ViewHolder": "androidx/leanback/widget/AbstractMediaItemPresenter$ViewHolder",
-      "android/support/v17/leanback/widget/BrowseRowsFrameLayout": "androidx/leanback/widget/BrowseRowsFrameLayout",
-      "android/support/v7/content/res/AppCompatResources$ColorStateListCacheEntry": "androidx/content/res/AppCompatResources$ColorStateListCacheEntry",
-      "android/support/design/R$dimen": "androidx/design/R$dimen",
-      "android/support/v7/preference/PreferenceInflater": "androidx/preference/PreferenceInflater",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$PlayPauseAction": "androidx/leanback/widget/PlaybackControlsRow$PlayPauseAction",
-      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter": "androidx/leanback/widget/PlaybackTransportRowPresenter",
-      "android/support/wear/widget/CircledImageView": "androidx/wear/widget/CircledImageView",
-      "android/support/v7/media/MediaRouterJellybean$SelectRouteWorkaround": "androidx/media/MediaRouterJellybean$SelectRouteWorkaround",
-      "android/support/v17/leanback/widget/ListRowHoverCardView": "androidx/leanback/widget/ListRowHoverCardView",
-      "android/support/v7/media/MediaRouterJellybean$GetDefaultRouteWorkaround": "androidx/media/MediaRouterJellybean$GetDefaultRouteWorkaround",
-      "android/support/text/emoji/widget/SpannableBuilder$WatcherWrapper": "androidx/text/emoji/widget/SpannableBuilder$WatcherWrapper",
-      "android/support/v17/preference/LeanbackListPreferenceDialogFragment$AdapterSingle": "androidx/leanback/preference/LeanbackListPreferenceDialogFragment$AdapterSingle",
-      "android/support/v17/leanback/app/OnboardingFragment": "androidx/leanback/app/OnboardingFragment",
-      "android/support/v7/view/menu/MenuPresenter$Callback": "androidx/view/menu/MenuPresenter$Callback",
-      "android/support/v4/graphics/drawable/DrawableWrapperApi14$DrawableWrapperStateBase": "androidx/graphics/drawable/DrawableWrapperApi14$DrawableWrapperStateBase",
-      "android/support/v17/leanback/graphics/CompositeDrawable$ChildDrawable": "androidx/leanback/graphics/CompositeDrawable$ChildDrawable",
-      "android/support/v17/leanback/widget/AbstractMediaListHeaderPresenter$ViewHolder": "androidx/leanback/widget/AbstractMediaListHeaderPresenter$ViewHolder",
-      "android/support/v7/view/menu/MenuItemWrapperICS$OnMenuItemClickListenerWrapper": "androidx/view/menu/MenuItemWrapperICS$OnMenuItemClickListenerWrapper",
-      "android/support/v7/widget/ContentFrameLayout$OnAttachListener": "androidx/widget/ContentFrameLayout$OnAttachListener",
-      "android/support/v17/leanback/widget/StaticShadowHelper": "androidx/leanback/widget/StaticShadowHelper",
-      "android/support/v7/widget/RecyclerView$OnScrollListener": "androidx/widget/RecyclerView$OnScrollListener",
-      "android/support/v17/leanback/graphics/FitWidthBitmapDrawable$BitmapState": "androidx/leanback/graphics/FitWidthBitmapDrawable$BitmapState",
-      "android/support/v17/leanback/widget/SeekBar": "androidx/leanback/widget/SeekBar",
-      "android/support/v4/widget/SlidingPaneLayout$SimplePanelSlideListener": "androidx/widget/SlidingPaneLayout$SimplePanelSlideListener",
-      "android/support/v17/leanback/widget/RowContainerView": "androidx/leanback/widget/RowContainerView",
-      "android/support/v7/widget/ForwardingListener$DisallowIntercept": "androidx/widget/ForwardingListener$DisallowIntercept",
-      "android/support/v7/app/AppCompatDelegateImplBase": "androidx/app/AppCompatDelegateImplBase",
-      "android/support/v17/leanback/app/PlaybackSupportFragmentGlueHost": "androidx/leanback/app/PlaybackSupportFragmentGlueHost",
-      "android/support/transition/Styleable$Transition": "androidx/transition/Styleable$Transition",
-      "android/support/v7/widget/ActionMenuPresenter": "androidx/widget/ActionMenuPresenter",
-      "android/support/v7/app/ActionBar$DisplayOptions": "androidx/app/ActionBar$DisplayOptions",
-      "android/support/v4/app/ShareCompat$IntentBuilder": "androidx/app/ShareCompat$IntentBuilder",
-      "android/support/v4/media/MediaMetadataCompat$LongKey": "androidx/media/MediaMetadataCompat$LongKey",
-      "android/support/v4/media/AudioAttributesCompatApi21$Wrapper": "androidx/media/AudioAttributesCompatApi21$Wrapper",
-      "android/support/v17/leanback/widget/DetailsOverviewRow": "androidx/leanback/widget/DetailsOverviewRow",
-      "android/support/annotation/IdRes": "androidx/annotation/IdRes",
-      "android/support/v7/widget/ActivityChooserModel$HistoricalRecord": "androidx/widget/ActivityChooserModel$HistoricalRecord",
-      "android/support/v17/leanback/widget/SearchOrbView$Colors": "androidx/leanback/widget/SearchOrbView$Colors",
-      "android/support/v7/content/res/GrowingArrayUtils": "androidx/content/res/GrowingArrayUtils",
-      "android/support/text/emoji/MetadataRepo$Node": "androidx/text/emoji/MetadataRepo$Node",
-      "android/support/v17/leanback/app/BrowseFragment$MainFragmentItemViewSelectedListener": "androidx/leanback/app/BrowseFragment$MainFragmentItemViewSelectedListener",
-      "android/support/v17/leanback/app/SearchSupportFragment$ExternalQuery": "androidx/leanback/app/SearchSupportFragment$ExternalQuery",
-      "android/support/v17/leanback/widget/ShadowHelperJbmr2$ShadowImpl": "androidx/leanback/widget/ShadowHelperJbmr2$ShadowImpl",
-      "android/support/wear/widget/drawer/PageIndicatorView": "androidx/wear/widget/drawer/PageIndicatorView",
-      "android/support/v17/leanback/app/VerticalGridSupportFragment": "androidx/leanback/app/VerticalGridSupportFragment",
-      "android/support/v7/preference/PreferenceGroupAdapter$PreferenceLayout": "androidx/preference/PreferenceGroupAdapter$PreferenceLayout",
-      "android/support/v7/preference/internal/AbstractMultiSelectListPreference": "androidx/preference/internal/AbstractMultiSelectListPreference",
-      "android/support/v7/media/MediaRouteProviderDescriptor$Builder": "androidx/media/MediaRouteProviderDescriptor$Builder",
-      "android/support/v4/app/NotificationCompatSideChannelService": "androidx/app/NotificationCompatSideChannelService",
-      "android/support/v7/widget/GridLayoutManager": "androidx/widget/GridLayoutManager",
-      "android/support/v4/media/AudioAttributesCompat$AttributeUsage": "androidx/media/AudioAttributesCompat$AttributeUsage",
-      "android/support/v4/util/Pools$Pool": "androidx/util/Pools$Pool",
-      "android/support/transition/SidePropagation": "androidx/transition/SidePropagation",
-      "android/support/v17/leanback/widget/PlaybackSeekUi$Client": "androidx/leanback/widget/PlaybackSeekUi$Client",
-      "android/support/media/tv/TvContractCompat$Channels": "androidx/media/tv/TvContractCompat$Channels",
-      "android/support/v7/appcompat/R$style": "androidx/appcompat/R$style",
-      "android/support/v4/app/INotificationSideChannel$Stub": "androidx/app/INotificationSideChannel$Stub",
-      "android/support/compat/R$string": "androidx/compat/R$string",
-      "android/support/v4/os/EnvironmentCompat": "androidx/os/EnvironmentCompat",
-      "android/support/wear/ambient/SharedLibraryVersion": "androidx/wear/ambient/SharedLibraryVersion",
-      "android/support/v7/view/menu/MenuBuilder$Callback": "androidx/view/menu/MenuBuilder$Callback",
-      "android/support/v17/leanback/app/BrowseSupportFragment$MainFragmentRowsAdapterProvider": "androidx/leanback/app/BrowseSupportFragment$MainFragmentRowsAdapterProvider",
-      "android/support/v17/leanback/R": "androidx/leanback/R",
-      "android/support/transition/Slide": "androidx/transition/Slide",
-      "android/support/v4/os/ParcelableCompat$ParcelableCompatCreatorHoneycombMR2": "androidx/os/ParcelableCompat$ParcelableCompatCreatorHoneycombMR2",
-      "android/support/v17/leanback/widget/PlaybackSeekUi": "androidx/leanback/widget/PlaybackSeekUi",
-      "android/support/v4/view/ViewPropertyAnimatorUpdateListener": "androidx/view/ViewPropertyAnimatorUpdateListener",
-      "android/support/v4/widget/EdgeEffectCompat$EdgeEffectBaseImpl": "androidx/widget/EdgeEffectCompat$EdgeEffectBaseImpl",
-      "android/support/v7/widget/ForwardingListener$TriggerLongPress": "androidx/widget/ForwardingListener$TriggerLongPress",
-      "android/support/v4/app/ActivityCompat$SharedElementCallback23Impl": "androidx/app/legacy/ActivityCompat$SharedElementCallback23Impl",
-      "android/support/v4/media/MediaBrowserCompatApi21$ConnectionCallback": "androidx/media/MediaBrowserCompatApi21$ConnectionCallback",
-      "android/support/v4/content/Loader$ForceLoadContentObserver": "androidx/content/Loader$ForceLoadContentObserver",
-      "android/support/v7/widget/ScrollingTabContainerView$TabClickListener": "androidx/widget/ScrollingTabContainerView$TabClickListener",
-      "android/support/v4/widget/TextViewCompat$TextViewCompatApi27Impl": "androidx/widget/TextViewCompat$TextViewCompatApi27Impl",
-      "android/support/v17/leanback/widget/GridLayoutManager$OnLayoutCompleteListener": "androidx/leanback/widget/GridLayoutManager$OnLayoutCompleteListener",
-      "android/support/v4/provider/SelfDestructiveThread$ReplyCallback": "androidx/provider/SelfDestructiveThread$ReplyCallback",
-      "android/support/v4/media/VolumeProviderCompat$Callback": "androidx/media/VolumeProviderCompat$Callback",
-      "android/support/v4/app/NotificationCompat$CarExtender$UnreadConversation": "androidx/app/NotificationCompat$CarExtender$UnreadConversation",
-      "android/support/graphics/drawable/AnimatorInflaterCompat": "androidx/graphics/drawable/AnimatorInflaterCompat",
-      "android/support/compat/R$id": "androidx/compat/R$id",
-      "android/support/v17/leanback/app/DetailsFragment$WaitEnterTransitionTimeout": "androidx/leanback/app/DetailsFragment$WaitEnterTransitionTimeout",
-      "android/support/media/tv/TvContractCompat$Channels$ServiceType": "androidx/media/tv/TvContractCompat$Channels$ServiceType",
-      "android/support/v17/leanback/widget/Presenter$ViewHolder": "androidx/leanback/widget/Presenter$ViewHolder",
-      "android/support/text/emoji/EmojiCompat$Config": "androidx/text/emoji/EmojiCompat$Config",
-      "android/support/v17/leanback/app/BackgroundManager$ChangeBackgroundRunnable": "androidx/leanback/app/BackgroundManager$ChangeBackgroundRunnable",
-      "android/support/v17/leanback/util/StateMachine$Transition": "androidx/leanback/util/StateMachine$Transition",
-      "android/support/v17/leanback/widget/picker/TimePicker": "androidx/leanback/widget/picker/TimePicker",
-      "android/support/v7/media/RegisteredMediaRouteProvider$Controller": "androidx/media/RegisteredMediaRouteProvider$Controller",
-      "android/support/text/emoji/TypefaceEmojiSpan": "androidx/text/emoji/TypefaceEmojiSpan",
-      "android/support/wear/widget/SwipeDismissFrameLayout": "androidx/wear/widget/SwipeDismissFrameLayout",
-      "android/support/v4/media/MediaBrowserCompatUtils": "androidx/media/MediaBrowserCompatUtils",
-      "android/support/v17/leanback/app/HeadersSupportFragment": "androidx/leanback/app/HeadersSupportFragment",
-      "android/support/v7/widget/SearchView$OnQueryTextListener": "androidx/widget/SearchView$OnQueryTextListener",
-      "android/support/v17/leanback/widget/AbstractMediaListHeaderPresenter": "androidx/leanback/widget/AbstractMediaListHeaderPresenter",
-      "android/support/design/widget/BaseTransientBottomBar$OnLayoutChangeListener": "androidx/design/widget/BaseTransientBottomBar$OnLayoutChangeListener",
-      "android/support/v14/preference/R$styleable": "androidx/preference/R$styleable",
-      "android/support/v17/leanback/transition/SlideKitkat": "androidx/leanback/transition/SlideKitkat",
-      "android/support/animation/AnimationHandler$AnimationFrameCallbackProvider": "androidx/animation/AnimationHandler$AnimationFrameCallbackProvider",
-      "android/support/v7/view/menu/ActionMenuItem": "androidx/view/menu/ActionMenuItem",
-      "android/support/v4/view/animation/PathInterpolatorCompat": "androidx/view/animation/PathInterpolatorCompat",
-      "android/support/v7/util/AsyncListUtil$DataCallback": "androidx/util/AsyncListUtil$DataCallback",
-      "android/support/v17/leanback/widget/ListRowPresenter$ListRowPresenterItemBridgeAdapter": "androidx/leanback/widget/ListRowPresenter$ListRowPresenterItemBridgeAdapter",
-      "android/support/v7/mediarouter/R$style": "androidx/mediarouter/R$style",
-      "android/support/customtabs/IPostMessageService$Stub": "androidx/browser/customtabs/IPostMessageService$Stub",
-      "android/support/wear/widget/CircularProgressLayout$OnTimerFinishedListener": "androidx/wear/widget/CircularProgressLayout$OnTimerFinishedListener",
-      "android/support/v7/widget/ActivityChooserModel$OnChooseActivityListener": "androidx/widget/ActivityChooserModel$OnChooseActivityListener",
-      "android/support/v4/graphics/drawable/DrawableWrapperApi21": "androidx/graphics/drawable/DrawableWrapperApi21",
-      "android/support/design/widget/FloatingActionButton$Size": "androidx/design/widget/FloatingActionButton$Size",
-      "android/support/v4/provider/DocumentFile": "androidx/provider/DocumentFile",
-      "android/support/v7/app/AppCompatDelegateImplBase$AppCompatWindowCallbackBase": "androidx/app/AppCompatDelegateImplBase$AppCompatWindowCallbackBase",
-      "android/support/annotation/AnyThread": "androidx/annotation/AnyThread",
-      "android/support/v13/app/FragmentCompat$FragmentCompatApi24Impl": "androidx/app/FragmentCompat$FragmentCompatApi24Impl",
-      "android/support/wear/ambient/SharedLibraryVersion$VersionHolder": "androidx/wear/ambient/SharedLibraryVersion$VersionHolder",
-      "android/support/v7/app/WindowDecorActionBar$ActionModeImpl": "androidx/app/WindowDecorActionBar$ActionModeImpl",
-      "android/support/constraint/solver/widgets/Guideline": "androidx/constraint/solver/widgets/Guideline",
-      "android/support/v17/leanback/widget/NonOverlappingView": "androidx/leanback/widget/NonOverlappingView",
-      "android/support/v7/preference/ListPreference": "androidx/preference/ListPreference",
-      "android/support/v17/leanback/widget/ShadowOverlayContainer": "androidx/leanback/widget/ShadowOverlayContainer",
-      "android/support/design/internal/NavigationMenuItemView": "androidx/design/internal/NavigationMenuItemView",
-      "android/support/v17/leanback/widget/ArrayObjectAdapter": "androidx/leanback/widget/ArrayObjectAdapter",
-      "android/support/v17/leanback/widget/CursorObjectAdapter": "androidx/leanback/widget/CursorObjectAdapter",
-      "android/support/v17/leanback/R$style": "androidx/leanback/R$style",
-      "android/support/v4/media/MediaBrowserCompatApi21": "androidx/media/MediaBrowserCompatApi21",
-      "android/support/v4/media/MediaBrowserCompatApi23": "androidx/media/MediaBrowserCompatApi23",
-      "android/support/v17/leanback/widget/FullWidthDetailsOverviewSharedElementHelper": "androidx/leanback/widget/FullWidthDetailsOverviewSharedElementHelper",
-      "android/support/v7/widget/ShareActionProvider$ShareMenuItemOnMenuItemClickListener": "androidx/widget/ShareActionProvider$ShareMenuItemOnMenuItemClickListener",
-      "android/support/v4/media/MediaBrowserCompatApi26": "androidx/media/MediaBrowserCompatApi26",
-      "android/support/v4/print/PrintHelper$Orientation": "androidx/print/PrintHelper$Orientation",
-      "android/support/v4/view/ViewPager$PageTransformer": "androidx/view/ViewPager$PageTransformer",
-      "android/support/transition/ViewGroupOverlayImpl": "androidx/transition/ViewGroupOverlayImpl",
-      "android/support/v4/app/ActivityOptionsCompat$ActivityOptionsCompatApi23Impl": "androidx/app/ActivityOptionsCompat$ActivityOptionsCompatApi23Impl",
-      "android/support/v4/view/ViewPropertyAnimatorListener": "androidx/view/ViewPropertyAnimatorListener",
-      "android/support/transition/Styleable$ChangeBounds": "androidx/transition/Styleable$ChangeBounds",
-      "android/support/annotation/Keep": "androidx/annotation/Keep",
-      "android/support/v4/app/NotificationCompat$DecoratedCustomViewStyle": "androidx/app/NotificationCompat$DecoratedCustomViewStyle",
-      "android/support/v4/app/ShareCompat$IntentReader": "androidx/app/ShareCompat$IntentReader",
-      "android/support/v17/leanback/widget/ActionPresenterSelector$ActionPresenter": "androidx/leanback/widget/ActionPresenterSelector$ActionPresenter",
-      "android/support/v7/util/MessageThreadUtil$MessageQueue": "androidx/util/MessageThreadUtil$MessageQueue",
-      "android/support/annotation/Px": "androidx/annotation/Px",
-      "android/support/v17/leanback/app/SearchFragment$SearchResultProvider": "androidx/leanback/app/SearchFragment$SearchResultProvider",
-      "android/support/v7/app/AppCompatDelegateImplV9$ListMenuDecorView": "androidx/app/AppCompatDelegateImplV9$ListMenuDecorView",
-      "android/support/v17/leanback/transition/TransitionHelper$TransitionHelperStubImpl$TransitionStub": "androidx/leanback/transition/TransitionHelper$TransitionHelperStubImpl$TransitionStub",
-      "android/support/v7/app/AppCompatDelegate": "androidx/app/AppCompatDelegate",
-      "android/support/v17/leanback/app/BrowseFragment$MainFragmentAdapter": "androidx/leanback/app/BrowseFragment$MainFragmentAdapter",
-      "android/support/v17/leanback/widget/ParallaxEffect$IntEffect": "androidx/leanback/widget/ParallaxEffect$IntEffect",
-      "android/support/v7/widget/GridLayout$Alignment": "androidx/widget/GridLayout$Alignment",
-      "android/support/v7/widget/helper/ItemTouchHelper$RecoverAnimation": "androidx/widget/helper/ItemTouchHelper$RecoverAnimation",
-      "android/support/v17/leanback/widget/picker/Picker": "androidx/leanback/widget/picker/Picker",
-      "android/support/v7/gridlayout/R$styleable": "androidx/gridlayout/R$styleable",
-      "android/support/v4/app/FragmentPagerAdapter": "androidx/app/FragmentPagerAdapter",
-      "android/support/v4/graphics/TypefaceCompatBaseImpl$StyleExtractor": "androidx/graphics/TypefaceCompatBaseImpl$StyleExtractor",
-      "android/support/v17/leanback/widget/SearchBar": "androidx/leanback/widget/SearchBar",
-      "android/support/wear/widget/drawer/WearableDrawerController": "androidx/wear/widget/drawer/WearableDrawerController",
-      "android/support/design/widget/FloatingActionButtonImpl$DisabledElevationAnimation": "androidx/design/widget/FloatingActionButtonImpl$DisabledElevationAnimation",
-      "android/support/annotation/FloatRange": "androidx/annotation/FloatRange",
-      "android/support/media/ExifInterface$ByteOrderedDataInputStream": "androidx/media/ExifInterface$ByteOrderedDataInputStream",
-      "android/support/v7/widget/TooltipCompat$Api26ViewCompatImpl": "androidx/widget/TooltipCompat$Api26ViewCompatImpl",
-      "android/support/v7/widget/RecyclerViewAccessibilityDelegate": "androidx/widget/RecyclerViewAccessibilityDelegate",
-      "android/support/v7/widget/AppCompatTextView": "androidx/widget/AppCompatTextView",
-      "android/support/transition/ChangeImageTransform": "androidx/transition/ChangeImageTransform",
-      "android/support/v4/app/SuperNotCalledException": "androidx/app/SuperNotCalledException",
-      "android/support/text/emoji/widget/EmojiTextViewHelper$HelperInternal19": "androidx/text/emoji/widget/EmojiTextViewHelper$HelperInternal19",
-      "android/support/v7/widget/GapWorker$LayoutPrefetchRegistryImpl": "androidx/widget/GapWorker$LayoutPrefetchRegistryImpl",
-      "android/support/v7/app/AppCompatDelegateImplV14$AppCompatWindowCallbackV14": "androidx/app/AppCompatDelegateImplV14$AppCompatWindowCallbackV14",
-      "android/support/v4/widget/TextViewCompat$TextViewCompatApi23Impl": "androidx/widget/TextViewCompat$TextViewCompatApi23Impl",
-      "android/support/v17/leanback/widget/ParallaxEffect$FloatEffect": "androidx/leanback/widget/ParallaxEffect$FloatEffect",
-      "android/support/v4/media/session/MediaSessionCompat": "androidx/media/session/MediaSessionCompat",
-      "android/support/v17/leanback/app/BrowseSupportFragment$FragmentHostImpl": "androidx/leanback/app/BrowseSupportFragment$FragmentHostImpl",
-      "android/support/design/widget/ShadowDrawableWrapper": "androidx/design/widget/ShadowDrawableWrapper",
-      "android/support/design/internal/NavigationMenuPresenter$HeaderViewHolder": "androidx/design/internal/NavigationMenuPresenter$HeaderViewHolder",
-      "android/support/v7/widget/PopupMenu": "androidx/widget/PopupMenu",
-      "android/support/v17/preference/LeanbackListPreferenceDialogFragment$ViewHolder": "androidx/leanback/preference/LeanbackListPreferenceDialogFragment$ViewHolder",
-      "android/support/annotation/BoolRes": "androidx/annotation/BoolRes",
-      "android/support/v7/media/RemotePlaybackClient": "androidx/media/RemotePlaybackClient",
-      "android/support/v4/view/LayoutInflaterCompat$LayoutInflaterCompatApi21Impl": "androidx/view/LayoutInflaterCompat$LayoutInflaterCompatApi21Impl",
-      "android/support/v7/preference/AndroidResources": "androidx/preference/AndroidResources",
-      "android/support/v7/app/AlertController$AlertParams$OnPrepareListViewListener": "androidx/app/AlertController$AlertParams$OnPrepareListViewListener",
-      "android/support/wear/widget/drawer/WearableNavigationDrawerView": "androidx/wear/widget/drawer/WearableNavigationDrawerView",
-      "android/support/v4/media/session/PlaybackStateCompat$ErrorCode": "androidx/media/session/PlaybackStateCompat$ErrorCode",
-      "android/support/v7/widget/ActionMenuView$ActionMenuPresenterCallback": "androidx/widget/ActionMenuView$ActionMenuPresenterCallback",
-      "android/support/v7/app/AlertController": "androidx/app/AlertController",
-      "android/support/v7/widget/FitWindowsViewGroup$OnFitSystemWindowsListener": "androidx/widget/FitWindowsViewGroup$OnFitSystemWindowsListener",
-      "android/support/v4/app/NotificationBuilderWithBuilderAccessor": "androidx/app/NotificationBuilderWithBuilderAccessor",
-      "android/support/v4/view/AbsSavedState": "androidx/view/AbsSavedState",
-      "android/support/v7/media/MediaRouteProvider$ProviderHandler": "androidx/media/MediaRouteProvider$ProviderHandler",
-      "android/support/v7/widget/AbsActionBarView$VisibilityAnimListener": "androidx/widget/AbsActionBarView$VisibilityAnimListener",
-      "android/support/design/internal/TextScale": "androidx/design/internal/TextScale",
-      "android/support/v7/widget/RecyclerViewAccessibilityDelegate$ItemDelegate": "androidx/widget/RecyclerViewAccessibilityDelegate$ItemDelegate",
-      "android/support/v4/widget/SlidingPaneLayout": "androidx/widget/SlidingPaneLayout",
-      "android/support/v17/leanback/widget/ScaleFrameLayout": "androidx/leanback/widget/ScaleFrameLayout",
-      "android/support/v4/app/FragmentTransaction": "androidx/app/FragmentTransaction",
-      "android/support/graphics/drawable/AnimatorInflaterCompat$PathDataEvaluator": "androidx/graphics/drawable/AnimatorInflaterCompat$PathDataEvaluator",
-      "android/support/wear/widget/drawer/WearableActionDrawerView$ActionItemViewHolder": "androidx/wear/widget/drawer/WearableActionDrawerView$ActionItemViewHolder",
-      "android/support/wear/ambient/AmbientDelegate": "androidx/wear/ambient/AmbientDelegate",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$ThumbsUpAction": "androidx/leanback/widget/PlaybackControlsRow$ThumbsUpAction",
-      "android/support/v7/widget/AppCompatSpinner": "androidx/widget/AppCompatSpinner",
-      "android/support/design/widget/NavigationView$SavedState": "androidx/design/widget/NavigationView$SavedState",
+      "android/support/annotation/RestrictTo$Scope": "androidx/annotation/RestrictTo$Scope",
       "android/support/v17/leanback/animation/LogDecelerateInterpolator": "androidx/leanback/animation/LogDecelerateInterpolator",
-      "android/support/v4/media/session/MediaControllerCompatApi21$Callback": "androidx/media/session/MediaControllerCompatApi21$Callback",
-      "android/support/v7/widget/helper/ItemTouchHelper": "androidx/widget/helper/ItemTouchHelper",
-      "android/support/graphics/drawable/AnimatedVectorDrawableCompat$AnimatedVectorDrawableCompatState": "androidx/graphics/drawable/AnimatedVectorDrawableCompat$AnimatedVectorDrawableCompatState",
-      "android/support/v4/graphics/drawable/DrawableWrapperApi14$DrawableWrapperState": "androidx/graphics/drawable/DrawableWrapperApi14$DrawableWrapperState",
-      "android/support/v4/util/DebugUtils": "androidx/util/DebugUtils",
-      "android/support/customtabs/CustomTabsCallback": "androidx/browser/customtabs/CustomTabsCallback",
-      "android/support/v13/app/FragmentCompat": "androidx/app/FragmentCompat",
-      "android/support/v7/widget/RecyclerView$ViewFlinger": "androidx/widget/RecyclerView$ViewFlinger",
-      "android/support/v17/leanback/app/BrowseFragment$SetSelectionRunnable": "androidx/leanback/app/BrowseFragment$SetSelectionRunnable",
-      "android/support/customtabs/CustomTabsIntent$Builder": "androidx/browser/customtabs/CustomTabsIntent$Builder",
-      "android/support/v4/util/MapCollections$ValuesCollection": "androidx/util/MapCollections$ValuesCollection",
-      "android/support/v17/leanback/widget/StaggeredGrid": "androidx/leanback/widget/StaggeredGrid",
-      "android/support/v13/app/FragmentTabHost$SavedState": "androidx/app/legacy/FragmentTabHost$SavedState",
-      "android/support/v4/media/MediaBrowserServiceCompatApi23": "androidx/media/MediaBrowserServiceCompatApi23",
-      "android/support/v4/media/session/MediaButtonReceiver": "androidx/media/session/MediaButtonReceiver",
-      "android/support/v17/leanback/graphics/CompositeDrawable$CompositeState": "androidx/leanback/graphics/CompositeDrawable$CompositeState",
-      "android/support/transition/WindowIdApi14": "androidx/transition/WindowIdApi14",
-      "android/support/v4/media/MediaBrowserServiceCompatApi26": "androidx/media/MediaBrowserServiceCompatApi26",
-      "android/support/v4/media/MediaBrowserServiceCompatApi21": "androidx/media/MediaBrowserServiceCompatApi21",
-      "android/support/transition/WindowIdApi18": "androidx/transition/WindowIdApi18",
-      "android/support/v7/graphics/ColorCutQuantizer": "androidx/graphics/palette/ColorCutQuantizer",
-      "android/support/v4/media/session/MediaSessionCompatApi23$Callback": "androidx/media/session/MediaSessionCompatApi23$Callback",
-      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter$ActionsItemBridgeAdapter": "androidx/leanback/widget/DetailsOverviewRowPresenter$ActionsItemBridgeAdapter",
-      "android/support/v7/app/MediaRouteButton$RemoteIndicatorLoader": "androidx/app/MediaRouteButton$RemoteIndicatorLoader",
-      "android/support/v7/preference/ListPreference$SavedState": "androidx/preference/ListPreference$SavedState",
-      "android/support/v7/media/RegisteredMediaRouteProvider$ReceiveHandler": "androidx/media/RegisteredMediaRouteProvider$ReceiveHandler",
-      "android/support/v17/leanback/widget/MediaRowFocusView": "androidx/leanback/widget/MediaRowFocusView",
-      "android/support/v14/preference/PreferenceFragment$OnPreferenceDisplayDialogCallback": "androidx/preference/PreferenceFragment$OnPreferenceDisplayDialogCallback",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$HighQualityAction": "androidx/leanback/widget/PlaybackControlsRow$HighQualityAction",
-      "android/support/v17/leanback/app/BaseRowSupportFragment": "androidx/leanback/app/BaseRowSupportFragment",
-      "android/support/v17/leanback/app/BrowseSupportFragment$MainFragmentItemViewSelectedListener": "androidx/leanback/app/BrowseSupportFragment$MainFragmentItemViewSelectedListener",
-      "android/support/v17/leanback/widget/StreamingTextView": "androidx/leanback/widget/StreamingTextView",
-      "android/support/transition/GhostViewImpl$Creator": "androidx/transition/GhostViewImpl$Creator",
-      "android/support/wear/widget/drawer/WearableActionDrawerMenu$WearableActionDrawerMenuItem": "androidx/wear/widget/drawer/WearableActionDrawerMenu$WearableActionDrawerMenuItem",
-      "android/support/v4/media/MediaBrowserCompat$Subscription": "androidx/media/MediaBrowserCompat$Subscription",
-      "android/support/v4/view/PagerTitleStrip$SingleLineAllCapsTransform": "androidx/view/PagerTitleStrip$SingleLineAllCapsTransform",
-      "android/support/v4/media/session/MediaControllerCompatApi24$TransportControls": "androidx/media/session/MediaControllerCompatApi24$TransportControls",
-      "android/support/v7/app/ActionBarDrawerToggleHoneycomb": "androidx/app/ActionBarDrawerToggleHoneycomb",
-      "android/support/v4/graphics/TypefaceCompatBaseImpl": "androidx/graphics/TypefaceCompatBaseImpl",
-      "android/support/transition/TranslationAnimationCreator": "androidx/transition/TranslationAnimationCreator",
-      "android/support/v7/app/MediaRouteChooserDialog": "androidx/app/MediaRouteChooserDialog",
-      "android/support/v17/leanback/widget/Parallax$FloatPropertyMarkerValue": "androidx/leanback/widget/Parallax$FloatPropertyMarkerValue",
-      "android/support/v4/widget/FocusStrategy$SequentialComparator": "androidx/widget/FocusStrategy$SequentialComparator",
-      "android/support/v4/media/MediaMetadataCompat$TextKey": "androidx/media/MediaMetadataCompat$TextKey",
-      "android/support/v17/leanback/app/BrowseSupportFragment": "androidx/leanback/app/BrowseSupportFragment",
-      "android/support/v7/widget/ListViewCompat$GateKeeperDrawable": "androidx/widget/internal/ListViewCompat$GateKeeperDrawable",
-      "android/support/v4/media/session/MediaControllerCompatApi23$TransportControls": "androidx/media/session/MediaControllerCompatApi23$TransportControls",
-      "android/support/v13/view/inputmethod/InputConnectionCompat$InputContentInfoCompatApi25Impl": "androidx/view/inputmethod/InputConnectionCompat$InputContentInfoCompatApi25Impl",
-      "android/support/v7/preference/PreferenceManager$OnDisplayPreferenceDialogListener": "androidx/preference/PreferenceManager$OnDisplayPreferenceDialogListener",
-      "android/support/v7/media/MediaRouterJellybeanMr1$IsConnectingWorkaround": "androidx/media/MediaRouterJellybeanMr1$IsConnectingWorkaround",
-      "android/support/v4/view/accessibility/AccessibilityManagerCompat$TouchExplorationStateChangeListenerWrapper": "androidx/view/accessibility/AccessibilityManagerCompat$TouchExplorationStateChangeListenerWrapper",
-      "android/support/v7/widget/RecyclerView$ItemDecoration": "androidx/widget/RecyclerView$ItemDecoration",
-      "android/support/v4/widget/Space": "androidx/widget/Space",
-      "android/support/v17/leanback/app/BrowseSupportFragment$ExpandPreLayout": "androidx/leanback/app/BrowseSupportFragment$ExpandPreLayout",
-      "android/support/media/tv/TvContractCompat$ProgramColumns": "androidx/media/tv/TvContractCompat$ProgramColumns",
-      "android/support/v7/widget/DecorToolbar": "androidx/widget/DecorToolbar",
-      "android/support/design/widget/CheckableImageButton": "androidx/design/widget/CheckableImageButton",
-      "android/support/v4/widget/ImageViewCompat": "androidx/widget/ImageViewCompat",
-      "android/support/v7/preference/UnPressableLinearLayout": "androidx/preference/UnPressableLinearLayout",
-      "android/support/wear/widget/SwipeDismissFrameLayout$MyOnPreSwipeListener": "androidx/wear/widget/SwipeDismissFrameLayout$MyOnPreSwipeListener",
-      "android/support/v4/widget/CircularProgressDrawable": "androidx/widget/CircularProgressDrawable",
-      "android/support/design/R$string": "androidx/design/R$string",
-      "android/support/design/R$color": "androidx/design/R$color",
-      "android/support/v7/widget/TintInfo": "androidx/widget/TintInfo",
-      "android/support/v17/leanback/widget/HeaderItem": "androidx/leanback/widget/HeaderItem",
-      "android/support/v7/media/MediaRouter$RouteInfo$ConnectionState": "androidx/media/MediaRouter$RouteInfo$ConnectionState",
-      "android/support/v7/widget/DialogTitle": "androidx/widget/DialogTitle",
-      "android/support/v17/leanback/media/PlaybackTransportControlGlue$UpdatePlaybackStateHandler": "androidx/leanback/media/PlaybackTransportControlGlue$UpdatePlaybackStateHandler",
-      "android/support/v7/widget/RecyclerView$LayoutParams": "androidx/widget/RecyclerView$LayoutParams",
-      "android/support/v4/media/session/PlaybackStateCompatApi21$CustomAction": "androidx/media/session/PlaybackStateCompatApi21$CustomAction",
-      "android/support/customtabs/CustomTabsService": "androidx/browser/customtabs/CustomTabsService",
-      "android/support/v17/leanback/widget/GuidanceStylist$Guidance": "androidx/leanback/widget/GuidanceStylist$Guidance",
-      "android/support/v4/view/ViewCompat$ViewCompatApi23Impl": "androidx/view/legacy/ViewCompat$ViewCompatApi23Impl",
-      "android/support/wear/widget/WearableLinearLayoutManager": "androidx/wear/widget/WearableLinearLayoutManager",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$MultiAction": "androidx/leanback/widget/PlaybackControlsRow$MultiAction",
-      "android/support/v17/leanback/R$integer": "androidx/leanback/R$integer",
-      "android/support/v4/content/ModernAsyncTask$WorkerRunnable": "androidx/content/ModernAsyncTask$WorkerRunnable",
-      "android/support/v4/app/FragmentTabHost$DummyTabFactory": "androidx/app/FragmentTabHost$DummyTabFactory",
-      "android/support/v7/widget/AppCompatSpinner$DropDownAdapter": "androidx/widget/AppCompatSpinner$DropDownAdapter",
-      "android/support/v7/app/ToolbarActionBar$MenuBuilderCallback": "androidx/app/ToolbarActionBar$MenuBuilderCallback",
-      "android/support/v4/content/Loader": "androidx/content/Loader",
-      "android/support/v7/widget/MenuPopupWindow": "androidx/widget/MenuPopupWindow",
-      "android/support/v4/graphics/BitmapCompat$BitmapCompatApi19Impl": "androidx/graphics/BitmapCompat$BitmapCompatApi19Impl",
-      "android/support/v4/app/FrameMetricsAggregator$MetricType": "androidx/app/FrameMetricsAggregator$MetricType",
-      "android/support/v17/leanback/widget/picker/PickerUtility$TimeConstant": "androidx/leanback/widget/picker/PickerUtility$TimeConstant",
-      "android/support/v4/view/NestedScrollingParent2": "androidx/view/NestedScrollingParent2",
-      "android/support/design/widget/Snackbar$SnackbarLayout": "androidx/design/widget/Snackbar$SnackbarLayout",
-      "android/support/v4/app/LoaderManager": "androidx/app/LoaderManager",
-      "android/support/v17/leanback/app/BaseSupportFragment": "androidx/leanback/app/BaseSupportFragment",
-      "android/support/design/internal/NavigationMenuPresenter$NavigationMenuItem": "androidx/design/internal/NavigationMenuPresenter$NavigationMenuItem",
-      "android/support/v4/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat": "androidx/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat",
-      "android/support/text/emoji/MetadataRepo": "androidx/text/emoji/MetadataRepo",
-      "android/support/v17/leanback/widget/ItemAlignment": "androidx/leanback/widget/ItemAlignment",
-      "android/support/design/widget/TextInputEditText": "androidx/design/widget/TextInputEditText",
-      "android/support/v4/app/FragmentTransitionImpl": "androidx/app/FragmentTransitionImpl",
-      "android/support/animation/SpringAnimation": "androidx/animation/SpringAnimation",
-      "android/support/annotation/CheckResult": "androidx/annotation/CheckResult",
-      "android/support/v7/widget/AppCompatSpinner$DropdownPopup": "androidx/widget/AppCompatSpinner$DropdownPopup",
-      "android/support/v7/widget/ActivityChooserModel$ActivitySorter": "androidx/widget/ActivityChooserModel$ActivitySorter",
-      "android/support/wear/widget/drawer/WearableDrawerLayout$ClosePeekRunnable": "androidx/wear/widget/drawer/WearableDrawerLayout$ClosePeekRunnable",
-      "android/support/design/widget/TextInputLayout$SavedState": "androidx/design/widget/TextInputLayout$SavedState",
-      "android/support/v17/leanback/widget/picker/PickerUtility$DateConstant": "androidx/leanback/widget/picker/PickerUtility$DateConstant",
-      "android/support/v13/app/FragmentTabHost": "androidx/app/legacy/FragmentTabHost",
-      "android/support/v7/widget/ScrollingTabContainerView$TabAdapter": "androidx/widget/ScrollingTabContainerView$TabAdapter",
-      "android/support/v7/widget/ActionBarContextView": "androidx/widget/ActionBarContextView",
-      "android/support/design/internal/NavigationMenuPresenter$NavigationMenuHeaderItem": "androidx/design/internal/NavigationMenuPresenter$NavigationMenuHeaderItem",
-      "android/support/v17/leanback/graphics/CompositeDrawable": "androidx/leanback/graphics/CompositeDrawable",
-      "android/support/v7/preference/Preference$OnPreferenceChangeListener": "androidx/preference/Preference$OnPreferenceChangeListener",
-      "android/support/v4/media/MediaBrowserServiceCompat$BrowserRoot": "androidx/media/MediaBrowserServiceCompat$BrowserRoot",
-      "android/support/text/emoji/MetadataListReader$OpenTypeReader": "androidx/text/emoji/MetadataListReader$OpenTypeReader",
-      "android/support/v7/media/MediaRouterJellybean$VolumeCallbackProxy": "androidx/media/MediaRouterJellybean$VolumeCallbackProxy",
-      "android/support/v4/app/OneShotPreDrawListener": "androidx/app/OneShotPreDrawListener",
-      "android/support/design/widget/BottomNavigationView$OnNavigationItemSelectedListener": "androidx/design/widget/BottomNavigationView$OnNavigationItemSelectedListener",
-      "android/support/v7/widget/ActionMenuView": "androidx/widget/ActionMenuView",
-      "android/support/v4/view/NestedScrollingChildHelper": "androidx/view/NestedScrollingChildHelper",
-      "android/support/percent/PercentFrameLayout": "androidx/PercentFrameLayout",
-      "android/support/annotation/AnyRes": "androidx/annotation/AnyRes",
-      "android/support/wear/widget/CircledImageView$OvalShadowPainter": "androidx/wear/widget/CircledImageView$OvalShadowPainter",
-      "android/support/media/tv/TvContractCompat$Channels$Logo": "androidx/media/tv/TvContractCompat$Channels$Logo",
-      "android/support/v4/view/animation/LookupTableInterpolator": "androidx/view/animation/LookupTableInterpolator",
-      "android/support/v7/app/MediaRouteControllerDialog$MediaControllerCallback": "androidx/app/MediaRouteControllerDialog$MediaControllerCallback",
-      "android/support/v7/widget/FitWindowsViewGroup": "androidx/widget/FitWindowsViewGroup",
-      "android/support/v7/widget/ActionBarOverlayLayout$ActionBarVisibilityCallback": "androidx/widget/ActionBarOverlayLayout$ActionBarVisibilityCallback",
-      "android/support/wear/ambient/AmbientMode": "androidx/wear/ambient/AmbientMode",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$SkipPreviousAction": "androidx/leanback/widget/PlaybackControlsRow$SkipPreviousAction",
-      "android/support/v4/app/NotificationCompat$Builder": "androidx/app/NotificationCompat$Builder",
-      "android/support/design/R$layout": "androidx/design/R$layout",
-      "android/support/transition/FragmentTransitionSupport": "androidx/transition/FragmentTransitionSupport",
-      "android/support/v4/app/Fragment$AnimationInfo": "androidx/app/Fragment$AnimationInfo",
-      "android/support/transition/ChangeTransform": "androidx/transition/ChangeTransform",
-      "android/support/v4/view/ViewCompat$FocusRelativeDirection": "androidx/view/legacy/ViewCompat$FocusRelativeDirection",
-      "android/support/customtabs/CustomTabsSessionToken$MockCallback": "androidx/browser/customtabs/CustomTabsSessionToken$MockCallback",
-      "android/support/v4/app/TaskStackBuilder$TaskStackBuilderBaseImpl": "androidx/app/TaskStackBuilder$TaskStackBuilderBaseImpl",
-      "android/support/v4/media/AudioAttributesCompat$Builder": "androidx/media/AudioAttributesCompat$Builder",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$ThumbsAction": "androidx/leanback/widget/PlaybackControlsRow$ThumbsAction",
-      "android/support/v7/media/MediaItemStatus$Builder": "androidx/media/MediaItemStatus$Builder",
-      "android/support/v17/leanback/app/OnboardingSupportFragment": "androidx/leanback/app/OnboardingSupportFragment",
-      "android/support/v7/widget/LinearLayoutCompat$OrientationMode": "androidx/widget/LinearLayoutCompat$OrientationMode",
-      "android/support/v7/widget/AppCompatImageButton": "androidx/widget/AppCompatImageButton",
-      "android/support/v7/app/AppCompatViewInflater$DeclaredOnClickListener": "androidx/app/AppCompatViewInflater$DeclaredOnClickListener",
-      "android/support/v7/view/SupportMenuInflater$InflatedOnMenuItemClickListener": "androidx/view/SupportMenuInflater$InflatedOnMenuItemClickListener",
-      "android/support/v4/widget/ContentLoadingProgressBar": "androidx/widget/ContentLoadingProgressBar",
-      "android/support/v4/hardware/display/DisplayManagerCompat$DisplayManagerCompatApi17Impl": "androidx/hardware/display/DisplayManagerCompat$DisplayManagerCompatApi17Impl",
-      "android/support/v17/leanback/app/BrowseFragment$ListRowFragmentFactory": "androidx/leanback/app/BrowseFragment$ListRowFragmentFactory",
-      "android/support/v7/app/MediaRouteChooserDialog$RouteAdapter": "androidx/app/MediaRouteChooserDialog$RouteAdapter",
-      "android/support/v7/view/ContextThemeWrapper": "androidx/view/ContextThemeWrapper",
-      "android/support/design/widget/CoordinatorLayout$OnPreDrawListener": "androidx/design/widget/CoordinatorLayout$OnPreDrawListener",
-      "android/support/v4/util/ContainerHelpers": "androidx/util/ContainerHelpers",
-      "android/support/design/widget/SnackbarManager$Callback": "androidx/design/widget/SnackbarManager$Callback",
-      "android/support/design/internal/ForegroundLinearLayout": "androidx/design/internal/ForegroundLinearLayout",
-      "android/support/v4/app/NotificationCompatJellybean": "androidx/app/NotificationCompatJellybean",
-      "android/support/design/widget/CoordinatorLayout$Behavior": "androidx/design/widget/CoordinatorLayout$Behavior",
-      "android/support/compat/R$dimen": "androidx/compat/R$dimen",
-      "android/support/v17/leanback/app/BrowseSupportFragment$MainFragmentAdapterProvider": "androidx/leanback/app/BrowseSupportFragment$MainFragmentAdapterProvider",
-      "android/support/wear/widget/SwipeDismissLayout$OnDismissedListener": "androidx/wear/widget/SwipeDismissLayout$OnDismissedListener",
-      "android/support/v7/recyclerview/R": "androidx/recyclerview/R",
-      "android/support/v4/widget/SlidingPaneLayout$LayoutParams": "androidx/widget/SlidingPaneLayout$LayoutParams",
-      "android/support/v7/app/ToolbarActionBar$ActionMenuPresenterCallback": "androidx/app/ToolbarActionBar$ActionMenuPresenterCallback",
-      "android/support/v4/widget/DrawerLayout$DrawerListener": "androidx/widget/DrawerLayout$DrawerListener",
-      "android/support/v4/net/ConnectivityManagerCompat$RestrictBackgroundStatus": "androidx/net/ConnectivityManagerCompat$RestrictBackgroundStatus",
-      "android/support/v4/media/MediaMetadataCompat$RatingKey": "androidx/media/MediaMetadataCompat$RatingKey",
-      "android/support/v4/view/ActionProvider": "androidx/view/ActionProvider",
-      "android/support/v7/app/MediaRouteControllerDialogFragment": "androidx/app/MediaRouteControllerDialogFragment",
-      "android/support/v7/widget/TooltipCompatHandler": "androidx/widget/TooltipCompatHandler",
-      "android/support/design/widget/TabLayout$TabLayoutOnPageChangeListener": "androidx/design/widget/TabLayout$TabLayoutOnPageChangeListener",
-      "android/support/v7/widget/RecyclerView$ItemAnimatorRestoreListener": "androidx/widget/RecyclerView$ItemAnimatorRestoreListener",
-      "android/support/app/recommendation/ContentRecommendation$ContentType": "androidx/app/recommendation/ContentRecommendation$ContentType",
-      "android/support/v7/app/AlertController$AlertParams": "androidx/app/AlertController$AlertParams",
-      "android/support/v4/widget/DrawerLayout$SimpleDrawerListener": "androidx/widget/DrawerLayout$SimpleDrawerListener",
-      "android/support/v17/leanback/widget/FocusHighlightHelper$HeaderItemFocusHighlight": "androidx/leanback/widget/FocusHighlightHelper$HeaderItemFocusHighlight",
-      "android/support/v7/app/MediaRouteChooserDialog$MediaRouterCallback": "androidx/app/MediaRouteChooserDialog$MediaRouterCallback",
-      "android/support/v4/view/ViewCompat$ImportantForAccessibility": "androidx/view/legacy/ViewCompat$ImportantForAccessibility",
-      "android/support/v7/media/MediaRouterJellybean$RouteInfo": "androidx/media/MediaRouterJellybean$RouteInfo",
-      "android/support/v17/leanback/widget/SpeechRecognitionCallback": "androidx/leanback/widget/SpeechRecognitionCallback",
-      "android/support/v4/media/MediaBrowserCompatApi26$SubscriptionCallback": "androidx/media/MediaBrowserCompatApi26$SubscriptionCallback",
-      "android/support/media/tv/Program": "androidx/media/tv/Program",
-      "android/support/v4/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat": "androidx/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat",
-      "android/support/v4/app/FragmentTransitionCompat21": "androidx/app/FragmentTransitionCompat21",
-      "android/support/v7/media/MediaRouteSelector$Builder": "androidx/media/MediaRouteSelector$Builder",
-      "android/support/v4/hardware/fingerprint/FingerprintManagerCompat": "androidx/hardware/fingerprint/FingerprintManagerCompat",
-      "android/support/v17/leanback/app/HeadersFragment": "androidx/leanback/app/HeadersFragment",
-      "android/support/v17/leanback/R$dimen": "androidx/leanback/R$dimen",
-      "android/support/v4/content/res/ResourcesCompat": "androidx/content/res/ResourcesCompat",
-      "android/support/v4/view/ViewPager$SavedState": "androidx/view/ViewPager$SavedState",
-      "android/support/v17/leanback/widget/StaticShadowHelper$ShadowHelperJbmr2Impl": "androidx/leanback/widget/StaticShadowHelper$ShadowHelperJbmr2Impl",
-      "android/support/v4/widget/SwipeRefreshLayout": "androidx/widget/SwipeRefreshLayout",
-      "android/support/v17/leanback/widget/StaticShadowHelper$ShadowHelperVersionImpl": "androidx/leanback/widget/StaticShadowHelper$ShadowHelperVersionImpl",
-      "android/support/v4/os/ResultReceiver": "androidx/os/ResultReceiver",
-      "android/support/v17/leanback/widget/BaseCardView$InfoOffsetAnimation": "androidx/leanback/widget/BaseCardView$InfoOffsetAnimation",
-      "android/support/design/widget/SwipeDismissBehavior$SettleRunnable": "androidx/design/widget/SwipeDismissBehavior$SettleRunnable",
-      "android/support/v13/view/inputmethod/InputConnectionCompat$InputContentInfoCompatBaseImpl": "androidx/view/inputmethod/InputConnectionCompat$InputContentInfoCompatBaseImpl",
-      "android/support/v17/leanback/widget/FacetProvider": "androidx/leanback/widget/FacetProvider",
-      "android/support/v7/widget/FitWindowsLinearLayout": "androidx/widget/FitWindowsLinearLayout",
-      "android/support/v4/widget/SwipeProgressBar": "androidx/widget/SwipeProgressBar",
-      "android/support/v7/widget/ActionMenuPresenter$OverflowPopup": "androidx/widget/ActionMenuPresenter$OverflowPopup",
-      "android/support/v7/widget/AppCompatImageHelper": "androidx/widget/AppCompatImageHelper",
-      "android/support/v4/text/TextDirectionHeuristicsCompat": "androidx/text/TextDirectionHeuristicsCompat",
-      "android/support/compat/R$color": "androidx/compat/R$color",
-      "android/support/transition/Transition$EpicenterCallback": "androidx/transition/Transition$EpicenterCallback",
-      "android/support/transition/PropertyValuesHolderUtilsApi14": "androidx/transition/PropertyValuesHolderUtilsApi14",
-      "android/support/v17/leanback/widget/ObjectAdapter$DataObservable": "androidx/leanback/widget/ObjectAdapter$DataObservable",
-      "android/support/multidex/ZipUtil": "androidx/multidex/ZipUtil",
-      "android/support/v7/view/menu/MenuDialogHelper": "androidx/view/menu/MenuDialogHelper",
-      "android/support/v17/preference/R$id": "androidx/leanback/preference/R$id",
-      "android/support/v4/app/BundleCompat": "androidx/app/BundleCompat",
-      "android/support/v4/media/session/IMediaSession$Stub$Proxy": "androidx/media/session/IMediaSession$Stub$Proxy",
-      "android/support/v7/widget/AppCompatTextHelper": "androidx/widget/AppCompatTextHelper",
-      "android/support/v7/view/ActionMode$Callback": "androidx/view/ActionMode$Callback",
-      "android/support/v17/leanback/app/RowsSupportFragment": "androidx/leanback/app/RowsSupportFragment",
-      "android/support/v17/leanback/app/GuidedStepFragment$DummyFragment": "androidx/leanback/app/GuidedStepFragment$DummyFragment",
-      "android/support/v7/widget/util/SortedListAdapterCallback": "androidx/widget/util/SortedListAdapterCallback",
-      "android/support/design/internal/BottomNavigationPresenter$SavedState": "androidx/design/internal/BottomNavigationPresenter$SavedState",
-      "android/support/v7/widget/LinearSmoothScroller": "androidx/widget/LinearSmoothScroller",
-      "android/support/v17/leanback/media/MediaPlayerGlue$VideoPlayerSurfaceHolderCallback": "androidx/leanback/media/MediaPlayerGlue$VideoPlayerSurfaceHolderCallback",
-      "android/support/v7/preference/Preference": "androidx/preference/Preference",
-      "android/support/v4/os/UserManagerCompat": "androidx/os/UserManagerCompat",
-      "android/support/v7/widget/GridLayoutManager$DefaultSpanSizeLookup": "androidx/widget/GridLayoutManager$DefaultSpanSizeLookup",
-      "android/support/v17/leanback/app/PlaybackFragment": "androidx/leanback/app/PlaybackFragment",
-      "android/support/transition/ViewOverlayImpl": "androidx/transition/ViewOverlayImpl",
-      "android/support/transition/ViewOverlayApi14$OverlayViewGroup$TouchInterceptor": "androidx/transition/ViewOverlayApi14$OverlayViewGroup$TouchInterceptor",
-      "android/support/v7/view/menu/MenuAdapter": "androidx/view/menu/MenuAdapter",
-      "android/support/v4/app/NotificationCompat$MessagingStyle$Message": "androidx/app/NotificationCompat$MessagingStyle$Message",
-      "android/support/v4/graphics/drawable/DrawableWrapperApi21$DrawableWrapperStateLollipop": "androidx/graphics/drawable/DrawableWrapperApi21$DrawableWrapperStateLollipop",
-      "android/support/v17/leanback/widget/ItemAlignmentFacet$ItemAlignmentDef": "androidx/leanback/widget/ItemAlignmentFacet$ItemAlignmentDef",
-      "android/support/v4/content/SharedPreferencesCompat": "androidx/content/SharedPreferencesCompat",
-      "android/support/v4/app/FragmentManager$BackStackEntry": "androidx/app/FragmentManager$BackStackEntry",
-      "android/support/transition/PropertyValuesHolderUtilsApi21": "androidx/transition/PropertyValuesHolderUtilsApi21",
-      "android/support/v17/leanback/R$color": "androidx/leanback/R$color",
-      "android/support/v7/view/menu/MenuView": "androidx/view/menu/MenuView",
-      "android/support/transition/Transition": "androidx/transition/Transition",
-      "android/support/v17/leanback/app/PlaybackFragmentGlueHost": "androidx/leanback/app/PlaybackFragmentGlueHost",
-      "android/support/v7/graphics/Target": "androidx/graphics/palette/Target",
-      "android/support/v7/view/StandaloneActionMode": "androidx/view/StandaloneActionMode",
-      "android/support/v13/view/DragAndDropPermissionsCompat$Api24DragAndDropPermissionsCompatImpl": "androidx/view/DragAndDropPermissionsCompat$Api24DragAndDropPermissionsCompatImpl",
-      "android/support/v7/widget/ViewInfoStore$ProcessCallback": "androidx/widget/ViewInfoStore$ProcessCallback",
-      "android/support/v4/media/session/MediaSessionCompatApi24": "androidx/media/session/MediaSessionCompatApi24",
-      "android/support/v4/widget/CursorFilter": "androidx/widget/CursorFilter",
-      "android/support/v4/media/session/MediaSessionCompatApi23": "androidx/media/session/MediaSessionCompatApi23",
-      "android/support/v4/media/session/MediaSessionCompatApi22": "androidx/media/session/MediaSessionCompatApi22",
-      "android/support/v7/app/ActionBarDrawerToggle$DelegateProvider": "androidx/app/ActionBarDrawerToggle$DelegateProvider",
-      "android/support/v4/media/session/MediaSessionCompatApi21": "androidx/media/session/MediaSessionCompatApi21",
-      "android/support/v7/widget/RecyclerView$OnItemTouchListener": "androidx/widget/RecyclerView$OnItemTouchListener",
-      "android/support/v4/media/MediaBrowserServiceCompat$ServiceHandler": "androidx/media/MediaBrowserServiceCompat$ServiceHandler",
-      "android/support/v4/view/PagerTitleStrip": "androidx/widget/PagerTitleStrip",
-      "android/support/v17/leanback/media/MediaPlayerAdapter$VideoPlayerSurfaceHolderCallback": "androidx/leanback/media/MediaPlayerAdapter$VideoPlayerSurfaceHolderCallback",
-      "android/support/v7/widget/ButtonBarLayout": "androidx/widget/ButtonBarLayout",
-      "android/support/annotation/PluralsRes": "androidx/annotation/PluralsRes",
-      "android/support/v7/appcompat/R$styleable": "androidx/appcompat/R$styleable",
-      "android/support/v7/widget/Toolbar": "androidx/widget/Toolbar",
-      "android/support/v17/leanback/app/DetailsFragmentBackgroundController": "androidx/leanback/app/DetailsFragmentBackgroundController",
-      "android/support/v7/view/menu/CascadingMenuPopup$CascadingMenuInfo": "androidx/view/menu/CascadingMenuPopup$CascadingMenuInfo",
-      "android/support/wear/widget/RoundedDrawable": "androidx/wear/widget/RoundedDrawable",
-      "android/support/v4/math/MathUtils": "androidx/math/MathUtils",
-      "android/support/design/widget/FloatingActionButton": "androidx/design/widget/FloatingActionButton",
-      "android/support/v7/mediarouter/R$drawable": "androidx/mediarouter/R$drawable",
-      "android/support/v4/view/MenuCompat": "androidx/view/MenuCompat",
-      "android/support/v17/leanback/widget/ListRowPresenter$SelectItemViewHolderTask": "androidx/leanback/widget/ListRowPresenter$SelectItemViewHolderTask",
-      "android/support/v7/appcompat/R$color": "androidx/appcompat/R$color",
-      "android/support/media/tv/BaseProgram$Builder": "androidx/media/tv/BaseProgram$Builder",
-      "android/support/v17/leanback/widget/ControlButtonPresenterSelector": "androidx/leanback/widget/ControlButtonPresenterSelector",
-      "android/support/v4/util/MapCollections$KeySet": "androidx/util/MapCollections$KeySet",
-      "android/support/annotation/XmlRes": "androidx/annotation/XmlRes",
-      "android/support/v7/widget/RecyclerView$LayoutManager$Properties": "androidx/widget/RecyclerView$LayoutManager$Properties",
-      "android/support/v4/media/MediaBrowserCompat$ConnectionCallback$ConnectionCallbackInternal": "androidx/media/MediaBrowserCompat$ConnectionCallback$ConnectionCallbackInternal",
-      "android/support/v4/app/RemoteInput$Builder": "androidx/app/RemoteInput$Builder",
-      "android/support/wear/widget/WearableRecyclerView": "androidx/wear/widget/WearableRecyclerView",
-      "android/support/v7/app/AppCompatDialog": "androidx/app/AppCompatDialog",
-      "android/support/v4/app/NotificationManagerCompat$SideChannelManager$ListenerRecord": "androidx/app/NotificationManagerCompat$SideChannelManager$ListenerRecord",
-      "android/support/v4/print/PrintHelper$OnPrintFinishCallback": "androidx/print/PrintHelper$OnPrintFinishCallback",
-      "android/support/v17/leanback/app/FragmentUtil": "androidx/leanback/app/FragmentUtil",
-      "android/support/v17/leanback/widget/RowPresenter$ContainerViewHolder": "androidx/leanback/widget/RowPresenter$ContainerViewHolder",
-      "android/support/v4/media/session/MediaControllerCompat$TransportControlsApi24": "androidx/media/session/MediaControllerCompat$TransportControlsApi24",
-      "android/support/v13/view/inputmethod/InputContentInfoCompat$InputContentInfoCompatImpl": "androidx/view/inputmethod/InputContentInfoCompat$InputContentInfoCompatImpl",
-      "android/support/v17/preference/LeanbackListPreferenceDialogFragment$ViewHolder$OnItemClickListener": "androidx/leanback/preference/LeanbackListPreferenceDialogFragment$ViewHolder$OnItemClickListener",
+      "android/support/v17/leanback/app/BackgroundFragment": "androidx/leanback/app/BackgroundFragment",
+      "android/support/v17/leanback/app/BackgroundManager": "androidx/leanback/app/BackgroundManager",
+      "android/support/v17/leanback/app/BackgroundManager$1$1": "androidx/leanback/app/BackgroundManager$1$1",
+      "android/support/v17/leanback/app/BackgroundManager$1": "androidx/leanback/app/BackgroundManager$1",
       "android/support/v17/leanback/app/BackgroundManager$TranslucentLayerDrawable": "androidx/leanback/app/BackgroundManager$TranslucentLayerDrawable",
-      "android/support/v4/app/FragmentManagerState": "androidx/app/FragmentManagerState",
-      "android/support/v4/media/session/MediaControllerCompat$TransportControlsApi23": "androidx/media/session/MediaControllerCompat$TransportControlsApi23",
-      "android/support/v4/view/AsyncLayoutInflater$BasicInflater": "androidx/view/AsyncLayoutInflater$BasicInflater",
-      "android/support/v7/appcompat/R$dimen": "androidx/appcompat/R$dimen",
-      "android/support/v4/media/session/MediaControllerCompat$TransportControlsApi21": "androidx/media/session/MediaControllerCompat$TransportControlsApi21",
-      "android/support/wear/widget/CircularProgressLayout": "androidx/wear/widget/CircularProgressLayout",
-      "android/support/v7/media/SystemMediaRouteProvider$JellybeanMr1Impl": "androidx/media/SystemMediaRouteProvider$JellybeanMr1Impl",
-      "android/support/customtabs/ICustomTabsCallback$Stub": "androidx/browser/customtabs/ICustomTabsCallback$Stub",
-      "android/support/v17/leanback/widget/RowPresenter$ViewHolder": "androidx/leanback/widget/RowPresenter$ViewHolder",
-      "android/support/v7/widget/RecyclerView$LayoutManager$LayoutPrefetchRegistry": "androidx/widget/RecyclerView$LayoutManager$LayoutPrefetchRegistry",
-      "android/support/v4/media/MediaBrowserServiceCompatApi23$MediaBrowserServiceAdaptor": "androidx/media/MediaBrowserServiceCompatApi23$MediaBrowserServiceAdaptor",
-      "android/support/v17/leanback/app/ListRowDataAdapter": "androidx/leanback/app/ListRowDataAdapter",
-      "android/support/v4/graphics/drawable/DrawableWrapper": "androidx/graphics/drawable/internal/DrawableWrapper",
-      "android/support/v7/widget/SuggestionsAdapter": "androidx/widget/SuggestionsAdapter",
-      "android/support/v4/widget/TextViewCompat": "androidx/widget/TextViewCompat",
-      "android/support/animation/FlingAnimation": "androidx/animation/FlingAnimation",
-      "android/support/media/tv/PreviewProgram$Builder": "androidx/media/tv/PreviewProgram$Builder",
-      "android/support/v7/widget/RecyclerView$AdapterDataObservable": "androidx/widget/RecyclerView$AdapterDataObservable",
-      "android/support/v17/leanback/app/BaseRowSupportFragment$LateSelectionObserver": "androidx/leanback/app/BaseRowSupportFragment$LateSelectionObserver",
-      "android/support/design/internal/SnackbarContentLayout": "androidx/design/internal/SnackbarContentLayout",
-      "android/support/v17/leanback/widget/BaseGridView$OnMotionInterceptListener": "androidx/leanback/widget/BaseGridView$OnMotionInterceptListener",
-      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter$ViewHolder": "androidx/leanback/widget/PlaybackTransportRowPresenter$ViewHolder",
-      "android/support/v7/widget/CardViewBaseImpl": "androidx/widget/CardViewBaseImpl",
-      "android/support/v4/provider/FontsContractCompat$FontFamilyResult": "androidx/provider/FontsContractCompat$FontFamilyResult",
-      "android/support/v4/os/ResultReceiver$MyRunnable": "androidx/os/ResultReceiver$MyRunnable",
-      "android/support/v7/media/MediaRouteProvider$RouteController": "androidx/media/MediaRouteProvider$RouteController",
-      "android/support/v14/preference/PreferenceFragment$DividerDecoration": "androidx/preference/PreferenceFragment$DividerDecoration",
-      "android/support/text/emoji/flatbuffer/MetadataItem": "androidx/text/emoji/flatbuffer/MetadataItem",
-      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplApi18": "androidx/media/session/MediaSessionCompat$MediaSessionImplApi18",
-      "android/support/v7/widget/ToolbarWidgetWrapper": "androidx/widget/ToolbarWidgetWrapper",
-      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplApi19": "androidx/media/session/MediaSessionCompat$MediaSessionImplApi19",
-      "android/support/v7/widget/helper/ItemTouchHelper$ItemTouchHelperGestureListener": "androidx/widget/helper/ItemTouchHelper$ItemTouchHelperGestureListener",
-      "android/support/v7/appcompat/R$layout": "androidx/appcompat/R$layout",
-      "android/support/text/emoji/widget/EmojiEditTextHelper$HelperInternal19": "androidx/text/emoji/widget/EmojiEditTextHelper$HelperInternal19",
+      "android/support/v17/leanback/R$id": "androidx/leanback/R$id",
+      "android/support/v17/leanback/R": "androidx/leanback/R",
+      "android/support/v17/leanback/app/BackgroundManager$2": "androidx/leanback/app/BackgroundManager$2",
+      "android/support/v17/leanback/app/BackgroundManager$BackgroundContinuityService": "androidx/leanback/app/BackgroundManager$BackgroundContinuityService",
+      "android/support/v4/content/ContextCompat": "androidx/content/ContextCompat",
       "android/support/v17/leanback/app/BackgroundManager$BitmapDrawable$ConstantState": "androidx/leanback/app/BackgroundManager$BitmapDrawable$ConstantState",
-      "android/support/design/widget/FloatingActionButtonImpl$ShadowAnimatorImpl": "androidx/design/widget/FloatingActionButtonImpl$ShadowAnimatorImpl",
-      "android/support/v7/widget/FastScroller$AnimatorListener": "androidx/widget/FastScroller$AnimatorListener",
-      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter",
-      "android/support/v4/app/NotificationCompat$WearableExtender": "androidx/app/NotificationCompat$WearableExtender",
-      "android/support/v17/leanback/widget/FocusHighlightHandler": "androidx/leanback/widget/FocusHighlightHandler",
-      "android/support/transition/Slide$GravityFlag": "androidx/transition/Slide$GravityFlag",
-      "android/support/v4/app/FragmentManagerImpl$AnimateOnHWLayerIfNeededListener": "androidx/app/FragmentManagerImpl$AnimateOnHWLayerIfNeededListener",
-      "android/support/v4/widget/ListViewCompat": "androidx/widget/ListViewCompat",
-      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplApi21": "androidx/media/session/MediaSessionCompat$MediaSessionImplApi21",
-      "android/support/graphics/drawable/Animatable2Compat$AnimationCallback": "androidx/graphics/drawable/Animatable2Compat$AnimationCallback",
-      "android/support/v17/leanback/widget/ControlButtonPresenterSelector$ActionViewHolder": "androidx/leanback/widget/ControlButtonPresenterSelector$ActionViewHolder",
-      "android/support/transition/GhostViewApi14$Creator": "androidx/transition/GhostViewApi14$Creator",
-      "android/support/v4/widget/PopupWindowCompat$PopupWindowCompatApi19Impl": "androidx/widget/PopupWindowCompat$PopupWindowCompatApi19Impl",
-      "android/support/v17/leanback/widget/GuidedActionsStylist": "androidx/leanback/widget/GuidedActionsStylist",
-      "android/support/v4/app/ActivityCompat$SharedElementCallback21Impl": "androidx/app/legacy/ActivityCompat$SharedElementCallback21Impl",
-      "android/support/v17/leanback/app/BrowseFragment$FragmentFactory": "androidx/leanback/app/BrowseFragment$FragmentFactory",
-      "android/support/v7/widget/DefaultItemAnimator$MoveInfo": "androidx/widget/DefaultItemAnimator$MoveInfo",
-      "android/support/media/instantvideo/preload/InstantVideoPreloadManager$VideoPreloader": "androidx/media/instantvideo/preload/InstantVideoPreloadManager$VideoPreloader",
-      "android/support/v4/media/MediaBrowserCompat": "androidx/media/MediaBrowserCompat",
-      "android/support/v7/media/MediaRouter$RouteGroup": "androidx/media/MediaRouter$RouteGroup",
-      "android/support/v4/view/ViewCompat$OverScroll": "androidx/view/legacy/ViewCompat$OverScroll",
-      "android/support/v7/media/SystemMediaRouteProvider$LegacyImpl$VolumeChangeReceiver": "androidx/media/SystemMediaRouteProvider$LegacyImpl$VolumeChangeReceiver",
-      "android/support/v17/preference/LeanbackPreferenceFragmentTransitionHelperApi21": "androidx/leanback/preference/LeanbackPreferenceFragmentTransitionHelperApi21",
-      "android/support/v17/leanback/widget/BaseGridView$OnUnhandledKeyListener": "androidx/leanback/widget/BaseGridView$OnUnhandledKeyListener",
-      "android/support/v7/view/menu/ActionMenuItemView$ActionMenuItemForwardingListener": "androidx/view/menu/ActionMenuItemView$ActionMenuItemForwardingListener",
-      "android/support/v17/leanback/transition/FadeAndShortSlide": "androidx/leanback/transition/FadeAndShortSlide",
-      "android/support/v7/app/NavItemSelectedListener": "androidx/app/NavItemSelectedListener",
-      "android/support/v4/content/pm/ShortcutManagerCompat": "androidx/content/pm/ShortcutManagerCompat",
-      "android/support/v4/app/FragmentActivity$HostCallbacks": "androidx/app/FragmentActivity$HostCallbacks",
-      "android/support/design/widget/CoordinatorLayout$LayoutParams": "androidx/design/widget/CoordinatorLayout$LayoutParams",
-      "android/support/v4/view/MenuItemCompat$MenuItemCompatApi26Impl": "androidx/view/MenuItemCompat$MenuItemCompatApi26Impl",
-      "android/support/transition/ViewGroupOverlayApi18": "androidx/transition/ViewGroupOverlayApi18",
-      "android/support/v17/preference/LeanbackSettingsFragment": "androidx/leanback/preference/LeanbackSettingsFragment",
-      "android/support/v17/leanback/widget/RowHeaderPresenter$ViewHolder": "androidx/leanback/widget/RowHeaderPresenter$ViewHolder",
-      "android/support/wear/ambient/AmbientMode$AmbientController": "androidx/wear/ambient/AmbientMode$AmbientController",
-      "android/support/v7/cardview/R$color": "androidx/cardview/R$color",
-      "android/support/annotation/MenuRes": "androidx/annotation/MenuRes",
-      "android/support/v7/media/MediaRouterJellybeanMr2": "androidx/media/MediaRouterJellybeanMr2",
-      "android/support/v7/widget/GridLayout$PackedMap": "androidx/widget/GridLayout$PackedMap",
-      "android/support/v7/media/MediaRouterJellybeanMr1": "androidx/media/MediaRouterJellybeanMr1",
-      "android/support/transition/ViewGroupOverlayApi14": "androidx/transition/ViewGroupOverlayApi14",
-      "android/support/v7/app/ActionBarDrawerToggleHoneycomb$SetIndicatorInfo": "androidx/app/ActionBarDrawerToggleHoneycomb$SetIndicatorInfo",
-      "android/support/wear/widget/drawer/FlingWatcherFactory$FlingWatcher": "androidx/wear/widget/drawer/FlingWatcherFactory$FlingWatcher",
-      "android/support/v17/leanback/widget/SparseArrayObjectAdapter": "androidx/leanback/widget/SparseArrayObjectAdapter",
-      "android/support/v4/media/session/MediaSessionCompatApi21$CallbackProxy": "androidx/media/session/MediaSessionCompatApi21$CallbackProxy",
-      "android/support/v4/app/NotificationCompat$CarExtender": "androidx/app/NotificationCompat$CarExtender",
-      "android/support/v17/leanback/widget/PlaybackControlsRowView$OnUnhandledKeyListener": "androidx/leanback/widget/PlaybackControlsRowView$OnUnhandledKeyListener",
-      "android/support/v7/view/menu/MenuPopupHelper": "androidx/view/menu/MenuPopupHelper",
-      "android/support/v17/leanback/app/VideoSupportFragment": "androidx/leanback/app/VideoSupportFragment",
-      "android/support/media/tv/Channel": "androidx/media/tv/Channel",
-      "android/support/v4/media/AudioAttributesCompat$AttributeContentType": "androidx/media/AudioAttributesCompat$AttributeContentType",
-      "android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper$TransitionTimeOutRunnable": "androidx/leanback/widget/DetailsOverviewSharedElementHelper$TransitionTimeOutRunnable",
-      "android/support/v17/leanback/app/BrowseSupportFragment$BrowseTransitionListener": "androidx/leanback/app/BrowseSupportFragment$BrowseTransitionListener",
-      "android/support/v4/view/ViewPager$ViewPositionComparator": "androidx/view/ViewPager$ViewPositionComparator",
-      "android/support/v4/app/NotificationCompat$Action": "androidx/app/NotificationCompat$Action",
-      "android/support/v7/preference/PreferenceManager$SimplePreferenceComparisonCallback": "androidx/preference/PreferenceManager$SimplePreferenceComparisonCallback",
-      "android/support/media/tv/TvContractCompat$BaseTvColumns": "androidx/media/tv/TvContractCompat$BaseTvColumns",
-      "android/support/v4/media/session/PlaybackStateCompat$ShuffleMode": "androidx/media/session/PlaybackStateCompat$ShuffleMode",
-      "android/support/v7/app/WindowDecorActionBar$TabImpl": "androidx/app/WindowDecorActionBar$TabImpl",
-      "android/support/graphics/drawable/VectorDrawableCompat$VectorDrawableDelegateState": "androidx/graphics/drawable/VectorDrawableCompat$VectorDrawableDelegateState",
-      "android/support/v7/media/SystemMediaRouteProvider$JellybeanImpl": "androidx/media/SystemMediaRouteProvider$JellybeanImpl",
-      "android/support/v7/widget/VectorEnabledTintResources": "androidx/widget/VectorEnabledTintResources",
-      "android/support/v7/preference/EditTextPreferenceDialogFragmentCompat": "androidx/preference/EditTextPreferenceDialogFragmentCompat",
-      "android/support/v4/graphics/drawable/DrawableWrapperApi19$DrawableWrapperStateKitKat": "androidx/graphics/drawable/DrawableWrapperApi19$DrawableWrapperStateKitKat",
-      "android/support/v17/leanback/transition/TransitionHelperKitkat$CustomChangeBounds": "androidx/leanback/transition/TransitionHelperKitkat$CustomChangeBounds",
-      "android/support/v4/app/FragmentManagerImpl$StartEnterTransitionListener": "androidx/app/FragmentManagerImpl$StartEnterTransitionListener",
-      "android/support/v4/view/LayoutInflaterCompat$LayoutInflaterCompatBaseImpl": "androidx/view/LayoutInflaterCompat$LayoutInflaterCompatBaseImpl",
-      "android/support/v7/view/SupportMenuInflater$MenuState": "androidx/view/SupportMenuInflater$MenuState",
-      "android/support/v17/leanback/app/GuidedStepFragment": "androidx/leanback/app/GuidedStepFragment",
-      "android/support/v17/leanback/widget/PagingIndicator": "androidx/leanback/widget/PagingIndicator",
-      "android/support/v7/app/MediaRouteControllerDialog$MediaRouterCallback": "androidx/app/MediaRouteControllerDialog$MediaRouterCallback",
-      "android/support/design/widget/CoordinatorLayout$DefaultBehavior": "androidx/design/widget/CoordinatorLayout$DefaultBehavior",
-      "android/support/v4/os/LocaleListInterface": "androidx/os/LocaleListInterface",
-      "android/support/v4/hardware/fingerprint/FingerprintManagerCompat$AuthenticationCallback": "androidx/hardware/fingerprint/FingerprintManagerCompat$AuthenticationCallback",
-      "android/support/v17/leanback/widget/Parallax$FloatProperty": "androidx/leanback/widget/Parallax$FloatProperty",
-      "android/support/v4/app/NotificationCompat$Style": "androidx/app/NotificationCompat$Style",
-      "android/support/v4/app/FrameMetricsAggregator$FrameMetricsApi24Impl": "androidx/app/FrameMetricsAggregator$FrameMetricsApi24Impl",
-      "android/support/v17/leanback/app/HeadersSupportFragment$OnHeaderClickedListener": "androidx/leanback/app/HeadersSupportFragment$OnHeaderClickedListener",
-      "android/support/v7/preference/PreferenceManager$OnNavigateToScreenListener": "androidx/preference/PreferenceManager$OnNavigateToScreenListener",
-      "android/support/v7/widget/AdapterHelper": "androidx/widget/AdapterHelper",
-      "android/support/v17/leanback/transition/SlideKitkat$CalculateSlideHorizontal": "androidx/leanback/transition/SlideKitkat$CalculateSlideHorizontal",
-      "android/support/v4/graphics/ColorUtils": "androidx/graphics/ColorUtils",
-      "android/support/v7/widget/ActionMenuPresenter$OverflowMenuButton": "androidx/widget/ActionMenuPresenter$OverflowMenuButton",
-      "android/support/v7/widget/ListPopupWindow": "androidx/widget/ListPopupWindow",
-      "android/support/v4/media/MediaBrowserServiceCompatApi21$MediaBrowserServiceAdaptor": "androidx/media/MediaBrowserServiceCompatApi21$MediaBrowserServiceAdaptor",
-      "android/support/v17/leanback/widget/Row": "androidx/leanback/widget/Row",
-      "android/support/v17/leanback/widget/ShadowOverlayHelper": "androidx/leanback/widget/ShadowOverlayHelper",
-      "android/support/wear/internal/widget/drawer/MultiPagePresenter": "androidx/wear/internal/widget/drawer/MultiPagePresenter",
-      "android/support/animation/SpringForce": "androidx/animation/SpringForce",
-      "android/support/customtabs/ICustomTabsService$Stub$Proxy": "androidx/browser/customtabs/ICustomTabsService$Stub$Proxy",
-      "android/support/annotation/StringDef": "androidx/annotation/StringDef",
-      "android/support/v4/media/session/MediaControllerCompat$MediaControllerImpl": "androidx/media/session/MediaControllerCompat$MediaControllerImpl",
-      "android/support/design/widget/CircularBorderDrawableLollipop": "androidx/design/widget/CircularBorderDrawableLollipop",
-      "android/support/v17/leanback/widget/ControlBarPresenter$BoundData": "androidx/leanback/widget/ControlBarPresenter$BoundData",
-      "android/support/v7/widget/RecyclerView$Orientation": "androidx/widget/RecyclerView$Orientation",
-      "android/support/v7/media/MediaRouteProviderService$ReceiveHandler": "androidx/media/MediaRouteProviderService$ReceiveHandler",
-      "android/support/v4/view/ViewPropertyAnimatorListenerAdapter": "androidx/view/ViewPropertyAnimatorListenerAdapter",
-      "android/support/v7/graphics/Palette$Swatch": "androidx/graphics/Palette$Swatch",
-      "android/support/v17/leanback/widget/GridLayoutManager": "androidx/leanback/widget/GridLayoutManager",
-      "android/support/v17/leanback/media/PlaybackGlue": "androidx/leanback/media/PlaybackGlue",
-      "android/support/v17/leanback/widget/ShadowHelper$ShadowHelperApi21Impl": "androidx/leanback/widget/ShadowHelper$ShadowHelperApi21Impl",
-      "android/support/v4/view/ViewCompat": "androidx/view/legacy/ViewCompat",
-      "android/support/v17/leanback/widget/BackgroundHelper": "androidx/leanback/widget/BackgroundHelper",
-      "android/support/design/widget/AppBarLayout$OnOffsetChangedListener": "androidx/design/widget/AppBarLayout$OnOffsetChangedListener",
-      "android/support/v4/view/GestureDetectorCompat$GestureDetectorCompatImplJellybeanMr2": "androidx/view/GestureDetectorCompat$GestureDetectorCompatImplJellybeanMr2",
-      "android/support/v7/appcompat/R$attr": "androidx/appcompat/R$attr",
-      "android/support/transition/TransitionValuesMaps": "androidx/transition/TransitionValuesMaps",
-      "android/support/v4/view/ViewConfigurationCompat": "androidx/view/ViewConfigurationCompat",
-      "android/support/v4/media/MediaBrowserServiceCompat$ServiceCallbacks": "androidx/media/MediaBrowserServiceCompat$ServiceCallbacks",
-      "android/support/v4/widget/AutoSizeableTextView": "androidx/widget/AutoSizeableTextView",
-      "android/support/v4/view/ViewCompat$LayerType": "androidx/view/legacy/ViewCompat$LayerType",
-      "android/support/v17/leanback/widget/DividerRow": "androidx/leanback/widget/DividerRow",
-      "android/support/v7/widget/ActionMenuPresenter$SavedState": "androidx/widget/ActionMenuPresenter$SavedState",
-      "android/support/design/internal/NavigationMenu": "androidx/design/internal/NavigationMenu",
-      "android/support/v7/preference/Preference$OnPreferenceChangeInternalListener": "androidx/preference/Preference$OnPreferenceChangeInternalListener",
-      "android/support/v4/app/JobIntentService": "androidx/app/JobIntentService",
-      "android/support/v4/app/Fragment": "androidx/app/Fragment",
-      "android/support/v17/leanback/app/BrowseSupportFragment$BackStackListener": "androidx/leanback/app/BrowseSupportFragment$BackStackListener",
-      "android/support/v7/widget/RecyclerView$OnChildAttachStateChangeListener": "androidx/widget/RecyclerView$OnChildAttachStateChangeListener",
-      "android/support/v17/leanback/widget/PlaybackSeekDataProvider": "androidx/leanback/widget/PlaybackSeekDataProvider",
-      "android/support/content/ContentPager": "androidx/content/ContentPager",
-      "android/support/v4/util/MapCollections$MapIterator": "androidx/util/MapCollections$MapIterator",
-      "android/support/app/recommendation/ContentRecommendation": "androidx/app/recommendation/ContentRecommendation",
-      "android/support/v7/app/ActionBar$OnNavigationListener": "androidx/app/ActionBar$OnNavigationListener",
-      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplBase": "androidx/media/session/MediaSessionCompat$MediaSessionImplBase",
-      "android/support/transition/Styleable$ChangeTransform": "androidx/transition/Styleable$ChangeTransform",
-      "android/support/v7/media/SystemMediaRouteProvider$LegacyImpl$DefaultRouteController": "androidx/media/SystemMediaRouteProvider$LegacyImpl$DefaultRouteController",
-      "android/support/v4/net/DatagramSocketWrapper$DatagramSocketImplWrapper": "androidx/net/DatagramSocketWrapper$DatagramSocketImplWrapper",
-      "android/support/v17/leanback/R$layout": "androidx/leanback/R$layout",
-      "android/support/v4/app/FragmentHostCallback": "androidx/app/FragmentHostCallback",
-      "android/support/v7/widget/StaggeredGridLayoutManager$AnchorInfo": "androidx/widget/StaggeredGridLayoutManager$AnchorInfo",
-      "android/support/v7/widget/RecyclerView$State": "androidx/widget/RecyclerView$State",
-      "android/support/v7/media/MediaRouterJellybean$Callback": "androidx/media/MediaRouterJellybean$Callback",
-      "android/support/v14/preference/MultiSelectListPreferenceDialogFragment": "androidx/preference/MultiSelectListPreferenceDialogFragment",
-      "android/support/v4/media/MediaBrowserServiceCompatApi21$ServiceCompatProxy": "androidx/media/MediaBrowserServiceCompatApi21$ServiceCompatProxy",
-      "android/support/v4/text/util/LinkifyCompat$LinkSpec": "androidx/text/util/LinkifyCompat$LinkSpec",
-      "android/support/v4/app/NotificationManagerCompat$ServiceConnectedEvent": "androidx/app/NotificationManagerCompat$ServiceConnectedEvent",
-      "android/support/v4/graphics/drawable/IconCompat": "androidx/graphics/drawable/IconCompat",
-      "android/support/v17/leanback/graphics/ColorOverlayDimmer": "androidx/leanback/graphics/ColorOverlayDimmer",
-      "android/support/v17/leanback/R$styleable": "androidx/leanback/R$styleable",
-      "android/support/v4/view/AccessibilityDelegateCompat": "androidx/view/AccessibilityDelegateCompat",
-      "android/support/v7/cardview/R$dimen": "androidx/cardview/R$dimen",
-      "android/support/wear/widget/SwipeDismissFrameLayout$Callback": "androidx/wear/widget/SwipeDismissFrameLayout$Callback",
-      "android/support/transition/ArcMotion": "androidx/transition/ArcMotion",
-      "android/support/mediacompat/R$layout": "androidx/mediacompat/R$layout",
-      "android/support/v4/view/ViewPager$ItemInfo": "androidx/view/ViewPager$ItemInfo",
-      "android/support/v4/app/FragmentActivity": "androidx/app/FragmentActivity",
-      "android/support/animation/FloatPropertyCompat": "androidx/animation/FloatPropertyCompat",
-      "android/support/v17/leanback/widget/ObjectAdapter$DataObserver": "androidx/leanback/widget/ObjectAdapter$DataObserver",
-      "android/support/design/widget/AppBarLayout$LayoutParams$ScrollFlags": "androidx/design/widget/AppBarLayout$LayoutParams$ScrollFlags",
-      "android/support/v7/widget/AbsActionBarView": "androidx/widget/AbsActionBarView",
-      "android/support/v4/media/app/NotificationCompat": "androidx/media/app/NotificationCompat",
-      "android/support/v17/leanback/media/PlayerAdapter": "androidx/leanback/media/PlayerAdapter",
-      "android/support/v17/leanback/widget/GridLayoutManager$SavedState": "androidx/leanback/widget/GridLayoutManager$SavedState",
-      "android/support/transition/Fade": "androidx/transition/Fade",
-      "android/support/v17/leanback/R$animator": "androidx/leanback/R$animator",
-      "android/support/v4/view/ViewCompat$ScrollAxis": "androidx/view/legacy/ViewCompat$ScrollAxis",
-      "android/support/v17/leanback/widget/GuidedActionEditText$NoPaddingDrawable": "androidx/leanback/widget/GuidedActionEditText$NoPaddingDrawable",
-      "android/support/v7/widget/GridLayout$Axis": "androidx/widget/GridLayout$Axis",
-      "android/support/v4/app/FragmentManagerImpl$AnimationListenerWrapper": "androidx/app/FragmentManagerImpl$AnimationListenerWrapper",
-      "android/support/v4/view/ViewParentCompat$ViewParentCompatBaseImpl": "androidx/view/ViewParentCompat$ViewParentCompatBaseImpl",
-      "android/support/v7/util/DiffUtil$Snake": "androidx/util/DiffUtil$Snake",
-      "android/support/v7/app/AppCompatDelegateImplV9$PanelFeatureState$SavedState": "androidx/app/AppCompatDelegateImplV9$PanelFeatureState$SavedState",
-      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter$ViewHolder": "androidx/leanback/widget/DetailsOverviewRowPresenter$ViewHolder",
-      "android/support/v4/media/RatingCompat$Style": "androidx/media/RatingCompat$Style",
-      "android/support/v7/widget/GridLayout$Spec": "androidx/widget/GridLayout$Spec",
-      "android/support/constraint/solver/widgets/ConstraintAnchor": "androidx/constraint/solver/widgets/ConstraintAnchor",
-      "android/support/v17/leanback/widget/FullWidthDetailsOverviewSharedElementHelper$TransitionTimeOutRunnable": "androidx/leanback/widget/FullWidthDetailsOverviewSharedElementHelper$TransitionTimeOutRunnable",
-      "android/support/v4/view/LayoutInflaterFactory": "androidx/view/LayoutInflaterFactory",
-      "android/support/v17/leanback/app/BrowseFragment$MainFragmentAdapterProvider": "androidx/leanback/app/BrowseFragment$MainFragmentAdapterProvider",
-      "android/support/v7/app/OverlayListView$OverlayObject$OnAnimationEndListener": "androidx/app/OverlayListView$OverlayObject$OnAnimationEndListener",
-      "android/support/v7/app/AlertController$RecycleListView": "androidx/app/AlertController$RecycleListView",
-      "android/support/v4/view/ViewCompat$ViewCompatApi18Impl": "androidx/view/legacy/ViewCompat$ViewCompatApi18Impl",
-      "android/support/v4/text/TextUtilsCompat": "androidx/text/TextUtilsCompat",
-      "android/support/v17/leanback/widget/Action": "androidx/leanback/widget/Action",
-      "android/support/v7/widget/RecyclerView$ItemAnimator$AdapterChanges": "androidx/widget/RecyclerView$ItemAnimator$AdapterChanges",
-      "android/support/v4/media/session/MediaControllerCompat$MediaControllerExtraData": "androidx/media/session/MediaControllerCompat$MediaControllerExtraData",
-      "android/support/v4/media/session/MediaControllerCompat$TransportControlsBase": "androidx/media/session/MediaControllerCompat$TransportControlsBase",
-      "android/support/v13/view/inputmethod/InputConnectionCompat$InputConnectionCompatImpl": "androidx/view/inputmethod/InputConnectionCompat$InputConnectionCompatImpl",
-      "android/support/v4/media/ParceledListSliceAdapterApi21": "androidx/media/ParceledListSliceAdapterApi21",
-      "android/support/v17/leanback/widget/ItemBridgeAdapter": "androidx/leanback/widget/ItemBridgeAdapter",
-      "android/support/v13/view/inputmethod/InputConnectionCompat": "androidx/view/inputmethod/InputConnectionCompat",
-      "android/support/v4/widget/ResourceCursorAdapter": "androidx/widget/ResourceCursorAdapter",
-      "android/support/v7/view/WindowCallbackWrapper": "androidx/view/WindowCallbackWrapper",
-      "android/support/v7/widget/AdapterHelper$UpdateOp": "androidx/widget/AdapterHelper$UpdateOp",
-      "android/support/v4/content/res/FontResourcesParserCompat$FontFileResourceEntry": "androidx/content/res/FontResourcesParserCompat$FontFileResourceEntry",
-      "android/support/v4/app/NavUtils": "androidx/app/NavUtils",
-      "android/support/v4/internal/view/SupportMenuItem": "androidx/internal/view/SupportMenuItem",
-      "android/support/v7/widget/FastScroller$DragState": "androidx/widget/FastScroller$DragState",
-      "android/support/annotation/Size": "androidx/annotation/Size",
-      "android/support/wear/widget/drawer/WearableNavigationDrawerView$OnItemSelectedListener": "androidx/wear/widget/drawer/WearableNavigationDrawerView$OnItemSelectedListener",
-      "android/support/transition/WindowIdImpl": "androidx/transition/WindowIdImpl",
-      "android/support/v7/media/RemoteControlClientCompat$LegacyImpl": "androidx/media/RemoteControlClientCompat$LegacyImpl",
-      "android/support/transition/Slide$CalculateSlideVertical": "androidx/transition/Slide$CalculateSlideVertical",
-      "android/support/v17/leanback/app/VideoFragment": "androidx/leanback/app/VideoFragment",
-      "android/support/v4/widget/NestedScrollView$OnScrollChangeListener": "androidx/widget/NestedScrollView$OnScrollChangeListener",
-      "android/support/v7/media/MediaRouter$CallbackFlags": "androidx/media/MediaRouter$CallbackFlags",
-      "android/support/customtabs/IPostMessageService": "androidx/browser/customtabs/IPostMessageService",
-      "android/support/v4/util/AtomicFile": "androidx/util/AtomicFile",
-      "android/support/v4/provider/DocumentsContractApi19": "androidx/provider/DocumentsContractApi19",
-      "android/support/v17/leanback/widget/picker/Picker$ViewHolder": "androidx/leanback/widget/picker/Picker$ViewHolder",
-      "android/support/v4/widget/AutoScrollHelper": "androidx/widget/AutoScrollHelper",
-      "android/support/v4/widget/DrawerLayout$LockMode": "androidx/widget/DrawerLayout$LockMode",
-      "android/support/v17/leanback/transition/SlideKitkat$CalculateSlideVertical": "androidx/leanback/transition/SlideKitkat$CalculateSlideVertical",
-      "android/support/v4/os/BuildCompat": "androidx/os/BuildCompat",
-      "android/support/wear/ambient/SharedLibraryVersion$PresenceHolder": "androidx/wear/ambient/SharedLibraryVersion$PresenceHolder",
-      "android/support/transition/ObjectAnimatorUtilsImpl": "androidx/transition/ObjectAnimatorUtilsImpl",
-      "android/support/v7/widget/SearchView$OnSuggestionListener": "androidx/widget/SearchView$OnSuggestionListener",
-      "android/support/design/internal/NavigationMenuPresenter": "androidx/design/internal/NavigationMenuPresenter",
-      "android/support/v17/leanback/widget/ShadowHelper$ShadowHelperVersionImpl": "androidx/leanback/widget/ShadowHelper$ShadowHelperVersionImpl",
-      "android/support/v7/media/RemotePlaybackClient$ItemActionCallback": "androidx/media/RemotePlaybackClient$ItemActionCallback",
-      "android/support/annotation/Dimension": "androidx/annotation/Dimension",
-      "android/support/v13/view/DragStartHelper$OnDragStartListener": "androidx/view/DragStartHelper$OnDragStartListener",
-      "android/support/text/emoji/R$id": "androidx/text/emoji/R$id",
-      "android/support/wear/widget/CurvingLayoutCallback": "androidx/wear/widget/CurvingLayoutCallback",
-      "android/support/v17/leanback/app/RowsFragment": "androidx/leanback/app/RowsFragment",
-      "android/support/v7/widget/TooltipCompat": "androidx/widget/TooltipCompat",
-      "android/support/v7/widget/SnapHelper": "androidx/widget/SnapHelper",
-      "android/support/v7/mediarouter/R$layout": "androidx/mediarouter/R$layout",
-      "android/support/transition/R$id": "androidx/transition/R$id",
-      "android/support/v4/graphics/BitmapCompat$BitmapCompatBaseImpl": "androidx/graphics/BitmapCompat$BitmapCompatBaseImpl",
-      "android/support/v4/media/VolumeProviderCompatApi21$Delegate": "androidx/media/VolumeProviderCompatApi21$Delegate",
-      "android/support/v17/leanback/widget/SearchBar$SearchBarListener": "androidx/leanback/widget/SearchBar$SearchBarListener",
-      "android/support/v17/leanback/app/SearchFragment": "androidx/leanback/app/SearchFragment",
-      "android/support/v4/view/LayoutInflaterCompat": "androidx/view/LayoutInflaterCompat",
-      "android/support/v7/widget/CardViewApi21Impl": "androidx/widget/CardViewApi21Impl",
-      "android/support/v17/leanback/widget/VideoSurfaceView": "androidx/leanback/widget/VideoSurfaceView",
-      "android/support/transition/GhostViewImpl": "androidx/transition/GhostViewImpl",
-      "android/support/transition/ChangeBounds": "androidx/transition/ChangeBounds",
-      "android/support/v17/leanback/app/HeadersFragment$OnHeaderViewSelectedListener": "androidx/leanback/app/HeadersFragment$OnHeaderViewSelectedListener",
-      "android/support/media/tv/PreviewProgram": "androidx/media/tv/PreviewProgram",
-      "android/support/annotation/RequiresApi": "androidx/annotation/RequiresApi",
-      "android/support/app/recommendation/RecommendationExtender": "androidx/app/recommendation/RecommendationExtender",
-      "android/support/v17/leanback/app/ErrorSupportFragment": "androidx/leanback/app/ErrorSupportFragment",
-      "android/support/v17/leanback/media/MediaPlayerGlue": "androidx/leanback/media/MediaPlayerGlue",
-      "android/support/v4/media/session/MediaSessionCompatApi21$QueueItem": "androidx/media/session/MediaSessionCompatApi21$QueueItem",
-      "android/support/v17/leanback/widget/AbstractMediaItemPresenter": "androidx/leanback/widget/AbstractMediaItemPresenter",
-      "android/support/annotation/StyleableRes": "androidx/annotation/StyleableRes",
-      "android/support/v4/media/session/PlaybackStateCompat$CustomAction": "androidx/media/session/PlaybackStateCompat$CustomAction",
-      "android/support/wear/widget/drawer/WearableDrawerLayout$TopDrawerDraggerCallback": "androidx/wear/widget/drawer/WearableDrawerLayout$TopDrawerDraggerCallback",
-      "android/support/v17/leanback/app/PermissionHelper": "androidx/leanback/app/PermissionHelper",
-      "android/support/transition/R": "androidx/transition/R",
-      "android/support/v17/leanback/transition/SlideKitkat$SlideAnimatorListener": "androidx/leanback/transition/SlideKitkat$SlideAnimatorListener",
-      "android/support/v7/graphics/drawable/DrawerArrowDrawable": "androidx/graphics/drawable/DrawerArrowDrawable",
-      "android/support/v17/leanback/widget/ClassPresenterSelector": "androidx/leanback/widget/ClassPresenterSelector",
-      "android/support/v17/leanback/widget/ControlBarPresenter$OnControlSelectedListener": "androidx/leanback/widget/ControlBarPresenter$OnControlSelectedListener",
-      "android/support/v4/app/NotificationCompat$GroupAlertBehavior": "androidx/app/NotificationCompat$GroupAlertBehavior",
-      "android/support/text/emoji/widget/EmojiInputFilter$InitCallbackImpl": "androidx/text/emoji/widget/EmojiInputFilter$InitCallbackImpl",
-      "android/support/v7/appcompat/R$bool": "androidx/appcompat/R$bool",
-      "android/support/v4/widget/TextViewCompat$AutoSizeTextType": "androidx/widget/TextViewCompat$AutoSizeTextType",
-      "android/support/v4/app/NotificationCompat$BadgeIconType": "androidx/app/NotificationCompat$BadgeIconType",
-      "android/support/v4/app/NotificationCompat$BigTextStyle": "androidx/app/NotificationCompat$BigTextStyle",
-      "android/support/annotation/ColorInt": "androidx/annotation/ColorInt",
-      "android/support/text/emoji/EmojiSpan": "androidx/text/emoji/EmojiSpan",
-      "android/support/wear/widget/SwipeDismissFrameLayout$MyOnDismissedListener": "androidx/wear/widget/SwipeDismissFrameLayout$MyOnDismissedListener",
-      "android/support/percent/PercentRelativeLayout": "androidx/PercentRelativeLayout",
-      "android/support/text/emoji/widget/EmojiInputFilter": "androidx/text/emoji/widget/EmojiInputFilter",
-      "android/support/media/tv/TvContractCompat$PreviewPrograms": "androidx/media/tv/TvContractCompat$PreviewPrograms",
-      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder",
-      "android/support/v17/leanback/app/BrowseFragment$BackStackListener": "androidx/leanback/app/BrowseFragment$BackStackListener",
-      "android/support/text/emoji/EmojiProcessor$ProcessorSm": "androidx/text/emoji/EmojiProcessor$ProcessorSm",
-      "android/support/v4/view/ViewCompat$ViewCompatBaseImpl": "androidx/view/legacy/ViewCompat$ViewCompatBaseImpl",
-      "android/support/design/internal/BottomNavigationMenu": "androidx/design/internal/BottomNavigationMenu",
-      "android/support/v7/view/menu/BaseMenuWrapper": "androidx/view/menu/BaseMenuWrapper",
-      "android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory$DefaultRoundedBitmapDrawable": "androidx/graphics/drawable/RoundedBitmapDrawableFactory$DefaultRoundedBitmapDrawable",
-      "android/support/v17/leanback/widget/OnItemViewClickedListener": "androidx/leanback/widget/OnItemViewClickedListener",
-      "android/support/v4/app/ShareCompat": "androidx/app/ShareCompat",
-      "android/support/v4/app/DialogFragment": "androidx/app/DialogFragment",
-      "android/support/v4/os/ConfigurationCompat": "androidx/os/ConfigurationCompat",
+      "android/support/v17/leanback/app/BackgroundManager$BitmapDrawable": "androidx/leanback/app/BackgroundManager$BitmapDrawable",
+      "android/support/annotation/NonNull": "androidx/annotation/NonNull",
+      "android/support/v17/leanback/app/BackgroundManager$ChangeBackgroundRunnable": "androidx/leanback/app/BackgroundManager$ChangeBackgroundRunnable",
+      "android/support/v17/leanback/app/BackgroundManager$DrawableWrapper": "androidx/leanback/app/BackgroundManager$DrawableWrapper",
+      "android/support/v17/leanback/app/BackgroundManager$EmptyDrawable": "androidx/leanback/app/BackgroundManager$EmptyDrawable",
       "android/support/v4/graphics/drawable/DrawableCompat": "androidx/graphics/drawable/DrawableCompat",
-      "android/support/v17/leanback/widget/PlaybackTransportRowView": "androidx/leanback/widget/PlaybackTransportRowView",
-      "android/support/annotation/ColorRes": "androidx/annotation/ColorRes",
-      "android/support/v4/database/DatabaseUtilsCompat": "androidx/database/DatabaseUtilsCompat",
-      "android/support/v7/app/AppCompatDelegateImplBase$ActionBarDrawableToggleImpl": "androidx/app/AppCompatDelegateImplBase$ActionBarDrawableToggleImpl",
-      "android/support/v7/widget/ForwardingListener": "androidx/widget/ForwardingListener",
-      "android/support/annotation/NavigationRes": "androidx/annotation/NavigationRes",
-      "android/support/v4/widget/TextViewCompat$TextViewCompatApi18Impl": "androidx/widget/TextViewCompat$TextViewCompatApi18Impl",
-      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplBase$Command": "androidx/media/session/MediaSessionCompat$MediaSessionImplBase$Command",
-      "android/support/transition/Styleable$ArcMotion": "androidx/transition/Styleable$ArcMotion",
-      "android/support/v17/leanback/transition/TransitionHelper$TransitionHelperStubImpl": "androidx/leanback/transition/TransitionHelper$TransitionHelperStubImpl",
-      "android/support/text/emoji/widget/EmojiEditTextHelper$HelperInternal": "androidx/text/emoji/widget/EmojiEditTextHelper$HelperInternal",
-      "android/support/wear/widget/BezierSCurveInterpolator": "androidx/wear/widget/BezierSCurveInterpolator",
-      "android/support/v4/view/NestedScrollingParent": "androidx/view/NestedScrollingParent",
-      "android/support/v7/widget/ListPopupWindow$ListSelectorHider": "androidx/widget/ListPopupWindow$ListSelectorHider",
-      "android/support/transition/PathProperty": "androidx/transition/PathProperty",
-      "android/support/v4/provider/FontsContractCompat$FontInfo": "androidx/provider/FontsContractCompat$FontInfo",
-      "android/support/v17/leanback/widget/PlaybackControlsRow": "androidx/leanback/widget/PlaybackControlsRow",
-      "android/support/v17/leanback/widget/Presenter": "androidx/leanback/widget/Presenter",
-      "android/support/v17/leanback/app/VerticalGridFragment": "androidx/leanback/app/VerticalGridFragment",
-      "android/support/v4/app/LoaderManagerImpl$LoaderInfo": "androidx/app/LoaderManagerImpl$LoaderInfo",
-      "android/support/v7/widget/RoundRectDrawableWithShadow": "androidx/widget/RoundRectDrawableWithShadow",
-      "android/support/v7/app/AppCompatDelegateImplV9$PanelFeatureState": "androidx/app/AppCompatDelegateImplV9$PanelFeatureState",
-      "android/support/v7/media/SystemMediaRouteProvider$JellybeanImpl$UserRouteRecord": "androidx/media/SystemMediaRouteProvider$JellybeanImpl$UserRouteRecord",
-      "android/support/v4/view/accessibility/AccessibilityManagerCompat": "androidx/view/accessibility/AccessibilityManagerCompat",
-      "android/support/v4/view/ScrollingView": "androidx/view/ScrollingView",
-      "android/support/customtabs/CustomTabsIntent": "androidx/browser/customtabs/CustomTabsIntent",
-      "android/support/v17/leanback/transition/TransitionListener": "androidx/leanback/transition/TransitionListener",
-      "android/support/annotation/DimenRes": "androidx/annotation/DimenRes",
-      "android/support/v17/leanback/widget/Parallax$IntProperty": "androidx/leanback/widget/Parallax$IntProperty",
-      "android/support/v4/app/FragmentManagerImpl$AnimationOrAnimator": "androidx/app/FragmentManagerImpl$AnimationOrAnimator",
-      "android/support/v4/widget/TextViewCompat$TextViewCompatBaseImpl": "androidx/widget/TextViewCompat$TextViewCompatBaseImpl",
-      "android/support/v17/leanback/app/BrowseFragment$ExpandPreLayout": "androidx/leanback/app/BrowseFragment$ExpandPreLayout",
-      "android/support/v13/view/DragAndDropPermissionsCompat$BaseDragAndDropPermissionsCompatImpl": "androidx/view/DragAndDropPermissionsCompat$BaseDragAndDropPermissionsCompatImpl",
-      "android/support/multidex/MultiDexExtractor": "androidx/multidex/MultiDexExtractor",
-      "android/support/v17/leanback/widget/GuidedDatePickerAction$Builder": "androidx/leanback/widget/GuidedDatePickerAction$Builder",
-      "android/support/v7/widget/AppCompatRatingBar": "androidx/widget/AppCompatRatingBar",
-      "android/support/wear/R$string": "androidx/wear/R$string",
-      "android/support/v7/app/AppCompatDelegateImplN": "androidx/app/AppCompatDelegateImplN",
-      "android/support/v17/leanback/widget/GridLayoutManager$PendingMoveSmoothScroller": "androidx/leanback/widget/GridLayoutManager$PendingMoveSmoothScroller",
-      "android/support/v17/leanback/widget/GuidedActionItemContainer": "androidx/leanback/widget/GuidedActionItemContainer",
-      "android/support/transition/ObjectAnimatorUtils": "androidx/transition/ObjectAnimatorUtils",
-      "android/support/v4/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat": "androidx/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat",
-      "android/support/design/widget/CoordinatorLayout$DispatchChangeEvent": "androidx/design/widget/CoordinatorLayout$DispatchChangeEvent",
-      "android/support/annotation/HalfFloat": "androidx/annotation/HalfFloat",
-      "android/support/v4/view/ViewCompat$ViewCompatApi16Impl": "androidx/view/legacy/ViewCompat$ViewCompatApi16Impl",
-      "android/support/v7/text/AllCapsTransformationMethod": "androidx/text/AllCapsTransformationMethod",
-      "android/support/v4/app/FragmentController": "androidx/app/FragmentController",
-      "android/support/v17/leanback/app/SearchSupportFragment$SearchResultProvider": "androidx/leanback/app/SearchSupportFragment$SearchResultProvider",
-      "android/support/v17/leanback/widget/RoundedRectHelper$StubImpl": "androidx/leanback/widget/RoundedRectHelper$StubImpl",
-      "android/support/v4/graphics/drawable/RoundedBitmapDrawable": "androidx/graphics/drawable/RoundedBitmapDrawable",
-      "android/support/v4/widget/ScrollerCompat": "androidx/widget/ScrollerCompat",
-      "android/support/v17/leanback/widget/RoundedRectHelper$Api21Impl": "androidx/leanback/widget/RoundedRectHelper$Api21Impl",
-      "android/support/wear/internal/widget/drawer/SinglePagePresenter$Ui": "androidx/wear/internal/widget/drawer/SinglePagePresenter$Ui",
-      "android/support/v7/app/AppCompatDelegateImplV14$AutoNightModeManager": "androidx/app/AppCompatDelegateImplV14$AutoNightModeManager",
-      "android/support/v17/leanback/widget/ImeKeyMonitor$ImeKeyListener": "androidx/leanback/widget/ImeKeyMonitor$ImeKeyListener",
-      "android/support/v4/view/InputDeviceCompat": "androidx/view/InputDeviceCompat",
-      "android/support/wear/widget/CircularProgressLayoutController": "androidx/wear/widget/CircularProgressLayoutController",
-      "android/support/v17/leanback/widget/PlaybackTransportRowView$OnUnhandledKeyListener": "androidx/leanback/widget/PlaybackTransportRowView$OnUnhandledKeyListener",
-      "android/support/v4/view/ViewCompat$AccessibilityLiveRegion": "androidx/view/legacy/ViewCompat$AccessibilityLiveRegion",
-      "android/support/v13/app/FragmentCompat$FragmentCompatImpl": "androidx/app/FragmentCompat$FragmentCompatImpl",
-      "android/support/design/widget/Snackbar": "androidx/design/widget/Snackbar",
-      "android/support/v7/preference/PreferenceGroupAdapter": "androidx/preference/PreferenceGroupAdapter",
-      "android/support/v4/view/MenuItemCompat": "androidx/view/MenuItemCompat",
-      "android/support/v7/widget/ChildHelper$Bucket": "androidx/widget/ChildHelper$Bucket",
-      "android/support/v7/util/DiffUtil$DiffResult": "androidx/util/DiffUtil$DiffResult",
-      "android/support/v13/app/FragmentCompat$PermissionCompatDelegate": "androidx/app/FragmentCompat$PermissionCompatDelegate",
-      "android/support/v4/view/MotionEventCompat": "androidx/view/MotionEventCompat",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$ClosedCaptioningAction": "androidx/leanback/widget/PlaybackControlsRow$ClosedCaptioningAction",
-      "android/support/v4/app/FragmentState": "androidx/app/FragmentState",
-      "android/support/v7/widget/CardView": "androidx/widget/CardView",
-      "android/support/v13/view/inputmethod/InputContentInfoCompat$InputContentInfoCompatApi25Impl": "androidx/view/inputmethod/InputContentInfoCompat$InputContentInfoCompatApi25Impl",
-      "android/support/v4/widget/PopupWindowCompat$PopupWindowCompatBaseImpl": "androidx/widget/PopupWindowCompat$PopupWindowCompatBaseImpl",
-      "android/support/media/tv/TvContractCompat$PreviewProgramColumns$Type": "androidx/media/tv/TvContractCompat$PreviewProgramColumns$Type",
-      "android/support/v4/media/session/MediaSessionCompat$OnActiveChangeListener": "androidx/media/session/MediaSessionCompat$OnActiveChangeListener",
-      "android/support/design/widget/BottomSheetBehavior": "androidx/design/widget/BottomSheetBehavior",
-      "android/support/customtabs/CustomTabsSession": "androidx/browser/customtabs/CustomTabsSession",
-      "android/support/v7/media/RemotePlaybackClient$StatusCallback": "androidx/media/RemotePlaybackClient$StatusCallback",
-      "android/support/v17/leanback/app/HeadersSupportFragment$OnHeaderViewSelectedListener": "androidx/leanback/app/HeadersSupportFragment$OnHeaderViewSelectedListener",
-      "android/support/v4/view/ViewPager$OnPageChangeListener": "androidx/view/ViewPager$OnPageChangeListener",
-      "android/support/v4/app/BackStackRecord$Op": "androidx/app/BackStackRecord$Op",
-      "android/support/media/ExifInterface$ExifAttribute": "androidx/media/ExifInterface$ExifAttribute",
-      "android/support/transition/ChangeBounds$ViewBounds": "androidx/transition/ChangeBounds$ViewBounds",
-      "android/support/v17/leanback/widget/NonOverlappingLinearLayoutWithForeground": "androidx/leanback/widget/NonOverlappingLinearLayoutWithForeground",
-      "android/support/v4/app/NotificationCompat$BigPictureStyle": "androidx/app/NotificationCompat$BigPictureStyle",
-      "android/support/design/widget/FloatingActionButton$ShadowDelegateImpl": "androidx/design/widget/FloatingActionButton$ShadowDelegateImpl",
-      "android/support/media/instantvideo/preload/InstantVideoPreloadManager$VideoPreloaderFactory": "androidx/media/instantvideo/preload/InstantVideoPreloadManager$VideoPreloaderFactory",
-      "android/support/v7/app/MediaRouteDialogHelper": "androidx/app/MediaRouteDialogHelper",
-      "android/support/media/ExifInterface$ExifTag": "androidx/media/ExifInterface$ExifTag",
-      "android/support/v17/leanback/widget/BaseCardView$InfoHeightAnimation": "androidx/leanback/widget/BaseCardView$InfoHeightAnimation",
-      "android/support/v13/view/inputmethod/EditorInfoCompat$EditorInfoCompatApi25Impl": "androidx/view/inputmethod/EditorInfoCompat$EditorInfoCompatApi25Impl",
-      "android/support/transition/TransitionSet$TransitionSetListener": "androidx/transition/TransitionSet$TransitionSetListener",
-      "android/support/v17/leanback/transition/SlideKitkat$CalculateSlide": "androidx/leanback/transition/SlideKitkat$CalculateSlide",
-      "android/support/v4/app/ActivityCompat$OnRequestPermissionsResultCallback": "androidx/app/legacy/ActivityCompat$OnRequestPermissionsResultCallback",
-      "android/support/v7/widget/AppCompatRadioButton": "androidx/widget/AppCompatRadioButton",
-      "android/support/v4/app/TaskStackBuilder$TaskStackBuilderApi16Impl": "androidx/app/TaskStackBuilder$TaskStackBuilderApi16Impl",
-      "android/support/v7/media/MediaRouter$RouteInfo$PlaybackVolume": "androidx/media/MediaRouter$RouteInfo$PlaybackVolume",
-      "android/support/v17/preference/LeanbackListPreferenceDialogFragment$AdapterMulti": "androidx/leanback/preference/LeanbackListPreferenceDialogFragment$AdapterMulti",
-      "android/support/v4/print/PrintHelper$PrintHelperApi19": "androidx/print/PrintHelper$PrintHelperApi19",
-      "android/support/v7/media/MediaRouter$RouteInfo$DeviceType": "androidx/media/MediaRouter$RouteInfo$DeviceType",
-      "android/support/v4/media/MediaBrowserCompat$SubscriptionCallback": "androidx/media/MediaBrowserCompat$SubscriptionCallback",
-      "android/support/v4/media/MediaBrowserCompat$MediaItem$Flags": "androidx/media/MediaBrowserCompat$MediaItem$Flags",
-      "android/support/v17/leanback/R$attr": "androidx/leanback/R$attr",
-      "android/support/v7/media/MediaRouteDescriptor$Builder": "androidx/media/MediaRouteDescriptor$Builder",
-      "android/support/v7/media/MediaRouteProviderService": "androidx/media/MediaRouteProviderService",
-      "android/support/v4/app/ActivityCompat$RequestPermissionsRequestCodeValidator": "androidx/app/legacy/ActivityCompat$RequestPermissionsRequestCodeValidator",
-      "android/support/v17/leanback/widget/ControlBar$OnChildFocusedListener": "androidx/leanback/widget/ControlBar$OnChildFocusedListener",
-      "android/support/v7/media/MediaRouterApi24$RouteInfo": "androidx/media/MediaRouterApi24$RouteInfo",
-      "android/support/v4/app/JobIntentService$WorkEnqueuer": "androidx/app/JobIntentService$WorkEnqueuer",
-      "android/support/v7/preference/DialogPreference$TargetFragment": "androidx/preference/DialogPreference$TargetFragment",
-      "android/support/wear/widget/BoxInsetLayout$LayoutParams": "androidx/wear/widget/BoxInsetLayout$LayoutParams",
-      "android/support/v4/util/SimpleArrayMap": "androidx/util/SimpleArrayMap",
-      "android/support/v4/widget/EdgeEffectCompat": "androidx/widget/EdgeEffectCompat",
-      "android/support/v13/app/FragmentCompat$FragmentCompatApi15Impl": "androidx/app/FragmentCompat$FragmentCompatApi15Impl",
-      "android/support/v4/print/PrintHelper$PrintHelperApi23": "androidx/print/PrintHelper$PrintHelperApi23",
-      "android/support/percent/R$styleable": "androidx/R$styleable",
-      "android/support/v4/print/PrintHelper$PrintHelperApi24": "androidx/print/PrintHelper$PrintHelperApi24",
-      "android/support/v4/content/res/FontResourcesParserCompat": "androidx/content/res/FontResourcesParserCompat",
-      "android/support/design/widget/SnackbarManager$SnackbarRecord": "androidx/design/widget/SnackbarManager$SnackbarRecord",
-      "android/support/v7/util/DiffUtil$Range": "androidx/util/DiffUtil$Range",
-      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImpl": "androidx/media/MediaBrowserCompat$MediaBrowserImpl",
-      "android/support/v4/print/PrintHelper$PrintHelperApi20": "androidx/print/PrintHelper$PrintHelperApi20",
-      "android/support/v4/media/session/PlaybackStateCompat$RepeatMode": "androidx/media/session/PlaybackStateCompat$RepeatMode",
-      "android/support/v7/media/MediaRouteProviderProtocol": "androidx/media/MediaRouteProviderProtocol",
-      "android/support/transition/Transition$ArrayListManager": "androidx/transition/Transition$ArrayListManager",
-      "android/support/text/emoji/widget/EmojiButton": "androidx/text/emoji/widget/EmojiButton",
-      "android/support/v4/view/ActionProvider$VisibilityListener": "androidx/view/ActionProvider$VisibilityListener",
-      "android/support/v7/widget/AppCompatProgressBarHelper": "androidx/widget/AppCompatProgressBarHelper",
-      "android/support/v7/widget/LinearLayoutCompat": "androidx/widget/LinearLayoutCompat",
-      "android/support/v4/app/Fragment$OnStartEnterTransitionListener": "androidx/app/Fragment$OnStartEnterTransitionListener",
-      "android/support/v7/app/AppCompatDialogFragment": "androidx/app/AppCompatDialogFragment",
-      "android/support/graphics/drawable/Animatable2Compat": "androidx/graphics/drawable/Animatable2Compat",
-      "android/support/design/widget/TabLayout$PagerAdapterObserver": "androidx/design/widget/TabLayout$PagerAdapterObserver",
-      "android/support/v7/widget/StaggeredGridLayoutManager$LazySpanLookup$FullSpanItem": "androidx/widget/StaggeredGridLayoutManager$LazySpanLookup$FullSpanItem",
-      "android/support/v4/content/pm/ShortcutInfoCompat": "androidx/content/pm/ShortcutInfoCompat",
-      "android/support/v4/view/ScaleGestureDetectorCompat": "androidx/view/ScaleGestureDetectorCompat",
-      "android/support/v17/leanback/widget/ShadowHelperApi21$ShadowImpl": "androidx/leanback/widget/ShadowHelperApi21$ShadowImpl",
-      "android/support/v7/appcompat/R$id": "androidx/appcompat/R$id",
-      "android/support/v17/leanback/transition/Scale": "androidx/leanback/transition/Scale",
-      "android/support/v7/widget/ViewBoundsCheck": "androidx/widget/ViewBoundsCheck",
-      "android/support/design/widget/BottomSheetBehavior$State": "androidx/design/widget/BottomSheetBehavior$State",
-      "android/support/v7/app/ActionBarDrawerToggle$JellybeanMr2Delegate": "androidx/app/ActionBarDrawerToggle$JellybeanMr2Delegate",
-      "android/support/v7/internal/widget/PreferenceImageView": "androidx/internal/widget/PreferenceImageView",
-      "android/support/content/ContentPager$CursorCache": "androidx/content/ContentPager$CursorCache",
-      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplBase$MessageHandler": "androidx/media/session/MediaSessionCompat$MediaSessionImplBase$MessageHandler",
-      "android/support/v4/app/NotificationCompat$Action$Extender": "androidx/app/NotificationCompat$Action$Extender",
-      "android/support/v7/widget/Toolbar$OnMenuItemClickListener": "androidx/widget/Toolbar$OnMenuItemClickListener",
-      "android/support/multidex/MultiDex$V4": "androidx/multidex/MultiDex$V4",
-      "android/support/v4/app/ActionBarDrawerToggle": "androidx/app/legacy/ActionBarDrawerToggle",
-      "android/support/v7/media/RemoteControlClientCompat": "androidx/media/RemoteControlClientCompat",
-      "android/support/v4/media/app/NotificationCompat$MediaStyle": "androidx/media/app/NotificationCompat$MediaStyle",
-      "android/support/v17/leanback/transition/TransitionEpicenterCallback": "androidx/leanback/transition/TransitionEpicenterCallback",
-      "android/support/v4/content/LocalBroadcastManager$ReceiverRecord": "androidx/content/LocalBroadcastManager$ReceiverRecord",
-      "android/support/v7/view/menu/BaseMenuPresenter": "androidx/view/menu/BaseMenuPresenter",
-      "android/support/v4/view/accessibility/AccessibilityManagerCompat$AccessibilityStateChangeListener": "androidx/view/accessibility/AccessibilityManagerCompat$AccessibilityStateChangeListener",
-      "android/support/design/widget/TabLayout$AdapterChangeListener": "androidx/design/widget/TabLayout$AdapterChangeListener",
-      "android/support/v7/widget/RecyclerView$RecyclerListener": "androidx/widget/RecyclerView$RecyclerListener",
-      "android/support/media/tv/ChannelLogoUtils": "androidx/media/tv/ChannelLogoUtils",
-      "android/support/v4/media/session/PlaybackStateCompat$CustomAction$Builder": "androidx/media/session/PlaybackStateCompat$CustomAction$Builder",
-      "android/support/v17/leanback/widget/GuidedActionAdapter": "androidx/leanback/widget/GuidedActionAdapter",
-      "android/support/v17/leanback/widget/ItemBridgeAdapter$Wrapper": "androidx/leanback/widget/ItemBridgeAdapter$Wrapper",
-      "android/support/v17/leanback/widget/DetailsOverviewRow$Listener": "androidx/leanback/widget/DetailsOverviewRow$Listener",
-      "android/support/annotation/InterpolatorRes": "androidx/annotation/InterpolatorRes",
-      "android/support/v4/widget/CursorAdapter$ChangeObserver": "androidx/widget/CursorAdapter$ChangeObserver",
-      "android/support/v4/widget/SimpleCursorAdapter$CursorToStringConverter": "androidx/widget/SimpleCursorAdapter$CursorToStringConverter",
-      "android/support/v7/widget/helper/ItemTouchUIUtilImpl$BaseImpl": "androidx/widget/helper/ItemTouchUIUtilImpl$BaseImpl",
-      "android/support/v4/provider/RawDocumentFile": "androidx/provider/RawDocumentFile",
-      "android/support/text/emoji/widget/EmojiExtractTextLayout$ButtonOnclickListener": "androidx/text/emoji/widget/EmojiExtractTextLayout$ButtonOnclickListener",
-      "android/support/v7/view/menu/MenuItemWrapperJB$ActionProviderWrapperJB": "androidx/view/menu/MenuItemWrapperJB$ActionProviderWrapperJB",
-      "android/support/media/tv/TvContractCompat$RecordedPrograms": "androidx/media/tv/TvContractCompat$RecordedPrograms",
-      "android/support/v17/leanback/widget/picker/Picker$PickerValueListener": "androidx/leanback/widget/picker/Picker$PickerValueListener",
-      "android/support/v4/media/session/IMediaControllerCallback$Stub": "androidx/media/session/IMediaControllerCallback$Stub",
-      "android/support/v7/preference/PreferenceManager": "androidx/preference/PreferenceManager",
-      "android/support/transition/GhostViewApi21$Creator": "androidx/transition/GhostViewApi21$Creator",
-      "android/support/v7/widget/ActionMenuView$ActionMenuChildView": "androidx/widget/ActionMenuView$ActionMenuChildView",
-      "android/support/v17/leanback/app/GuidedStepSupportFragment$DummyFragment": "androidx/leanback/app/GuidedStepSupportFragment$DummyFragment",
-      "android/support/v4/app/BaseFragmentActivityApi14": "androidx/app/BaseFragmentActivityApi14",
-      "android/support/v14/preference/SwitchPreference": "androidx/preference/SwitchPreference",
-      "android/support/v4/app/BaseFragmentActivityApi16": "androidx/app/BaseFragmentActivityApi16",
-      "android/support/v7/preference/PreferenceFragmentCompat$ScrollToPreferenceObserver": "androidx/preference/PreferenceFragmentCompat$ScrollToPreferenceObserver",
-      "android/support/v4/graphics/PaintCompat": "androidx/graphics/PaintCompat",
-      "android/support/v4/media/AudioAttributesCompat": "androidx/media/AudioAttributesCompat",
-      "android/support/v4/media/session/MediaSessionCompat$QueueItem": "androidx/media/session/MediaSessionCompat$QueueItem",
-      "android/support/transition/Transition$AnimationInfo": "androidx/transition/Transition$AnimationInfo",
-      "android/support/v7/app/MediaRouteControllerDialog$VolumeChangeListener": "androidx/app/MediaRouteControllerDialog$VolumeChangeListener",
-      "android/support/v4/widget/DrawerLayout$ViewDragCallback": "androidx/widget/DrawerLayout$ViewDragCallback",
-      "android/support/design/widget/FloatingActionButtonImpl$ResetElevationAnimation": "androidx/design/widget/FloatingActionButtonImpl$ResetElevationAnimation",
-      "android/support/design/widget/TabLayout$OnTabSelectedListener": "androidx/design/widget/TabLayout$OnTabSelectedListener",
-      "android/support/annotation/VisibleForTesting": "androidx/annotation/VisibleForTesting",
-      "android/support/v4/app/NotificationCompatSideChannelService$NotificationSideChannelStub": "androidx/app/NotificationCompatSideChannelService$NotificationSideChannelStub",
-      "android/support/annotation/RawRes": "androidx/annotation/RawRes",
-      "android/support/design/R$anim": "androidx/design/R$anim",
-      "android/support/transition/Transition$MatchOrder": "androidx/transition/Transition$MatchOrder",
-      "android/support/v7/widget/RecyclerView$SimpleOnItemTouchListener": "androidx/widget/RecyclerView$SimpleOnItemTouchListener",
-      "android/support/transition/AnimatorUtilsImpl": "androidx/transition/AnimatorUtilsImpl",
-      "android/support/v4/view/OnApplyWindowInsetsListener": "androidx/view/OnApplyWindowInsetsListener",
-      "android/support/wear/widget/SwipeDismissLayout": "androidx/wear/widget/SwipeDismissLayout",
-      "android/support/mediacompat/R$color": "androidx/mediacompat/R$color",
-      "android/support/v7/preference/PreferenceManager$PreferenceComparisonCallback": "androidx/preference/PreferenceManager$PreferenceComparisonCallback",
-      "android/support/v7/widget/ActionMenuView$OnMenuItemClickListener": "androidx/widget/ActionMenuView$OnMenuItemClickListener",
-      "android/support/v7/widget/TooltipCompat$BaseViewCompatImpl": "androidx/widget/TooltipCompat$BaseViewCompatImpl",
-      "android/support/wear/widget/drawer/WearableNavigationDrawerView$NavigationStyle": "androidx/wear/widget/drawer/WearableNavigationDrawerView$NavigationStyle",
-      "android/support/transition/PatternPathMotion": "androidx/transition/PatternPathMotion",
-      "android/support/transition/Styleable$TransitionTarget": "androidx/transition/Styleable$TransitionTarget",
-      "android/support/mediacompat/R": "androidx/mediacompat/R",
-      "android/support/v7/media/MediaRouterJellybeanMr1$Callback": "androidx/media/MediaRouterJellybeanMr1$Callback",
-      "android/support/v17/leanback/widget/ControlBarPresenter$OnControlClickedListener": "androidx/leanback/widget/ControlBarPresenter$OnControlClickedListener",
-      "android/support/v4/view/LayoutInflaterCompat$Factory2Wrapper": "androidx/view/LayoutInflaterCompat$Factory2Wrapper",
-      "android/support/v7/widget/GridLayoutManager$LayoutParams": "androidx/widget/GridLayoutManager$LayoutParams",
-      "android/support/v7/widget/GridLayout": "androidx/widget/GridLayout",
-      "android/support/v4/media/MediaBrowserServiceCompat$ServiceBinderImpl": "androidx/media/MediaBrowserServiceCompat$ServiceBinderImpl",
-      "android/support/v7/widget/AppCompatCheckBox": "androidx/widget/AppCompatCheckBox",
-      "android/support/v4/view/GestureDetectorCompat$GestureDetectorCompatImpl": "androidx/view/GestureDetectorCompat$GestureDetectorCompatImpl",
-      "android/support/v17/preference/BaseLeanbackPreferenceFragment": "androidx/leanback/preference/BaseLeanbackPreferenceFragment",
-      "android/support/v17/leanback/app/GuidedStepRootLayout": "androidx/leanback/app/GuidedStepRootLayout",
-      "android/support/v4/app/FragmentManager$FragmentLifecycleCallbacks": "androidx/app/FragmentManager$FragmentLifecycleCallbacks",
-      "android/support/v4/media/MediaMetadataCompatApi21": "androidx/media/MediaMetadataCompatApi21",
-      "android/support/v7/app/MediaRouterThemeHelper": "androidx/app/MediaRouterThemeHelper",
-      "android/support/v4/util/MapCollections$EntrySet": "androidx/util/MapCollections$EntrySet",
-      "android/support/v7/widget/ViewBoundsCheck$ViewBounds": "androidx/widget/ViewBoundsCheck$ViewBounds",
-      "android/support/design/widget/HeaderScrollingViewBehavior": "androidx/design/widget/HeaderScrollingViewBehavior",
-      "android/support/v7/app/ActionBarDrawerToggle$IcsDelegate": "androidx/app/ActionBarDrawerToggle$IcsDelegate",
-      "android/support/v4/media/session/ParcelableVolumeInfo": "androidx/media/session/ParcelableVolumeInfo",
-      "android/support/v17/leanback/widget/GuidedAction$Builder": "androidx/leanback/widget/GuidedAction$Builder",
-      "android/support/v7/view/menu/CascadingMenuPopup": "androidx/view/menu/CascadingMenuPopup",
-      "android/support/v7/view/menu/MenuPopup": "androidx/view/menu/MenuPopup",
-      "android/support/v7/app/AlertDialog": "androidx/app/AlertDialog",
-      "android/support/v7/widget/RecyclerView$SavedState": "androidx/widget/RecyclerView$SavedState",
-      "android/support/wear/widget/drawer/WearableActionDrawerView$TitleViewHolder": "androidx/wear/widget/drawer/WearableActionDrawerView$TitleViewHolder",
-      "android/support/v13/view/inputmethod/InputContentInfoCompat$InputContentInfoCompatBaseImpl": "androidx/view/inputmethod/InputContentInfoCompat$InputContentInfoCompatBaseImpl",
-      "android/support/v17/leanback/app/VideoSupportFragmentGlueHost": "androidx/leanback/app/VideoSupportFragmentGlueHost",
-      "android/support/text/emoji/EmojiProcessor": "androidx/text/emoji/EmojiProcessor",
-      "android/support/v17/leanback/widget/ActionPresenterSelector": "androidx/leanback/widget/ActionPresenterSelector",
-      "android/support/v13/view/inputmethod/EditorInfoCompat$EditorInfoCompatImpl": "androidx/view/inputmethod/EditorInfoCompat$EditorInfoCompatImpl",
-      "android/support/text/emoji/widget/EmojiExtractTextLayout": "androidx/text/emoji/widget/EmojiExtractTextLayout",
-      "android/support/v17/leanback/widget/GuidedAction": "androidx/leanback/widget/GuidedAction",
+      "android/support/v17/leanback/R$color": "androidx/leanback/R$color",
+      "android/support/v17/leanback/R$drawable": "androidx/leanback/R$drawable",
+      "android/support/v4/view/animation/FastOutLinearInInterpolator": "androidx/view/animation/FastOutLinearInInterpolator",
+      "android/support/v17/leanback/widget/BackgroundHelper": "androidx/leanback/widget/BackgroundHelper",
+      "android/support/annotation/ColorInt": "androidx/annotation/ColorInt",
+      "android/support/v17/leanback/app/BaseFragment$1": "androidx/leanback/app/BaseFragment$1",
+      "android/support/v17/leanback/util/StateMachine$State": "androidx/leanback/util/StateMachine$State",
+      "android/support/v17/leanback/app/BaseFragment": "androidx/leanback/app/BaseFragment",
+      "android/support/v17/leanback/util/StateMachine": "androidx/leanback/util/StateMachine",
+      "android/support/v17/leanback/app/ProgressBarManager": "androidx/leanback/app/ProgressBarManager",
+      "android/support/v17/leanback/app/BaseFragment$2": "androidx/leanback/app/BaseFragment$2",
+      "android/support/v17/leanback/app/BaseFragment$3": "androidx/leanback/app/BaseFragment$3",
+      "android/support/v17/leanback/app/BaseFragment$4": "androidx/leanback/app/BaseFragment$4",
+      "android/support/v17/leanback/app/BaseFragment$5": "androidx/leanback/app/BaseFragment$5",
       "android/support/v17/leanback/util/StateMachine$Condition": "androidx/leanback/util/StateMachine$Condition",
-      "android/support/text/emoji/flatbuffer/Table": "androidx/text/emoji/flatbuffer/Table",
-      "android/support/v4/os/OperationCanceledException": "androidx/os/OperationCanceledException",
-      "android/support/v7/media/RegisteredMediaRouteProvider$PrivateHandler": "androidx/media/RegisteredMediaRouteProvider$PrivateHandler",
-      "android/support/v7/widget/RecyclerView$Adapter": "androidx/widget/RecyclerView$Adapter",
-      "android/support/v7/util/ListUpdateCallback": "androidx/util/ListUpdateCallback",
-      "android/support/v4/media/MediaDescriptionCompatApi21": "androidx/media/MediaDescriptionCompatApi21",
-      "android/support/v4/view/ViewCompat$FocusRealDirection": "androidx/view/legacy/ViewCompat$FocusRealDirection",
-      "android/support/v4/media/session/MediaControllerCompat$Callback": "androidx/media/session/MediaControllerCompat$Callback",
-      "android/support/v4/media/MediaDescriptionCompatApi23": "androidx/media/MediaDescriptionCompatApi23",
-      "android/support/v4/view/accessibility/AccessibilityEventCompat": "androidx/view/accessibility/AccessibilityEventCompat",
-      "android/support/text/emoji/FontRequestEmojiCompatConfig$FontProviderHelper": "androidx/text/emoji/FontRequestEmojiCompatConfig$FontProviderHelper",
-      "android/support/v4/app/NotificationCompat$Action$Builder": "androidx/app/NotificationCompat$Action$Builder",
-      "android/support/v4/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi16": "androidx/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi16",
-      "android/support/annotation/AnimatorRes": "androidx/annotation/AnimatorRes",
-      "android/support/v17/leanback/widget/GuidanceStylist": "androidx/leanback/widget/GuidanceStylist",
-      "android/support/v17/leanback/widget/StaticShadowHelper$ShadowHelperStubImpl": "androidx/leanback/widget/StaticShadowHelper$ShadowHelperStubImpl",
-      "android/support/v4/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi19": "androidx/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi19",
-      "android/support/v7/util/ThreadUtil": "androidx/util/ThreadUtil",
-      "android/support/content/InMemoryCursor$ObserverRelay": "androidx/content/InMemoryCursor$ObserverRelay",
-      "android/support/wear/R$drawable": "androidx/wear/R$drawable",
-      "android/support/constraint/ConstraintLayout$LayoutParams": "androidx/constraint/ConstraintLayout$LayoutParams",
-      "android/support/v7/widget/StaggeredGridLayoutManager$LazySpanLookup": "androidx/widget/StaggeredGridLayoutManager$LazySpanLookup",
-      "android/support/v17/leanback/app/SearchFragment$ExternalQuery": "androidx/leanback/app/SearchFragment$ExternalQuery",
-      "android/support/media/tv/TvContractCompat$Programs$Genres": "androidx/media/tv/TvContractCompat$Programs$Genres",
-      "android/support/v13/view/inputmethod/InputConnectionCompat$OnCommitContentListener": "androidx/view/inputmethod/InputConnectionCompat$OnCommitContentListener",
-      "android/support/content/ContentPager$CursorDisposition": "androidx/content/ContentPager$CursorDisposition",
-      "android/support/v4/view/AsyncLayoutInflater$OnInflateFinishedListener": "androidx/view/AsyncLayoutInflater$OnInflateFinishedListener",
-      "android/support/v4/media/session/MediaControllerCompat$MediaControllerImplBase": "androidx/media/session/MediaControllerCompat$MediaControllerImplBase",
-      "android/support/v4/util/PatternsCompat": "androidx/util/PatternsCompat",
-      "android/support/v4/media/MediaBrowserServiceCompat$ServiceCallbacksCompat": "androidx/media/MediaBrowserServiceCompat$ServiceCallbacksCompat",
-      "android/support/v7/widget/AppCompatCompoundButtonHelper$DirectSetButtonDrawableInterface": "androidx/widget/AppCompatCompoundButtonHelper$DirectSetButtonDrawableInterface",
-      "android/support/v17/leanback/media/PlaybackGlueHost": "androidx/leanback/media/PlaybackGlueHost",
-      "android/support/v4/content/ModernAsyncTask": "androidx/content/ModernAsyncTask",
-      "android/support/v4/view/ViewCompat$ViewCompatApi15Impl": "androidx/view/legacy/ViewCompat$ViewCompatApi15Impl",
-      "android/support/v4/os/ResultReceiver$MyResultReceiver": "androidx/os/ResultReceiver$MyResultReceiver",
-      "android/support/v7/widget/helper/ItemTouchHelper$Callback": "androidx/widget/helper/ItemTouchHelper$Callback",
-      "android/support/v17/leanback/app/BrowseFragment$MainFragmentRowsAdapterProvider": "androidx/leanback/app/BrowseFragment$MainFragmentRowsAdapterProvider",
-      "android/support/annotation/Nullable": "androidx/annotation/Nullable",
-      "android/support/v4/os/IResultReceiver$Stub": "androidx/os/IResultReceiver$Stub",
-      "android/support/v7/widget/Toolbar$ExpandedActionViewMenuPresenter": "androidx/widget/Toolbar$ExpandedActionViewMenuPresenter",
-      "android/support/v17/leanback/widget/picker/PickerUtility": "androidx/leanback/widget/picker/PickerUtility",
-      "android/support/v4/view/ViewPager$MyAccessibilityDelegate": "androidx/view/ViewPager$MyAccessibilityDelegate",
-      "android/support/v4/app/FragmentTransaction$Transit": "androidx/app/FragmentTransaction$Transit",
-      "android/support/v7/widget/DefaultItemAnimator": "androidx/widget/DefaultItemAnimator",
-      "android/support/v4/view/PagerAdapter": "androidx/widget/PagerAdapter",
-      "android/support/v7/media/MediaRouteProviderService$PrivateHandler": "androidx/media/MediaRouteProviderService$PrivateHandler",
-      "android/support/v4/media/session/IMediaControllerCallback$Stub$Proxy": "androidx/media/session/IMediaControllerCallback$Stub$Proxy",
-      "android/support/v4/media/RatingCompat": "androidx/media/RatingCompat",
-      "android/support/v7/widget/GridLayout$Assoc": "androidx/widget/GridLayout$Assoc",
-      "android/support/v17/leanback/app/DetailsSupportFragment$SetSelectionRunnable": "androidx/leanback/app/DetailsSupportFragment$SetSelectionRunnable",
-      "android/support/v7/util/DiffUtil$Callback": "androidx/util/DiffUtil$Callback",
-      "android/support/v7/widget/ActivityChooserModel$ActivityChooserModelClient": "androidx/widget/ActivityChooserModel$ActivityChooserModelClient",
-      "android/support/v7/widget/PagerSnapHelper": "androidx/widget/PagerSnapHelper",
-      "android/support/v17/leanback/widget/GridLayoutManager$LayoutParams": "androidx/leanback/widget/GridLayoutManager$LayoutParams",
-      "android/support/percent/R": "androidx/R",
-      "android/support/transition/Styleable$Fade": "androidx/transition/Styleable$Fade",
-      "android/support/design/widget/FloatingActionButtonLollipop": "androidx/design/widget/FloatingActionButtonLollipop",
-      "android/support/v17/leanback/widget/ActionPresenterSelector$OneLineActionPresenter": "androidx/leanback/widget/ActionPresenterSelector$OneLineActionPresenter",
-      "android/support/transition/ViewUtilsApi22": "androidx/transition/ViewUtilsApi22",
-      "android/support/v7/widget/LinearLayoutCompat$LayoutParams": "androidx/widget/LinearLayoutCompat$LayoutParams",
-      "android/support/transition/ViewUtilsApi21": "androidx/transition/ViewUtilsApi21",
+      "android/support/v17/leanback/transition/TransitionHelper": "androidx/leanback/transition/TransitionHelper",
+      "android/support/v17/leanback/app/BaseFragment$6": "androidx/leanback/app/BaseFragment$6",
+      "android/support/v17/leanback/util/StateMachine$Event": "androidx/leanback/util/StateMachine$Event",
+      "android/support/v17/leanback/app/FragmentUtil": "androidx/leanback/app/FragmentUtil",
+      "android/support/v17/leanback/app/BaseFragment$7": "androidx/leanback/app/BaseFragment$7",
+      "android/support/v17/leanback/transition/TransitionListener": "androidx/leanback/transition/TransitionListener",
       "android/support/v17/leanback/app/BrandedFragment": "androidx/leanback/app/BrandedFragment",
-      "android/support/text/emoji/bundled/BundledEmojiCompatConfig$BundledMetadataLoader": "androidx/text/emoji/bundled/BundledEmojiCompatConfig$BundledMetadataLoader",
-      "android/support/v17/preference/R": "androidx/leanback/preference/R",
-      "android/support/v4/content/res/TypedArrayUtils": "androidx/content/res/TypedArrayUtils",
-      "android/support/v7/app/ActionBar$LayoutParams": "androidx/app/ActionBar$LayoutParams",
-      "android/support/transition/Visibility$DisappearListener": "androidx/transition/Visibility$DisappearListener",
-      "android/support/v7/view/menu/MenuView$ItemView": "androidx/view/menu/MenuView$ItemView",
-      "android/support/text/emoji/flatbuffer/FlatBufferBuilder": "androidx/text/emoji/flatbuffer/FlatBufferBuilder",
+      "android/support/annotation/Nullable": "androidx/annotation/Nullable",
+      "android/support/v17/leanback/app/BaseRowFragment$1": "androidx/leanback/app/BaseRowFragment$1",
+      "android/support/v17/leanback/widget/OnChildViewHolderSelectedListener": "androidx/leanback/widget/OnChildViewHolderSelectedListener",
+      "android/support/v17/leanback/app/BaseRowFragment": "androidx/leanback/app/BaseRowFragment",
+      "android/support/v7/widget/RecyclerView$ViewHolder": "androidx/widget/recyclerview/RecyclerView$ViewHolder",
+      "android/support/v7/widget/RecyclerView": "androidx/widget/recyclerview/RecyclerView",
       "android/support/v17/leanback/app/BaseRowFragment$LateSelectionObserver": "androidx/leanback/app/BaseRowFragment$LateSelectionObserver",
-      "android/support/wear/widget/SwipeDismissFrameLayout$MyOnSwipeProgressChangedListener": "androidx/wear/widget/SwipeDismissFrameLayout$MyOnSwipeProgressChangedListener",
-      "android/support/v4/content/PermissionChecker$PermissionResult": "androidx/content/PermissionChecker$PermissionResult",
-      "android/support/v7/media/MediaRouter$ControlRequestCallback": "androidx/media/MediaRouter$ControlRequestCallback",
-      "android/support/wear/widget/drawer/WearableNavigationDrawerView$WearableNavigationDrawerAdapter": "androidx/wear/widget/drawer/WearableNavigationDrawerView$WearableNavigationDrawerAdapter",
+      "android/support/v7/widget/RecyclerView$AdapterDataObserver": "androidx/widget/recyclerview/RecyclerView$AdapterDataObserver",
+      "android/support/v17/leanback/widget/ItemBridgeAdapter": "androidx/leanback/widget/ItemBridgeAdapter",
+      "android/support/v17/leanback/widget/VerticalGridView": "androidx/leanback/widget/VerticalGridView",
+      "android/support/v7/widget/RecyclerView$Adapter": "androidx/widget/recyclerview/RecyclerView$Adapter",
+      "android/support/v17/leanback/widget/ObjectAdapter": "androidx/leanback/widget/ObjectAdapter",
+      "android/support/v17/leanback/widget/PresenterSelector": "androidx/leanback/widget/PresenterSelector",
+      "android/support/v17/leanback/widget/Row": "androidx/leanback/widget/Row",
+      "android/support/v17/leanback/widget/ListRow": "androidx/leanback/widget/ListRow",
+      "android/support/v17/leanback/app/BaseRowSupportFragment$1": "androidx/leanback/app/BaseRowSupportFragment$1",
+      "android/support/v17/leanback/app/BaseRowSupportFragment": "androidx/leanback/app/BaseRowSupportFragment",
+      "android/support/v17/leanback/app/BaseRowSupportFragment$LateSelectionObserver": "androidx/leanback/app/BaseRowSupportFragment$LateSelectionObserver",
+      "android/support/v4/app/Fragment": "androidx/app/Fragment",
+      "android/support/v17/leanback/app/BaseSupportFragment$1": "androidx/leanback/app/BaseSupportFragment$1",
+      "android/support/v17/leanback/app/BaseSupportFragment": "androidx/leanback/app/BaseSupportFragment",
+      "android/support/v17/leanback/app/BaseSupportFragment$2": "androidx/leanback/app/BaseSupportFragment$2",
+      "android/support/v17/leanback/app/BaseSupportFragment$3": "androidx/leanback/app/BaseSupportFragment$3",
+      "android/support/v17/leanback/app/BaseSupportFragment$4": "androidx/leanback/app/BaseSupportFragment$4",
+      "android/support/v17/leanback/app/BaseSupportFragment$5": "androidx/leanback/app/BaseSupportFragment$5",
+      "android/support/v17/leanback/app/BaseSupportFragment$6": "androidx/leanback/app/BaseSupportFragment$6",
+      "android/support/v17/leanback/app/BaseSupportFragment$7": "androidx/leanback/app/BaseSupportFragment$7",
+      "android/support/v17/leanback/app/BrandedSupportFragment": "androidx/leanback/app/BrandedSupportFragment",
+      "android/support/v17/leanback/widget/SearchOrbView$Colors": "androidx/leanback/widget/SearchOrbView$Colors",
+      "android/support/v17/leanback/widget/SearchOrbView": "androidx/leanback/widget/SearchOrbView",
+      "android/support/v17/leanback/widget/TitleViewAdapter$Provider": "androidx/leanback/widget/TitleViewAdapter$Provider",
+      "android/support/v17/leanback/widget/TitleViewAdapter": "androidx/leanback/widget/TitleViewAdapter",
+      "android/support/v17/leanback/R$attr": "androidx/leanback/R$attr",
+      "android/support/v17/leanback/R$layout": "androidx/leanback/R$layout",
+      "android/support/v17/leanback/widget/TitleHelper": "androidx/leanback/widget/TitleHelper",
+      "android/support/v17/leanback/app/BrowseFragment$1": "androidx/leanback/app/BrowseFragment$1",
+      "android/support/v17/leanback/app/BrowseFragment": "androidx/leanback/app/BrowseFragment",
+      "android/support/v17/leanback/app/BrowseFragment$10": "androidx/leanback/app/BrowseFragment$10",
+      "android/support/v17/leanback/app/HeadersFragment$OnHeaderClickedListener": "androidx/leanback/app/HeadersFragment$OnHeaderClickedListener",
+      "android/support/v17/leanback/widget/RowHeaderPresenter$ViewHolder": "androidx/leanback/widget/RowHeaderPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/RowHeaderPresenter": "androidx/leanback/widget/RowHeaderPresenter",
+      "android/support/v17/leanback/app/HeadersFragment": "androidx/leanback/app/HeadersFragment",
+      "android/support/v17/leanback/app/BrowseFragment$11": "androidx/leanback/app/BrowseFragment$11",
+      "android/support/v17/leanback/app/HeadersFragment$OnHeaderViewSelectedListener": "androidx/leanback/app/HeadersFragment$OnHeaderViewSelectedListener",
+      "android/support/v17/leanback/app/BrowseFragment$12": "androidx/leanback/app/BrowseFragment$12",
+      "android/support/v7/widget/RecyclerView$OnScrollListener": "androidx/widget/recyclerview/RecyclerView$OnScrollListener",
+      "android/support/v17/leanback/app/BrowseFragment$2": "androidx/leanback/app/BrowseFragment$2",
+      "android/support/v17/leanback/widget/Presenter": "androidx/leanback/widget/Presenter",
+      "android/support/v17/leanback/app/BrowseFragment$3": "androidx/leanback/app/BrowseFragment$3",
+      "android/support/v17/leanback/app/BrowseFragment$BrowseTransitionListener": "androidx/leanback/app/BrowseFragment$BrowseTransitionListener",
+      "android/support/v17/leanback/app/BrowseFragment$BackStackListener": "androidx/leanback/app/BrowseFragment$BackStackListener",
+      "android/support/v17/leanback/app/BrowseFragment$4": "androidx/leanback/app/BrowseFragment$4",
+      "android/support/v17/leanback/widget/BrowseFrameLayout$OnFocusSearchListener": "androidx/leanback/widget/BrowseFrameLayout$OnFocusSearchListener",
+      "android/support/v17/leanback/widget/BrowseFrameLayout": "androidx/leanback/widget/BrowseFrameLayout",
+      "android/support/v4/view/ViewCompat": "androidx/view/ViewCompat",
+      "android/support/v17/leanback/app/BrowseFragment$5": "androidx/leanback/app/BrowseFragment$5",
+      "android/support/v17/leanback/widget/BrowseFrameLayout$OnChildFocusListener": "androidx/leanback/widget/BrowseFrameLayout$OnChildFocusListener",
+      "android/support/v17/leanback/app/BrowseFragment$6": "androidx/leanback/app/BrowseFragment$6",
+      "android/support/v17/leanback/app/BrowseFragment$7": "androidx/leanback/app/BrowseFragment$7",
+      "android/support/v17/leanback/app/BrowseFragment$8": "androidx/leanback/app/BrowseFragment$8",
+      "android/support/v17/leanback/app/BrowseFragment$9": "androidx/leanback/app/BrowseFragment$9",
+      "android/support/v17/leanback/app/BrowseFragment$MainFragmentAdapter": "androidx/leanback/app/BrowseFragment$MainFragmentAdapter",
+      "android/support/v17/leanback/app/BrowseFragment$ExpandPreLayout": "androidx/leanback/app/BrowseFragment$ExpandPreLayout",
+      "android/support/v17/leanback/app/BrowseFragment$FragmentFactory": "androidx/leanback/app/BrowseFragment$FragmentFactory",
+      "android/support/v17/leanback/app/BrowseFragment$FragmentHost": "androidx/leanback/app/BrowseFragment$FragmentHost",
+      "android/support/v17/leanback/app/BrowseFragment$FragmentHostImpl": "androidx/leanback/app/BrowseFragment$FragmentHostImpl",
+      "android/support/v17/leanback/app/BrowseFragment$ListRowFragmentFactory": "androidx/leanback/app/BrowseFragment$ListRowFragmentFactory",
+      "android/support/v17/leanback/app/RowsFragment": "androidx/leanback/app/RowsFragment",
+      "android/support/v17/leanback/app/BrowseFragment$MainFragmentAdapterProvider": "androidx/leanback/app/BrowseFragment$MainFragmentAdapterProvider",
+      "android/support/v17/leanback/app/BrowseFragment$MainFragmentAdapterRegistry": "androidx/leanback/app/BrowseFragment$MainFragmentAdapterRegistry",
+      "android/support/v17/leanback/widget/PageRow": "androidx/leanback/widget/PageRow",
+      "android/support/v17/leanback/app/BrowseFragment$MainFragmentItemViewSelectedListener": "androidx/leanback/app/BrowseFragment$MainFragmentItemViewSelectedListener",
+      "android/support/v17/leanback/widget/OnItemViewSelectedListener": "androidx/leanback/widget/OnItemViewSelectedListener",
+      "android/support/v17/leanback/app/BrowseFragment$MainFragmentRowsAdapter": "androidx/leanback/app/BrowseFragment$MainFragmentRowsAdapter",
+      "android/support/v17/leanback/widget/Presenter$ViewHolder": "androidx/leanback/widget/Presenter$ViewHolder",
+      "android/support/v17/leanback/widget/RowPresenter$ViewHolder": "androidx/leanback/widget/RowPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/RowPresenter": "androidx/leanback/widget/RowPresenter",
+      "android/support/v17/leanback/widget/Presenter$ViewHolderTask": "androidx/leanback/widget/Presenter$ViewHolderTask",
+      "android/support/v17/leanback/widget/OnItemViewClickedListener": "androidx/leanback/widget/OnItemViewClickedListener",
+      "android/support/v17/leanback/app/BrowseFragment$MainFragmentRowsAdapterProvider": "androidx/leanback/app/BrowseFragment$MainFragmentRowsAdapterProvider",
+      "android/support/v17/leanback/app/BrowseFragment$SetSelectionRunnable": "androidx/leanback/app/BrowseFragment$SetSelectionRunnable",
+      "android/support/v17/leanback/R$styleable": "androidx/leanback/R$styleable",
+      "android/support/v17/leanback/R$dimen": "androidx/leanback/R$dimen",
+      "android/support/v17/leanback/R$fraction": "androidx/leanback/R$fraction",
+      "android/support/v17/leanback/R$transition": "androidx/leanback/R$transition",
+      "android/support/v17/leanback/app/ListRowDataAdapter": "androidx/leanback/app/ListRowDataAdapter",
+      "android/support/v17/leanback/widget/ScaleFrameLayout": "androidx/leanback/widget/ScaleFrameLayout",
+      "android/support/v17/leanback/widget/InvisibleRowPresenter": "androidx/leanback/widget/InvisibleRowPresenter",
+      "android/support/v17/leanback/app/BrowseSupportFragment$1": "androidx/leanback/app/BrowseSupportFragment$1",
+      "android/support/v17/leanback/app/BrowseSupportFragment": "androidx/leanback/app/BrowseSupportFragment",
+      "android/support/v17/leanback/app/BrowseSupportFragment$10": "androidx/leanback/app/BrowseSupportFragment$10",
+      "android/support/v17/leanback/app/HeadersSupportFragment$OnHeaderClickedListener": "androidx/leanback/app/HeadersSupportFragment$OnHeaderClickedListener",
+      "android/support/v17/leanback/app/HeadersSupportFragment": "androidx/leanback/app/HeadersSupportFragment",
+      "android/support/v17/leanback/app/BrowseSupportFragment$11": "androidx/leanback/app/BrowseSupportFragment$11",
+      "android/support/v17/leanback/app/HeadersSupportFragment$OnHeaderViewSelectedListener": "androidx/leanback/app/HeadersSupportFragment$OnHeaderViewSelectedListener",
+      "android/support/v17/leanback/app/BrowseSupportFragment$12": "androidx/leanback/app/BrowseSupportFragment$12",
+      "android/support/v4/app/FragmentManager": "androidx/app/FragmentManager",
+      "android/support/v4/app/FragmentTransaction": "androidx/app/FragmentTransaction",
+      "android/support/v17/leanback/app/BrowseSupportFragment$2": "androidx/leanback/app/BrowseSupportFragment$2",
+      "android/support/v17/leanback/app/BrowseSupportFragment$3": "androidx/leanback/app/BrowseSupportFragment$3",
+      "android/support/v4/app/FragmentManager$BackStackEntry": "androidx/app/FragmentManager$BackStackEntry",
+      "android/support/v17/leanback/app/BrowseSupportFragment$BrowseTransitionListener": "androidx/leanback/app/BrowseSupportFragment$BrowseTransitionListener",
+      "android/support/v17/leanback/app/BrowseSupportFragment$BackStackListener": "androidx/leanback/app/BrowseSupportFragment$BackStackListener",
+      "android/support/v17/leanback/app/BrowseSupportFragment$4": "androidx/leanback/app/BrowseSupportFragment$4",
+      "android/support/v17/leanback/app/BrowseSupportFragment$5": "androidx/leanback/app/BrowseSupportFragment$5",
+      "android/support/v17/leanback/app/BrowseSupportFragment$6": "androidx/leanback/app/BrowseSupportFragment$6",
+      "android/support/v17/leanback/app/BrowseSupportFragment$7": "androidx/leanback/app/BrowseSupportFragment$7",
+      "android/support/v17/leanback/app/BrowseSupportFragment$8": "androidx/leanback/app/BrowseSupportFragment$8",
+      "android/support/v17/leanback/app/BrowseSupportFragment$9": "androidx/leanback/app/BrowseSupportFragment$9",
+      "android/support/v17/leanback/app/BrowseSupportFragment$MainFragmentAdapter": "androidx/leanback/app/BrowseSupportFragment$MainFragmentAdapter",
+      "android/support/v4/app/FragmentManager$OnBackStackChangedListener": "androidx/app/FragmentManager$OnBackStackChangedListener",
+      "android/support/v17/leanback/app/BrowseSupportFragment$ExpandPreLayout": "androidx/leanback/app/BrowseSupportFragment$ExpandPreLayout",
+      "android/support/v17/leanback/app/BrowseSupportFragment$FragmentFactory": "androidx/leanback/app/BrowseSupportFragment$FragmentFactory",
+      "android/support/v17/leanback/app/BrowseSupportFragment$FragmentHost": "androidx/leanback/app/BrowseSupportFragment$FragmentHost",
+      "android/support/v17/leanback/app/BrowseSupportFragment$FragmentHostImpl": "androidx/leanback/app/BrowseSupportFragment$FragmentHostImpl",
+      "android/support/v17/leanback/app/BrowseSupportFragment$ListRowFragmentFactory": "androidx/leanback/app/BrowseSupportFragment$ListRowFragmentFactory",
+      "android/support/v17/leanback/app/RowsSupportFragment": "androidx/leanback/app/RowsSupportFragment",
+      "android/support/v17/leanback/app/BrowseSupportFragment$MainFragmentAdapterProvider": "androidx/leanback/app/BrowseSupportFragment$MainFragmentAdapterProvider",
+      "android/support/v17/leanback/app/BrowseSupportFragment$MainFragmentAdapterRegistry": "androidx/leanback/app/BrowseSupportFragment$MainFragmentAdapterRegistry",
+      "android/support/v17/leanback/app/BrowseSupportFragment$MainFragmentItemViewSelectedListener": "androidx/leanback/app/BrowseSupportFragment$MainFragmentItemViewSelectedListener",
+      "android/support/v17/leanback/app/BrowseSupportFragment$MainFragmentRowsAdapter": "androidx/leanback/app/BrowseSupportFragment$MainFragmentRowsAdapter",
+      "android/support/v17/leanback/app/BrowseSupportFragment$MainFragmentRowsAdapterProvider": "androidx/leanback/app/BrowseSupportFragment$MainFragmentRowsAdapterProvider",
+      "android/support/v17/leanback/app/BrowseSupportFragment$SetSelectionRunnable": "androidx/leanback/app/BrowseSupportFragment$SetSelectionRunnable",
+      "android/support/v17/leanback/app/DetailsBackgroundVideoHelper$1": "androidx/leanback/app/DetailsBackgroundVideoHelper$1",
+      "android/support/v17/leanback/widget/ParallaxTarget": "androidx/leanback/widget/ParallaxTarget",
+      "android/support/v17/leanback/app/DetailsBackgroundVideoHelper": "androidx/leanback/app/DetailsBackgroundVideoHelper",
+      "android/support/v17/leanback/app/DetailsBackgroundVideoHelper$2": "androidx/leanback/app/DetailsBackgroundVideoHelper$2",
+      "android/support/v17/leanback/app/DetailsBackgroundVideoHelper$3": "androidx/leanback/app/DetailsBackgroundVideoHelper$3",
+      "android/support/v17/leanback/app/DetailsBackgroundVideoHelper$4": "androidx/leanback/app/DetailsBackgroundVideoHelper$4",
+      "android/support/v17/leanback/app/DetailsBackgroundVideoHelper$PlaybackControlStateCallback": "androidx/leanback/app/DetailsBackgroundVideoHelper$PlaybackControlStateCallback",
+      "android/support/v17/leanback/media/PlaybackGlue$PlayerCallback": "androidx/leanback/media/PlaybackGlue$PlayerCallback",
+      "android/support/v17/leanback/media/PlaybackGlue": "androidx/leanback/media/PlaybackGlue",
+      "android/support/v17/leanback/widget/Parallax$IntProperty": "androidx/leanback/widget/Parallax$IntProperty",
+      "android/support/v17/leanback/widget/Parallax": "androidx/leanback/widget/Parallax",
+      "android/support/v17/leanback/widget/Parallax$PropertyMarkerValue": "androidx/leanback/widget/Parallax$PropertyMarkerValue",
+      "android/support/v17/leanback/widget/DetailsParallax": "androidx/leanback/widget/DetailsParallax",
+      "android/support/v17/leanback/widget/ParallaxEffect": "androidx/leanback/widget/ParallaxEffect",
+      "android/support/v17/leanback/app/DetailsFragment$1": "androidx/leanback/app/DetailsFragment$1",
+      "android/support/v17/leanback/app/DetailsFragment": "androidx/leanback/app/DetailsFragment",
+      "android/support/v17/leanback/app/DetailsFragment$10": "androidx/leanback/app/DetailsFragment$10",
+      "android/support/v17/leanback/app/DetailsFragment$11": "androidx/leanback/app/DetailsFragment$11",
+      "android/support/v17/leanback/widget/ItemBridgeAdapter$AdapterListener": "androidx/leanback/widget/ItemBridgeAdapter$AdapterListener",
+      "android/support/v17/leanback/widget/ItemBridgeAdapter$ViewHolder": "androidx/leanback/widget/ItemBridgeAdapter$ViewHolder",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter",
+      "android/support/v17/leanback/app/DetailsFragment$12": "androidx/leanback/app/DetailsFragment$12",
+      "android/support/v17/leanback/app/DetailsFragment$13": "androidx/leanback/app/DetailsFragment$13",
+      "android/support/v17/leanback/app/DetailsFragment$14": "androidx/leanback/app/DetailsFragment$14",
+      "android/support/v17/leanback/app/DetailsFragmentBackgroundController": "androidx/leanback/app/DetailsFragmentBackgroundController",
+      "android/support/v17/leanback/app/DetailsFragment$15": "androidx/leanback/app/DetailsFragment$15",
+      "android/support/v17/leanback/app/DetailsFragment$2": "androidx/leanback/app/DetailsFragment$2",
+      "android/support/v17/leanback/app/DetailsFragment$3": "androidx/leanback/app/DetailsFragment$3",
+      "android/support/v17/leanback/app/DetailsFragment$WaitEnterTransitionTimeout": "androidx/leanback/app/DetailsFragment$WaitEnterTransitionTimeout",
+      "android/support/v17/leanback/app/DetailsFragment$4": "androidx/leanback/app/DetailsFragment$4",
+      "android/support/v17/leanback/app/DetailsFragment$5": "androidx/leanback/app/DetailsFragment$5",
+      "android/support/v17/leanback/app/DetailsFragment$6": "androidx/leanback/app/DetailsFragment$6",
+      "android/support/v17/leanback/app/DetailsFragment$7": "androidx/leanback/app/DetailsFragment$7",
+      "android/support/v17/leanback/app/DetailsFragment$8": "androidx/leanback/app/DetailsFragment$8",
+      "android/support/v17/leanback/app/DetailsFragment$9": "androidx/leanback/app/DetailsFragment$9",
+      "android/support/v17/leanback/widget/BaseOnItemViewSelectedListener": "androidx/leanback/widget/BaseOnItemViewSelectedListener",
+      "android/support/v17/leanback/app/DetailsFragment$SetSelectionRunnable": "androidx/leanback/app/DetailsFragment$SetSelectionRunnable",
+      "android/support/v17/leanback/widget/ItemAlignmentFacet$ItemAlignmentDef": "androidx/leanback/widget/ItemAlignmentFacet$ItemAlignmentDef",
+      "android/support/v17/leanback/widget/ItemAlignmentFacet": "androidx/leanback/widget/ItemAlignmentFacet",
+      "android/support/v17/leanback/widget/BaseOnItemViewClickedListener": "androidx/leanback/widget/BaseOnItemViewClickedListener",
+      "android/support/annotation/CallSuper": "androidx/annotation/CallSuper",
+      "android/support/v17/leanback/widget/ParallaxTarget$PropertyValuesHolderTarget": "androidx/leanback/widget/ParallaxTarget$PropertyValuesHolderTarget",
+      "android/support/v17/leanback/widget/DetailsParallaxDrawable": "androidx/leanback/widget/DetailsParallaxDrawable",
+      "android/support/v17/leanback/graphics/FitWidthBitmapDrawable": "androidx/leanback/graphics/FitWidthBitmapDrawable",
+      "android/support/v17/leanback/media/PlaybackGlueHost": "androidx/leanback/media/PlaybackGlueHost",
+      "android/support/v17/leanback/app/VideoFragment": "androidx/leanback/app/VideoFragment",
+      "android/support/v17/leanback/app/VideoFragmentGlueHost": "androidx/leanback/app/VideoFragmentGlueHost",
+      "android/support/v17/leanback/app/DetailsSupportFragment$1": "androidx/leanback/app/DetailsSupportFragment$1",
+      "android/support/v17/leanback/app/DetailsSupportFragment": "androidx/leanback/app/DetailsSupportFragment",
+      "android/support/v17/leanback/app/DetailsSupportFragment$10": "androidx/leanback/app/DetailsSupportFragment$10",
+      "android/support/v17/leanback/app/DetailsSupportFragment$11": "androidx/leanback/app/DetailsSupportFragment$11",
+      "android/support/v17/leanback/app/DetailsSupportFragment$12": "androidx/leanback/app/DetailsSupportFragment$12",
+      "android/support/v17/leanback/app/DetailsSupportFragment$13": "androidx/leanback/app/DetailsSupportFragment$13",
+      "android/support/v17/leanback/app/DetailsSupportFragment$14": "androidx/leanback/app/DetailsSupportFragment$14",
+      "android/support/v17/leanback/app/DetailsSupportFragmentBackgroundController": "androidx/leanback/app/DetailsSupportFragmentBackgroundController",
+      "android/support/v17/leanback/app/DetailsSupportFragment$15": "androidx/leanback/app/DetailsSupportFragment$15",
+      "android/support/v17/leanback/app/DetailsSupportFragment$2": "androidx/leanback/app/DetailsSupportFragment$2",
+      "android/support/v17/leanback/app/DetailsSupportFragment$3": "androidx/leanback/app/DetailsSupportFragment$3",
+      "android/support/v17/leanback/app/DetailsSupportFragment$WaitEnterTransitionTimeout": "androidx/leanback/app/DetailsSupportFragment$WaitEnterTransitionTimeout",
+      "android/support/v4/app/FragmentActivity": "androidx/app/FragmentActivity",
+      "android/support/v17/leanback/app/DetailsSupportFragment$4": "androidx/leanback/app/DetailsSupportFragment$4",
+      "android/support/v17/leanback/app/DetailsSupportFragment$5": "androidx/leanback/app/DetailsSupportFragment$5",
+      "android/support/v17/leanback/app/DetailsSupportFragment$6": "androidx/leanback/app/DetailsSupportFragment$6",
+      "android/support/v17/leanback/app/DetailsSupportFragment$7": "androidx/leanback/app/DetailsSupportFragment$7",
+      "android/support/v17/leanback/app/DetailsSupportFragment$8": "androidx/leanback/app/DetailsSupportFragment$8",
+      "android/support/v17/leanback/app/DetailsSupportFragment$9": "androidx/leanback/app/DetailsSupportFragment$9",
+      "android/support/v17/leanback/app/DetailsSupportFragment$SetSelectionRunnable": "androidx/leanback/app/DetailsSupportFragment$SetSelectionRunnable",
+      "android/support/v17/leanback/app/VideoSupportFragment": "androidx/leanback/app/VideoSupportFragment",
+      "android/support/v17/leanback/app/VideoSupportFragmentGlueHost": "androidx/leanback/app/VideoSupportFragmentGlueHost",
+      "android/support/v17/leanback/app/ErrorFragment": "androidx/leanback/app/ErrorFragment",
+      "android/support/v17/leanback/app/ErrorSupportFragment": "androidx/leanback/app/ErrorSupportFragment",
+      "android/support/annotation/RequiresApi": "androidx/annotation/RequiresApi",
+      "android/support/v17/leanback/app/GuidedStepFragment$1": "androidx/leanback/app/GuidedStepFragment$1",
+      "android/support/v17/leanback/widget/GuidedActionAdapter$EditListener": "androidx/leanback/widget/GuidedActionAdapter$EditListener",
+      "android/support/v17/leanback/app/GuidedStepFragment": "androidx/leanback/app/GuidedStepFragment",
+      "android/support/v17/leanback/widget/GuidedActionAdapter": "androidx/leanback/widget/GuidedActionAdapter",
+      "android/support/v17/leanback/widget/GuidedAction": "androidx/leanback/widget/GuidedAction",
+      "android/support/v17/leanback/app/GuidedStepFragment$2": "androidx/leanback/app/GuidedStepFragment$2",
+      "android/support/v17/leanback/widget/GuidedActionAdapter$ClickListener": "androidx/leanback/widget/GuidedActionAdapter$ClickListener",
+      "android/support/v17/leanback/app/GuidedStepFragment$3": "androidx/leanback/app/GuidedStepFragment$3",
+      "android/support/v17/leanback/app/GuidedStepFragment$4": "androidx/leanback/app/GuidedStepFragment$4",
+      "android/support/v17/leanback/widget/GuidedActionsStylist": "androidx/leanback/widget/GuidedActionsStylist",
+      "android/support/v17/leanback/app/GuidedStepFragment$DummyFragment": "androidx/leanback/app/GuidedStepFragment$DummyFragment",
+      "android/support/v17/leanback/widget/GuidedActionAdapter$FocusListener": "androidx/leanback/widget/GuidedActionAdapter$FocusListener",
+      "android/support/v17/leanback/widget/GuidanceStylist$Guidance": "androidx/leanback/widget/GuidanceStylist$Guidance",
+      "android/support/v17/leanback/widget/GuidanceStylist": "androidx/leanback/widget/GuidanceStylist",
+      "android/support/v17/leanback/widget/GuidedActionAdapterGroup": "androidx/leanback/widget/GuidedActionAdapterGroup",
+      "android/support/v17/leanback/widget/DiffCallback": "androidx/leanback/widget/DiffCallback",
+      "android/support/v17/leanback/app/GuidedStepRootLayout": "androidx/leanback/app/GuidedStepRootLayout",
+      "android/support/v17/leanback/widget/NonOverlappingLinearLayout": "androidx/leanback/widget/NonOverlappingLinearLayout",
+      "android/support/v4/app/ActivityCompat": "androidx/app/ActivityCompat",
+      "android/support/v17/leanback/widget/Util": "androidx/leanback/widget/Util",
+      "android/support/v17/leanback/app/GuidedStepSupportFragment$1": "androidx/leanback/app/GuidedStepSupportFragment$1",
+      "android/support/v17/leanback/app/GuidedStepSupportFragment": "androidx/leanback/app/GuidedStepSupportFragment",
+      "android/support/v17/leanback/app/GuidedStepSupportFragment$2": "androidx/leanback/app/GuidedStepSupportFragment$2",
+      "android/support/v17/leanback/app/GuidedStepSupportFragment$3": "androidx/leanback/app/GuidedStepSupportFragment$3",
+      "android/support/v17/leanback/app/GuidedStepSupportFragment$4": "androidx/leanback/app/GuidedStepSupportFragment$4",
+      "android/support/v17/leanback/app/GuidedStepSupportFragment$DummyFragment": "androidx/leanback/app/GuidedStepSupportFragment$DummyFragment",
+      "android/support/v17/leanback/app/HeadersFragment$1$1": "androidx/leanback/app/HeadersFragment$1$1",
+      "android/support/v17/leanback/app/HeadersFragment$1": "androidx/leanback/app/HeadersFragment$1",
+      "android/support/v17/leanback/widget/ItemBridgeAdapter$Wrapper": "androidx/leanback/widget/ItemBridgeAdapter$Wrapper",
+      "android/support/v17/leanback/app/HeadersFragment$2": "androidx/leanback/app/HeadersFragment$2",
+      "android/support/v17/leanback/app/HeadersFragment$3": "androidx/leanback/app/HeadersFragment$3",
+      "android/support/v17/leanback/app/HeadersFragment$NoOverlappingFrameLayout": "androidx/leanback/app/HeadersFragment$NoOverlappingFrameLayout",
+      "android/support/v17/leanback/widget/FocusHighlightHelper": "androidx/leanback/widget/FocusHighlightHelper",
+      "android/support/v17/leanback/widget/ClassPresenterSelector": "androidx/leanback/widget/ClassPresenterSelector",
+      "android/support/v17/leanback/widget/DividerRow": "androidx/leanback/widget/DividerRow",
+      "android/support/v17/leanback/widget/DividerPresenter": "androidx/leanback/widget/DividerPresenter",
+      "android/support/v17/leanback/widget/SectionRow": "androidx/leanback/widget/SectionRow",
+      "android/support/v17/leanback/app/HeadersSupportFragment$1$1": "androidx/leanback/app/HeadersSupportFragment$1$1",
+      "android/support/v17/leanback/app/HeadersSupportFragment$1": "androidx/leanback/app/HeadersSupportFragment$1",
+      "android/support/v17/leanback/app/HeadersSupportFragment$2": "androidx/leanback/app/HeadersSupportFragment$2",
+      "android/support/v17/leanback/app/HeadersSupportFragment$3": "androidx/leanback/app/HeadersSupportFragment$3",
+      "android/support/v17/leanback/app/HeadersSupportFragment$NoOverlappingFrameLayout": "androidx/leanback/app/HeadersSupportFragment$NoOverlappingFrameLayout",
+      "android/support/v17/leanback/app/ListRowDataAdapter$QueueBasedDataObserver": "androidx/leanback/app/ListRowDataAdapter$QueueBasedDataObserver",
+      "android/support/v17/leanback/widget/ObjectAdapter$DataObserver": "androidx/leanback/widget/ObjectAdapter$DataObserver",
+      "android/support/v17/leanback/app/ListRowDataAdapter$SimpleDataObserver": "androidx/leanback/app/ListRowDataAdapter$SimpleDataObserver",
+      "android/support/v17/leanback/app/OnboardingFragment$1": "androidx/leanback/app/OnboardingFragment$1",
+      "android/support/v17/leanback/app/OnboardingFragment": "androidx/leanback/app/OnboardingFragment",
+      "android/support/v17/leanback/app/OnboardingFragment$2": "androidx/leanback/app/OnboardingFragment$2",
+      "android/support/v17/leanback/app/OnboardingFragment$3": "androidx/leanback/app/OnboardingFragment$3",
+      "android/support/v17/leanback/app/OnboardingFragment$4": "androidx/leanback/app/OnboardingFragment$4",
+      "android/support/v17/leanback/app/OnboardingFragment$5": "androidx/leanback/app/OnboardingFragment$5",
+      "android/support/v17/leanback/app/OnboardingFragment$6": "androidx/leanback/app/OnboardingFragment$6",
+      "android/support/v17/leanback/app/OnboardingFragment$7": "androidx/leanback/app/OnboardingFragment$7",
+      "android/support/v17/leanback/widget/PagingIndicator": "androidx/leanback/widget/PagingIndicator",
+      "android/support/v17/leanback/app/OnboardingFragment$8": "androidx/leanback/app/OnboardingFragment$8",
+      "android/support/v17/leanback/R$animator": "androidx/leanback/R$animator",
+      "android/support/v17/leanback/app/OnboardingSupportFragment$1": "androidx/leanback/app/OnboardingSupportFragment$1",
+      "android/support/v17/leanback/app/OnboardingSupportFragment": "androidx/leanback/app/OnboardingSupportFragment",
+      "android/support/v17/leanback/app/OnboardingSupportFragment$2": "androidx/leanback/app/OnboardingSupportFragment$2",
+      "android/support/v17/leanback/app/OnboardingSupportFragment$3": "androidx/leanback/app/OnboardingSupportFragment$3",
+      "android/support/v17/leanback/app/OnboardingSupportFragment$4": "androidx/leanback/app/OnboardingSupportFragment$4",
+      "android/support/v17/leanback/app/OnboardingSupportFragment$5": "androidx/leanback/app/OnboardingSupportFragment$5",
+      "android/support/v17/leanback/app/OnboardingSupportFragment$6": "androidx/leanback/app/OnboardingSupportFragment$6",
+      "android/support/v17/leanback/app/OnboardingSupportFragment$7": "androidx/leanback/app/OnboardingSupportFragment$7",
+      "android/support/v17/leanback/app/OnboardingSupportFragment$8": "androidx/leanback/app/OnboardingSupportFragment$8",
+      "android/support/v17/leanback/app/PermissionHelper": "androidx/leanback/app/PermissionHelper",
+      "android/support/v17/leanback/app/PlaybackFragment$1": "androidx/leanback/app/PlaybackFragment$1",
+      "android/support/v17/leanback/app/PlaybackFragment": "androidx/leanback/app/PlaybackFragment",
+      "android/support/v17/leanback/widget/PlaybackRowPresenter$ViewHolder": "androidx/leanback/widget/PlaybackRowPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/PlaybackRowPresenter": "androidx/leanback/widget/PlaybackRowPresenter",
+      "android/support/v17/leanback/app/PlaybackFragment$10": "androidx/leanback/app/PlaybackFragment$10",
+      "android/support/v17/leanback/widget/PlaybackSeekUi$Client": "androidx/leanback/widget/PlaybackSeekUi$Client",
+      "android/support/v17/leanback/widget/PlaybackSeekUi": "androidx/leanback/widget/PlaybackSeekUi",
+      "android/support/v17/leanback/app/PlaybackFragment$11": "androidx/leanback/app/PlaybackFragment$11",
+      "android/support/v17/leanback/widget/PlaybackSeekDataProvider": "androidx/leanback/widget/PlaybackSeekDataProvider",
+      "android/support/v17/leanback/app/PlaybackFragment$2": "androidx/leanback/app/PlaybackFragment$2",
+      "android/support/v17/leanback/app/PlaybackFragment$3": "androidx/leanback/app/PlaybackFragment$3",
+      "android/support/v17/leanback/app/PlaybackFragment$OnFadeCompleteListener": "androidx/leanback/app/PlaybackFragment$OnFadeCompleteListener",
+      "android/support/v17/leanback/app/PlaybackFragment$4": "androidx/leanback/app/PlaybackFragment$4",
+      "android/support/v17/leanback/app/PlaybackFragment$5": "androidx/leanback/app/PlaybackFragment$5",
+      "android/support/v17/leanback/widget/BaseGridView$OnTouchInterceptListener": "androidx/leanback/widget/BaseGridView$OnTouchInterceptListener",
+      "android/support/v17/leanback/widget/BaseGridView": "androidx/leanback/widget/BaseGridView",
+      "android/support/v17/leanback/app/PlaybackFragment$6": "androidx/leanback/app/PlaybackFragment$6",
+      "android/support/v17/leanback/widget/BaseGridView$OnKeyInterceptListener": "androidx/leanback/widget/BaseGridView$OnKeyInterceptListener",
+      "android/support/v17/leanback/app/PlaybackFragment$7": "androidx/leanback/app/PlaybackFragment$7",
+      "android/support/v17/leanback/app/PlaybackFragment$8": "androidx/leanback/app/PlaybackFragment$8",
+      "android/support/v17/leanback/app/PlaybackFragment$9": "androidx/leanback/app/PlaybackFragment$9",
+      "android/support/v17/leanback/app/PlaybackFragment$SetSelectionRunnable": "androidx/leanback/app/PlaybackFragment$SetSelectionRunnable",
+      "android/support/v17/leanback/media/PlaybackGlueHost$HostCallback": "androidx/leanback/media/PlaybackGlueHost$HostCallback",
+      "android/support/v17/leanback/R$string": "androidx/leanback/R$string",
+      "android/support/v17/leanback/R$integer": "androidx/leanback/R$integer",
+      "android/support/v17/leanback/widget/ArrayObjectAdapter": "androidx/leanback/widget/ArrayObjectAdapter",
+      "android/support/v17/leanback/widget/SparseArrayObjectAdapter": "androidx/leanback/widget/SparseArrayObjectAdapter",
+      "android/support/v17/leanback/app/PlaybackFragmentGlueHost$1": "androidx/leanback/app/PlaybackFragmentGlueHost$1",
+      "android/support/v17/leanback/app/PlaybackFragmentGlueHost": "androidx/leanback/app/PlaybackFragmentGlueHost",
+      "android/support/v17/leanback/widget/OnActionClickedListener": "androidx/leanback/widget/OnActionClickedListener",
+      "android/support/v17/leanback/widget/Action": "androidx/leanback/widget/Action",
+      "android/support/v17/leanback/app/PlaybackFragmentGlueHost$2": "androidx/leanback/app/PlaybackFragmentGlueHost$2",
+      "android/support/v17/leanback/media/PlaybackGlueHost$PlayerCallback": "androidx/leanback/media/PlaybackGlueHost$PlayerCallback",
+      "android/support/v17/leanback/app/PlaybackSupportFragment$1": "androidx/leanback/app/PlaybackSupportFragment$1",
+      "android/support/v17/leanback/app/PlaybackSupportFragment": "androidx/leanback/app/PlaybackSupportFragment",
+      "android/support/v17/leanback/app/PlaybackSupportFragment$10": "androidx/leanback/app/PlaybackSupportFragment$10",
+      "android/support/v17/leanback/app/PlaybackSupportFragment$11": "androidx/leanback/app/PlaybackSupportFragment$11",
+      "android/support/v17/leanback/app/PlaybackSupportFragment$2": "androidx/leanback/app/PlaybackSupportFragment$2",
+      "android/support/v17/leanback/app/PlaybackSupportFragment$3": "androidx/leanback/app/PlaybackSupportFragment$3",
+      "android/support/v17/leanback/app/PlaybackSupportFragment$OnFadeCompleteListener": "androidx/leanback/app/PlaybackSupportFragment$OnFadeCompleteListener",
+      "android/support/v17/leanback/app/PlaybackSupportFragment$4": "androidx/leanback/app/PlaybackSupportFragment$4",
+      "android/support/v17/leanback/app/PlaybackSupportFragment$5": "androidx/leanback/app/PlaybackSupportFragment$5",
+      "android/support/v17/leanback/app/PlaybackSupportFragment$6": "androidx/leanback/app/PlaybackSupportFragment$6",
+      "android/support/v17/leanback/app/PlaybackSupportFragment$7": "androidx/leanback/app/PlaybackSupportFragment$7",
+      "android/support/v17/leanback/app/PlaybackSupportFragment$8": "androidx/leanback/app/PlaybackSupportFragment$8",
+      "android/support/v17/leanback/app/PlaybackSupportFragment$9": "androidx/leanback/app/PlaybackSupportFragment$9",
+      "android/support/v17/leanback/app/PlaybackSupportFragment$SetSelectionRunnable": "androidx/leanback/app/PlaybackSupportFragment$SetSelectionRunnable",
+      "android/support/v17/leanback/app/PlaybackSupportFragmentGlueHost$1": "androidx/leanback/app/PlaybackSupportFragmentGlueHost$1",
+      "android/support/v17/leanback/app/PlaybackSupportFragmentGlueHost": "androidx/leanback/app/PlaybackSupportFragmentGlueHost",
+      "android/support/v17/leanback/app/PlaybackSupportFragmentGlueHost$2": "androidx/leanback/app/PlaybackSupportFragmentGlueHost$2",
+      "android/support/v17/leanback/app/ProgressBarManager$1": "androidx/leanback/app/ProgressBarManager$1",
+      "android/support/v17/leanback/app/RowsFragment$1": "androidx/leanback/app/RowsFragment$1",
+      "android/support/v17/leanback/app/RowsFragment$RowViewHolderExtra": "androidx/leanback/app/RowsFragment$RowViewHolderExtra",
+      "android/support/v17/leanback/app/RowsFragment$2$1": "androidx/leanback/app/RowsFragment$2$1",
+      "android/support/v17/leanback/app/RowsFragment$2": "androidx/leanback/app/RowsFragment$2",
+      "android/support/v17/leanback/widget/ViewHolderTask": "androidx/leanback/widget/ViewHolderTask",
+      "android/support/v17/leanback/app/RowsFragment$MainFragmentAdapter": "androidx/leanback/app/RowsFragment$MainFragmentAdapter",
+      "android/support/v17/leanback/app/RowsFragment$MainFragmentRowsAdapter": "androidx/leanback/app/RowsFragment$MainFragmentRowsAdapter",
+      "android/support/v7/widget/RecyclerView$RecycledViewPool": "androidx/widget/recyclerview/RecyclerView$RecycledViewPool",
+      "android/support/v17/leanback/widget/ListRowPresenter$ViewHolder": "androidx/leanback/widget/ListRowPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/ListRowPresenter": "androidx/leanback/widget/ListRowPresenter",
+      "android/support/v17/leanback/widget/HorizontalGridView": "androidx/leanback/widget/HorizontalGridView",
+      "android/support/v17/leanback/app/RowsSupportFragment$1": "androidx/leanback/app/RowsSupportFragment$1",
+      "android/support/v17/leanback/app/RowsSupportFragment$RowViewHolderExtra": "androidx/leanback/app/RowsSupportFragment$RowViewHolderExtra",
+      "android/support/v17/leanback/app/RowsSupportFragment$2$1": "androidx/leanback/app/RowsSupportFragment$2$1",
+      "android/support/v17/leanback/app/RowsSupportFragment$2": "androidx/leanback/app/RowsSupportFragment$2",
+      "android/support/v17/leanback/app/RowsSupportFragment$MainFragmentAdapter": "androidx/leanback/app/RowsSupportFragment$MainFragmentAdapter",
+      "android/support/v17/leanback/app/RowsSupportFragment$MainFragmentRowsAdapter": "androidx/leanback/app/RowsSupportFragment$MainFragmentRowsAdapter",
+      "android/support/v17/leanback/app/SearchFragment$1": "androidx/leanback/app/SearchFragment$1",
+      "android/support/v17/leanback/app/SearchFragment": "androidx/leanback/app/SearchFragment",
+      "android/support/v17/leanback/app/SearchFragment$2": "androidx/leanback/app/SearchFragment$2",
+      "android/support/v17/leanback/app/SearchFragment$3": "androidx/leanback/app/SearchFragment$3",
+      "android/support/v17/leanback/app/SearchFragment$SearchResultProvider": "androidx/leanback/app/SearchFragment$SearchResultProvider",
+      "android/support/v17/leanback/app/SearchFragment$4": "androidx/leanback/app/SearchFragment$4",
+      "android/support/v17/leanback/widget/SearchBar": "androidx/leanback/widget/SearchBar",
+      "android/support/v17/leanback/app/SearchFragment$5": "androidx/leanback/app/SearchFragment$5",
+      "android/support/v17/leanback/widget/SearchBar$SearchBarPermissionListener": "androidx/leanback/widget/SearchBar$SearchBarPermissionListener",
+      "android/support/v17/leanback/app/SearchFragment$6": "androidx/leanback/app/SearchFragment$6",
+      "android/support/v17/leanback/widget/SearchBar$SearchBarListener": "androidx/leanback/widget/SearchBar$SearchBarListener",
+      "android/support/v17/leanback/app/SearchFragment$7": "androidx/leanback/app/SearchFragment$7",
+      "android/support/v17/leanback/app/SearchFragment$ExternalQuery": "androidx/leanback/app/SearchFragment$ExternalQuery",
+      "android/support/v17/leanback/widget/SpeechRecognitionCallback": "androidx/leanback/widget/SpeechRecognitionCallback",
+      "android/support/v17/leanback/app/SearchSupportFragment$1": "androidx/leanback/app/SearchSupportFragment$1",
+      "android/support/v17/leanback/app/SearchSupportFragment": "androidx/leanback/app/SearchSupportFragment",
+      "android/support/v17/leanback/app/SearchSupportFragment$2": "androidx/leanback/app/SearchSupportFragment$2",
+      "android/support/v17/leanback/app/SearchSupportFragment$3": "androidx/leanback/app/SearchSupportFragment$3",
+      "android/support/v17/leanback/app/SearchSupportFragment$SearchResultProvider": "androidx/leanback/app/SearchSupportFragment$SearchResultProvider",
+      "android/support/v17/leanback/app/SearchSupportFragment$4": "androidx/leanback/app/SearchSupportFragment$4",
+      "android/support/v17/leanback/app/SearchSupportFragment$5": "androidx/leanback/app/SearchSupportFragment$5",
+      "android/support/v17/leanback/app/SearchSupportFragment$6": "androidx/leanback/app/SearchSupportFragment$6",
+      "android/support/v17/leanback/app/SearchSupportFragment$7": "androidx/leanback/app/SearchSupportFragment$7",
+      "android/support/v17/leanback/app/SearchSupportFragment$ExternalQuery": "androidx/leanback/app/SearchSupportFragment$ExternalQuery",
+      "android/support/v17/leanback/app/VerticalGridFragment$1": "androidx/leanback/app/VerticalGridFragment$1",
+      "android/support/v17/leanback/app/VerticalGridFragment": "androidx/leanback/app/VerticalGridFragment",
+      "android/support/v17/leanback/app/VerticalGridFragment$2": "androidx/leanback/app/VerticalGridFragment$2",
+      "android/support/v17/leanback/widget/VerticalGridPresenter$ViewHolder": "androidx/leanback/widget/VerticalGridPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/VerticalGridPresenter": "androidx/leanback/widget/VerticalGridPresenter",
+      "android/support/v17/leanback/app/VerticalGridFragment$3": "androidx/leanback/app/VerticalGridFragment$3",
+      "android/support/v17/leanback/widget/OnChildLaidOutListener": "androidx/leanback/widget/OnChildLaidOutListener",
+      "android/support/v17/leanback/app/VerticalGridFragment$4": "androidx/leanback/app/VerticalGridFragment$4",
+      "android/support/v17/leanback/app/VerticalGridSupportFragment$1": "androidx/leanback/app/VerticalGridSupportFragment$1",
+      "android/support/v17/leanback/app/VerticalGridSupportFragment": "androidx/leanback/app/VerticalGridSupportFragment",
+      "android/support/v17/leanback/app/VerticalGridSupportFragment$2": "androidx/leanback/app/VerticalGridSupportFragment$2",
+      "android/support/v17/leanback/app/VerticalGridSupportFragment$3": "androidx/leanback/app/VerticalGridSupportFragment$3",
+      "android/support/v17/leanback/app/VerticalGridSupportFragment$4": "androidx/leanback/app/VerticalGridSupportFragment$4",
+      "android/support/v17/leanback/app/VideoFragment$1": "androidx/leanback/app/VideoFragment$1",
+      "android/support/v17/leanback/media/SurfaceHolderGlueHost": "androidx/leanback/media/SurfaceHolderGlueHost",
+      "android/support/v17/leanback/app/VideoSupportFragment$1": "androidx/leanback/app/VideoSupportFragment$1",
+      "android/support/v17/leanback/database/CursorMapper": "androidx/leanback/database/CursorMapper",
+      "android/support/v17/leanback/graphics/BoundsRule$ValueRule": "androidx/leanback/graphics/BoundsRule$ValueRule",
+      "android/support/v17/leanback/graphics/BoundsRule": "androidx/leanback/graphics/BoundsRule",
+      "android/support/v17/leanback/graphics/ColorFilterCache": "androidx/leanback/graphics/ColorFilterCache",
+      "android/support/v17/leanback/graphics/ColorFilterDimmer": "androidx/leanback/graphics/ColorFilterDimmer",
+      "android/support/v17/leanback/graphics/ColorOverlayDimmer": "androidx/leanback/graphics/ColorOverlayDimmer",
+      "android/support/v17/leanback/graphics/CompositeDrawable$ChildDrawable$1": "androidx/leanback/graphics/CompositeDrawable$ChildDrawable$1",
+      "android/support/v17/leanback/graphics/CompositeDrawable$ChildDrawable": "androidx/leanback/graphics/CompositeDrawable$ChildDrawable",
+      "android/support/v17/leanback/graphics/CompositeDrawable": "androidx/leanback/graphics/CompositeDrawable",
+      "android/support/v17/leanback/graphics/CompositeDrawable$ChildDrawable$2": "androidx/leanback/graphics/CompositeDrawable$ChildDrawable$2",
+      "android/support/v17/leanback/graphics/CompositeDrawable$ChildDrawable$3": "androidx/leanback/graphics/CompositeDrawable$ChildDrawable$3",
+      "android/support/v17/leanback/graphics/CompositeDrawable$ChildDrawable$4": "androidx/leanback/graphics/CompositeDrawable$ChildDrawable$4",
+      "android/support/v17/leanback/graphics/CompositeDrawable$ChildDrawable$5": "androidx/leanback/graphics/CompositeDrawable$ChildDrawable$5",
+      "android/support/v17/leanback/graphics/CompositeDrawable$ChildDrawable$6": "androidx/leanback/graphics/CompositeDrawable$ChildDrawable$6",
+      "android/support/v17/leanback/graphics/CompositeDrawable$ChildDrawable$7": "androidx/leanback/graphics/CompositeDrawable$ChildDrawable$7",
+      "android/support/v17/leanback/graphics/CompositeDrawable$ChildDrawable$8": "androidx/leanback/graphics/CompositeDrawable$ChildDrawable$8",
+      "android/support/v17/leanback/graphics/CompositeDrawable$CompositeState": "androidx/leanback/graphics/CompositeDrawable$CompositeState",
+      "android/support/v17/leanback/graphics/FitWidthBitmapDrawable$1": "androidx/leanback/graphics/FitWidthBitmapDrawable$1",
+      "android/support/v17/leanback/graphics/FitWidthBitmapDrawable$2": "androidx/leanback/graphics/FitWidthBitmapDrawable$2",
+      "android/support/v17/leanback/graphics/FitWidthBitmapDrawable$BitmapState": "androidx/leanback/graphics/FitWidthBitmapDrawable$BitmapState",
+      "android/support/v17/leanback/media/MediaControllerAdapter$1": "androidx/leanback/media/MediaControllerAdapter$1",
+      "android/support/v17/leanback/media/MediaControllerAdapter": "androidx/leanback/media/MediaControllerAdapter",
+      "android/support/v17/leanback/media/PlayerAdapter$Callback": "androidx/leanback/media/PlayerAdapter$Callback",
+      "android/support/v17/leanback/media/PlayerAdapter": "androidx/leanback/media/PlayerAdapter",
+      "android/support/v17/leanback/media/MediaControllerAdapter$2": "androidx/leanback/media/MediaControllerAdapter$2",
+      "android/support/v4/media/session/MediaControllerCompat$Callback": "androidx/media/session/MediaControllerCompat$Callback",
+      "android/support/v4/media/session/MediaControllerCompat": "androidx/media/session/MediaControllerCompat",
+      "android/support/v4/media/session/PlaybackStateCompat": "androidx/media/session/PlaybackStateCompat",
+      "android/support/v4/media/MediaMetadataCompat": "androidx/media/MediaMetadataCompat",
+      "android/support/v4/media/session/MediaControllerCompat$TransportControls": "androidx/media/session/MediaControllerCompat$TransportControls",
+      "android/support/v4/media/MediaDescriptionCompat": "androidx/media/MediaDescriptionCompat",
+      "android/support/v17/leanback/media/MediaControllerGlue$1": "androidx/leanback/media/MediaControllerGlue$1",
+      "android/support/v17/leanback/media/MediaControllerGlue": "androidx/leanback/media/MediaControllerGlue",
+      "android/support/v17/leanback/media/PlaybackControlGlue": "androidx/leanback/media/PlaybackControlGlue",
+      "android/support/v17/leanback/media/MediaPlayerAdapter$1": "androidx/leanback/media/MediaPlayerAdapter$1",
+      "android/support/v17/leanback/media/MediaPlayerAdapter": "androidx/leanback/media/MediaPlayerAdapter",
+      "android/support/v17/leanback/media/MediaPlayerAdapter$2": "androidx/leanback/media/MediaPlayerAdapter$2",
+      "android/support/v17/leanback/media/MediaPlayerAdapter$3": "androidx/leanback/media/MediaPlayerAdapter$3",
+      "android/support/v17/leanback/media/MediaPlayerAdapter$4": "androidx/leanback/media/MediaPlayerAdapter$4",
+      "android/support/v17/leanback/media/MediaPlayerAdapter$5": "androidx/leanback/media/MediaPlayerAdapter$5",
+      "android/support/v17/leanback/media/MediaPlayerAdapter$6": "androidx/leanback/media/MediaPlayerAdapter$6",
+      "android/support/v17/leanback/media/MediaPlayerAdapter$7": "androidx/leanback/media/MediaPlayerAdapter$7",
+      "android/support/v17/leanback/media/MediaPlayerAdapter$8": "androidx/leanback/media/MediaPlayerAdapter$8",
+      "android/support/v17/leanback/media/MediaPlayerAdapter$VideoPlayerSurfaceHolderCallback": "androidx/leanback/media/MediaPlayerAdapter$VideoPlayerSurfaceHolderCallback",
+      "android/support/v17/leanback/media/MediaPlayerGlue$1": "androidx/leanback/media/MediaPlayerGlue$1",
+      "android/support/v17/leanback/media/MediaPlayerGlue": "androidx/leanback/media/MediaPlayerGlue",
+      "android/support/v17/leanback/media/MediaPlayerGlue$2": "androidx/leanback/media/MediaPlayerGlue$2",
+      "android/support/v17/leanback/media/MediaPlayerGlue$3": "androidx/leanback/media/MediaPlayerGlue$3",
+      "android/support/v17/leanback/media/MediaPlayerGlue$4": "androidx/leanback/media/MediaPlayerGlue$4",
+      "android/support/v17/leanback/media/MediaPlayerGlue$5": "androidx/leanback/media/MediaPlayerGlue$5",
+      "android/support/v17/leanback/widget/PlaybackControlsRow": "androidx/leanback/widget/PlaybackControlsRow",
+      "android/support/v17/leanback/media/MediaPlayerGlue$VideoPlayerSurfaceHolderCallback": "androidx/leanback/media/MediaPlayerGlue$VideoPlayerSurfaceHolderCallback",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$ThumbsDownAction": "androidx/leanback/widget/PlaybackControlsRow$ThumbsDownAction",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$ThumbsUpAction": "androidx/leanback/widget/PlaybackControlsRow$ThumbsUpAction",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$RepeatAction": "androidx/leanback/widget/PlaybackControlsRow$RepeatAction",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$ThumbsAction": "androidx/leanback/widget/PlaybackControlsRow$ThumbsAction",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$RewindAction": "androidx/leanback/widget/PlaybackControlsRow$RewindAction",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$FastForwardAction": "androidx/leanback/widget/PlaybackControlsRow$FastForwardAction",
+      "android/support/v17/leanback/media/PlaybackBannerControlGlue$1": "androidx/leanback/media/PlaybackBannerControlGlue$1",
+      "android/support/v17/leanback/widget/AbstractDetailsDescriptionPresenter": "androidx/leanback/widget/AbstractDetailsDescriptionPresenter",
+      "android/support/v17/leanback/media/PlaybackBannerControlGlue": "androidx/leanback/media/PlaybackBannerControlGlue",
+      "android/support/v17/leanback/widget/AbstractDetailsDescriptionPresenter$ViewHolder": "androidx/leanback/widget/AbstractDetailsDescriptionPresenter$ViewHolder",
+      "android/support/v17/leanback/media/PlaybackBannerControlGlue$2": "androidx/leanback/media/PlaybackBannerControlGlue$2",
+      "android/support/v17/leanback/widget/PlaybackControlsRowPresenter": "androidx/leanback/widget/PlaybackControlsRowPresenter",
+      "android/support/v17/leanback/media/PlaybackBannerControlGlue$ACTION_": "androidx/leanback/media/PlaybackBannerControlGlue$ACTION_",
+      "android/support/v17/leanback/media/PlaybackBannerControlGlue$SPEED": "androidx/leanback/media/PlaybackBannerControlGlue$SPEED",
+      "android/support/v17/leanback/media/PlaybackBaseControlGlue": "androidx/leanback/media/PlaybackBaseControlGlue",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$PlayPauseAction": "androidx/leanback/widget/PlaybackControlsRow$PlayPauseAction",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$SkipNextAction": "androidx/leanback/widget/PlaybackControlsRow$SkipNextAction",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$SkipPreviousAction": "androidx/leanback/widget/PlaybackControlsRow$SkipPreviousAction",
+      "android/support/v17/leanback/media/PlaybackBaseControlGlue$1": "androidx/leanback/media/PlaybackBaseControlGlue$1",
+      "android/support/v17/leanback/widget/ControlButtonPresenterSelector": "androidx/leanback/widget/ControlButtonPresenterSelector",
+      "android/support/v17/leanback/media/PlaybackControlGlue$1": "androidx/leanback/media/PlaybackControlGlue$1",
+      "android/support/v17/leanback/media/PlaybackControlGlue$2": "androidx/leanback/media/PlaybackControlGlue$2",
+      "android/support/v17/leanback/media/PlaybackControlGlue$UpdatePlaybackStateHandler": "androidx/leanback/media/PlaybackControlGlue$UpdatePlaybackStateHandler",
+      "android/support/v17/leanback/media/PlaybackGlue$1": "androidx/leanback/media/PlaybackGlue$1",
+      "android/support/v17/leanback/media/PlaybackGlue$2": "androidx/leanback/media/PlaybackGlue$2",
+      "android/support/v17/leanback/media/PlaybackTransportControlGlue$1": "androidx/leanback/media/PlaybackTransportControlGlue$1",
+      "android/support/v17/leanback/media/PlaybackTransportControlGlue": "androidx/leanback/media/PlaybackTransportControlGlue",
+      "android/support/v17/leanback/media/PlaybackTransportControlGlue$2": "androidx/leanback/media/PlaybackTransportControlGlue$2",
+      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter": "androidx/leanback/widget/PlaybackTransportRowPresenter",
+      "android/support/v17/leanback/media/PlaybackTransportControlGlue$SeekUiClient": "androidx/leanback/media/PlaybackTransportControlGlue$SeekUiClient",
+      "android/support/v17/leanback/media/PlaybackTransportControlGlue$UpdatePlaybackStateHandler": "androidx/leanback/media/PlaybackTransportControlGlue$UpdatePlaybackStateHandler",
+      "android/support/v17/leanback/system/Settings$Customizations": "androidx/leanback/system/Settings$Customizations",
+      "android/support/v17/leanback/system/Settings": "androidx/leanback/system/Settings",
+      "android/support/v17/leanback/widget/ShadowOverlayContainer": "androidx/leanback/widget/ShadowOverlayContainer",
+      "android/support/v17/leanback/transition/FadeAndShortSlide$1": "androidx/leanback/transition/FadeAndShortSlide$1",
+      "android/support/v17/leanback/transition/FadeAndShortSlide$CalculateSlide": "androidx/leanback/transition/FadeAndShortSlide$CalculateSlide",
+      "android/support/v17/leanback/transition/FadeAndShortSlide": "androidx/leanback/transition/FadeAndShortSlide",
+      "android/support/v17/leanback/transition/FadeAndShortSlide$2": "androidx/leanback/transition/FadeAndShortSlide$2",
+      "android/support/v17/leanback/transition/FadeAndShortSlide$3": "androidx/leanback/transition/FadeAndShortSlide$3",
+      "android/support/v17/leanback/transition/FadeAndShortSlide$4": "androidx/leanback/transition/FadeAndShortSlide$4",
+      "android/support/v17/leanback/transition/FadeAndShortSlide$5": "androidx/leanback/transition/FadeAndShortSlide$5",
+      "android/support/v17/leanback/transition/FadeAndShortSlide$6": "androidx/leanback/transition/FadeAndShortSlide$6",
+      "android/support/v17/leanback/transition/TranslationAnimationCreator": "androidx/leanback/transition/TranslationAnimationCreator",
+      "android/support/v17/leanback/transition/LeanbackTransitionHelper$LeanbackTransitionHelperDefault": "androidx/leanback/transition/LeanbackTransitionHelper$LeanbackTransitionHelperDefault",
+      "android/support/v17/leanback/transition/LeanbackTransitionHelper$LeanbackTransitionHelperVersion": "androidx/leanback/transition/LeanbackTransitionHelper$LeanbackTransitionHelperVersion",
+      "android/support/v17/leanback/transition/LeanbackTransitionHelper": "androidx/leanback/transition/LeanbackTransitionHelper",
+      "android/support/v17/leanback/transition/LeanbackTransitionHelper$LeanbackTransitionHelperKitKatImpl": "androidx/leanback/transition/LeanbackTransitionHelper$LeanbackTransitionHelperKitKatImpl",
+      "android/support/v17/leanback/transition/LeanbackTransitionHelperKitKat": "androidx/leanback/transition/LeanbackTransitionHelperKitKat",
+      "android/support/v17/leanback/R$anim": "androidx/leanback/R$anim",
+      "android/support/v17/leanback/transition/SlideKitkat": "androidx/leanback/transition/SlideKitkat",
+      "android/support/v17/leanback/transition/ParallaxTransition$1": "androidx/leanback/transition/ParallaxTransition$1",
+      "android/support/v17/leanback/transition/ParallaxTransition": "androidx/leanback/transition/ParallaxTransition",
+      "android/support/v17/leanback/transition/Scale$1": "androidx/leanback/transition/Scale$1",
+      "android/support/v17/leanback/transition/Scale": "androidx/leanback/transition/Scale",
+      "android/support/v17/leanback/transition/SlideKitkat$1": "androidx/leanback/transition/SlideKitkat$1",
+      "android/support/v17/leanback/transition/SlideKitkat$CalculateSlideHorizontal": "androidx/leanback/transition/SlideKitkat$CalculateSlideHorizontal",
+      "android/support/v17/leanback/transition/SlideKitkat$2": "androidx/leanback/transition/SlideKitkat$2",
+      "android/support/v17/leanback/transition/SlideKitkat$CalculateSlideVertical": "androidx/leanback/transition/SlideKitkat$CalculateSlideVertical",
+      "android/support/v17/leanback/transition/SlideKitkat$3": "androidx/leanback/transition/SlideKitkat$3",
+      "android/support/v17/leanback/transition/SlideKitkat$4": "androidx/leanback/transition/SlideKitkat$4",
+      "android/support/v17/leanback/transition/SlideKitkat$5": "androidx/leanback/transition/SlideKitkat$5",
+      "android/support/v17/leanback/transition/SlideKitkat$6": "androidx/leanback/transition/SlideKitkat$6",
+      "android/support/v17/leanback/transition/SlideKitkat$CalculateSlide": "androidx/leanback/transition/SlideKitkat$CalculateSlide",
+      "android/support/v17/leanback/transition/SlideKitkat$SlideAnimatorListener": "androidx/leanback/transition/SlideKitkat$SlideAnimatorListener",
+      "android/support/v17/leanback/transition/SlideNoPropagation": "androidx/leanback/transition/SlideNoPropagation",
+      "android/support/v17/leanback/transition/TransitionEpicenterCallback": "androidx/leanback/transition/TransitionEpicenterCallback",
+      "android/support/v17/leanback/transition/TransitionHelper$TransitionHelperApi21Impl": "androidx/leanback/transition/TransitionHelper$TransitionHelperApi21Impl",
+      "android/support/v17/leanback/transition/TransitionHelper$TransitionHelperKitkatImpl": "androidx/leanback/transition/TransitionHelper$TransitionHelperKitkatImpl",
+      "android/support/v17/leanback/transition/TransitionHelperApi21": "androidx/leanback/transition/TransitionHelperApi21",
+      "android/support/v17/leanback/transition/TransitionHelper$TransitionHelperStubImpl": "androidx/leanback/transition/TransitionHelper$TransitionHelperStubImpl",
+      "android/support/v17/leanback/transition/TransitionHelperKitkat": "androidx/leanback/transition/TransitionHelperKitkat",
+      "android/support/v17/leanback/transition/TransitionHelper$TransitionHelperStubImpl$TransitionStub": "androidx/leanback/transition/TransitionHelper$TransitionHelperStubImpl$TransitionStub",
+      "android/support/v17/leanback/transition/TransitionHelper$TransitionHelperVersionImpl": "androidx/leanback/transition/TransitionHelper$TransitionHelperVersionImpl",
+      "android/support/v17/leanback/transition/TransitionHelperApi21$1": "androidx/leanback/transition/TransitionHelperApi21$1",
+      "android/support/v17/leanback/transition/TransitionHelperKitkat$1": "androidx/leanback/transition/TransitionHelperKitkat$1",
+      "android/support/v17/leanback/transition/TransitionHelperKitkat$CustomChangeBounds": "androidx/leanback/transition/TransitionHelperKitkat$CustomChangeBounds",
+      "android/support/v17/leanback/transition/TranslationAnimationCreator$TransitionPositionListener": "androidx/leanback/transition/TranslationAnimationCreator$TransitionPositionListener",
+      "android/support/v17/leanback/util/MathUtil": "androidx/leanback/util/MathUtil",
+      "android/support/v17/leanback/util/StateMachine$Transition": "androidx/leanback/util/StateMachine$Transition",
+      "android/support/v17/leanback/widget/AbstractDetailsDescriptionPresenter$ViewHolder$1": "androidx/leanback/widget/AbstractDetailsDescriptionPresenter$ViewHolder$1",
+      "android/support/v17/leanback/widget/AbstractDetailsDescriptionPresenter$ViewHolder$2": "androidx/leanback/widget/AbstractDetailsDescriptionPresenter$ViewHolder$2",
+      "android/support/v17/leanback/widget/AbstractMediaItemPresenter$1": "androidx/leanback/widget/AbstractMediaItemPresenter$1",
+      "android/support/v17/leanback/widget/AbstractMediaItemPresenter": "androidx/leanback/widget/AbstractMediaItemPresenter",
+      "android/support/v17/leanback/widget/AbstractMediaItemPresenter$ViewHolder$1": "androidx/leanback/widget/AbstractMediaItemPresenter$ViewHolder$1",
+      "android/support/v17/leanback/widget/AbstractMediaItemPresenter$ViewHolder": "androidx/leanback/widget/AbstractMediaItemPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/AbstractMediaItemPresenter$ViewHolder$2": "androidx/leanback/widget/AbstractMediaItemPresenter$ViewHolder$2",
+      "android/support/v17/leanback/widget/AbstractMediaItemPresenter$ViewHolder$3": "androidx/leanback/widget/AbstractMediaItemPresenter$ViewHolder$3",
+      "android/support/v17/leanback/widget/AbstractMediaItemPresenter$ViewHolder$4": "androidx/leanback/widget/AbstractMediaItemPresenter$ViewHolder$4",
+      "android/support/v17/leanback/widget/MultiActionsProvider$MultiAction": "androidx/leanback/widget/MultiActionsProvider$MultiAction",
+      "android/support/v17/leanback/widget/MultiActionsProvider": "androidx/leanback/widget/MultiActionsProvider",
+      "android/support/v17/leanback/widget/MediaItemActionPresenter": "androidx/leanback/widget/MediaItemActionPresenter",
+      "android/support/v17/leanback/widget/AbstractMediaListHeaderPresenter$ViewHolder": "androidx/leanback/widget/AbstractMediaListHeaderPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/AbstractMediaListHeaderPresenter": "androidx/leanback/widget/AbstractMediaListHeaderPresenter",
+      "android/support/v17/leanback/widget/ActionPresenterSelector$ActionPresenter": "androidx/leanback/widget/ActionPresenterSelector$ActionPresenter",
+      "android/support/v17/leanback/widget/ActionPresenterSelector": "androidx/leanback/widget/ActionPresenterSelector",
+      "android/support/v17/leanback/widget/ActionPresenterSelector$ActionViewHolder": "androidx/leanback/widget/ActionPresenterSelector$ActionViewHolder",
+      "android/support/v17/leanback/widget/ActionPresenterSelector$OneLineActionPresenter": "androidx/leanback/widget/ActionPresenterSelector$OneLineActionPresenter",
+      "android/support/v17/leanback/widget/ActionPresenterSelector$TwoLineActionPresenter": "androidx/leanback/widget/ActionPresenterSelector$TwoLineActionPresenter",
+      "android/support/v17/leanback/widget/ArrayObjectAdapter$1": "androidx/leanback/widget/ArrayObjectAdapter$1",
+      "android/support/v7/util/DiffUtil$Callback": "androidx/widget/recyclerview/DiffUtil$Callback",
+      "android/support/v7/util/DiffUtil": "androidx/widget/recyclerview/DiffUtil",
+      "android/support/v17/leanback/widget/ArrayObjectAdapter$2": "androidx/leanback/widget/ArrayObjectAdapter$2",
+      "android/support/v7/util/ListUpdateCallback": "androidx/widget/recyclerview/ListUpdateCallback",
+      "android/support/v7/util/DiffUtil$DiffResult": "androidx/widget/recyclerview/DiffUtil$DiffResult",
+      "android/support/v17/leanback/widget/BaseCardView$1": "androidx/leanback/widget/BaseCardView$1",
+      "android/support/v17/leanback/widget/BaseCardView": "androidx/leanback/widget/BaseCardView",
+      "android/support/v17/leanback/widget/BaseCardView$2": "androidx/leanback/widget/BaseCardView$2",
+      "android/support/v17/leanback/widget/BaseCardView$3": "androidx/leanback/widget/BaseCardView$3",
+      "android/support/v17/leanback/widget/BaseCardView$4": "androidx/leanback/widget/BaseCardView$4",
+      "android/support/v17/leanback/widget/BaseCardView$AnimationBase": "androidx/leanback/widget/BaseCardView$AnimationBase",
+      "android/support/annotation/VisibleForTesting": "androidx/annotation/VisibleForTesting",
+      "android/support/v17/leanback/widget/BaseCardView$InfoAlphaAnimation": "androidx/leanback/widget/BaseCardView$InfoAlphaAnimation",
+      "android/support/v17/leanback/widget/BaseCardView$InfoHeightAnimation": "androidx/leanback/widget/BaseCardView$InfoHeightAnimation",
+      "android/support/v17/leanback/widget/BaseCardView$InfoOffsetAnimation": "androidx/leanback/widget/BaseCardView$InfoOffsetAnimation",
+      "android/support/v17/leanback/widget/BaseCardView$LayoutParams": "androidx/leanback/widget/BaseCardView$LayoutParams",
+      "android/support/v17/leanback/widget/BaseGridView$1": "androidx/leanback/widget/BaseGridView$1",
+      "android/support/v7/widget/RecyclerView$RecyclerListener": "androidx/widget/recyclerview/RecyclerView$RecyclerListener",
+      "android/support/v17/leanback/widget/GridLayoutManager": "androidx/leanback/widget/GridLayoutManager",
+      "android/support/v17/leanback/widget/BaseGridView$2": "androidx/leanback/widget/BaseGridView$2",
+      "android/support/v17/leanback/widget/BaseGridView$3": "androidx/leanback/widget/BaseGridView$3",
+      "android/support/v17/leanback/widget/BaseGridView$OnMotionInterceptListener": "androidx/leanback/widget/BaseGridView$OnMotionInterceptListener",
+      "android/support/v17/leanback/widget/BaseGridView$OnUnhandledKeyListener": "androidx/leanback/widget/BaseGridView$OnUnhandledKeyListener",
+      "android/support/v7/widget/RecyclerView$ItemAnimator": "androidx/widget/recyclerview/RecyclerView$ItemAnimator",
+      "android/support/v7/widget/RecyclerView$LayoutManager": "androidx/widget/recyclerview/RecyclerView$LayoutManager",
+      "android/support/v17/leanback/widget/WindowAlignment$Axis": "androidx/leanback/widget/WindowAlignment$Axis",
+      "android/support/v17/leanback/widget/WindowAlignment": "androidx/leanback/widget/WindowAlignment",
+      "android/support/v7/widget/SimpleItemAnimator": "androidx/widget/recyclerview/SimpleItemAnimator",
+      "android/support/v17/leanback/widget/OnChildSelectedListener": "androidx/leanback/widget/OnChildSelectedListener",
+      "android/support/v17/leanback/widget/ViewsStateBundle": "androidx/leanback/widget/ViewsStateBundle",
+      "android/support/v17/leanback/widget/BrowseRowsFrameLayout": "androidx/leanback/widget/BrowseRowsFrameLayout",
+      "android/support/v17/leanback/widget/CheckableImageView": "androidx/leanback/widget/CheckableImageView",
+      "android/support/v17/leanback/widget/ControlBar$OnChildFocusedListener": "androidx/leanback/widget/ControlBar$OnChildFocusedListener",
+      "android/support/v17/leanback/widget/ControlBar": "androidx/leanback/widget/ControlBar",
+      "android/support/v17/leanback/widget/ControlBarPresenter$BoundData": "androidx/leanback/widget/ControlBarPresenter$BoundData",
+      "android/support/v17/leanback/widget/ControlBarPresenter": "androidx/leanback/widget/ControlBarPresenter",
+      "android/support/v17/leanback/widget/ControlBarPresenter$OnControlClickedListener": "androidx/leanback/widget/ControlBarPresenter$OnControlClickedListener",
+      "android/support/v17/leanback/widget/ControlBarPresenter$OnControlSelectedListener": "androidx/leanback/widget/ControlBarPresenter$OnControlSelectedListener",
+      "android/support/v17/leanback/widget/ControlBarPresenter$ViewHolder$1": "androidx/leanback/widget/ControlBarPresenter$ViewHolder$1",
+      "android/support/v17/leanback/widget/ControlBarPresenter$ViewHolder": "androidx/leanback/widget/ControlBarPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/ControlBarPresenter$ViewHolder$2": "androidx/leanback/widget/ControlBarPresenter$ViewHolder$2",
+      "android/support/v17/leanback/widget/ControlBarPresenter$ViewHolder$3": "androidx/leanback/widget/ControlBarPresenter$ViewHolder$3",
+      "android/support/v17/leanback/widget/ControlButtonPresenterSelector$ActionViewHolder": "androidx/leanback/widget/ControlButtonPresenterSelector$ActionViewHolder",
+      "android/support/v17/leanback/widget/ControlButtonPresenterSelector$ControlButtonPresenter": "androidx/leanback/widget/ControlButtonPresenterSelector$ControlButtonPresenter",
+      "android/support/v17/leanback/widget/CursorObjectAdapter": "androidx/leanback/widget/CursorObjectAdapter",
+      "android/support/v17/leanback/widget/DetailsOverviewLogoPresenter$ViewHolder": "androidx/leanback/widget/DetailsOverviewLogoPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/DetailsOverviewLogoPresenter": "androidx/leanback/widget/DetailsOverviewLogoPresenter",
+      "android/support/v17/leanback/widget/DetailsOverviewRow": "androidx/leanback/widget/DetailsOverviewRow",
+      "android/support/v17/leanback/widget/DetailsOverviewRow$Listener": "androidx/leanback/widget/DetailsOverviewRow$Listener",
+      "android/support/v17/leanback/widget/HeaderItem": "androidx/leanback/widget/HeaderItem",
+      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter$1": "androidx/leanback/widget/DetailsOverviewRowPresenter$1",
+      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter": "androidx/leanback/widget/DetailsOverviewRowPresenter",
+      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter$ViewHolder": "androidx/leanback/widget/DetailsOverviewRowPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter$ActionsItemBridgeAdapter$1": "androidx/leanback/widget/DetailsOverviewRowPresenter$ActionsItemBridgeAdapter$1",
+      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter$ActionsItemBridgeAdapter": "androidx/leanback/widget/DetailsOverviewRowPresenter$ActionsItemBridgeAdapter",
+      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter$ViewHolder$1": "androidx/leanback/widget/DetailsOverviewRowPresenter$ViewHolder$1",
+      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter$ViewHolder$2": "androidx/leanback/widget/DetailsOverviewRowPresenter$ViewHolder$2",
+      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter$ViewHolder$3": "androidx/leanback/widget/DetailsOverviewRowPresenter$ViewHolder$3",
+      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter$ViewHolder$4": "androidx/leanback/widget/DetailsOverviewRowPresenter$ViewHolder$4",
+      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter$ViewHolder$5": "androidx/leanback/widget/DetailsOverviewRowPresenter$ViewHolder$5",
+      "android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper": "androidx/leanback/widget/DetailsOverviewSharedElementHelper",
+      "android/support/v17/leanback/widget/RoundedRectHelper": "androidx/leanback/widget/RoundedRectHelper",
+      "android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper$1": "androidx/leanback/widget/DetailsOverviewSharedElementHelper$1",
+      "android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper$2$1": "androidx/leanback/widget/DetailsOverviewSharedElementHelper$2$1",
+      "android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper$2": "androidx/leanback/widget/DetailsOverviewSharedElementHelper$2",
+      "android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper$TransitionTimeOutRunnable": "androidx/leanback/widget/DetailsOverviewSharedElementHelper$TransitionTimeOutRunnable",
+      "android/support/v4/app/SharedElementCallback": "androidx/app/SharedElementCallback",
+      "android/support/v17/leanback/widget/RecyclerViewParallax": "androidx/leanback/widget/RecyclerViewParallax",
+      "android/support/v17/leanback/widget/RecyclerViewParallax$ChildPositionProperty": "androidx/leanback/widget/RecyclerViewParallax$ChildPositionProperty",
+      "android/support/v17/leanback/widget/FacetProvider": "androidx/leanback/widget/FacetProvider",
+      "android/support/v17/leanback/widget/FacetProviderAdapter": "androidx/leanback/widget/FacetProviderAdapter",
+      "android/support/v17/leanback/widget/FocusHighlight": "androidx/leanback/widget/FocusHighlight",
+      "android/support/v17/leanback/widget/FocusHighlightHandler": "androidx/leanback/widget/FocusHighlightHandler",
+      "android/support/v17/leanback/widget/FocusHighlightHelper$BrowseItemFocusHighlight": "androidx/leanback/widget/FocusHighlightHelper$BrowseItemFocusHighlight",
+      "android/support/v17/leanback/widget/FocusHighlightHelper$FocusAnimator": "androidx/leanback/widget/FocusHighlightHelper$FocusAnimator",
+      "android/support/v17/leanback/widget/ShadowOverlayHelper": "androidx/leanback/widget/ShadowOverlayHelper",
+      "android/support/v17/leanback/widget/FocusHighlightHelper$HeaderItemFocusHighlight$HeaderFocusAnimator": "androidx/leanback/widget/FocusHighlightHelper$HeaderItemFocusHighlight$HeaderFocusAnimator",
+      "android/support/v17/leanback/widget/FocusHighlightHelper$HeaderItemFocusHighlight": "androidx/leanback/widget/FocusHighlightHelper$HeaderItemFocusHighlight",
+      "android/support/v17/leanback/widget/ForegroundHelper": "androidx/leanback/widget/ForegroundHelper",
+      "android/support/v17/leanback/widget/FragmentAnimationProvider": "androidx/leanback/widget/FragmentAnimationProvider",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$1": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$1",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$ActionsItemBridgeAdapter$1": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$ActionsItemBridgeAdapter$1",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$ActionsItemBridgeAdapter": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$ActionsItemBridgeAdapter",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$Listener": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$Listener",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder$1": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder$1",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder$2": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder$2",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder$3": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder$3",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder$4": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder$4",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder$DetailsOverviewRowListener": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder$DetailsOverviewRowListener",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewSharedElementHelper$1$1": "androidx/leanback/widget/FullWidthDetailsOverviewSharedElementHelper$1$1",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewSharedElementHelper$1": "androidx/leanback/widget/FullWidthDetailsOverviewSharedElementHelper$1",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewSharedElementHelper": "androidx/leanback/widget/FullWidthDetailsOverviewSharedElementHelper",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewSharedElementHelper$2": "androidx/leanback/widget/FullWidthDetailsOverviewSharedElementHelper$2",
+      "android/support/v17/leanback/widget/FullWidthDetailsOverviewSharedElementHelper$TransitionTimeOutRunnable": "androidx/leanback/widget/FullWidthDetailsOverviewSharedElementHelper$TransitionTimeOutRunnable",
+      "android/support/v17/leanback/widget/Grid$Location": "androidx/leanback/widget/Grid$Location",
+      "android/support/v17/leanback/widget/Grid": "androidx/leanback/widget/Grid",
+      "android/support/v17/leanback/widget/Grid$Provider": "androidx/leanback/widget/Grid$Provider",
+      "android/support/v7/widget/RecyclerView$LayoutManager$LayoutPrefetchRegistry": "androidx/widget/recyclerview/RecyclerView$LayoutManager$LayoutPrefetchRegistry",
+      "android/support/v4/util/CircularIntArray": "androidx/util/CircularIntArray",
+      "android/support/v17/leanback/widget/SingleRow": "androidx/leanback/widget/SingleRow",
+      "android/support/v17/leanback/widget/StaggeredGridDefault": "androidx/leanback/widget/StaggeredGridDefault",
+      "android/support/v17/leanback/widget/GridLayoutManager$1": "androidx/leanback/widget/GridLayoutManager$1",
+      "android/support/v17/leanback/widget/GridLayoutManager$2": "androidx/leanback/widget/GridLayoutManager$2",
+      "android/support/v17/leanback/widget/GridLayoutManager$LayoutParams": "androidx/leanback/widget/GridLayoutManager$LayoutParams",
+      "android/support/v7/widget/RecyclerView$State": "androidx/widget/recyclerview/RecyclerView$State",
+      "android/support/v17/leanback/widget/GridLayoutManager$PendingMoveSmoothScroller": "androidx/leanback/widget/GridLayoutManager$PendingMoveSmoothScroller",
+      "android/support/v7/widget/RecyclerView$Recycler": "androidx/widget/recyclerview/RecyclerView$Recycler",
+      "android/support/v17/leanback/widget/GridLayoutManager$3": "androidx/leanback/widget/GridLayoutManager$3",
+      "android/support/v17/leanback/widget/GridLayoutManager$4": "androidx/leanback/widget/GridLayoutManager$4",
+      "android/support/v17/leanback/widget/GridLayoutManager$GridLinearSmoothScroller": "androidx/leanback/widget/GridLayoutManager$GridLinearSmoothScroller",
+      "android/support/v7/widget/LinearSmoothScroller": "androidx/widget/recyclerview/LinearSmoothScroller",
+      "android/support/v7/widget/RecyclerView$SmoothScroller": "androidx/widget/recyclerview/RecyclerView$SmoothScroller",
+      "android/support/v7/widget/RecyclerView$SmoothScroller$Action": "androidx/widget/recyclerview/RecyclerView$SmoothScroller$Action",
+      "android/support/v7/widget/RecyclerView$LayoutParams": "androidx/widget/recyclerview/RecyclerView$LayoutParams",
+      "android/support/v17/leanback/widget/ItemAlignmentFacetHelper": "androidx/leanback/widget/ItemAlignmentFacetHelper",
+      "android/support/v17/leanback/widget/GridLayoutManager$OnLayoutCompleteListener": "androidx/leanback/widget/GridLayoutManager$OnLayoutCompleteListener",
+      "android/support/v17/leanback/widget/GridLayoutManager$SavedState$1": "androidx/leanback/widget/GridLayoutManager$SavedState$1",
+      "android/support/v17/leanback/widget/GridLayoutManager$SavedState": "androidx/leanback/widget/GridLayoutManager$SavedState",
+      "android/support/v4/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat": "androidx/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat",
+      "android/support/v4/view/accessibility/AccessibilityNodeInfoCompat": "androidx/view/accessibility/AccessibilityNodeInfoCompat",
+      "android/support/v4/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat": "androidx/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat",
+      "android/support/v17/leanback/widget/ItemAlignment$Axis": "androidx/leanback/widget/ItemAlignment$Axis",
+      "android/support/v17/leanback/widget/ItemAlignment": "androidx/leanback/widget/ItemAlignment",
+      "android/support/v4/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat": "androidx/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat",
+      "android/support/v7/widget/OrientationHelper": "androidx/widget/recyclerview/OrientationHelper",
+      "android/support/v17/leanback/widget/GuidanceStylingRelativeLayout": "androidx/leanback/widget/GuidanceStylingRelativeLayout",
+      "android/support/v17/leanback/widget/GuidedAction$Builder": "androidx/leanback/widget/GuidedAction$Builder",
+      "android/support/v17/leanback/widget/GuidedAction$BuilderBase": "androidx/leanback/widget/GuidedAction$BuilderBase",
+      "android/support/annotation/StringRes": "androidx/annotation/StringRes",
+      "android/support/annotation/DrawableRes": "androidx/annotation/DrawableRes",
+      "android/support/v17/leanback/widget/GuidedActionAdapter$1": "androidx/leanback/widget/GuidedActionAdapter$1",
+      "android/support/v17/leanback/widget/GuidedActionsStylist$ViewHolder": "androidx/leanback/widget/GuidedActionsStylist$ViewHolder",
+      "android/support/v17/leanback/widget/GuidedActionAdapter$2": "androidx/leanback/widget/GuidedActionAdapter$2",
+      "android/support/v17/leanback/widget/GuidedActionAdapter$ActionEditListener": "androidx/leanback/widget/GuidedActionAdapter$ActionEditListener",
+      "android/support/v17/leanback/widget/ImeKeyMonitor$ImeKeyListener": "androidx/leanback/widget/ImeKeyMonitor$ImeKeyListener",
+      "android/support/v17/leanback/widget/ImeKeyMonitor": "androidx/leanback/widget/ImeKeyMonitor",
+      "android/support/v17/leanback/widget/GuidedActionAdapter$ActionOnFocusListener": "androidx/leanback/widget/GuidedActionAdapter$ActionOnFocusListener",
+      "android/support/v17/leanback/widget/GuidedActionAdapter$ActionOnKeyListener": "androidx/leanback/widget/GuidedActionAdapter$ActionOnKeyListener",
+      "android/support/v17/leanback/widget/GuidedActionDiffCallback": "androidx/leanback/widget/GuidedActionDiffCallback",
+      "android/support/v17/leanback/widget/GuidedActionEditText$NoPaddingDrawable": "androidx/leanback/widget/GuidedActionEditText$NoPaddingDrawable",
+      "android/support/v17/leanback/widget/GuidedActionEditText": "androidx/leanback/widget/GuidedActionEditText",
+      "android/support/v17/leanback/widget/GuidedActionItemContainer": "androidx/leanback/widget/GuidedActionItemContainer",
+      "android/support/v17/leanback/widget/NonOverlappingLinearLayoutWithForeground": "androidx/leanback/widget/NonOverlappingLinearLayoutWithForeground",
+      "android/support/v17/leanback/widget/GuidedActionsRelativeLayout$InterceptKeyEventListener": "androidx/leanback/widget/GuidedActionsRelativeLayout$InterceptKeyEventListener",
+      "android/support/v17/leanback/widget/GuidedActionsRelativeLayout": "androidx/leanback/widget/GuidedActionsRelativeLayout",
+      "android/support/v17/leanback/widget/GuidedActionsStylist$1": "androidx/leanback/widget/GuidedActionsStylist$1",
+      "android/support/v17/leanback/widget/GuidedActionsStylist$2": "androidx/leanback/widget/GuidedActionsStylist$2",
+      "android/support/v17/leanback/widget/GuidedActionsStylist$3": "androidx/leanback/widget/GuidedActionsStylist$3",
+      "android/support/v17/leanback/widget/GuidedActionsStylist$4": "androidx/leanback/widget/GuidedActionsStylist$4",
+      "android/support/v17/leanback/widget/GuidedActionsStylist$5": "androidx/leanback/widget/GuidedActionsStylist$5",
+      "android/support/v17/leanback/widget/GuidedActionsStylist$6": "androidx/leanback/widget/GuidedActionsStylist$6",
+      "android/support/v17/leanback/widget/GuidedActionsStylist$7": "androidx/leanback/widget/GuidedActionsStylist$7",
+      "android/support/v17/leanback/widget/GuidedActionsStylist$ViewHolder$1": "androidx/leanback/widget/GuidedActionsStylist$ViewHolder$1",
+      "android/support/v17/leanback/widget/GuidedActionsStylist$ViewHolder$2": "androidx/leanback/widget/GuidedActionsStylist$ViewHolder$2",
+      "android/support/v17/leanback/widget/GuidedDatePickerAction": "androidx/leanback/widget/GuidedDatePickerAction",
+      "android/support/v17/leanback/widget/picker/DatePicker": "androidx/leanback/widget/picker/DatePicker",
+      "android/support/v17/leanback/widget/GuidedDatePickerAction$Builder": "androidx/leanback/widget/GuidedDatePickerAction$Builder",
+      "android/support/v17/leanback/widget/GuidedDatePickerAction$BuilderBase": "androidx/leanback/widget/GuidedDatePickerAction$BuilderBase",
+      "android/support/v17/leanback/widget/HorizontalHoverCardSwitcher": "androidx/leanback/widget/HorizontalHoverCardSwitcher",
+      "android/support/v17/leanback/widget/PresenterSwitcher": "androidx/leanback/widget/PresenterSwitcher",
+      "android/support/v17/leanback/widget/ImageCardView": "androidx/leanback/widget/ImageCardView",
+      "android/support/v17/leanback/R$style": "androidx/leanback/R$style",
+      "android/support/v17/leanback/widget/ItemBridgeAdapter$1": "androidx/leanback/widget/ItemBridgeAdapter$1",
+      "android/support/v17/leanback/widget/ItemBridgeAdapter$OnFocusChangeListener": "androidx/leanback/widget/ItemBridgeAdapter$OnFocusChangeListener",
+      "android/support/v17/leanback/widget/ItemBridgeAdapterShadowOverlayWrapper": "androidx/leanback/widget/ItemBridgeAdapterShadowOverlayWrapper",
+      "android/support/v17/leanback/widget/ListRowHoverCardView": "androidx/leanback/widget/ListRowHoverCardView",
+      "android/support/v17/leanback/widget/ListRowPresenter$1": "androidx/leanback/widget/ListRowPresenter$1",
+      "android/support/v17/leanback/widget/ListRowPresenter$2": "androidx/leanback/widget/ListRowPresenter$2",
+      "android/support/v17/leanback/widget/ListRowPresenter$ListRowPresenterItemBridgeAdapter$1": "androidx/leanback/widget/ListRowPresenter$ListRowPresenterItemBridgeAdapter$1",
+      "android/support/v17/leanback/widget/ListRowPresenter$ListRowPresenterItemBridgeAdapter": "androidx/leanback/widget/ListRowPresenter$ListRowPresenterItemBridgeAdapter",
+      "android/support/v17/leanback/widget/ListRowPresenter$SelectItemViewHolderTask$1": "androidx/leanback/widget/ListRowPresenter$SelectItemViewHolderTask$1",
+      "android/support/v17/leanback/widget/ListRowPresenter$SelectItemViewHolderTask": "androidx/leanback/widget/ListRowPresenter$SelectItemViewHolderTask",
+      "android/support/v17/leanback/widget/ShadowOverlayHelper$Options": "androidx/leanback/widget/ShadowOverlayHelper$Options",
+      "android/support/v17/leanback/widget/ShadowOverlayHelper$Builder": "androidx/leanback/widget/ShadowOverlayHelper$Builder",
+      "android/support/v17/leanback/widget/ListRowView": "androidx/leanback/widget/ListRowView",
+      "android/support/v17/leanback/widget/MediaItemActionPresenter$ViewHolder": "androidx/leanback/widget/MediaItemActionPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/MediaNowPlayingView": "androidx/leanback/widget/MediaNowPlayingView",
+      "android/support/v17/leanback/widget/MediaRowFocusView": "androidx/leanback/widget/MediaRowFocusView",
+      "android/support/v17/leanback/widget/NonOverlappingFrameLayout": "androidx/leanback/widget/NonOverlappingFrameLayout",
+      "android/support/v17/leanback/widget/NonOverlappingRelativeLayout": "androidx/leanback/widget/NonOverlappingRelativeLayout",
+      "android/support/v17/leanback/widget/NonOverlappingView": "androidx/leanback/widget/NonOverlappingView",
+      "android/support/v17/leanback/widget/ObjectAdapter$DataObservable": "androidx/leanback/widget/ObjectAdapter$DataObservable",
+      "android/support/v17/leanback/widget/SinglePresenterSelector": "androidx/leanback/widget/SinglePresenterSelector",
+      "android/support/v17/leanback/widget/PagingIndicator$1": "androidx/leanback/widget/PagingIndicator$1",
+      "android/support/v17/leanback/widget/PagingIndicator$Dot": "androidx/leanback/widget/PagingIndicator$Dot",
+      "android/support/v17/leanback/widget/PagingIndicator$2": "androidx/leanback/widget/PagingIndicator$2",
+      "android/support/v17/leanback/widget/PagingIndicator$3": "androidx/leanback/widget/PagingIndicator$3",
+      "android/support/v17/leanback/widget/Parallax$FloatProperty": "androidx/leanback/widget/Parallax$FloatProperty",
+      "android/support/v17/leanback/widget/Parallax$FloatPropertyMarkerValue": "androidx/leanback/widget/Parallax$FloatPropertyMarkerValue",
+      "android/support/v17/leanback/widget/Parallax$IntPropertyMarkerValue": "androidx/leanback/widget/Parallax$IntPropertyMarkerValue",
+      "android/support/v17/leanback/widget/ParallaxEffect$IntEffect": "androidx/leanback/widget/ParallaxEffect$IntEffect",
+      "android/support/v17/leanback/widget/ParallaxEffect$FloatEffect": "androidx/leanback/widget/ParallaxEffect$FloatEffect",
+      "android/support/v17/leanback/widget/ParallaxTarget$DirectPropertyTarget": "androidx/leanback/widget/ParallaxTarget$DirectPropertyTarget",
+      "android/support/v17/leanback/widget/PersistentFocusWrapper$SavedState$1": "androidx/leanback/widget/PersistentFocusWrapper$SavedState$1",
+      "android/support/v17/leanback/widget/PersistentFocusWrapper$SavedState": "androidx/leanback/widget/PersistentFocusWrapper$SavedState",
+      "android/support/v17/leanback/widget/PersistentFocusWrapper": "androidx/leanback/widget/PersistentFocusWrapper",
+      "android/support/v17/leanback/widget/PlaybackControlsPresenter$BoundData": "androidx/leanback/widget/PlaybackControlsPresenter$BoundData",
+      "android/support/v17/leanback/widget/PlaybackControlsPresenter": "androidx/leanback/widget/PlaybackControlsPresenter",
+      "android/support/v17/leanback/widget/PlaybackControlsPresenter$ViewHolder$1": "androidx/leanback/widget/PlaybackControlsPresenter$ViewHolder$1",
+      "android/support/v17/leanback/widget/PlaybackControlsPresenter$ViewHolder": "androidx/leanback/widget/PlaybackControlsPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/PlaybackControlsPresenter$ViewHolder$2": "androidx/leanback/widget/PlaybackControlsPresenter$ViewHolder$2",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$MoreActions": "androidx/leanback/widget/PlaybackControlsRow$MoreActions",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$ClosedCaptioningAction": "androidx/leanback/widget/PlaybackControlsRow$ClosedCaptioningAction",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$MultiAction": "androidx/leanback/widget/PlaybackControlsRow$MultiAction",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$HighQualityAction": "androidx/leanback/widget/PlaybackControlsRow$HighQualityAction",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$OnPlaybackProgressCallback": "androidx/leanback/widget/PlaybackControlsRow$OnPlaybackProgressCallback",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$PictureInPictureAction": "androidx/leanback/widget/PlaybackControlsRow$PictureInPictureAction",
+      "android/support/v17/leanback/widget/PlaybackControlsRow$ShuffleAction": "androidx/leanback/widget/PlaybackControlsRow$ShuffleAction",
+      "android/support/v17/leanback/widget/PlaybackControlsRowPresenter$1": "androidx/leanback/widget/PlaybackControlsRowPresenter$1",
+      "android/support/v17/leanback/widget/PlaybackControlsRowPresenter$ViewHolder": "androidx/leanback/widget/PlaybackControlsRowPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/PlaybackControlsRowPresenter$BoundData": "androidx/leanback/widget/PlaybackControlsRowPresenter$BoundData",
+      "android/support/v17/leanback/widget/PlaybackControlsRowPresenter$2": "androidx/leanback/widget/PlaybackControlsRowPresenter$2",
+      "android/support/v17/leanback/widget/PlaybackControlsRowPresenter$3": "androidx/leanback/widget/PlaybackControlsRowPresenter$3",
+      "android/support/v17/leanback/widget/PlaybackControlsRowView$OnUnhandledKeyListener": "androidx/leanback/widget/PlaybackControlsRowView$OnUnhandledKeyListener",
+      "android/support/v17/leanback/widget/PlaybackControlsRowView": "androidx/leanback/widget/PlaybackControlsRowView",
+      "android/support/v17/leanback/widget/PlaybackControlsRowPresenter$ViewHolder$1": "androidx/leanback/widget/PlaybackControlsRowPresenter$ViewHolder$1",
+      "android/support/v17/leanback/widget/ShadowHelper": "androidx/leanback/widget/ShadowHelper",
+      "android/support/v17/leanback/widget/PlaybackSeekDataProvider$ResultCallback": "androidx/leanback/widget/PlaybackSeekDataProvider$ResultCallback",
+      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter$1": "androidx/leanback/widget/PlaybackTransportRowPresenter$1",
+      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter$ViewHolder": "androidx/leanback/widget/PlaybackTransportRowPresenter$ViewHolder",
+      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter$BoundData": "androidx/leanback/widget/PlaybackTransportRowPresenter$BoundData",
+      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter$2": "androidx/leanback/widget/PlaybackTransportRowPresenter$2",
+      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter$3": "androidx/leanback/widget/PlaybackTransportRowPresenter$3",
+      "android/support/v17/leanback/widget/PlaybackTransportRowView$OnUnhandledKeyListener": "androidx/leanback/widget/PlaybackTransportRowView$OnUnhandledKeyListener",
+      "android/support/v17/leanback/widget/PlaybackTransportRowView": "androidx/leanback/widget/PlaybackTransportRowView",
+      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter$ViewHolder$1": "androidx/leanback/widget/PlaybackTransportRowPresenter$ViewHolder$1",
+      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter$ViewHolder$2": "androidx/leanback/widget/PlaybackTransportRowPresenter$ViewHolder$2",
+      "android/support/v17/leanback/widget/ThumbsBar": "androidx/leanback/widget/ThumbsBar",
+      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter$ViewHolder$3": "androidx/leanback/widget/PlaybackTransportRowPresenter$ViewHolder$3",
+      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter$ViewHolder$4": "androidx/leanback/widget/PlaybackTransportRowPresenter$ViewHolder$4",
+      "android/support/v17/leanback/widget/SeekBar": "androidx/leanback/widget/SeekBar",
+      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter$ViewHolder$5": "androidx/leanback/widget/PlaybackTransportRowPresenter$ViewHolder$5",
+      "android/support/v17/leanback/widget/SeekBar$AccessibilitySeekListener": "androidx/leanback/widget/SeekBar$AccessibilitySeekListener",
+      "android/support/v17/leanback/widget/RecyclerViewParallax$1": "androidx/leanback/widget/RecyclerViewParallax$1",
+      "android/support/v17/leanback/widget/RecyclerViewParallax$2": "androidx/leanback/widget/RecyclerViewParallax$2",
+      "android/support/v7/widget/RecyclerView$LayoutManager$Properties": "androidx/widget/recyclerview/RecyclerView$LayoutManager$Properties",
+      "android/support/v17/leanback/widget/ResizingTextView": "androidx/leanback/widget/ResizingTextView",
+      "android/support/v17/leanback/widget/RoundedRectHelper$Api21Impl": "androidx/leanback/widget/RoundedRectHelper$Api21Impl",
+      "android/support/v17/leanback/widget/RoundedRectHelper$Impl": "androidx/leanback/widget/RoundedRectHelper$Impl",
+      "android/support/v17/leanback/widget/RoundedRectHelperApi21": "androidx/leanback/widget/RoundedRectHelperApi21",
+      "android/support/v17/leanback/widget/RoundedRectHelper$StubImpl": "androidx/leanback/widget/RoundedRectHelper$StubImpl",
+      "android/support/v17/leanback/widget/RoundedRectHelperApi21$RoundedRectOutlineProvider": "androidx/leanback/widget/RoundedRectHelperApi21$RoundedRectOutlineProvider",
+      "android/support/v17/leanback/widget/RowContainerView": "androidx/leanback/widget/RowContainerView",
+      "android/support/v17/leanback/widget/RowHeaderView": "androidx/leanback/widget/RowHeaderView",
+      "android/support/v17/leanback/widget/RowPresenter$ContainerViewHolder": "androidx/leanback/widget/RowPresenter$ContainerViewHolder",
+      "android/support/v17/leanback/widget/SearchBar$1": "androidx/leanback/widget/SearchBar$1",
+      "android/support/v17/leanback/widget/SearchBar$10": "androidx/leanback/widget/SearchBar$10",
+      "android/support/v17/leanback/widget/SearchBar$2": "androidx/leanback/widget/SearchBar$2",
+      "android/support/v17/leanback/widget/SearchEditText": "androidx/leanback/widget/SearchEditText",
+      "android/support/v17/leanback/widget/SearchBar$3": "androidx/leanback/widget/SearchBar$3",
+      "android/support/v17/leanback/widget/SearchBar$4": "androidx/leanback/widget/SearchBar$4",
+      "android/support/v17/leanback/widget/SearchEditText$OnKeyboardDismissListener": "androidx/leanback/widget/SearchEditText$OnKeyboardDismissListener",
+      "android/support/v17/leanback/widget/SearchBar$5$1": "androidx/leanback/widget/SearchBar$5$1",
+      "android/support/v17/leanback/widget/SearchBar$5": "androidx/leanback/widget/SearchBar$5",
+      "android/support/v17/leanback/widget/SearchBar$5$2": "androidx/leanback/widget/SearchBar$5$2",
+      "android/support/v17/leanback/widget/SearchBar$5$3": "androidx/leanback/widget/SearchBar$5$3",
+      "android/support/v17/leanback/widget/SpeechOrbView": "androidx/leanback/widget/SpeechOrbView",
+      "android/support/v17/leanback/widget/SearchBar$6": "androidx/leanback/widget/SearchBar$6",
+      "android/support/v17/leanback/widget/SearchBar$7": "androidx/leanback/widget/SearchBar$7",
+      "android/support/v17/leanback/widget/SearchBar$8": "androidx/leanback/widget/SearchBar$8",
+      "android/support/v17/leanback/widget/SearchBar$9": "androidx/leanback/widget/SearchBar$9",
+      "android/support/v17/leanback/R$raw": "androidx/leanback/R$raw",
+      "android/support/v17/leanback/widget/StreamingTextView": "androidx/leanback/widget/StreamingTextView",
+      "android/support/v17/leanback/widget/SearchOrbView$1": "androidx/leanback/widget/SearchOrbView$1",
+      "android/support/v17/leanback/widget/SearchOrbView$2": "androidx/leanback/widget/SearchOrbView$2",
+      "android/support/v17/leanback/widget/ShadowHelper$ShadowHelperApi21Impl": "androidx/leanback/widget/ShadowHelper$ShadowHelperApi21Impl",
+      "android/support/v17/leanback/widget/ShadowHelper$ShadowHelperVersionImpl": "androidx/leanback/widget/ShadowHelper$ShadowHelperVersionImpl",
+      "android/support/v17/leanback/widget/ShadowHelperApi21": "androidx/leanback/widget/ShadowHelperApi21",
+      "android/support/v17/leanback/widget/ShadowHelper$ShadowHelperStubImpl": "androidx/leanback/widget/ShadowHelper$ShadowHelperStubImpl",
+      "android/support/v17/leanback/widget/ShadowHelperApi21$1": "androidx/leanback/widget/ShadowHelperApi21$1",
+      "android/support/v17/leanback/widget/ShadowHelperApi21$ShadowImpl": "androidx/leanback/widget/ShadowHelperApi21$ShadowImpl",
+      "android/support/v17/leanback/widget/ShadowHelperJbmr2$ShadowImpl": "androidx/leanback/widget/ShadowHelperJbmr2$ShadowImpl",
+      "android/support/v17/leanback/widget/ShadowHelperJbmr2": "androidx/leanback/widget/ShadowHelperJbmr2",
+      "android/support/v17/leanback/widget/StaticShadowHelper": "androidx/leanback/widget/StaticShadowHelper",
+      "android/support/v17/leanback/widget/StaggeredGrid$Location": "androidx/leanback/widget/StaggeredGrid$Location",
+      "android/support/v17/leanback/widget/StaggeredGrid": "androidx/leanback/widget/StaggeredGrid",
+      "android/support/v4/util/CircularArray": "androidx/util/CircularArray",
+      "android/support/v17/leanback/widget/StaticShadowHelper$ShadowHelperJbmr2Impl": "androidx/leanback/widget/StaticShadowHelper$ShadowHelperJbmr2Impl",
+      "android/support/v17/leanback/widget/StaticShadowHelper$ShadowHelperVersionImpl": "androidx/leanback/widget/StaticShadowHelper$ShadowHelperVersionImpl",
+      "android/support/v17/leanback/widget/StaticShadowHelper$ShadowHelperStubImpl": "androidx/leanback/widget/StaticShadowHelper$ShadowHelperStubImpl",
+      "android/support/v17/leanback/widget/StreamingTextView$1": "androidx/leanback/widget/StreamingTextView$1",
+      "android/support/v17/leanback/widget/StreamingTextView$DottySpan": "androidx/leanback/widget/StreamingTextView$DottySpan",
+      "android/support/v17/leanback/widget/TitleHelper$1": "androidx/leanback/widget/TitleHelper$1",
+      "android/support/v17/leanback/widget/TitleHelper$2": "androidx/leanback/widget/TitleHelper$2",
+      "android/support/v17/leanback/widget/TitleHelper$3": "androidx/leanback/widget/TitleHelper$3",
+      "android/support/v17/leanback/widget/TitleView$1": "androidx/leanback/widget/TitleView$1",
+      "android/support/v17/leanback/widget/TitleView": "androidx/leanback/widget/TitleView",
+      "android/support/v17/leanback/widget/VerticalGridPresenter$1": "androidx/leanback/widget/VerticalGridPresenter$1",
+      "android/support/v17/leanback/widget/VerticalGridPresenter$VerticalGridItemBridgeAdapter$1": "androidx/leanback/widget/VerticalGridPresenter$VerticalGridItemBridgeAdapter$1",
+      "android/support/v17/leanback/widget/VerticalGridPresenter$VerticalGridItemBridgeAdapter": "androidx/leanback/widget/VerticalGridPresenter$VerticalGridItemBridgeAdapter",
+      "android/support/v17/leanback/widget/VideoSurfaceView": "androidx/leanback/widget/VideoSurfaceView",
+      "android/support/v4/util/LruCache": "androidx/util/LruCache",
+      "android/support/v17/leanback/widget/Visibility": "androidx/leanback/widget/Visibility",
+      "android/support/v17/leanback/widget/picker/DatePicker$1": "androidx/leanback/widget/picker/DatePicker$1",
+      "android/support/v17/leanback/widget/picker/Picker": "androidx/leanback/widget/picker/Picker",
+      "android/support/v17/leanback/widget/picker/PickerUtility$DateConstant": "androidx/leanback/widget/picker/PickerUtility$DateConstant",
+      "android/support/v17/leanback/widget/picker/PickerUtility": "androidx/leanback/widget/picker/PickerUtility",
+      "android/support/v17/leanback/widget/picker/PickerColumn": "androidx/leanback/widget/picker/PickerColumn",
+      "android/support/v17/leanback/widget/picker/Picker$1": "androidx/leanback/widget/picker/Picker$1",
+      "android/support/v17/leanback/widget/picker/Picker$PickerScrollArrayAdapter": "androidx/leanback/widget/picker/Picker$PickerScrollArrayAdapter",
+      "android/support/v17/leanback/widget/picker/Picker$ViewHolder": "androidx/leanback/widget/picker/Picker$ViewHolder",
+      "android/support/v17/leanback/widget/picker/Picker$PickerValueListener": "androidx/leanback/widget/picker/Picker$PickerValueListener",
+      "android/support/v17/leanback/widget/picker/PickerUtility$1": "androidx/leanback/widget/picker/PickerUtility$1",
+      "android/support/v17/leanback/widget/picker/PickerUtility$TimeConstant": "androidx/leanback/widget/picker/PickerUtility$TimeConstant",
+      "android/support/v17/leanback/widget/picker/TimePicker": "androidx/leanback/widget/picker/TimePicker",
+      "android/support/annotation/IntRange": "androidx/annotation/IntRange",
+      "android/support/graphics/drawable/Animatable2Compat$AnimationCallback$1": "androidx/graphics/drawable/Animatable2Compat$AnimationCallback$1",
+      "android/support/graphics/drawable/Animatable2Compat$AnimationCallback": "androidx/graphics/drawable/Animatable2Compat$AnimationCallback",
+      "android/support/graphics/drawable/Animatable2Compat": "androidx/graphics/drawable/Animatable2Compat",
+      "android/support/graphics/drawable/AnimatedVectorDrawableCompat$1": "androidx/graphics/drawable/AnimatedVectorDrawableCompat$1",
+      "android/support/graphics/drawable/AnimatedVectorDrawableCompat": "androidx/graphics/drawable/AnimatedVectorDrawableCompat",
+      "android/support/graphics/drawable/AnimatedVectorDrawableCompat$2": "androidx/graphics/drawable/AnimatedVectorDrawableCompat$2",
+      "android/support/graphics/drawable/AnimatedVectorDrawableCompat$AnimatedVectorDrawableCompatState": "androidx/graphics/drawable/AnimatedVectorDrawableCompat$AnimatedVectorDrawableCompatState",
+      "android/support/graphics/drawable/VectorDrawableCompat": "androidx/graphics/drawable/VectorDrawableCompat",
+      "android/support/v4/util/ArrayMap": "androidx/util/ArrayMap",
+      "android/support/graphics/drawable/AnimatedVectorDrawableCompat$AnimatedVectorDrawableDelegateState": "androidx/graphics/drawable/AnimatedVectorDrawableCompat$AnimatedVectorDrawableDelegateState",
+      "android/support/graphics/drawable/VectorDrawableCommon": "androidx/graphics/drawable/VectorDrawableCommon",
+      "android/support/v4/content/res/ResourcesCompat": "androidx/content/res/ResourcesCompat",
+      "android/support/graphics/drawable/AndroidResources": "androidx/graphics/drawable/AndroidResources",
+      "android/support/v4/content/res/TypedArrayUtils": "androidx/content/res/TypedArrayUtils",
+      "android/support/graphics/drawable/AnimatorInflaterCompat": "androidx/graphics/drawable/AnimatorInflaterCompat",
+      "android/support/graphics/drawable/AnimationUtilsCompat": "androidx/graphics/drawable/AnimationUtilsCompat",
+      "android/support/v4/view/animation/FastOutSlowInInterpolator": "androidx/view/animation/FastOutSlowInInterpolator",
+      "android/support/v4/view/animation/LinearOutSlowInInterpolator": "androidx/view/animation/LinearOutSlowInInterpolator",
+      "android/support/graphics/drawable/PathInterpolatorCompat": "androidx/graphics/drawable/PathInterpolatorCompat",
+      "android/support/graphics/drawable/AnimatorInflaterCompat$1": "androidx/graphics/drawable/AnimatorInflaterCompat$1",
+      "android/support/graphics/drawable/AnimatorInflaterCompat$PathDataEvaluator": "androidx/graphics/drawable/AnimatorInflaterCompat$PathDataEvaluator",
+      "android/support/v4/graphics/PathParser$PathDataNode": "androidx/graphics/PathParser$PathDataNode",
+      "android/support/v4/graphics/PathParser": "androidx/graphics/PathParser",
+      "android/support/annotation/AnimatorRes": "androidx/annotation/AnimatorRes",
+      "android/support/graphics/drawable/ArgbEvaluator": "androidx/graphics/drawable/ArgbEvaluator",
+      "android/support/v14/preference/EditTextPreferenceDialogFragment": "androidx/preference/EditTextPreferenceDialogFragment",
+      "android/support/v14/preference/PreferenceDialogFragment": "androidx/preference/PreferenceDialogFragment",
+      "android/support/v7/preference/EditTextPreference": "androidx/preference/EditTextPreference",
+      "android/support/v7/preference/DialogPreference": "androidx/preference/DialogPreference",
+      "android/support/v14/preference/ListPreferenceDialogFragment$1": "androidx/preference/ListPreferenceDialogFragment$1",
+      "android/support/v14/preference/ListPreferenceDialogFragment": "androidx/preference/ListPreferenceDialogFragment",
+      "android/support/v7/preference/ListPreference": "androidx/preference/ListPreference",
+      "android/support/v14/preference/MultiSelectListPreference$SavedState$1": "androidx/preference/MultiSelectListPreference$SavedState$1",
+      "android/support/v14/preference/MultiSelectListPreference$SavedState": "androidx/preference/MultiSelectListPreference$SavedState",
+      "android/support/v14/preference/MultiSelectListPreference": "androidx/preference/MultiSelectListPreference",
+      "android/support/v7/preference/Preference$BaseSavedState": "androidx/preference/Preference$BaseSavedState",
+      "android/support/v7/preference/Preference": "androidx/preference/Preference",
+      "android/support/v7/preference/internal/AbstractMultiSelectListPreference": "androidx/preference/internal/AbstractMultiSelectListPreference",
+      "android/support/v7/preference/R$styleable": "androidx/preference/R$styleable",
+      "android/support/v7/preference/R": "androidx/preference/R",
+      "android/support/v7/preference/R$attr": "androidx/preference/R$attr",
+      "android/support/annotation/ArrayRes": "androidx/annotation/ArrayRes",
+      "android/support/v14/preference/MultiSelectListPreferenceDialogFragment$1": "androidx/preference/MultiSelectListPreferenceDialogFragment$1",
+      "android/support/v14/preference/MultiSelectListPreferenceDialogFragment": "androidx/preference/MultiSelectListPreferenceDialogFragment",
+      "android/support/v7/preference/DialogPreference$TargetFragment": "androidx/preference/DialogPreference$TargetFragment",
+      "android/support/annotation/LayoutRes": "androidx/annotation/LayoutRes",
+      "android/support/v14/preference/PreferenceFragment$1": "androidx/preference/PreferenceFragment$1",
+      "android/support/v14/preference/PreferenceFragment": "androidx/preference/PreferenceFragment",
+      "android/support/v14/preference/PreferenceFragment$2": "androidx/preference/PreferenceFragment$2",
+      "android/support/v14/preference/PreferenceFragment$3": "androidx/preference/PreferenceFragment$3",
+      "android/support/v7/preference/PreferenceGroup$PreferencePositionCallback": "androidx/preference/PreferenceGroup$PreferencePositionCallback",
+      "android/support/v7/preference/PreferenceGroup": "androidx/preference/PreferenceGroup",
+      "android/support/v14/preference/PreferenceFragment$ScrollToPreferenceObserver": "androidx/preference/PreferenceFragment$ScrollToPreferenceObserver",
+      "android/support/v14/preference/PreferenceFragment$DividerDecoration": "androidx/preference/PreferenceFragment$DividerDecoration",
+      "android/support/v7/widget/RecyclerView$ItemDecoration": "androidx/widget/recyclerview/RecyclerView$ItemDecoration",
+      "android/support/v7/preference/PreferenceViewHolder": "androidx/preference/PreferenceViewHolder",
+      "android/support/v14/preference/PreferenceFragment$OnPreferenceDisplayDialogCallback": "androidx/preference/PreferenceFragment$OnPreferenceDisplayDialogCallback",
+      "android/support/v14/preference/PreferenceFragment$OnPreferenceStartFragmentCallback": "androidx/preference/PreferenceFragment$OnPreferenceStartFragmentCallback",
+      "android/support/v14/preference/PreferenceFragment$OnPreferenceStartScreenCallback": "androidx/preference/PreferenceFragment$OnPreferenceStartScreenCallback",
+      "android/support/v7/preference/PreferenceScreen": "androidx/preference/PreferenceScreen",
+      "android/support/v7/preference/PreferenceManager$OnPreferenceTreeClickListener": "androidx/preference/PreferenceManager$OnPreferenceTreeClickListener",
+      "android/support/v7/preference/PreferenceManager$OnDisplayPreferenceDialogListener": "androidx/preference/PreferenceManager$OnDisplayPreferenceDialogListener",
+      "android/support/v7/preference/PreferenceManager$OnNavigateToScreenListener": "androidx/preference/PreferenceManager$OnNavigateToScreenListener",
+      "android/support/v7/preference/PreferenceManager": "androidx/preference/PreferenceManager",
+      "android/support/v7/preference/R$layout": "androidx/preference/R$layout",
+      "android/support/annotation/XmlRes": "androidx/annotation/XmlRes",
+      "android/support/v7/preference/PreferenceRecyclerViewAccessibilityDelegate": "androidx/preference/PreferenceRecyclerViewAccessibilityDelegate",
+      "android/support/v7/widget/RecyclerViewAccessibilityDelegate": "androidx/widget/recyclerview/RecyclerViewAccessibilityDelegate",
+      "android/support/v7/widget/LinearLayoutManager": "androidx/widget/recyclerview/LinearLayoutManager",
+      "android/support/v7/preference/PreferenceGroupAdapter": "androidx/preference/PreferenceGroupAdapter",
+      "android/support/v14/preference/SwitchPreference$1": "androidx/preference/SwitchPreference$1",
+      "android/support/v14/preference/SwitchPreference": "androidx/preference/SwitchPreference",
+      "android/support/v14/preference/SwitchPreference$Listener": "androidx/preference/SwitchPreference$Listener",
+      "android/support/v7/preference/TwoStatePreference": "androidx/preference/TwoStatePreference",
+      "android/support/v7/internal/widget/PreferenceImageView": "androidx/preference/internal/PreferenceImageView",
+      "android/support/v7/preference/AndroidResources": "androidx/preference/AndroidResources",
+      "android/support/v7/preference/CheckBoxPreference$1": "androidx/preference/CheckBoxPreference$1",
+      "android/support/v7/preference/CheckBoxPreference": "androidx/preference/CheckBoxPreference",
+      "android/support/v7/preference/CheckBoxPreference$Listener": "androidx/preference/CheckBoxPreference$Listener",
+      "android/support/v7/preference/CollapsiblePreferenceGroupController$1": "androidx/preference/CollapsiblePreferenceGroupController$1",
+      "android/support/v7/preference/Preference$OnPreferenceClickListener": "androidx/preference/Preference$OnPreferenceClickListener",
+      "android/support/v7/preference/CollapsiblePreferenceGroupController": "androidx/preference/CollapsiblePreferenceGroupController",
+      "android/support/v7/preference/CollapsiblePreferenceGroupController$ExpandButton": "androidx/preference/CollapsiblePreferenceGroupController$ExpandButton",
+      "android/support/v7/preference/R$drawable": "androidx/preference/R$drawable",
+      "android/support/v7/preference/R$string": "androidx/preference/R$string",
+      "android/support/v7/preference/CollapsiblePreferenceGroupController$SavedState$1": "androidx/preference/CollapsiblePreferenceGroupController$SavedState$1",
+      "android/support/v7/preference/CollapsiblePreferenceGroupController$SavedState": "androidx/preference/CollapsiblePreferenceGroupController$SavedState",
+      "android/support/v7/preference/PreferenceGroup$PreferenceInstanceStateCallback": "androidx/preference/PreferenceGroup$PreferenceInstanceStateCallback",
+      "android/support/v7/preference/DropDownPreference$1": "androidx/preference/DropDownPreference$1",
+      "android/support/v7/preference/DropDownPreference": "androidx/preference/DropDownPreference",
+      "android/support/v7/preference/R$id": "androidx/preference/R$id",
+      "android/support/v7/preference/EditTextPreference$SavedState$1": "androidx/preference/EditTextPreference$SavedState$1",
+      "android/support/v7/preference/EditTextPreference$SavedState": "androidx/preference/EditTextPreference$SavedState",
+      "android/support/v7/preference/EditTextPreferenceDialogFragmentCompat": "androidx/preference/EditTextPreferenceDialogFragmentCompat",
+      "android/support/v7/preference/PreferenceDialogFragmentCompat": "androidx/preference/PreferenceDialogFragmentCompat",
+      "android/support/v7/preference/ListPreference$SavedState$1": "androidx/preference/ListPreference$SavedState$1",
+      "android/support/v7/preference/ListPreference$SavedState": "androidx/preference/ListPreference$SavedState",
+      "android/support/v7/preference/ListPreferenceDialogFragmentCompat$1": "androidx/preference/ListPreferenceDialogFragmentCompat$1",
+      "android/support/v7/preference/ListPreferenceDialogFragmentCompat": "androidx/preference/ListPreferenceDialogFragmentCompat",
+      "android/support/v7/app/AlertDialog$Builder": "androidx/app/AlertDialog$Builder",
+      "android/support/v7/app/AlertDialog": "androidx/app/AlertDialog",
+      "android/support/v7/preference/MultiSelectListPreferenceDialogFragmentCompat$1": "androidx/preference/MultiSelectListPreferenceDialogFragmentCompat$1",
+      "android/support/v7/preference/MultiSelectListPreferenceDialogFragmentCompat": "androidx/preference/MultiSelectListPreferenceDialogFragmentCompat",
+      "android/support/v7/preference/Preference$1": "androidx/preference/Preference$1",
+      "android/support/v7/preference/Preference$BaseSavedState$1": "androidx/preference/Preference$BaseSavedState$1",
+      "android/support/v7/preference/Preference$OnPreferenceChangeInternalListener": "androidx/preference/Preference$OnPreferenceChangeInternalListener",
+      "android/support/v7/preference/Preference$OnPreferenceChangeListener": "androidx/preference/Preference$OnPreferenceChangeListener",
+      "android/support/v7/preference/PreferenceDataStore": "androidx/preference/PreferenceDataStore",
+      "android/support/v7/preference/PreferenceCategory": "androidx/preference/PreferenceCategory",
+      "android/support/v4/app/DialogFragment": "androidx/app/DialogFragment",
+      "android/support/v7/preference/PreferenceFragmentCompat$1": "androidx/preference/PreferenceFragmentCompat$1",
+      "android/support/v7/preference/PreferenceFragmentCompat": "androidx/preference/PreferenceFragmentCompat",
+      "android/support/v7/preference/PreferenceFragmentCompat$2": "androidx/preference/PreferenceFragmentCompat$2",
+      "android/support/v7/preference/PreferenceFragmentCompat$3": "androidx/preference/PreferenceFragmentCompat$3",
+      "android/support/v7/preference/PreferenceFragmentCompat$ScrollToPreferenceObserver": "androidx/preference/PreferenceFragmentCompat$ScrollToPreferenceObserver",
+      "android/support/v7/preference/PreferenceFragmentCompat$DividerDecoration": "androidx/preference/PreferenceFragmentCompat$DividerDecoration",
+      "android/support/v7/preference/PreferenceFragmentCompat$OnPreferenceDisplayDialogCallback": "androidx/preference/PreferenceFragmentCompat$OnPreferenceDisplayDialogCallback",
+      "android/support/v7/preference/PreferenceFragmentCompat$OnPreferenceStartFragmentCallback": "androidx/preference/PreferenceFragmentCompat$OnPreferenceStartFragmentCallback",
+      "android/support/v7/preference/PreferenceFragmentCompat$OnPreferenceStartScreenCallback": "androidx/preference/PreferenceFragmentCompat$OnPreferenceStartScreenCallback",
+      "android/support/v7/preference/PreferenceGroup$1": "androidx/preference/PreferenceGroup$1",
+      "android/support/v4/util/SimpleArrayMap": "androidx/util/SimpleArrayMap",
+      "android/support/v7/preference/PreferenceGroupAdapter$1": "androidx/preference/PreferenceGroupAdapter$1",
+      "android/support/v7/preference/PreferenceGroupAdapter$2": "androidx/preference/PreferenceGroupAdapter$2",
+      "android/support/v7/preference/PreferenceManager$PreferenceComparisonCallback": "androidx/preference/PreferenceManager$PreferenceComparisonCallback",
+      "android/support/v7/preference/PreferenceGroupAdapter$PreferenceLayout": "androidx/preference/PreferenceGroupAdapter$PreferenceLayout",
+      "android/support/v7/preference/PreferenceInflater": "androidx/preference/PreferenceInflater",
+      "android/support/v7/preference/PreferenceManager$SimplePreferenceComparisonCallback": "androidx/preference/PreferenceManager$SimplePreferenceComparisonCallback",
+      "android/support/v7/preference/PreferenceRecyclerViewAccessibilityDelegate$1": "androidx/preference/PreferenceRecyclerViewAccessibilityDelegate$1",
+      "android/support/v4/view/AccessibilityDelegateCompat": "androidx/view/AccessibilityDelegateCompat",
+      "android/support/annotation/IdRes": "androidx/annotation/IdRes",
+      "android/support/v7/preference/SeekBarPreference$1": "androidx/preference/SeekBarPreference$1",
+      "android/support/v7/preference/SeekBarPreference": "androidx/preference/SeekBarPreference",
+      "android/support/v7/preference/SeekBarPreference$2": "androidx/preference/SeekBarPreference$2",
+      "android/support/v7/preference/SeekBarPreference$SavedState$1": "androidx/preference/SeekBarPreference$SavedState$1",
+      "android/support/v7/preference/SeekBarPreference$SavedState": "androidx/preference/SeekBarPreference$SavedState",
+      "android/support/v7/preference/SwitchPreferenceCompat$1": "androidx/preference/SwitchPreferenceCompat$1",
+      "android/support/v7/preference/SwitchPreferenceCompat": "androidx/preference/SwitchPreferenceCompat",
+      "android/support/v7/preference/SwitchPreferenceCompat$Listener": "androidx/preference/SwitchPreferenceCompat$Listener",
+      "android/support/v7/widget/SwitchCompat": "androidx/widget/SwitchCompat",
+      "android/support/v7/preference/TwoStatePreference$SavedState$1": "androidx/preference/TwoStatePreference$SavedState$1",
+      "android/support/v7/preference/TwoStatePreference$SavedState": "androidx/preference/TwoStatePreference$SavedState",
+      "android/support/v7/preference/UnPressableLinearLayout": "androidx/preference/UnPressableLinearLayout",
+      "android/arch/persistence/room/migration/bundle/ForeignKeyBundle": "androidx/persistence/room/migration/bundle/ForeignKeyBundle",
+      "android/arch/persistence/room/migration/bundle/SchemaEquality": "androidx/persistence/room/migration/bundle/SchemaEquality",
+      "android/arch/persistence/room/migration/bundle/SchemaBundle": "androidx/persistence/room/migration/bundle/SchemaBundle",
+      "android/arch/persistence/room/migration/bundle/DatabaseBundle": "androidx/persistence/room/migration/bundle/DatabaseBundle",
+      "android/arch/persistence/room/migration/bundle/SchemaEqualityUtil": "androidx/persistence/room/migration/bundle/SchemaEqualityUtil",
+      "android/arch/persistence/room/migration/bundle/PrimaryKeyBundle": "androidx/persistence/room/migration/bundle/PrimaryKeyBundle",
+      "android/arch/persistence/room/migration/bundle/EntityBundle": "androidx/persistence/room/migration/bundle/EntityBundle",
+      "android/arch/persistence/room/migration/bundle/FieldBundle": "androidx/persistence/room/migration/bundle/FieldBundle",
+      "android/arch/persistence/room/migration/bundle/IndexBundle": "androidx/persistence/room/migration/bundle/IndexBundle",
+      "android/arch/persistence/room/migration/bundle/BundleUtil": "androidx/persistence/room/migration/bundle/BundleUtil",
+      "android/support/design/widget/CoordinatorLayout$1": "androidx/widget/CoordinatorLayout$1",
+      "android/support/v4/view/OnApplyWindowInsetsListener": "androidx/view/OnApplyWindowInsetsListener",
+      "android/support/design/widget/CoordinatorLayout": "androidx/widget/CoordinatorLayout",
+      "android/support/v4/view/WindowInsetsCompat": "androidx/view/WindowInsetsCompat",
+      "android/support/design/widget/CoordinatorLayout$Behavior": "androidx/widget/CoordinatorLayout$Behavior",
+      "android/support/design/widget/CoordinatorLayout$LayoutParams": "androidx/widget/CoordinatorLayout$LayoutParams",
+      "android/support/annotation/FloatRange": "androidx/annotation/FloatRange",
+      "android/support/design/widget/CoordinatorLayout$DefaultBehavior": "androidx/widget/CoordinatorLayout$DefaultBehavior",
+      "android/support/design/widget/CoordinatorLayout$DispatchChangeEvent": "androidx/widget/CoordinatorLayout$DispatchChangeEvent",
+      "android/support/design/widget/CoordinatorLayout$HierarchyChangeListener": "androidx/widget/CoordinatorLayout$HierarchyChangeListener",
+      "android/support/coreui/R$styleable": "androidx/coreui/R$styleable",
+      "android/support/coreui/R": "androidx/coreui/R",
+      "android/support/v4/view/GravityCompat": "androidx/view/GravityCompat",
+      "android/support/design/widget/CoordinatorLayout$OnPreDrawListener": "androidx/widget/CoordinatorLayout$OnPreDrawListener",
+      "android/support/design/widget/CoordinatorLayout$SavedState$1": "androidx/widget/CoordinatorLayout$SavedState$1",
+      "android/support/design/widget/CoordinatorLayout$SavedState": "androidx/widget/CoordinatorLayout$SavedState",
+      "android/support/v4/view/AbsSavedState": "androidx/view/AbsSavedState",
+      "android/support/design/widget/CoordinatorLayout$ViewElevationComparator": "androidx/widget/CoordinatorLayout$ViewElevationComparator",
+      "android/support/v4/view/NestedScrollingParent2": "androidx/view/NestedScrollingParent2",
+      "android/support/v4/util/Pools$Pool": "androidx/util/Pools$Pool",
+      "android/support/v4/util/Pools": "androidx/util/Pools",
+      "android/support/v4/util/Pools$SynchronizedPool": "androidx/util/Pools$SynchronizedPool",
+      "android/support/coreui/R$attr": "androidx/coreui/R$attr",
+      "android/support/coreui/R$style": "androidx/coreui/R$style",
+      "android/support/v4/widget/DirectedAcyclicGraph": "androidx/widget/DirectedAcyclicGraph",
+      "android/support/v4/view/NestedScrollingParentHelper": "androidx/view/NestedScrollingParentHelper",
+      "android/support/v4/util/ObjectsCompat": "androidx/util/ObjectsCompat",
+      "android/support/v4/widget/ViewGroupUtils": "androidx/widget/ViewGroupUtils",
+      "android/support/v4/math/MathUtils": "androidx/math/MathUtils",
+      "android/support/v4/app/ActionBarDrawerToggle$Delegate": "androidx/legacy/app/ActionBarDrawerToggle$Delegate",
+      "android/support/v4/app/ActionBarDrawerToggle": "androidx/legacy/app/ActionBarDrawerToggle",
+      "android/support/v4/app/ActionBarDrawerToggle$DelegateProvider": "androidx/legacy/app/ActionBarDrawerToggle$DelegateProvider",
+      "android/support/v4/app/ActionBarDrawerToggle$SetIndicatorInfo": "androidx/legacy/app/ActionBarDrawerToggle$SetIndicatorInfo",
+      "android/support/v4/app/ActionBarDrawerToggle$SlideDrawable": "androidx/legacy/app/ActionBarDrawerToggle$SlideDrawable",
+      "android/support/v4/widget/DrawerLayout$DrawerListener": "androidx/widget/DrawerLayout$DrawerListener",
+      "android/support/v4/widget/DrawerLayout": "androidx/widget/DrawerLayout",
+      "android/support/v4/view/AbsSavedState$1": "androidx/view/AbsSavedState$1",
+      "android/support/v4/view/AbsSavedState$2": "androidx/view/AbsSavedState$2",
+      "android/support/v4/view/AsyncLayoutInflater$1": "androidx/view/AsyncLayoutInflater$1",
+      "android/support/v4/view/AsyncLayoutInflater": "androidx/view/AsyncLayoutInflater",
+      "android/support/v4/view/AsyncLayoutInflater$InflateRequest": "androidx/view/AsyncLayoutInflater$InflateRequest",
+      "android/support/v4/view/AsyncLayoutInflater$OnInflateFinishedListener": "androidx/view/AsyncLayoutInflater$OnInflateFinishedListener",
+      "android/support/v4/view/AsyncLayoutInflater$InflateThread": "androidx/view/AsyncLayoutInflater$InflateThread",
+      "android/support/v4/view/AsyncLayoutInflater$BasicInflater": "androidx/view/AsyncLayoutInflater$BasicInflater",
+      "android/support/annotation/UiThread": "androidx/annotation/UiThread",
+      "android/support/v4/view/NestedScrollingChildHelper": "androidx/view/NestedScrollingChildHelper",
+      "android/support/v4/view/ViewParentCompat": "androidx/view/ViewParentCompat",
+      "android/support/v4/view/PagerAdapter": "androidx/widget/PagerAdapter",
+      "android/support/v4/view/PagerTabStrip$1": "androidx/widget/PagerTabStrip$1",
+      "android/support/v4/view/PagerTabStrip": "androidx/widget/PagerTabStrip",
+      "android/support/v4/view/ViewPager": "androidx/widget/ViewPager",
+      "android/support/v4/view/PagerTabStrip$2": "androidx/widget/PagerTabStrip$2",
+      "android/support/v4/view/PagerTitleStrip": "androidx/widget/PagerTitleStrip",
+      "android/support/annotation/ColorRes": "androidx/annotation/ColorRes",
+      "android/support/v4/view/PagerTitleStrip$PageListener": "androidx/widget/PagerTitleStrip$PageListener",
+      "android/support/v4/view/ViewPager$OnPageChangeListener": "androidx/widget/ViewPager$OnPageChangeListener",
+      "android/support/v4/view/ViewPager$OnAdapterChangeListener": "androidx/widget/ViewPager$OnAdapterChangeListener",
+      "android/support/v4/view/PagerTitleStrip$SingleLineAllCapsTransform": "androidx/widget/PagerTitleStrip$SingleLineAllCapsTransform",
+      "android/support/v4/view/ViewPager$DecorView": "androidx/widget/ViewPager$DecorView",
+      "android/support/v4/widget/TextViewCompat": "androidx/widget/TextViewCompat",
+      "android/support/v4/view/ViewPager$1": "androidx/widget/ViewPager$1",
+      "android/support/v4/view/ViewPager$ItemInfo": "androidx/widget/ViewPager$ItemInfo",
+      "android/support/v4/view/ViewPager$2": "androidx/widget/ViewPager$2",
+      "android/support/v4/view/ViewPager$3": "androidx/widget/ViewPager$3",
+      "android/support/v4/view/ViewPager$4": "androidx/widget/ViewPager$4",
+      "android/support/v4/view/ViewPager$LayoutParams": "androidx/widget/ViewPager$LayoutParams",
+      "android/support/v4/view/ViewPager$MyAccessibilityDelegate": "androidx/widget/ViewPager$MyAccessibilityDelegate",
+      "android/support/v4/view/ViewPager$PageTransformer": "androidx/widget/ViewPager$PageTransformer",
+      "android/support/v4/view/ViewPager$PagerObserver": "androidx/widget/ViewPager$PagerObserver",
+      "android/support/v4/view/ViewPager$SavedState$1": "androidx/widget/ViewPager$SavedState$1",
+      "android/support/v4/view/ViewPager$SavedState": "androidx/widget/ViewPager$SavedState",
+      "android/support/v4/view/ViewPager$SimpleOnPageChangeListener": "androidx/widget/ViewPager$SimpleOnPageChangeListener",
+      "android/support/v4/view/ViewPager$ViewPositionComparator": "androidx/widget/ViewPager$ViewPositionComparator",
+      "android/support/v4/view/animation/LookupTableInterpolator": "androidx/view/animation/LookupTableInterpolator",
+      "android/support/v4/widget/AutoScrollHelper$ClampedScroller": "androidx/widget/AutoScrollHelper$ClampedScroller",
+      "android/support/v4/widget/AutoScrollHelper": "androidx/widget/AutoScrollHelper",
+      "android/support/v4/widget/AutoScrollHelper$ScrollAnimationRunnable": "androidx/widget/AutoScrollHelper$ScrollAnimationRunnable",
+      "android/support/v4/widget/CircleImageView$OvalShadow": "androidx/widget/CircleImageView$OvalShadow",
+      "android/support/v4/widget/CircleImageView": "androidx/widget/CircleImageView",
+      "android/support/v4/widget/CircularProgressDrawable$1": "androidx/widget/CircularProgressDrawable$1",
+      "android/support/v4/widget/CircularProgressDrawable": "androidx/widget/CircularProgressDrawable",
+      "android/support/v4/widget/CircularProgressDrawable$Ring": "androidx/widget/CircularProgressDrawable$Ring",
+      "android/support/v4/widget/CircularProgressDrawable$2": "androidx/widget/CircularProgressDrawable$2",
+      "android/support/v4/widget/CircularProgressDrawable$ProgressDrawableSize": "androidx/widget/CircularProgressDrawable$ProgressDrawableSize",
+      "android/support/v4/util/Preconditions": "androidx/util/Preconditions",
+      "android/support/v4/widget/ContentLoadingProgressBar$1": "androidx/widget/ContentLoadingProgressBar$1",
+      "android/support/v4/widget/ContentLoadingProgressBar": "androidx/widget/ContentLoadingProgressBar",
+      "android/support/v4/widget/ContentLoadingProgressBar$2": "androidx/widget/ContentLoadingProgressBar$2",
+      "android/support/v4/widget/CursorAdapter$ChangeObserver": "androidx/widget/CursorAdapter$ChangeObserver",
+      "android/support/v4/widget/CursorAdapter": "androidx/widget/CursorAdapter",
+      "android/support/v4/widget/CursorAdapter$MyDataSetObserver": "androidx/widget/CursorAdapter$MyDataSetObserver",
+      "android/support/v4/widget/CursorFilter$CursorFilterClient": "androidx/widget/CursorFilter$CursorFilterClient",
+      "android/support/v4/widget/CursorFilter": "androidx/widget/CursorFilter",
+      "android/support/v4/util/Pools$SimplePool": "androidx/util/Pools$SimplePool",
+      "android/support/v4/widget/DrawerLayout$1": "androidx/widget/DrawerLayout$1",
+      "android/support/v4/widget/DrawerLayout$AccessibilityDelegate": "androidx/widget/DrawerLayout$AccessibilityDelegate",
+      "android/support/v4/widget/DrawerLayout$ChildAccessibilityDelegate": "androidx/widget/DrawerLayout$ChildAccessibilityDelegate",
+      "android/support/v4/widget/DrawerLayout$EdgeGravity": "androidx/widget/DrawerLayout$EdgeGravity",
+      "android/support/v4/widget/DrawerLayout$LayoutParams": "androidx/widget/DrawerLayout$LayoutParams",
+      "android/support/v4/widget/DrawerLayout$LockMode": "androidx/widget/DrawerLayout$LockMode",
+      "android/support/v4/widget/DrawerLayout$SavedState$1": "androidx/widget/DrawerLayout$SavedState$1",
+      "android/support/v4/widget/DrawerLayout$SavedState": "androidx/widget/DrawerLayout$SavedState",
+      "android/support/v4/widget/DrawerLayout$SimpleDrawerListener": "androidx/widget/DrawerLayout$SimpleDrawerListener",
+      "android/support/v4/widget/DrawerLayout$State": "androidx/widget/DrawerLayout$State",
+      "android/support/v4/widget/DrawerLayout$ViewDragCallback$1": "androidx/widget/DrawerLayout$ViewDragCallback$1",
+      "android/support/v4/widget/DrawerLayout$ViewDragCallback": "androidx/widget/DrawerLayout$ViewDragCallback",
+      "android/support/v4/widget/ViewDragHelper$Callback": "androidx/widget/ViewDragHelper$Callback",
+      "android/support/v4/widget/ViewDragHelper": "androidx/widget/ViewDragHelper",
+      "android/support/v4/widget/ExploreByTouchHelper$1": "androidx/widget/ExploreByTouchHelper$1",
+      "android/support/v4/widget/FocusStrategy$BoundsAdapter": "androidx/widget/FocusStrategy$BoundsAdapter",
+      "android/support/v4/widget/ExploreByTouchHelper": "androidx/widget/ExploreByTouchHelper",
+      "android/support/v4/widget/FocusStrategy": "androidx/widget/FocusStrategy",
+      "android/support/v4/widget/ExploreByTouchHelper$2": "androidx/widget/ExploreByTouchHelper$2",
+      "android/support/v4/widget/FocusStrategy$CollectionAdapter": "androidx/widget/FocusStrategy$CollectionAdapter",
+      "android/support/v4/util/SparseArrayCompat": "androidx/util/SparseArrayCompat",
+      "android/support/v4/widget/ExploreByTouchHelper$MyNodeProvider": "androidx/widget/ExploreByTouchHelper$MyNodeProvider",
+      "android/support/v4/view/accessibility/AccessibilityNodeProviderCompat": "androidx/view/accessibility/AccessibilityNodeProviderCompat",
+      "android/support/v4/view/accessibility/AccessibilityEventCompat": "androidx/view/accessibility/AccessibilityEventCompat",
+      "android/support/v4/view/accessibility/AccessibilityRecordCompat": "androidx/view/accessibility/AccessibilityRecordCompat",
+      "android/support/v4/widget/FocusStrategy$SequentialComparator": "androidx/widget/FocusStrategy$SequentialComparator",
+      "android/support/v4/widget/ListViewAutoScrollHelper": "androidx/widget/ListViewAutoScrollHelper",
+      "android/support/v4/widget/ListViewCompat": "androidx/widget/ListViewCompat",
+      "android/support/v4/widget/NestedScrollView$AccessibilityDelegate": "androidx/widget/NestedScrollView$AccessibilityDelegate",
+      "android/support/v4/widget/NestedScrollView": "androidx/widget/NestedScrollView",
+      "android/support/v4/widget/NestedScrollView$OnScrollChangeListener": "androidx/widget/NestedScrollView$OnScrollChangeListener",
+      "android/support/v4/widget/NestedScrollView$SavedState$1": "androidx/widget/NestedScrollView$SavedState$1",
+      "android/support/v4/widget/NestedScrollView$SavedState": "androidx/widget/NestedScrollView$SavedState",
+      "android/support/v4/view/NestedScrollingParent": "androidx/view/NestedScrollingParent",
+      "android/support/v4/view/NestedScrollingChild2": "androidx/view/NestedScrollingChild2",
+      "android/support/v4/view/ScrollingView": "androidx/view/ScrollingView",
+      "android/support/v4/widget/EdgeEffectCompat": "androidx/widget/EdgeEffectCompat",
+      "android/support/v4/widget/ResourceCursorAdapter": "androidx/widget/ResourceCursorAdapter",
+      "android/support/v4/widget/SimpleCursorAdapter$CursorToStringConverter": "androidx/widget/SimpleCursorAdapter$CursorToStringConverter",
+      "android/support/v4/widget/SimpleCursorAdapter": "androidx/widget/SimpleCursorAdapter",
+      "android/support/v4/widget/SimpleCursorAdapter$ViewBinder": "androidx/widget/SimpleCursorAdapter$ViewBinder",
+      "android/support/v4/widget/SlidingPaneLayout$AccessibilityDelegate": "androidx/widget/SlidingPaneLayout$AccessibilityDelegate",
+      "android/support/v4/widget/SlidingPaneLayout": "androidx/widget/SlidingPaneLayout",
+      "android/support/v4/widget/SlidingPaneLayout$DisableLayerRunnable": "androidx/widget/SlidingPaneLayout$DisableLayerRunnable",
+      "android/support/v4/widget/SlidingPaneLayout$DragHelperCallback": "androidx/widget/SlidingPaneLayout$DragHelperCallback",
+      "android/support/v4/widget/SlidingPaneLayout$LayoutParams": "androidx/widget/SlidingPaneLayout$LayoutParams",
+      "android/support/v4/widget/SlidingPaneLayout$PanelSlideListener": "androidx/widget/SlidingPaneLayout$PanelSlideListener",
+      "android/support/v4/widget/SlidingPaneLayout$SavedState$1": "androidx/widget/SlidingPaneLayout$SavedState$1",
+      "android/support/v4/widget/SlidingPaneLayout$SavedState": "androidx/widget/SlidingPaneLayout$SavedState",
+      "android/support/v4/widget/SlidingPaneLayout$SimplePanelSlideListener": "androidx/widget/SlidingPaneLayout$SimplePanelSlideListener",
+      "android/support/v4/widget/SlidingPaneLayout$SlidingPanelLayoutImpl": "androidx/widget/SlidingPaneLayout$SlidingPanelLayoutImpl",
+      "android/support/v4/widget/SlidingPaneLayout$SlidingPanelLayoutImplBase": "androidx/widget/SlidingPaneLayout$SlidingPanelLayoutImplBase",
+      "android/support/v4/widget/SlidingPaneLayout$SlidingPanelLayoutImplJB": "androidx/widget/SlidingPaneLayout$SlidingPanelLayoutImplJB",
+      "android/support/v4/widget/SlidingPaneLayout$SlidingPanelLayoutImplJBMR1": "androidx/widget/SlidingPaneLayout$SlidingPanelLayoutImplJBMR1",
+      "android/support/v4/widget/Space": "androidx/widget/Space",
+      "android/support/v4/widget/SwipeProgressBar": "androidx/widget/SwipeProgressBar",
+      "android/support/v4/widget/SwipeRefreshLayout$1": "androidx/widget/SwipeRefreshLayout$1",
+      "android/support/v4/widget/SwipeRefreshLayout": "androidx/widget/SwipeRefreshLayout",
+      "android/support/v4/widget/SwipeRefreshLayout$OnRefreshListener": "androidx/widget/SwipeRefreshLayout$OnRefreshListener",
+      "android/support/v4/widget/SwipeRefreshLayout$2": "androidx/widget/SwipeRefreshLayout$2",
+      "android/support/v4/widget/SwipeRefreshLayout$3": "androidx/widget/SwipeRefreshLayout$3",
+      "android/support/v4/widget/SwipeRefreshLayout$4": "androidx/widget/SwipeRefreshLayout$4",
+      "android/support/v4/widget/SwipeRefreshLayout$5": "androidx/widget/SwipeRefreshLayout$5",
+      "android/support/v4/widget/SwipeRefreshLayout$6": "androidx/widget/SwipeRefreshLayout$6",
+      "android/support/v4/widget/SwipeRefreshLayout$7": "androidx/widget/SwipeRefreshLayout$7",
+      "android/support/v4/widget/SwipeRefreshLayout$8": "androidx/widget/SwipeRefreshLayout$8",
+      "android/support/v4/widget/SwipeRefreshLayout$OnChildScrollUpCallback": "androidx/widget/SwipeRefreshLayout$OnChildScrollUpCallback",
+      "android/support/v4/view/NestedScrollingChild": "androidx/view/NestedScrollingChild",
+      "android/support/v4/widget/ViewDragHelper$1": "androidx/widget/ViewDragHelper$1",
+      "android/support/v4/widget/ViewDragHelper$2": "androidx/widget/ViewDragHelper$2",
+      "android/support/annotation/StyleableRes": "androidx/annotation/StyleableRes",
+      "android/support/v4/graphics/drawable/TintAwareDrawable": "androidx/graphics/drawable/TintAwareDrawable",
+      "android/support/graphics/drawable/VectorDrawableCompat$VClipPath": "androidx/graphics/drawable/VectorDrawableCompat$VClipPath",
+      "android/support/graphics/drawable/VectorDrawableCompat$VPath": "androidx/graphics/drawable/VectorDrawableCompat$VPath",
+      "android/support/graphics/drawable/VectorDrawableCompat$VFullPath": "androidx/graphics/drawable/VectorDrawableCompat$VFullPath",
+      "android/support/graphics/drawable/VectorDrawableCompat$VGroup": "androidx/graphics/drawable/VectorDrawableCompat$VGroup",
+      "android/support/graphics/drawable/VectorDrawableCompat$VPathRenderer": "androidx/graphics/drawable/VectorDrawableCompat$VPathRenderer",
+      "android/support/graphics/drawable/VectorDrawableCompat$VectorDrawableCompatState": "androidx/graphics/drawable/VectorDrawableCompat$VectorDrawableCompatState",
+      "android/support/graphics/drawable/VectorDrawableCompat$VectorDrawableDelegateState": "androidx/graphics/drawable/VectorDrawableCompat$VectorDrawableDelegateState",
+      "android/support/v7/app/ActionBar$DisplayOptions": "androidx/app/ActionBar$DisplayOptions",
+      "android/support/v7/app/ActionBar": "androidx/app/ActionBar",
+      "android/support/v7/app/ActionBar$LayoutParams": "androidx/app/ActionBar$LayoutParams",
+      "android/support/v7/appcompat/R$styleable": "androidx/appcompat/R$styleable",
+      "android/support/v7/appcompat/R": "androidx/appcompat/R",
+      "android/support/v7/app/ActionBar$NavigationMode": "androidx/app/ActionBar$NavigationMode",
+      "android/support/v7/app/ActionBar$OnMenuVisibilityListener": "androidx/app/ActionBar$OnMenuVisibilityListener",
+      "android/support/v7/app/ActionBar$OnNavigationListener": "androidx/app/ActionBar$OnNavigationListener",
+      "android/support/v7/app/ActionBar$Tab": "androidx/app/ActionBar$Tab",
+      "android/support/v7/app/ActionBar$TabListener": "androidx/app/ActionBar$TabListener",
+      "android/support/v7/view/ActionMode$Callback": "androidx/view/ActionMode$Callback",
+      "android/support/v7/view/ActionMode": "androidx/view/ActionMode",
+      "android/support/v7/app/ActionBarDrawerToggle$1": "androidx/app/ActionBarDrawerToggle$1",
+      "android/support/v7/app/ActionBarDrawerToggle": "androidx/app/ActionBarDrawerToggle",
+      "android/support/v7/widget/Toolbar": "androidx/widget/Toolbar",
+      "android/support/v7/graphics/drawable/DrawerArrowDrawable": "androidx/graphics/drawable/DrawerArrowDrawable",
+      "android/support/v7/app/ActionBarDrawerToggle$Delegate": "androidx/app/ActionBarDrawerToggle$Delegate",
+      "android/support/v7/app/ActionBarDrawerToggle$DelegateProvider": "androidx/app/ActionBarDrawerToggle$DelegateProvider",
+      "android/support/v7/app/ActionBarDrawerToggle$IcsDelegate": "androidx/app/ActionBarDrawerToggle$IcsDelegate",
+      "android/support/v7/app/ActionBarDrawerToggleHoneycomb$SetIndicatorInfo": "androidx/app/ActionBarDrawerToggleHoneycomb$SetIndicatorInfo",
+      "android/support/v7/app/ActionBarDrawerToggleHoneycomb": "androidx/app/ActionBarDrawerToggleHoneycomb",
+      "android/support/v7/app/ActionBarDrawerToggle$JellybeanMr2Delegate": "androidx/app/ActionBarDrawerToggle$JellybeanMr2Delegate",
+      "android/support/v7/app/ActionBarDrawerToggle$ToolbarCompatDelegate": "androidx/app/ActionBarDrawerToggle$ToolbarCompatDelegate",
+      "android/support/v7/app/AlertController$1": "androidx/app/AlertController$1",
+      "android/support/v7/app/AlertController": "androidx/app/AlertController",
+      "android/support/v7/app/AlertController$ButtonHandler": "androidx/app/AlertController$ButtonHandler",
+      "android/support/v7/app/AppCompatDialog": "androidx/app/AppCompatDialog",
+      "android/support/v7/app/AlertController$2": "androidx/app/AlertController$2",
+      "android/support/v7/app/AlertController$3": "androidx/app/AlertController$3",
+      "android/support/v7/app/AlertController$4": "androidx/app/AlertController$4",
+      "android/support/v7/app/AlertController$5": "androidx/app/AlertController$5",
+      "android/support/v7/app/AlertController$AlertParams$1": "androidx/app/AlertController$AlertParams$1",
+      "android/support/v7/app/AlertController$AlertParams": "androidx/app/AlertController$AlertParams",
+      "android/support/v7/app/AlertController$RecycleListView": "androidx/app/AlertController$RecycleListView",
+      "android/support/v7/app/AlertController$AlertParams$2": "androidx/app/AlertController$AlertParams$2",
+      "android/support/v7/app/AlertController$AlertParams$3": "androidx/app/AlertController$AlertParams$3",
+      "android/support/v7/app/AlertController$AlertParams$4": "androidx/app/AlertController$AlertParams$4",
+      "android/support/v7/app/AlertController$AlertParams$OnPrepareListViewListener": "androidx/app/AlertController$AlertParams$OnPrepareListViewListener",
+      "android/support/v7/app/AlertController$CheckedItemAdapter": "androidx/app/AlertController$CheckedItemAdapter",
+      "android/support/v7/widget/LinearLayoutCompat$LayoutParams": "androidx/widget/LinearLayoutCompat$LayoutParams",
+      "android/support/v7/widget/LinearLayoutCompat": "androidx/widget/LinearLayoutCompat",
+      "android/support/v7/appcompat/R$attr": "androidx/appcompat/R$attr",
+      "android/support/v7/appcompat/R$id": "androidx/appcompat/R$id",
+      "android/support/annotation/StyleRes": "androidx/annotation/StyleRes",
+      "android/support/annotation/AttrRes": "androidx/annotation/AttrRes",
+      "android/support/v7/app/AppCompatActivity": "androidx/app/AppCompatActivity",
+      "android/support/v7/app/AppCompatCallback": "androidx/app/AppCompatCallback",
+      "android/support/v4/app/TaskStackBuilder$SupportParentable": "androidx/app/TaskStackBuilder$SupportParentable",
+      "android/support/v4/app/TaskStackBuilder": "androidx/app/TaskStackBuilder",
+      "android/support/v7/app/AppCompatDelegate": "androidx/app/AppCompatDelegate",
+      "android/support/v4/app/NavUtils": "androidx/app/NavUtils",
+      "android/support/v7/widget/VectorEnabledTintResources": "androidx/widget/VectorEnabledTintResources",
+      "android/support/v7/app/AppCompatDelegate$ApplyableNightMode": "androidx/app/AppCompatDelegate$ApplyableNightMode",
+      "android/support/v7/app/AppCompatDelegate$NightMode": "androidx/app/AppCompatDelegate$NightMode",
+      "android/support/v7/app/AppCompatDelegateImplN": "androidx/app/AppCompatDelegateImplN",
+      "android/support/v7/app/AppCompatDelegateImplV23": "androidx/app/AppCompatDelegateImplV23",
+      "android/support/v7/app/AppCompatDelegateImplV14": "androidx/app/AppCompatDelegateImplV14",
+      "android/support/v7/app/AppCompatDelegateImplV11": "androidx/app/AppCompatDelegateImplV11",
+      "android/support/v7/app/AppCompatDelegateImplV9": "androidx/app/AppCompatDelegateImplV9",
+      "android/support/v7/app/AppCompatDelegateImplBase$1": "androidx/app/AppCompatDelegateImplBase$1",
+      "android/support/v7/app/AppCompatDelegateImplBase": "androidx/app/AppCompatDelegateImplBase",
+      "android/support/v7/app/AppCompatDelegateImplBase$ActionBarDrawableToggleImpl": "androidx/app/AppCompatDelegateImplBase$ActionBarDrawableToggleImpl",
+      "android/support/v7/widget/TintTypedArray": "androidx/widget/TintTypedArray",
+      "android/support/v7/app/AppCompatDelegateImplBase$AppCompatWindowCallbackBase": "androidx/app/AppCompatDelegateImplBase$AppCompatWindowCallbackBase",
+      "android/support/v7/view/WindowCallbackWrapper": "androidx/view/WindowCallbackWrapper",
+      "android/support/v7/view/menu/MenuBuilder": "androidx/view/menu/MenuBuilder",
+      "android/support/v7/view/SupportMenuInflater": "androidx/view/SupportMenuInflater",
+      "android/support/v7/app/AppCompatDelegateImplN$AppCompatWindowCallbackN": "androidx/app/AppCompatDelegateImplN$AppCompatWindowCallbackN",
+      "android/support/v7/app/AppCompatDelegateImplV23$AppCompatWindowCallbackV23": "androidx/app/AppCompatDelegateImplV23$AppCompatWindowCallbackV23",
+      "android/support/v7/app/AppCompatDelegateImplV9$PanelFeatureState": "androidx/app/AppCompatDelegateImplV9$PanelFeatureState",
+      "android/support/v7/app/AppCompatDelegateImplV14$AppCompatWindowCallbackV14": "androidx/app/AppCompatDelegateImplV14$AppCompatWindowCallbackV14",
+      "android/support/v7/view/SupportActionModeWrapper$CallbackWrapper": "androidx/view/SupportActionModeWrapper$CallbackWrapper",
+      "android/support/v7/view/SupportActionModeWrapper": "androidx/view/SupportActionModeWrapper",
+      "android/support/v7/app/AppCompatDelegateImplV14$AutoNightModeManager$1": "androidx/app/AppCompatDelegateImplV14$AutoNightModeManager$1",
+      "android/support/v7/app/AppCompatDelegateImplV14$AutoNightModeManager": "androidx/app/AppCompatDelegateImplV14$AutoNightModeManager",
+      "android/support/v7/app/TwilightManager": "androidx/app/TwilightManager",
+      "android/support/v7/app/ResourcesFlusher": "androidx/app/ResourcesFlusher",
+      "android/support/v7/app/AppCompatDelegateImplV9$1": "androidx/app/AppCompatDelegateImplV9$1",
+      "android/support/v7/app/AppCompatDelegateImplV9$2": "androidx/app/AppCompatDelegateImplV9$2",
+      "android/support/v7/app/AppCompatDelegateImplV9$3": "androidx/app/AppCompatDelegateImplV9$3",
+      "android/support/v7/widget/FitWindowsViewGroup$OnFitSystemWindowsListener": "androidx/widget/FitWindowsViewGroup$OnFitSystemWindowsListener",
+      "android/support/v7/widget/FitWindowsViewGroup": "androidx/widget/FitWindowsViewGroup",
+      "android/support/v7/app/AppCompatDelegateImplV9$4": "androidx/app/AppCompatDelegateImplV9$4",
+      "android/support/v7/widget/ContentFrameLayout$OnAttachListener": "androidx/widget/ContentFrameLayout$OnAttachListener",
+      "android/support/v7/widget/ContentFrameLayout": "androidx/widget/ContentFrameLayout",
+      "android/support/v7/app/AppCompatDelegateImplV9$5$1": "androidx/app/AppCompatDelegateImplV9$5$1",
+      "android/support/v4/view/ViewPropertyAnimatorListenerAdapter": "androidx/view/ViewPropertyAnimatorListenerAdapter",
+      "android/support/v7/app/AppCompatDelegateImplV9$5": "androidx/app/AppCompatDelegateImplV9$5",
+      "android/support/v7/widget/ActionBarContextView": "androidx/widget/ActionBarContextView",
+      "android/support/v4/view/ViewPropertyAnimatorCompat": "androidx/view/ViewPropertyAnimatorCompat",
+      "android/support/v4/view/ViewPropertyAnimatorListener": "androidx/view/ViewPropertyAnimatorListener",
+      "android/support/v7/app/AppCompatDelegateImplV9$6": "androidx/app/AppCompatDelegateImplV9$6",
+      "android/support/v7/app/AppCompatDelegateImplV9$ActionMenuPresenterCallback": "androidx/app/AppCompatDelegateImplV9$ActionMenuPresenterCallback",
+      "android/support/v7/view/menu/MenuPresenter$Callback": "androidx/view/menu/MenuPresenter$Callback",
+      "android/support/v7/view/menu/MenuPresenter": "androidx/view/menu/MenuPresenter",
+      "android/support/v7/app/AppCompatDelegateImplV9$ActionModeCallbackWrapperV9$1": "androidx/app/AppCompatDelegateImplV9$ActionModeCallbackWrapperV9$1",
+      "android/support/v7/app/AppCompatDelegateImplV9$ActionModeCallbackWrapperV9": "androidx/app/AppCompatDelegateImplV9$ActionModeCallbackWrapperV9",
+      "android/support/v7/app/AppCompatDelegateImplV9$ListMenuDecorView": "androidx/app/AppCompatDelegateImplV9$ListMenuDecorView",
+      "android/support/v7/content/res/AppCompatResources": "androidx/content/res/AppCompatResources",
+      "android/support/v7/app/AppCompatDelegateImplV9$PanelFeatureState$SavedState$1": "androidx/app/AppCompatDelegateImplV9$PanelFeatureState$SavedState$1",
+      "android/support/v7/app/AppCompatDelegateImplV9$PanelFeatureState$SavedState": "androidx/app/AppCompatDelegateImplV9$PanelFeatureState$SavedState",
+      "android/support/v7/appcompat/R$style": "androidx/appcompat/R$style",
+      "android/support/v7/appcompat/R$layout": "androidx/appcompat/R$layout",
+      "android/support/v7/view/menu/ListMenuPresenter": "androidx/view/menu/ListMenuPresenter",
+      "android/support/v7/view/ContextThemeWrapper": "androidx/view/ContextThemeWrapper",
+      "android/support/v7/view/menu/MenuView": "androidx/view/menu/MenuView",
+      "android/support/v7/app/AppCompatDelegateImplV9$PanelMenuPresenterCallback": "androidx/app/AppCompatDelegateImplV9$PanelMenuPresenterCallback",
+      "android/support/v7/view/menu/MenuBuilder$Callback": "androidx/view/menu/MenuBuilder$Callback",
+      "android/support/v7/appcompat/R$color": "androidx/appcompat/R$color",
+      "android/support/v7/widget/DecorContentParent": "androidx/widget/DecorContentParent",
+      "android/support/v7/app/AppCompatViewInflater": "androidx/app/AppCompatViewInflater",
+      "android/support/v7/app/WindowDecorActionBar": "androidx/app/WindowDecorActionBar",
+      "android/support/v7/app/ToolbarActionBar": "androidx/app/ToolbarActionBar",
+      "android/support/v7/widget/AppCompatDrawableManager": "androidx/widget/AppCompatDrawableManager",
+      "android/support/v7/widget/ViewUtils": "androidx/widget/ViewUtils",
+      "android/support/v4/widget/PopupWindowCompat": "androidx/widget/PopupWindowCompat",
+      "android/support/v7/widget/ViewStubCompat": "androidx/widget/ViewStubCompat",
+      "android/support/v7/view/StandaloneActionMode": "androidx/view/StandaloneActionMode",
+      "android/support/v4/view/LayoutInflaterCompat": "androidx/view/LayoutInflaterCompat",
+      "android/support/v7/app/AppCompatDialogFragment": "androidx/app/AppCompatDialogFragment",
+      "android/support/v7/app/AppCompatViewInflater$DeclaredOnClickListener": "androidx/app/AppCompatViewInflater$DeclaredOnClickListener",
+      "android/support/v7/widget/TintContextWrapper": "androidx/widget/TintContextWrapper",
+      "android/support/v7/widget/AppCompatTextView": "androidx/widget/AppCompatTextView",
+      "android/support/v7/widget/AppCompatImageView": "androidx/widget/AppCompatImageView",
+      "android/support/v7/widget/AppCompatButton": "androidx/widget/AppCompatButton",
+      "android/support/v7/widget/AppCompatEditText": "androidx/widget/AppCompatEditText",
+      "android/support/v7/widget/AppCompatSpinner": "androidx/widget/AppCompatSpinner",
+      "android/support/v7/widget/AppCompatImageButton": "androidx/widget/AppCompatImageButton",
+      "android/support/v7/widget/AppCompatCheckBox": "androidx/widget/AppCompatCheckBox",
+      "android/support/v7/widget/AppCompatRadioButton": "androidx/widget/AppCompatRadioButton",
+      "android/support/v7/widget/AppCompatCheckedTextView": "androidx/widget/AppCompatCheckedTextView",
+      "android/support/v7/widget/AppCompatAutoCompleteTextView": "androidx/widget/AppCompatAutoCompleteTextView",
+      "android/support/v7/widget/AppCompatMultiAutoCompleteTextView": "androidx/widget/AppCompatMultiAutoCompleteTextView",
+      "android/support/v7/widget/AppCompatRatingBar": "androidx/widget/AppCompatRatingBar",
+      "android/support/v7/widget/AppCompatSeekBar": "androidx/widget/AppCompatSeekBar",
+      "android/support/v7/app/NavItemSelectedListener": "androidx/app/NavItemSelectedListener",
+      "android/support/v7/app/ToolbarActionBar$1": "androidx/app/ToolbarActionBar$1",
+      "android/support/v7/app/ToolbarActionBar$2": "androidx/app/ToolbarActionBar$2",
+      "android/support/v7/widget/Toolbar$OnMenuItemClickListener": "androidx/widget/Toolbar$OnMenuItemClickListener",
+      "android/support/v7/app/ToolbarActionBar$ActionMenuPresenterCallback": "androidx/app/ToolbarActionBar$ActionMenuPresenterCallback",
+      "android/support/v7/widget/DecorToolbar": "androidx/widget/DecorToolbar",
+      "android/support/v7/app/ToolbarActionBar$MenuBuilderCallback": "androidx/app/ToolbarActionBar$MenuBuilderCallback",
+      "android/support/v7/app/ToolbarActionBar$ToolbarCallbackWrapper": "androidx/app/ToolbarActionBar$ToolbarCallbackWrapper",
+      "android/support/v7/widget/ToolbarWidgetWrapper": "androidx/widget/ToolbarWidgetWrapper",
+      "android/support/v7/app/TwilightCalculator": "androidx/app/TwilightCalculator",
+      "android/support/v7/app/TwilightManager$TwilightState": "androidx/app/TwilightManager$TwilightState",
+      "android/support/v4/content/PermissionChecker": "androidx/content/PermissionChecker",
+      "android/support/annotation/RequiresPermission": "androidx/annotation/RequiresPermission",
+      "android/support/v7/app/WindowDecorActionBar$1": "androidx/app/WindowDecorActionBar$1",
+      "android/support/v7/widget/ActionBarContainer": "androidx/widget/ActionBarContainer",
+      "android/support/v7/view/ViewPropertyAnimatorCompatSet": "androidx/view/ViewPropertyAnimatorCompatSet",
+      "android/support/v7/widget/ActionBarOverlayLayout": "androidx/widget/ActionBarOverlayLayout",
+      "android/support/v7/app/WindowDecorActionBar$2": "androidx/app/WindowDecorActionBar$2",
+      "android/support/v7/app/WindowDecorActionBar$3": "androidx/app/WindowDecorActionBar$3",
+      "android/support/v4/view/ViewPropertyAnimatorUpdateListener": "androidx/view/ViewPropertyAnimatorUpdateListener",
+      "android/support/v7/app/WindowDecorActionBar$ActionModeImpl": "androidx/app/WindowDecorActionBar$ActionModeImpl",
+      "android/support/v7/view/menu/SubMenuBuilder": "androidx/view/menu/SubMenuBuilder",
+      "android/support/v7/view/menu/MenuPopupHelper": "androidx/view/menu/MenuPopupHelper",
+      "android/support/v7/app/WindowDecorActionBar$TabImpl": "androidx/app/WindowDecorActionBar$TabImpl",
+      "android/support/v7/widget/ScrollingTabContainerView": "androidx/widget/ScrollingTabContainerView",
+      "android/support/v7/widget/ActionBarOverlayLayout$ActionBarVisibilityCallback": "androidx/widget/ActionBarOverlayLayout$ActionBarVisibilityCallback",
+      "android/support/v7/view/ActionBarPolicy": "androidx/view/ActionBarPolicy",
+      "android/support/v7/content/res/AppCompatColorStateListInflater": "androidx/content/res/AppCompatColorStateListInflater",
+      "android/support/v7/content/res/GrowingArrayUtils": "androidx/content/res/GrowingArrayUtils",
+      "android/support/v4/graphics/ColorUtils": "androidx/graphics/ColorUtils",
+      "android/support/v7/content/res/AppCompatResources$ColorStateListCacheEntry": "androidx/content/res/AppCompatResources$ColorStateListCacheEntry",
+      "android/support/v7/graphics/drawable/DrawableWrapper": "androidx/graphics/drawable/DrawableWrapper",
+      "android/support/v7/graphics/drawable/DrawerArrowDrawable$ArrowDirection": "androidx/graphics/drawable/DrawerArrowDrawable$ArrowDirection",
+      "android/support/v7/text/AllCapsTransformationMethod": "androidx/text/AllCapsTransformationMethod",
+      "android/support/v7/appcompat/R$bool": "androidx/appcompat/R$bool",
+      "android/support/v7/appcompat/R$dimen": "androidx/appcompat/R$dimen",
+      "android/support/v7/view/CollapsibleActionView": "androidx/view/CollapsibleActionView",
+      "android/support/v4/internal/view/SupportMenuItem": "androidx/internal/view/SupportMenuItem",
+      "android/support/v7/view/menu/MenuWrapperFactory": "androidx/view/menu/MenuWrapperFactory",
+      "android/support/v4/internal/view/SupportMenu": "androidx/internal/view/SupportMenu",
+      "android/support/v7/view/SupportMenuInflater$InflatedOnMenuItemClickListener": "androidx/view/SupportMenuInflater$InflatedOnMenuItemClickListener",
+      "android/support/v7/view/SupportMenuInflater$MenuState": "androidx/view/SupportMenuInflater$MenuState",
+      "android/support/v4/view/ActionProvider": "androidx/view/ActionProvider",
+      "android/support/v7/widget/DrawableUtils": "androidx/widget/DrawableUtils",
+      "android/support/v7/view/menu/MenuItemImpl": "androidx/view/menu/MenuItemImpl",
+      "android/support/v7/view/menu/MenuItemWrapperICS": "androidx/view/menu/MenuItemWrapperICS",
+      "android/support/v4/view/MenuItemCompat": "androidx/view/MenuItemCompat",
+      "android/support/v7/view/ViewPropertyAnimatorCompatSet$1": "androidx/view/ViewPropertyAnimatorCompatSet$1",
+      "android/support/v7/view/menu/ActionMenuItem": "androidx/view/menu/ActionMenuItem",
+      "android/support/v7/view/menu/ActionMenuItemView$ActionMenuItemForwardingListener": "androidx/view/menu/ActionMenuItemView$ActionMenuItemForwardingListener",
+      "android/support/v7/widget/ForwardingListener": "androidx/widget/ForwardingListener",
+      "android/support/v7/view/menu/ActionMenuItemView": "androidx/view/menu/ActionMenuItemView",
+      "android/support/v7/view/menu/ActionMenuItemView$PopupCallback": "androidx/view/menu/ActionMenuItemView$PopupCallback",
+      "android/support/v7/view/menu/MenuBuilder$ItemInvoker": "androidx/view/menu/MenuBuilder$ItemInvoker",
+      "android/support/v7/view/menu/ShowableListMenu": "androidx/view/menu/ShowableListMenu",
+      "android/support/v7/view/menu/MenuView$ItemView": "androidx/view/menu/MenuView$ItemView",
+      "android/support/v7/widget/ActionMenuView$ActionMenuChildView": "androidx/widget/ActionMenuView$ActionMenuChildView",
+      "android/support/v7/widget/ActionMenuView": "androidx/widget/ActionMenuView",
+      "android/support/v7/widget/TooltipCompat": "androidx/widget/TooltipCompat",
+      "android/support/v7/view/menu/BaseMenuPresenter": "androidx/view/menu/BaseMenuPresenter",
+      "android/support/v7/view/menu/BaseMenuWrapper": "androidx/view/menu/BaseMenuWrapper",
+      "android/support/v7/view/menu/BaseWrapper": "androidx/view/menu/BaseWrapper",
+      "android/support/v4/internal/view/SupportSubMenu": "androidx/internal/view/SupportSubMenu",
+      "android/support/v7/view/menu/CascadingMenuPopup$1": "androidx/view/menu/CascadingMenuPopup$1",
+      "android/support/v7/view/menu/CascadingMenuPopup": "androidx/view/menu/CascadingMenuPopup",
+      "android/support/v7/view/menu/CascadingMenuPopup$CascadingMenuInfo": "androidx/view/menu/CascadingMenuPopup$CascadingMenuInfo",
+      "android/support/v7/widget/MenuPopupWindow": "androidx/widget/MenuPopupWindow",
+      "android/support/v7/view/menu/CascadingMenuPopup$2": "androidx/view/menu/CascadingMenuPopup$2",
+      "android/support/v7/view/menu/CascadingMenuPopup$3$1": "androidx/view/menu/CascadingMenuPopup$3$1",
+      "android/support/v7/view/menu/CascadingMenuPopup$3": "androidx/view/menu/CascadingMenuPopup$3",
+      "android/support/v7/widget/MenuItemHoverListener": "androidx/widget/MenuItemHoverListener",
+      "android/support/v7/view/menu/CascadingMenuPopup$HorizPosition": "androidx/view/menu/CascadingMenuPopup$HorizPosition",
+      "android/support/v7/view/menu/MenuPopup": "androidx/view/menu/MenuPopup",
+      "android/support/v7/view/menu/MenuAdapter": "androidx/view/menu/MenuAdapter",
+      "android/support/v7/view/menu/ExpandedMenuView": "androidx/view/menu/ExpandedMenuView",
+      "android/support/v7/view/menu/ListMenuItemView": "androidx/view/menu/ListMenuItemView",
+      "android/support/v7/view/menu/ListMenuPresenter$MenuAdapter": "androidx/view/menu/ListMenuPresenter$MenuAdapter",
+      "android/support/v7/view/menu/MenuDialogHelper": "androidx/view/menu/MenuDialogHelper",
+      "android/support/v7/view/menu/MenuHelper": "androidx/view/menu/MenuHelper",
+      "android/support/v7/view/menu/MenuItemImpl$1": "androidx/view/menu/MenuItemImpl$1",
+      "android/support/v4/view/ActionProvider$VisibilityListener": "androidx/view/ActionProvider$VisibilityListener",
+      "android/support/v7/view/menu/MenuItemWrapperICS$ActionProviderWrapper": "androidx/view/menu/MenuItemWrapperICS$ActionProviderWrapper",
+      "android/support/v7/view/menu/MenuItemWrapperICS$CollapsibleActionViewWrapper": "androidx/view/menu/MenuItemWrapperICS$CollapsibleActionViewWrapper",
+      "android/support/v7/view/menu/MenuItemWrapperICS$OnActionExpandListenerWrapper": "androidx/view/menu/MenuItemWrapperICS$OnActionExpandListenerWrapper",
+      "android/support/v7/view/menu/MenuItemWrapperICS$OnMenuItemClickListenerWrapper": "androidx/view/menu/MenuItemWrapperICS$OnMenuItemClickListenerWrapper",
+      "android/support/v7/view/menu/MenuItemWrapperJB$ActionProviderWrapperJB": "androidx/view/menu/MenuItemWrapperJB$ActionProviderWrapperJB",
+      "android/support/v7/view/menu/MenuItemWrapperJB": "androidx/view/menu/MenuItemWrapperJB",
+      "android/support/v7/view/menu/MenuPopupHelper$1": "androidx/view/menu/MenuPopupHelper$1",
+      "android/support/v7/view/menu/StandardMenuPopup": "androidx/view/menu/StandardMenuPopup",
+      "android/support/v7/view/menu/MenuWrapperICS": "androidx/view/menu/MenuWrapperICS",
+      "android/support/v7/view/menu/SubMenuWrapperICS": "androidx/view/menu/SubMenuWrapperICS",
+      "android/support/v7/view/menu/StandardMenuPopup$1": "androidx/view/menu/StandardMenuPopup$1",
+      "android/support/v7/view/menu/StandardMenuPopup$2": "androidx/view/menu/StandardMenuPopup$2",
+      "android/support/v7/widget/AbsActionBarView$1": "androidx/widget/AbsActionBarView$1",
+      "android/support/v7/widget/AbsActionBarView": "androidx/widget/AbsActionBarView",
+      "android/support/v7/widget/AbsActionBarView$VisibilityAnimListener": "androidx/widget/AbsActionBarView$VisibilityAnimListener",
+      "android/support/v7/widget/ActionMenuPresenter": "androidx/widget/ActionMenuPresenter",
+      "android/support/v7/widget/ActionBarBackgroundDrawable": "androidx/widget/ActionBarBackgroundDrawable",
+      "android/support/v7/widget/ActionBarBackgroundDrawableV21": "androidx/widget/ActionBarBackgroundDrawableV21",
+      "android/support/v7/widget/ActionBarContextView$1": "androidx/widget/ActionBarContextView$1",
+      "android/support/v7/widget/ActionBarOverlayLayout$1": "androidx/widget/ActionBarOverlayLayout$1",
+      "android/support/v7/widget/ActionBarOverlayLayout$2": "androidx/widget/ActionBarOverlayLayout$2",
+      "android/support/v7/widget/ActionBarOverlayLayout$3": "androidx/widget/ActionBarOverlayLayout$3",
+      "android/support/v7/widget/ActionBarOverlayLayout$LayoutParams": "androidx/widget/ActionBarOverlayLayout$LayoutParams",
+      "android/support/v7/widget/ActionMenuPresenter$ActionButtonSubmenu": "androidx/widget/ActionMenuPresenter$ActionButtonSubmenu",
+      "android/support/v7/widget/ActionMenuPresenter$OverflowMenuButton": "androidx/widget/ActionMenuPresenter$OverflowMenuButton",
+      "android/support/v7/widget/ActionMenuPresenter$PopupPresenterCallback": "androidx/widget/ActionMenuPresenter$PopupPresenterCallback",
+      "android/support/v7/widget/ActionMenuPresenter$ActionMenuPopupCallback": "androidx/widget/ActionMenuPresenter$ActionMenuPopupCallback",
+      "android/support/v7/widget/ActionMenuPresenter$OpenOverflowRunnable": "androidx/widget/ActionMenuPresenter$OpenOverflowRunnable",
+      "android/support/v7/widget/ActionMenuPresenter$OverflowPopup": "androidx/widget/ActionMenuPresenter$OverflowPopup",
+      "android/support/v7/widget/ActionMenuPresenter$OverflowMenuButton$1": "androidx/widget/ActionMenuPresenter$OverflowMenuButton$1",
+      "android/support/v7/widget/ActionMenuPresenter$SavedState$1": "androidx/widget/ActionMenuPresenter$SavedState$1",
+      "android/support/v7/widget/ActionMenuPresenter$SavedState": "androidx/widget/ActionMenuPresenter$SavedState",
+      "android/support/v4/view/ActionProvider$SubUiVisibilityListener": "androidx/view/ActionProvider$SubUiVisibilityListener",
+      "android/support/v7/widget/ActionMenuView$LayoutParams": "androidx/widget/ActionMenuView$LayoutParams",
+      "android/support/v7/widget/ActionMenuView$ActionMenuPresenterCallback": "androidx/widget/ActionMenuView$ActionMenuPresenterCallback",
+      "android/support/v7/widget/ActionMenuView$MenuBuilderCallback": "androidx/widget/ActionMenuView$MenuBuilderCallback",
+      "android/support/v7/widget/ActionMenuView$OnMenuItemClickListener": "androidx/widget/ActionMenuView$OnMenuItemClickListener",
+      "android/support/v7/widget/ActivityChooserModel$ActivityChooserModelClient": "androidx/widget/ActivityChooserModel$ActivityChooserModelClient",
+      "android/support/v7/widget/ActivityChooserModel": "androidx/widget/ActivityChooserModel",
+      "android/support/v7/widget/ActivityChooserModel$ActivityResolveInfo": "androidx/widget/ActivityChooserModel$ActivityResolveInfo",
+      "android/support/v7/widget/ActivityChooserModel$ActivitySorter": "androidx/widget/ActivityChooserModel$ActivitySorter",
+      "android/support/v7/widget/ActivityChooserModel$HistoricalRecord": "androidx/widget/ActivityChooserModel$HistoricalRecord",
+      "android/support/v7/widget/ActivityChooserModel$DefaultSorter": "androidx/widget/ActivityChooserModel$DefaultSorter",
+      "android/support/v7/widget/ActivityChooserModel$OnChooseActivityListener": "androidx/widget/ActivityChooserModel$OnChooseActivityListener",
+      "android/support/v7/widget/ActivityChooserModel$PersistHistoryAsyncTask": "androidx/widget/ActivityChooserModel$PersistHistoryAsyncTask",
+      "android/support/v7/widget/ActivityChooserView$1": "androidx/widget/ActivityChooserView$1",
+      "android/support/v7/widget/ActivityChooserView": "androidx/widget/ActivityChooserView",
+      "android/support/v7/widget/ActivityChooserView$ActivityChooserViewAdapter": "androidx/widget/ActivityChooserView$ActivityChooserViewAdapter",
+      "android/support/v7/widget/ActivityChooserView$2": "androidx/widget/ActivityChooserView$2",
+      "android/support/v7/widget/ListPopupWindow": "androidx/widget/ListPopupWindow",
+      "android/support/v7/widget/ActivityChooserView$3": "androidx/widget/ActivityChooserView$3",
+      "android/support/v7/widget/ActivityChooserView$4": "androidx/widget/ActivityChooserView$4",
+      "android/support/v7/widget/ActivityChooserView$5": "androidx/widget/ActivityChooserView$5",
+      "android/support/v7/appcompat/R$string": "androidx/appcompat/R$string",
+      "android/support/v7/widget/ActivityChooserView$Callbacks": "androidx/widget/ActivityChooserView$Callbacks",
+      "android/support/v7/widget/ActivityChooserView$InnerLayout": "androidx/widget/ActivityChooserView$InnerLayout",
+      "android/support/v7/widget/AlertDialogLayout": "androidx/widget/AlertDialogLayout",
+      "android/support/v4/view/TintableBackgroundView": "androidx/view/TintableBackgroundView",
+      "android/support/v7/widget/AppCompatBackgroundHelper": "androidx/widget/AppCompatBackgroundHelper",
+      "android/support/v7/widget/AppCompatTextHelper": "androidx/widget/AppCompatTextHelper",
+      "android/support/v7/widget/AppCompatHintHelper": "androidx/widget/AppCompatHintHelper",
+      "android/support/v7/widget/TintInfo": "androidx/widget/TintInfo",
+      "android/support/v4/widget/AutoSizeableTextView": "androidx/widget/AutoSizeableTextView",
+      "android/support/v4/widget/TintableCompoundButton": "androidx/widget/TintableCompoundButton",
+      "android/support/v7/widget/AppCompatCompoundButtonHelper": "androidx/widget/AppCompatCompoundButtonHelper",
+      "android/support/v7/widget/AppCompatCompoundButtonHelper$DirectSetButtonDrawableInterface": "androidx/widget/AppCompatCompoundButtonHelper$DirectSetButtonDrawableInterface",
+      "android/support/v4/widget/CompoundButtonCompat": "androidx/widget/CompoundButtonCompat",
+      "android/support/v7/widget/AppCompatDrawableManager$AvdcInflateDelegate": "androidx/widget/AppCompatDrawableManager$AvdcInflateDelegate",
+      "android/support/v7/widget/AppCompatDrawableManager$InflateDelegate": "androidx/widget/AppCompatDrawableManager$InflateDelegate",
+      "android/support/v7/widget/AppCompatDrawableManager$ColorFilterLruCache": "androidx/widget/AppCompatDrawableManager$ColorFilterLruCache",
+      "android/support/v7/widget/AppCompatDrawableManager$VdcInflateDelegate": "androidx/widget/AppCompatDrawableManager$VdcInflateDelegate",
+      "android/support/v7/appcompat/R$drawable": "androidx/appcompat/R$drawable",
+      "android/support/v4/util/LongSparseArray": "androidx/util/LongSparseArray",
+      "android/support/v7/widget/ThemeUtils": "androidx/widget/ThemeUtils",
+      "android/support/v7/widget/WithHint": "androidx/widget/WithHint",
+      "android/support/v4/widget/TintableImageSourceView": "androidx/widget/TintableImageSourceView",
+      "android/support/v7/widget/AppCompatImageHelper": "androidx/widget/AppCompatImageHelper",
+      "android/support/v4/widget/ImageViewCompat": "androidx/widget/ImageViewCompat",
+      "android/support/v7/widget/AppCompatPopupWindow": "androidx/widget/AppCompatPopupWindow",
+      "android/support/v7/widget/AppCompatProgressBarHelper": "androidx/widget/AppCompatProgressBarHelper",
+      "android/support/v4/graphics/drawable/WrappedDrawable": "androidx/graphics/drawable/WrappedDrawable",
+      "android/support/v7/widget/AppCompatSeekBarHelper": "androidx/widget/AppCompatSeekBarHelper",
+      "android/support/v7/widget/AppCompatSpinner$1": "androidx/widget/AppCompatSpinner$1",
+      "android/support/v7/widget/AppCompatSpinner$DropdownPopup": "androidx/widget/AppCompatSpinner$DropdownPopup",
+      "android/support/v7/widget/AppCompatSpinner$DropDownAdapter": "androidx/widget/AppCompatSpinner$DropDownAdapter",
+      "android/support/v7/widget/ThemedSpinnerAdapter": "androidx/widget/ThemedSpinnerAdapter",
+      "android/support/v7/widget/AppCompatSpinner$DropdownPopup$1": "androidx/widget/AppCompatSpinner$DropdownPopup$1",
+      "android/support/v7/widget/AppCompatSpinner$DropdownPopup$2": "androidx/widget/AppCompatSpinner$DropdownPopup$2",
+      "android/support/v7/widget/AppCompatSpinner$DropdownPopup$3": "androidx/widget/AppCompatSpinner$DropdownPopup$3",
+      "android/support/v7/widget/AppCompatTextHelper$1": "androidx/widget/AppCompatTextHelper$1",
+      "android/support/v4/content/res/ResourcesCompat$FontCallback": "androidx/content/res/ResourcesCompat$FontCallback",
+      "android/support/v7/widget/AppCompatTextViewAutoSizeHelper": "androidx/widget/AppCompatTextViewAutoSizeHelper",
+      "android/support/v7/widget/AppCompatTextHelperV17": "androidx/widget/AppCompatTextHelperV17",
+      "android/support/v7/widget/ButtonBarLayout": "androidx/widget/ButtonBarLayout",
+      "android/support/v7/widget/DialogTitle": "androidx/widget/DialogTitle",
+      "android/support/v7/widget/DropDownListView$GateKeeperDrawable": "androidx/widget/DropDownListView$GateKeeperDrawable",
+      "android/support/v7/widget/DropDownListView": "androidx/widget/DropDownListView",
+      "android/support/v7/widget/FitWindowsFrameLayout": "androidx/widget/FitWindowsFrameLayout",
+      "android/support/v7/widget/FitWindowsLinearLayout": "androidx/widget/FitWindowsLinearLayout",
+      "android/support/v7/widget/ForwardingListener$DisallowIntercept": "androidx/widget/ForwardingListener$DisallowIntercept",
+      "android/support/v7/widget/ForwardingListener$TriggerLongPress": "androidx/widget/ForwardingListener$TriggerLongPress",
+      "android/support/v7/widget/LinearLayoutCompat$DividerMode": "androidx/widget/LinearLayoutCompat$DividerMode",
+      "android/support/v7/widget/LinearLayoutCompat$OrientationMode": "androidx/widget/LinearLayoutCompat$OrientationMode",
+      "android/support/v7/widget/ListPopupWindow$1": "androidx/widget/ListPopupWindow$1",
+      "android/support/v7/widget/ListPopupWindow$2": "androidx/widget/ListPopupWindow$2",
+      "android/support/v7/widget/ListPopupWindow$3": "androidx/widget/ListPopupWindow$3",
+      "android/support/v7/widget/ListPopupWindow$ListSelectorHider": "androidx/widget/ListPopupWindow$ListSelectorHider",
+      "android/support/v7/widget/ListPopupWindow$PopupDataSetObserver": "androidx/widget/ListPopupWindow$PopupDataSetObserver",
+      "android/support/v7/widget/ListPopupWindow$PopupScrollListener": "androidx/widget/ListPopupWindow$PopupScrollListener",
+      "android/support/v7/widget/ListPopupWindow$ResizePopupRunnable": "androidx/widget/ListPopupWindow$ResizePopupRunnable",
+      "android/support/v7/widget/ListPopupWindow$PopupTouchInterceptor": "androidx/widget/ListPopupWindow$PopupTouchInterceptor",
+      "android/support/v7/widget/MenuPopupWindow$MenuDropDownListView": "androidx/widget/MenuPopupWindow$MenuDropDownListView",
+      "android/support/v7/widget/PopupMenu$1": "androidx/widget/PopupMenu$1",
+      "android/support/v7/widget/PopupMenu": "androidx/widget/PopupMenu",
+      "android/support/v7/widget/PopupMenu$OnMenuItemClickListener": "androidx/widget/PopupMenu$OnMenuItemClickListener",
+      "android/support/v7/widget/PopupMenu$2": "androidx/widget/PopupMenu$2",
+      "android/support/v7/widget/PopupMenu$OnDismissListener": "androidx/widget/PopupMenu$OnDismissListener",
+      "android/support/v7/widget/PopupMenu$3": "androidx/widget/PopupMenu$3",
+      "android/support/annotation/MenuRes": "androidx/annotation/MenuRes",
+      "android/support/v7/widget/ResourcesWrapper": "androidx/widget/ResourcesWrapper",
+      "android/support/v7/widget/RtlSpacingHelper": "androidx/widget/RtlSpacingHelper",
+      "android/support/v7/widget/ScrollingTabContainerView$1": "androidx/widget/ScrollingTabContainerView$1",
+      "android/support/v7/widget/ScrollingTabContainerView$TabAdapter": "androidx/widget/ScrollingTabContainerView$TabAdapter",
+      "android/support/v7/widget/ScrollingTabContainerView$TabView": "androidx/widget/ScrollingTabContainerView$TabView",
+      "android/support/v7/widget/ScrollingTabContainerView$TabClickListener": "androidx/widget/ScrollingTabContainerView$TabClickListener",
+      "android/support/v7/widget/ScrollingTabContainerView$VisibilityAnimListener": "androidx/widget/ScrollingTabContainerView$VisibilityAnimListener",
+      "android/support/v7/widget/SearchView$1": "androidx/widget/SearchView$1",
+      "android/support/v7/widget/SearchView": "androidx/widget/SearchView",
+      "android/support/v7/widget/SearchView$10": "androidx/widget/SearchView$10",
+      "android/support/v7/widget/SearchView$2": "androidx/widget/SearchView$2",
+      "android/support/v7/widget/SuggestionsAdapter": "androidx/widget/SuggestionsAdapter",
+      "android/support/v7/widget/SearchView$3": "androidx/widget/SearchView$3",
+      "android/support/v7/widget/SearchView$4": "androidx/widget/SearchView$4",
+      "android/support/v7/widget/SearchView$5": "androidx/widget/SearchView$5",
+      "android/support/v7/widget/SearchView$SearchAutoComplete": "androidx/widget/SearchView$SearchAutoComplete",
+      "android/support/v7/widget/SearchView$6": "androidx/widget/SearchView$6",
+      "android/support/v7/widget/SearchView$7": "androidx/widget/SearchView$7",
+      "android/support/v7/widget/SearchView$8": "androidx/widget/SearchView$8",
+      "android/support/v7/widget/SearchView$9": "androidx/widget/SearchView$9",
+      "android/support/v7/widget/SearchView$AutoCompleteTextViewReflector": "androidx/widget/SearchView$AutoCompleteTextViewReflector",
+      "android/support/v7/widget/SearchView$OnCloseListener": "androidx/widget/SearchView$OnCloseListener",
+      "android/support/v7/widget/SearchView$OnQueryTextListener": "androidx/widget/SearchView$OnQueryTextListener",
+      "android/support/v7/widget/SearchView$OnSuggestionListener": "androidx/widget/SearchView$OnSuggestionListener",
+      "android/support/v7/widget/SearchView$SavedState$1": "androidx/widget/SearchView$SavedState$1",
+      "android/support/v7/widget/SearchView$SavedState": "androidx/widget/SearchView$SavedState",
+      "android/support/v7/widget/SearchView$SearchAutoComplete$1": "androidx/widget/SearchView$SearchAutoComplete$1",
+      "android/support/v7/widget/SearchView$UpdatableTouchDelegate": "androidx/widget/SearchView$UpdatableTouchDelegate",
+      "android/support/v7/widget/ShareActionProvider$OnShareTargetSelectedListener": "androidx/widget/ShareActionProvider$OnShareTargetSelectedListener",
+      "android/support/v7/widget/ShareActionProvider": "androidx/widget/ShareActionProvider",
+      "android/support/v7/widget/ShareActionProvider$ShareActivityChooserModelPolicy": "androidx/widget/ShareActionProvider$ShareActivityChooserModelPolicy",
+      "android/support/v7/widget/ShareActionProvider$ShareMenuItemOnMenuItemClickListener": "androidx/widget/ShareActionProvider$ShareMenuItemOnMenuItemClickListener",
+      "android/support/v7/widget/SuggestionsAdapter$ChildViewCache": "androidx/widget/SuggestionsAdapter$ChildViewCache",
+      "android/support/v7/widget/SwitchCompat$1": "androidx/widget/SwitchCompat$1",
+      "android/support/v7/widget/ThemedSpinnerAdapter$Helper": "androidx/widget/ThemedSpinnerAdapter$Helper",
+      "android/support/v7/widget/TintResources": "androidx/widget/TintResources",
+      "android/support/v7/widget/Toolbar$1": "androidx/widget/Toolbar$1",
+      "android/support/v7/widget/Toolbar$2": "androidx/widget/Toolbar$2",
+      "android/support/v7/widget/Toolbar$3": "androidx/widget/Toolbar$3",
+      "android/support/v7/widget/Toolbar$ExpandedActionViewMenuPresenter": "androidx/widget/Toolbar$ExpandedActionViewMenuPresenter",
+      "android/support/v7/widget/Toolbar$LayoutParams": "androidx/widget/Toolbar$LayoutParams",
+      "android/support/v7/widget/Toolbar$SavedState$1": "androidx/widget/Toolbar$SavedState$1",
+      "android/support/v7/widget/Toolbar$SavedState": "androidx/widget/Toolbar$SavedState",
+      "android/support/v4/view/MarginLayoutParamsCompat": "androidx/view/MarginLayoutParamsCompat",
+      "android/support/v7/widget/ToolbarWidgetWrapper$1": "androidx/widget/ToolbarWidgetWrapper$1",
+      "android/support/v7/widget/ToolbarWidgetWrapper$2": "androidx/widget/ToolbarWidgetWrapper$2",
+      "android/support/v7/widget/TooltipCompatHandler": "androidx/widget/TooltipCompatHandler",
+      "android/support/v7/widget/TooltipCompatHandler$1": "androidx/widget/TooltipCompatHandler$1",
+      "android/support/v7/widget/TooltipCompatHandler$2": "androidx/widget/TooltipCompatHandler$2",
+      "android/support/v7/widget/TooltipPopup": "androidx/widget/TooltipPopup",
+      "android/support/v7/widget/ViewStubCompat$OnInflateListener": "androidx/widget/ViewStubCompat$OnInflateListener",
+      "android/support/content/ContentPager$1": "androidx/util/contentpaging/ContentPager$1",
+      "android/support/content/ContentPager$QueryRunner$Callback": "androidx/util/contentpaging/ContentPager$QueryRunner$Callback",
+      "android/support/content/ContentPager": "androidx/util/contentpaging/ContentPager",
+      "android/support/content/ContentPager$QueryRunner": "androidx/util/contentpaging/ContentPager$QueryRunner",
+      "android/support/content/Query": "androidx/util/contentpaging/Query",
+      "android/support/annotation/WorkerThread": "androidx/annotation/WorkerThread",
+      "android/support/annotation/MainThread": "androidx/annotation/MainThread",
+      "android/support/content/ContentPager$ContentCallback": "androidx/util/contentpaging/ContentPager$ContentCallback",
+      "android/support/content/ContentPager$CursorCache": "androidx/util/contentpaging/ContentPager$CursorCache",
+      "android/support/annotation/GuardedBy": "androidx/annotation/GuardedBy",
+      "android/support/content/ContentPager$CursorDisposition": "androidx/util/contentpaging/ContentPager$CursorDisposition",
+      "android/support/content/ContentPager$CursorView": "androidx/util/contentpaging/ContentPager$CursorView",
+      "android/support/content/ContentPager$Stats": "androidx/util/contentpaging/ContentPager$Stats",
+      "android/support/annotation/RequiresPermission$Read": "androidx/annotation/RequiresPermission$Read",
+      "android/support/content/InMemoryCursor": "androidx/util/contentpaging/InMemoryCursor",
+      "android/support/content/InMemoryCursor$ObserverRelay": "androidx/util/contentpaging/InMemoryCursor$ObserverRelay",
+      "android/support/content/LoaderQueryRunner$1$1": "androidx/util/contentpaging/LoaderQueryRunner$1$1",
+      "android/support/content/LoaderQueryRunner$1": "androidx/util/contentpaging/LoaderQueryRunner$1",
+      "android/support/content/LoaderQueryRunner": "androidx/util/contentpaging/LoaderQueryRunner",
+      "android/arch/lifecycle/LifecycleRegistry$1": "androidx/lifecycle/LifecycleRegistry$1",
+      "android/arch/lifecycle/LifecycleRegistry": "androidx/lifecycle/LifecycleRegistry",
+      "android/arch/lifecycle/Lifecycle$State": "androidx/lifecycle/Lifecycle$State",
+      "android/arch/lifecycle/Lifecycle": "androidx/lifecycle/Lifecycle",
+      "android/arch/lifecycle/Lifecycle$Event": "androidx/lifecycle/Lifecycle$Event",
+      "android/arch/lifecycle/LifecycleRegistry$ObserverWithState": "androidx/lifecycle/LifecycleRegistry$ObserverWithState",
+      "android/arch/lifecycle/GenericLifecycleObserver": "androidx/lifecycle/GenericLifecycleObserver",
+      "android/arch/lifecycle/LifecycleObserver": "androidx/lifecycle/LifecycleObserver",
+      "android/arch/lifecycle/Lifecycling": "androidx/lifecycle/Lifecycling",
+      "android/arch/lifecycle/LifecycleOwner": "androidx/lifecycle/LifecycleOwner",
+      "android/arch/core/internal/SafeIterableMap$IteratorWithAdditions": "androidx/core/internal/SafeIterableMap$IteratorWithAdditions",
+      "android/arch/core/internal/SafeIterableMap": "androidx/core/internal/SafeIterableMap",
+      "android/arch/core/internal/FastSafeIterableMap": "androidx/core/internal/FastSafeIterableMap",
+      "android/arch/lifecycle/LifecycleRegistryOwner": "androidx/lifecycle/LifecycleRegistryOwner",
+      "android/arch/lifecycle/ReportFragment$ActivityInitializationListener": "androidx/lifecycle/ReportFragment$ActivityInitializationListener",
+      "android/arch/lifecycle/ReportFragment": "androidx/lifecycle/ReportFragment",
+      "android/arch/lifecycle/EmptyActivityLifecycleCallbacks": "androidx/lifecycle/EmptyActivityLifecycleCallbacks",
+      "android/arch/lifecycle/HolderFragment$HolderFragmentManager$1": "androidx/lifecycle/HolderFragment$HolderFragmentManager$1",
+      "android/arch/lifecycle/HolderFragment$HolderFragmentManager": "androidx/lifecycle/HolderFragment$HolderFragmentManager",
+      "android/arch/lifecycle/HolderFragment": "androidx/lifecycle/HolderFragment",
+      "android/arch/lifecycle/HolderFragment$HolderFragmentManager$2": "androidx/lifecycle/HolderFragment$HolderFragmentManager$2",
+      "android/support/v4/app/FragmentManager$FragmentLifecycleCallbacks": "androidx/app/FragmentManager$FragmentLifecycleCallbacks",
+      "android/arch/lifecycle/ViewModelStoreOwner": "androidx/lifecycle/ViewModelStoreOwner",
+      "android/arch/lifecycle/ViewModelStore": "androidx/lifecycle/ViewModelStore",
+      "android/arch/lifecycle/LifecycleDispatcher$DestructionReportFragment": "androidx/lifecycle/LifecycleDispatcher$DestructionReportFragment",
+      "android/arch/lifecycle/LifecycleDispatcher": "androidx/lifecycle/LifecycleDispatcher",
+      "android/arch/lifecycle/LifecycleDispatcher$DispatcherActivityCallback": "androidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback",
+      "android/arch/lifecycle/LifecycleDispatcher$FragmentCallback": "androidx/lifecycle/LifecycleDispatcher$FragmentCallback",
+      "android/arch/lifecycle/LifecycleService": "androidx/lifecycle/LifecycleService",
+      "android/arch/lifecycle/ServiceLifecycleDispatcher": "androidx/lifecycle/ServiceLifecycleDispatcher",
+      "android/arch/lifecycle/ProcessLifecycleOwner$1": "androidx/lifecycle/ProcessLifecycleOwner$1",
+      "android/arch/lifecycle/ProcessLifecycleOwner": "androidx/lifecycle/ProcessLifecycleOwner",
+      "android/arch/lifecycle/ProcessLifecycleOwner$2": "androidx/lifecycle/ProcessLifecycleOwner$2",
+      "android/arch/lifecycle/ProcessLifecycleOwner$3": "androidx/lifecycle/ProcessLifecycleOwner$3",
+      "android/arch/lifecycle/ProcessLifecycleOwnerInitializer": "androidx/lifecycle/ProcessLifecycleOwnerInitializer",
+      "android/arch/lifecycle/ServiceLifecycleDispatcher$DispatchRunnable": "androidx/lifecycle/ServiceLifecycleDispatcher$DispatchRunnable",
+      "android/arch/lifecycle/ViewModelProviders$DefaultFactory": "androidx/lifecycle/ViewModelProviders$DefaultFactory",
+      "android/arch/lifecycle/ViewModelProvider$AndroidViewModelFactory": "androidx/lifecycle/ViewModelProvider$AndroidViewModelFactory",
+      "android/arch/lifecycle/ViewModelProviders": "androidx/lifecycle/ViewModelProviders",
+      "android/arch/lifecycle/ViewModelProvider": "androidx/lifecycle/ViewModelProvider",
+      "android/arch/lifecycle/ViewModelProvider$Factory": "androidx/lifecycle/ViewModelProvider$Factory",
+      "android/arch/lifecycle/ViewModelStores": "androidx/lifecycle/ViewModelStores",
+      "android/support/v4/media/AudioAttributesCompat$1": "androidx/media/AudioAttributesCompat$1",
+      "android/support/v4/media/AudioAttributesCompat": "androidx/media/AudioAttributesCompat",
+      "android/support/v4/media/AudioAttributesCompat$AttributeContentType": "androidx/media/AudioAttributesCompat$AttributeContentType",
+      "android/support/v4/media/AudioAttributesCompat$AttributeUsage": "androidx/media/AudioAttributesCompat$AttributeUsage",
+      "android/support/v4/media/AudioAttributesCompat$AudioManagerHidden": "androidx/media/AudioAttributesCompat$AudioManagerHidden",
+      "android/support/v4/media/AudioAttributesCompat$Builder": "androidx/media/AudioAttributesCompat$Builder",
+      "android/support/v4/media/AudioAttributesCompatApi21$Wrapper": "androidx/media/AudioAttributesCompatApi21$Wrapper",
+      "android/support/v4/media/AudioAttributesCompatApi21": "androidx/media/AudioAttributesCompatApi21",
+      "android/support/v4/media/MediaBrowserCompat$CallbackHandler": "androidx/media/MediaBrowserCompat$CallbackHandler",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserServiceCallbackImpl": "androidx/media/MediaBrowserCompat$MediaBrowserServiceCallbackImpl",
+      "android/support/v4/media/MediaBrowserCompat": "androidx/media/MediaBrowserCompat",
+      "android/support/v4/media/session/MediaSessionCompat$Token": "androidx/media/session/MediaSessionCompat$Token",
+      "android/support/v4/media/session/MediaSessionCompat": "androidx/media/session/MediaSessionCompat",
+      "android/support/v4/media/MediaBrowserCompat$ConnectionCallback$ConnectionCallbackInternal": "androidx/media/MediaBrowserCompat$ConnectionCallback$ConnectionCallbackInternal",
+      "android/support/v4/media/MediaBrowserCompat$ConnectionCallback": "androidx/media/MediaBrowserCompat$ConnectionCallback",
+      "android/support/v4/media/MediaBrowserCompat$ConnectionCallback$StubApi21": "androidx/media/MediaBrowserCompat$ConnectionCallback$StubApi21",
+      "android/support/v4/media/MediaBrowserCompatApi21$ConnectionCallback": "androidx/media/MediaBrowserCompatApi21$ConnectionCallback",
+      "android/support/v4/media/MediaBrowserCompatApi21": "androidx/media/MediaBrowserCompatApi21",
+      "android/support/v4/media/MediaBrowserCompat$CustomActionCallback": "androidx/media/MediaBrowserCompat$CustomActionCallback",
+      "android/support/v4/media/MediaBrowserCompat$CustomActionResultReceiver": "androidx/media/MediaBrowserCompat$CustomActionResultReceiver",
+      "android/support/v4/os/ResultReceiver": "androidx/os/ResultReceiver",
+      "android/support/v4/media/MediaBrowserCompat$ItemCallback$StubApi23": "androidx/media/MediaBrowserCompat$ItemCallback$StubApi23",
+      "android/support/v4/media/MediaBrowserCompatApi23$ItemCallback": "androidx/media/MediaBrowserCompatApi23$ItemCallback",
+      "android/support/v4/media/MediaBrowserCompat$ItemCallback": "androidx/media/MediaBrowserCompat$ItemCallback",
+      "android/support/v4/media/MediaBrowserCompat$MediaItem": "androidx/media/MediaBrowserCompat$MediaItem",
+      "android/support/v4/media/MediaBrowserCompatApi23": "androidx/media/MediaBrowserCompatApi23",
+      "android/support/v4/media/MediaBrowserCompat$ItemReceiver": "androidx/media/MediaBrowserCompat$ItemReceiver",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImpl": "androidx/media/MediaBrowserCompat$MediaBrowserImpl",
+      "android/support/v4/media/MediaBrowserCompat$SubscriptionCallback": "androidx/media/MediaBrowserCompat$SubscriptionCallback",
+      "android/support/v4/media/MediaBrowserCompat$SearchCallback": "androidx/media/MediaBrowserCompat$SearchCallback",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi21$1": "androidx/media/MediaBrowserCompat$MediaBrowserImplApi21$1",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi21": "androidx/media/MediaBrowserCompat$MediaBrowserImplApi21",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi21$2": "androidx/media/MediaBrowserCompat$MediaBrowserImplApi21$2",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi21$3": "androidx/media/MediaBrowserCompat$MediaBrowserImplApi21$3",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi21$4": "androidx/media/MediaBrowserCompat$MediaBrowserImplApi21$4",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi21$5": "androidx/media/MediaBrowserCompat$MediaBrowserImplApi21$5",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi21$6": "androidx/media/MediaBrowserCompat$MediaBrowserImplApi21$6",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi21$7": "androidx/media/MediaBrowserCompat$MediaBrowserImplApi21$7",
+      "android/support/v4/media/MediaBrowserCompat$Subscription": "androidx/media/MediaBrowserCompat$Subscription",
+      "android/support/v4/media/MediaBrowserCompat$ServiceBinderWrapper": "androidx/media/MediaBrowserCompat$ServiceBinderWrapper",
+      "android/support/v4/media/MediaBrowserCompat$SearchResultReceiver": "androidx/media/MediaBrowserCompat$SearchResultReceiver",
+      "android/support/v4/media/session/IMediaSession$Stub": "androidx/media/session/IMediaSession$Stub",
+      "android/support/v4/media/session/IMediaSession": "androidx/media/session/IMediaSession",
+      "android/support/v4/app/BundleCompat": "androidx/app/BundleCompat",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi23": "androidx/media/MediaBrowserCompat$MediaBrowserImplApi23",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi26": "androidx/media/MediaBrowserCompat$MediaBrowserImplApi26",
+      "android/support/v4/media/MediaBrowserCompatApi26": "androidx/media/MediaBrowserCompatApi26",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplBase$1": "androidx/media/MediaBrowserCompat$MediaBrowserImplBase$1",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplBase": "androidx/media/MediaBrowserCompat$MediaBrowserImplBase",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplBase$MediaServiceConnection": "androidx/media/MediaBrowserCompat$MediaBrowserImplBase$MediaServiceConnection",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplBase$2": "androidx/media/MediaBrowserCompat$MediaBrowserImplBase$2",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplBase$3": "androidx/media/MediaBrowserCompat$MediaBrowserImplBase$3",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplBase$4": "androidx/media/MediaBrowserCompat$MediaBrowserImplBase$4",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplBase$5": "androidx/media/MediaBrowserCompat$MediaBrowserImplBase$5",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplBase$6": "androidx/media/MediaBrowserCompat$MediaBrowserImplBase$6",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplBase$MediaServiceConnection$1": "androidx/media/MediaBrowserCompat$MediaBrowserImplBase$MediaServiceConnection$1",
+      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplBase$MediaServiceConnection$2": "androidx/media/MediaBrowserCompat$MediaBrowserImplBase$MediaServiceConnection$2",
+      "android/support/v4/media/MediaBrowserCompat$MediaItem$1": "androidx/media/MediaBrowserCompat$MediaItem$1",
+      "android/support/v4/media/MediaBrowserCompat$MediaItem$Flags": "androidx/media/MediaBrowserCompat$MediaItem$Flags",
+      "android/support/v4/media/MediaBrowserCompatApi21$MediaItem": "androidx/media/MediaBrowserCompatApi21$MediaItem",
+      "android/support/v4/media/MediaBrowserCompatUtils": "androidx/media/MediaBrowserCompatUtils",
+      "android/support/v4/media/MediaBrowserCompat$SubscriptionCallback$StubApi21": "androidx/media/MediaBrowserCompat$SubscriptionCallback$StubApi21",
+      "android/support/v4/media/MediaBrowserCompatApi21$SubscriptionCallback": "androidx/media/MediaBrowserCompatApi21$SubscriptionCallback",
+      "android/support/v4/media/MediaBrowserCompat$SubscriptionCallback$StubApi26": "androidx/media/MediaBrowserCompat$SubscriptionCallback$StubApi26",
+      "android/support/v4/media/MediaBrowserCompatApi26$SubscriptionCallback": "androidx/media/MediaBrowserCompatApi26$SubscriptionCallback",
+      "android/support/v4/media/MediaBrowserCompatApi21$ConnectionCallbackProxy": "androidx/media/MediaBrowserCompatApi21$ConnectionCallbackProxy",
+      "android/support/v4/media/MediaBrowserCompatApi21$SubscriptionCallbackProxy": "androidx/media/MediaBrowserCompatApi21$SubscriptionCallbackProxy",
+      "android/support/v4/media/MediaBrowserCompatApi23$ItemCallbackProxy": "androidx/media/MediaBrowserCompatApi23$ItemCallbackProxy",
+      "android/support/v4/media/MediaBrowserCompatApi26$SubscriptionCallbackProxy": "androidx/media/MediaBrowserCompatApi26$SubscriptionCallbackProxy",
+      "android/support/v4/media/MediaBrowserProtocol": "androidx/media/MediaBrowserProtocol",
+      "android/support/v4/media/MediaBrowserServiceCompat$1": "androidx/media/MediaBrowserServiceCompat$1",
+      "android/support/v4/media/MediaBrowserServiceCompat$Result": "androidx/media/MediaBrowserServiceCompat$Result",
+      "android/support/v4/media/MediaBrowserServiceCompat": "androidx/media/MediaBrowserServiceCompat",
+      "android/support/v4/media/MediaBrowserServiceCompat$ConnectionRecord": "androidx/media/MediaBrowserServiceCompat$ConnectionRecord",
+      "android/support/v4/media/MediaBrowserServiceCompat$ServiceCallbacks": "androidx/media/MediaBrowserServiceCompat$ServiceCallbacks",
+      "android/support/v4/media/MediaBrowserServiceCompat$2": "androidx/media/MediaBrowserServiceCompat$2",
+      "android/support/v4/media/MediaBrowserServiceCompat$3": "androidx/media/MediaBrowserServiceCompat$3",
+      "android/support/v4/media/MediaBrowserServiceCompat$4": "androidx/media/MediaBrowserServiceCompat$4",
+      "android/support/v4/media/MediaBrowserServiceCompat$BrowserRoot": "androidx/media/MediaBrowserServiceCompat$BrowserRoot",
+      "android/support/v4/media/MediaBrowserServiceCompat$ConnectionRecord$1": "androidx/media/MediaBrowserServiceCompat$ConnectionRecord$1",
+      "android/support/v4/media/MediaBrowserServiceCompat$ServiceHandler": "androidx/media/MediaBrowserServiceCompat$ServiceHandler",
+      "android/support/v4/util/Pair": "androidx/util/Pair",
+      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImpl": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImpl",
+      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi21$1": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi21$1",
+      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi21": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi21",
+      "android/support/v4/media/MediaBrowserServiceCompatApi21": "androidx/media/MediaBrowserServiceCompatApi21",
+      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi21$2": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi21$2",
+      "android/support/v4/media/MediaBrowserServiceCompatApi21$ResultWrapper": "androidx/media/MediaBrowserServiceCompatApi21$ResultWrapper",
+      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi21$3": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi21$3",
+      "android/support/v4/media/MediaBrowserServiceCompatApi21$ServiceCompatProxy": "androidx/media/MediaBrowserServiceCompatApi21$ServiceCompatProxy",
+      "android/support/v4/media/MediaBrowserServiceCompatApi21$BrowserRoot": "androidx/media/MediaBrowserServiceCompatApi21$BrowserRoot",
+      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi23$1": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi23$1",
+      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi23": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi23",
+      "android/support/v4/media/MediaBrowserServiceCompatApi23$ServiceCompatProxy": "androidx/media/MediaBrowserServiceCompatApi23$ServiceCompatProxy",
+      "android/support/v4/media/MediaBrowserServiceCompatApi23": "androidx/media/MediaBrowserServiceCompatApi23",
+      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi26$1": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi26$1",
+      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi26": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi26",
+      "android/support/v4/media/MediaBrowserServiceCompatApi26$ResultWrapper": "androidx/media/MediaBrowserServiceCompatApi26$ResultWrapper",
+      "android/support/v4/media/MediaBrowserServiceCompatApi26": "androidx/media/MediaBrowserServiceCompatApi26",
+      "android/support/v4/media/MediaBrowserServiceCompatApi26$ServiceCompatProxy": "androidx/media/MediaBrowserServiceCompatApi26$ServiceCompatProxy",
+      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplBase$1": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplBase$1",
+      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplBase": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplBase",
+      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplBase$2": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplBase$2",
+      "android/support/v4/media/MediaBrowserServiceCompat$ResultFlags": "androidx/media/MediaBrowserServiceCompat$ResultFlags",
+      "android/support/v4/media/MediaBrowserServiceCompat$ServiceBinderImpl$1": "androidx/media/MediaBrowserServiceCompat$ServiceBinderImpl$1",
+      "android/support/v4/media/MediaBrowserServiceCompat$ServiceBinderImpl": "androidx/media/MediaBrowserServiceCompat$ServiceBinderImpl",
+      "android/support/v4/media/MediaBrowserServiceCompat$ServiceBinderImpl$2": "androidx/media/MediaBrowserServiceCompat$ServiceBinderImpl$2",
+      "android/support/v4/media/MediaBrowserServiceCompat$ServiceBinderImpl$3": "androidx/media/MediaBrowserServiceCompat$ServiceBinderImpl$3",
+      "android/support/v4/media/MediaBrowserServiceCompat$ServiceBinderImpl$4": "androidx/media/MediaBrowserServiceCompat$ServiceBinderImpl$4",
+      "android/support/v4/media/MediaBrowserServiceCompat$ServiceBinderImpl$5": "androidx/media/MediaBrowserServiceCompat$ServiceBinderImpl$5",
+      "android/support/v4/media/MediaBrowserServiceCompat$ServiceBinderImpl$6": "androidx/media/MediaBrowserServiceCompat$ServiceBinderImpl$6",
+      "android/support/v4/media/MediaBrowserServiceCompat$ServiceBinderImpl$7": "androidx/media/MediaBrowserServiceCompat$ServiceBinderImpl$7",
+      "android/support/v4/media/MediaBrowserServiceCompat$ServiceBinderImpl$8": "androidx/media/MediaBrowserServiceCompat$ServiceBinderImpl$8",
+      "android/support/v4/media/MediaBrowserServiceCompat$ServiceBinderImpl$9": "androidx/media/MediaBrowserServiceCompat$ServiceBinderImpl$9",
+      "android/support/v4/media/MediaBrowserServiceCompat$ServiceCallbacksCompat": "androidx/media/MediaBrowserServiceCompat$ServiceCallbacksCompat",
+      "android/support/v4/media/MediaBrowserServiceCompatApi21$MediaBrowserServiceAdaptor": "androidx/media/MediaBrowserServiceCompatApi21$MediaBrowserServiceAdaptor",
+      "android/support/v4/media/MediaBrowserServiceCompatApi23$MediaBrowserServiceAdaptor": "androidx/media/MediaBrowserServiceCompatApi23$MediaBrowserServiceAdaptor",
+      "android/support/v4/media/MediaBrowserServiceCompatApi26$MediaBrowserServiceAdaptor": "androidx/media/MediaBrowserServiceCompatApi26$MediaBrowserServiceAdaptor",
+      "android/support/v4/media/MediaDescriptionCompat$1": "androidx/media/MediaDescriptionCompat$1",
+      "android/support/v4/media/MediaDescriptionCompatApi21": "androidx/media/MediaDescriptionCompatApi21",
+      "android/support/v4/media/MediaDescriptionCompat$Builder": "androidx/media/MediaDescriptionCompat$Builder",
+      "android/support/v4/media/MediaDescriptionCompatApi21$Builder": "androidx/media/MediaDescriptionCompatApi21$Builder",
+      "android/support/v4/media/MediaDescriptionCompatApi23$Builder": "androidx/media/MediaDescriptionCompatApi23$Builder",
+      "android/support/v4/media/MediaDescriptionCompatApi23": "androidx/media/MediaDescriptionCompatApi23",
+      "android/support/v4/media/MediaMetadataCompat$1": "androidx/media/MediaMetadataCompat$1",
+      "android/support/v4/media/MediaMetadataCompat$BitmapKey": "androidx/media/MediaMetadataCompat$BitmapKey",
+      "android/support/v4/media/MediaMetadataCompat$Builder": "androidx/media/MediaMetadataCompat$Builder",
+      "android/support/v4/media/RatingCompat": "androidx/media/RatingCompat",
+      "android/support/v4/media/MediaMetadataCompat$LongKey": "androidx/media/MediaMetadataCompat$LongKey",
+      "android/support/v4/media/MediaMetadataCompat$RatingKey": "androidx/media/MediaMetadataCompat$RatingKey",
+      "android/support/v4/media/MediaMetadataCompat$TextKey": "androidx/media/MediaMetadataCompat$TextKey",
+      "android/support/v4/media/MediaMetadataCompatApi21": "androidx/media/MediaMetadataCompatApi21",
+      "android/support/v4/media/MediaMetadataCompatApi21$Builder": "androidx/media/MediaMetadataCompatApi21$Builder",
+      "android/support/v4/media/ParceledListSliceAdapterApi21": "androidx/media/ParceledListSliceAdapterApi21",
+      "android/support/v4/media/RatingCompat$1": "androidx/media/RatingCompat$1",
+      "android/support/v4/media/RatingCompat$StarStyle": "androidx/media/RatingCompat$StarStyle",
+      "android/support/v4/media/RatingCompat$Style": "androidx/media/RatingCompat$Style",
+      "android/support/v4/media/VolumeProviderCompat$1": "androidx/media/VolumeProviderCompat$1",
+      "android/support/v4/media/VolumeProviderCompatApi21$Delegate": "androidx/media/VolumeProviderCompatApi21$Delegate",
+      "android/support/v4/media/VolumeProviderCompat": "androidx/media/VolumeProviderCompat",
+      "android/support/v4/media/VolumeProviderCompatApi21": "androidx/media/VolumeProviderCompatApi21",
+      "android/support/v4/media/VolumeProviderCompat$Callback": "androidx/media/VolumeProviderCompat$Callback",
+      "android/support/v4/media/VolumeProviderCompat$ControlType": "androidx/media/VolumeProviderCompat$ControlType",
+      "android/support/v4/media/VolumeProviderCompatApi21$1": "androidx/media/VolumeProviderCompatApi21$1",
+      "android/support/v4/media/app/NotificationCompat$DecoratedMediaCustomViewStyle": "androidx/media/app/NotificationCompat$DecoratedMediaCustomViewStyle",
+      "android/support/v4/media/app/NotificationCompat$MediaStyle": "androidx/media/app/NotificationCompat$MediaStyle",
+      "android/support/v4/media/app/NotificationCompat": "androidx/media/app/NotificationCompat",
+      "android/support/v4/app/NotificationCompat$Builder": "androidx/app/NotificationCompat$Builder",
+      "android/support/v4/app/NotificationCompat": "androidx/app/NotificationCompat",
+      "android/support/mediacompat/R$layout": "androidx/mediacompat/R$layout",
+      "android/support/mediacompat/R": "androidx/mediacompat/R",
+      "android/support/mediacompat/R$color": "androidx/mediacompat/R$color",
+      "android/support/mediacompat/R$id": "androidx/mediacompat/R$id",
+      "android/support/v4/app/NotificationBuilderWithBuilderAccessor": "androidx/app/NotificationBuilderWithBuilderAccessor",
+      "android/support/v4/app/NotificationCompat$Style": "androidx/app/NotificationCompat$Style",
+      "android/support/v4/app/NotificationCompat$Action": "androidx/app/NotificationCompat$Action",
+      "android/support/mediacompat/R$integer": "androidx/mediacompat/R$integer",
+      "android/support/v4/media/session/IMediaControllerCallback$Stub$Proxy": "androidx/media/session/IMediaControllerCallback$Stub$Proxy",
+      "android/support/v4/media/session/IMediaControllerCallback": "androidx/media/session/IMediaControllerCallback",
+      "android/support/v4/media/session/IMediaControllerCallback$Stub": "androidx/media/session/IMediaControllerCallback$Stub",
+      "android/support/v4/media/session/MediaSessionCompat$QueueItem": "androidx/media/session/MediaSessionCompat$QueueItem",
+      "android/support/v4/media/session/ParcelableVolumeInfo": "androidx/media/session/ParcelableVolumeInfo",
+      "android/support/v4/media/session/IMediaSession$Stub$Proxy": "androidx/media/session/IMediaSession$Stub$Proxy",
+      "android/support/v4/media/session/MediaSessionCompat$ResultReceiverWrapper": "androidx/media/session/MediaSessionCompat$ResultReceiverWrapper",
+      "android/support/v4/media/session/MediaButtonReceiver$MediaButtonConnectionCallback": "androidx/media/session/MediaButtonReceiver$MediaButtonConnectionCallback",
+      "android/support/v4/media/session/MediaButtonReceiver": "androidx/media/session/MediaButtonReceiver",
+      "android/support/v4/media/session/MediaControllerCompat$Callback$MessageHandler": "androidx/media/session/MediaControllerCompat$Callback$MessageHandler",
+      "android/support/v4/media/session/MediaControllerCompat$PlaybackInfo": "androidx/media/session/MediaControllerCompat$PlaybackInfo",
+      "android/support/v4/media/session/MediaControllerCompat$Callback$StubApi21": "androidx/media/session/MediaControllerCompat$Callback$StubApi21",
+      "android/support/v4/media/session/MediaControllerCompatApi21$Callback": "androidx/media/session/MediaControllerCompatApi21$Callback",
+      "android/support/v4/media/session/MediaControllerCompatApi21": "androidx/media/session/MediaControllerCompatApi21",
+      "android/support/v4/media/session/MediaControllerCompat$Callback$StubCompat": "androidx/media/session/MediaControllerCompat$Callback$StubCompat",
+      "android/support/v4/media/session/MediaControllerCompat$MediaControllerExtraData": "androidx/media/session/MediaControllerCompat$MediaControllerExtraData",
+      "android/support/v4/app/SupportActivity$ExtraData": "androidx/app/SupportActivity$ExtraData",
+      "android/support/v4/app/SupportActivity": "androidx/app/SupportActivity",
+      "android/support/v4/media/session/MediaControllerCompat$MediaControllerImpl": "androidx/media/session/MediaControllerCompat$MediaControllerImpl",
+      "android/support/v4/media/session/MediaControllerCompat$MediaControllerImplApi21$ExtraBinderRequestResultReceiver": "androidx/media/session/MediaControllerCompat$MediaControllerImplApi21$ExtraBinderRequestResultReceiver",
+      "android/support/v4/media/session/MediaControllerCompat$MediaControllerImplApi21": "androidx/media/session/MediaControllerCompat$MediaControllerImplApi21",
+      "android/support/v4/media/session/MediaControllerCompat$MediaControllerImplApi21$ExtraCallback": "androidx/media/session/MediaControllerCompat$MediaControllerImplApi21$ExtraCallback",
+      "android/support/v4/media/session/MediaControllerCompat$TransportControlsApi21": "androidx/media/session/MediaControllerCompat$TransportControlsApi21",
+      "android/support/v4/media/session/MediaControllerCompatApi21$PlaybackInfo": "androidx/media/session/MediaControllerCompatApi21$PlaybackInfo",
+      "android/support/v4/media/session/MediaControllerCompat$MediaControllerImplApi23": "androidx/media/session/MediaControllerCompat$MediaControllerImplApi23",
+      "android/support/v4/media/session/MediaControllerCompat$TransportControlsApi23": "androidx/media/session/MediaControllerCompat$TransportControlsApi23",
+      "android/support/v4/media/session/MediaControllerCompat$MediaControllerImplApi24": "androidx/media/session/MediaControllerCompat$MediaControllerImplApi24",
+      "android/support/v4/media/session/MediaControllerCompat$TransportControlsApi24": "androidx/media/session/MediaControllerCompat$TransportControlsApi24",
+      "android/support/v4/media/session/MediaControllerCompat$MediaControllerImplBase": "androidx/media/session/MediaControllerCompat$MediaControllerImplBase",
+      "android/support/v4/media/session/MediaControllerCompat$TransportControlsBase": "androidx/media/session/MediaControllerCompat$TransportControlsBase",
+      "android/support/v4/media/session/PlaybackStateCompat$CustomAction": "androidx/media/session/PlaybackStateCompat$CustomAction",
+      "android/support/v4/media/session/MediaControllerCompatApi21$TransportControls": "androidx/media/session/MediaControllerCompatApi21$TransportControls",
+      "android/support/v4/media/session/MediaControllerCompatApi23$TransportControls": "androidx/media/session/MediaControllerCompatApi23$TransportControls",
+      "android/support/v4/media/session/MediaControllerCompatApi23": "androidx/media/session/MediaControllerCompatApi23",
+      "android/support/v4/media/session/MediaControllerCompatApi24$TransportControls": "androidx/media/session/MediaControllerCompatApi24$TransportControls",
+      "android/support/v4/media/session/MediaControllerCompatApi24": "androidx/media/session/MediaControllerCompatApi24",
+      "android/support/v4/media/session/MediaControllerCompatApi21$CallbackProxy": "androidx/media/session/MediaControllerCompatApi21$CallbackProxy",
+      "android/support/v4/media/session/MediaSessionCompat$1": "androidx/media/session/MediaSessionCompat$1",
+      "android/support/v4/media/session/MediaSessionCompat$Callback": "androidx/media/session/MediaSessionCompat$Callback",
+      "android/support/v4/media/session/MediaSessionCompat$2": "androidx/media/session/MediaSessionCompat$2",
+      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImpl": "androidx/media/session/MediaSessionCompat$MediaSessionImpl",
+      "android/support/v4/media/session/MediaSessionCompat$Callback$CallbackHandler": "androidx/media/session/MediaSessionCompat$Callback$CallbackHandler",
+      "android/support/v4/media/session/MediaSessionCompat$Callback$StubApi21": "androidx/media/session/MediaSessionCompat$Callback$StubApi21",
+      "android/support/v4/media/session/MediaSessionCompatApi21$Callback": "androidx/media/session/MediaSessionCompatApi21$Callback",
+      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplApi21": "androidx/media/session/MediaSessionCompat$MediaSessionImplApi21",
+      "android/support/v4/media/session/MediaSessionCompatApi21": "androidx/media/session/MediaSessionCompatApi21",
+      "android/support/v4/media/session/MediaSessionCompat$Callback$StubApi23": "androidx/media/session/MediaSessionCompat$Callback$StubApi23",
+      "android/support/v4/media/session/MediaSessionCompatApi23$Callback": "androidx/media/session/MediaSessionCompatApi23$Callback",
+      "android/support/v4/media/session/MediaSessionCompatApi23": "androidx/media/session/MediaSessionCompatApi23",
+      "android/support/v4/media/session/MediaSessionCompat$Callback$StubApi24": "androidx/media/session/MediaSessionCompat$Callback$StubApi24",
+      "android/support/v4/media/session/MediaSessionCompatApi24$Callback": "androidx/media/session/MediaSessionCompatApi24$Callback",
+      "android/support/v4/media/session/MediaSessionCompatApi24": "androidx/media/session/MediaSessionCompatApi24",
+      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplApi18$1": "androidx/media/session/MediaSessionCompat$MediaSessionImplApi18$1",
+      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplApi18": "androidx/media/session/MediaSessionCompat$MediaSessionImplApi18",
+      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplBase": "androidx/media/session/MediaSessionCompat$MediaSessionImplBase",
+      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplBase$MessageHandler": "androidx/media/session/MediaSessionCompat$MediaSessionImplBase$MessageHandler",
+      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplApi19$1": "androidx/media/session/MediaSessionCompat$MediaSessionImplApi19$1",
+      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplApi19": "androidx/media/session/MediaSessionCompat$MediaSessionImplApi19",
+      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplApi21$ExtraSession": "androidx/media/session/MediaSessionCompat$MediaSessionImplApi21$ExtraSession",
+      "android/support/v4/media/session/MediaSessionCompatApi22": "androidx/media/session/MediaSessionCompatApi22",
+      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplBase$1": "androidx/media/session/MediaSessionCompat$MediaSessionImplBase$1",
+      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplBase$Command": "androidx/media/session/MediaSessionCompat$MediaSessionImplBase$Command",
+      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplBase$MediaSessionStub": "androidx/media/session/MediaSessionCompat$MediaSessionImplBase$MediaSessionStub",
+      "android/support/v4/media/session/MediaSessionCompat$OnActiveChangeListener": "androidx/media/session/MediaSessionCompat$OnActiveChangeListener",
+      "android/support/v4/media/session/MediaSessionCompat$QueueItem$1": "androidx/media/session/MediaSessionCompat$QueueItem$1",
+      "android/support/v4/media/session/MediaSessionCompatApi21$QueueItem": "androidx/media/session/MediaSessionCompatApi21$QueueItem",
+      "android/support/v4/media/session/MediaSessionCompat$ResultReceiverWrapper$1": "androidx/media/session/MediaSessionCompat$ResultReceiverWrapper$1",
+      "android/support/v4/media/session/MediaSessionCompat$SessionFlags": "androidx/media/session/MediaSessionCompat$SessionFlags",
+      "android/support/v4/media/session/MediaSessionCompat$Token$1": "androidx/media/session/MediaSessionCompat$Token$1",
+      "android/support/v4/media/session/PlaybackStateCompat$Builder": "androidx/media/session/PlaybackStateCompat$Builder",
+      "android/support/v4/media/session/MediaSessionCompatApi21$CallbackProxy": "androidx/media/session/MediaSessionCompatApi21$CallbackProxy",
+      "android/support/v4/media/session/MediaSessionCompatApi23$CallbackProxy": "androidx/media/session/MediaSessionCompatApi23$CallbackProxy",
+      "android/support/v4/media/session/MediaSessionCompatApi24$CallbackProxy": "androidx/media/session/MediaSessionCompatApi24$CallbackProxy",
+      "android/support/v4/media/session/ParcelableVolumeInfo$1": "androidx/media/session/ParcelableVolumeInfo$1",
+      "android/support/v4/media/session/PlaybackStateCompat$1": "androidx/media/session/PlaybackStateCompat$1",
+      "android/support/v4/media/session/PlaybackStateCompat$Actions": "androidx/media/session/PlaybackStateCompat$Actions",
+      "android/support/v4/media/session/PlaybackStateCompat$CustomAction$1": "androidx/media/session/PlaybackStateCompat$CustomAction$1",
+      "android/support/v4/media/session/PlaybackStateCompat$CustomAction$Builder": "androidx/media/session/PlaybackStateCompat$CustomAction$Builder",
+      "android/support/v4/media/session/PlaybackStateCompatApi21$CustomAction": "androidx/media/session/PlaybackStateCompatApi21$CustomAction",
+      "android/support/v4/media/session/PlaybackStateCompatApi21": "androidx/media/session/PlaybackStateCompatApi21",
+      "android/support/v4/media/session/PlaybackStateCompat$ErrorCode": "androidx/media/session/PlaybackStateCompat$ErrorCode",
+      "android/support/v4/media/session/PlaybackStateCompat$MediaKeyAction": "androidx/media/session/PlaybackStateCompat$MediaKeyAction",
+      "android/support/v4/media/session/PlaybackStateCompat$RepeatMode": "androidx/media/session/PlaybackStateCompat$RepeatMode",
+      "android/support/v4/media/session/PlaybackStateCompat$ShuffleMode": "androidx/media/session/PlaybackStateCompat$ShuffleMode",
+      "android/support/v4/media/session/PlaybackStateCompat$State": "androidx/media/session/PlaybackStateCompat$State",
+      "android/support/v4/media/session/PlaybackStateCompatApi22": "androidx/media/session/PlaybackStateCompatApi22",
+      "android/arch/lifecycle/ObserversCollector": "androidx/lifecycle/ObserversCollector",
+      "android/arch/lifecycle/Validator": "androidx/lifecycle/Validator",
+      "android/arch/lifecycle/model/LifecycleObserverInfo": "androidx/lifecycle/model/LifecycleObserverInfo",
+      "android/arch/lifecycle/Elements_extKt": "androidx/lifecycle/Elements_extKt",
+      "android/arch/lifecycle/model/AdapterClassKt": "androidx/lifecycle/model/AdapterClassKt",
+      "android/arch/lifecycle/OnLifecycleEvent": "androidx/lifecycle/OnLifecycleEvent",
+      "android/arch/lifecycle/model/EventMethod": "androidx/lifecycle/model/EventMethod",
+      "android/arch/lifecycle/WriterKt": "androidx/lifecycle/WriterKt",
+      "android/arch/lifecycle/WriterKt$generateParamString$1": "androidx/lifecycle/WriterKt$generateParamString$1",
+      "android/arch/lifecycle/model/AdapterClass": "androidx/lifecycle/model/AdapterClass",
+      "android/arch/lifecycle/model/EventMethodCall": "androidx/lifecycle/model/EventMethodCall",
+      "android/arch/lifecycle/GeneratedAdapter": "androidx/lifecycle/GeneratedAdapter",
+      "android/arch/lifecycle/LifecycleProcessor": "androidx/lifecycle/LifecycleProcessor",
+      "android/arch/lifecycle/MethodCallsLogger": "androidx/lifecycle/MethodCallsLogger",
+      "android/arch/lifecycle/TransformationKt": "androidx/lifecycle/TransformationKt",
+      "android/arch/lifecycle/TransformationKt$flattenObservers$1": "androidx/lifecycle/TransformationKt$flattenObservers$1",
+      "android/arch/lifecycle/model/InputModel": "androidx/lifecycle/model/InputModel",
+      "android/arch/lifecycle/ErrorMessages": "androidx/lifecycle/ErrorMessages",
+      "android/arch/lifecycle/Input_collectorKt": "androidx/lifecycle/Input_collectorKt",
+      "android/arch/persistence/db/framework/FrameworkSQLiteDatabase$1": "androidx/persistence/db/framework/FrameworkSQLiteDatabase$1",
+      "android/arch/persistence/db/framework/FrameworkSQLiteDatabase": "androidx/persistence/db/framework/FrameworkSQLiteDatabase",
+      "android/arch/persistence/db/SupportSQLiteQuery": "androidx/persistence/db/SupportSQLiteQuery",
+      "android/arch/persistence/db/framework/FrameworkSQLiteProgram": "androidx/persistence/db/framework/FrameworkSQLiteProgram",
+      "android/arch/persistence/db/SupportSQLiteProgram": "androidx/persistence/db/SupportSQLiteProgram",
+      "android/arch/persistence/db/framework/FrameworkSQLiteDatabase$2": "androidx/persistence/db/framework/FrameworkSQLiteDatabase$2",
+      "android/arch/persistence/db/SupportSQLiteDatabase": "androidx/persistence/db/SupportSQLiteDatabase",
+      "android/arch/persistence/db/SupportSQLiteStatement": "androidx/persistence/db/SupportSQLiteStatement",
+      "android/arch/persistence/db/framework/FrameworkSQLiteStatement": "androidx/persistence/db/framework/FrameworkSQLiteStatement",
+      "android/arch/persistence/db/SimpleSQLiteQuery": "androidx/persistence/db/SimpleSQLiteQuery",
+      "android/arch/persistence/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$1": "androidx/persistence/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$1",
+      "android/arch/persistence/db/framework/FrameworkSQLiteOpenHelper$OpenHelper": "androidx/persistence/db/framework/FrameworkSQLiteOpenHelper$OpenHelper",
+      "android/arch/persistence/db/SupportSQLiteOpenHelper$Callback": "androidx/persistence/db/SupportSQLiteOpenHelper$Callback",
+      "android/arch/persistence/db/SupportSQLiteOpenHelper": "androidx/persistence/db/SupportSQLiteOpenHelper",
+      "android/arch/persistence/db/framework/FrameworkSQLiteOpenHelper": "androidx/persistence/db/framework/FrameworkSQLiteOpenHelper",
+      "android/arch/persistence/db/framework/FrameworkSQLiteOpenHelperFactory": "androidx/persistence/db/framework/FrameworkSQLiteOpenHelperFactory",
+      "android/arch/persistence/db/SupportSQLiteOpenHelper$Factory": "androidx/persistence/db/SupportSQLiteOpenHelper$Factory",
+      "android/arch/persistence/db/SupportSQLiteOpenHelper$Configuration": "androidx/persistence/db/SupportSQLiteOpenHelper$Configuration",
+      "android/arch/lifecycle/DefaultLifecycleObserver": "androidx/lifecycle/DefaultLifecycleObserver",
+      "android/arch/lifecycle/FullLifecycleObserver": "androidx/lifecycle/FullLifecycleObserver",
+      "android/support/v4/app/BackStackRecord$Op": "androidx/app/BackStackRecord$Op",
+      "android/support/v4/app/BackStackRecord": "androidx/app/BackStackRecord",
+      "android/support/v4/app/FragmentManagerImpl$OpGenerator": "androidx/app/FragmentManagerImpl$OpGenerator",
+      "android/support/v4/app/Fragment$OnStartEnterTransitionListener": "androidx/app/Fragment$OnStartEnterTransitionListener",
+      "android/support/v4/app/FragmentManagerImpl": "androidx/app/FragmentManagerImpl",
+      "android/support/v4/app/FragmentHostCallback": "androidx/app/FragmentHostCallback",
+      "android/support/v4/app/FragmentTransition": "androidx/app/FragmentTransition",
+      "android/support/v4/util/LogWriter": "androidx/util/LogWriter",
+      "android/support/v4/app/BackStackState$1": "androidx/app/BackStackState$1",
+      "android/support/v4/app/BackStackState": "androidx/app/BackStackState",
+      "android/support/v4/app/BaseFragmentActivityApi14": "androidx/app/BaseFragmentActivityApi14",
+      "android/support/v4/app/BaseFragmentActivityApi16": "androidx/app/BaseFragmentActivityApi16",
+      "android/support/v4/app/DialogFragment$DialogStyle": "androidx/app/DialogFragment$DialogStyle",
+      "android/support/v4/app/Fragment$1": "androidx/app/Fragment$1",
+      "android/support/v4/app/Fragment$2": "androidx/app/Fragment$2",
+      "android/support/v4/app/FragmentContainer": "androidx/app/FragmentContainer",
+      "android/support/v4/app/Fragment$AnimationInfo": "androidx/app/Fragment$AnimationInfo",
+      "android/support/v4/app/Fragment$InstantiationException": "androidx/app/Fragment$InstantiationException",
+      "android/support/v4/app/Fragment$SavedState$1": "androidx/app/Fragment$SavedState$1",
+      "android/support/v4/app/Fragment$SavedState": "androidx/app/Fragment$SavedState",
+      "android/support/v4/app/FragmentManagerNonConfig": "androidx/app/FragmentManagerNonConfig",
+      "android/support/v4/app/LoaderManagerImpl": "androidx/app/LoaderManagerImpl",
+      "android/support/v4/app/SuperNotCalledException": "androidx/app/SuperNotCalledException",
+      "android/support/v4/util/DebugUtils": "androidx/util/DebugUtils",
+      "android/support/v4/app/LoaderManager": "androidx/app/LoaderManager",
+      "android/support/v4/app/FragmentActivity$1": "androidx/app/FragmentActivity$1",
+      "android/support/v4/app/FragmentController": "androidx/app/FragmentController",
+      "android/support/v4/app/FragmentActivity$HostCallbacks": "androidx/app/FragmentActivity$HostCallbacks",
+      "android/support/v4/app/FragmentActivity$NonConfigurationInstances": "androidx/app/FragmentActivity$NonConfigurationInstances",
+      "android/support/v4/app/ActivityCompat$OnRequestPermissionsResultCallback": "androidx/app/ActivityCompat$OnRequestPermissionsResultCallback",
+      "android/support/v4/app/ActivityCompat$RequestPermissionsRequestCodeValidator": "androidx/app/ActivityCompat$RequestPermissionsRequestCodeValidator",
+      "android/support/v4/app/ActivityCompat$PermissionCompatDelegate": "androidx/app/ActivityCompat$PermissionCompatDelegate",
+      "android/support/v4/app/FragmentManagerImpl$1": "androidx/app/FragmentManagerImpl$1",
+      "android/support/v4/app/FragmentManagerImpl$2$1": "androidx/app/FragmentManagerImpl$2$1",
+      "android/support/v4/app/FragmentManagerImpl$2": "androidx/app/FragmentManagerImpl$2",
+      "android/support/v4/app/FragmentManagerImpl$AnimationListenerWrapper": "androidx/app/FragmentManagerImpl$AnimationListenerWrapper",
+      "android/support/v4/app/FragmentManagerImpl$AnimationOrAnimator": "androidx/app/FragmentManagerImpl$AnimationOrAnimator",
+      "android/support/v4/app/FragmentManagerImpl$3": "androidx/app/FragmentManagerImpl$3",
+      "android/support/v4/app/FragmentManagerImpl$4": "androidx/app/FragmentManagerImpl$4",
+      "android/support/v4/app/FragmentManagerImpl$AnimateOnHWLayerIfNeededListener$1": "androidx/app/FragmentManagerImpl$AnimateOnHWLayerIfNeededListener$1",
+      "android/support/v4/app/FragmentManagerImpl$AnimateOnHWLayerIfNeededListener": "androidx/app/FragmentManagerImpl$AnimateOnHWLayerIfNeededListener",
+      "android/support/v4/app/FragmentManagerImpl$AnimatorOnHWLayerIfNeededListener": "androidx/app/FragmentManagerImpl$AnimatorOnHWLayerIfNeededListener",
+      "android/support/v4/app/FragmentManagerImpl$FragmentTag": "androidx/app/FragmentManagerImpl$FragmentTag",
+      "android/support/v4/app/FragmentManagerImpl$PopBackStackState": "androidx/app/FragmentManagerImpl$PopBackStackState",
+      "android/support/v4/app/FragmentManagerImpl$StartEnterTransitionListener": "androidx/app/FragmentManagerImpl$StartEnterTransitionListener",
+      "android/support/v4/util/ArraySet": "androidx/util/ArraySet",
+      "android/support/v4/app/FragmentState": "androidx/app/FragmentState",
+      "android/support/v4/app/FragmentManagerState": "androidx/app/FragmentManagerState",
+      "android/support/v4/app/FragmentManagerState$1": "androidx/app/FragmentManagerState$1",
+      "android/support/v4/app/FragmentPagerAdapter": "androidx/app/FragmentPagerAdapter",
+      "android/support/v4/app/FragmentState$1": "androidx/app/FragmentState$1",
+      "android/support/v4/app/FragmentStatePagerAdapter": "androidx/app/FragmentStatePagerAdapter",
+      "android/support/v4/app/FragmentTabHost$DummyTabFactory": "androidx/app/FragmentTabHost$DummyTabFactory",
+      "android/support/v4/app/FragmentTabHost": "androidx/app/FragmentTabHost",
+      "android/support/v4/app/FragmentTabHost$SavedState$1": "androidx/app/FragmentTabHost$SavedState$1",
+      "android/support/v4/app/FragmentTabHost$SavedState": "androidx/app/FragmentTabHost$SavedState",
+      "android/support/v4/app/FragmentTabHost$TabInfo": "androidx/app/FragmentTabHost$TabInfo",
+      "android/support/v4/app/FragmentTransaction$Transit": "androidx/app/FragmentTransaction$Transit",
+      "android/support/annotation/AnimRes": "androidx/annotation/AnimRes",
+      "android/support/v4/app/FragmentTransition$1": "androidx/app/FragmentTransition$1",
+      "android/support/v4/app/FragmentTransitionImpl": "androidx/app/FragmentTransitionImpl",
+      "android/support/v4/app/FragmentTransition$2": "androidx/app/FragmentTransition$2",
+      "android/support/v4/app/FragmentTransition$3": "androidx/app/FragmentTransition$3",
+      "android/support/v4/app/FragmentTransition$FragmentContainerTransition": "androidx/app/FragmentTransition$FragmentContainerTransition",
+      "android/support/v4/app/FragmentTransition$4": "androidx/app/FragmentTransition$4",
+      "android/support/v4/app/OneShotPreDrawListener": "androidx/app/OneShotPreDrawListener",
+      "android/support/v4/app/FragmentTransitionCompat21": "androidx/app/FragmentTransitionCompat21",
+      "android/support/v4/app/FragmentTransitionCompat21$1": "androidx/app/FragmentTransitionCompat21$1",
+      "android/support/v4/app/FragmentTransitionCompat21$2": "androidx/app/FragmentTransitionCompat21$2",
+      "android/support/v4/app/FragmentTransitionCompat21$3": "androidx/app/FragmentTransitionCompat21$3",
+      "android/support/v4/app/FragmentTransitionCompat21$4": "androidx/app/FragmentTransitionCompat21$4",
+      "android/support/v4/app/FragmentTransitionImpl$1": "androidx/app/FragmentTransitionImpl$1",
+      "android/support/v4/app/FragmentTransitionImpl$2": "androidx/app/FragmentTransitionImpl$2",
+      "android/support/v4/app/FragmentTransitionImpl$3": "androidx/app/FragmentTransitionImpl$3",
+      "android/support/v4/view/ViewGroupCompat": "androidx/view/ViewGroupCompat",
+      "android/support/v4/app/ListFragment$1": "androidx/app/ListFragment$1",
+      "android/support/v4/app/ListFragment": "androidx/app/ListFragment",
+      "android/support/v4/app/ListFragment$2": "androidx/app/ListFragment$2",
+      "android/support/v4/app/LoaderManager$LoaderCallbacks": "androidx/app/LoaderManager$LoaderCallbacks",
+      "android/support/v4/content/Loader": "androidx/content/Loader",
+      "android/support/v4/app/LoaderManagerImpl$LoaderInfo": "androidx/app/LoaderManagerImpl$LoaderInfo",
+      "android/support/v4/content/Loader$OnLoadCompleteListener": "androidx/content/Loader$OnLoadCompleteListener",
+      "android/support/v4/content/Loader$OnLoadCanceledListener": "androidx/content/Loader$OnLoadCanceledListener",
+      "android/arch/paging/LivePagedListBuilder$1$1": "androidx/paging/LivePagedListBuilder$1$1",
+      "android/arch/paging/DataSource$InvalidatedCallback": "androidx/paging/DataSource$InvalidatedCallback",
+      "android/arch/paging/LivePagedListBuilder$1": "androidx/paging/LivePagedListBuilder$1",
+      "android/arch/paging/DataSource": "androidx/paging/DataSource",
+      "android/arch/lifecycle/ComputableLiveData": "androidx/lifecycle/ComputableLiveData",
+      "android/arch/paging/PagedList": "androidx/paging/PagedList",
+      "android/arch/paging/LivePagedListBuilder": "androidx/paging/LivePagedListBuilder",
+      "android/arch/paging/PagedList$Config": "androidx/paging/PagedList$Config",
+      "android/arch/paging/PagedList$BoundaryCallback": "androidx/paging/PagedList$BoundaryCallback",
+      "android/arch/paging/DataSource$Factory": "androidx/paging/DataSource$Factory",
+      "android/arch/lifecycle/LiveData": "androidx/lifecycle/LiveData",
+      "android/arch/paging/PagedList$Builder": "androidx/paging/PagedList$Builder",
+      "android/arch/paging/PagedList$Config$Builder": "androidx/paging/PagedList$Config$Builder",
+      "android/arch/core/executor/ArchTaskExecutor": "androidx/core/executor/ArchTaskExecutor",
+      "android/support/annotation/AnyThread": "androidx/annotation/AnyThread",
+      "android/arch/paging/LivePagedListProvider": "androidx/paging/LivePagedListProvider",
+      "android/arch/paging/PagedListAdapter$1": "androidx/paging/PagedListAdapter$1",
+      "android/arch/paging/PagedListAdapterHelper$PagedListListener": "androidx/paging/PagedListAdapterHelper$PagedListListener",
+      "android/arch/paging/PagedListAdapter": "androidx/paging/PagedListAdapter",
+      "android/arch/paging/PagedListAdapterHelper": "androidx/paging/PagedListAdapterHelper",
+      "android/support/v7/recyclerview/extensions/ListAdapterHelper$AdapterCallback": "androidx/widget/recyclerview/ListAdapterHelper$AdapterCallback",
+      "android/support/v7/recyclerview/extensions/ListAdapterHelper": "androidx/widget/recyclerview/ListAdapterHelper",
+      "android/support/v7/recyclerview/extensions/DiffCallback": "androidx/widget/recyclerview/DiffCallback",
+      "android/support/v7/recyclerview/extensions/ListAdapterConfig": "androidx/widget/recyclerview/ListAdapterConfig",
+      "android/arch/paging/PagedListAdapterHelper$1": "androidx/paging/PagedListAdapterHelper$1",
+      "android/arch/paging/PagedList$Callback": "androidx/paging/PagedList$Callback",
+      "android/arch/paging/PagedListAdapterHelper$2$1": "androidx/paging/PagedListAdapterHelper$2$1",
+      "android/arch/paging/PagedListAdapterHelper$2": "androidx/paging/PagedListAdapterHelper$2",
+      "android/arch/paging/PagedStorage": "androidx/paging/PagedStorage",
+      "android/arch/paging/PagedStorageDiffHelper": "androidx/paging/PagedStorageDiffHelper",
+      "android/support/v7/recyclerview/extensions/ListAdapterConfig$Builder": "androidx/widget/recyclerview/ListAdapterConfig$Builder",
+      "android/arch/paging/PagedStorageDiffHelper$1": "androidx/paging/PagedStorageDiffHelper$1",
+      "android/arch/paging/PagedStorageDiffHelper$OffsettingListUpdateCallback": "androidx/paging/PagedStorageDiffHelper$OffsettingListUpdateCallback",
+      "android/support/v7/recyclerview/extensions/ListAdapter": "androidx/widget/recyclerview/ListAdapter",
+      "android/support/v7/recyclerview/extensions/ListAdapterConfig$1": "androidx/widget/recyclerview/ListAdapterConfig$1",
+      "android/support/v7/recyclerview/extensions/ListAdapterHelper$1$1": "androidx/widget/recyclerview/ListAdapterHelper$1$1",
+      "android/support/v7/recyclerview/extensions/ListAdapterHelper$1": "androidx/widget/recyclerview/ListAdapterHelper$1",
+      "android/support/v7/recyclerview/extensions/ListAdapterHelper$1$2": "androidx/widget/recyclerview/ListAdapterHelper$1$2",
+      "android/arch/paging/TiledPagedList$2": "androidx/paging/TiledPagedList$2",
+      "android/arch/paging/TiledPagedList": "androidx/paging/TiledPagedList",
+      "android/arch/paging/PageResult$Receiver": "androidx/paging/PageResult$Receiver",
+      "android/arch/paging/PageResult": "androidx/paging/PageResult",
+      "android/arch/paging/PositionalDataSource": "androidx/paging/PositionalDataSource",
+      "android/arch/paging/PagedList$1": "androidx/paging/PagedList$1",
+      "android/arch/paging/PositionalDataSource$ContiguousWithoutPlaceholdersWrapper": "androidx/paging/PositionalDataSource$ContiguousWithoutPlaceholdersWrapper",
+      "android/arch/paging/PositionalDataSource$LoadRangeCallback": "androidx/paging/PositionalDataSource$LoadRangeCallback",
+      "android/arch/paging/PositionalDataSource$LoadInitialCallback": "androidx/paging/PositionalDataSource$LoadInitialCallback",
+      "android/arch/paging/PositionalDataSource$LoadRangeParams": "androidx/paging/PositionalDataSource$LoadRangeParams",
+      "android/arch/paging/PositionalDataSource$LoadInitialParams": "androidx/paging/PositionalDataSource$LoadInitialParams",
+      "android/arch/paging/ContiguousDataSource": "androidx/paging/ContiguousDataSource",
+      "android/arch/paging/PageKeyedDataSource$LoadInitialParams": "androidx/paging/PageKeyedDataSource$LoadInitialParams",
+      "android/arch/paging/PageKeyedDataSource": "androidx/paging/PageKeyedDataSource",
+      "android/arch/paging/ItemKeyedDataSource$LoadParams": "androidx/paging/ItemKeyedDataSource$LoadParams",
+      "android/arch/paging/ItemKeyedDataSource": "androidx/paging/ItemKeyedDataSource",
+      "android/arch/paging/PagedStorage$Callback": "androidx/paging/PagedStorage$Callback",
+      "android/arch/paging/DataSource$BaseLoadCallback": "androidx/paging/DataSource$BaseLoadCallback",
+      "android/arch/paging/DataSource$BaseLoadCallback$1": "androidx/paging/DataSource$BaseLoadCallback$1",
+      "android/arch/paging/TiledPagedList$1": "androidx/paging/TiledPagedList$1",
+      "android/arch/paging/ListDataSource": "androidx/paging/ListDataSource",
+      "android/arch/paging/PagedList$2": "androidx/paging/PagedList$2",
+      "android/arch/paging/ContiguousPagedList$3": "androidx/paging/ContiguousPagedList$3",
+      "android/arch/paging/ContiguousPagedList": "androidx/paging/ContiguousPagedList",
+      "android/arch/paging/ItemKeyedDataSource$LoadInitialParams": "androidx/paging/ItemKeyedDataSource$LoadInitialParams",
+      "android/arch/paging/PageKeyedDataSource$LoadCallback": "androidx/paging/PageKeyedDataSource$LoadCallback",
+      "android/arch/paging/PageKeyedDataSource$LoadParams": "androidx/paging/PageKeyedDataSource$LoadParams",
+      "android/arch/paging/PageResult$ResultType": "androidx/paging/PageResult$ResultType",
+      "android/arch/paging/PageKeyedDataSource$LoadInitialCallback": "androidx/paging/PageKeyedDataSource$LoadInitialCallback",
+      "android/arch/paging/ContiguousPagedList$2": "androidx/paging/ContiguousPagedList$2",
+      "android/arch/paging/ContiguousPagedList$1": "androidx/paging/ContiguousPagedList$1",
+      "android/arch/paging/ItemKeyedDataSource$LoadCallback": "androidx/paging/ItemKeyedDataSource$LoadCallback",
+      "android/arch/paging/ItemKeyedDataSource$LoadInitialCallback": "androidx/paging/ItemKeyedDataSource$LoadInitialCallback",
+      "android/arch/paging/SnapshotPagedList": "androidx/paging/SnapshotPagedList",
+      "android/arch/paging/TiledDataSource": "androidx/paging/TiledDataSource",
+      "android/support/text/emoji/widget/EmojiAppCompatButton": "androidx/text/emoji/widget/EmojiAppCompatButton",
+      "android/support/text/emoji/widget/EmojiTextViewHelper": "androidx/text/emoji/widget/EmojiTextViewHelper",
+      "android/support/text/emoji/widget/EmojiAppCompatEditText": "androidx/text/emoji/widget/EmojiAppCompatEditText",
+      "android/support/text/emoji/widget/EmojiEditTextHelper": "androidx/text/emoji/widget/EmojiEditTextHelper",
+      "android/support/text/emoji/widget/EditTextAttributeHelper": "androidx/text/emoji/widget/EditTextAttributeHelper",
+      "android/support/text/emoji/widget/EmojiAppCompatTextView": "androidx/text/emoji/widget/EmojiAppCompatTextView",
+      "android/support/annotation/AnyRes": "androidx/annotation/AnyRes",
+      "android/support/annotation/BinderThread": "androidx/annotation/BinderThread",
+      "android/support/annotation/BoolRes": "androidx/annotation/BoolRes",
+      "android/support/annotation/CheckResult": "androidx/annotation/CheckResult",
+      "android/support/annotation/ColorLong": "androidx/annotation/ColorLong",
+      "android/support/annotation/DimenRes": "androidx/annotation/DimenRes",
+      "android/support/annotation/Dimension": "androidx/annotation/Dimension",
+      "android/support/annotation/FontRes": "androidx/annotation/FontRes",
+      "android/support/annotation/FractionRes": "androidx/annotation/FractionRes",
+      "android/support/annotation/HalfFloat": "androidx/annotation/HalfFloat",
+      "android/support/annotation/IntDef": "androidx/annotation/IntDef",
+      "android/support/annotation/IntegerRes": "androidx/annotation/IntegerRes",
+      "android/support/annotation/InterpolatorRes": "androidx/annotation/InterpolatorRes",
+      "android/support/annotation/Keep": "androidx/annotation/Keep",
+      "android/support/annotation/LongDef": "androidx/annotation/LongDef",
+      "android/support/annotation/NavigationRes": "androidx/annotation/NavigationRes",
+      "android/support/annotation/PluralsRes": "androidx/annotation/PluralsRes",
+      "android/support/annotation/Px": "androidx/annotation/Px",
+      "android/support/annotation/RawRes": "androidx/annotation/RawRes",
+      "android/support/annotation/RequiresPermission$Write": "androidx/annotation/RequiresPermission$Write",
+      "android/support/annotation/Size": "androidx/annotation/Size",
+      "android/support/annotation/StringDef": "androidx/annotation/StringDef",
+      "android/support/annotation/TransitionRes": "androidx/annotation/TransitionRes",
+      "android/support/v7/util/AsyncListUtil$1": "androidx/widget/recyclerview/AsyncListUtil$1",
+      "android/support/v7/util/ThreadUtil$MainThreadCallback": "androidx/widget/recyclerview/ThreadUtil$MainThreadCallback",
+      "android/support/v7/util/AsyncListUtil": "androidx/widget/recyclerview/AsyncListUtil",
+      "android/support/v7/util/TileList$Tile": "androidx/widget/recyclerview/TileList$Tile",
+      "android/support/v7/util/TileList": "androidx/widget/recyclerview/TileList",
+      "android/support/v7/util/ThreadUtil": "androidx/widget/recyclerview/ThreadUtil",
+      "android/support/v7/util/AsyncListUtil$ViewCallback": "androidx/widget/recyclerview/AsyncListUtil$ViewCallback",
+      "android/support/v7/util/ThreadUtil$BackgroundCallback": "androidx/widget/recyclerview/ThreadUtil$BackgroundCallback",
+      "android/support/v7/util/AsyncListUtil$2": "androidx/widget/recyclerview/AsyncListUtil$2",
+      "android/support/v7/util/AsyncListUtil$DataCallback": "androidx/widget/recyclerview/AsyncListUtil$DataCallback",
+      "android/support/v7/util/MessageThreadUtil": "androidx/widget/recyclerview/MessageThreadUtil",
+      "android/support/v7/util/BatchingListUpdateCallback": "androidx/widget/recyclerview/BatchingListUpdateCallback",
+      "android/support/v7/util/DiffUtil$1": "androidx/widget/recyclerview/DiffUtil$1",
+      "android/support/v7/util/DiffUtil$Snake": "androidx/widget/recyclerview/DiffUtil$Snake",
+      "android/support/v7/util/DiffUtil$DiffResult$1": "androidx/widget/recyclerview/DiffUtil$DiffResult$1",
+      "android/support/v7/util/DiffUtil$PostponedUpdate": "androidx/widget/recyclerview/DiffUtil$PostponedUpdate",
+      "android/support/v7/util/DiffUtil$ItemCallback": "androidx/widget/recyclerview/DiffUtil$ItemCallback",
+      "android/support/v7/util/DiffUtil$Range": "androidx/widget/recyclerview/DiffUtil$Range",
+      "android/support/v7/util/MessageThreadUtil$1$1": "androidx/widget/recyclerview/MessageThreadUtil$1$1",
+      "android/support/v7/util/MessageThreadUtil$1": "androidx/widget/recyclerview/MessageThreadUtil$1",
+      "android/support/v7/util/MessageThreadUtil$SyncQueueItem": "androidx/widget/recyclerview/MessageThreadUtil$SyncQueueItem",
+      "android/support/v7/util/MessageThreadUtil$MessageQueue": "androidx/widget/recyclerview/MessageThreadUtil$MessageQueue",
+      "android/support/v7/util/MessageThreadUtil$2$1": "androidx/widget/recyclerview/MessageThreadUtil$2$1",
+      "android/support/v7/util/MessageThreadUtil$2": "androidx/widget/recyclerview/MessageThreadUtil$2",
+      "android/support/v7/util/SortedList$BatchedCallback": "androidx/widget/recyclerview/SortedList$BatchedCallback",
+      "android/support/v7/util/SortedList$Callback": "androidx/widget/recyclerview/SortedList$Callback",
+      "android/support/v7/util/SortedList": "androidx/widget/recyclerview/SortedList",
+      "android/support/v7/widget/AdapterHelper$Callback": "androidx/widget/recyclerview/AdapterHelper$Callback",
+      "android/support/v7/widget/AdapterHelper$UpdateOp": "androidx/widget/recyclerview/AdapterHelper$UpdateOp",
+      "android/support/v7/widget/AdapterHelper": "androidx/widget/recyclerview/AdapterHelper",
+      "android/support/v7/widget/OpReorderer$Callback": "androidx/widget/recyclerview/OpReorderer$Callback",
+      "android/support/v7/widget/OpReorderer": "androidx/widget/recyclerview/OpReorderer",
+      "android/support/v7/widget/ChildHelper$Bucket": "androidx/widget/recyclerview/ChildHelper$Bucket",
+      "android/support/v7/widget/ChildHelper": "androidx/widget/recyclerview/ChildHelper",
+      "android/support/v7/widget/ChildHelper$Callback": "androidx/widget/recyclerview/ChildHelper$Callback",
+      "android/support/v7/widget/DefaultItemAnimator$1": "androidx/widget/recyclerview/DefaultItemAnimator$1",
+      "android/support/v7/widget/DefaultItemAnimator": "androidx/widget/recyclerview/DefaultItemAnimator",
+      "android/support/v7/widget/DefaultItemAnimator$MoveInfo": "androidx/widget/recyclerview/DefaultItemAnimator$MoveInfo",
+      "android/support/v7/widget/DefaultItemAnimator$2": "androidx/widget/recyclerview/DefaultItemAnimator$2",
+      "android/support/v7/widget/DefaultItemAnimator$ChangeInfo": "androidx/widget/recyclerview/DefaultItemAnimator$ChangeInfo",
+      "android/support/v7/widget/DefaultItemAnimator$3": "androidx/widget/recyclerview/DefaultItemAnimator$3",
+      "android/support/v7/widget/DefaultItemAnimator$4": "androidx/widget/recyclerview/DefaultItemAnimator$4",
+      "android/support/v7/widget/DefaultItemAnimator$5": "androidx/widget/recyclerview/DefaultItemAnimator$5",
+      "android/support/v7/widget/DefaultItemAnimator$6": "androidx/widget/recyclerview/DefaultItemAnimator$6",
+      "android/support/v7/widget/DefaultItemAnimator$7": "androidx/widget/recyclerview/DefaultItemAnimator$7",
+      "android/support/v7/widget/DefaultItemAnimator$8": "androidx/widget/recyclerview/DefaultItemAnimator$8",
+      "android/support/v7/widget/DividerItemDecoration": "androidx/widget/recyclerview/DividerItemDecoration",
+      "android/support/v7/widget/FastScroller$1": "androidx/widget/recyclerview/FastScroller$1",
+      "android/support/v7/widget/FastScroller": "androidx/widget/recyclerview/FastScroller",
+      "android/support/v7/widget/FastScroller$2": "androidx/widget/recyclerview/FastScroller$2",
+      "android/support/v7/widget/FastScroller$AnimationState": "androidx/widget/recyclerview/FastScroller$AnimationState",
+      "android/support/v7/widget/FastScroller$AnimatorListener": "androidx/widget/recyclerview/FastScroller$AnimatorListener",
+      "android/support/v7/widget/FastScroller$AnimatorUpdater": "androidx/widget/recyclerview/FastScroller$AnimatorUpdater",
+      "android/support/v7/widget/FastScroller$DragState": "androidx/widget/recyclerview/FastScroller$DragState",
+      "android/support/v7/widget/FastScroller$State": "androidx/widget/recyclerview/FastScroller$State",
+      "android/support/v7/widget/RecyclerView$OnItemTouchListener": "androidx/widget/recyclerview/RecyclerView$OnItemTouchListener",
+      "android/support/v7/widget/GapWorker$1": "androidx/widget/recyclerview/GapWorker$1",
+      "android/support/v7/widget/GapWorker$Task": "androidx/widget/recyclerview/GapWorker$Task",
+      "android/support/v7/widget/GapWorker": "androidx/widget/recyclerview/GapWorker",
+      "android/support/v7/widget/GapWorker$LayoutPrefetchRegistryImpl": "androidx/widget/recyclerview/GapWorker$LayoutPrefetchRegistryImpl",
+      "android/support/v4/os/TraceCompat": "androidx/os/TraceCompat",
+      "android/support/v7/widget/GridLayoutManager$DefaultSpanSizeLookup": "androidx/widget/recyclerview/GridLayoutManager$DefaultSpanSizeLookup",
+      "android/support/v7/widget/GridLayoutManager$SpanSizeLookup": "androidx/widget/recyclerview/GridLayoutManager$SpanSizeLookup",
+      "android/support/v7/widget/GridLayoutManager": "androidx/widget/recyclerview/GridLayoutManager",
+      "android/support/v7/widget/GridLayoutManager$LayoutParams": "androidx/widget/recyclerview/GridLayoutManager$LayoutParams",
+      "android/support/v7/widget/LinearLayoutManager$AnchorInfo": "androidx/widget/recyclerview/LinearLayoutManager$AnchorInfo",
+      "android/support/v7/widget/LinearLayoutManager$LayoutState": "androidx/widget/recyclerview/LinearLayoutManager$LayoutState",
+      "android/support/v7/widget/LinearLayoutManager$LayoutChunkResult": "androidx/widget/recyclerview/LinearLayoutManager$LayoutChunkResult",
+      "android/support/v7/widget/LinearLayoutManager$SavedState": "androidx/widget/recyclerview/LinearLayoutManager$SavedState",
+      "android/support/v7/widget/LayoutState": "androidx/widget/recyclerview/LayoutState",
+      "android/support/v7/widget/LinearLayoutManager$SavedState$1": "androidx/widget/recyclerview/LinearLayoutManager$SavedState$1",
+      "android/support/v7/widget/helper/ItemTouchHelper$ViewDropHandler": "androidx/widget/recyclerview/ItemTouchHelper$ViewDropHandler",
+      "android/support/v7/widget/RecyclerView$SmoothScroller$ScrollVectorProvider": "androidx/widget/recyclerview/RecyclerView$SmoothScroller$ScrollVectorProvider",
+      "android/support/v7/widget/helper/ItemTouchHelper": "androidx/widget/recyclerview/ItemTouchHelper",
+      "android/support/v7/widget/ScrollbarHelper": "androidx/widget/recyclerview/ScrollbarHelper",
+      "android/support/v7/widget/ViewBoundsCheck": "androidx/widget/recyclerview/ViewBoundsCheck",
+      "android/support/v7/widget/LinearSnapHelper": "androidx/widget/recyclerview/LinearSnapHelper",
+      "android/support/v7/widget/SnapHelper": "androidx/widget/recyclerview/SnapHelper",
+      "android/support/v7/widget/OrientationHelper$1": "androidx/widget/recyclerview/OrientationHelper$1",
+      "android/support/v7/widget/OrientationHelper$2": "androidx/widget/recyclerview/OrientationHelper$2",
+      "android/support/v7/widget/PagerSnapHelper$1": "androidx/widget/recyclerview/PagerSnapHelper$1",
+      "android/support/v7/widget/PagerSnapHelper": "androidx/widget/recyclerview/PagerSnapHelper",
+      "android/support/v7/widget/PositionMap$ContainerHelpers": "androidx/widget/recyclerview/PositionMap$ContainerHelpers",
+      "android/support/v7/widget/PositionMap": "androidx/widget/recyclerview/PositionMap",
+      "android/support/v7/widget/RecyclerView$1": "androidx/widget/recyclerview/RecyclerView$1",
+      "android/support/v7/widget/RecyclerView$2": "androidx/widget/recyclerview/RecyclerView$2",
+      "android/support/v7/widget/RecyclerView$3": "androidx/widget/recyclerview/RecyclerView$3",
+      "android/support/v7/widget/RecyclerView$4": "androidx/widget/recyclerview/RecyclerView$4",
+      "android/support/v7/widget/ViewInfoStore$ProcessCallback": "androidx/widget/recyclerview/ViewInfoStore$ProcessCallback",
+      "android/support/v7/widget/RecyclerView$ItemAnimator$ItemHolderInfo": "androidx/widget/recyclerview/RecyclerView$ItemAnimator$ItemHolderInfo",
+      "android/support/v7/widget/ViewInfoStore": "androidx/widget/recyclerview/ViewInfoStore",
+      "android/support/v7/widget/RecyclerView$5": "androidx/widget/recyclerview/RecyclerView$5",
+      "android/support/v7/widget/RecyclerView$6": "androidx/widget/recyclerview/RecyclerView$6",
+      "android/support/v7/widget/RecyclerView$AdapterDataObservable": "androidx/widget/recyclerview/RecyclerView$AdapterDataObservable",
+      "android/support/v7/widget/RecyclerView$ChildDrawingOrderCallback": "androidx/widget/recyclerview/RecyclerView$ChildDrawingOrderCallback",
+      "android/support/v7/widget/RecyclerView$EdgeEffectFactory$EdgeDirection": "androidx/widget/recyclerview/RecyclerView$EdgeEffectFactory$EdgeDirection",
+      "android/support/v7/widget/RecyclerView$EdgeEffectFactory": "androidx/widget/recyclerview/RecyclerView$EdgeEffectFactory",
+      "android/support/v7/widget/RecyclerView$ItemAnimator$AdapterChanges": "androidx/widget/recyclerview/RecyclerView$ItemAnimator$AdapterChanges",
+      "android/support/v7/widget/RecyclerView$ItemAnimator$ItemAnimatorFinishedListener": "androidx/widget/recyclerview/RecyclerView$ItemAnimator$ItemAnimatorFinishedListener",
+      "android/support/v7/widget/RecyclerView$ItemAnimator$ItemAnimatorListener": "androidx/widget/recyclerview/RecyclerView$ItemAnimator$ItemAnimatorListener",
+      "android/support/v7/widget/RecyclerView$ItemAnimatorRestoreListener": "androidx/widget/recyclerview/RecyclerView$ItemAnimatorRestoreListener",
+      "android/support/v7/widget/RecyclerView$LayoutManager$1": "androidx/widget/recyclerview/RecyclerView$LayoutManager$1",
+      "android/support/v7/widget/ViewBoundsCheck$Callback": "androidx/widget/recyclerview/ViewBoundsCheck$Callback",
+      "android/support/v7/widget/RecyclerView$LayoutManager$2": "androidx/widget/recyclerview/RecyclerView$LayoutManager$2",
+      "android/support/v7/recyclerview/R$styleable": "androidx/recyclerview/R$styleable",
+      "android/support/v7/recyclerview/R": "androidx/recyclerview/R",
+      "android/support/v7/widget/RecyclerView$OnChildAttachStateChangeListener": "androidx/widget/recyclerview/RecyclerView$OnChildAttachStateChangeListener",
+      "android/support/v7/widget/RecyclerView$OnFlingListener": "androidx/widget/recyclerview/RecyclerView$OnFlingListener",
+      "android/support/v7/widget/RecyclerView$Orientation": "androidx/widget/recyclerview/RecyclerView$Orientation",
+      "android/support/v7/widget/RecyclerView$RecycledViewPool$ScrapData": "androidx/widget/recyclerview/RecyclerView$RecycledViewPool$ScrapData",
+      "android/support/v7/widget/RecyclerView$ViewCacheExtension": "androidx/widget/recyclerview/RecyclerView$ViewCacheExtension",
+      "android/support/v7/widget/RecyclerView$RecyclerViewDataObserver": "androidx/widget/recyclerview/RecyclerView$RecyclerViewDataObserver",
+      "android/support/v7/widget/RecyclerView$SavedState$1": "androidx/widget/recyclerview/RecyclerView$SavedState$1",
+      "android/support/v7/widget/RecyclerView$SavedState": "androidx/widget/recyclerview/RecyclerView$SavedState",
+      "android/support/v7/widget/RecyclerView$SimpleOnItemTouchListener": "androidx/widget/recyclerview/RecyclerView$SimpleOnItemTouchListener",
+      "android/support/v7/widget/RecyclerView$ViewFlinger": "androidx/widget/recyclerview/RecyclerView$ViewFlinger",
+      "android/support/v7/widget/RecyclerView$State$LayoutState": "androidx/widget/recyclerview/RecyclerView$State$LayoutState",
+      "android/support/v7/recyclerview/R$dimen": "androidx/recyclerview/R$dimen",
+      "android/support/v4/view/ViewConfigurationCompat": "androidx/view/ViewConfigurationCompat",
+      "android/support/v4/view/MotionEventCompat": "androidx/view/MotionEventCompat",
+      "android/support/v7/widget/RecyclerViewAccessibilityDelegate$ItemDelegate": "androidx/widget/recyclerview/RecyclerViewAccessibilityDelegate$ItemDelegate",
+      "android/support/v7/widget/SnapHelper$1": "androidx/widget/recyclerview/SnapHelper$1",
+      "android/support/v7/widget/SnapHelper$2": "androidx/widget/recyclerview/SnapHelper$2",
+      "android/support/v7/widget/StaggeredGridLayoutManager$1": "androidx/widget/recyclerview/StaggeredGridLayoutManager$1",
+      "android/support/v7/widget/StaggeredGridLayoutManager": "androidx/widget/recyclerview/StaggeredGridLayoutManager",
+      "android/support/v7/widget/StaggeredGridLayoutManager$AnchorInfo": "androidx/widget/recyclerview/StaggeredGridLayoutManager$AnchorInfo",
+      "android/support/v7/widget/StaggeredGridLayoutManager$Span": "androidx/widget/recyclerview/StaggeredGridLayoutManager$Span",
+      "android/support/v7/widget/StaggeredGridLayoutManager$LayoutParams": "androidx/widget/recyclerview/StaggeredGridLayoutManager$LayoutParams",
+      "android/support/v7/widget/StaggeredGridLayoutManager$LazySpanLookup$FullSpanItem$1": "androidx/widget/recyclerview/StaggeredGridLayoutManager$LazySpanLookup$FullSpanItem$1",
+      "android/support/v7/widget/StaggeredGridLayoutManager$LazySpanLookup$FullSpanItem": "androidx/widget/recyclerview/StaggeredGridLayoutManager$LazySpanLookup$FullSpanItem",
+      "android/support/v7/widget/StaggeredGridLayoutManager$LazySpanLookup": "androidx/widget/recyclerview/StaggeredGridLayoutManager$LazySpanLookup",
+      "android/support/v7/widget/StaggeredGridLayoutManager$SavedState$1": "androidx/widget/recyclerview/StaggeredGridLayoutManager$SavedState$1",
+      "android/support/v7/widget/StaggeredGridLayoutManager$SavedState": "androidx/widget/recyclerview/StaggeredGridLayoutManager$SavedState",
+      "android/support/v7/widget/ViewBoundsCheck$BoundFlags": "androidx/widget/recyclerview/ViewBoundsCheck$BoundFlags",
+      "android/support/v7/widget/ViewBoundsCheck$ViewBounds": "androidx/widget/recyclerview/ViewBoundsCheck$ViewBounds",
+      "android/support/v7/widget/ViewInfoStore$InfoRecord": "androidx/widget/recyclerview/ViewInfoStore$InfoRecord",
+      "android/support/v7/widget/helper/ItemTouchHelper$1": "androidx/widget/recyclerview/ItemTouchHelper$1",
+      "android/support/v7/widget/helper/ItemTouchHelper$2": "androidx/widget/recyclerview/ItemTouchHelper$2",
+      "android/support/v7/widget/helper/ItemTouchHelper$RecoverAnimation": "androidx/widget/recyclerview/ItemTouchHelper$RecoverAnimation",
+      "android/support/v7/widget/helper/ItemTouchHelper$Callback": "androidx/widget/recyclerview/ItemTouchHelper$Callback",
+      "android/support/v4/view/GestureDetectorCompat": "androidx/view/GestureDetectorCompat",
+      "android/support/v7/widget/helper/ItemTouchHelper$3": "androidx/widget/recyclerview/ItemTouchHelper$3",
+      "android/support/v7/widget/helper/ItemTouchHelper$4": "androidx/widget/recyclerview/ItemTouchHelper$4",
+      "android/support/v7/widget/helper/ItemTouchHelper$5": "androidx/widget/recyclerview/ItemTouchHelper$5",
+      "android/support/v7/widget/helper/ItemTouchHelper$Callback$1": "androidx/widget/recyclerview/ItemTouchHelper$Callback$1",
+      "android/support/v7/widget/helper/ItemTouchHelper$Callback$2": "androidx/widget/recyclerview/ItemTouchHelper$Callback$2",
+      "android/support/v7/widget/helper/ItemTouchUIUtilImpl$Api21Impl": "androidx/widget/recyclerview/ItemTouchUIUtilImpl$Api21Impl",
+      "android/support/v7/widget/helper/ItemTouchUIUtilImpl": "androidx/widget/recyclerview/ItemTouchUIUtilImpl",
+      "android/support/v7/widget/helper/ItemTouchUIUtilImpl$BaseImpl": "androidx/widget/recyclerview/ItemTouchUIUtilImpl$BaseImpl",
+      "android/support/v7/widget/helper/ItemTouchUIUtil": "androidx/widget/recyclerview/ItemTouchUIUtil",
+      "android/support/v7/widget/helper/ItemTouchHelper$ItemTouchHelperGestureListener": "androidx/widget/recyclerview/ItemTouchHelper$ItemTouchHelperGestureListener",
+      "android/support/v7/widget/helper/ItemTouchHelper$RecoverAnimation$1": "androidx/widget/recyclerview/ItemTouchHelper$RecoverAnimation$1",
+      "android/support/v7/widget/helper/ItemTouchHelper$SimpleCallback": "androidx/widget/recyclerview/ItemTouchHelper$SimpleCallback",
+      "android/support/v7/recyclerview/R$id": "androidx/recyclerview/R$id",
+      "android/support/v7/widget/util/SortedListAdapterCallback": "androidx/widget/recyclerview/SortedListAdapterCallback",
+      "android/arch/persistence/db/SupportSQLiteOpenHelper$Configuration$Builder": "androidx/persistence/db/SupportSQLiteOpenHelper$Configuration$Builder",
+      "android/arch/persistence/db/SupportSQLiteQueryBuilder": "androidx/persistence/db/SupportSQLiteQueryBuilder",
+      "android/support/v7/graphics/ColorCutQuantizer$1": "androidx/graphics/palette/ColorCutQuantizer$1",
+      "android/support/v7/graphics/ColorCutQuantizer$Vbox": "androidx/graphics/palette/ColorCutQuantizer$Vbox",
+      "android/support/v7/graphics/ColorCutQuantizer": "androidx/graphics/palette/ColorCutQuantizer",
+      "android/support/v7/graphics/Palette$Swatch": "androidx/graphics/palette/Palette$Swatch",
+      "android/support/v7/graphics/Palette": "androidx/graphics/palette/Palette",
+      "android/support/v7/graphics/Palette$Filter": "androidx/graphics/palette/Palette$Filter",
+      "android/support/v7/graphics/Palette$1": "androidx/graphics/palette/Palette$1",
+      "android/support/v7/graphics/Palette$Builder$1": "androidx/graphics/palette/Palette$Builder$1",
+      "android/support/v7/graphics/Palette$Builder": "androidx/graphics/palette/Palette$Builder",
+      "android/support/v7/graphics/Palette$PaletteAsyncListener": "androidx/graphics/palette/Palette$PaletteAsyncListener",
+      "android/support/v7/graphics/Target": "androidx/graphics/palette/Target",
+      "android/support/v7/graphics/Target$Builder": "androidx/graphics/palette/Target$Builder",
+      "android/support/v13/view/DragAndDropPermissionsCompat": "androidx/view/DragAndDropPermissionsCompat",
+      "android/support/v13/view/DragStartHelper$1": "androidx/view/DragStartHelper$1",
+      "android/support/v13/view/DragStartHelper": "androidx/view/DragStartHelper",
+      "android/support/v13/view/DragStartHelper$2": "androidx/view/DragStartHelper$2",
+      "android/support/v13/view/DragStartHelper$OnDragStartListener": "androidx/view/DragStartHelper$OnDragStartListener",
+      "android/support/v13/view/inputmethod/EditorInfoCompat": "androidx/view/inputmethod/EditorInfoCompat",
+      "android/support/v13/view/inputmethod/InputConnectionCompat$1": "androidx/view/inputmethod/InputConnectionCompat$1",
+      "android/support/v13/view/inputmethod/InputConnectionCompat": "androidx/view/inputmethod/InputConnectionCompat",
+      "android/support/v13/view/inputmethod/InputConnectionCompat$OnCommitContentListener": "androidx/view/inputmethod/InputConnectionCompat$OnCommitContentListener",
       "android/support/v13/view/inputmethod/InputContentInfoCompat": "androidx/view/inputmethod/InputContentInfoCompat",
+      "android/support/v13/view/inputmethod/InputConnectionCompat$2": "androidx/view/inputmethod/InputConnectionCompat$2",
+      "android/support/v13/view/inputmethod/InputContentInfoCompat$InputContentInfoCompatApi25Impl": "androidx/view/inputmethod/InputContentInfoCompat$InputContentInfoCompatApi25Impl",
+      "android/support/v13/view/inputmethod/InputContentInfoCompat$InputContentInfoCompatImpl": "androidx/view/inputmethod/InputContentInfoCompat$InputContentInfoCompatImpl",
+      "android/support/v13/view/inputmethod/InputContentInfoCompat$InputContentInfoCompatBaseImpl": "androidx/view/inputmethod/InputContentInfoCompat$InputContentInfoCompatBaseImpl",
+      "android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat": "androidx/accessibilityservice/AccessibilityServiceInfoCompat",
+      "android/support/v4/app/ActivityCompat$1": "androidx/app/ActivityCompat$1",
+      "android/support/v4/app/ActivityCompat$SharedElementCallback21Impl": "androidx/app/ActivityCompat$SharedElementCallback21Impl",
+      "android/support/v4/app/ActivityCompat$SharedElementCallback23Impl$1": "androidx/app/ActivityCompat$SharedElementCallback23Impl$1",
+      "android/support/v4/app/SharedElementCallback$OnSharedElementsReadyListener": "androidx/app/SharedElementCallback$OnSharedElementsReadyListener",
+      "android/support/v4/app/ActivityCompat$SharedElementCallback23Impl": "androidx/app/ActivityCompat$SharedElementCallback23Impl",
+      "android/support/v4/app/ActivityManagerCompat": "androidx/app/ActivityManagerCompat",
+      "android/support/v4/app/ActivityOptionsCompat$ActivityOptionsCompatApi16Impl": "androidx/app/ActivityOptionsCompat$ActivityOptionsCompatApi16Impl",
+      "android/support/v4/app/ActivityOptionsCompat": "androidx/app/ActivityOptionsCompat",
+      "android/support/v4/app/ActivityOptionsCompat$ActivityOptionsCompatApi23Impl": "androidx/app/ActivityOptionsCompat$ActivityOptionsCompatApi23Impl",
+      "android/support/v4/app/ActivityOptionsCompat$ActivityOptionsCompatApi24Impl": "androidx/app/ActivityOptionsCompat$ActivityOptionsCompatApi24Impl",
+      "android/support/v4/app/AlarmManagerCompat": "androidx/app/AlarmManagerCompat",
+      "android/support/v4/app/AppOpsManagerCompat": "androidx/app/AppOpsManagerCompat",
+      "android/support/v4/app/BundleCompat$BundleCompatBaseImpl": "androidx/app/BundleCompat$BundleCompatBaseImpl",
+      "android/support/v4/app/INotificationSideChannel$Stub$Proxy": "androidx/app/INotificationSideChannel$Stub$Proxy",
+      "android/support/v4/app/INotificationSideChannel": "androidx/app/INotificationSideChannel",
+      "android/support/v4/app/INotificationSideChannel$Stub": "androidx/app/INotificationSideChannel$Stub",
+      "android/support/v4/app/JobIntentService$CommandProcessor": "androidx/app/JobIntentService$CommandProcessor",
+      "android/support/v4/app/JobIntentService": "androidx/app/JobIntentService",
+      "android/support/v4/app/JobIntentService$GenericWorkItem": "androidx/app/JobIntentService$GenericWorkItem",
+      "android/support/v4/app/JobIntentService$CompatJobEngine": "androidx/app/JobIntentService$CompatJobEngine",
+      "android/support/v4/app/JobIntentService$CompatWorkEnqueuer": "androidx/app/JobIntentService$CompatWorkEnqueuer",
+      "android/support/v4/app/JobIntentService$WorkEnqueuer": "androidx/app/JobIntentService$WorkEnqueuer",
+      "android/support/v4/app/JobIntentService$CompatWorkItem": "androidx/app/JobIntentService$CompatWorkItem",
+      "android/support/v4/app/JobIntentService$JobServiceEngineImpl$WrapperWorkItem": "androidx/app/JobIntentService$JobServiceEngineImpl$WrapperWorkItem",
+      "android/support/v4/app/JobIntentService$JobServiceEngineImpl": "androidx/app/JobIntentService$JobServiceEngineImpl",
+      "android/support/v4/app/JobIntentService$JobWorkEnqueuer": "androidx/app/JobIntentService$JobWorkEnqueuer",
+      "android/support/v4/app/NotificationCompat$Action$Builder": "androidx/app/NotificationCompat$Action$Builder",
+      "android/support/v4/app/NotificationCompat$Action$Extender": "androidx/app/NotificationCompat$Action$Extender",
+      "android/support/v4/app/RemoteInput": "androidx/app/RemoteInput",
+      "android/support/v4/app/NotificationCompat$Action$WearableExtender": "androidx/app/NotificationCompat$Action$WearableExtender",
+      "android/support/v4/app/NotificationCompat$BadgeIconType": "androidx/app/NotificationCompat$BadgeIconType",
+      "android/support/v4/app/NotificationCompat$BigPictureStyle": "androidx/app/NotificationCompat$BigPictureStyle",
+      "android/support/v4/app/NotificationCompat$BigTextStyle": "androidx/app/NotificationCompat$BigTextStyle",
+      "android/support/v4/app/NotificationCompat$Extender": "androidx/app/NotificationCompat$Extender",
+      "android/support/v4/app/NotificationCompatBuilder": "androidx/app/NotificationCompatBuilder",
+      "android/support/v4/app/NotificationCompat$CarExtender$UnreadConversation$Builder": "androidx/app/NotificationCompat$CarExtender$UnreadConversation$Builder",
+      "android/support/v4/app/NotificationCompat$CarExtender": "androidx/app/NotificationCompat$CarExtender",
+      "android/support/v4/app/NotificationCompat$CarExtender$UnreadConversation": "androidx/app/NotificationCompat$CarExtender$UnreadConversation",
+      "android/support/v4/app/NotificationCompat$DecoratedCustomViewStyle": "androidx/app/NotificationCompat$DecoratedCustomViewStyle",
+      "android/support/compat/R$layout": "androidx/compat/R$layout",
+      "android/support/compat/R": "androidx/compat/R",
+      "android/support/compat/R$id": "androidx/compat/R$id",
+      "android/support/compat/R$color": "androidx/compat/R$color",
+      "android/support/v4/app/NotificationCompat$GroupAlertBehavior": "androidx/app/NotificationCompat$GroupAlertBehavior",
+      "android/support/v4/app/NotificationCompat$InboxStyle": "androidx/app/NotificationCompat$InboxStyle",
+      "android/support/v4/app/NotificationCompat$MessagingStyle$Message": "androidx/app/NotificationCompat$MessagingStyle$Message",
+      "android/support/v4/app/NotificationCompat$MessagingStyle": "androidx/app/NotificationCompat$MessagingStyle",
+      "android/support/v4/text/BidiFormatter": "androidx/text/BidiFormatter",
+      "android/support/v4/app/NotificationCompat$NotificationVisibility": "androidx/app/NotificationCompat$NotificationVisibility",
+      "android/support/v4/app/NotificationCompat$StreamType": "androidx/app/NotificationCompat$StreamType",
+      "android/support/compat/R$drawable": "androidx/compat/R$drawable",
+      "android/support/compat/R$dimen": "androidx/compat/R$dimen",
+      "android/support/compat/R$integer": "androidx/compat/R$integer",
+      "android/support/compat/R$string": "androidx/compat/R$string",
+      "android/support/v4/app/NotificationCompat$WearableExtender": "androidx/app/NotificationCompat$WearableExtender",
+      "android/support/v4/app/NotificationCompatJellybean": "androidx/app/NotificationCompatJellybean",
+      "android/support/v4/app/NotificationCompatExtras": "androidx/app/NotificationCompatExtras",
+      "android/support/v4/app/NotificationCompatSideChannelService$NotificationSideChannelStub": "androidx/app/NotificationCompatSideChannelService$NotificationSideChannelStub",
+      "android/support/v4/app/NotificationCompatSideChannelService": "androidx/app/NotificationCompatSideChannelService",
+      "android/support/v4/app/NotificationManagerCompat$CancelTask": "androidx/app/NotificationManagerCompat$CancelTask",
+      "android/support/v4/app/NotificationManagerCompat$Task": "androidx/app/NotificationManagerCompat$Task",
+      "android/support/v4/app/NotificationManagerCompat": "androidx/app/NotificationManagerCompat",
+      "android/support/v4/app/NotificationManagerCompat$NotifyTask": "androidx/app/NotificationManagerCompat$NotifyTask",
+      "android/support/v4/app/NotificationManagerCompat$ServiceConnectedEvent": "androidx/app/NotificationManagerCompat$ServiceConnectedEvent",
+      "android/support/v4/app/NotificationManagerCompat$SideChannelManager$ListenerRecord": "androidx/app/NotificationManagerCompat$SideChannelManager$ListenerRecord",
+      "android/support/v4/app/NotificationManagerCompat$SideChannelManager": "androidx/app/NotificationManagerCompat$SideChannelManager",
+      "android/support/v4/app/RemoteInput$Builder": "androidx/app/RemoteInput$Builder",
+      "android/support/v4/app/RemoteInputCompatBase$RemoteInput": "androidx/app/RemoteInputCompatBase$RemoteInput",
+      "android/support/v4/app/RemoteInputCompatBase": "androidx/app/RemoteInputCompatBase",
+      "android/support/v4/app/RemoteInputCompatBase$RemoteInput$Factory": "androidx/app/RemoteInputCompatBase$RemoteInput$Factory",
+      "android/support/v4/app/ServiceCompat$StopForegroundFlags": "androidx/app/ServiceCompat$StopForegroundFlags",
+      "android/support/v4/app/ServiceCompat": "androidx/app/ServiceCompat",
+      "android/support/v4/app/ShareCompat$IntentBuilder": "androidx/app/ShareCompat$IntentBuilder",
+      "android/support/v4/app/ShareCompat": "androidx/app/ShareCompat",
+      "android/support/v4/app/ShareCompat$IntentReader": "androidx/app/ShareCompat$IntentReader",
+      "android/support/v4/content/ContentResolverCompat": "androidx/content/ContentResolverCompat",
+      "android/support/v4/os/CancellationSignal": "androidx/os/CancellationSignal",
+      "android/support/v4/os/OperationCanceledException": "androidx/os/OperationCanceledException",
+      "android/support/v4/content/IntentCompat": "androidx/content/IntentCompat",
+      "android/support/v4/content/SharedPreferencesCompat$EditorCompat$Helper": "androidx/content/SharedPreferencesCompat$EditorCompat$Helper",
+      "android/support/v4/content/SharedPreferencesCompat$EditorCompat": "androidx/content/SharedPreferencesCompat$EditorCompat",
+      "android/support/v4/content/SharedPreferencesCompat": "androidx/content/SharedPreferencesCompat",
+      "android/support/v4/content/pm/ActivityInfoCompat": "androidx/content/pm/ActivityInfoCompat",
+      "android/support/v4/content/pm/ShortcutInfoCompat$1": "androidx/content/pm/ShortcutInfoCompat$1",
+      "android/support/v4/content/pm/ShortcutInfoCompat": "androidx/content/pm/ShortcutInfoCompat",
+      "android/support/v4/content/pm/ShortcutInfoCompat$Builder": "androidx/content/pm/ShortcutInfoCompat$Builder",
+      "android/support/v4/graphics/drawable/IconCompat": "androidx/graphics/drawable/IconCompat",
+      "android/support/v4/content/pm/ShortcutManagerCompat$1": "androidx/content/pm/ShortcutManagerCompat$1",
+      "android/support/v4/content/pm/ShortcutManagerCompat": "androidx/content/pm/ShortcutManagerCompat",
+      "android/support/v4/content/res/ConfigurationHelper": "androidx/content/res/ConfigurationHelper",
+      "android/support/v4/content/res/FontResourcesParserCompat$FamilyResourceEntry": "androidx/content/res/FontResourcesParserCompat$FamilyResourceEntry",
+      "android/support/v4/content/res/FontResourcesParserCompat": "androidx/content/res/FontResourcesParserCompat",
+      "android/support/v4/content/res/FontResourcesParserCompat$FetchStrategy": "androidx/content/res/FontResourcesParserCompat$FetchStrategy",
+      "android/support/v4/content/res/FontResourcesParserCompat$FontFamilyFilesResourceEntry": "androidx/content/res/FontResourcesParserCompat$FontFamilyFilesResourceEntry",
+      "android/support/v4/content/res/FontResourcesParserCompat$FontFileResourceEntry": "androidx/content/res/FontResourcesParserCompat$FontFileResourceEntry",
+      "android/support/v4/content/res/FontResourcesParserCompat$ProviderResourceEntry": "androidx/content/res/FontResourcesParserCompat$ProviderResourceEntry",
+      "android/support/v4/provider/FontRequest": "androidx/provider/FontRequest",
+      "android/support/compat/R$styleable": "androidx/compat/R$styleable",
+      "android/support/v4/content/res/ResourcesCompat$FontCallback$1": "androidx/content/res/ResourcesCompat$FontCallback$1",
+      "android/support/v4/content/res/ResourcesCompat$FontCallback$2": "androidx/content/res/ResourcesCompat$FontCallback$2",
+      "android/support/v4/provider/FontsContractCompat$FontRequestCallback": "androidx/provider/FontsContractCompat$FontRequestCallback",
+      "android/support/v4/provider/FontsContractCompat": "androidx/provider/FontsContractCompat",
+      "android/support/v4/graphics/TypefaceCompat": "androidx/graphics/TypefaceCompat",
+      "android/support/v4/database/DatabaseUtilsCompat": "androidx/database/DatabaseUtilsCompat",
+      "android/support/v4/graphics/BitmapCompat$BitmapCompatApi18Impl": "androidx/graphics/BitmapCompat$BitmapCompatApi18Impl",
+      "android/support/v4/graphics/BitmapCompat$BitmapCompatBaseImpl": "androidx/graphics/BitmapCompat$BitmapCompatBaseImpl",
+      "android/support/v4/graphics/BitmapCompat": "androidx/graphics/BitmapCompat",
+      "android/support/v4/graphics/BitmapCompat$BitmapCompatApi19Impl": "androidx/graphics/BitmapCompat$BitmapCompatApi19Impl",
+      "android/support/v4/graphics/PaintCompat": "androidx/graphics/PaintCompat",
+      "android/support/v4/graphics/PathParser$ExtractFloatResult": "androidx/graphics/PathParser$ExtractFloatResult",
+      "android/support/v4/graphics/TypefaceCompat$TypefaceCompatImpl": "androidx/graphics/TypefaceCompat$TypefaceCompatImpl",
+      "android/support/v4/provider/FontsContractCompat$FontInfo": "androidx/provider/FontsContractCompat$FontInfo",
+      "android/support/v4/graphics/TypefaceCompatApi26Impl": "androidx/graphics/TypefaceCompatApi26Impl",
+      "android/support/v4/graphics/TypefaceCompatApi24Impl": "androidx/graphics/TypefaceCompatApi24Impl",
+      "android/support/v4/graphics/TypefaceCompatApi21Impl": "androidx/graphics/TypefaceCompatApi21Impl",
+      "android/support/v4/graphics/TypefaceCompatBaseImpl": "androidx/graphics/TypefaceCompatBaseImpl",
+      "android/support/v4/graphics/TypefaceCompatUtil": "androidx/graphics/TypefaceCompatUtil",
+      "android/support/v4/graphics/TypefaceCompatBaseImpl$1": "androidx/graphics/TypefaceCompatBaseImpl$1",
+      "android/support/v4/graphics/TypefaceCompatBaseImpl$StyleExtractor": "androidx/graphics/TypefaceCompatBaseImpl$StyleExtractor",
+      "android/support/v4/graphics/TypefaceCompatBaseImpl$2": "androidx/graphics/TypefaceCompatBaseImpl$2",
+      "android/support/v4/graphics/drawable/WrappedDrawableApi21": "androidx/graphics/drawable/WrappedDrawableApi21",
+      "android/support/v4/graphics/drawable/WrappedDrawableApi19": "androidx/graphics/drawable/WrappedDrawableApi19",
+      "android/support/v4/graphics/drawable/WrappedDrawableApi14": "androidx/graphics/drawable/WrappedDrawableApi14",
+      "android/support/v4/graphics/drawable/WrappedDrawableApi14$DrawableWrapperState": "androidx/graphics/drawable/WrappedDrawableApi14$DrawableWrapperState",
+      "android/support/v4/graphics/drawable/WrappedDrawableApi14$DrawableWrapperStateBase": "androidx/graphics/drawable/WrappedDrawableApi14$DrawableWrapperStateBase",
+      "android/support/v4/graphics/drawable/WrappedDrawableApi19$DrawableWrapperStateKitKat": "androidx/graphics/drawable/WrappedDrawableApi19$DrawableWrapperStateKitKat",
+      "android/support/v4/graphics/drawable/WrappedDrawableApi21$DrawableWrapperStateLollipop": "androidx/graphics/drawable/WrappedDrawableApi21$DrawableWrapperStateLollipop",
+      "android/support/v4/hardware/display/DisplayManagerCompat$DisplayManagerCompatApi14Impl": "androidx/hardware/display/DisplayManagerCompat$DisplayManagerCompatApi14Impl",
+      "android/support/v4/hardware/display/DisplayManagerCompat": "androidx/hardware/display/DisplayManagerCompat",
+      "android/support/v4/hardware/display/DisplayManagerCompat$DisplayManagerCompatApi17Impl": "androidx/hardware/display/DisplayManagerCompat$DisplayManagerCompatApi17Impl",
+      "android/support/v4/hardware/fingerprint/FingerprintManagerCompat$1": "androidx/hardware/fingerprint/FingerprintManagerCompat$1",
+      "android/support/v4/hardware/fingerprint/FingerprintManagerCompat": "androidx/hardware/fingerprint/FingerprintManagerCompat",
+      "android/support/v4/hardware/fingerprint/FingerprintManagerCompat$AuthenticationCallback": "androidx/hardware/fingerprint/FingerprintManagerCompat$AuthenticationCallback",
+      "android/support/v4/hardware/fingerprint/FingerprintManagerCompat$AuthenticationResult": "androidx/hardware/fingerprint/FingerprintManagerCompat$AuthenticationResult",
+      "android/support/v4/hardware/fingerprint/FingerprintManagerCompat$CryptoObject": "androidx/hardware/fingerprint/FingerprintManagerCompat$CryptoObject",
+      "android/support/v4/net/ConnectivityManagerCompat$RestrictBackgroundStatus": "androidx/net/ConnectivityManagerCompat$RestrictBackgroundStatus",
+      "android/support/v4/net/ConnectivityManagerCompat": "androidx/net/ConnectivityManagerCompat",
+      "android/support/v4/net/DatagramSocketWrapper$DatagramSocketImplWrapper": "androidx/net/DatagramSocketWrapper$DatagramSocketImplWrapper",
+      "android/support/v4/net/DatagramSocketWrapper": "androidx/net/DatagramSocketWrapper",
+      "android/support/v4/net/TrafficStatsCompat": "androidx/net/TrafficStatsCompat",
+      "android/support/v4/os/BuildCompat": "androidx/os/BuildCompat",
+      "android/support/v4/os/CancellationSignal$OnCancelListener": "androidx/os/CancellationSignal$OnCancelListener",
+      "android/support/v4/os/ConfigurationCompat": "androidx/os/ConfigurationCompat",
+      "android/support/v4/os/LocaleListCompat": "androidx/os/LocaleListCompat",
+      "android/support/v4/os/EnvironmentCompat": "androidx/os/EnvironmentCompat",
+      "android/support/v4/os/IResultReceiver$Stub$Proxy": "androidx/os/IResultReceiver$Stub$Proxy",
+      "android/support/v4/os/IResultReceiver": "androidx/os/IResultReceiver",
+      "android/support/v4/os/IResultReceiver$Stub": "androidx/os/IResultReceiver$Stub",
+      "android/support/v4/os/LocaleHelper": "androidx/os/LocaleHelper",
+      "android/support/v4/os/LocaleListCompat$LocaleListCompatApi24Impl": "androidx/os/LocaleListCompat$LocaleListCompatApi24Impl",
+      "android/support/v4/os/LocaleListInterface": "androidx/os/LocaleListInterface",
+      "android/support/v4/os/LocaleListCompat$LocaleListCompatBaseImpl": "androidx/os/LocaleListCompat$LocaleListCompatBaseImpl",
+      "android/support/v4/os/LocaleListHelper": "androidx/os/LocaleListHelper",
+      "android/support/v4/os/ParcelableCompat$ParcelableCompatCreatorHoneycombMR2": "androidx/os/ParcelableCompat$ParcelableCompatCreatorHoneycombMR2",
+      "android/support/v4/os/ParcelableCompat": "androidx/os/ParcelableCompat",
+      "android/support/v4/os/ParcelableCompatCreatorCallbacks": "androidx/os/ParcelableCompatCreatorCallbacks",
+      "android/support/v4/os/ResultReceiver$1": "androidx/os/ResultReceiver$1",
+      "android/support/v4/os/ResultReceiver$MyResultReceiver": "androidx/os/ResultReceiver$MyResultReceiver",
+      "android/support/v4/os/ResultReceiver$MyRunnable": "androidx/os/ResultReceiver$MyRunnable",
+      "android/support/v4/os/UserManagerCompat": "androidx/os/UserManagerCompat",
+      "android/support/v4/provider/FontsContractCompat$1": "androidx/provider/FontsContractCompat$1",
+      "android/support/v4/provider/FontsContractCompat$TypefaceResult": "androidx/provider/FontsContractCompat$TypefaceResult",
+      "android/support/v4/provider/FontsContractCompat$2": "androidx/provider/FontsContractCompat$2",
+      "android/support/v4/provider/SelfDestructiveThread$ReplyCallback": "androidx/provider/SelfDestructiveThread$ReplyCallback",
+      "android/support/v4/provider/SelfDestructiveThread": "androidx/provider/SelfDestructiveThread",
+      "android/support/v4/provider/FontsContractCompat$3": "androidx/provider/FontsContractCompat$3",
+      "android/support/v4/provider/FontsContractCompat$4$1": "androidx/provider/FontsContractCompat$4$1",
+      "android/support/v4/provider/FontsContractCompat$4": "androidx/provider/FontsContractCompat$4",
+      "android/support/v4/provider/FontsContractCompat$4$2": "androidx/provider/FontsContractCompat$4$2",
+      "android/support/v4/provider/FontsContractCompat$4$3": "androidx/provider/FontsContractCompat$4$3",
+      "android/support/v4/provider/FontsContractCompat$4$4": "androidx/provider/FontsContractCompat$4$4",
+      "android/support/v4/provider/FontsContractCompat$4$5": "androidx/provider/FontsContractCompat$4$5",
+      "android/support/v4/provider/FontsContractCompat$4$6": "androidx/provider/FontsContractCompat$4$6",
+      "android/support/v4/provider/FontsContractCompat$4$7": "androidx/provider/FontsContractCompat$4$7",
+      "android/support/v4/provider/FontsContractCompat$4$8": "androidx/provider/FontsContractCompat$4$8",
+      "android/support/v4/provider/FontsContractCompat$4$9": "androidx/provider/FontsContractCompat$4$9",
+      "android/support/v4/provider/FontsContractCompat$FontFamilyResult": "androidx/provider/FontsContractCompat$FontFamilyResult",
+      "android/support/v4/provider/FontsContractCompat$5": "androidx/provider/FontsContractCompat$5",
+      "android/support/v4/provider/FontsContractCompat$Columns": "androidx/provider/FontsContractCompat$Columns",
+      "android/support/v4/provider/FontsContractCompat$FontFamilyResult$FontResultStatus": "androidx/provider/FontsContractCompat$FontFamilyResult$FontResultStatus",
+      "android/support/v4/provider/FontsContractCompat$FontRequestCallback$FontRequestFailReason": "androidx/provider/FontsContractCompat$FontRequestCallback$FontRequestFailReason",
+      "android/support/v4/provider/SelfDestructiveThread$1": "androidx/provider/SelfDestructiveThread$1",
+      "android/support/v4/provider/SelfDestructiveThread$2$1": "androidx/provider/SelfDestructiveThread$2$1",
+      "android/support/v4/provider/SelfDestructiveThread$2": "androidx/provider/SelfDestructiveThread$2",
+      "android/support/v4/provider/SelfDestructiveThread$3": "androidx/provider/SelfDestructiveThread$3",
+      "android/support/v4/text/BidiFormatter$1": "androidx/text/BidiFormatter$1",
+      "android/support/v4/text/BidiFormatter$Builder": "androidx/text/BidiFormatter$Builder",
+      "android/support/v4/text/TextDirectionHeuristicCompat": "androidx/text/TextDirectionHeuristicCompat",
+      "android/support/v4/text/BidiFormatter$DirectionalityEstimator": "androidx/text/BidiFormatter$DirectionalityEstimator",
+      "android/support/v4/text/TextDirectionHeuristicsCompat": "androidx/text/TextDirectionHeuristicsCompat",
+      "android/support/v4/text/TextUtilsCompat": "androidx/text/TextUtilsCompat",
+      "android/support/v4/text/ICUCompat": "androidx/text/ICUCompat",
+      "android/support/v4/text/TextDirectionHeuristicsCompat$AnyStrong": "androidx/text/TextDirectionHeuristicsCompat$AnyStrong",
+      "android/support/v4/text/TextDirectionHeuristicsCompat$TextDirectionAlgorithm": "androidx/text/TextDirectionHeuristicsCompat$TextDirectionAlgorithm",
+      "android/support/v4/text/TextDirectionHeuristicsCompat$FirstStrong": "androidx/text/TextDirectionHeuristicsCompat$FirstStrong",
+      "android/support/v4/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicImpl": "androidx/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicImpl",
+      "android/support/v4/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicInternal": "androidx/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicInternal",
+      "android/support/v4/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicLocale": "androidx/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicLocale",
+      "android/support/v4/text/util/LinkifyCompat$1": "androidx/text/util/LinkifyCompat$1",
+      "android/support/v4/text/util/LinkifyCompat$LinkSpec": "androidx/text/util/LinkifyCompat$LinkSpec",
+      "android/support/v4/text/util/LinkifyCompat": "androidx/text/util/LinkifyCompat",
+      "android/support/v4/text/util/LinkifyCompat$LinkifyMask": "androidx/text/util/LinkifyCompat$LinkifyMask",
+      "android/support/v4/util/PatternsCompat": "androidx/util/PatternsCompat",
+      "android/support/v4/util/ArrayMap$1": "androidx/util/ArrayMap$1",
+      "android/support/v4/util/MapCollections": "androidx/util/MapCollections",
+      "android/support/v4/util/ArraySet$1": "androidx/util/ArraySet$1",
+      "android/support/v4/util/ContainerHelpers": "androidx/util/ContainerHelpers",
+      "android/support/v4/util/AtomicFile": "androidx/util/AtomicFile",
+      "android/support/v4/util/MapCollections$ArrayIterator": "androidx/util/MapCollections$ArrayIterator",
+      "android/support/v4/util/MapCollections$EntrySet": "androidx/util/MapCollections$EntrySet",
+      "android/support/v4/util/MapCollections$MapIterator": "androidx/util/MapCollections$MapIterator",
+      "android/support/v4/util/MapCollections$KeySet": "androidx/util/MapCollections$KeySet",
+      "android/support/v4/util/MapCollections$ValuesCollection": "androidx/util/MapCollections$ValuesCollection",
+      "android/support/v4/util/TimeUtils": "androidx/util/TimeUtils",
+      "android/support/v4/view/AccessibilityDelegateCompat$AccessibilityDelegateApi16Impl$1": "androidx/view/AccessibilityDelegateCompat$AccessibilityDelegateApi16Impl$1",
+      "android/support/v4/view/AccessibilityDelegateCompat$AccessibilityDelegateApi16Impl": "androidx/view/AccessibilityDelegateCompat$AccessibilityDelegateApi16Impl",
+      "android/support/v4/view/AccessibilityDelegateCompat$AccessibilityDelegateBaseImpl": "androidx/view/AccessibilityDelegateCompat$AccessibilityDelegateBaseImpl",
+      "android/support/v4/view/AccessibilityDelegateCompat$AccessibilityDelegateBaseImpl$1": "androidx/view/AccessibilityDelegateCompat$AccessibilityDelegateBaseImpl$1",
+      "android/support/v4/view/GestureDetectorCompat$GestureDetectorCompatImpl": "androidx/view/GestureDetectorCompat$GestureDetectorCompatImpl",
+      "android/support/v4/view/GestureDetectorCompat$GestureDetectorCompatImplBase$GestureHandler": "androidx/view/GestureDetectorCompat$GestureDetectorCompatImplBase$GestureHandler",
+      "android/support/v4/view/GestureDetectorCompat$GestureDetectorCompatImplBase": "androidx/view/GestureDetectorCompat$GestureDetectorCompatImplBase",
+      "android/support/v4/view/GestureDetectorCompat$GestureDetectorCompatImplJellybeanMr2": "androidx/view/GestureDetectorCompat$GestureDetectorCompatImplJellybeanMr2",
+      "android/support/v4/view/InputDeviceCompat": "androidx/view/InputDeviceCompat",
+      "android/support/v4/view/LayoutInflaterCompat$Factory2Wrapper": "androidx/view/LayoutInflaterCompat$Factory2Wrapper",
+      "android/support/v4/view/LayoutInflaterFactory": "androidx/view/LayoutInflaterFactory",
+      "android/support/v4/view/LayoutInflaterCompat$LayoutInflaterCompatApi21Impl": "androidx/view/LayoutInflaterCompat$LayoutInflaterCompatApi21Impl",
+      "android/support/v4/view/LayoutInflaterCompat$LayoutInflaterCompatBaseImpl": "androidx/view/LayoutInflaterCompat$LayoutInflaterCompatBaseImpl",
+      "android/support/v4/view/MenuCompat": "androidx/view/MenuCompat",
+      "android/support/v4/view/MenuItemCompat$1": "androidx/view/MenuItemCompat$1",
+      "android/support/v4/view/MenuItemCompat$OnActionExpandListener": "androidx/view/MenuItemCompat$OnActionExpandListener",
+      "android/support/v4/view/MenuItemCompat$MenuItemCompatApi26Impl": "androidx/view/MenuItemCompat$MenuItemCompatApi26Impl",
+      "android/support/v4/view/MenuItemCompat$MenuItemCompatBaseImpl": "androidx/view/MenuItemCompat$MenuItemCompatBaseImpl",
+      "android/support/v4/view/MenuItemCompat$MenuVersionImpl": "androidx/view/MenuItemCompat$MenuVersionImpl",
+      "android/support/v4/view/PointerIconCompat": "androidx/view/PointerIconCompat",
+      "android/support/v4/view/ScaleGestureDetectorCompat": "androidx/view/ScaleGestureDetectorCompat",
+      "android/support/v4/view/VelocityTrackerCompat": "androidx/view/VelocityTrackerCompat",
+      "android/support/v4/view/ViewCompat$AccessibilityLiveRegion": "androidx/view/ViewCompat$AccessibilityLiveRegion",
+      "android/support/v4/view/ViewCompat$AutofillImportance": "androidx/view/ViewCompat$AutofillImportance",
+      "android/support/v4/view/ViewCompat$FocusDirection": "androidx/view/ViewCompat$FocusDirection",
+      "android/support/v4/view/ViewCompat$FocusRealDirection": "androidx/view/ViewCompat$FocusRealDirection",
+      "android/support/v4/view/ViewCompat$FocusRelativeDirection": "androidx/view/ViewCompat$FocusRelativeDirection",
+      "android/support/v4/view/ViewCompat$ImportantForAccessibility": "androidx/view/ViewCompat$ImportantForAccessibility",
+      "android/support/v4/view/ViewCompat$LayerType": "androidx/view/ViewCompat$LayerType",
+      "android/support/v4/view/ViewCompat$LayoutDirectionMode": "androidx/view/ViewCompat$LayoutDirectionMode",
+      "android/support/v4/view/ViewCompat$NestedScrollType": "androidx/view/ViewCompat$NestedScrollType",
+      "android/support/v4/view/ViewCompat$OverScroll": "androidx/view/ViewCompat$OverScroll",
+      "android/support/v4/view/ViewCompat$ResolvedLayoutDirectionMode": "androidx/view/ViewCompat$ResolvedLayoutDirectionMode",
+      "android/support/v4/view/ViewCompat$ScrollAxis": "androidx/view/ViewCompat$ScrollAxis",
+      "android/support/v4/view/ViewCompat$ScrollIndicators": "androidx/view/ViewCompat$ScrollIndicators",
+      "android/support/v4/view/ViewCompat$ViewCompatApi15Impl": "androidx/view/ViewCompat$ViewCompatApi15Impl",
+      "android/support/v4/view/ViewCompat$ViewCompatBaseImpl": "androidx/view/ViewCompat$ViewCompatBaseImpl",
+      "android/support/v4/view/ViewCompat$ViewCompatApi16Impl": "androidx/view/ViewCompat$ViewCompatApi16Impl",
+      "android/support/v4/view/ViewCompat$ViewCompatApi17Impl": "androidx/view/ViewCompat$ViewCompatApi17Impl",
+      "android/support/v4/view/ViewCompat$ViewCompatApi18Impl": "androidx/view/ViewCompat$ViewCompatApi18Impl",
+      "android/support/v4/view/ViewCompat$ViewCompatApi19Impl": "androidx/view/ViewCompat$ViewCompatApi19Impl",
+      "android/support/v4/view/ViewCompat$ViewCompatApi21Impl$1": "androidx/view/ViewCompat$ViewCompatApi21Impl$1",
+      "android/support/v4/view/ViewCompat$ViewCompatApi21Impl": "androidx/view/ViewCompat$ViewCompatApi21Impl",
+      "android/support/v4/view/ViewCompat$ViewCompatApi23Impl": "androidx/view/ViewCompat$ViewCompatApi23Impl",
+      "android/support/v4/view/ViewCompat$ViewCompatApi24Impl": "androidx/view/ViewCompat$ViewCompatApi24Impl",
+      "android/support/v4/view/ViewCompat$ViewCompatApi26Impl": "androidx/view/ViewCompat$ViewCompatApi26Impl",
+      "android/support/v4/view/ViewGroupCompat$ViewGroupCompatApi18Impl": "androidx/view/ViewGroupCompat$ViewGroupCompatApi18Impl",
+      "android/support/v4/view/ViewGroupCompat$ViewGroupCompatBaseImpl": "androidx/view/ViewGroupCompat$ViewGroupCompatBaseImpl",
+      "android/support/v4/view/ViewGroupCompat$ViewGroupCompatApi21Impl": "androidx/view/ViewGroupCompat$ViewGroupCompatApi21Impl",
+      "android/support/v4/view/ViewParentCompat$ViewParentCompatApi19Impl": "androidx/view/ViewParentCompat$ViewParentCompatApi19Impl",
+      "android/support/v4/view/ViewParentCompat$ViewParentCompatBaseImpl": "androidx/view/ViewParentCompat$ViewParentCompatBaseImpl",
+      "android/support/v4/view/ViewParentCompat$ViewParentCompatApi21Impl": "androidx/view/ViewParentCompat$ViewParentCompatApi21Impl",
+      "android/support/v4/view/ViewPropertyAnimatorCompat$1": "androidx/view/ViewPropertyAnimatorCompat$1",
+      "android/support/v4/view/ViewPropertyAnimatorCompat$2": "androidx/view/ViewPropertyAnimatorCompat$2",
+      "android/support/v4/view/ViewPropertyAnimatorCompat$ViewPropertyAnimatorListenerApi14": "androidx/view/ViewPropertyAnimatorCompat$ViewPropertyAnimatorListenerApi14",
+      "android/support/v4/view/WindowCompat": "androidx/view/WindowCompat",
+      "android/support/v4/view/accessibility/AccessibilityManagerCompat$AccessibilityStateChangeListener": "androidx/view/accessibility/AccessibilityManagerCompat$AccessibilityStateChangeListener",
+      "android/support/v4/view/accessibility/AccessibilityManagerCompat": "androidx/view/accessibility/AccessibilityManagerCompat",
+      "android/support/v4/view/accessibility/AccessibilityManagerCompat$AccessibilityStateChangeListenerCompat": "androidx/view/accessibility/AccessibilityManagerCompat$AccessibilityStateChangeListenerCompat",
+      "android/support/v4/view/accessibility/AccessibilityManagerCompat$AccessibilityStateChangeListenerWrapper": "androidx/view/accessibility/AccessibilityManagerCompat$AccessibilityStateChangeListenerWrapper",
+      "android/support/v4/view/accessibility/AccessibilityManagerCompat$TouchExplorationStateChangeListener": "androidx/view/accessibility/AccessibilityManagerCompat$TouchExplorationStateChangeListener",
+      "android/support/v4/view/accessibility/AccessibilityManagerCompat$TouchExplorationStateChangeListenerWrapper": "androidx/view/accessibility/AccessibilityManagerCompat$TouchExplorationStateChangeListenerWrapper",
+      "android/support/v4/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat": "androidx/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat",
+      "android/support/v4/view/accessibility/AccessibilityWindowInfoCompat": "androidx/view/accessibility/AccessibilityWindowInfoCompat",
+      "android/support/v4/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi16": "androidx/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi16",
+      "android/support/v4/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi19": "androidx/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi19",
+      "android/support/v4/view/animation/PathInterpolatorApi14": "androidx/view/animation/PathInterpolatorApi14",
+      "android/support/v4/view/animation/PathInterpolatorCompat": "androidx/view/animation/PathInterpolatorCompat",
+      "android/support/v4/widget/CompoundButtonCompat$CompoundButtonCompatApi21Impl": "androidx/widget/CompoundButtonCompat$CompoundButtonCompatApi21Impl",
+      "android/support/v4/widget/CompoundButtonCompat$CompoundButtonCompatBaseImpl": "androidx/widget/CompoundButtonCompat$CompoundButtonCompatBaseImpl",
+      "android/support/v4/widget/CompoundButtonCompat$CompoundButtonCompatApi23Impl": "androidx/widget/CompoundButtonCompat$CompoundButtonCompatApi23Impl",
+      "android/support/v4/widget/EdgeEffectCompat$EdgeEffectApi21Impl": "androidx/widget/EdgeEffectCompat$EdgeEffectApi21Impl",
+      "android/support/v4/widget/EdgeEffectCompat$EdgeEffectBaseImpl": "androidx/widget/EdgeEffectCompat$EdgeEffectBaseImpl",
+      "android/support/v4/widget/ImageViewCompat$BaseViewCompatImpl": "androidx/widget/ImageViewCompat$BaseViewCompatImpl",
+      "android/support/v4/widget/ImageViewCompat$ImageViewCompatImpl": "androidx/widget/ImageViewCompat$ImageViewCompatImpl",
+      "android/support/v4/widget/ImageViewCompat$LollipopViewCompatImpl": "androidx/widget/ImageViewCompat$LollipopViewCompatImpl",
+      "android/support/v4/widget/ListPopupWindowCompat": "androidx/widget/ListPopupWindowCompat",
+      "android/support/v4/widget/PopupMenuCompat": "androidx/widget/PopupMenuCompat",
+      "android/support/v4/widget/PopupWindowCompat$PopupWindowCompatApi19Impl": "androidx/widget/PopupWindowCompat$PopupWindowCompatApi19Impl",
+      "android/support/v4/widget/PopupWindowCompat$PopupWindowCompatBaseImpl": "androidx/widget/PopupWindowCompat$PopupWindowCompatBaseImpl",
+      "android/support/v4/widget/PopupWindowCompat$PopupWindowCompatApi21Impl": "androidx/widget/PopupWindowCompat$PopupWindowCompatApi21Impl",
+      "android/support/v4/widget/PopupWindowCompat$PopupWindowCompatApi23Impl": "androidx/widget/PopupWindowCompat$PopupWindowCompatApi23Impl",
+      "android/support/v4/widget/ScrollerCompat": "androidx/widget/ScrollerCompat",
+      "android/support/v4/widget/TextViewCompat$AutoSizeTextType": "androidx/widget/TextViewCompat$AutoSizeTextType",
+      "android/support/v4/widget/TextViewCompat$TextViewCompatApi16Impl": "androidx/widget/TextViewCompat$TextViewCompatApi16Impl",
+      "android/support/v4/widget/TextViewCompat$TextViewCompatBaseImpl": "androidx/widget/TextViewCompat$TextViewCompatBaseImpl",
+      "android/support/v4/widget/TextViewCompat$TextViewCompatApi17Impl": "androidx/widget/TextViewCompat$TextViewCompatApi17Impl",
+      "android/support/v4/widget/TextViewCompat$TextViewCompatApi18Impl": "androidx/widget/TextViewCompat$TextViewCompatApi18Impl",
+      "android/support/v4/widget/TextViewCompat$TextViewCompatApi23Impl": "androidx/widget/TextViewCompat$TextViewCompatApi23Impl",
+      "android/support/v4/widget/TextViewCompat$TextViewCompatApi26Impl$1": "androidx/widget/TextViewCompat$TextViewCompatApi26Impl$1",
+      "android/support/v4/widget/TextViewCompat$TextViewCompatApi26Impl": "androidx/widget/TextViewCompat$TextViewCompatApi26Impl",
+      "android/support/v4/widget/TextViewCompat$TextViewCompatApi27Impl": "androidx/widget/TextViewCompat$TextViewCompatApi27Impl",
+      "android/support/v13/app/ActivityCompat": "androidx/legacy/app/ActivityCompat",
+      "android/support/v13/app/FragmentCompat$FragmentCompatApi15Impl": "androidx/legacy/app/FragmentCompat$FragmentCompatApi15Impl",
+      "android/support/v13/app/FragmentCompat$FragmentCompatBaseImpl": "androidx/legacy/app/FragmentCompat$FragmentCompatBaseImpl",
+      "android/support/v13/app/FragmentCompat": "androidx/legacy/app/FragmentCompat",
+      "android/support/v13/app/FragmentCompat$FragmentCompatApi23Impl": "androidx/legacy/app/FragmentCompat$FragmentCompatApi23Impl",
+      "android/support/v13/app/FragmentCompat$FragmentCompatApi24Impl": "androidx/legacy/app/FragmentCompat$FragmentCompatApi24Impl",
+      "android/support/v13/app/FragmentCompat$FragmentCompatBaseImpl$1": "androidx/legacy/app/FragmentCompat$FragmentCompatBaseImpl$1",
+      "android/support/v13/app/FragmentCompat$OnRequestPermissionsResultCallback": "androidx/legacy/app/FragmentCompat$OnRequestPermissionsResultCallback",
+      "android/support/v13/app/FragmentCompat$FragmentCompatImpl": "androidx/legacy/app/FragmentCompat$FragmentCompatImpl",
+      "android/support/v13/app/FragmentCompat$PermissionCompatDelegate": "androidx/legacy/app/FragmentCompat$PermissionCompatDelegate",
+      "android/support/v13/app/FragmentPagerAdapter": "androidx/legacy/app/FragmentPagerAdapter",
+      "android/support/v13/app/FragmentStatePagerAdapter": "androidx/legacy/app/FragmentStatePagerAdapter",
+      "android/support/v13/app/FragmentTabHost$DummyTabFactory": "androidx/legacy/app/FragmentTabHost$DummyTabFactory",
+      "android/support/v13/app/FragmentTabHost": "androidx/legacy/app/FragmentTabHost",
+      "android/support/v13/app/FragmentTabHost$SavedState$1": "androidx/legacy/app/FragmentTabHost$SavedState$1",
+      "android/support/v13/app/FragmentTabHost$SavedState": "androidx/legacy/app/FragmentTabHost$SavedState",
+      "android/support/v13/app/FragmentTabHost$TabInfo": "androidx/legacy/app/FragmentTabHost$TabInfo",
+      "android/support/v13/view/ViewCompat": "androidx/legacy/view/ViewCompat",
+      "android/arch/core/executor/JunitTaskExecutorRule$1": "androidx/core/executor/JunitTaskExecutorRule$1",
+      "android/arch/core/executor/JunitTaskExecutorRule": "androidx/core/executor/JunitTaskExecutorRule",
+      "android/arch/core/executor/TaskExecutorWithFakeMainThread": "androidx/core/executor/TaskExecutorWithFakeMainThread",
+      "android/arch/core/executor/TaskExecutor": "androidx/core/executor/TaskExecutor",
+      "android/arch/core/executor/TaskExecutorWithFakeMainThread$1": "androidx/core/executor/TaskExecutorWithFakeMainThread$1",
+      "android/arch/core/executor/TaskExecutorWithFakeMainThread$LoggingThread": "androidx/core/executor/TaskExecutorWithFakeMainThread$LoggingThread",
+      "android/arch/core/executor/TaskExecutorWithFakeMainThread$2": "androidx/core/executor/TaskExecutorWithFakeMainThread$2",
+      "android/arch/core/executor/TaskExecutorWithFakeMainThread$3": "androidx/core/executor/TaskExecutorWithFakeMainThread$3",
+      "android/arch/core/executor/TaskExecutorWithFakeMainThread$4": "androidx/core/executor/TaskExecutorWithFakeMainThread$4",
+      "android/arch/core/executor/TaskExecutorWithFakeMainThread$LoggingThread$1": "androidx/core/executor/TaskExecutorWithFakeMainThread$LoggingThread$1",
+      "android/arch/core/executor/testing/CountingTaskExecutorRule$1": "androidx/core/executor/testing/CountingTaskExecutorRule$1",
+      "android/arch/core/executor/DefaultTaskExecutor": "androidx/core/executor/DefaultTaskExecutor",
+      "android/arch/core/executor/testing/CountingTaskExecutorRule": "androidx/core/executor/testing/CountingTaskExecutorRule",
+      "android/arch/core/executor/testing/CountingTaskExecutorRule$CountingRunnable": "androidx/core/executor/testing/CountingTaskExecutorRule$CountingRunnable",
+      "android/arch/core/executor/testing/InstantTaskExecutorRule$1": "androidx/core/executor/testing/InstantTaskExecutorRule$1",
+      "android/arch/core/executor/testing/InstantTaskExecutorRule": "androidx/core/executor/testing/InstantTaskExecutorRule",
+      "android/support/v17/internal/widget/OutlineOnlyWithChildrenFrameLayout$1": "androidx/leanback/preference/internal/OutlineOnlyWithChildrenFrameLayout$1",
+      "android/support/v17/internal/widget/OutlineOnlyWithChildrenFrameLayout": "androidx/leanback/preference/internal/OutlineOnlyWithChildrenFrameLayout",
+      "android/support/v17/preference/BaseLeanbackPreferenceFragment": "androidx/leanback/preference/BaseLeanbackPreferenceFragment",
+      "android/support/v17/preference/R$layout": "androidx/leanback/preference/R$layout",
+      "android/support/v17/preference/R": "androidx/leanback/preference/R",
+      "android/support/v17/preference/LeanbackListPreferenceDialogFragment$AdapterMulti": "androidx/leanback/preference/LeanbackListPreferenceDialogFragment$AdapterMulti",
+      "android/support/v17/preference/LeanbackListPreferenceDialogFragment$ViewHolder": "androidx/leanback/preference/LeanbackListPreferenceDialogFragment$ViewHolder",
+      "android/support/v17/preference/LeanbackListPreferenceDialogFragment$ViewHolder$OnItemClickListener": "androidx/leanback/preference/LeanbackListPreferenceDialogFragment$ViewHolder$OnItemClickListener",
+      "android/support/v17/preference/LeanbackListPreferenceDialogFragment": "androidx/leanback/preference/LeanbackListPreferenceDialogFragment",
+      "android/support/v17/preference/LeanbackListPreferenceDialogFragment$AdapterSingle": "androidx/leanback/preference/LeanbackListPreferenceDialogFragment$AdapterSingle",
+      "android/support/v17/preference/R$id": "androidx/leanback/preference/R$id",
+      "android/support/v17/preference/LeanbackPreferenceDialogFragment": "androidx/leanback/preference/LeanbackPreferenceDialogFragment",
+      "android/support/v17/preference/LeanbackPreferenceFragmentTransitionHelperApi21": "androidx/leanback/preference/LeanbackPreferenceFragmentTransitionHelperApi21",
+      "android/support/v17/preference/LeanbackPreferenceFragment": "androidx/leanback/preference/LeanbackPreferenceFragment",
+      "android/support/v17/preference/LeanbackSettingsFragment$1": "androidx/leanback/preference/LeanbackSettingsFragment$1",
+      "android/support/v17/preference/LeanbackSettingsFragment": "androidx/leanback/preference/LeanbackSettingsFragment",
+      "android/support/v17/preference/LeanbackSettingsFragment$DummyFragment": "androidx/leanback/preference/LeanbackSettingsFragment$DummyFragment",
+      "android/support/v17/preference/LeanbackSettingsFragment$RootViewOnKeyListener": "androidx/leanback/preference/LeanbackSettingsFragment$RootViewOnKeyListener",
+      "android/support/v17/preference/LeanbackSettingsRootView": "androidx/leanback/preference/LeanbackSettingsRootView",
+      "android/support/percent/PercentFrameLayout$LayoutParams": "androidx/widget/PercentFrameLayout$LayoutParams",
+      "android/support/percent/PercentLayoutHelper$PercentLayoutParams": "androidx/widget/PercentLayoutHelper$PercentLayoutParams",
+      "android/support/percent/PercentLayoutHelper$PercentLayoutInfo": "androidx/widget/PercentLayoutHelper$PercentLayoutInfo",
+      "android/support/percent/PercentLayoutHelper": "androidx/widget/PercentLayoutHelper",
+      "android/support/percent/PercentFrameLayout": "androidx/widget/PercentFrameLayout",
+      "android/support/percent/PercentLayoutHelper$PercentMarginLayoutParams": "androidx/widget/PercentLayoutHelper$PercentMarginLayoutParams",
+      "android/support/percent/R$styleable": "androidx/widget/R$styleable",
+      "android/support/percent/R": "androidx/widget/R",
+      "android/support/percent/PercentRelativeLayout$LayoutParams": "androidx/widget/PercentRelativeLayout$LayoutParams",
+      "android/support/percent/PercentRelativeLayout": "androidx/widget/PercentRelativeLayout",
+      "android/support/app/recommendation/ContentRecommendation$1": "androidx/app/recommendation/ContentRecommendation$1",
+      "android/support/app/recommendation/ContentRecommendation": "androidx/app/recommendation/ContentRecommendation",
+      "android/support/app/recommendation/ContentRecommendation$Builder": "androidx/app/recommendation/ContentRecommendation$Builder",
+      "android/support/app/recommendation/ContentRecommendation$IntentData": "androidx/app/recommendation/ContentRecommendation$IntentData",
+      "android/support/app/recommendation/ContentRecommendation$ContentMaturity": "androidx/app/recommendation/ContentRecommendation$ContentMaturity",
+      "android/support/app/recommendation/ContentRecommendation$ContentPricing": "androidx/app/recommendation/ContentRecommendation$ContentPricing",
+      "android/support/app/recommendation/ContentRecommendation$ContentStatus": "androidx/app/recommendation/ContentRecommendation$ContentStatus",
+      "android/support/app/recommendation/ContentRecommendation$ContentType": "androidx/app/recommendation/ContentRecommendation$ContentType",
+      "android/support/app/recommendation/ContentRecommendation$IntentType": "androidx/app/recommendation/ContentRecommendation$IntentType",
+      "android/support/app/recommendation/RecommendationExtender": "androidx/app/recommendation/RecommendationExtender",
+      "android/support/media/tv/BasePreviewProgram$AspectRatio": "androidx/media/tv/BasePreviewProgram$AspectRatio",
+      "android/support/media/tv/BasePreviewProgram": "androidx/media/tv/BasePreviewProgram",
+      "android/support/media/tv/BasePreviewProgram$Availability": "androidx/media/tv/BasePreviewProgram$Availability",
+      "android/support/media/tv/BasePreviewProgram$Builder": "androidx/media/tv/BasePreviewProgram$Builder",
+      "android/support/media/tv/BaseProgram$Builder": "androidx/media/tv/BaseProgram$Builder",
+      "android/support/media/tv/BaseProgram": "androidx/media/tv/BaseProgram",
+      "android/support/media/tv/TvContractCompat$PreviewPrograms": "androidx/media/tv/TvContractCompat$PreviewPrograms",
+      "android/support/media/tv/TvContractCompat": "androidx/media/tv/TvContractCompat",
+      "android/support/media/tv/BasePreviewProgram$InteractionType": "androidx/media/tv/BasePreviewProgram$InteractionType",
+      "android/support/media/tv/BasePreviewProgram$Type": "androidx/media/tv/BasePreviewProgram$Type",
+      "android/support/media/tv/TvContractCompat$PreviewProgramColumns": "androidx/media/tv/TvContractCompat$PreviewProgramColumns",
+      "android/support/media/tv/CollectionUtils": "androidx/media/tv/CollectionUtils",
+      "android/support/media/tv/TvContractCompat$BaseTvColumns": "androidx/media/tv/TvContractCompat$BaseTvColumns",
+      "android/support/media/tv/TvContractCompat$Programs": "androidx/media/tv/TvContractCompat$Programs",
+      "android/support/media/tv/TvContractCompat$ProgramColumns": "androidx/media/tv/TvContractCompat$ProgramColumns",
+      "android/support/media/tv/TvContractCompat$Programs$Genres": "androidx/media/tv/TvContractCompat$Programs$Genres",
+      "android/support/media/tv/TvContractUtils": "androidx/media/tv/TvContractUtils",
+      "android/support/media/tv/BaseProgram$ReviewRatingStyle": "androidx/media/tv/BaseProgram$ReviewRatingStyle",
+      "android/support/media/tv/Channel$1": "androidx/media/tv/Channel$1",
+      "android/support/media/tv/Channel": "androidx/media/tv/Channel",
+      "android/support/media/tv/Channel$Builder": "androidx/media/tv/Channel$Builder",
+      "android/support/media/tv/TvContractCompat$Channels": "androidx/media/tv/TvContractCompat$Channels",
+      "android/support/media/tv/ChannelLogoUtils": "androidx/media/tv/ChannelLogoUtils",
+      "android/support/media/tv/PreviewProgram$1": "androidx/media/tv/PreviewProgram$1",
+      "android/support/media/tv/PreviewProgram": "androidx/media/tv/PreviewProgram",
+      "android/support/media/tv/PreviewProgram$Builder": "androidx/media/tv/PreviewProgram$Builder",
+      "android/support/media/tv/Program$1": "androidx/media/tv/Program$1",
+      "android/support/media/tv/Program": "androidx/media/tv/Program",
+      "android/support/media/tv/Program$Builder": "androidx/media/tv/Program$Builder",
+      "android/support/media/tv/TvContractCompat$Channels$Logo": "androidx/media/tv/TvContractCompat$Channels$Logo",
+      "android/support/media/tv/TvContractCompat$Channels$ServiceType": "androidx/media/tv/TvContractCompat$Channels$ServiceType",
+      "android/support/media/tv/TvContractCompat$Channels$Type": "androidx/media/tv/TvContractCompat$Channels$Type",
+      "android/support/media/tv/TvContractCompat$Channels$VideoFormat": "androidx/media/tv/TvContractCompat$Channels$VideoFormat",
+      "android/support/media/tv/TvContractCompat$Channels$VideoResolution": "androidx/media/tv/TvContractCompat$Channels$VideoResolution",
+      "android/support/media/tv/TvContractCompat$Programs$Genres$Genre": "androidx/media/tv/TvContractCompat$Programs$Genres$Genre",
+      "android/support/media/tv/TvContractCompat$RecordedPrograms": "androidx/media/tv/TvContractCompat$RecordedPrograms",
+      "android/support/media/tv/TvContractCompat$WatchNextPrograms": "androidx/media/tv/TvContractCompat$WatchNextPrograms",
+      "android/support/media/tv/WatchNextProgram$1": "androidx/media/tv/WatchNextProgram$1",
+      "android/support/media/tv/WatchNextProgram": "androidx/media/tv/WatchNextProgram",
+      "android/support/media/tv/WatchNextProgram$Builder": "androidx/media/tv/WatchNextProgram$Builder",
+      "android/support/media/tv/WatchNextProgram$WatchNextType": "androidx/media/tv/WatchNextProgram$WatchNextType",
+      "android/support/v7/widget/CardView$1": "androidx/widget/CardView$1",
+      "android/support/v7/widget/CardViewDelegate": "androidx/widget/CardViewDelegate",
+      "android/support/v7/widget/CardView": "androidx/widget/CardView",
+      "android/support/v7/cardview/R$attr": "androidx/cardview/R$attr",
+      "android/support/v7/cardview/R": "androidx/cardview/R",
+      "android/support/v7/cardview/R$styleable": "androidx/cardview/R$styleable",
+      "android/support/v7/cardview/R$style": "androidx/cardview/R$style",
+      "android/support/v7/cardview/R$color": "androidx/cardview/R$color",
+      "android/support/v7/widget/CardViewImpl": "androidx/widget/CardViewImpl",
+      "android/support/v7/widget/CardViewApi21Impl": "androidx/widget/CardViewApi21Impl",
+      "android/support/v7/widget/CardViewApi17Impl": "androidx/widget/CardViewApi17Impl",
+      "android/support/v7/widget/CardViewBaseImpl": "androidx/widget/CardViewBaseImpl",
+      "android/support/v7/widget/CardViewApi17Impl$1": "androidx/widget/CardViewApi17Impl$1",
+      "android/support/v7/widget/RoundRectDrawableWithShadow$RoundRectHelper": "androidx/widget/RoundRectDrawableWithShadow$RoundRectHelper",
+      "android/support/v7/widget/RoundRectDrawableWithShadow": "androidx/widget/RoundRectDrawableWithShadow",
+      "android/support/v7/widget/RoundRectDrawable": "androidx/widget/RoundRectDrawable",
+      "android/support/v7/widget/CardViewBaseImpl$1": "androidx/widget/CardViewBaseImpl$1",
+      "android/support/v7/cardview/R$dimen": "androidx/cardview/R$dimen",
+      "android/arch/lifecycle/LiveData$1": "androidx/lifecycle/LiveData$1",
+      "android/arch/lifecycle/LiveData$AlwaysActiveObserver": "androidx/lifecycle/LiveData$AlwaysActiveObserver",
+      "android/arch/lifecycle/LiveData$ObserverWrapper": "androidx/lifecycle/LiveData$ObserverWrapper",
+      "android/arch/lifecycle/Observer": "androidx/lifecycle/Observer",
+      "android/arch/lifecycle/LiveData$LifecycleBoundObserver": "androidx/lifecycle/LiveData$LifecycleBoundObserver",
+      "android/arch/lifecycle/MutableLiveData": "androidx/lifecycle/MutableLiveData",
+      "android/arch/lifecycle/LiveDataReactiveStreams$LiveDataPublisher$LiveDataSubscription$1": "androidx/lifecycle/LiveDataReactiveStreams$LiveDataPublisher$LiveDataSubscription$1",
+      "android/arch/lifecycle/LiveDataReactiveStreams$LiveDataPublisher$LiveDataSubscription": "androidx/lifecycle/LiveDataReactiveStreams$LiveDataPublisher$LiveDataSubscription",
+      "android/arch/lifecycle/LiveDataReactiveStreams$LiveDataPublisher": "androidx/lifecycle/LiveDataReactiveStreams$LiveDataPublisher",
+      "android/arch/lifecycle/LiveDataReactiveStreams": "androidx/lifecycle/LiveDataReactiveStreams",
+      "android/arch/lifecycle/LiveDataReactiveStreams$LiveDataPublisher$LiveDataSubscription$2": "androidx/lifecycle/LiveDataReactiveStreams$LiveDataPublisher$LiveDataSubscription$2",
+      "android/arch/lifecycle/LiveDataReactiveStreams$PublisherLiveData$LiveDataSubscriber$1": "androidx/lifecycle/LiveDataReactiveStreams$PublisherLiveData$LiveDataSubscriber$1",
+      "android/arch/lifecycle/LiveDataReactiveStreams$PublisherLiveData$LiveDataSubscriber": "androidx/lifecycle/LiveDataReactiveStreams$PublisherLiveData$LiveDataSubscriber",
+      "android/arch/lifecycle/LiveDataReactiveStreams$PublisherLiveData": "androidx/lifecycle/LiveDataReactiveStreams$PublisherLiveData",
+      "android/support/v7/app/MediaRouteActionProvider$MediaRouterCallback": "androidx/app/MediaRouteActionProvider$MediaRouterCallback",
+      "android/support/v7/media/MediaRouter$Callback": "androidx/media/MediaRouter$Callback",
+      "android/support/v7/app/MediaRouteActionProvider": "androidx/app/MediaRouteActionProvider",
+      "android/support/v7/media/MediaRouter$RouteInfo": "androidx/media/MediaRouter$RouteInfo",
+      "android/support/v7/media/MediaRouter": "androidx/media/MediaRouter",
+      "android/support/v7/media/MediaRouter$ProviderInfo": "androidx/media/MediaRouter$ProviderInfo",
+      "android/support/v7/media/MediaRouteSelector": "androidx/media/MediaRouteSelector",
+      "android/support/v7/app/MediaRouteDialogFactory": "androidx/app/MediaRouteDialogFactory",
+      "android/support/v7/app/MediaRouteButton": "androidx/app/MediaRouteButton",
+      "android/support/v7/app/MediaRouteButton$MediaRouterCallback": "androidx/app/MediaRouteButton$MediaRouterCallback",
+      "android/support/v7/app/MediaRouteButton$RemoteIndicatorLoader": "androidx/app/MediaRouteButton$RemoteIndicatorLoader",
+      "android/support/v7/mediarouter/R$attr": "androidx/mediarouter/R$attr",
+      "android/support/v7/mediarouter/R": "androidx/mediarouter/R",
+      "android/support/v7/mediarouter/R$styleable": "androidx/mediarouter/R$styleable",
+      "android/support/v7/mediarouter/R$string": "androidx/mediarouter/R$string",
+      "android/support/v7/app/MediaRouterThemeHelper": "androidx/app/MediaRouterThemeHelper",
+      "android/support/v7/app/MediaRouteChooserDialogFragment": "androidx/app/MediaRouteChooserDialogFragment",
+      "android/support/v7/app/MediaRouteControllerDialogFragment": "androidx/app/MediaRouteControllerDialogFragment",
+      "android/support/v7/app/MediaRouteChooserDialog$1": "androidx/app/MediaRouteChooserDialog$1",
+      "android/support/v7/app/MediaRouteChooserDialog": "androidx/app/MediaRouteChooserDialog",
+      "android/support/v7/app/MediaRouteChooserDialog$MediaRouterCallback": "androidx/app/MediaRouteChooserDialog$MediaRouterCallback",
+      "android/support/v7/app/MediaRouteChooserDialog$RouteAdapter": "androidx/app/MediaRouteChooserDialog$RouteAdapter",
+      "android/support/v7/media/MediaRouter$RouteGroup": "androidx/media/MediaRouter$RouteGroup",
+      "android/support/v7/mediarouter/R$layout": "androidx/mediarouter/R$layout",
+      "android/support/v7/mediarouter/R$id": "androidx/mediarouter/R$id",
+      "android/support/v7/app/MediaRouteChooserDialog$RouteComparator": "androidx/app/MediaRouteChooserDialog$RouteComparator",
+      "android/support/v7/app/MediaRouteDialogHelper": "androidx/app/MediaRouteDialogHelper",
+      "android/support/v7/app/MediaRouteControllerDialog$1": "androidx/app/MediaRouteControllerDialog$1",
+      "android/support/v7/app/MediaRouteControllerDialog": "androidx/app/MediaRouteControllerDialog",
+      "android/support/v7/app/MediaRouteControllerDialog$10": "androidx/app/MediaRouteControllerDialog$10",
+      "android/support/v7/app/OverlayListView$OverlayObject$OnAnimationEndListener": "androidx/app/OverlayListView$OverlayObject$OnAnimationEndListener",
+      "android/support/v7/app/OverlayListView$OverlayObject": "androidx/app/OverlayListView$OverlayObject",
+      "android/support/v7/app/OverlayListView": "androidx/app/OverlayListView",
+      "android/support/v7/app/MediaRouteControllerDialog$VolumeGroupAdapter": "androidx/app/MediaRouteControllerDialog$VolumeGroupAdapter",
+      "android/support/v7/app/MediaRouteControllerDialog$11": "androidx/app/MediaRouteControllerDialog$11",
+      "android/support/v7/app/MediaRouteControllerDialog$12": "androidx/app/MediaRouteControllerDialog$12",
+      "android/support/v7/app/MediaRouteControllerDialog$2": "androidx/app/MediaRouteControllerDialog$2",
+      "android/support/v7/app/MediaRouteControllerDialog$3": "androidx/app/MediaRouteControllerDialog$3",
+      "android/support/v7/app/MediaRouteControllerDialog$4": "androidx/app/MediaRouteControllerDialog$4",
+      "android/support/v7/app/MediaRouteControllerDialog$5": "androidx/app/MediaRouteControllerDialog$5",
+      "android/support/v7/app/MediaRouteControllerDialog$6": "androidx/app/MediaRouteControllerDialog$6",
+      "android/support/v7/app/MediaRouteControllerDialog$7": "androidx/app/MediaRouteControllerDialog$7",
+      "android/support/v7/app/MediaRouteControllerDialog$8": "androidx/app/MediaRouteControllerDialog$8",
+      "android/support/v7/app/MediaRouteControllerDialog$9": "androidx/app/MediaRouteControllerDialog$9",
+      "android/support/v7/app/MediaRouteControllerDialog$ClickListener": "androidx/app/MediaRouteControllerDialog$ClickListener",
+      "android/support/v7/app/MediaRouteControllerDialog$FetchArtTask": "androidx/app/MediaRouteControllerDialog$FetchArtTask",
+      "android/support/v7/app/MediaRouteControllerDialog$MediaControllerCallback": "androidx/app/MediaRouteControllerDialog$MediaControllerCallback",
+      "android/support/v7/app/MediaRouteControllerDialog$MediaRouterCallback": "androidx/app/MediaRouteControllerDialog$MediaRouterCallback",
+      "android/support/v7/app/MediaRouteControllerDialog$VolumeChangeListener$1": "androidx/app/MediaRouteControllerDialog$VolumeChangeListener$1",
+      "android/support/v7/app/MediaRouteControllerDialog$VolumeChangeListener": "androidx/app/MediaRouteControllerDialog$VolumeChangeListener",
+      "android/support/v7/app/MediaRouteVolumeSlider": "androidx/app/MediaRouteVolumeSlider",
+      "android/support/v7/mediarouter/R$dimen": "androidx/mediarouter/R$dimen",
+      "android/support/v7/mediarouter/R$interpolator": "androidx/mediarouter/R$interpolator",
+      "android/support/v7/mediarouter/R$integer": "androidx/mediarouter/R$integer",
+      "android/support/v7/app/MediaRouteExpandCollapseButton": "androidx/app/MediaRouteExpandCollapseButton",
+      "android/support/v7/app/MediaRouteDiscoveryFragment$1": "androidx/app/MediaRouteDiscoveryFragment$1",
+      "android/support/v7/app/MediaRouteDiscoveryFragment": "androidx/app/MediaRouteDiscoveryFragment",
+      "android/support/v7/app/MediaRouteExpandCollapseButton$1": "androidx/app/MediaRouteExpandCollapseButton$1",
+      "android/support/v7/mediarouter/R$drawable": "androidx/mediarouter/R$drawable",
+      "android/support/v7/app/MediaRouterThemeHelper$ControllerColorType": "androidx/app/MediaRouterThemeHelper$ControllerColorType",
+      "android/support/v7/mediarouter/R$style": "androidx/mediarouter/R$style",
+      "android/support/v7/media/MediaControlIntent": "androidx/media/MediaControlIntent",
+      "android/support/v7/media/MediaItemMetadata": "androidx/media/MediaItemMetadata",
+      "android/support/v7/media/MediaItemStatus$Builder": "androidx/media/MediaItemStatus$Builder",
+      "android/support/v7/media/MediaItemStatus": "androidx/media/MediaItemStatus",
+      "android/support/v7/media/MediaRouteDescriptor$Builder": "androidx/media/MediaRouteDescriptor$Builder",
+      "android/support/v7/media/MediaRouteDescriptor": "androidx/media/MediaRouteDescriptor",
+      "android/support/v7/media/MediaRouteDiscoveryRequest": "androidx/media/MediaRouteDiscoveryRequest",
+      "android/support/v7/media/MediaRouteProvider$Callback": "androidx/media/MediaRouteProvider$Callback",
+      "android/support/v7/media/MediaRouteProvider": "androidx/media/MediaRouteProvider",
+      "android/support/v7/media/MediaRouteProviderDescriptor": "androidx/media/MediaRouteProviderDescriptor",
+      "android/support/v7/media/MediaRouteProvider$ProviderHandler": "androidx/media/MediaRouteProvider$ProviderHandler",
+      "android/support/v7/media/MediaRouteProvider$ProviderMetadata": "androidx/media/MediaRouteProvider$ProviderMetadata",
+      "android/support/v7/media/MediaRouteProvider$RouteController": "androidx/media/MediaRouteProvider$RouteController",
+      "android/support/v7/media/MediaRouter$ControlRequestCallback": "androidx/media/MediaRouter$ControlRequestCallback",
+      "android/support/v7/media/MediaRouteProviderDescriptor$1": "androidx/media/MediaRouteProviderDescriptor$1",
+      "android/support/v7/media/MediaRouteProviderDescriptor$Builder": "androidx/media/MediaRouteProviderDescriptor$Builder",
+      "android/support/v7/media/MediaRouteProviderProtocol": "androidx/media/MediaRouteProviderProtocol",
+      "android/support/v7/media/MediaRouteProviderService$1": "androidx/media/MediaRouteProviderService$1",
+      "android/support/v7/media/MediaRouteProviderService": "androidx/media/MediaRouteProviderService",
+      "android/support/v7/media/MediaRouteProviderService$ClientRecord": "androidx/media/MediaRouteProviderService$ClientRecord",
+      "android/support/v7/media/MediaRouteProviderService$PrivateHandler": "androidx/media/MediaRouteProviderService$PrivateHandler",
+      "android/support/v7/media/MediaRouteProviderService$ProviderCallback": "androidx/media/MediaRouteProviderService$ProviderCallback",
+      "android/support/v7/media/MediaRouteProviderService$ReceiveHandler": "androidx/media/MediaRouteProviderService$ReceiveHandler",
+      "android/support/v7/media/MediaRouteSelector$Builder": "androidx/media/MediaRouteSelector$Builder",
+      "android/support/v7/media/MediaRouter$1": "androidx/media/MediaRouter$1",
+      "android/support/v7/media/MediaRouter$CallbackFlags": "androidx/media/MediaRouter$CallbackFlags",
+      "android/support/v7/media/MediaRouter$CallbackRecord": "androidx/media/MediaRouter$CallbackRecord",
+      "android/support/v7/media/MediaRouter$GlobalMediaRouter$1": "androidx/media/MediaRouter$GlobalMediaRouter$1",
+      "android/support/v7/media/MediaRouter$GlobalMediaRouter": "androidx/media/MediaRouter$GlobalMediaRouter",
+      "android/support/v7/media/MediaRouter$GlobalMediaRouter$CallbackHandler": "androidx/media/MediaRouter$GlobalMediaRouter$CallbackHandler",
+      "android/support/v7/media/SystemMediaRouteProvider": "androidx/media/SystemMediaRouteProvider",
+      "android/support/v7/media/MediaRouter$GlobalMediaRouter$MediaSessionRecord$1$1": "androidx/media/MediaRouter$GlobalMediaRouter$MediaSessionRecord$1$1",
+      "android/support/v7/media/MediaRouter$GlobalMediaRouter$MediaSessionRecord$1": "androidx/media/MediaRouter$GlobalMediaRouter$MediaSessionRecord$1",
+      "android/support/v7/media/MediaRouter$GlobalMediaRouter$MediaSessionRecord": "androidx/media/MediaRouter$GlobalMediaRouter$MediaSessionRecord",
+      "android/support/v7/media/MediaRouter$GlobalMediaRouter$MediaSessionRecord$1$2": "androidx/media/MediaRouter$GlobalMediaRouter$MediaSessionRecord$1$2",
+      "android/support/v7/media/RemoteControlClientCompat$PlaybackInfo": "androidx/media/RemoteControlClientCompat$PlaybackInfo",
+      "android/support/v7/media/RemoteControlClientCompat": "androidx/media/RemoteControlClientCompat",
+      "android/support/v7/media/MediaRouter$GlobalMediaRouter$ProviderCallback": "androidx/media/MediaRouter$GlobalMediaRouter$ProviderCallback",
+      "android/support/v7/media/MediaRouter$GlobalMediaRouter$RemoteControlClientRecord": "androidx/media/MediaRouter$GlobalMediaRouter$RemoteControlClientRecord",
+      "android/support/v7/media/RemoteControlClientCompat$VolumeCallback": "androidx/media/RemoteControlClientCompat$VolumeCallback",
+      "android/support/v7/media/SystemMediaRouteProvider$SyncCallback": "androidx/media/SystemMediaRouteProvider$SyncCallback",
+      "android/support/v7/media/RegisteredMediaRouteProviderWatcher$Callback": "androidx/media/RegisteredMediaRouteProviderWatcher$Callback",
+      "android/support/v7/media/RegisteredMediaRouteProviderWatcher": "androidx/media/RegisteredMediaRouteProviderWatcher",
+      "android/support/v7/media/MediaRouter$RouteInfo$ConnectionState": "androidx/media/MediaRouter$RouteInfo$ConnectionState",
+      "android/support/v7/media/MediaRouter$RouteInfo$DeviceType": "androidx/media/MediaRouter$RouteInfo$DeviceType",
+      "android/support/v7/media/MediaRouter$RouteInfo$PlaybackType": "androidx/media/MediaRouter$RouteInfo$PlaybackType",
+      "android/support/v7/media/MediaRouter$RouteInfo$PlaybackVolume": "androidx/media/MediaRouter$RouteInfo$PlaybackVolume",
+      "android/support/v7/media/MediaRouterApi24$RouteInfo": "androidx/media/MediaRouterApi24$RouteInfo",
+      "android/support/v7/media/MediaRouterApi24": "androidx/media/MediaRouterApi24",
+      "android/support/v7/media/MediaRouterJellybean$Callback": "androidx/media/MediaRouterJellybean$Callback",
+      "android/support/v7/media/MediaRouterJellybean": "androidx/media/MediaRouterJellybean",
+      "android/support/v7/media/MediaRouterJellybean$CallbackProxy": "androidx/media/MediaRouterJellybean$CallbackProxy",
+      "android/support/v7/media/MediaRouterJellybean$GetDefaultRouteWorkaround": "androidx/media/MediaRouterJellybean$GetDefaultRouteWorkaround",
+      "android/support/v7/media/MediaRouterJellybean$RouteCategory": "androidx/media/MediaRouterJellybean$RouteCategory",
+      "android/support/v7/media/MediaRouterJellybean$RouteGroup": "androidx/media/MediaRouterJellybean$RouteGroup",
+      "android/support/v7/media/MediaRouterJellybean$RouteInfo": "androidx/media/MediaRouterJellybean$RouteInfo",
+      "android/support/v7/media/MediaRouterJellybean$SelectRouteWorkaround": "androidx/media/MediaRouterJellybean$SelectRouteWorkaround",
+      "android/support/v7/media/MediaRouterJellybean$UserRouteInfo": "androidx/media/MediaRouterJellybean$UserRouteInfo",
+      "android/support/v7/media/MediaRouterJellybean$VolumeCallback": "androidx/media/MediaRouterJellybean$VolumeCallback",
+      "android/support/v7/media/MediaRouterJellybean$VolumeCallbackProxy": "androidx/media/MediaRouterJellybean$VolumeCallbackProxy",
+      "android/support/v7/media/MediaRouterJellybeanMr1$ActiveScanWorkaround": "androidx/media/MediaRouterJellybeanMr1$ActiveScanWorkaround",
+      "android/support/v7/media/MediaRouterJellybeanMr1": "androidx/media/MediaRouterJellybeanMr1",
+      "android/support/v7/media/MediaRouterJellybeanMr1$Callback": "androidx/media/MediaRouterJellybeanMr1$Callback",
+      "android/support/v7/media/MediaRouterJellybeanMr1$CallbackProxy": "androidx/media/MediaRouterJellybeanMr1$CallbackProxy",
+      "android/support/v7/media/MediaRouterJellybeanMr1$IsConnectingWorkaround": "androidx/media/MediaRouterJellybeanMr1$IsConnectingWorkaround",
+      "android/support/v7/media/MediaRouterJellybeanMr1$RouteInfo": "androidx/media/MediaRouterJellybeanMr1$RouteInfo",
+      "android/support/v7/media/MediaRouterJellybeanMr2$RouteInfo": "androidx/media/MediaRouterJellybeanMr2$RouteInfo",
+      "android/support/v7/media/MediaRouterJellybeanMr2": "androidx/media/MediaRouterJellybeanMr2",
+      "android/support/v7/media/MediaRouterJellybeanMr2$UserRouteInfo": "androidx/media/MediaRouterJellybeanMr2$UserRouteInfo",
+      "android/support/v7/media/MediaSessionStatus$Builder": "androidx/media/MediaSessionStatus$Builder",
+      "android/support/v7/media/MediaSessionStatus": "androidx/media/MediaSessionStatus",
+      "android/support/v7/media/RegisteredMediaRouteProvider$Connection$1": "androidx/media/RegisteredMediaRouteProvider$Connection$1",
+      "android/support/v7/media/RegisteredMediaRouteProvider$Connection": "androidx/media/RegisteredMediaRouteProvider$Connection",
+      "android/support/v7/media/RegisteredMediaRouteProvider": "androidx/media/RegisteredMediaRouteProvider",
+      "android/support/v7/media/RegisteredMediaRouteProvider$Connection$2": "androidx/media/RegisteredMediaRouteProvider$Connection$2",
+      "android/support/v7/media/RegisteredMediaRouteProvider$ReceiveHandler": "androidx/media/RegisteredMediaRouteProvider$ReceiveHandler",
+      "android/support/v7/media/RegisteredMediaRouteProvider$PrivateHandler": "androidx/media/RegisteredMediaRouteProvider$PrivateHandler",
+      "android/support/v7/media/RegisteredMediaRouteProvider$Controller": "androidx/media/RegisteredMediaRouteProvider$Controller",
+      "android/support/v7/media/RegisteredMediaRouteProviderWatcher$1": "androidx/media/RegisteredMediaRouteProviderWatcher$1",
+      "android/support/v7/media/RegisteredMediaRouteProviderWatcher$2": "androidx/media/RegisteredMediaRouteProviderWatcher$2",
+      "android/support/v7/media/RemoteControlClientCompat$JellybeanImpl$VolumeCallbackWrapper": "androidx/media/RemoteControlClientCompat$JellybeanImpl$VolumeCallbackWrapper",
+      "android/support/v7/media/RemoteControlClientCompat$JellybeanImpl": "androidx/media/RemoteControlClientCompat$JellybeanImpl",
+      "android/support/v7/media/RemoteControlClientCompat$LegacyImpl": "androidx/media/RemoteControlClientCompat$LegacyImpl",
+      "android/support/v7/media/RemotePlaybackClient$1": "androidx/media/RemotePlaybackClient$1",
+      "android/support/v7/media/RemotePlaybackClient": "androidx/media/RemotePlaybackClient",
+      "android/support/v7/media/RemotePlaybackClient$ItemActionCallback": "androidx/media/RemotePlaybackClient$ItemActionCallback",
+      "android/support/v7/media/RemotePlaybackClient$ActionCallback": "androidx/media/RemotePlaybackClient$ActionCallback",
+      "android/support/v7/media/RemotePlaybackClient$2": "androidx/media/RemotePlaybackClient$2",
+      "android/support/v7/media/RemotePlaybackClient$SessionActionCallback": "androidx/media/RemotePlaybackClient$SessionActionCallback",
+      "android/support/v7/media/RemotePlaybackClient$ActionReceiver": "androidx/media/RemotePlaybackClient$ActionReceiver",
+      "android/support/v7/media/RemotePlaybackClient$StatusCallback": "androidx/media/RemotePlaybackClient$StatusCallback",
+      "android/support/v7/media/RemotePlaybackClient$OnMessageReceivedListener": "androidx/media/RemotePlaybackClient$OnMessageReceivedListener",
+      "android/support/v7/media/SystemMediaRouteProvider$Api24Impl": "androidx/media/SystemMediaRouteProvider$Api24Impl",
+      "android/support/v7/media/SystemMediaRouteProvider$JellybeanMr2Impl": "androidx/media/SystemMediaRouteProvider$JellybeanMr2Impl",
+      "android/support/v7/media/SystemMediaRouteProvider$JellybeanImpl": "androidx/media/SystemMediaRouteProvider$JellybeanImpl",
+      "android/support/v7/media/SystemMediaRouteProvider$JellybeanImpl$SystemRouteRecord": "androidx/media/SystemMediaRouteProvider$JellybeanImpl$SystemRouteRecord",
+      "android/support/v7/media/SystemMediaRouteProvider$JellybeanImpl$SystemRouteController": "androidx/media/SystemMediaRouteProvider$JellybeanImpl$SystemRouteController",
+      "android/support/v7/media/SystemMediaRouteProvider$JellybeanImpl$UserRouteRecord": "androidx/media/SystemMediaRouteProvider$JellybeanImpl$UserRouteRecord",
+      "android/support/v7/media/SystemMediaRouteProvider$JellybeanMr1Impl": "androidx/media/SystemMediaRouteProvider$JellybeanMr1Impl",
+      "android/support/v7/media/SystemMediaRouteProvider$LegacyImpl$DefaultRouteController": "androidx/media/SystemMediaRouteProvider$LegacyImpl$DefaultRouteController",
+      "android/support/v7/media/SystemMediaRouteProvider$LegacyImpl": "androidx/media/SystemMediaRouteProvider$LegacyImpl",
+      "android/support/v7/media/SystemMediaRouteProvider$LegacyImpl$VolumeChangeReceiver": "androidx/media/SystemMediaRouteProvider$LegacyImpl$VolumeChangeReceiver",
+      "android/support/transition/AnimatorUtils": "androidx/transition/AnimatorUtils",
+      "android/support/transition/AnimatorUtilsImpl": "androidx/transition/AnimatorUtilsImpl",
+      "android/support/transition/AnimatorUtilsApi19": "androidx/transition/AnimatorUtilsApi19",
+      "android/support/transition/AnimatorUtilsApi14": "androidx/transition/AnimatorUtilsApi14",
+      "android/support/transition/AnimatorUtilsApi14$AnimatorPauseListenerCompat": "androidx/transition/AnimatorUtilsApi14$AnimatorPauseListenerCompat",
+      "android/support/transition/ArcMotion": "androidx/transition/ArcMotion",
+      "android/support/transition/PathMotion": "androidx/transition/PathMotion",
+      "android/support/transition/Styleable$ArcMotion": "androidx/transition/Styleable$ArcMotion",
+      "android/support/transition/Styleable": "androidx/transition/Styleable",
+      "android/support/transition/AutoTransition": "androidx/transition/AutoTransition",
+      "android/support/transition/TransitionSet": "androidx/transition/TransitionSet",
+      "android/support/transition/Fade": "androidx/transition/Fade",
+      "android/support/transition/Transition": "androidx/transition/Transition",
+      "android/support/transition/ChangeBounds": "androidx/transition/ChangeBounds",
+      "android/support/transition/ChangeBounds$1": "androidx/transition/ChangeBounds$1",
+      "android/support/transition/ChangeBounds$10": "androidx/transition/ChangeBounds$10",
+      "android/support/transition/TransitionValues": "androidx/transition/TransitionValues",
+      "android/support/transition/ViewUtils": "androidx/transition/ViewUtils",
+      "android/support/transition/ViewOverlayImpl": "androidx/transition/ViewOverlayImpl",
+      "android/support/transition/ChangeBounds$2": "androidx/transition/ChangeBounds$2",
+      "android/support/transition/ChangeBounds$ViewBounds": "androidx/transition/ChangeBounds$ViewBounds",
+      "android/support/transition/ChangeBounds$3": "androidx/transition/ChangeBounds$3",
+      "android/support/transition/ChangeBounds$4": "androidx/transition/ChangeBounds$4",
+      "android/support/transition/ChangeBounds$5": "androidx/transition/ChangeBounds$5",
+      "android/support/transition/ChangeBounds$6": "androidx/transition/ChangeBounds$6",
+      "android/support/transition/ChangeBounds$7": "androidx/transition/ChangeBounds$7",
+      "android/support/transition/ChangeBounds$8": "androidx/transition/ChangeBounds$8",
+      "android/support/transition/ChangeBounds$9": "androidx/transition/ChangeBounds$9",
+      "android/support/transition/TransitionListenerAdapter": "androidx/transition/TransitionListenerAdapter",
+      "android/support/transition/Transition$TransitionListener": "androidx/transition/Transition$TransitionListener",
+      "android/support/transition/ViewGroupUtils": "androidx/transition/ViewGroupUtils",
+      "android/support/transition/Styleable$ChangeBounds": "androidx/transition/Styleable$ChangeBounds",
+      "android/support/transition/RectEvaluator": "androidx/transition/RectEvaluator",
+      "android/support/transition/ObjectAnimatorUtils": "androidx/transition/ObjectAnimatorUtils",
+      "android/support/transition/TransitionUtils": "androidx/transition/TransitionUtils",
+      "android/support/transition/PropertyValuesHolderUtils": "androidx/transition/PropertyValuesHolderUtils",
+      "android/support/transition/ChangeClipBounds$1": "androidx/transition/ChangeClipBounds$1",
+      "android/support/transition/ChangeClipBounds": "androidx/transition/ChangeClipBounds",
+      "android/support/transition/ChangeImageTransform$1": "androidx/transition/ChangeImageTransform$1",
+      "android/support/transition/ChangeImageTransform": "androidx/transition/ChangeImageTransform",
+      "android/support/transition/ChangeImageTransform$2": "androidx/transition/ChangeImageTransform$2",
+      "android/support/transition/ImageViewUtils": "androidx/transition/ImageViewUtils",
+      "android/support/transition/ChangeImageTransform$3": "androidx/transition/ChangeImageTransform$3",
+      "android/support/transition/TransitionUtils$MatrixEvaluator": "androidx/transition/TransitionUtils$MatrixEvaluator",
+      "android/support/transition/MatrixUtils": "androidx/transition/MatrixUtils",
+      "android/support/transition/ChangeScroll": "androidx/transition/ChangeScroll",
+      "android/support/transition/ChangeTransform$1": "androidx/transition/ChangeTransform$1",
+      "android/support/transition/ChangeTransform$PathAnimatorMatrix": "androidx/transition/ChangeTransform$PathAnimatorMatrix",
+      "android/support/transition/ChangeTransform": "androidx/transition/ChangeTransform",
+      "android/support/transition/ChangeTransform$2": "androidx/transition/ChangeTransform$2",
+      "android/support/transition/ChangeTransform$3": "androidx/transition/ChangeTransform$3",
+      "android/support/transition/ChangeTransform$Transforms": "androidx/transition/ChangeTransform$Transforms",
+      "android/support/transition/R$id": "androidx/transition/R$id",
+      "android/support/transition/R": "androidx/transition/R",
+      "android/support/transition/ChangeTransform$GhostListener": "androidx/transition/ChangeTransform$GhostListener",
+      "android/support/transition/GhostViewImpl": "androidx/transition/GhostViewImpl",
+      "android/support/transition/GhostViewUtils": "androidx/transition/GhostViewUtils",
+      "android/support/transition/Styleable$ChangeTransform": "androidx/transition/Styleable$ChangeTransform",
+      "android/support/transition/FloatArrayEvaluator": "androidx/transition/FloatArrayEvaluator",
+      "android/support/transition/CircularPropagation": "androidx/transition/CircularPropagation",
+      "android/support/transition/VisibilityPropagation": "androidx/transition/VisibilityPropagation",
+      "android/support/transition/Explode": "androidx/transition/Explode",
+      "android/support/transition/Visibility": "androidx/transition/Visibility",
+      "android/support/transition/TransitionPropagation": "androidx/transition/TransitionPropagation",
+      "android/support/transition/TranslationAnimationCreator": "androidx/transition/TranslationAnimationCreator",
+      "android/support/transition/Fade$1": "androidx/transition/Fade$1",
+      "android/support/transition/Fade$FadeAnimatorListener": "androidx/transition/Fade$FadeAnimatorListener",
+      "android/support/transition/Styleable$Fade": "androidx/transition/Styleable$Fade",
+      "android/support/transition/FragmentTransitionSupport$1": "androidx/transition/FragmentTransitionSupport$1",
+      "android/support/transition/Transition$EpicenterCallback": "androidx/transition/Transition$EpicenterCallback",
+      "android/support/transition/FragmentTransitionSupport": "androidx/transition/FragmentTransitionSupport",
+      "android/support/transition/FragmentTransitionSupport$2": "androidx/transition/FragmentTransitionSupport$2",
+      "android/support/transition/FragmentTransitionSupport$3": "androidx/transition/FragmentTransitionSupport$3",
+      "android/support/transition/FragmentTransitionSupport$4": "androidx/transition/FragmentTransitionSupport$4",
+      "android/support/transition/TransitionManager": "androidx/transition/TransitionManager",
+      "android/support/transition/GhostViewApi14$1": "androidx/transition/GhostViewApi14$1",
+      "android/support/transition/GhostViewApi14": "androidx/transition/GhostViewApi14",
+      "android/support/transition/GhostViewApi14$Creator": "androidx/transition/GhostViewApi14$Creator",
+      "android/support/transition/GhostViewImpl$Creator": "androidx/transition/GhostViewImpl$Creator",
+      "android/support/transition/GhostViewApi21$1": "androidx/transition/GhostViewApi21$1",
+      "android/support/transition/GhostViewApi21": "androidx/transition/GhostViewApi21",
+      "android/support/transition/GhostViewApi21$Creator": "androidx/transition/GhostViewApi21$Creator",
+      "android/support/transition/ImageViewUtilsImpl": "androidx/transition/ImageViewUtilsImpl",
+      "android/support/transition/ImageViewUtilsApi21": "androidx/transition/ImageViewUtilsApi21",
+      "android/support/transition/ImageViewUtilsApi14": "androidx/transition/ImageViewUtilsApi14",
+      "android/support/transition/ImageViewUtilsApi14$1": "androidx/transition/ImageViewUtilsApi14$1",
+      "android/support/transition/MatrixUtils$1": "androidx/transition/MatrixUtils$1",
+      "android/support/transition/ObjectAnimatorUtilsImpl": "androidx/transition/ObjectAnimatorUtilsImpl",
+      "android/support/transition/ObjectAnimatorUtilsApi21": "androidx/transition/ObjectAnimatorUtilsApi21",
+      "android/support/transition/ObjectAnimatorUtilsApi14": "androidx/transition/ObjectAnimatorUtilsApi14",
+      "android/support/transition/PathProperty": "androidx/transition/PathProperty",
+      "android/support/transition/PatternPathMotion": "androidx/transition/PatternPathMotion",
+      "android/support/transition/Styleable$PatternPathMotion": "androidx/transition/Styleable$PatternPathMotion",
+      "android/support/transition/PropertyValuesHolderUtilsImpl": "androidx/transition/PropertyValuesHolderUtilsImpl",
+      "android/support/transition/PropertyValuesHolderUtilsApi21": "androidx/transition/PropertyValuesHolderUtilsApi21",
+      "android/support/transition/PropertyValuesHolderUtilsApi14": "androidx/transition/PropertyValuesHolderUtilsApi14",
+      "android/support/transition/Scene": "androidx/transition/Scene",
+      "android/support/transition/SidePropagation": "androidx/transition/SidePropagation",
+      "android/support/transition/Slide$1": "androidx/transition/Slide$1",
+      "android/support/transition/Slide$CalculateSlideHorizontal": "androidx/transition/Slide$CalculateSlideHorizontal",
+      "android/support/transition/Slide": "androidx/transition/Slide",
+      "android/support/transition/Slide$2": "androidx/transition/Slide$2",
+      "android/support/transition/Slide$3": "androidx/transition/Slide$3",
+      "android/support/transition/Slide$CalculateSlideVertical": "androidx/transition/Slide$CalculateSlideVertical",
+      "android/support/transition/Slide$4": "androidx/transition/Slide$4",
+      "android/support/transition/Slide$5": "androidx/transition/Slide$5",
+      "android/support/transition/Slide$6": "androidx/transition/Slide$6",
+      "android/support/transition/Slide$CalculateSlide": "androidx/transition/Slide$CalculateSlide",
+      "android/support/transition/Slide$GravityFlag": "androidx/transition/Slide$GravityFlag",
+      "android/support/transition/Styleable$Slide": "androidx/transition/Styleable$Slide",
+      "android/support/transition/Styleable$Transition": "androidx/transition/Styleable$Transition",
+      "android/support/transition/Styleable$TransitionManager": "androidx/transition/Styleable$TransitionManager",
+      "android/support/transition/Styleable$TransitionSet": "androidx/transition/Styleable$TransitionSet",
+      "android/support/transition/Styleable$TransitionTarget": "androidx/transition/Styleable$TransitionTarget",
+      "android/support/transition/Styleable$VisibilityTransition": "androidx/transition/Styleable$VisibilityTransition",
+      "android/support/transition/Transition$1": "androidx/transition/Transition$1",
+      "android/support/transition/Transition$2": "androidx/transition/Transition$2",
+      "android/support/transition/Transition$3": "androidx/transition/Transition$3",
+      "android/support/transition/Transition$AnimationInfo": "androidx/transition/Transition$AnimationInfo",
+      "android/support/transition/WindowIdImpl": "androidx/transition/WindowIdImpl",
+      "android/support/transition/Transition$ArrayListManager": "androidx/transition/Transition$ArrayListManager",
+      "android/support/transition/Transition$MatchOrder": "androidx/transition/Transition$MatchOrder",
+      "android/support/transition/TransitionValuesMaps": "androidx/transition/TransitionValuesMaps",
+      "android/support/transition/TransitionInflater": "androidx/transition/TransitionInflater",
+      "android/support/transition/TransitionManager$MultiListener$1": "androidx/transition/TransitionManager$MultiListener$1",
+      "android/support/transition/TransitionManager$MultiListener": "androidx/transition/TransitionManager$MultiListener",
+      "android/support/transition/TransitionSet$1": "androidx/transition/TransitionSet$1",
+      "android/support/transition/TransitionSet$TransitionSetListener": "androidx/transition/TransitionSet$TransitionSetListener",
+      "android/support/transition/TranslationAnimationCreator$1": "androidx/transition/TranslationAnimationCreator$1",
+      "android/support/transition/TranslationAnimationCreator$TransitionPositionListener": "androidx/transition/TranslationAnimationCreator$TransitionPositionListener",
+      "android/support/transition/ViewGroupOverlayApi14": "androidx/transition/ViewGroupOverlayApi14",
+      "android/support/transition/ViewOverlayApi14": "androidx/transition/ViewOverlayApi14",
+      "android/support/transition/ViewGroupOverlayImpl": "androidx/transition/ViewGroupOverlayImpl",
+      "android/support/transition/ViewOverlayApi14$OverlayViewGroup": "androidx/transition/ViewOverlayApi14$OverlayViewGroup",
+      "android/support/transition/ViewGroupOverlayApi18": "androidx/transition/ViewGroupOverlayApi18",
+      "android/support/transition/ViewGroupUtilsImpl": "androidx/transition/ViewGroupUtilsImpl",
+      "android/support/transition/ViewGroupUtilsApi18": "androidx/transition/ViewGroupUtilsApi18",
+      "android/support/transition/ViewGroupUtilsApi14": "androidx/transition/ViewGroupUtilsApi14",
+      "android/support/transition/ViewGroupUtilsApi14$1": "androidx/transition/ViewGroupUtilsApi14$1",
+      "android/support/transition/ViewOverlayApi14$OverlayViewGroup$TouchInterceptor": "androidx/transition/ViewOverlayApi14$OverlayViewGroup$TouchInterceptor",
+      "android/support/transition/ViewOverlayApi18": "androidx/transition/ViewOverlayApi18",
+      "android/support/transition/ViewUtils$1": "androidx/transition/ViewUtils$1",
+      "android/support/transition/ViewUtils$2": "androidx/transition/ViewUtils$2",
+      "android/support/transition/ViewUtilsImpl": "androidx/transition/ViewUtilsImpl",
+      "android/support/transition/ViewUtilsApi22": "androidx/transition/ViewUtilsApi22",
+      "android/support/transition/ViewUtilsApi21": "androidx/transition/ViewUtilsApi21",
       "android/support/transition/ViewUtilsApi19": "androidx/transition/ViewUtilsApi19",
       "android/support/transition/ViewUtilsApi18": "androidx/transition/ViewUtilsApi18",
-      "android/support/v7/widget/AppCompatDrawableManager$InflateDelegate": "androidx/widget/AppCompatDrawableManager$InflateDelegate",
-      "android/support/v13/view/DragAndDropPermissionsCompat": "androidx/view/DragAndDropPermissionsCompat",
-      "android/support/v4/content/res/FontResourcesParserCompat$FontFamilyFilesResourceEntry": "androidx/content/res/FontResourcesParserCompat$FontFamilyFilesResourceEntry",
       "android/support/transition/ViewUtilsApi14": "androidx/transition/ViewUtilsApi14",
-      "android/support/v7/view/menu/MenuItemWrapperICS": "androidx/view/menu/MenuItemWrapperICS",
-      "android/support/design/widget/CollapsingToolbarLayout": "androidx/design/widget/CollapsingToolbarLayout",
-      "android/support/v4/util/ArrayMap": "androidx/util/ArrayMap",
-      "android/support/v17/leanback/widget/ParallaxTarget$PropertyValuesHolderTarget": "androidx/leanback/widget/ParallaxTarget$PropertyValuesHolderTarget",
-      "android/support/wear/widget/drawer/WearableActionDrawerView$ActionListAdapter": "androidx/wear/widget/drawer/WearableActionDrawerView$ActionListAdapter",
-      "android/support/v4/media/MediaBrowserCompat$MediaBrowserServiceCallbackImpl": "androidx/media/MediaBrowserCompat$MediaBrowserServiceCallbackImpl",
-      "android/support/wear/widget/SimpleAnimatorListener": "androidx/wear/widget/SimpleAnimatorListener",
-      "android/support/v17/leanback/widget/FacetProviderAdapter": "androidx/leanback/widget/FacetProviderAdapter",
-      "android/support/v4/widget/SlidingPaneLayout$SlidingPanelLayoutImplJBMR1": "androidx/widget/SlidingPaneLayout$SlidingPanelLayoutImplJBMR1",
-      "android/support/v7/widget/SearchView": "androidx/widget/SearchView",
-      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplBase$MediaSessionStub": "androidx/media/session/MediaSessionCompat$MediaSessionImplBase$MediaSessionStub",
-      "android/support/v7/widget/TooltipCompat$ViewCompatImpl": "androidx/widget/TooltipCompat$ViewCompatImpl",
-      "android/support/v13/view/DragAndDropPermissionsCompat$DragAndDropPermissionsCompatImpl": "androidx/view/DragAndDropPermissionsCompat$DragAndDropPermissionsCompatImpl",
-      "android/support/customtabs/IPostMessageService$Stub$Proxy": "androidx/browser/customtabs/IPostMessageService$Stub$Proxy",
-      "android/support/v17/leanback/widget/ItemAlignment$Axis": "androidx/leanback/widget/ItemAlignment$Axis",
-      "android/support/v7/widget/RecyclerView$ViewHolder": "androidx/widget/RecyclerView$ViewHolder",
-      "android/support/v7/widget/GapWorker": "androidx/widget/GapWorker",
-      "android/support/v7/media/MediaItemStatus": "androidx/media/MediaItemStatus",
-      "android/support/transition/Explode": "androidx/transition/Explode",
-      "android/support/v17/leanback/widget/GuidedActionAdapter$ActionEditListener": "androidx/leanback/widget/GuidedActionAdapter$ActionEditListener",
-      "android/support/v4/text/BidiFormatter": "androidx/text/BidiFormatter",
-      "android/support/v7/widget/CardViewApi17Impl": "androidx/widget/CardViewApi17Impl",
-      "android/support/v7/media/MediaRouter$RouteInfo$PlaybackType": "androidx/media/MediaRouter$RouteInfo$PlaybackType",
-      "android/support/v4/view/ViewGroupCompat$ViewGroupCompatBaseImpl": "androidx/view/ViewGroupCompat$ViewGroupCompatBaseImpl",
-      "android/support/v4/view/ViewParentCompat$ViewParentCompatApi21Impl": "androidx/view/ViewParentCompat$ViewParentCompatApi21Impl",
-      "android/support/v7/widget/StaggeredGridLayoutManager": "androidx/widget/StaggeredGridLayoutManager",
-      "android/support/v4/widget/FocusStrategy": "androidx/widget/FocusStrategy",
-      "android/support/customtabs/ICustomTabsCallback$Stub$Proxy": "androidx/browser/customtabs/ICustomTabsCallback$Stub$Proxy",
-      "android/support/v7/media/MediaRouteProvider": "androidx/media/MediaRouteProvider",
-      "android/support/v4/net/DatagramSocketWrapper": "androidx/net/DatagramSocketWrapper",
-      "android/support/design/widget/SnackbarManager": "androidx/design/widget/SnackbarManager",
-      "android/support/v17/leanback/media/MediaControllerGlue": "androidx/leanback/media/MediaControllerGlue",
-      "android/support/v7/widget/PopupMenu$OnMenuItemClickListener": "androidx/widget/PopupMenu$OnMenuItemClickListener",
-      "android/support/v7/widget/helper/ItemTouchUIUtilImpl$Api21Impl": "androidx/widget/helper/ItemTouchUIUtilImpl$Api21Impl",
-      "android/support/text/emoji/widget/EmojiTextViewHelper": "androidx/text/emoji/widget/EmojiTextViewHelper",
-      "android/support/v4/media/session/MediaSessionCompat$Callback": "androidx/media/session/MediaSessionCompat$Callback",
-      "android/support/design/internal/NavigationMenuPresenter$NavigationMenuTextItem": "androidx/design/internal/NavigationMenuPresenter$NavigationMenuTextItem",
-      "android/support/v13/app/FragmentCompat$OnRequestPermissionsResultCallback": "androidx/app/FragmentCompat$OnRequestPermissionsResultCallback",
-      "android/support/design/widget/AppBarLayout$Behavior$DragCallback": "androidx/design/widget/AppBarLayout$Behavior$DragCallback",
-      "android/support/text/emoji/widget/EmojiEditTextHelper": "androidx/text/emoji/widget/EmojiEditTextHelper",
-      "android/support/v7/widget/AppCompatTextHelperV17": "androidx/widget/AppCompatTextHelperV17",
-      "android/support/v4/widget/SimpleCursorAdapter": "androidx/widget/SimpleCursorAdapter",
-      "android/support/mediacompat/R$integer": "androidx/mediacompat/R$integer",
-      "android/support/v17/leanback/widget/Grid$Provider": "androidx/leanback/widget/Grid$Provider",
-      "android/support/v13/view/ViewCompat": "androidx/view/ViewCompat",
-      "android/support/v14/preference/MultiSelectListPreference$SavedState": "androidx/preference/MultiSelectListPreference$SavedState",
-      "android/support/v4/view/NestedScrollingChild": "androidx/view/NestedScrollingChild",
-      "android/support/v4/app/FragmentTransition": "androidx/app/FragmentTransition",
-      "android/support/v4/app/NotificationCompat$Action$WearableExtender": "androidx/app/NotificationCompat$Action$WearableExtender",
-      "android/support/v17/preference/LeanbackPreferenceDialogFragment": "androidx/leanback/preference/LeanbackPreferenceDialogFragment",
-      "android/support/annotation/WorkerThread": "androidx/annotation/WorkerThread",
-      "android/support/v7/app/MediaRouteDialogFactory": "androidx/app/MediaRouteDialogFactory",
-      "android/support/v7/view/ActionMode": "androidx/view/ActionMode",
-      "android/support/v4/provider/FontsContractCompat$FontRequestCallback$FontRequestFailReason": "androidx/provider/FontsContractCompat$FontRequestCallback$FontRequestFailReason",
-      "android/support/v17/leanback/R$drawable": "androidx/leanback/R$drawable",
-      "android/support/annotation/StringRes": "androidx/annotation/StringRes",
-      "android/support/v4/app/RemoteInputCompatBase$RemoteInput": "androidx/app/RemoteInputCompatBase$RemoteInput",
-      "android/support/v13/app/FragmentTabHost$TabInfo": "androidx/app/legacy/FragmentTabHost$TabInfo",
-      "android/support/v7/app/ActionBarDrawerToggle$ToolbarCompatDelegate": "androidx/app/ActionBarDrawerToggle$ToolbarCompatDelegate",
-      "android/support/v7/widget/PopupMenu$OnDismissListener": "androidx/widget/PopupMenu$OnDismissListener",
-      "android/support/transition/AnimatorUtilsApi14$AnimatorPauseListenerCompat": "androidx/transition/AnimatorUtilsApi14$AnimatorPauseListenerCompat",
-      "android/support/v4/app/JobIntentService$CommandProcessor": "androidx/app/JobIntentService$CommandProcessor",
-      "android/support/v17/leanback/widget/VerticalGridView": "androidx/leanback/widget/VerticalGridView",
-      "android/support/v4/app/FragmentManager": "androidx/app/FragmentManager",
-      "android/support/v4/app/BackStackState": "androidx/app/BackStackState",
-      "android/support/text/emoji/R": "androidx/text/emoji/R",
-      "android/support/v4/media/session/MediaSessionCompatApi21$Callback": "androidx/media/session/MediaSessionCompatApi21$Callback",
-      "android/support/transition/ChangeScroll": "androidx/transition/ChangeScroll",
-      "android/support/v4/view/ViewCompat$LayoutDirectionMode": "androidx/view/legacy/ViewCompat$LayoutDirectionMode",
-      "android/support/v7/widget/AdapterHelper$Callback": "androidx/widget/AdapterHelper$Callback",
-      "android/support/wear/R$layout": "androidx/wear/R$layout",
-      "android/support/v17/leanback/widget/GuidedActionAdapter$ClickListener": "androidx/leanback/widget/GuidedActionAdapter$ClickListener",
-      "android/support/v4/media/session/MediaControllerCompat$MediaControllerImplApi21$ExtraCallback": "androidx/media/session/MediaControllerCompat$MediaControllerImplApi21$ExtraCallback",
-      "android/support/customtabs/ICustomTabsService$Stub": "androidx/browser/customtabs/ICustomTabsService$Stub",
-      "android/support/v17/leanback/widget/ListRowView": "androidx/leanback/widget/ListRowView",
-      "android/support/v7/widget/ActivityChooserView": "androidx/widget/ActivityChooserView",
-      "android/support/v4/os/TraceCompat": "androidx/os/TraceCompat",
-      "android/support/transition/ImageViewUtils": "androidx/transition/ImageViewUtils",
-      "android/support/v4/app/FragmentManager$OnBackStackChangedListener": "androidx/app/FragmentManager$OnBackStackChangedListener",
-      "android/support/v7/app/AppCompatDelegateImplV23$AppCompatWindowCallbackV23": "androidx/app/AppCompatDelegateImplV23$AppCompatWindowCallbackV23",
-      "android/support/transition/GhostViewApi14": "androidx/transition/GhostViewApi14",
-      "android/support/design/widget/SwipeDismissBehavior$SwipeDirection": "androidx/design/widget/SwipeDismissBehavior$SwipeDirection",
-      "android/support/v17/leanback/widget/SearchOrbView": "androidx/leanback/widget/SearchOrbView",
-      "android/support/v4/app/NotificationManagerCompat$NotifyTask": "androidx/app/NotificationManagerCompat$NotifyTask",
-      "android/support/v4/util/LruCache": "androidx/util/LruCache",
-      "android/support/v7/widget/ActionMenuView$LayoutParams": "androidx/widget/ActionMenuView$LayoutParams",
-      "android/support/v7/widget/helper/ItemTouchHelper$ViewDropHandler": "androidx/widget/helper/ItemTouchHelper$ViewDropHandler",
-      "android/support/v7/content/res/AppCompatColorStateListInflater": "androidx/content/res/AppCompatColorStateListInflater",
-      "android/support/v7/widget/ActionMenuPresenter$OpenOverflowRunnable": "androidx/widget/ActionMenuPresenter$OpenOverflowRunnable",
-      "android/support/v7/media/MediaRouter$GlobalMediaRouter$CallbackHandler": "androidx/media/MediaRouter$GlobalMediaRouter$CallbackHandler",
-      "android/support/design/widget/AppBarLayout$Behavior": "androidx/design/widget/AppBarLayout$Behavior",
-      "android/support/v4/widget/ExploreByTouchHelper": "androidx/widget/ExploreByTouchHelper",
-      "android/support/transition/PropertyValuesHolderUtilsImpl": "androidx/transition/PropertyValuesHolderUtilsImpl",
-      "android/support/v14/preference/PreferenceDialogFragment": "androidx/preference/PreferenceDialogFragment",
-      "android/support/transition/GhostViewApi21": "androidx/transition/GhostViewApi21",
-      "android/support/text/emoji/MetadataListReader$InputStreamOpenTypeReader": "androidx/text/emoji/MetadataListReader$InputStreamOpenTypeReader",
-      "android/support/transition/RectEvaluator": "androidx/transition/RectEvaluator",
-      "android/support/v4/view/VelocityTrackerCompat": "androidx/view/VelocityTrackerCompat",
-      "android/support/v7/widget/AppCompatAutoCompleteTextView": "androidx/widget/AppCompatAutoCompleteTextView",
-      "android/support/v7/media/MediaRouterJellybean$VolumeCallback": "androidx/media/MediaRouterJellybean$VolumeCallback",
-      "android/support/media/tv/WatchNextProgram": "androidx/media/tv/WatchNextProgram",
-      "android/support/wear/internal/widget/drawer/MultiPageUi$NavigationPagerAdapter": "androidx/wear/internal/widget/drawer/MultiPageUi$NavigationPagerAdapter",
-      "android/support/v4/widget/ExploreByTouchHelper$MyNodeProvider": "androidx/widget/ExploreByTouchHelper$MyNodeProvider",
-      "android/support/v7/widget/RecyclerView$AdapterDataObserver": "androidx/widget/RecyclerView$AdapterDataObserver",
-      "android/support/v4/media/session/IMediaSession": "androidx/media/session/IMediaSession",
-      "android/support/v17/preference/LeanbackSettingsRootView": "androidx/leanback/preference/LeanbackSettingsRootView",
-      "android/support/v7/widget/AppCompatButton": "androidx/widget/AppCompatButton",
-      "android/support/constraint/solver/widgets/ConstraintWidget$DimensionBehaviour": "androidx/constraint/solver/widgets/ConstraintWidget$DimensionBehaviour",
-      "android/support/graphics/drawable/AnimatedVectorDrawableCompat$AnimatedVectorDrawableDelegateState": "androidx/graphics/drawable/AnimatedVectorDrawableCompat$AnimatedVectorDrawableDelegateState",
-      "android/support/v17/leanback/app/DetailsSupportFragmentBackgroundController": "androidx/leanback/app/DetailsSupportFragmentBackgroundController",
-      "android/support/v17/leanback/widget/ThumbsBar": "androidx/leanback/widget/ThumbsBar",
-      "android/support/v4/media/session/MediaSessionCompat$Token": "androidx/media/session/MediaSessionCompat$Token",
-      "android/support/v7/mediarouter/R$integer": "androidx/mediarouter/R$integer",
-      "android/support/v7/app/WindowDecorActionBar": "androidx/app/WindowDecorActionBar",
-      "android/support/v4/app/Fragment$SavedState": "androidx/app/Fragment$SavedState",
-      "android/support/v17/leanback/widget/StaggeredGrid$Location": "androidx/leanback/widget/StaggeredGrid$Location",
-      "android/support/v17/leanback/widget/DiffCallback": "androidx/leanback/widget/DiffCallback",
-      "android/support/v4/os/ParcelableCompat": "androidx/os/ParcelableCompat",
-      "android/support/transition/ViewGroupUtils": "androidx/transition/ViewGroupUtils",
-      "android/support/v7/media/MediaRouter$GlobalMediaRouter$MediaSessionRecord": "androidx/media/MediaRouter$GlobalMediaRouter$MediaSessionRecord",
-      "android/support/v7/widget/ViewBoundsCheck$BoundFlags": "androidx/widget/ViewBoundsCheck$BoundFlags",
-      "android/support/wear/R": "androidx/wear/R",
-      "android/support/v17/leanback/app/DetailsSupportFragment$WaitEnterTransitionTimeout": "androidx/leanback/app/DetailsSupportFragment$WaitEnterTransitionTimeout",
-      "android/support/v4/widget/ViewDragHelper$Callback": "androidx/widget/ViewDragHelper$Callback",
-      "android/support/v7/widget/DropDownListView": "androidx/widget/DropDownListView",
-      "android/support/v17/leanback/transition/TransitionHelper$TransitionHelperVersionImpl": "androidx/leanback/transition/TransitionHelper$TransitionHelperVersionImpl",
-      "android/support/transition/TransitionUtils$MatrixEvaluator": "androidx/transition/TransitionUtils$MatrixEvaluator",
-      "android/support/v4/hardware/display/DisplayManagerCompat": "androidx/hardware/display/DisplayManagerCompat",
-      "android/support/media/tv/TvContractCompat$Channels$VideoResolution": "androidx/media/tv/TvContractCompat$Channels$VideoResolution",
-      "android/support/v4/app/NotificationCompatBuilder": "androidx/app/NotificationCompatBuilder",
-      "android/support/v4/media/session/MediaControllerCompat$TransportControls": "androidx/media/session/MediaControllerCompat$TransportControls",
-      "android/support/v7/view/menu/SubMenuBuilder": "androidx/view/menu/SubMenuBuilder",
-      "android/support/v4/media/session/MediaSessionCompatApi23$CallbackProxy": "androidx/media/session/MediaSessionCompatApi23$CallbackProxy",
-      "android/support/v7/recyclerview/R$id": "androidx/recyclerview/R$id",
-      "android/support/wear/widget/WearableLinearLayoutManager$LayoutCallback": "androidx/wear/widget/WearableLinearLayoutManager$LayoutCallback",
-      "android/support/v17/leanback/widget/PresenterSelector": "androidx/leanback/widget/PresenterSelector",
-      "android/support/v4/app/JobIntentService$JobServiceEngineImpl": "androidx/app/JobIntentService$JobServiceEngineImpl",
-      "android/support/v4/app/ActionBarDrawerToggle$DelegateProvider": "androidx/app/legacy/ActionBarDrawerToggle$DelegateProvider",
-      "android/support/v17/leanback/widget/GuidedActionsRelativeLayout": "androidx/leanback/widget/GuidedActionsRelativeLayout",
-      "android/support/v7/widget/RecyclerView$LayoutManager": "androidx/widget/RecyclerView$LayoutManager",
-      "android/support/v4/print/PrintHelper": "androidx/print/PrintHelper",
-      "android/support/v7/util/AsyncListUtil": "androidx/util/AsyncListUtil",
-      "android/support/transition/TransitionListenerAdapter": "androidx/transition/TransitionListenerAdapter",
-      "android/support/v7/view/menu/MenuItemWrapperICS$ActionProviderWrapper": "androidx/view/menu/MenuItemWrapperICS$ActionProviderWrapper",
-      "android/support/v7/app/TwilightManager": "androidx/app/TwilightManager",
-      "android/support/v17/leanback/transition/LeanbackTransitionHelper$LeanbackTransitionHelperDefault": "androidx/leanback/transition/LeanbackTransitionHelper$LeanbackTransitionHelperDefault",
-      "android/support/v4/app/NotificationCompat$InboxStyle": "androidx/app/NotificationCompat$InboxStyle",
-      "android/support/v14/preference/MultiSelectListPreference": "androidx/preference/MultiSelectListPreference",
-      "android/support/v13/view/inputmethod/EditorInfoCompat$EditorInfoCompatBaseImpl": "androidx/view/inputmethod/EditorInfoCompat$EditorInfoCompatBaseImpl",
-      "android/support/v7/preference/SeekBarPreference$SavedState": "androidx/preference/SeekBarPreference$SavedState",
-      "android/support/v17/leanback/widget/PlaybackControlsRowPresenter$BoundData": "androidx/leanback/widget/PlaybackControlsRowPresenter$BoundData",
-      "android/support/customtabs/CustomTabsSessionToken": "androidx/browser/customtabs/CustomTabsSessionToken",
-      "android/support/v4/media/session/MediaControllerCompat$PlaybackInfo": "androidx/media/session/MediaControllerCompat$PlaybackInfo",
-      "android/support/v17/leanback/app/DetailsBackgroundVideoHelper": "androidx/leanback/app/DetailsBackgroundVideoHelper",
-      "android/support/v17/leanback/app/RowsFragment$MainFragmentRowsAdapter": "androidx/leanback/app/RowsFragment$MainFragmentRowsAdapter",
-      "android/support/v7/app/OverlayListView$OverlayObject": "androidx/app/OverlayListView$OverlayObject",
-      "android/support/v4/provider/SingleDocumentFile": "androidx/provider/SingleDocumentFile",
-      "android/support/v7/app/AppCompatDelegateImplV9$ActionModeCallbackWrapperV9": "androidx/app/AppCompatDelegateImplV9$ActionModeCallbackWrapperV9",
-      "android/support/v4/widget/TintableCompoundButton": "androidx/widget/TintableCompoundButton",
-      "android/support/v7/graphics/Target$Builder": "androidx/graphics/Target$Builder",
-      "android/support/v17/leanback/widget/NonOverlappingFrameLayout": "androidx/leanback/widget/NonOverlappingFrameLayout",
-      "android/support/annotation/IntegerRes": "androidx/annotation/IntegerRes",
-      "android/support/media/tv/CollectionUtils": "androidx/media/tv/CollectionUtils",
-      "android/support/v4/provider/FontsContractCompat$FontRequestCallback": "androidx/provider/FontsContractCompat$FontRequestCallback",
-      "android/support/design/internal/BottomNavigationMenuView": "androidx/design/internal/BottomNavigationMenuView",
-      "android/support/v4/graphics/drawable/RoundedBitmapDrawable21": "androidx/graphics/drawable/RoundedBitmapDrawable21",
-      "android/support/design/widget/CoordinatorLayout$SavedState": "androidx/design/widget/CoordinatorLayout$SavedState",
-      "android/support/media/tv/TvContractCompat": "androidx/media/tv/TvContractCompat",
-      "android/support/v7/media/RemoteControlClientCompat$PlaybackInfo": "androidx/media/RemoteControlClientCompat$PlaybackInfo",
-      "android/support/v7/app/AppCompatDelegateImplV9$ActionMenuPresenterCallback": "androidx/app/AppCompatDelegateImplV9$ActionMenuPresenterCallback",
-      "android/support/v17/leanback/widget/StreamingTextView$DottySpan": "androidx/leanback/widget/StreamingTextView$DottySpan",
-      "android/support/v7/view/menu/ActionMenuItemView$PopupCallback": "androidx/view/menu/ActionMenuItemView$PopupCallback",
-      "android/support/percent/PercentLayoutHelper": "androidx/PercentLayoutHelper",
-      "android/support/v17/leanback/transition/LeanbackTransitionHelper$LeanbackTransitionHelperVersion": "androidx/leanback/transition/LeanbackTransitionHelper$LeanbackTransitionHelperVersion",
-      "android/support/v17/leanback/widget/VerticalGridPresenter$ViewHolder": "androidx/leanback/widget/VerticalGridPresenter$ViewHolder",
-      "android/support/media/tv/BaseProgram": "androidx/media/tv/BaseProgram",
-      "android/support/v4/view/ViewGroupCompat": "androidx/view/ViewGroupCompat",
-      "android/support/media/instantvideo/preload/InstantVideoPreloadManager$AsyncTaskVideoPreloader": "androidx/media/instantvideo/preload/InstantVideoPreloadManager$AsyncTaskVideoPreloader",
-      "android/support/v4/widget/FocusStrategy$CollectionAdapter": "androidx/widget/FocusStrategy$CollectionAdapter",
-      "android/support/v7/util/SortedList$Callback": "androidx/util/SortedList$Callback",
-      "android/support/v17/leanback/widget/Parallax$PropertyMarkerValue": "androidx/leanback/widget/Parallax$PropertyMarkerValue",
-      "android/support/v4/text/TextDirectionHeuristicsCompat$AnyStrong": "androidx/text/TextDirectionHeuristicsCompat$AnyStrong",
-      "android/support/v14/preference/PreferenceFragment$OnPreferenceStartScreenCallback": "androidx/preference/PreferenceFragment$OnPreferenceStartScreenCallback",
-      "android/support/v17/leanback/widget/picker/PickerColumn": "androidx/leanback/widget/picker/PickerColumn",
-      "android/support/transition/TransitionPropagation": "androidx/transition/TransitionPropagation",
-      "android/support/v17/leanback/widget/WindowAlignment": "androidx/leanback/widget/WindowAlignment",
-      "android/support/v17/leanback/transition/TranslationAnimationCreator": "androidx/leanback/transition/TranslationAnimationCreator",
-      "android/support/v7/media/MediaRouterApi24": "androidx/media/MediaRouterApi24",
-      "android/support/transition/Styleable$Slide": "androidx/transition/Styleable$Slide",
-      "android/support/v7/view/menu/StandardMenuPopup": "androidx/view/menu/StandardMenuPopup",
-      "android/support/v4/widget/PopupMenuCompat": "androidx/widget/PopupMenuCompat",
-      "android/support/design/widget/CollapsingToolbarLayout$LayoutParams$CollapseMode": "androidx/design/widget/CollapsingToolbarLayout$LayoutParams$CollapseMode",
-      "android/support/v17/leanback/widget/ObjectAdapter": "androidx/leanback/widget/ObjectAdapter",
-      "android/support/v4/view/GestureDetectorCompat": "androidx/view/GestureDetectorCompat",
-      "android/support/v17/leanback/widget/Parallax$IntPropertyMarkerValue": "androidx/leanback/widget/Parallax$IntPropertyMarkerValue",
-      "android/support/v4/view/ViewCompat$ViewCompatApi26Impl": "androidx/view/legacy/ViewCompat$ViewCompatApi26Impl",
-      "android/support/v7/media/RemoteControlClientCompat$VolumeCallback": "androidx/media/RemoteControlClientCompat$VolumeCallback",
-      "android/support/design/widget/AnimationUtils": "androidx/design/widget/AnimationUtils",
-      "android/support/v4/view/ViewCompat$ScrollIndicators": "androidx/view/legacy/ViewCompat$ScrollIndicators",
-      "android/support/media/tv/WatchNextProgram$Builder": "androidx/media/tv/WatchNextProgram$Builder",
-      "android/support/v7/graphics/Palette$Filter": "androidx/graphics/Palette$Filter",
-      "android/support/annotation/BinderThread": "androidx/annotation/BinderThread",
-      "android/support/v17/leanback/widget/FocusHighlightHelper$HeaderItemFocusHighlight$HeaderFocusAnimator": "androidx/leanback/widget/FocusHighlightHelper$HeaderItemFocusHighlight$HeaderFocusAnimator",
-      "android/support/media/tv/Program$Builder": "androidx/media/tv/Program$Builder",
-      "android/support/v4/hardware/fingerprint/FingerprintManagerCompat$AuthenticationResult": "androidx/hardware/fingerprint/FingerprintManagerCompat$AuthenticationResult",
-      "android/support/v4/os/LocaleListCompat$LocaleListCompatApi24Impl": "androidx/os/LocaleListCompat$LocaleListCompatApi24Impl",
-      "android/support/v17/leanback/widget/GuidedActionAdapter$FocusListener": "androidx/leanback/widget/GuidedActionAdapter$FocusListener",
-      "android/support/v17/leanback/widget/ControlBarPresenter$ViewHolder": "androidx/leanback/widget/ControlBarPresenter$ViewHolder",
-      "android/support/v7/graphics/drawable/DrawerArrowDrawable$ArrowDirection": "androidx/graphics/drawable/DrawerArrowDrawable$ArrowDirection",
-      "android/support/v4/view/ViewPager$DecorView": "androidx/view/ViewPager$DecorView",
-      "android/support/v4/view/ViewParentCompat$ViewParentCompatApi19Impl": "androidx/view/ViewParentCompat$ViewParentCompatApi19Impl",
-      "android/support/v7/widget/StaggeredGridLayoutManager$Span": "androidx/widget/StaggeredGridLayoutManager$Span",
-      "android/support/wear/widget/ProgressDrawable": "androidx/wear/widget/ProgressDrawable",
-      "android/support/v7/media/MediaRouterJellybeanMr2$RouteInfo": "androidx/media/MediaRouterJellybeanMr2$RouteInfo",
-      "android/support/v4/graphics/PathParser$PathDataNode": "androidx/graphics/PathParser$PathDataNode",
-      "android/support/v17/leanback/graphics/ColorFilterCache": "androidx/leanback/graphics/ColorFilterCache",
-      "android/support/text/emoji/EmojiCompat$InitCallback": "androidx/text/emoji/EmojiCompat$InitCallback",
-      "android/support/v17/leanback/app/BrowseFragment$MainFragmentAdapterRegistry": "androidx/leanback/app/BrowseFragment$MainFragmentAdapterRegistry",
-      "android/support/transition/PropertyValuesHolderUtils": "androidx/transition/PropertyValuesHolderUtils",
-      "android/support/v7/widget/ActivityChooserModel$DefaultSorter": "androidx/widget/ActivityChooserModel$DefaultSorter",
-      "android/support/v7/app/AlertController$CheckedItemAdapter": "androidx/app/AlertController$CheckedItemAdapter",
-      "android/support/design/widget/TabItem": "androidx/design/widget/TabItem",
-      "android/support/v4/media/MediaBrowserCompatApi21$ConnectionCallbackProxy": "androidx/media/MediaBrowserCompatApi21$ConnectionCallbackProxy",
-      "android/support/content/LoaderQueryRunner": "androidx/content/LoaderQueryRunner",
-      "android/support/v17/leanback/app/BrowseSupportFragment$FragmentFactory": "androidx/leanback/app/BrowseSupportFragment$FragmentFactory",
-      "android/support/v7/app/AppCompatDelegateImplN$AppCompatWindowCallbackN": "androidx/app/AppCompatDelegateImplN$AppCompatWindowCallbackN",
-      "android/support/wear/widget/drawer/WearableDrawerLayout$DrawerDraggerCallback": "androidx/wear/widget/drawer/WearableDrawerLayout$DrawerDraggerCallback",
-      "android/support/v7/widget/OpReorderer": "androidx/widget/OpReorderer",
-      "android/support/media/instantvideo/preload/InstantVideoPreloadManager": "androidx/media/instantvideo/preload/InstantVideoPreloadManager",
-      "android/support/v4/view/ViewPropertyAnimatorCompat": "androidx/view/ViewPropertyAnimatorCompat",
-      "android/support/v13/app/FragmentCompat$FragmentCompatApi23Impl": "androidx/app/FragmentCompat$FragmentCompatApi23Impl",
-      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi23": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi23",
-      "android/support/v4/internal/view/SupportSubMenu": "androidx/internal/view/SupportSubMenu",
-      "android/support/text/emoji/EmojiProcessor$Action": "androidx/text/emoji/EmojiProcessor$Action",
-      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi21": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi21",
-      "android/support/v17/leanback/widget/DetailsOverviewLogoPresenter$ViewHolder": "androidx/leanback/widget/DetailsOverviewLogoPresenter$ViewHolder",
-      "android/support/v7/widget/OrientationHelper": "androidx/widget/OrientationHelper",
-      "android/support/v4/app/FragmentTransition$FragmentContainerTransition": "androidx/app/FragmentTransition$FragmentContainerTransition",
-      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi26": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplApi26",
-      "android/support/v7/preference/PreferenceViewHolder": "androidx/preference/PreferenceViewHolder",
-      "android/support/graphics/drawable/VectorDrawableCommon": "androidx/graphics/drawable/VectorDrawableCommon",
-      "android/support/v4/view/animation/FastOutLinearInInterpolator": "androidx/view/animation/FastOutLinearInInterpolator",
-      "android/support/v4/media/MediaBrowserServiceCompatApi26$MediaBrowserServiceAdaptor": "androidx/media/MediaBrowserServiceCompatApi26$MediaBrowserServiceAdaptor",
-      "android/support/v7/view/SupportActionModeWrapper": "androidx/view/SupportActionModeWrapper",
-      "android/support/v7/app/AppCompatDelegateImplV11": "androidx/app/AppCompatDelegateImplV11",
-      "android/support/v7/app/AppCompatDelegateImplV14": "androidx/app/AppCompatDelegateImplV14",
-      "android/support/v4/graphics/TypefaceCompatApi26Impl": "androidx/graphics/TypefaceCompatApi26Impl",
-      "android/support/v17/leanback/media/PlaybackGlueHost$PlayerCallback": "androidx/leanback/media/PlaybackGlueHost$PlayerCallback",
-      "android/support/design/widget/BottomNavigationView$SavedState": "androidx/design/widget/BottomNavigationView$SavedState",
-      "android/support/text/emoji/R$styleable": "androidx/text/emoji/R$styleable",
-      "android/support/v4/view/animation/LinearOutSlowInInterpolator": "androidx/view/animation/LinearOutSlowInInterpolator",
-      "android/support/v7/widget/LinearLayoutManager$LayoutState": "androidx/widget/LinearLayoutManager$LayoutState",
-      "android/support/wear/widget/BoxInsetLayout": "androidx/wear/widget/BoxInsetLayout",
-      "android/support/design/widget/HeaderBehavior": "androidx/design/widget/HeaderBehavior",
-      "android/support/v17/leanback/widget/PageRow": "androidx/leanback/widget/PageRow",
-      "android/support/v7/widget/ViewStubCompat": "androidx/widget/ViewStubCompat",
-      "android/support/v7/widget/SearchView$AutoCompleteTextViewReflector": "androidx/widget/SearchView$AutoCompleteTextViewReflector",
-      "android/support/v17/leanback/widget/OnChildLaidOutListener": "androidx/leanback/widget/OnChildLaidOutListener",
-      "android/support/v7/app/TwilightManager$TwilightState": "androidx/app/TwilightManager$TwilightState",
-      "android/support/v7/widget/FastScroller": "androidx/widget/FastScroller",
-      "android/support/design/widget/CoordinatorLayout$ViewElevationComparator": "androidx/design/widget/CoordinatorLayout$ViewElevationComparator",
-      "android/support/transition/TransitionManager": "androidx/transition/TransitionManager",
-      "android/support/v7/widget/AppCompatDrawableManager": "androidx/widget/AppCompatDrawableManager",
-      "android/support/animation/DynamicAnimation$OnAnimationUpdateListener": "androidx/animation/DynamicAnimation$OnAnimationUpdateListener",
-      "android/support/v4/graphics/TypefaceCompat": "androidx/graphics/TypefaceCompat",
-      "android/support/v17/preference/LeanbackPreferenceFragment": "androidx/leanback/preference/LeanbackPreferenceFragment",
-      "android/support/v17/leanback/widget/ParallaxTarget": "androidx/leanback/widget/ParallaxTarget",
-      "android/support/annotation/StyleRes": "androidx/annotation/StyleRes",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$ThumbsDownAction": "androidx/leanback/widget/PlaybackControlsRow$ThumbsDownAction",
-      "android/support/v17/leanback/media/PlaybackTransportControlGlue$SeekUiClient": "androidx/leanback/media/PlaybackTransportControlGlue$SeekUiClient",
-      "android/support/v7/media/SystemMediaRouteProvider$JellybeanImpl$SystemRouteRecord": "androidx/media/SystemMediaRouteProvider$JellybeanImpl$SystemRouteRecord",
-      "android/support/v17/leanback/widget/ShadowHelper$ShadowHelperStubImpl": "androidx/leanback/widget/ShadowHelper$ShadowHelperStubImpl",
-      "android/support/animation/DynamicAnimation$ViewProperty": "androidx/animation/DynamicAnimation$ViewProperty",
-      "android/support/v7/app/AppCompatDelegateImplV23": "androidx/app/AppCompatDelegateImplV23",
-      "android/support/v4/app/NotificationManagerCompat": "androidx/app/NotificationManagerCompat",
-      "android/support/v4/media/session/MediaControllerCompat": "androidx/media/session/MediaControllerCompat",
-      "android/support/v17/leanback/widget/GuidedDatePickerAction": "androidx/leanback/widget/GuidedDatePickerAction",
-      "android/support/v4/widget/CircularProgressDrawable$ProgressDrawableSize": "androidx/widget/CircularProgressDrawable$ProgressDrawableSize",
-      "android/support/v17/leanback/widget/Presenter$ViewHolderTask": "androidx/leanback/widget/Presenter$ViewHolderTask",
-      "android/support/text/emoji/bundled/BundledEmojiCompatConfig": "androidx/text/emoji/bundled/BundledEmojiCompatConfig",
-      "android/support/content/ContentPager$CursorView": "androidx/content/ContentPager$CursorView",
-      "android/support/transition/TranslationAnimationCreator$TransitionPositionListener": "androidx/transition/TranslationAnimationCreator$TransitionPositionListener",
-      "android/support/v7/recyclerview/R$styleable": "androidx/recyclerview/R$styleable",
-      "android/support/v17/leanback/widget/PersistentFocusWrapper": "androidx/leanback/widget/PersistentFocusWrapper",
-      "android/support/v4/view/accessibility/AccessibilityWindowInfoCompat": "androidx/view/accessibility/AccessibilityWindowInfoCompat",
-      "android/support/v17/leanback/widget/PlaybackControlsRow$RewindAction": "androidx/leanback/widget/PlaybackControlsRow$RewindAction",
-      "android/support/v7/widget/AppCompatPopupWindow": "androidx/widget/AppCompatPopupWindow",
-      "android/support/mediacompat/R$id": "androidx/mediacompat/R$id",
-      "android/support/v17/leanback/widget/ItemAlignmentFacet": "androidx/leanback/widget/ItemAlignmentFacet",
-      "android/support/v4/view/GestureDetectorCompat$GestureDetectorCompatImplBase$GestureHandler": "androidx/view/GestureDetectorCompat$GestureDetectorCompatImplBase$GestureHandler",
-      "android/support/v17/leanback/widget/GuidedAction$BuilderBase": "androidx/leanback/widget/GuidedAction$BuilderBase",
-      "android/support/v17/leanback/widget/RoundedRectHelper$Impl": "androidx/leanback/widget/RoundedRectHelper$Impl",
-      "android/support/v7/media/MediaRouterJellybean$CallbackProxy": "androidx/media/MediaRouterJellybean$CallbackProxy",
-      "android/support/design/widget/CollapsingToolbarLayout$LayoutParams": "androidx/design/widget/CollapsingToolbarLayout$LayoutParams",
-      "android/support/v7/preference/DialogPreference": "androidx/preference/DialogPreference",
-      "android/support/v7/preference/EditTextPreference": "androidx/preference/EditTextPreference",
-      "android/support/v4/media/MediaBrowserCompatApi23$ItemCallbackProxy": "androidx/media/MediaBrowserCompatApi23$ItemCallbackProxy",
-      "android/support/v4/text/util/LinkifyCompat$LinkifyMask": "androidx/text/util/LinkifyCompat$LinkifyMask",
-      "android/support/v7/widget/helper/ItemTouchHelper$SimpleCallback": "androidx/widget/helper/ItemTouchHelper$SimpleCallback",
-      "android/support/wear/ambient/AmbientMode$AmbientCallbackProvider": "androidx/wear/ambient/AmbientMode$AmbientCallbackProvider",
-      "android/support/v7/widget/CardViewImpl": "androidx/widget/CardViewImpl",
-      "android/support/animation/FloatValueHolder": "androidx/animation/FloatValueHolder",
-      "android/support/transition/MatrixUtils": "androidx/transition/MatrixUtils",
-      "android/support/v14/preference/PreferenceFragment$OnPreferenceStartFragmentCallback": "androidx/preference/PreferenceFragment$OnPreferenceStartFragmentCallback",
-      "android/support/v4/widget/SlidingPaneLayout$PanelSlideListener": "androidx/widget/SlidingPaneLayout$PanelSlideListener",
-      "android/support/v7/util/SortedList": "androidx/util/SortedList",
-      "android/support/v4/view/AccessibilityDelegateCompat$AccessibilityDelegateBaseImpl": "androidx/view/AccessibilityDelegateCompat$AccessibilityDelegateBaseImpl",
-      "android/support/v7/app/MediaRouteControllerDialog$FetchArtTask": "androidx/app/MediaRouteControllerDialog$FetchArtTask",
-      "android/support/compat/R$drawable": "androidx/compat/R$drawable",
+      "android/support/transition/WindowIdApi14": "androidx/transition/WindowIdApi14",
+      "android/support/transition/WindowIdApi18": "androidx/transition/WindowIdApi18",
+      "android/support/transition/Visibility$1": "androidx/transition/Visibility$1",
+      "android/support/transition/Visibility$DisappearListener": "androidx/transition/Visibility$DisappearListener",
+      "android/support/transition/Visibility$Mode": "androidx/transition/Visibility$Mode",
       "android/support/transition/Visibility$VisibilityInfo": "androidx/transition/Visibility$VisibilityInfo",
-      "android/support/v7/widget/ThemedSpinnerAdapter": "androidx/widget/ThemedSpinnerAdapter",
-      "android/support/v17/leanback/widget/GuidanceStylingRelativeLayout": "androidx/leanback/widget/GuidanceStylingRelativeLayout",
-      "android/support/v7/media/MediaRouter$ProviderInfo": "androidx/media/MediaRouter$ProviderInfo",
-      "android/support/v7/media/MediaControlIntent": "androidx/media/MediaControlIntent",
-      "android/support/v17/leanback/widget/ListRow": "androidx/leanback/widget/ListRow",
-      "android/support/v7/view/menu/ListMenuPresenter$MenuAdapter": "androidx/view/menu/ListMenuPresenter$MenuAdapter",
-      "android/support/v4/app/FrameMetricsAggregator$FrameMetricsBaseImpl": "androidx/app/FrameMetricsAggregator$FrameMetricsBaseImpl",
-      "android/support/design/widget/TabLayout$SlidingTabStrip": "androidx/design/widget/TabLayout$SlidingTabStrip",
-      "android/support/content/ContentPager$ContentCallback": "androidx/content/ContentPager$ContentCallback",
-      "android/support/v4/media/MediaBrowserServiceCompat$MediaBrowserServiceImplBase": "androidx/media/MediaBrowserServiceCompat$MediaBrowserServiceImplBase",
-      "android/support/v7/util/TileList": "androidx/util/TileList",
-      "android/support/v7/widget/ActionBarBackgroundDrawable": "androidx/widget/ActionBarBackgroundDrawable",
-      "android/support/v4/widget/CursorFilter$CursorFilterClient": "androidx/widget/CursorFilter$CursorFilterClient",
-      "android/support/v17/leanback/database/CursorMapper": "androidx/leanback/database/CursorMapper",
-      "android/support/v17/leanback/transition/LeanbackTransitionHelper$LeanbackTransitionHelperKitKatImpl": "androidx/leanback/transition/LeanbackTransitionHelper$LeanbackTransitionHelperKitKatImpl",
-      "android/support/v7/cardview/R$styleable": "androidx/cardview/R$styleable",
-      "android/support/v17/leanback/transition/TransitionHelperApi21": "androidx/leanback/transition/TransitionHelperApi21",
-      "android/support/v7/widget/ViewInfoStore": "androidx/widget/ViewInfoStore",
-      "android/support/design/widget/BaseTransientBottomBar$BaseCallback$DismissEvent": "androidx/design/widget/BaseTransientBottomBar$BaseCallback$DismissEvent",
-      "android/support/percent/PercentLayoutHelper$PercentLayoutInfo": "androidx/PercentLayoutHelper$PercentLayoutInfo",
-      "android/support/v7/app/AppCompatCallback": "androidx/app/AppCompatCallback",
-      "android/support/wear/R$style": "androidx/wear/R$style",
-      "android/support/v17/leanback/widget/ItemAlignmentFacetHelper": "androidx/leanback/widget/ItemAlignmentFacetHelper",
-      "android/support/v7/view/menu/MenuItemImpl": "androidx/view/menu/MenuItemImpl",
-      "android/support/v4/content/ContextCompat": "androidx/content/ContextCompat",
-      "android/support/percent/PercentLayoutHelper$PercentMarginLayoutParams": "androidx/PercentLayoutHelper$PercentMarginLayoutParams",
-      "android/support/v7/widget/LayoutState": "androidx/widget/LayoutState",
-      "android/support/animation/AnimationHandler$AnimationFrameCallback": "androidx/animation/AnimationHandler$AnimationFrameCallback",
-      "android/support/v17/leanback/widget/SingleRow": "androidx/leanback/widget/SingleRow",
-      "android/support/v4/content/ModernAsyncTask$InternalHandler": "androidx/content/ModernAsyncTask$InternalHandler",
-      "android/support/transition/ImageViewUtilsImpl": "androidx/transition/ImageViewUtilsImpl",
-      "android/support/v7/widget/RtlSpacingHelper": "androidx/widget/RtlSpacingHelper",
-      "android/support/v4/content/PermissionChecker": "androidx/content/PermissionChecker",
-      "android/support/v7/preference/PreferenceCategory": "androidx/preference/PreferenceCategory",
-      "android/support/annotation/IntDef": "androidx/annotation/IntDef",
-      "android/support/v4/app/BundleCompat$BundleCompatBaseImpl": "androidx/app/BundleCompat$BundleCompatBaseImpl",
-      "android/support/v7/app/MediaRouteExpandCollapseButton": "androidx/app/MediaRouteExpandCollapseButton",
-      "android/support/v17/leanback/animation/LogAccelerateInterpolator": "androidx/leanback/animation/LogAccelerateInterpolator",
-      "android/support/v13/app/FragmentPagerAdapter": "androidx/app/legacy/FragmentPagerAdapter",
-      "android/support/content/InMemoryCursor": "androidx/content/InMemoryCursor",
-      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$ActionsItemBridgeAdapter": "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$ActionsItemBridgeAdapter",
-      "android/support/v7/widget/AppCompatTextViewAutoSizeHelper": "androidx/widget/AppCompatTextViewAutoSizeHelper",
-      "android/support/v7/preference/PreferenceGroup": "androidx/preference/PreferenceGroup",
-      "android/support/v7/media/RegisteredMediaRouteProvider$Connection": "androidx/media/RegisteredMediaRouteProvider$Connection",
-      "android/support/v4/os/ParcelableCompatCreatorCallbacks": "androidx/os/ParcelableCompatCreatorCallbacks",
-      "android/support/v4/media/MediaMetadataCompat$BitmapKey": "androidx/media/MediaMetadataCompat$BitmapKey",
-      "android/support/v7/app/MediaRouteActionProvider$MediaRouterCallback": "androidx/app/MediaRouteActionProvider$MediaRouterCallback",
-      "android/support/v7/view/ViewPropertyAnimatorCompatSet": "androidx/view/ViewPropertyAnimatorCompatSet",
-      "android/support/v7/widget/AppCompatMultiAutoCompleteTextView": "androidx/widget/AppCompatMultiAutoCompleteTextView",
-      "android/support/v17/leanback/widget/GridLayoutManager$GridLinearSmoothScroller": "androidx/leanback/widget/GridLayoutManager$GridLinearSmoothScroller",
-      "android/support/design/internal/NavigationMenuView": "androidx/design/internal/NavigationMenuView",
-      "android/support/v17/leanback/app/SearchSupportFragment": "androidx/leanback/app/SearchSupportFragment",
-      "android/support/v7/media/SystemMediaRouteProvider$Api24Impl": "androidx/media/SystemMediaRouteProvider$Api24Impl",
-      "android/support/v4/content/FileProvider$PathStrategy": "androidx/content/FileProvider$PathStrategy",
-      "android/support/v17/leanback/util/StateMachine": "androidx/leanback/util/StateMachine",
-      "android/support/v7/widget/AppCompatCheckedTextView": "androidx/widget/AppCompatCheckedTextView",
-      "android/support/v4/media/session/PlaybackStateCompat$Builder": "androidx/media/session/PlaybackStateCompat$Builder",
-      "android/support/v17/leanback/widget/DetailsParallaxDrawable": "androidx/leanback/widget/DetailsParallaxDrawable",
-      "android/support/v17/leanback/widget/GuidedDatePickerAction$BuilderBase": "androidx/leanback/widget/GuidedDatePickerAction$BuilderBase",
-      "android/support/v17/leanback/widget/OnItemViewSelectedListener": "androidx/leanback/widget/OnItemViewSelectedListener",
-      "android/support/v7/widget/ShareActionProvider$OnShareTargetSelectedListener": "androidx/widget/ShareActionProvider$OnShareTargetSelectedListener",
-      "android/support/v4/app/JobIntentService$CompatWorkItem": "androidx/app/JobIntentService$CompatWorkItem",
-      "android/support/v7/preference/MultiSelectListPreferenceDialogFragmentCompat": "androidx/preference/MultiSelectListPreferenceDialogFragmentCompat",
-      "android/support/v17/leanback/widget/OnActionClickedListener": "androidx/leanback/widget/OnActionClickedListener",
-      "android/support/design/widget/SwipeDismissBehavior$OnDismissListener": "androidx/design/widget/SwipeDismissBehavior$OnDismissListener",
-      "android/support/design/R$id": "androidx/design/R$id",
-      "android/support/content/ContentPager$Stats": "androidx/content/ContentPager$Stats",
-      "android/support/v17/leanback/widget/SinglePresenterSelector": "androidx/leanback/widget/SinglePresenterSelector",
-      "android/support/v7/widget/GridLayout$Arc": "androidx/widget/GridLayout$Arc",
-      "android/support/v17/leanback/widget/BaseGridView$OnKeyInterceptListener": "androidx/leanback/widget/BaseGridView$OnKeyInterceptListener",
-      "android/support/customtabs/CustomTabsService$Relation": "androidx/browser/customtabs/CustomTabsService$Relation",
-      "android/support/v4/content/WakefulBroadcastReceiver": "androidx/content/WakefulBroadcastReceiver",
-      "android/support/v4/os/LocaleHelper": "androidx/os/LocaleHelper",
-      "android/support/v7/app/ActionBar$NavigationMode": "androidx/app/ActionBar$NavigationMode",
-      "android/support/v7/media/RemotePlaybackClient$ActionReceiver": "androidx/media/RemotePlaybackClient$ActionReceiver",
-      "android/support/v7/view/menu/CascadingMenuPopup$HorizPosition": "androidx/view/menu/CascadingMenuPopup$HorizPosition",
-      "android/support/v13/view/inputmethod/EditorInfoCompat": "androidx/view/inputmethod/EditorInfoCompat",
-      "android/support/v17/leanback/widget/Grid": "androidx/leanback/widget/Grid",
-      "android/support/annotation/TransitionRes": "androidx/annotation/TransitionRes",
-      "android/support/v4/media/VolumeProviderCompat": "androidx/media/VolumeProviderCompat",
-      "android/support/multidex/MultiDexApplication": "androidx/multidex/MultiDexApplication",
-      "android/support/text/emoji/EmojiCompat$MetadataRepoLoader": "androidx/text/emoji/EmojiCompat$MetadataRepoLoader",
-      "android/support/design/widget/TextInputLayout": "androidx/design/widget/TextInputLayout",
-      "android/support/v4/view/ViewCompat$ViewCompatApi24Impl": "androidx/view/legacy/ViewCompat$ViewCompatApi24Impl",
-      "android/support/v4/provider/FontRequest": "androidx/provider/FontRequest",
-      "android/support/v4/media/session/MediaButtonReceiver$MediaButtonConnectionCallback": "androidx/media/session/MediaButtonReceiver$MediaButtonConnectionCallback",
-      "android/support/v7/widget/RecyclerView$SmoothScroller$ScrollVectorProvider": "androidx/widget/RecyclerView$SmoothScroller$ScrollVectorProvider",
-      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImpl": "androidx/media/session/MediaSessionCompat$MediaSessionImpl",
-      "android/support/v4/content/ModernAsyncTask$Status": "androidx/content/ModernAsyncTask$Status",
-      "android/support/v7/widget/AppCompatDrawableManager$ColorFilterLruCache": "androidx/widget/AppCompatDrawableManager$ColorFilterLruCache",
-      "android/support/multidex/MultiDex": "androidx/multidex/MultiDex",
-      "android/support/wear/ambient/WearableControllerProvider": "androidx/wear/ambient/WearableControllerProvider",
-      "android/support/v17/leanback/widget/ForegroundHelper": "androidx/leanback/widget/ForegroundHelper",
-      "android/support/v4/app/DialogFragment$DialogStyle": "androidx/app/DialogFragment$DialogStyle",
-      "android/support/v4/graphics/TypefaceCompatApi24Impl": "androidx/graphics/TypefaceCompatApi24Impl",
-      "android/support/v7/app/ActionBar$Tab": "androidx/app/ActionBar$Tab",
-      "android/support/transition/CircularPropagation": "androidx/transition/CircularPropagation",
-      "android/support/v7/app/ResourcesFlusher": "androidx/app/ResourcesFlusher",
-      "android/support/text/emoji/MetadataListReader$OffsetInfo": "androidx/text/emoji/MetadataListReader$OffsetInfo",
-      "android/support/v4/app/ActivityOptionsCompat$ActivityOptionsCompatApi24Impl": "androidx/app/ActivityOptionsCompat$ActivityOptionsCompatApi24Impl",
-      "android/support/v4/content/SharedPreferencesCompat$EditorCompat": "androidx/content/SharedPreferencesCompat$EditorCompat",
-      "android/support/v7/widget/RecyclerView$OnFlingListener": "androidx/widget/RecyclerView$OnFlingListener",
+      "android/arch/persistence/room/parser/SQLiteParser$Select_coreContext": "androidx/persistence/room/parser/SQLiteParser$Select_coreContext",
+      "android/arch/persistence/room/parser/SQLiteParser": "androidx/persistence/room/parser/SQLiteParser",
+      "android/arch/persistence/room/parser/SQLiteParser$Result_columnContext": "androidx/persistence/room/parser/SQLiteParser$Result_columnContext",
+      "android/arch/persistence/room/parser/SQLiteParser$ExprContext": "androidx/persistence/room/parser/SQLiteParser$ExprContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Table_or_subqueryContext": "androidx/persistence/room/parser/SQLiteParser$Table_or_subqueryContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Join_clauseContext": "androidx/persistence/room/parser/SQLiteParser$Join_clauseContext",
+      "android/arch/persistence/room/parser/SQLiteListener": "androidx/persistence/room/parser/SQLiteListener",
+      "android/arch/persistence/room/parser/SQLiteVisitor": "androidx/persistence/room/parser/SQLiteVisitor",
+      "android/arch/persistence/room/parser/SQLiteParser$Function_nameContext": "androidx/persistence/room/parser/SQLiteParser$Function_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Any_nameContext": "androidx/persistence/room/parser/SQLiteParser$Any_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Indexed_columnContext": "androidx/persistence/room/parser/SQLiteParser$Indexed_columnContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Column_nameContext": "androidx/persistence/room/parser/SQLiteParser$Column_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Collation_nameContext": "androidx/persistence/room/parser/SQLiteParser$Collation_nameContext",
+      "android/arch/persistence/room/parser/SQLiteLexer": "androidx/persistence/room/parser/SQLiteLexer",
+      "android/arch/persistence/room/parser/SQLiteParser$KeywordContext": "androidx/persistence/room/parser/SQLiteParser$KeywordContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Create_view_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Create_view_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$View_nameContext": "androidx/persistence/room/parser/SQLiteParser$View_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Select_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Select_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Database_nameContext": "androidx/persistence/room/parser/SQLiteParser$Database_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Unary_operatorContext": "androidx/persistence/room/parser/SQLiteParser$Unary_operatorContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Table_aliasContext": "androidx/persistence/room/parser/SQLiteParser$Table_aliasContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Table_constraintContext": "androidx/persistence/room/parser/SQLiteParser$Table_constraintContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Conflict_clauseContext": "androidx/persistence/room/parser/SQLiteParser$Conflict_clauseContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Foreign_key_clauseContext": "androidx/persistence/room/parser/SQLiteParser$Foreign_key_clauseContext",
+      "android/arch/persistence/room/parser/SQLiteParser$NameContext": "androidx/persistence/room/parser/SQLiteParser$NameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Select_or_valuesContext": "androidx/persistence/room/parser/SQLiteParser$Select_or_valuesContext",
+      "android/arch/persistence/room/parser/SQLiteParser$With_clauseContext": "androidx/persistence/room/parser/SQLiteParser$With_clauseContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Compound_operatorContext": "androidx/persistence/room/parser/SQLiteParser$Compound_operatorContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Ordering_termContext": "androidx/persistence/room/parser/SQLiteParser$Ordering_termContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Update_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Update_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Qualified_table_nameContext": "androidx/persistence/room/parser/SQLiteParser$Qualified_table_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Compound_select_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Compound_select_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Analyze_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Analyze_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Table_or_index_nameContext": "androidx/persistence/room/parser/SQLiteParser$Table_or_index_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Transaction_nameContext": "androidx/persistence/room/parser/SQLiteParser$Transaction_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Savepoint_nameContext": "androidx/persistence/room/parser/SQLiteParser$Savepoint_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Pragma_nameContext": "androidx/persistence/room/parser/SQLiteParser$Pragma_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Module_nameContext": "androidx/persistence/room/parser/SQLiteParser$Module_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Trigger_nameContext": "androidx/persistence/room/parser/SQLiteParser$Trigger_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Index_nameContext": "androidx/persistence/room/parser/SQLiteParser$Index_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Foreign_tableContext": "androidx/persistence/room/parser/SQLiteParser$Foreign_tableContext",
+      "android/arch/persistence/room/parser/SQLiteParser$New_table_nameContext": "androidx/persistence/room/parser/SQLiteParser$New_table_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Table_nameContext": "androidx/persistence/room/parser/SQLiteParser$Table_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Table_function_nameContext": "androidx/persistence/room/parser/SQLiteParser$Table_function_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Schema_nameContext": "androidx/persistence/room/parser/SQLiteParser$Schema_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Column_aliasContext": "androidx/persistence/room/parser/SQLiteParser$Column_aliasContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Module_argumentContext": "androidx/persistence/room/parser/SQLiteParser$Module_argumentContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Error_messageContext": "androidx/persistence/room/parser/SQLiteParser$Error_messageContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Literal_valueContext": "androidx/persistence/room/parser/SQLiteParser$Literal_valueContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Signed_numberContext": "androidx/persistence/room/parser/SQLiteParser$Signed_numberContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Join_constraintContext": "androidx/persistence/room/parser/SQLiteParser$Join_constraintContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Join_operatorContext": "androidx/persistence/room/parser/SQLiteParser$Join_operatorContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Common_table_expressionContext": "androidx/persistence/room/parser/SQLiteParser$Common_table_expressionContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Pragma_valueContext": "androidx/persistence/room/parser/SQLiteParser$Pragma_valueContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Raise_functionContext": "androidx/persistence/room/parser/SQLiteParser$Raise_functionContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Column_constraintContext": "androidx/persistence/room/parser/SQLiteParser$Column_constraintContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Type_nameContext": "androidx/persistence/room/parser/SQLiteParser$Type_nameContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Column_defContext": "androidx/persistence/room/parser/SQLiteParser$Column_defContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Vacuum_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Vacuum_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Update_stmt_limitedContext": "androidx/persistence/room/parser/SQLiteParser$Update_stmt_limitedContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Simple_select_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Simple_select_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Savepoint_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Savepoint_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Rollback_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Rollback_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Release_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Release_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Reindex_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Reindex_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Pragma_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Pragma_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Insert_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Insert_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Factored_select_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Factored_select_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Drop_view_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Drop_view_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Drop_trigger_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Drop_trigger_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Drop_table_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Drop_table_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Drop_index_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Drop_index_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Detach_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Detach_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Delete_stmt_limitedContext": "androidx/persistence/room/parser/SQLiteParser$Delete_stmt_limitedContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Delete_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Delete_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Create_virtual_table_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Create_virtual_table_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Create_trigger_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Create_trigger_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Create_table_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Create_table_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Create_index_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Create_index_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Commit_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Commit_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Begin_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Begin_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Attach_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Attach_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Alter_table_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Alter_table_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Sql_stmtContext": "androidx/persistence/room/parser/SQLiteParser$Sql_stmtContext",
+      "android/arch/persistence/room/parser/SQLiteParser$Sql_stmt_listContext": "androidx/persistence/room/parser/SQLiteParser$Sql_stmt_listContext",
+      "android/arch/persistence/room/parser/SQLiteParser$ErrorContext": "androidx/persistence/room/parser/SQLiteParser$ErrorContext",
+      "android/arch/persistence/room/parser/SQLiteParser$ParseContext": "androidx/persistence/room/parser/SQLiteParser$ParseContext",
+      "android/arch/persistence/room/parser/SQLiteBaseVisitor": "androidx/persistence/room/parser/SQLiteBaseVisitor",
+      "android/arch/persistence/room/parser/SQLiteBaseListener": "androidx/persistence/room/parser/SQLiteBaseListener",
+      "android/arch/persistence/room/verifier/ColumnInfo": "androidx/persistence/room/verifier/ColumnInfo",
+      "android/arch/persistence/room/parser/SQLTypeAffinity": "androidx/persistence/room/parser/SQLTypeAffinity",
+      "android/arch/persistence/room/RoomProcessor$ContextBoundProcessingStep": "androidx/persistence/room/RoomProcessor$ContextBoundProcessingStep",
+      "android/arch/persistence/room/RoomProcessor": "androidx/persistence/room/RoomProcessor",
+      "android/arch/persistence/room/processor/Context": "androidx/persistence/room/processor/Context",
+      "android/arch/persistence/room/preconditions/Checks": "androidx/persistence/room/preconditions/Checks",
+      "android/arch/persistence/room/log/RLog": "androidx/persistence/room/log/RLog",
+      "android/arch/persistence/room/ext/Element_extKt": "androidx/persistence/room/ext/Element_extKt",
+      "android/arch/persistence/room/RoomProcessor$DatabaseProcessingStep": "androidx/persistence/room/RoomProcessor$DatabaseProcessingStep",
+      "android/arch/persistence/room/Database": "androidx/persistence/room/Database",
+      "android/arch/persistence/room/processor/DatabaseProcessor": "androidx/persistence/room/processor/DatabaseProcessor",
+      "android/arch/persistence/room/vo/Database": "androidx/persistence/room/vo/Database",
+      "android/arch/persistence/room/vo/DaoMethod": "androidx/persistence/room/vo/DaoMethod",
+      "android/arch/persistence/room/writer/DaoWriter": "androidx/persistence/room/writer/DaoWriter",
+      "android/arch/persistence/room/vo/Dao": "androidx/persistence/room/vo/Dao",
+      "android/arch/persistence/room/writer/DatabaseWriter": "androidx/persistence/room/writer/DatabaseWriter",
+      "android/arch/persistence/room/vo/Warning": "androidx/persistence/room/vo/Warning",
+      "android/arch/persistence/room/processor/ProcessorErrors": "androidx/persistence/room/processor/ProcessorErrors",
+      "android/arch/persistence/room/Dao": "androidx/persistence/room/Dao",
+      "android/arch/persistence/room/Entity": "androidx/persistence/room/Entity",
+      "android/arch/persistence/room/parser/SQLTypeAffinity$Companion": "androidx/persistence/room/parser/SQLTypeAffinity$Companion",
+      "android/arch/persistence/room/parser/Collate": "androidx/persistence/room/parser/Collate",
+      "android/arch/persistence/room/parser/Collate$Companion": "androidx/persistence/room/parser/Collate$Companion",
+      "android/arch/persistence/room/parser/SQLTypeAffinity$WhenMappings": "androidx/persistence/room/parser/SQLTypeAffinity$WhenMappings",
+      "android/arch/persistence/room/parser/Section$Companion": "androidx/persistence/room/parser/Section$Companion",
+      "android/arch/persistence/room/parser/Section": "androidx/persistence/room/parser/Section",
+      "android/arch/persistence/room/parser/SectionType": "androidx/persistence/room/parser/SectionType",
+      "android/arch/persistence/room/parser/ParsedQuery$sections$2": "androidx/persistence/room/parser/ParsedQuery$sections$2",
+      "android/arch/persistence/room/parser/ParsedQuery": "androidx/persistence/room/parser/ParsedQuery",
+      "android/arch/persistence/room/parser/QueryType": "androidx/persistence/room/parser/QueryType",
+      "android/arch/persistence/room/parser/ParsedQuery$queryWithReplacedBindParams$2$1": "androidx/persistence/room/parser/ParsedQuery$queryWithReplacedBindParams$2$1",
+      "android/arch/persistence/room/parser/ParsedQuery$queryWithReplacedBindParams$2": "androidx/persistence/room/parser/ParsedQuery$queryWithReplacedBindParams$2",
+      "android/arch/persistence/room/parser/ParsedQuery$WhenMappings": "androidx/persistence/room/parser/ParsedQuery$WhenMappings",
+      "android/arch/persistence/room/parser/SqlParser": "androidx/persistence/room/parser/SqlParser",
+      "android/arch/persistence/room/parser/SqlParser$Companion": "androidx/persistence/room/parser/SqlParser$Companion",
+      "android/arch/persistence/room/parser/SqlParser$Companion$parse$1": "androidx/persistence/room/parser/SqlParser$Companion$parse$1",
+      "android/arch/persistence/room/parser/ParserErrors": "androidx/persistence/room/parser/ParserErrors",
+      "android/arch/persistence/room/parser/QueryVisitor": "androidx/persistence/room/parser/QueryVisitor",
+      "android/arch/persistence/room/parser/Table": "androidx/persistence/room/parser/Table",
+      "android/arch/persistence/room/parser/ParsedQuery$errors$2": "androidx/persistence/room/parser/ParsedQuery$errors$2",
+      "android/arch/persistence/room/parser/QueryVisitor$createParsedQuery$$inlined$sortedBy$1": "androidx/persistence/room/parser/QueryVisitor$createParsedQuery$$inlined$sortedBy$1",
+      "android/arch/persistence/room/parser/ParserErrors$invalidQueryType$1": "androidx/persistence/room/parser/ParserErrors$invalidQueryType$1",
+      "android/arch/persistence/room/parser/QueryType$Companion": "androidx/persistence/room/parser/QueryType$Companion",
+      "android/arch/persistence/room/parser/ParsedQuery$bindSections$2": "androidx/persistence/room/parser/ParsedQuery$bindSections$2",
+      "android/arch/persistence/room/parser/ParsedQuery$Companion": "androidx/persistence/room/parser/ParsedQuery$Companion",
+      "android/arch/persistence/room/verifier/QueryResultInfo": "androidx/persistence/room/verifier/QueryResultInfo",
+      "android/arch/persistence/room/ext/RoomTypeNames": "androidx/persistence/room/ext/RoomTypeNames",
+      "android/arch/persistence/room/ext/Element_extKt$ANNOTATION_VALUE_TO_BOOLEAN_VISITOR$1": "androidx/persistence/room/ext/Element_extKt$ANNOTATION_VALUE_TO_BOOLEAN_VISITOR$1",
+      "android/arch/persistence/room/ext/Element_extKt$ANNOTATION_VALUE_STRING_ARR_VISITOR$1": "androidx/persistence/room/ext/Element_extKt$ANNOTATION_VALUE_STRING_ARR_VISITOR$1",
+      "android/arch/persistence/room/ext/Element_extKt$ANNOTATION_VALUE_TO_STRING_VISITOR$1": "androidx/persistence/room/ext/Element_extKt$ANNOTATION_VALUE_TO_STRING_VISITOR$1",
+      "android/arch/persistence/room/ext/LifecyclesTypeNames": "androidx/persistence/room/ext/LifecyclesTypeNames",
+      "android/arch/persistence/room/ext/RoomRxJava2TypeNames": "androidx/persistence/room/ext/RoomRxJava2TypeNames",
+      "android/arch/persistence/room/ext/Element_extKt$TO_LIST_OF_TYPES$1": "androidx/persistence/room/ext/Element_extKt$TO_LIST_OF_TYPES$1",
+      "android/arch/persistence/room/ext/Element_extKt$TO_TYPE$1": "androidx/persistence/room/ext/Element_extKt$TO_TYPE$1",
+      "android/arch/persistence/room/ext/Element_extKt$extendsBound$1": "androidx/persistence/room/ext/Element_extKt$extendsBound$1",
+      "android/arch/persistence/room/ext/RxJava2TypeNames": "androidx/persistence/room/ext/RxJava2TypeNames",
+      "android/arch/persistence/room/ext/ArchTypeNames": "androidx/persistence/room/ext/ArchTypeNames",
+      "android/arch/persistence/room/ext/SupportDbTypeNames": "androidx/persistence/room/ext/SupportDbTypeNames",
+      "android/arch/persistence/room/ext/AndroidTypeNames": "androidx/persistence/room/ext/AndroidTypeNames",
+      "android/arch/persistence/room/ext/Element_extKt$ANNOTATION_VALUE_TO_INT_VISITOR$1": "androidx/persistence/room/ext/Element_extKt$ANNOTATION_VALUE_TO_INT_VISITOR$1",
+      "android/arch/persistence/room/ext/PagingTypeNames": "androidx/persistence/room/ext/PagingTypeNames",
+      "android/arch/persistence/room/ext/ReactiveStreamsTypeNames": "androidx/persistence/room/ext/ReactiveStreamsTypeNames",
+      "android/arch/persistence/room/ext/Javapoet_extKt": "androidx/persistence/room/ext/Javapoet_extKt",
+      "android/arch/persistence/room/ext/CommonTypeNames": "androidx/persistence/room/ext/CommonTypeNames",
+      "android/arch/persistence/room/solver/QueryResultBinderProvider": "androidx/persistence/room/solver/QueryResultBinderProvider",
+      "android/arch/persistence/room/solver/query/result/QueryResultBinder": "androidx/persistence/room/solver/query/result/QueryResultBinder",
+      "android/arch/persistence/room/solver/TypeAdapterStore$Companion$create$4": "androidx/persistence/room/solver/TypeAdapterStore$Companion$create$4",
+      "android/arch/persistence/room/solver/types/ColumnTypeAdapter": "androidx/persistence/room/solver/types/ColumnTypeAdapter",
+      "android/arch/persistence/room/solver/TypeAdapterStore$Companion": "androidx/persistence/room/solver/TypeAdapterStore$Companion",
+      "android/arch/persistence/room/solver/TypeAdapterStore": "androidx/persistence/room/solver/TypeAdapterStore",
+      "android/arch/persistence/room/solver/CodeGenScope": "androidx/persistence/room/solver/CodeGenScope",
+      "android/arch/persistence/room/solver/CodeGenScope$Companion": "androidx/persistence/room/solver/CodeGenScope$Companion",
+      "android/arch/persistence/room/writer/ClassWriter": "androidx/persistence/room/writer/ClassWriter",
+      "android/arch/persistence/room/solver/TypeAdapterStore$Companion$create$1": "androidx/persistence/room/solver/TypeAdapterStore$Companion$create$1",
+      "android/arch/persistence/room/solver/TypeAdapterStore$Companion$create$3": "androidx/persistence/room/solver/TypeAdapterStore$Companion$create$3",
+      "android/arch/persistence/room/solver/types/PrimitiveColumnTypeAdapter": "androidx/persistence/room/solver/types/PrimitiveColumnTypeAdapter",
+      "android/arch/persistence/room/solver/types/PrimitiveColumnTypeAdapter$Companion": "androidx/persistence/room/solver/types/PrimitiveColumnTypeAdapter$Companion",
+      "android/arch/persistence/room/solver/types/BoxedPrimitiveColumnTypeAdapter": "androidx/persistence/room/solver/types/BoxedPrimitiveColumnTypeAdapter",
+      "android/arch/persistence/room/solver/types/BoxedPrimitiveColumnTypeAdapter$Companion": "androidx/persistence/room/solver/types/BoxedPrimitiveColumnTypeAdapter$Companion",
+      "android/arch/persistence/room/solver/types/StringColumnTypeAdapter": "androidx/persistence/room/solver/types/StringColumnTypeAdapter",
+      "android/arch/persistence/room/solver/types/ByteArrayColumnTypeAdapter": "androidx/persistence/room/solver/types/ByteArrayColumnTypeAdapter",
+      "android/arch/persistence/room/solver/types/PrimitiveBooleanToIntConverter": "androidx/persistence/room/solver/types/PrimitiveBooleanToIntConverter",
+      "android/arch/persistence/room/solver/types/TypeConverter": "androidx/persistence/room/solver/types/TypeConverter",
+      "android/arch/persistence/room/solver/types/BoxedBooleanToBoxedIntConverter": "androidx/persistence/room/solver/types/BoxedBooleanToBoxedIntConverter",
+      "android/arch/persistence/room/solver/TypeAdapterStore$findTypeConverter$2": "androidx/persistence/room/solver/TypeAdapterStore$findTypeConverter$2",
+      "android/arch/persistence/room/solver/binderprovider/DataSourceFactoryQueryResultBinderProvider$dataSourceFactoryTypeMirror$2": "androidx/persistence/room/solver/binderprovider/DataSourceFactoryQueryResultBinderProvider$dataSourceFactoryTypeMirror$2",
+      "android/arch/persistence/room/solver/binderprovider/DataSourceFactoryQueryResultBinderProvider": "androidx/persistence/room/solver/binderprovider/DataSourceFactoryQueryResultBinderProvider",
+      "android/arch/persistence/room/solver/query/result/RowAdapter": "androidx/persistence/room/solver/query/result/RowAdapter",
+      "android/arch/persistence/room/solver/query/result/ListQueryResultAdapter": "androidx/persistence/room/solver/query/result/ListQueryResultAdapter",
+      "android/arch/persistence/room/solver/query/result/PositionalDataSourceQueryResultBinder": "androidx/persistence/room/solver/query/result/PositionalDataSourceQueryResultBinder",
+      "android/arch/persistence/room/solver/query/result/LivePagedListQueryResultBinder": "androidx/persistence/room/solver/query/result/LivePagedListQueryResultBinder",
+      "android/arch/persistence/room/solver/binderprovider/DataSourceQueryResultBinderProvider$positionalDataSourceTypeMirror$2": "androidx/persistence/room/solver/binderprovider/DataSourceQueryResultBinderProvider$positionalDataSourceTypeMirror$2",
+      "android/arch/persistence/room/solver/binderprovider/DataSourceQueryResultBinderProvider": "androidx/persistence/room/solver/binderprovider/DataSourceQueryResultBinderProvider",
+      "android/arch/persistence/room/solver/binderprovider/DataSourceQueryResultBinderProvider$dataSourceTypeMirror$2": "androidx/persistence/room/solver/binderprovider/DataSourceQueryResultBinderProvider$dataSourceTypeMirror$2",
+      "android/arch/persistence/room/solver/binderprovider/RxSingleQueryResultBinderProvider": "androidx/persistence/room/solver/binderprovider/RxSingleQueryResultBinderProvider",
+      "android/arch/persistence/room/solver/binderprovider/RxCallableQueryResultBinderProvider": "androidx/persistence/room/solver/binderprovider/RxCallableQueryResultBinderProvider",
+      "android/arch/persistence/room/solver/query/result/RxCallableQueryResultBinder$RxType": "androidx/persistence/room/solver/query/result/RxCallableQueryResultBinder$RxType",
+      "android/arch/persistence/room/solver/binderprovider/CursorQueryResultBinderProvider": "androidx/persistence/room/solver/binderprovider/CursorQueryResultBinderProvider",
+      "android/arch/persistence/room/solver/query/result/CursorQueryResultBinder": "androidx/persistence/room/solver/query/result/CursorQueryResultBinder",
+      "android/arch/persistence/room/solver/binderprovider/FlowableQueryResultBinderProvider$hasRxJava2Artifact$2": "androidx/persistence/room/solver/binderprovider/FlowableQueryResultBinderProvider$hasRxJava2Artifact$2",
+      "android/arch/persistence/room/solver/binderprovider/FlowableQueryResultBinderProvider": "androidx/persistence/room/solver/binderprovider/FlowableQueryResultBinderProvider",
+      "android/arch/persistence/room/solver/binderprovider/FlowableQueryResultBinderProvider$flowableTypeMirror$2": "androidx/persistence/room/solver/binderprovider/FlowableQueryResultBinderProvider$flowableTypeMirror$2",
+      "android/arch/persistence/room/solver/binderprovider/LiveDataQueryResultBinderProvider": "androidx/persistence/room/solver/binderprovider/LiveDataQueryResultBinderProvider",
+      "android/arch/persistence/room/solver/ObservableQueryResultBinderProvider": "androidx/persistence/room/solver/ObservableQueryResultBinderProvider",
+      "android/arch/persistence/room/solver/binderprovider/LiveDataQueryResultBinderProvider$liveDataTypeMirror$2": "androidx/persistence/room/solver/binderprovider/LiveDataQueryResultBinderProvider$liveDataTypeMirror$2",
+      "android/arch/persistence/room/solver/query/result/QueryResultAdapter": "androidx/persistence/room/solver/query/result/QueryResultAdapter",
+      "android/arch/persistence/room/solver/query/result/LiveDataQueryResultBinder": "androidx/persistence/room/solver/query/result/LiveDataQueryResultBinder",
+      "android/arch/persistence/room/solver/binderprovider/RxMaybeQueryResultBinderProvider": "androidx/persistence/room/solver/binderprovider/RxMaybeQueryResultBinderProvider",
+      "android/arch/persistence/room/solver/binderprovider/RxCallableQueryResultBinderProvider$hasRxJava2Artifact$2": "androidx/persistence/room/solver/binderprovider/RxCallableQueryResultBinderProvider$hasRxJava2Artifact$2",
+      "android/arch/persistence/room/solver/query/result/RxCallableQueryResultBinder": "androidx/persistence/room/solver/query/result/RxCallableQueryResultBinder",
+      "android/arch/persistence/room/solver/query/result/FlowableQueryResultBinder": "androidx/persistence/room/solver/query/result/FlowableQueryResultBinder",
+      "android/arch/persistence/room/solver/binderprovider/InstantQueryResultBinderProvider": "androidx/persistence/room/solver/binderprovider/InstantQueryResultBinderProvider",
+      "android/arch/persistence/room/solver/query/result/InstantQueryResultBinder": "androidx/persistence/room/solver/query/result/InstantQueryResultBinder",
+      "android/arch/persistence/room/solver/types/CursorValueReader": "androidx/persistence/room/solver/types/CursorValueReader",
+      "android/arch/persistence/room/solver/types/PrimitiveColumnTypeAdapter$Companion$WhenMappings": "androidx/persistence/room/solver/types/PrimitiveColumnTypeAdapter$Companion$WhenMappings",
+      "android/arch/persistence/room/solver/types/CustomTypeConverterWrapper": "androidx/persistence/room/solver/types/CustomTypeConverterWrapper",
+      "android/arch/persistence/room/solver/types/CustomTypeConverterWrapper$typeConverter$1": "androidx/persistence/room/solver/types/CustomTypeConverterWrapper$typeConverter$1",
+      "android/arch/persistence/room/vo/CustomTypeConverter": "androidx/persistence/room/vo/CustomTypeConverter",
+      "android/arch/persistence/room/writer/ClassWriter$SharedFieldSpec": "androidx/persistence/room/writer/ClassWriter$SharedFieldSpec",
+      "android/arch/persistence/room/solver/types/CompositeTypeConverter": "androidx/persistence/room/solver/types/CompositeTypeConverter",
+      "android/arch/persistence/room/solver/types/CompositeAdapter": "androidx/persistence/room/solver/types/CompositeAdapter",
+      "android/arch/persistence/room/solver/types/NoOpConverter": "androidx/persistence/room/solver/types/NoOpConverter",
+      "android/arch/persistence/room/solver/types/PrimitiveBooleanToIntConverter$create$1": "androidx/persistence/room/solver/types/PrimitiveBooleanToIntConverter$create$1",
+      "android/arch/persistence/room/solver/types/PrimitiveBooleanToIntConverter$create$2": "androidx/persistence/room/solver/types/PrimitiveBooleanToIntConverter$create$2",
+      "android/arch/persistence/room/solver/types/StatementValueBinder": "androidx/persistence/room/solver/types/StatementValueBinder",
+      "android/arch/persistence/room/solver/types/ColumnTypeAdapter$outTypeName$2": "androidx/persistence/room/solver/types/ColumnTypeAdapter$outTypeName$2",
+      "android/arch/persistence/room/solver/types/BoxedBooleanToBoxedIntConverter$create$1": "androidx/persistence/room/solver/types/BoxedBooleanToBoxedIntConverter$create$1",
+      "android/arch/persistence/room/solver/types/BoxedBooleanToBoxedIntConverter$create$2": "androidx/persistence/room/solver/types/BoxedBooleanToBoxedIntConverter$create$2",
+      "android/arch/persistence/room/solver/query/parameter/ArrayQueryParameterAdapter": "androidx/persistence/room/solver/query/parameter/ArrayQueryParameterAdapter",
+      "android/arch/persistence/room/solver/query/parameter/QueryParameterAdapter": "androidx/persistence/room/solver/query/parameter/QueryParameterAdapter",
+      "android/arch/persistence/room/solver/query/parameter/CollectionQueryParameterAdapter": "androidx/persistence/room/solver/query/parameter/CollectionQueryParameterAdapter",
+      "android/arch/persistence/room/solver/query/parameter/BasicQueryParameterAdapter": "androidx/persistence/room/solver/query/parameter/BasicQueryParameterAdapter",
+      "android/arch/persistence/room/solver/query/result/PojoRowAdapter$Mapping": "androidx/persistence/room/solver/query/result/PojoRowAdapter$Mapping",
+      "android/arch/persistence/room/solver/query/result/PojoRowAdapter": "androidx/persistence/room/solver/query/result/PojoRowAdapter",
+      "android/arch/persistence/room/vo/FieldWithIndex": "androidx/persistence/room/vo/FieldWithIndex",
+      "android/arch/persistence/room/vo/Field": "androidx/persistence/room/vo/Field",
+      "android/arch/persistence/room/solver/query/result/CursorQueryResultBinder$Companion": "androidx/persistence/room/solver/query/result/CursorQueryResultBinder$Companion",
+      "android/arch/persistence/room/solver/query/result/CursorQueryResultBinder$Companion$NO_OP_RESULT_ADAPTER$1": "androidx/persistence/room/solver/query/result/CursorQueryResultBinder$Companion$NO_OP_RESULT_ADAPTER$1",
+      "android/arch/persistence/room/solver/query/result/TransactionWrapper": "androidx/persistence/room/solver/query/result/TransactionWrapper",
+      "android/arch/persistence/room/solver/query/result/PositionalDataSourceQueryResultBinder$convertAndReturn$tableNamesList$1": "androidx/persistence/room/solver/query/result/PositionalDataSourceQueryResultBinder$convertAndReturn$tableNamesList$1",
+      "android/arch/persistence/room/solver/query/result/TransactionWrapperKt": "androidx/persistence/room/solver/query/result/TransactionWrapperKt",
+      "android/arch/persistence/room/writer/DaoWriter$Companion": "androidx/persistence/room/writer/DaoWriter$Companion",
+      "android/arch/persistence/room/solver/query/result/SingleEntityQueryResultAdapter": "androidx/persistence/room/solver/query/result/SingleEntityQueryResultAdapter",
+      "android/arch/persistence/room/solver/query/result/BaseObservableQueryResultBinder": "androidx/persistence/room/solver/query/result/BaseObservableQueryResultBinder",
+      "android/arch/persistence/room/solver/query/result/LiveDataQueryResultBinder$createAnonymousObserver$tableNamesList$1": "androidx/persistence/room/solver/query/result/LiveDataQueryResultBinder$createAnonymousObserver$tableNamesList$1",
+      "android/arch/persistence/room/solver/query/result/TransactionWrapperKt$transactionWrapper$1": "androidx/persistence/room/solver/query/result/TransactionWrapperKt$transactionWrapper$1",
+      "android/arch/persistence/room/solver/query/result/PojoRowAdapter$onCursorFinished$1": "androidx/persistence/room/solver/query/result/PojoRowAdapter$onCursorFinished$1",
+      "android/arch/persistence/room/vo/RelationCollector": "androidx/persistence/room/vo/RelationCollector",
+      "android/arch/persistence/room/vo/Pojo": "androidx/persistence/room/vo/Pojo",
+      "android/arch/persistence/room/writer/FieldReadWriteWriter": "androidx/persistence/room/writer/FieldReadWriteWriter",
+      "android/arch/persistence/room/writer/FieldReadWriteWriter$Companion": "androidx/persistence/room/writer/FieldReadWriteWriter$Companion",
+      "android/arch/persistence/room/vo/RelationCollector$Companion": "androidx/persistence/room/vo/RelationCollector$Companion",
+      "android/arch/persistence/room/solver/query/result/TransactionWrapperKt$transactionWrapper$2": "androidx/persistence/room/solver/query/result/TransactionWrapperKt$transactionWrapper$2",
+      "android/arch/persistence/room/solver/query/result/FlowableQueryResultBinder$convertAndReturn$1$tableNamesList$1": "androidx/persistence/room/solver/query/result/FlowableQueryResultBinder$convertAndReturn$1$tableNamesList$1",
+      "android/arch/persistence/room/solver/query/result/SingleColumnRowAdapter": "androidx/persistence/room/solver/query/result/SingleColumnRowAdapter",
+      "android/arch/persistence/room/solver/query/result/ArrayQueryResultAdapter": "androidx/persistence/room/solver/query/result/ArrayQueryResultAdapter",
+      "android/arch/persistence/room/solver/query/result/EntityRowAdapter": "androidx/persistence/room/solver/query/result/EntityRowAdapter",
+      "android/arch/persistence/room/vo/Entity": "androidx/persistence/room/vo/Entity",
+      "android/arch/persistence/room/writer/EntityCursorConverterWriter": "androidx/persistence/room/writer/EntityCursorConverterWriter",
+      "android/arch/persistence/room/writer/ClassWriter$SharedMethodSpec": "androidx/persistence/room/writer/ClassWriter$SharedMethodSpec",
+      "android/arch/persistence/room/solver/TypeAdapterStore$findRowAdapter$1": "androidx/persistence/room/solver/TypeAdapterStore$findRowAdapter$1",
+      "android/arch/persistence/room/solver/TypeAdapterStore$knownColumnTypeMirrors$2": "androidx/persistence/room/solver/TypeAdapterStore$knownColumnTypeMirrors$2",
+      "android/arch/persistence/room/log/RLog$CollectingMessager": "androidx/persistence/room/log/RLog$CollectingMessager",
+      "android/arch/persistence/room/processor/EntityProcessor": "androidx/persistence/room/processor/EntityProcessor",
+      "android/arch/persistence/room/processor/PojoProcessor": "androidx/persistence/room/processor/PojoProcessor",
+      "android/arch/persistence/room/processor/FieldProcessor$BindingScope": "androidx/persistence/room/processor/FieldProcessor$BindingScope",
+      "android/arch/persistence/room/vo/EmbeddedField": "androidx/persistence/room/vo/EmbeddedField",
+      "android/arch/persistence/room/processor/TransactionMethodProcessor": "androidx/persistence/room/processor/TransactionMethodProcessor",
+      "android/arch/persistence/room/vo/TransactionMethod": "androidx/persistence/room/vo/TransactionMethod",
+      "android/arch/persistence/room/processor/ProcessorErrors$cursorPojoMismatch$unusedFieldsWarning$1": "androidx/persistence/room/processor/ProcessorErrors$cursorPojoMismatch$unusedFieldsWarning$1",
+      "android/arch/persistence/room/processor/ProcessorErrors$cursorPojoMismatch$1": "androidx/persistence/room/processor/ProcessorErrors$cursorPojoMismatch$1",
+      "android/arch/persistence/room/processor/ProcessorErrors$duplicateTypeConverters$1": "androidx/persistence/room/processor/ProcessorErrors$duplicateTypeConverters$1",
+      "android/arch/persistence/room/processor/ProcessorErrors$INVALID_ANNOTATION_COUNT_IN_DAO_METHOD$1": "androidx/persistence/room/processor/ProcessorErrors$INVALID_ANNOTATION_COUNT_IN_DAO_METHOD$1",
+      "android/arch/persistence/room/processor/ProcessorErrors$CANNOT_USE_MORE_THAN_ONE_POJO_FIELD_ANNOTATION$1": "androidx/persistence/room/processor/ProcessorErrors$CANNOT_USE_MORE_THAN_ONE_POJO_FIELD_ANNOTATION$1",
+      "android/arch/persistence/room/Query": "androidx/persistence/room/Query",
+      "android/arch/persistence/room/Insert": "androidx/persistence/room/Insert",
+      "android/arch/persistence/room/Delete": "androidx/persistence/room/Delete",
+      "android/arch/persistence/room/Update": "androidx/persistence/room/Update",
+      "android/arch/persistence/room/RawQuery": "androidx/persistence/room/RawQuery",
+      "android/arch/persistence/room/processor/DaoProcessor": "androidx/persistence/room/processor/DaoProcessor",
+      "android/arch/persistence/room/processor/DaoProcessor$Companion": "androidx/persistence/room/processor/DaoProcessor$Companion",
+      "android/arch/persistence/room/processor/PojoProcessor$Companion": "androidx/persistence/room/processor/PojoProcessor$Companion",
+      "android/arch/persistence/room/processor/InsertionMethodProcessor$getInsertionType$2": "androidx/persistence/room/processor/InsertionMethodProcessor$getInsertionType$2",
+      "android/arch/persistence/room/processor/InsertionMethodProcessor": "androidx/persistence/room/processor/InsertionMethodProcessor",
+      "android/arch/persistence/room/vo/InsertionMethod$Type": "androidx/persistence/room/vo/InsertionMethod$Type",
+      "android/arch/persistence/room/processor/InsertionMethodProcessor$getInsertionType$1": "androidx/persistence/room/processor/InsertionMethodProcessor$getInsertionType$1",
+      "android/arch/persistence/room/processor/QueryMethodProcessor$WhenMappings": "androidx/persistence/room/processor/QueryMethodProcessor$WhenMappings",
+      "android/arch/persistence/room/processor/PojoProcessor$assignGetter$success$1": "androidx/persistence/room/processor/PojoProcessor$assignGetter$success$1",
+      "android/arch/persistence/room/processor/EntityProcessor$Companion$INDEX_VISITOR$1": "androidx/persistence/room/processor/EntityProcessor$Companion$INDEX_VISITOR$1",
+      "android/arch/persistence/room/processor/EntityProcessor$IndexInput": "androidx/persistence/room/processor/EntityProcessor$IndexInput",
+      "android/arch/persistence/room/processor/EntityProcessor$Companion": "androidx/persistence/room/processor/EntityProcessor$Companion",
+      "android/arch/persistence/room/processor/EntityProcessor$checkIndicesForForeignKeys$1": "androidx/persistence/room/processor/EntityProcessor$checkIndicesForForeignKeys$1",
+      "android/arch/persistence/room/vo/PrimaryKey": "androidx/persistence/room/vo/PrimaryKey",
+      "android/arch/persistence/room/processor/DatabaseProcessor$validateUniqueDaoClasses$check$1": "androidx/persistence/room/processor/DatabaseProcessor$validateUniqueDaoClasses$check$1",
+      "android/arch/persistence/room/processor/cache/Cache$FullKey": "androidx/persistence/room/processor/cache/Cache$FullKey",
+      "android/arch/persistence/room/processor/cache/Cache": "androidx/persistence/room/processor/cache/Cache",
+      "android/arch/persistence/room/processor/cache/Cache$PojoKey": "androidx/persistence/room/processor/cache/Cache$PojoKey",
+      "android/arch/persistence/room/processor/cache/Cache$Bucket": "androidx/persistence/room/processor/cache/Cache$Bucket",
+      "android/arch/persistence/room/processor/cache/Cache$EntityKey": "androidx/persistence/room/processor/cache/Cache$EntityKey",
+      "android/arch/persistence/room/processor/CustomConverterProcessor$ProcessResult": "androidx/persistence/room/processor/CustomConverterProcessor$ProcessResult",
+      "android/arch/persistence/room/processor/CustomConverterProcessor$ProcessResult$EMPTY": "androidx/persistence/room/processor/CustomConverterProcessor$ProcessResult$EMPTY",
+      "android/arch/persistence/room/processor/CustomConverterProcessor": "androidx/persistence/room/processor/CustomConverterProcessor",
+      "android/arch/persistence/room/processor/InsertionMethodProcessor$getInsertionType$3": "androidx/persistence/room/processor/InsertionMethodProcessor$getInsertionType$3",
+      "android/arch/persistence/room/processor/Context$ProcessorOptions": "androidx/persistence/room/processor/Context$ProcessorOptions",
+      "android/arch/persistence/room/processor/Context$Companion": "androidx/persistence/room/processor/Context$Companion",
+      "android/arch/persistence/room/processor/DatabaseProcessor$baseClassElement$2": "androidx/persistence/room/processor/DatabaseProcessor$baseClassElement$2",
+      "android/arch/persistence/room/verifier/DatabaseVerifier": "androidx/persistence/room/verifier/DatabaseVerifier",
+      "android/arch/persistence/room/SkipQueryVerification": "androidx/persistence/room/SkipQueryVerification",
+      "android/arch/persistence/room/verifier/DatabaseVerifier$Companion": "androidx/persistence/room/verifier/DatabaseVerifier$Companion",
+      "android/arch/persistence/room/vo/ForeignKey": "androidx/persistence/room/vo/ForeignKey",
+      "android/arch/persistence/room/vo/Index": "androidx/persistence/room/vo/Index",
+      "android/arch/persistence/room/vo/ShortcutMethod": "androidx/persistence/room/vo/ShortcutMethod",
+      "android/arch/persistence/room/vo/InsertionMethod": "androidx/persistence/room/vo/InsertionMethod",
+      "android/arch/persistence/room/processor/ShortcutParameterProcessor$extractEntityType$2": "androidx/persistence/room/processor/ShortcutParameterProcessor$extractEntityType$2",
+      "android/arch/persistence/room/processor/ShortcutParameterProcessor": "androidx/persistence/room/processor/ShortcutParameterProcessor",
+      "android/arch/persistence/room/processor/PojoProcessor$assignSetter$success$2": "androidx/persistence/room/processor/PojoProcessor$assignSetter$success$2",
+      "android/arch/persistence/room/vo/Constructor": "androidx/persistence/room/vo/Constructor",
+      "android/arch/persistence/room/vo/FieldSetter": "androidx/persistence/room/vo/FieldSetter",
+      "android/arch/persistence/room/vo/CallType": "androidx/persistence/room/vo/CallType",
+      "android/arch/persistence/room/processor/PojoProcessor$assignSetter$success$1": "androidx/persistence/room/processor/PojoProcessor$assignSetter$success$1",
+      "android/arch/persistence/room/processor/PojoProcessor$chooseConstructor$failureMsg$1$paramsMatching$1": "androidx/persistence/room/processor/PojoProcessor$chooseConstructor$failureMsg$1$paramsMatching$1",
+      "android/arch/persistence/room/processor/PojoProcessor$chooseConstructor$failureMsg$1": "androidx/persistence/room/processor/PojoProcessor$chooseConstructor$failureMsg$1",
+      "android/arch/persistence/room/vo/Constructor$Param": "androidx/persistence/room/vo/Constructor$Param",
+      "android/arch/persistence/room/processor/PojoProcessor$assignGetter$success$2": "androidx/persistence/room/processor/PojoProcessor$assignGetter$success$2",
+      "android/arch/persistence/room/vo/FieldGetter": "androidx/persistence/room/vo/FieldGetter",
+      "android/arch/persistence/room/processor/PojoProcessor$process$1": "androidx/persistence/room/processor/PojoProcessor$process$1",
+      "android/arch/persistence/room/processor/EntityProcessor$Companion$FOREIGN_KEY_VISITOR$1": "androidx/persistence/room/processor/EntityProcessor$Companion$FOREIGN_KEY_VISITOR$1",
+      "android/arch/persistence/room/processor/EntityProcessor$ForeignKeyInput": "androidx/persistence/room/processor/EntityProcessor$ForeignKeyInput",
+      "android/arch/persistence/room/vo/ForeignKeyAction": "androidx/persistence/room/vo/ForeignKeyAction",
+      "android/arch/persistence/room/vo/ForeignKeyAction$Companion": "androidx/persistence/room/vo/ForeignKeyAction$Companion",
+      "android/arch/persistence/room/processor/InsertionMethodProcessor$Companion": "androidx/persistence/room/processor/InsertionMethodProcessor$Companion",
+      "android/arch/persistence/room/vo/ShortcutQueryParameter": "androidx/persistence/room/vo/ShortcutQueryParameter",
+      "android/arch/persistence/room/processor/RawQueryMethodProcessor": "androidx/persistence/room/processor/RawQueryMethodProcessor",
+      "android/arch/persistence/room/vo/RawQueryMethod": "androidx/persistence/room/vo/RawQueryMethod",
+      "android/arch/persistence/room/vo/RawQueryMethod$RuntimeQueryParameter": "androidx/persistence/room/vo/RawQueryMethod$RuntimeQueryParameter",
+      "android/arch/persistence/room/Transaction": "androidx/persistence/room/Transaction",
+      "android/arch/persistence/room/processor/Context$CommonTypes$STRING$2": "androidx/persistence/room/processor/Context$CommonTypes$STRING$2",
+      "android/arch/persistence/room/processor/Context$CommonTypes": "androidx/persistence/room/processor/Context$CommonTypes",
+      "android/arch/persistence/room/processor/PojoProcessor$assignGetter$success$3": "androidx/persistence/room/processor/PojoProcessor$assignGetter$success$3",
+      "android/arch/persistence/room/processor/PojoProcessor$assignGetter$success$4": "androidx/persistence/room/processor/PojoProcessor$assignGetter$success$4",
+      "android/arch/persistence/room/processor/PojoProcessor$assignSetter$success$3": "androidx/persistence/room/processor/PojoProcessor$assignSetter$success$3",
+      "android/arch/persistence/room/processor/PojoProcessor$assignSetter$success$4": "androidx/persistence/room/processor/PojoProcessor$assignSetter$success$4",
+      "android/arch/persistence/room/Ignore": "androidx/persistence/room/Ignore",
+      "android/arch/persistence/room/ColumnInfo": "androidx/persistence/room/ColumnInfo",
+      "android/arch/persistence/room/Embedded": "androidx/persistence/room/Embedded",
+      "android/arch/persistence/room/Relation": "androidx/persistence/room/Relation",
+      "android/arch/persistence/room/processor/FieldProcessor": "androidx/persistence/room/processor/FieldProcessor",
+      "android/arch/persistence/room/vo/Relation": "androidx/persistence/room/vo/Relation",
+      "android/arch/persistence/room/processor/PojoProcessor$chooseConstructor$$inlined$map$lambda$1": "androidx/persistence/room/processor/PojoProcessor$chooseConstructor$$inlined$map$lambda$1",
+      "android/arch/persistence/room/vo/Constructor$FieldParam": "androidx/persistence/room/vo/Constructor$FieldParam",
+      "android/arch/persistence/room/vo/Constructor$EmbeddedParam": "androidx/persistence/room/vo/Constructor$EmbeddedParam",
+      "android/arch/persistence/room/processor/EntityProcessor$Companion$FOREIGN_KEY_LIST_VISITOR$1": "androidx/persistence/room/processor/EntityProcessor$Companion$FOREIGN_KEY_LIST_VISITOR$1",
+      "android/arch/persistence/room/processor/Context$typeAdapterStore$2": "androidx/persistence/room/processor/Context$typeAdapterStore$2",
+      "android/arch/persistence/room/processor/FieldProcessor$WhenMappings": "androidx/persistence/room/processor/FieldProcessor$WhenMappings",
+      "android/arch/persistence/room/processor/ShortcutMethodProcessor": "androidx/persistence/room/processor/ShortcutMethodProcessor",
+      "android/arch/persistence/room/processor/InsertionMethodProcessor$Companion$SINGLE_ITEM_SET$2": "androidx/persistence/room/processor/InsertionMethodProcessor$Companion$SINGLE_ITEM_SET$2",
+      "android/arch/persistence/room/processor/CustomConverterProcessor$Companion": "androidx/persistence/room/processor/CustomConverterProcessor$Companion",
+      "android/arch/persistence/room/TypeConverter": "androidx/persistence/room/TypeConverter",
+      "android/arch/persistence/room/processor/Context$schemaOutFolder$2": "androidx/persistence/room/processor/Context$schemaOutFolder$2",
+      "android/arch/persistence/room/processor/Context$Companion$ARG_OPTIONS$2": "androidx/persistence/room/processor/Context$Companion$ARG_OPTIONS$2",
+      "android/arch/persistence/room/log/RLog$Messager": "androidx/persistence/room/log/RLog$Messager",
+      "android/arch/persistence/room/processor/SuppressWarningProcessor": "androidx/persistence/room/processor/SuppressWarningProcessor",
+      "android/arch/persistence/room/log/RLog$ProcessingEnvMessager": "androidx/persistence/room/log/RLog$ProcessingEnvMessager",
+      "android/arch/persistence/room/processor/InsertionMethodProcessor$Companion$MULTIPLE_ITEM_SET$2": "androidx/persistence/room/processor/InsertionMethodProcessor$Companion$MULTIPLE_ITEM_SET$2",
+      "android/arch/persistence/room/processor/EntityProcessor$process$1": "androidx/persistence/room/processor/EntityProcessor$process$1",
+      "android/arch/persistence/room/processor/DeletionMethodProcessor": "androidx/persistence/room/processor/DeletionMethodProcessor",
+      "android/arch/persistence/room/vo/DeletionMethod": "androidx/persistence/room/vo/DeletionMethod",
+      "android/arch/persistence/room/processor/SuppressWarningProcessor$VISITOR": "androidx/persistence/room/processor/SuppressWarningProcessor$VISITOR",
+      "android/arch/persistence/room/vo/Warning$Companion": "androidx/persistence/room/vo/Warning$Companion",
+      "android/arch/persistence/room/processor/EntityProcessor$Companion$INDEX_LIST_VISITOR$1": "androidx/persistence/room/processor/EntityProcessor$Companion$INDEX_LIST_VISITOR$1",
+      "android/arch/persistence/room/PrimaryKey": "androidx/persistence/room/PrimaryKey",
+      "android/arch/persistence/room/vo/PrimaryKey$Companion": "androidx/persistence/room/vo/PrimaryKey$Companion",
+      "android/arch/persistence/room/processor/QueryParameterProcessor": "androidx/persistence/room/processor/QueryParameterProcessor",
+      "android/arch/persistence/room/vo/QueryParameter": "androidx/persistence/room/vo/QueryParameter",
+      "android/arch/persistence/room/processor/OnConflictProcessor": "androidx/persistence/room/processor/OnConflictProcessor",
+      "android/arch/persistence/room/processor/QueryMethodProcessor": "androidx/persistence/room/processor/QueryMethodProcessor",
+      "android/arch/persistence/room/vo/QueryMethod": "androidx/persistence/room/vo/QueryMethod",
+      "android/arch/persistence/room/processor/UpdateMethodProcessor": "androidx/persistence/room/processor/UpdateMethodProcessor",
+      "android/arch/persistence/room/vo/UpdateMethod": "androidx/persistence/room/vo/UpdateMethod",
+      "android/arch/persistence/room/verifier/DatabaseVerificaitonErrors": "androidx/persistence/room/verifier/DatabaseVerificaitonErrors",
+      "android/arch/persistence/room/processor/ShortcutParameterProcessor$extractEntityType$1": "androidx/persistence/room/processor/ShortcutParameterProcessor$extractEntityType$1",
+      "android/arch/persistence/room/processor/InsertionMethodProcessor$Companion$VOID_SET$2": "androidx/persistence/room/processor/InsertionMethodProcessor$Companion$VOID_SET$2",
+      "android/arch/persistence/room/TypeConverters": "androidx/persistence/room/TypeConverters",
+      "android/arch/persistence/room/writer/DaoWriter$createUpdateMethods$1": "androidx/persistence/room/writer/DaoWriter$createUpdateMethods$1",
+      "android/arch/persistence/room/writer/EntityUpdateAdapterWriter": "androidx/persistence/room/writer/EntityUpdateAdapterWriter",
+      "android/arch/persistence/room/writer/FieldReadWriteWriter$Companion$bindToStatement$1": "androidx/persistence/room/writer/FieldReadWriteWriter$Companion$bindToStatement$1",
+      "android/arch/persistence/room/writer/FieldReadWriteWriter$Node": "androidx/persistence/room/writer/FieldReadWriteWriter$Node",
+      "android/arch/persistence/room/writer/FieldReadWriteWriter$Companion$bindToStatement$1$1": "androidx/persistence/room/writer/FieldReadWriteWriter$Companion$bindToStatement$1$1",
+      "android/arch/persistence/room/writer/DaoWriter$PreparedStmtQuery$Companion": "androidx/persistence/room/writer/DaoWriter$PreparedStmtQuery$Companion",
+      "android/arch/persistence/room/writer/DaoWriter$PreparedStmtQuery": "androidx/persistence/room/writer/DaoWriter$PreparedStmtQuery",
+      "android/arch/persistence/room/writer/FieldReadWriteWriter$Companion$getAllParents$1": "androidx/persistence/room/writer/FieldReadWriteWriter$Companion$getAllParents$1",
+      "android/arch/persistence/room/writer/TableInfoValidationWriter$write$1$3$columnNames$1": "androidx/persistence/room/writer/TableInfoValidationWriter$write$1$3$columnNames$1",
+      "android/arch/persistence/room/writer/TableInfoValidationWriter": "androidx/persistence/room/writer/TableInfoValidationWriter",
+      "android/arch/persistence/room/writer/DaoWriter$InsertionMethodField": "androidx/persistence/room/writer/DaoWriter$InsertionMethodField",
+      "android/arch/persistence/room/writer/EntityInsertionAdapterWriter": "androidx/persistence/room/writer/EntityInsertionAdapterWriter",
+      "android/arch/persistence/room/writer/EntityInsertionAdapterWriter$createAnonymous$1$1$query$1": "androidx/persistence/room/writer/EntityInsertionAdapterWriter$createAnonymous$1$1$query$1",
+      "android/arch/persistence/room/writer/EntityInsertionAdapterWriter$createAnonymous$$inlined$apply$lambda$1": "androidx/persistence/room/writer/EntityInsertionAdapterWriter$createAnonymous$$inlined$apply$lambda$1",
+      "android/arch/persistence/room/vo/FieldWithIndex$Companion": "androidx/persistence/room/vo/FieldWithIndex$Companion",
+      "android/arch/persistence/room/writer/FieldReadWriteWriter$readFromCursor$1": "androidx/persistence/room/writer/FieldReadWriteWriter$readFromCursor$1",
+      "android/arch/persistence/room/writer/FieldReadWriteWriter$WhenMappings": "androidx/persistence/room/writer/FieldReadWriteWriter$WhenMappings",
+      "android/arch/persistence/room/writer/RelationCollectorMethodWriter$Companion": "androidx/persistence/room/writer/RelationCollectorMethodWriter$Companion",
+      "android/arch/persistence/room/writer/RelationCollectorMethodWriter": "androidx/persistence/room/writer/RelationCollectorMethodWriter",
+      "android/arch/persistence/room/writer/RelationCollectorMethodWriter$prepare$$inlined$apply$lambda$1": "androidx/persistence/room/writer/RelationCollectorMethodWriter$prepare$$inlined$apply$lambda$1",
+      "android/arch/persistence/room/writer/FieldReadWriteWriter$Companion$readFromCursor$1$allNullCheck$1": "androidx/persistence/room/writer/FieldReadWriteWriter$Companion$readFromCursor$1$allNullCheck$1",
+      "android/arch/persistence/room/writer/FieldReadWriteWriter$Companion$readFromCursor$1": "androidx/persistence/room/writer/FieldReadWriteWriter$Companion$readFromCursor$1",
+      "android/arch/persistence/room/writer/SQLiteOpenHelperWriter": "androidx/persistence/room/writer/SQLiteOpenHelperWriter",
+      "android/arch/persistence/room/writer/PreparedStatementWriter": "androidx/persistence/room/writer/PreparedStatementWriter",
+      "android/arch/persistence/room/writer/QueryWriter": "androidx/persistence/room/writer/QueryWriter",
+      "android/arch/persistence/room/writer/FieldReadWriteWriter$Companion$construct$args$1": "androidx/persistence/room/writer/FieldReadWriteWriter$Companion$construct$args$1",
+      "android/arch/persistence/room/writer/DaoWriter$PreparedStatementField": "androidx/persistence/room/writer/DaoWriter$PreparedStatementField",
+      "android/arch/persistence/room/writer/QueryWriter$createSqlQueryAndArgs$1$2": "androidx/persistence/room/writer/QueryWriter$createSqlQueryAndArgs$1$2",
+      "android/arch/persistence/room/writer/QueryWriter$WhenMappings": "androidx/persistence/room/writer/QueryWriter$WhenMappings",
+      "android/arch/persistence/room/writer/QueryWriter$bindArgs$1$1$1": "androidx/persistence/room/writer/QueryWriter$bindArgs$1$1$1",
+      "android/arch/persistence/room/writer/DaoWriter$DeleteOrUpdateAdapterField": "androidx/persistence/room/writer/DaoWriter$DeleteOrUpdateAdapterField",
+      "android/arch/persistence/room/writer/DaoWriter$createDeletionMethods$1": "androidx/persistence/room/writer/DaoWriter$createDeletionMethods$1",
+      "android/arch/persistence/room/writer/EntityDeletionAdapterWriter": "androidx/persistence/room/writer/EntityDeletionAdapterWriter",
+      "android/arch/persistence/room/writer/EntityUpdateAdapterWriter$createAnonymous$1$1$query$1": "androidx/persistence/room/writer/EntityUpdateAdapterWriter$createAnonymous$1$1$query$1",
+      "android/arch/persistence/room/writer/EntityDeletionAdapterWriter$createAnonymous$1$1$query$1": "androidx/persistence/room/writer/EntityDeletionAdapterWriter$createAnonymous$1$1$query$1",
+      "android/arch/persistence/room/writer/TableInfoValidationWriter$write$1$2$myColumnNames$1": "androidx/persistence/room/writer/TableInfoValidationWriter$write$1$2$myColumnNames$1",
+      "android/arch/persistence/room/writer/TableInfoValidationWriter$write$1$2$refColumnNames$1": "androidx/persistence/room/writer/TableInfoValidationWriter$write$1$2$refColumnNames$1",
+      "android/arch/persistence/room/writer/FieldReadWriteWriter$Companion$readFromCursor$1$1": "androidx/persistence/room/writer/FieldReadWriteWriter$Companion$readFromCursor$1$1",
+      "android/arch/persistence/room/writer/EntityUpdateAdapterWriter$createAnonymous$1$1$query$2": "androidx/persistence/room/writer/EntityUpdateAdapterWriter$createAnonymous$1$1$query$2",
+      "android/arch/persistence/room/writer/DatabaseWriter$createCreateInvalidationTracker$1$tableNames$1": "androidx/persistence/room/writer/DatabaseWriter$createCreateInvalidationTracker$1$tableNames$1",
+      "android/arch/persistence/room/log/RLog$Messager$DefaultImpls": "androidx/persistence/room/log/RLog$Messager$DefaultImpls",
+      "android/arch/persistence/room/vo/RawQueryMethod$returnsValue$2": "androidx/persistence/room/vo/RawQueryMethod$returnsValue$2",
+      "android/arch/persistence/room/vo/Database$typeName$2": "androidx/persistence/room/vo/Database$typeName$2",
+      "android/arch/persistence/room/vo/Database$implClassName$2": "androidx/persistence/room/vo/Database$implClassName$2",
+      "android/arch/persistence/room/vo/Database$implTypeName$2": "androidx/persistence/room/vo/Database$implTypeName$2",
+      "android/arch/persistence/room/vo/Database$bundle$2": "androidx/persistence/room/vo/Database$bundle$2",
+      "android/arch/persistence/room/vo/Database$identityHash$2": "androidx/persistence/room/vo/Database$identityHash$2",
+      "android/arch/persistence/room/vo/Database$legacyIdentityHash$2": "androidx/persistence/room/vo/Database$legacyIdentityHash$2",
+      "android/arch/persistence/room/vo/FieldGetter$WhenMappings": "androidx/persistence/room/vo/FieldGetter$WhenMappings",
+      "android/arch/persistence/room/vo/ForeignKey$getIdKey$1": "androidx/persistence/room/vo/ForeignKey$getIdKey$1",
+      "android/arch/persistence/room/vo/HasSchemaIdentity": "androidx/persistence/room/vo/HasSchemaIdentity",
+      "android/arch/persistence/room/vo/PrimaryKey$toHumanReadableString$1": "androidx/persistence/room/vo/PrimaryKey$toHumanReadableString$1",
+      "android/arch/persistence/room/vo/PrimaryKey$columnNames$2": "androidx/persistence/room/vo/PrimaryKey$columnNames$2",
+      "android/arch/persistence/room/vo/Field$setterNameWithVariations$2": "androidx/persistence/room/vo/Field$setterNameWithVariations$2",
+      "android/arch/persistence/room/vo/EmbeddedField$setter$2": "androidx/persistence/room/vo/EmbeddedField$setter$2",
+      "android/arch/persistence/room/vo/CustomTypeConverter$typeName$2": "androidx/persistence/room/vo/CustomTypeConverter$typeName$2",
+      "android/arch/persistence/room/vo/ForeignKey$joinEscaped$1": "androidx/persistence/room/vo/ForeignKey$joinEscaped$1",
+      "android/arch/persistence/room/vo/QueryMethod$sectionToParamMapping$2": "androidx/persistence/room/vo/QueryMethod$sectionToParamMapping$2",
+      "android/arch/persistence/room/vo/QueryMethod$returnsValue$2": "androidx/persistence/room/vo/QueryMethod$returnsValue$2",
+      "android/arch/persistence/room/vo/Constructor$ParamType": "androidx/persistence/room/vo/Constructor$ParamType",
+      "android/arch/persistence/room/vo/Relation$pojoTypeName$2": "androidx/persistence/room/vo/Relation$pojoTypeName$2",
+      "android/arch/persistence/room/vo/Field$typeName$2": "androidx/persistence/room/vo/Field$typeName$2",
+      "android/arch/persistence/room/vo/RelationCollector$Companion$createCollectors$1$1": "androidx/persistence/room/vo/RelationCollector$Companion$createCollectors$1$1",
+      "android/arch/persistence/room/vo/Dao$implTypeName$2": "androidx/persistence/room/vo/Dao$implTypeName$2",
+      "android/arch/persistence/room/vo/Field$pathWithDotNotation$2": "androidx/persistence/room/vo/Field$pathWithDotNotation$2",
+      "android/arch/persistence/room/vo/Dao$shortcutMethods$2": "androidx/persistence/room/vo/Dao$shortcutMethods$2",
+      "android/arch/persistence/room/vo/RelationCollector$WhenMappings": "androidx/persistence/room/vo/RelationCollector$WhenMappings",
+      "android/arch/persistence/room/vo/Field$getterNameWithVariations$2": "androidx/persistence/room/vo/Field$getterNameWithVariations$2",
+      "android/arch/persistence/room/vo/Dao$implClassName$2": "androidx/persistence/room/vo/Dao$implClassName$2",
+      "android/arch/persistence/room/vo/SchemaIdentityKey$Companion$ENGLISH_SORT$1": "androidx/persistence/room/vo/SchemaIdentityKey$Companion$ENGLISH_SORT$1",
+      "android/arch/persistence/room/vo/SchemaIdentityKey": "androidx/persistence/room/vo/SchemaIdentityKey",
+      "android/arch/persistence/room/vo/EmbeddedField$getter$2": "androidx/persistence/room/vo/EmbeddedField$getter$2",
+      "android/arch/persistence/room/vo/EmbeddedField$mRootParent$2": "androidx/persistence/room/vo/EmbeddedField$mRootParent$2",
+      "android/arch/persistence/room/vo/CustomTypeConverter$methodName$2": "androidx/persistence/room/vo/CustomTypeConverter$methodName$2",
+      "android/arch/persistence/room/vo/Pojo$typeName$2": "androidx/persistence/room/vo/Pojo$typeName$2",
+      "android/arch/persistence/room/vo/CustomTypeConverter$isStatic$2": "androidx/persistence/room/vo/CustomTypeConverter$isStatic$2",
+      "android/arch/persistence/room/vo/SchemaIdentityKey$Companion": "androidx/persistence/room/vo/SchemaIdentityKey$Companion",
+      "android/arch/persistence/room/vo/FieldSetter$WhenMappings": "androidx/persistence/room/vo/FieldSetter$WhenMappings",
+      "android/arch/persistence/room/vo/Entity$createTableQuery$2": "androidx/persistence/room/vo/Entity$createTableQuery$2",
+      "android/arch/persistence/room/vo/RelationCollector$Companion$WhenMappings": "androidx/persistence/room/vo/RelationCollector$Companion$WhenMappings",
+      "android/arch/persistence/room/vo/ForeignKeyAction$Companion$mapping$2": "androidx/persistence/room/vo/ForeignKeyAction$Companion$mapping$2",
+      "android/arch/persistence/room/vo/Index$Companion": "androidx/persistence/room/vo/Index$Companion",
+      "android/arch/persistence/room/RoomMasterTable": "androidx/persistence/room/RoomMasterTable",
+      "android/arch/persistence/room/vo/RelationCollector$writeReadParentKeyCode$$inlined$apply$lambda$1": "androidx/persistence/room/vo/RelationCollector$writeReadParentKeyCode$$inlined$apply$lambda$1",
+      "android/arch/persistence/room/vo/Dao$typeName$2": "androidx/persistence/room/vo/Dao$typeName$2",
+      "android/arch/persistence/room/vo/Field$nameWithVariations$2": "androidx/persistence/room/vo/Field$nameWithVariations$2",
+      "android/arch/persistence/room/vo/Database$legacyIdentityHash$2$$special$$inlined$sortedBy$1": "androidx/persistence/room/vo/Database$legacyIdentityHash$2$$special$$inlined$sortedBy$1",
+      "android/arch/persistence/room/vo/Index$createQuery$2": "androidx/persistence/room/vo/Index$createQuery$2",
+      "android/arch/persistence/room/vo/CustomTypeConverter$fromTypeName$2": "androidx/persistence/room/vo/CustomTypeConverter$fromTypeName$2",
+      "android/arch/persistence/room/vo/Index$getIdKey$1": "androidx/persistence/room/vo/Index$getIdKey$1",
+      "android/arch/persistence/room/vo/Index$columnNames$2": "androidx/persistence/room/vo/Index$columnNames$2",
+      "android/arch/persistence/room/vo/CustomTypeConverter$toTypeName$2": "androidx/persistence/room/vo/CustomTypeConverter$toTypeName$2",
       "android/support/animation/AnimationHandler$AnimationCallbackDispatcher": "androidx/animation/AnimationHandler$AnimationCallbackDispatcher",
-      "android/support/v7/widget/ResourcesWrapper": "androidx/widget/ResourcesWrapper",
-      "android/support/v17/leanback/widget/BrowseFrameLayout$OnChildFocusListener": "androidx/leanback/widget/BrowseFrameLayout$OnChildFocusListener",
-      "android/support/v7/widget/AppCompatEditText": "androidx/widget/AppCompatEditText",
-      "android/support/media/tv/TvContractCompat$WatchNextPrograms": "androidx/media/tv/TvContractCompat$WatchNextPrograms",
-      "android/support/v4/widget/ListPopupWindowCompat": "androidx/widget/ListPopupWindowCompat",
-      "android/support/v7/preference/PreferenceFragmentCompat$OnPreferenceDisplayDialogCallback": "androidx/preference/PreferenceFragmentCompat$OnPreferenceDisplayDialogCallback",
-      "android/support/v7/util/DiffUtil$PostponedUpdate": "androidx/util/DiffUtil$PostponedUpdate",
-      "android/support/transition/TransitionManager$MultiListener": "androidx/transition/TransitionManager$MultiListener",
-      "android/support/v4/view/ViewPropertyAnimatorCompat$ViewPropertyAnimatorListenerApi14": "androidx/view/ViewPropertyAnimatorCompat$ViewPropertyAnimatorListenerApi14",
-      "android/support/v17/leanback/widget/ViewsStateBundle": "androidx/leanback/widget/ViewsStateBundle",
-      "android/support/v4/provider/FontsContractCompat$TypefaceResult": "androidx/provider/FontsContractCompat$TypefaceResult",
-      "android/support/v4/widget/DrawerLayout$State": "androidx/widget/DrawerLayout$State",
-      "android/support/v4/widget/SwipeRefreshLayout$OnRefreshListener": "androidx/widget/SwipeRefreshLayout$OnRefreshListener",
-      "android/support/media/ExifInterface$Rational": "androidx/media/ExifInterface$Rational",
-      "android/support/v4/view/ViewPager$PagerObserver": "androidx/view/ViewPager$PagerObserver",
-      "android/support/design/widget/StateListAnimator": "androidx/design/widget/StateListAnimator",
-      "android/support/v4/media/MediaBrowserCompat$CallbackHandler": "androidx/media/MediaBrowserCompat$CallbackHandler",
-      "android/support/customtabs/CustomTabsClient": "androidx/browser/customtabs/CustomTabsClient",
-      "android/support/v4/media/MediaBrowserServiceCompatApi26$ServiceCompatProxy": "androidx/media/MediaBrowserServiceCompatApi26$ServiceCompatProxy",
-      "android/support/transition/Slide$CalculateSlideHorizontal": "androidx/transition/Slide$CalculateSlideHorizontal",
-      "android/support/v17/leanback/media/PlaybackBannerControlGlue$SPEED": "androidx/leanback/media/PlaybackBannerControlGlue$SPEED",
-      "android/support/annotation/CallSuper": "androidx/annotation/CallSuper",
-      "android/support/design/widget/Snackbar$Callback": "androidx/design/widget/Snackbar$Callback",
-      "android/support/v4/app/ActivityManagerCompat": "androidx/app/ActivityManagerCompat",
-      "android/support/v17/leanback/widget/RoundedRectHelperApi21": "androidx/leanback/widget/RoundedRectHelperApi21",
-      "android/support/v7/graphics/Palette": "androidx/graphics/palette/Palette",
-      "android/support/wear/R$color": "androidx/wear/R$color",
-      "android/support/v17/leanback/widget/ItemBridgeAdapter$OnFocusChangeListener": "androidx/leanback/widget/ItemBridgeAdapter$OnFocusChangeListener",
-      "android/support/v7/media/MediaRouteProviderService$ProviderCallback": "androidx/media/MediaRouteProviderService$ProviderCallback",
-      "android/support/media/ExifInterface": "androidx/media/ExifInterface",
-      "android/support/v4/app/FragmentManagerImpl": "androidx/app/FragmentManagerImpl",
-      "android/support/v13/app/FragmentTabHost$DummyTabFactory": "androidx/app/legacy/FragmentTabHost$DummyTabFactory",
-      "android/support/app/recommendation/ContentRecommendation$Builder": "androidx/app/recommendation/ContentRecommendation$Builder",
-      "android/support/v17/leanback/widget/RowHeaderView": "androidx/leanback/widget/RowHeaderView",
-      "android/support/v4/widget/DrawerLayout$EdgeGravity": "androidx/widget/DrawerLayout$EdgeGravity",
-      "android/support/v7/view/menu/MenuWrapperICS": "androidx/view/menu/MenuWrapperICS",
-      "android/support/v7/widget/RoundRectDrawableWithShadow$RoundRectHelper": "androidx/widget/RoundRectDrawableWithShadow$RoundRectHelper",
-      "android/support/v4/media/session/MediaControllerCompat$Callback$MessageHandler": "androidx/media/session/MediaControllerCompat$Callback$MessageHandler",
-      "android/support/v4/text/ICUCompat": "androidx/text/ICUCompat",
-      "android/support/v17/leanback/widget/PlaybackSeekDataProvider$ResultCallback": "androidx/leanback/widget/PlaybackSeekDataProvider$ResultCallback",
-      "android/support/v7/widget/ViewUtils": "androidx/widget/ViewUtils",
-      "android/support/v7/appcompat/R$string": "androidx/appcompat/R$string",
-      "android/support/constraint/ConstraintLayout": "androidx/constraint/ConstraintLayout",
-      "android/support/v4/view/ViewPager$SimpleOnPageChangeListener": "androidx/view/ViewPager$SimpleOnPageChangeListener",
-      "android/support/wear/internal/widget/drawer/MultiPageUi": "androidx/wear/internal/widget/drawer/MultiPageUi",
-      "android/support/v17/leanback/media/PlayerAdapter$Callback": "androidx/leanback/media/PlayerAdapter$Callback",
-      "android/support/design/widget/BaseTransientBottomBar$ContentViewCallback": "androidx/design/widget/BaseTransientBottomBar$ContentViewCallback",
-      "android/support/annotation/RestrictTo$Scope": "androidx/annotation/RestrictTo$Scope",
-      "android/support/v4/content/AsyncTaskLoader": "androidx/content/AsyncTaskLoader",
-      "android/support/v17/leanback/widget/ParallaxEffect": "androidx/leanback/widget/ParallaxEffect",
-      "android/support/v17/leanback/app/BackgroundManager$DrawableWrapper": "androidx/leanback/app/BackgroundManager$DrawableWrapper",
-      "android/support/v4/app/ListFragment": "androidx/app/ListFragment",
-      "android/support/design/widget/DirectedAcyclicGraph": "androidx/widget/DirectedAcyclicGraph",
-      "android/support/design/widget/AppBarLayout": "androidx/design/widget/AppBarLayout",
-      "android/support/v7/media/RemoteControlClientCompat$JellybeanImpl": "androidx/media/RemoteControlClientCompat$JellybeanImpl",
-      "android/support/design/widget/ViewGroupUtils": "androidx/widget/ViewGroupUtils",
-      "android/support/design/R$styleable": "androidx/design/R$styleable",
+      "android/support/animation/AnimationHandler": "androidx/animation/AnimationHandler",
+      "android/support/animation/AnimationHandler$AnimationFrameCallbackProvider": "androidx/animation/AnimationHandler$AnimationFrameCallbackProvider",
+      "android/support/animation/AnimationHandler$AnimationFrameCallback": "androidx/animation/AnimationHandler$AnimationFrameCallback",
+      "android/support/animation/AnimationHandler$FrameCallbackProvider14$1": "androidx/animation/AnimationHandler$FrameCallbackProvider14$1",
+      "android/support/animation/AnimationHandler$FrameCallbackProvider14": "androidx/animation/AnimationHandler$FrameCallbackProvider14",
+      "android/support/animation/AnimationHandler$FrameCallbackProvider16$1": "androidx/animation/AnimationHandler$FrameCallbackProvider16$1",
+      "android/support/animation/AnimationHandler$FrameCallbackProvider16": "androidx/animation/AnimationHandler$FrameCallbackProvider16",
+      "android/support/animation/DynamicAnimation$1": "androidx/animation/DynamicAnimation$1",
+      "android/support/animation/DynamicAnimation$ViewProperty": "androidx/animation/DynamicAnimation$ViewProperty",
+      "android/support/animation/DynamicAnimation": "androidx/animation/DynamicAnimation",
+      "android/support/animation/DynamicAnimation$10": "androidx/animation/DynamicAnimation$10",
+      "android/support/animation/DynamicAnimation$11": "androidx/animation/DynamicAnimation$11",
+      "android/support/animation/DynamicAnimation$12": "androidx/animation/DynamicAnimation$12",
+      "android/support/animation/DynamicAnimation$13": "androidx/animation/DynamicAnimation$13",
+      "android/support/animation/DynamicAnimation$14": "androidx/animation/DynamicAnimation$14",
+      "android/support/animation/DynamicAnimation$15": "androidx/animation/DynamicAnimation$15",
+      "android/support/animation/FloatPropertyCompat": "androidx/animation/FloatPropertyCompat",
+      "android/support/animation/FloatValueHolder": "androidx/animation/FloatValueHolder",
+      "android/support/animation/DynamicAnimation$2": "androidx/animation/DynamicAnimation$2",
+      "android/support/animation/DynamicAnimation$3": "androidx/animation/DynamicAnimation$3",
+      "android/support/animation/DynamicAnimation$4": "androidx/animation/DynamicAnimation$4",
+      "android/support/animation/DynamicAnimation$5": "androidx/animation/DynamicAnimation$5",
+      "android/support/animation/DynamicAnimation$6": "androidx/animation/DynamicAnimation$6",
+      "android/support/animation/DynamicAnimation$7": "androidx/animation/DynamicAnimation$7",
+      "android/support/animation/DynamicAnimation$8": "androidx/animation/DynamicAnimation$8",
+      "android/support/animation/DynamicAnimation$9": "androidx/animation/DynamicAnimation$9",
+      "android/support/animation/DynamicAnimation$MassState": "androidx/animation/DynamicAnimation$MassState",
       "android/support/animation/DynamicAnimation$OnAnimationEndListener": "androidx/animation/DynamicAnimation$OnAnimationEndListener",
-      "android/support/media/tv/TvContractUtils": "androidx/media/tv/TvContractUtils",
-      "android/support/v4/app/JobIntentService$JobWorkEnqueuer": "androidx/app/JobIntentService$JobWorkEnqueuer",
-      "android/support/percent/PercentLayoutHelper$PercentLayoutParams": "androidx/PercentLayoutHelper$PercentLayoutParams",
-      "android/support/v4/util/Pair": "androidx/util/Pair",
-      "android/support/v17/leanback/transition/LeanbackTransitionHelperKitKat": "androidx/leanback/transition/LeanbackTransitionHelperKitKat",
-      "android/support/v13/view/DragStartHelper": "androidx/view/DragStartHelper",
-      "android/support/v7/widget/ListViewCompat": "androidx/widget/internal/ListViewCompat",
-      "android/support/v7/preference/CheckBoxPreference$Listener": "androidx/preference/CheckBoxPreference$Listener",
-      "android/support/v7/app/AppCompatDelegate$NightMode": "androidx/app/AppCompatDelegate$NightMode",
-      "android/support/v17/leanback/transition/SlideNoPropagation": "androidx/leanback/transition/SlideNoPropagation",
-      "android/support/v7/media/MediaRouteProviderService$ClientRecord": "androidx/media/MediaRouteProviderService$ClientRecord",
-      "android/support/graphics/drawable/VectorDrawableCompat$VectorDrawableCompatState": "androidx/graphics/drawable/VectorDrawableCompat$VectorDrawableCompatState",
+      "android/support/animation/DynamicAnimation$OnAnimationUpdateListener": "androidx/animation/DynamicAnimation$OnAnimationUpdateListener",
+      "android/support/animation/FlingAnimation$1": "androidx/animation/FlingAnimation$1",
+      "android/support/animation/FlingAnimation": "androidx/animation/FlingAnimation",
+      "android/support/animation/FlingAnimation$DragForce": "androidx/animation/FlingAnimation$DragForce",
+      "android/support/animation/Force": "androidx/animation/Force",
+      "android/support/animation/FloatPropertyCompat$1": "androidx/animation/FloatPropertyCompat$1",
+      "android/support/animation/SpringAnimation": "androidx/animation/SpringAnimation",
+      "android/support/animation/SpringForce": "androidx/animation/SpringForce",
+      "android/arch/persistence/room/EmptyResultSetException": "androidx/persistence/room/EmptyResultSetException",
+      "android/arch/persistence/room/RxRoom$1$1": "androidx/persistence/room/RxRoom$1$1",
+      "android/arch/persistence/room/InvalidationTracker$Observer": "androidx/persistence/room/InvalidationTracker$Observer",
+      "android/arch/persistence/room/RxRoom$1": "androidx/persistence/room/RxRoom$1",
+      "android/arch/persistence/room/InvalidationTracker": "androidx/persistence/room/InvalidationTracker",
+      "android/arch/persistence/room/RxRoom": "androidx/persistence/room/RxRoom",
+      "android/arch/persistence/room/RxRoom$1$2": "androidx/persistence/room/RxRoom$1$2",
+      "android/arch/persistence/room/RoomDatabase": "androidx/persistence/room/RoomDatabase",
+      "android/arch/persistence/room/RxRoom$2": "androidx/persistence/room/RxRoom$2",
+      "android/arch/persistence/room/RxRoom$Optional": "androidx/persistence/room/RxRoom$Optional",
+      "android/arch/persistence/room/RxRoom$3": "androidx/persistence/room/RxRoom$3",
+      "android/arch/persistence/room/RxRoom$4": "androidx/persistence/room/RxRoom$4",
+      "android/arch/persistence/room/RxRoom$5$1": "androidx/persistence/room/RxRoom$5$1",
+      "android/arch/persistence/room/RxRoom$5": "androidx/persistence/room/RxRoom$5",
+      "android/arch/persistence/room/RxRoom$DisposableRunnable": "androidx/persistence/room/RxRoom$DisposableRunnable",
+      "android/support/v4/app/AppLaunchChecker": "androidx/app/AppLaunchChecker",
+      "android/support/v4/app/FrameMetricsAggregator$1": "androidx/app/FrameMetricsAggregator$1",
+      "android/support/v4/app/FrameMetricsAggregator": "androidx/app/FrameMetricsAggregator",
+      "android/support/v4/app/FrameMetricsAggregator$FrameMetricsApi24Impl$1": "androidx/app/FrameMetricsAggregator$FrameMetricsApi24Impl$1",
+      "android/support/v4/app/FrameMetricsAggregator$FrameMetricsApi24Impl": "androidx/app/FrameMetricsAggregator$FrameMetricsApi24Impl",
+      "android/support/v4/app/FrameMetricsAggregator$FrameMetricsBaseImpl": "androidx/app/FrameMetricsAggregator$FrameMetricsBaseImpl",
+      "android/support/v4/app/FrameMetricsAggregator$MetricType": "androidx/app/FrameMetricsAggregator$MetricType",
+      "android/support/v4/app/TaskStackBuilder$TaskStackBuilderApi16Impl": "androidx/app/TaskStackBuilder$TaskStackBuilderApi16Impl",
+      "android/support/v4/app/TaskStackBuilder$TaskStackBuilderBaseImpl": "androidx/app/TaskStackBuilder$TaskStackBuilderBaseImpl",
+      "android/support/v4/content/AsyncTaskLoader$LoadTask": "androidx/content/AsyncTaskLoader$LoadTask",
+      "android/support/v4/content/ModernAsyncTask": "androidx/content/ModernAsyncTask",
+      "android/support/v4/content/AsyncTaskLoader": "androidx/content/AsyncTaskLoader",
+      "android/support/v4/content/CursorLoader": "androidx/content/CursorLoader",
+      "android/support/v4/content/Loader$ForceLoadContentObserver": "androidx/content/Loader$ForceLoadContentObserver",
+      "android/support/v4/content/FileProvider$PathStrategy": "androidx/content/FileProvider$PathStrategy",
+      "android/support/v4/content/FileProvider": "androidx/content/FileProvider",
+      "android/support/v4/content/FileProvider$SimplePathStrategy": "androidx/content/FileProvider$SimplePathStrategy",
+      "android/support/v4/content/LocalBroadcastManager$1": "androidx/content/LocalBroadcastManager$1",
+      "android/support/v4/content/LocalBroadcastManager": "androidx/content/LocalBroadcastManager",
+      "android/support/v4/content/LocalBroadcastManager$BroadcastRecord": "androidx/content/LocalBroadcastManager$BroadcastRecord",
+      "android/support/v4/content/LocalBroadcastManager$ReceiverRecord": "androidx/content/LocalBroadcastManager$ReceiverRecord",
+      "android/support/v4/content/MimeTypeFilter": "androidx/content/MimeTypeFilter",
+      "android/support/v4/content/ModernAsyncTask$1": "androidx/content/ModernAsyncTask$1",
+      "android/support/v4/content/ModernAsyncTask$2": "androidx/content/ModernAsyncTask$2",
+      "android/support/v4/content/ModernAsyncTask$WorkerRunnable": "androidx/content/ModernAsyncTask$WorkerRunnable",
+      "android/support/v4/content/ModernAsyncTask$3": "androidx/content/ModernAsyncTask$3",
+      "android/support/v4/content/ModernAsyncTask$4": "androidx/content/ModernAsyncTask$4",
+      "android/support/v4/content/ModernAsyncTask$Status": "androidx/content/ModernAsyncTask$Status",
+      "android/support/v4/content/ModernAsyncTask$AsyncTaskResult": "androidx/content/ModernAsyncTask$AsyncTaskResult",
+      "android/support/v4/content/ModernAsyncTask$InternalHandler": "androidx/content/ModernAsyncTask$InternalHandler",
+      "android/support/v4/content/PermissionChecker$PermissionResult": "androidx/content/PermissionChecker$PermissionResult",
+      "android/support/v4/content/WakefulBroadcastReceiver": "androidx/content/WakefulBroadcastReceiver",
+      "android/support/v4/graphics/drawable/RoundedBitmapDrawable": "androidx/graphics/drawable/RoundedBitmapDrawable",
+      "android/support/v4/graphics/drawable/RoundedBitmapDrawable21": "androidx/graphics/drawable/RoundedBitmapDrawable21",
+      "android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory$DefaultRoundedBitmapDrawable": "androidx/graphics/drawable/RoundedBitmapDrawableFactory$DefaultRoundedBitmapDrawable",
+      "android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory": "androidx/graphics/drawable/RoundedBitmapDrawableFactory",
+      "android/support/v4/print/PrintHelper$1": "androidx/print/PrintHelper$1",
+      "android/support/v4/print/PrintHelper": "androidx/print/PrintHelper",
+      "android/support/v4/print/PrintHelper$ColorMode": "androidx/print/PrintHelper$ColorMode",
+      "android/support/v4/print/PrintHelper$OnPrintFinishCallback": "androidx/print/PrintHelper$OnPrintFinishCallback",
+      "android/support/v4/print/PrintHelper$Orientation": "androidx/print/PrintHelper$Orientation",
+      "android/support/v4/print/PrintHelper$PrintHelperApi19$1": "androidx/print/PrintHelper$PrintHelperApi19$1",
+      "android/support/v4/print/PrintHelper$PrintHelperApi19": "androidx/print/PrintHelper$PrintHelperApi19",
+      "android/support/v4/print/PrintHelper$PrintHelperApi19$2": "androidx/print/PrintHelper$PrintHelperApi19$2",
+      "android/support/v4/print/PrintHelper$PrintHelperApi19$3$1$1": "androidx/print/PrintHelper$PrintHelperApi19$3$1$1",
+      "android/support/v4/print/PrintHelper$PrintHelperApi19$3$1": "androidx/print/PrintHelper$PrintHelperApi19$3$1",
+      "android/support/v4/print/PrintHelper$PrintHelperApi19$3": "androidx/print/PrintHelper$PrintHelperApi19$3",
+      "android/support/v4/print/PrintHelper$PrintHelperVersionImpl": "androidx/print/PrintHelper$PrintHelperVersionImpl",
+      "android/support/v4/print/PrintHelper$PrintHelperApi20": "androidx/print/PrintHelper$PrintHelperApi20",
+      "android/support/v4/print/PrintHelper$PrintHelperApi23": "androidx/print/PrintHelper$PrintHelperApi23",
+      "android/support/v4/print/PrintHelper$PrintHelperApi24": "androidx/print/PrintHelper$PrintHelperApi24",
+      "android/support/v4/print/PrintHelper$PrintHelperStub": "androidx/print/PrintHelper$PrintHelperStub",
+      "android/support/v4/print/PrintHelper$ScaleMode": "androidx/print/PrintHelper$ScaleMode",
+      "android/support/v4/provider/DocumentFile": "androidx/provider/DocumentFile",
+      "android/support/v4/provider/RawDocumentFile": "androidx/provider/RawDocumentFile",
+      "android/support/v4/provider/SingleDocumentFile": "androidx/provider/SingleDocumentFile",
+      "android/support/v4/provider/TreeDocumentFile": "androidx/provider/TreeDocumentFile",
+      "android/support/v4/provider/DocumentsContractApi19": "androidx/provider/DocumentsContractApi19",
+      "android/support/v7/widget/GridLayout$1": "androidx/widget/GridLayout$1",
+      "android/support/v7/widget/GridLayout": "androidx/widget/GridLayout",
+      "android/support/v7/widget/GridLayout$2": "androidx/widget/GridLayout$2",
+      "android/support/v7/widget/GridLayout$Alignment": "androidx/widget/GridLayout$Alignment",
+      "android/support/v7/widget/GridLayout$3": "androidx/widget/GridLayout$3",
+      "android/support/v7/widget/GridLayout$4": "androidx/widget/GridLayout$4",
+      "android/support/v7/widget/GridLayout$5": "androidx/widget/GridLayout$5",
+      "android/support/v7/widget/GridLayout$6": "androidx/widget/GridLayout$6",
+      "android/support/v7/widget/GridLayout$7$1": "androidx/widget/GridLayout$7$1",
+      "android/support/v7/widget/GridLayout$Bounds": "androidx/widget/GridLayout$Bounds",
+      "android/support/v7/widget/GridLayout$7": "androidx/widget/GridLayout$7",
+      "android/support/v7/widget/GridLayout$8": "androidx/widget/GridLayout$8",
+      "android/support/v7/widget/GridLayout$Arc": "androidx/widget/GridLayout$Arc",
+      "android/support/v7/widget/GridLayout$Interval": "androidx/widget/GridLayout$Interval",
+      "android/support/v7/widget/GridLayout$MutableInt": "androidx/widget/GridLayout$MutableInt",
+      "android/support/v7/widget/GridLayout$Assoc": "androidx/widget/GridLayout$Assoc",
+      "android/support/v7/widget/GridLayout$PackedMap": "androidx/widget/GridLayout$PackedMap",
+      "android/support/v7/widget/GridLayout$Axis$1": "androidx/widget/GridLayout$Axis$1",
+      "android/support/v7/widget/GridLayout$Axis": "androidx/widget/GridLayout$Axis",
+      "android/support/v7/widget/GridLayout$Spec": "androidx/widget/GridLayout$Spec",
+      "android/support/v7/widget/GridLayout$LayoutParams": "androidx/widget/GridLayout$LayoutParams",
+      "android/support/v7/gridlayout/R$styleable": "androidx/gridlayout/R$styleable",
+      "android/support/v7/gridlayout/R": "androidx/gridlayout/R",
+      "android/support/v7/gridlayout/R$dimen": "androidx/gridlayout/R$dimen",
+      "android/arch/lifecycle/ClassesInfoCache$CallbackInfo": "androidx/lifecycle/ClassesInfoCache$CallbackInfo",
+      "android/arch/lifecycle/ClassesInfoCache$MethodReference": "androidx/lifecycle/ClassesInfoCache$MethodReference",
+      "android/arch/lifecycle/ClassesInfoCache": "androidx/lifecycle/ClassesInfoCache",
+      "android/arch/lifecycle/ReflectiveGenericLifecycleObserver": "androidx/lifecycle/ReflectiveGenericLifecycleObserver",
+      "android/arch/lifecycle/FullLifecycleObserverAdapter": "androidx/lifecycle/FullLifecycleObserverAdapter",
+      "android/arch/lifecycle/SingleGeneratedAdapterObserver": "androidx/lifecycle/SingleGeneratedAdapterObserver",
+      "android/arch/lifecycle/CompositeGeneratedAdaptersObserver": "androidx/lifecycle/CompositeGeneratedAdaptersObserver",
+      "android/arch/lifecycle/FullLifecycleObserverAdapter$1": "androidx/lifecycle/FullLifecycleObserverAdapter$1",
+      "android/arch/persistence/room/testing/MigrationTestHelper$CreatingDelegate": "androidx/persistence/room/testing/MigrationTestHelper$CreatingDelegate",
+      "android/arch/persistence/room/testing/MigrationTestHelper$RoomOpenHelperDelegate": "androidx/persistence/room/testing/MigrationTestHelper$RoomOpenHelperDelegate",
+      "android/arch/persistence/room/testing/MigrationTestHelper": "androidx/persistence/room/testing/MigrationTestHelper",
+      "android/arch/persistence/room/testing/MigrationTestHelper$MigratingDelegate": "androidx/persistence/room/testing/MigrationTestHelper$MigratingDelegate",
+      "android/arch/persistence/room/util/TableInfo": "androidx/persistence/room/util/TableInfo",
+      "android/arch/persistence/room/RoomOpenHelper$Delegate": "androidx/persistence/room/RoomOpenHelper$Delegate",
+      "android/arch/persistence/room/RoomOpenHelper": "androidx/persistence/room/RoomOpenHelper",
+      "android/arch/persistence/room/RoomDatabase$MigrationContainer": "androidx/persistence/room/RoomDatabase$MigrationContainer",
+      "android/arch/persistence/room/util/TableInfo$Index": "androidx/persistence/room/util/TableInfo$Index",
+      "android/arch/persistence/room/util/TableInfo$ForeignKey": "androidx/persistence/room/util/TableInfo$ForeignKey",
+      "android/arch/persistence/room/util/TableInfo$Column": "androidx/persistence/room/util/TableInfo$Column",
+      "android/arch/persistence/room/DatabaseConfiguration": "androidx/persistence/room/DatabaseConfiguration",
+      "android/arch/persistence/room/migration/Migration": "androidx/persistence/room/migration/Migration",
+      "android/arch/lifecycle/ComputableLiveData$1": "androidx/lifecycle/ComputableLiveData$1",
+      "android/arch/lifecycle/ComputableLiveData$2": "androidx/lifecycle/ComputableLiveData$2",
+      "android/arch/lifecycle/ComputableLiveData$3": "androidx/lifecycle/ComputableLiveData$3",
+      "android/arch/lifecycle/MediatorLiveData$Source": "androidx/lifecycle/MediatorLiveData$Source",
+      "android/arch/lifecycle/MediatorLiveData": "androidx/lifecycle/MediatorLiveData",
+      "android/arch/lifecycle/Transformations$1": "androidx/lifecycle/Transformations$1",
+      "android/arch/lifecycle/Transformations": "androidx/lifecycle/Transformations",
+      "android/arch/core/util/Function": "androidx/core/util/Function",
+      "android/arch/lifecycle/Transformations$2$1": "androidx/lifecycle/Transformations$2$1",
+      "android/arch/lifecycle/Transformations$2": "androidx/lifecycle/Transformations$2",
+      "android/support/wear/ambient/AmbientDelegate$AmbientCallback": "androidx/wear/ambient/AmbientDelegate$AmbientCallback",
+      "android/support/wear/ambient/AmbientDelegate": "androidx/wear/ambient/AmbientDelegate",
+      "android/support/wear/ambient/WearableControllerProvider": "androidx/wear/ambient/WearableControllerProvider",
+      "android/support/wear/ambient/AmbientMode$1": "androidx/wear/ambient/AmbientMode$1",
+      "android/support/wear/ambient/AmbientMode": "androidx/wear/ambient/AmbientMode",
+      "android/support/wear/ambient/AmbientMode$AmbientCallback": "androidx/wear/ambient/AmbientMode$AmbientCallback",
+      "android/support/wear/ambient/AmbientMode$AmbientCallbackProvider": "androidx/wear/ambient/AmbientMode$AmbientCallbackProvider",
+      "android/support/wear/ambient/AmbientMode$AmbientController": "androidx/wear/ambient/AmbientMode$AmbientController",
+      "android/support/wear/ambient/AmbientModeSupport$1": "androidx/wear/ambient/AmbientModeSupport$1",
+      "android/support/wear/ambient/AmbientModeSupport": "androidx/wear/ambient/AmbientModeSupport",
+      "android/support/wear/ambient/AmbientModeSupport$AmbientCallback": "androidx/wear/ambient/AmbientModeSupport$AmbientCallback",
+      "android/support/wear/ambient/AmbientModeSupport$AmbientCallbackProvider": "androidx/wear/ambient/AmbientModeSupport$AmbientCallbackProvider",
+      "android/support/wear/ambient/AmbientModeSupport$AmbientController": "androidx/wear/ambient/AmbientModeSupport$AmbientController",
+      "android/support/wear/ambient/SharedLibraryVersion$PresenceHolder": "androidx/wear/ambient/SharedLibraryVersion$PresenceHolder",
+      "android/support/wear/ambient/SharedLibraryVersion": "androidx/wear/ambient/SharedLibraryVersion",
+      "android/support/wear/ambient/SharedLibraryVersion$VersionHolder": "androidx/wear/ambient/SharedLibraryVersion$VersionHolder",
+      "android/support/wear/ambient/WearableControllerProvider$1": "androidx/wear/ambient/WearableControllerProvider$1",
+      "android/support/wear/internal/widget/ResourcesUtil": "androidx/wear/internal/widget/ResourcesUtil",
+      "android/support/wear/internal/widget/drawer/MultiPagePresenter$Ui": "androidx/wear/internal/widget/drawer/MultiPagePresenter$Ui",
+      "android/support/wear/widget/drawer/WearableNavigationDrawerView$WearableNavigationDrawerAdapter": "androidx/wear/widget/drawer/WearableNavigationDrawerView$WearableNavigationDrawerAdapter",
+      "android/support/wear/widget/drawer/WearableNavigationDrawerView": "androidx/wear/widget/drawer/WearableNavigationDrawerView",
+      "android/support/wear/internal/widget/drawer/MultiPagePresenter": "androidx/wear/internal/widget/drawer/MultiPagePresenter",
+      "android/support/wear/internal/widget/drawer/WearableNavigationDrawerPresenter": "androidx/wear/internal/widget/drawer/WearableNavigationDrawerPresenter",
+      "android/support/wear/widget/drawer/WearableDrawerController": "androidx/wear/widget/drawer/WearableDrawerController",
+      "android/support/wear/internal/widget/drawer/MultiPageUi$1": "androidx/wear/internal/widget/drawer/MultiPageUi$1",
+      "android/support/wear/internal/widget/drawer/MultiPageUi": "androidx/wear/internal/widget/drawer/MultiPageUi",
+      "android/support/wear/internal/widget/drawer/MultiPageUi$NavigationPagerAdapter": "androidx/wear/internal/widget/drawer/MultiPageUi$NavigationPagerAdapter",
+      "android/support/wear/R$layout": "androidx/wear/R$layout",
+      "android/support/wear/R": "androidx/wear/R",
+      "android/support/wear/R$id": "androidx/wear/R$id",
+      "android/support/wear/widget/drawer/PageIndicatorView": "androidx/wear/widget/drawer/PageIndicatorView",
+      "android/support/wear/internal/widget/drawer/SinglePagePresenter$Ui": "androidx/wear/internal/widget/drawer/SinglePagePresenter$Ui",
+      "android/support/wear/internal/widget/drawer/SinglePagePresenter": "androidx/wear/internal/widget/drawer/SinglePagePresenter",
+      "android/support/wear/internal/widget/drawer/SinglePageUi$1": "androidx/wear/internal/widget/drawer/SinglePageUi$1",
+      "android/support/wear/internal/widget/drawer/SinglePageUi": "androidx/wear/internal/widget/drawer/SinglePageUi",
+      "android/support/wear/internal/widget/drawer/SinglePageUi$OnSelectedClickHandler": "androidx/wear/internal/widget/drawer/SinglePageUi$OnSelectedClickHandler",
+      "android/support/wear/widget/CircledImageView": "androidx/wear/widget/CircledImageView",
+      "android/support/wear/widget/drawer/WearableNavigationDrawerView$OnItemSelectedListener": "androidx/wear/widget/drawer/WearableNavigationDrawerView$OnItemSelectedListener",
+      "android/support/wear/utils/MetadataConstants": "androidx/wear/utils/MetadataConstants",
+      "android/support/wear/widget/BezierSCurveInterpolator": "androidx/wear/widget/BezierSCurveInterpolator",
+      "android/support/wear/widget/BoxInsetLayout$LayoutParams$BoxedEdges": "androidx/wear/widget/BoxInsetLayout$LayoutParams$BoxedEdges",
+      "android/support/wear/widget/BoxInsetLayout$LayoutParams": "androidx/wear/widget/BoxInsetLayout$LayoutParams",
+      "android/support/wear/widget/BoxInsetLayout": "androidx/wear/widget/BoxInsetLayout",
+      "android/support/wear/R$styleable": "androidx/wear/R$styleable",
+      "android/support/wear/widget/CircledImageView$1": "androidx/wear/widget/CircledImageView$1",
+      "android/support/wear/widget/CircledImageView$2": "androidx/wear/widget/CircledImageView$2",
+      "android/support/wear/widget/CircledImageView$OvalShadowPainter": "androidx/wear/widget/CircledImageView$OvalShadowPainter",
+      "android/support/wear/widget/ProgressDrawable": "androidx/wear/widget/ProgressDrawable",
+      "android/support/wear/widget/CircularProgressLayout$1": "androidx/wear/widget/CircularProgressLayout$1",
+      "android/support/wear/widget/CircularProgressLayout": "androidx/wear/widget/CircularProgressLayout",
+      "android/support/wear/widget/CircularProgressLayout$OnTimerFinishedListener": "androidx/wear/widget/CircularProgressLayout$OnTimerFinishedListener",
+      "android/support/wear/R$array": "androidx/wear/R$array",
+      "android/support/wear/R$dimen": "androidx/wear/R$dimen",
+      "android/support/wear/R$color": "androidx/wear/R$color",
+      "android/support/wear/widget/CircularProgressLayoutController": "androidx/wear/widget/CircularProgressLayoutController",
+      "android/support/wear/widget/CircularProgressLayoutController$CircularProgressTimer": "androidx/wear/widget/CircularProgressLayoutController$CircularProgressTimer",
+      "android/support/wear/widget/CurvingLayoutCallback": "androidx/wear/widget/CurvingLayoutCallback",
+      "android/support/wear/widget/WearableLinearLayoutManager$LayoutCallback": "androidx/wear/widget/WearableLinearLayoutManager$LayoutCallback",
+      "android/support/wear/widget/WearableLinearLayoutManager": "androidx/wear/widget/WearableLinearLayoutManager",
+      "android/support/wear/widget/ProgressDrawable$1": "androidx/wear/widget/ProgressDrawable$1",
+      "android/support/wear/widget/RoundedDrawable": "androidx/wear/widget/RoundedDrawable",
+      "android/support/wear/widget/ScrollManager": "androidx/wear/widget/ScrollManager",
+      "android/support/wear/widget/SimpleAnimatorListener": "androidx/wear/widget/SimpleAnimatorListener",
+      "android/support/wear/widget/SwipeDismissFrameLayout$1": "androidx/wear/widget/SwipeDismissFrameLayout$1",
+      "android/support/wear/widget/SwipeDismissFrameLayout": "androidx/wear/widget/SwipeDismissFrameLayout",
+      "android/support/wear/widget/SwipeDismissFrameLayout$Callback": "androidx/wear/widget/SwipeDismissFrameLayout$Callback",
+      "android/support/wear/widget/SwipeDismissFrameLayout$MyOnDismissedListener$1": "androidx/wear/widget/SwipeDismissFrameLayout$MyOnDismissedListener$1",
+      "android/support/wear/widget/SwipeDismissFrameLayout$MyOnDismissedListener": "androidx/wear/widget/SwipeDismissFrameLayout$MyOnDismissedListener",
+      "android/support/wear/widget/SwipeDismissLayout": "androidx/wear/widget/SwipeDismissLayout",
+      "android/support/wear/widget/SwipeDismissLayout$OnDismissedListener": "androidx/wear/widget/SwipeDismissLayout$OnDismissedListener",
+      "android/support/wear/widget/SwipeDismissFrameLayout$MyOnPreSwipeListener": "androidx/wear/widget/SwipeDismissFrameLayout$MyOnPreSwipeListener",
+      "android/support/wear/widget/SwipeDismissLayout$OnPreSwipeListener": "androidx/wear/widget/SwipeDismissLayout$OnPreSwipeListener",
+      "android/support/wear/widget/SwipeDismissFrameLayout$MyOnSwipeProgressChangedListener$1": "androidx/wear/widget/SwipeDismissFrameLayout$MyOnSwipeProgressChangedListener$1",
+      "android/support/wear/widget/SwipeDismissFrameLayout$MyOnSwipeProgressChangedListener": "androidx/wear/widget/SwipeDismissFrameLayout$MyOnSwipeProgressChangedListener",
+      "android/support/wear/widget/SwipeDismissLayout$OnSwipeProgressChangedListener": "androidx/wear/widget/SwipeDismissLayout$OnSwipeProgressChangedListener",
+      "android/support/wear/widget/WearableRecyclerView": "androidx/wear/widget/WearableRecyclerView",
+      "android/support/wear/widget/WearableRecyclerView$1": "androidx/wear/widget/WearableRecyclerView$1",
+      "android/support/wear/widget/drawer/AbsListViewFlingWatcher": "androidx/wear/widget/drawer/AbsListViewFlingWatcher",
+      "android/support/wear/widget/drawer/FlingWatcherFactory$FlingWatcher": "androidx/wear/widget/drawer/FlingWatcherFactory$FlingWatcher",
+      "android/support/wear/widget/drawer/FlingWatcherFactory$FlingListener": "androidx/wear/widget/drawer/FlingWatcherFactory$FlingListener",
+      "android/support/wear/widget/drawer/FlingWatcherFactory": "androidx/wear/widget/drawer/FlingWatcherFactory",
+      "android/support/wear/widget/drawer/RecyclerViewFlingWatcher": "androidx/wear/widget/drawer/RecyclerViewFlingWatcher",
+      "android/support/wear/widget/drawer/ScrollViewFlingWatcher": "androidx/wear/widget/drawer/ScrollViewFlingWatcher",
+      "android/support/wear/widget/drawer/NestedScrollViewFlingWatcher": "androidx/wear/widget/drawer/NestedScrollViewFlingWatcher",
+      "android/support/wear/widget/drawer/NestedScrollViewFlingWatcher$1": "androidx/wear/widget/drawer/NestedScrollViewFlingWatcher$1",
+      "android/support/wear/widget/drawer/PageIndicatorView$1": "androidx/wear/widget/drawer/PageIndicatorView$1",
+      "android/support/wear/R$style": "androidx/wear/R$style",
+      "android/support/wear/widget/drawer/ScrollViewFlingWatcher$1": "androidx/wear/widget/drawer/ScrollViewFlingWatcher$1",
+      "android/support/wear/widget/drawer/WearableActionDrawerMenu$1": "androidx/wear/widget/drawer/WearableActionDrawerMenu$1",
+      "android/support/wear/widget/drawer/WearableActionDrawerMenu$WearableActionDrawerMenuItem$MenuItemChangedListener": "androidx/wear/widget/drawer/WearableActionDrawerMenu$WearableActionDrawerMenuItem$MenuItemChangedListener",
+      "android/support/wear/widget/drawer/WearableActionDrawerMenu": "androidx/wear/widget/drawer/WearableActionDrawerMenu",
+      "android/support/wear/widget/drawer/WearableActionDrawerMenu$WearableActionDrawerMenuItem": "androidx/wear/widget/drawer/WearableActionDrawerMenu$WearableActionDrawerMenuItem",
+      "android/support/wear/widget/drawer/WearableActionDrawerMenu$WearableActionDrawerMenuListener": "androidx/wear/widget/drawer/WearableActionDrawerMenu$WearableActionDrawerMenuListener",
+      "android/support/wear/widget/drawer/WearableActionDrawerView$1": "androidx/wear/widget/drawer/WearableActionDrawerView$1",
+      "android/support/wear/widget/drawer/WearableActionDrawerView": "androidx/wear/widget/drawer/WearableActionDrawerView",
+      "android/support/wear/widget/drawer/WearableActionDrawerView$ActionItemViewHolder": "androidx/wear/widget/drawer/WearableActionDrawerView$ActionItemViewHolder",
+      "android/support/wear/widget/drawer/WearableActionDrawerView$ActionListAdapter$1": "androidx/wear/widget/drawer/WearableActionDrawerView$ActionListAdapter$1",
+      "android/support/wear/widget/drawer/WearableActionDrawerView$ActionListAdapter": "androidx/wear/widget/drawer/WearableActionDrawerView$ActionListAdapter",
+      "android/support/wear/widget/drawer/WearableActionDrawerView$TitleViewHolder": "androidx/wear/widget/drawer/WearableActionDrawerView$TitleViewHolder",
+      "android/support/wear/widget/drawer/WearableDrawerView": "androidx/wear/widget/drawer/WearableDrawerView",
+      "android/support/wear/R$string": "androidx/wear/R$string",
+      "android/support/wear/R$fraction": "androidx/wear/R$fraction",
+      "android/support/wear/widget/drawer/WearableDrawerLayout": "androidx/wear/widget/drawer/WearableDrawerLayout",
+      "android/support/wear/widget/drawer/WearableDrawerLayout$1": "androidx/wear/widget/drawer/WearableDrawerLayout$1",
+      "android/support/wear/widget/drawer/WearableDrawerLayout$2": "androidx/wear/widget/drawer/WearableDrawerLayout$2",
+      "android/support/wear/widget/drawer/WearableDrawerLayout$BottomDrawerDraggerCallback": "androidx/wear/widget/drawer/WearableDrawerLayout$BottomDrawerDraggerCallback",
+      "android/support/wear/widget/drawer/WearableDrawerLayout$DrawerDraggerCallback": "androidx/wear/widget/drawer/WearableDrawerLayout$DrawerDraggerCallback",
+      "android/support/wear/widget/drawer/WearableDrawerLayout$ClosePeekRunnable": "androidx/wear/widget/drawer/WearableDrawerLayout$ClosePeekRunnable",
+      "android/support/wear/widget/drawer/WearableDrawerLayout$DrawerStateCallback": "androidx/wear/widget/drawer/WearableDrawerLayout$DrawerStateCallback",
+      "android/support/wear/widget/drawer/WearableDrawerLayout$TopDrawerDraggerCallback": "androidx/wear/widget/drawer/WearableDrawerLayout$TopDrawerDraggerCallback",
+      "android/support/wear/widget/drawer/WearableDrawerView$1": "androidx/wear/widget/drawer/WearableDrawerView$1",
+      "android/support/wear/widget/drawer/WearableDrawerView$DrawerState": "androidx/wear/widget/drawer/WearableDrawerView$DrawerState",
+      "android/support/wear/R$drawable": "androidx/wear/R$drawable",
+      "android/support/wear/widget/drawer/WearableNavigationDrawerView$1": "androidx/wear/widget/drawer/WearableNavigationDrawerView$1",
+      "android/support/wear/widget/drawer/WearableNavigationDrawerView$2": "androidx/wear/widget/drawer/WearableNavigationDrawerView$2",
+      "android/support/wear/widget/drawer/WearableNavigationDrawerView$NavigationStyle": "androidx/wear/widget/drawer/WearableNavigationDrawerView$NavigationStyle",
+      "android/support/text/emoji/EmojiCompat$CompatInternal": "androidx/text/emoji/EmojiCompat$CompatInternal",
+      "android/support/text/emoji/EmojiCompat": "androidx/text/emoji/EmojiCompat",
+      "android/support/text/emoji/EmojiProcessor$GlyphChecker": "androidx/text/emoji/EmojiProcessor$GlyphChecker",
+      "android/support/text/emoji/EmojiProcessor": "androidx/text/emoji/EmojiProcessor",
+      "android/support/text/emoji/EmojiCompat$CompatInternal19$1": "androidx/text/emoji/EmojiCompat$CompatInternal19$1",
+      "android/support/text/emoji/EmojiCompat$MetadataRepoLoaderCallback": "androidx/text/emoji/EmojiCompat$MetadataRepoLoaderCallback",
+      "android/support/text/emoji/EmojiCompat$CompatInternal19": "androidx/text/emoji/EmojiCompat$CompatInternal19",
+      "android/support/text/emoji/MetadataRepo": "androidx/text/emoji/MetadataRepo",
+      "android/support/text/emoji/EmojiCompat$SpanFactory": "androidx/text/emoji/EmojiCompat$SpanFactory",
+      "android/support/text/emoji/EmojiCompat$MetadataRepoLoader": "androidx/text/emoji/EmojiCompat$MetadataRepoLoader",
+      "android/support/text/emoji/EmojiMetadata": "androidx/text/emoji/EmojiMetadata",
+      "android/support/text/emoji/EmojiCompat$Config": "androidx/text/emoji/EmojiCompat$Config",
+      "android/support/text/emoji/EmojiCompat$InitCallback": "androidx/text/emoji/EmojiCompat$InitCallback",
+      "android/support/text/emoji/EmojiCompat$ListenerDispatcher": "androidx/text/emoji/EmojiCompat$ListenerDispatcher",
+      "android/support/text/emoji/EmojiCompat$LoadState": "androidx/text/emoji/EmojiCompat$LoadState",
+      "android/support/text/emoji/EmojiCompat$ReplaceStrategy": "androidx/text/emoji/EmojiCompat$ReplaceStrategy",
+      "android/support/text/emoji/EmojiSpan": "androidx/text/emoji/EmojiSpan",
+      "android/support/text/emoji/TypefaceEmojiSpan": "androidx/text/emoji/TypefaceEmojiSpan",
+      "android/support/text/emoji/EmojiMetadata$HasGlyph": "androidx/text/emoji/EmojiMetadata$HasGlyph",
+      "android/support/text/emoji/EmojiProcessor$Action": "androidx/text/emoji/EmojiProcessor$Action",
+      "android/support/text/emoji/EmojiProcessor$CodepointIndexFinder": "androidx/text/emoji/EmojiProcessor$CodepointIndexFinder",
+      "android/support/text/emoji/EmojiProcessor$ProcessorSm": "androidx/text/emoji/EmojiProcessor$ProcessorSm",
+      "android/support/text/emoji/MetadataRepo$Node": "androidx/text/emoji/MetadataRepo$Node",
+      "android/support/text/emoji/widget/SpannableBuilder": "androidx/text/emoji/widget/SpannableBuilder",
+      "android/support/text/emoji/FontRequestEmojiCompatConfig$ExponentialBackoffRetryPolicy": "androidx/text/emoji/FontRequestEmojiCompatConfig$ExponentialBackoffRetryPolicy",
+      "android/support/text/emoji/FontRequestEmojiCompatConfig$RetryPolicy": "androidx/text/emoji/FontRequestEmojiCompatConfig$RetryPolicy",
+      "android/support/text/emoji/FontRequestEmojiCompatConfig": "androidx/text/emoji/FontRequestEmojiCompatConfig",
+      "android/support/text/emoji/FontRequestEmojiCompatConfig$FontProviderHelper": "androidx/text/emoji/FontRequestEmojiCompatConfig$FontProviderHelper",
+      "android/support/text/emoji/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$1": "androidx/text/emoji/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$1",
+      "android/support/text/emoji/FontRequestEmojiCompatConfig$FontRequestMetadataLoader": "androidx/text/emoji/FontRequestEmojiCompatConfig$FontRequestMetadataLoader",
+      "android/support/text/emoji/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$2": "androidx/text/emoji/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$2",
+      "android/support/text/emoji/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$3": "androidx/text/emoji/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$3",
+      "android/support/text/emoji/MetadataListReader$ByteBufferReader": "androidx/text/emoji/MetadataListReader$ByteBufferReader",
+      "android/support/text/emoji/MetadataListReader$OpenTypeReader": "androidx/text/emoji/MetadataListReader$OpenTypeReader",
+      "android/support/text/emoji/MetadataListReader": "androidx/text/emoji/MetadataListReader",
+      "android/support/text/emoji/MetadataListReader$InputStreamOpenTypeReader": "androidx/text/emoji/MetadataListReader$InputStreamOpenTypeReader",
+      "android/support/text/emoji/MetadataListReader$OffsetInfo": "androidx/text/emoji/MetadataListReader$OffsetInfo",
+      "android/support/text/emoji/MetadataRepo$1": "androidx/text/emoji/MetadataRepo$1",
+      "android/support/text/emoji/R$styleable": "androidx/text/emoji/R$styleable",
+      "android/support/text/emoji/R": "androidx/text/emoji/R",
+      "android/support/text/emoji/widget/EmojiButton": "androidx/text/emoji/widget/EmojiButton",
+      "android/support/text/emoji/widget/EmojiEditText": "androidx/text/emoji/widget/EmojiEditText",
+      "android/support/text/emoji/widget/EmojiEditTextHelper$1": "androidx/text/emoji/widget/EmojiEditTextHelper$1",
+      "android/support/text/emoji/widget/EmojiEditTextHelper$HelperInternal": "androidx/text/emoji/widget/EmojiEditTextHelper$HelperInternal",
+      "android/support/text/emoji/widget/EmojiEditTextHelper$HelperInternal19": "androidx/text/emoji/widget/EmojiEditTextHelper$HelperInternal19",
+      "android/support/text/emoji/widget/EmojiTextWatcher": "androidx/text/emoji/widget/EmojiTextWatcher",
+      "android/support/text/emoji/widget/EmojiEditableFactory": "androidx/text/emoji/widget/EmojiEditableFactory",
+      "android/support/text/emoji/widget/EmojiKeyListener": "androidx/text/emoji/widget/EmojiKeyListener",
+      "android/support/text/emoji/widget/EmojiInputConnection": "androidx/text/emoji/widget/EmojiInputConnection",
+      "android/support/text/emoji/widget/EmojiExtractEditText": "androidx/text/emoji/widget/EmojiExtractEditText",
+      "android/support/text/emoji/widget/EmojiExtractTextLayout$ButtonOnclickListener": "androidx/text/emoji/widget/EmojiExtractTextLayout$ButtonOnclickListener",
+      "android/support/text/emoji/widget/EmojiExtractTextLayout": "androidx/text/emoji/widget/EmojiExtractTextLayout",
       "android/support/text/emoji/R$layout": "androidx/text/emoji/R$layout",
-      "android/support/v4/media/session/MediaSessionCompat$SessionFlags": "androidx/media/session/MediaSessionCompat$SessionFlags",
-      "android/support/v7/preference/PreferenceRecyclerViewAccessibilityDelegate": "androidx/preference/PreferenceRecyclerViewAccessibilityDelegate",
-      "android/support/transition/AnimatorUtils": "androidx/transition/AnimatorUtils",
-      "android/support/v17/leanback/system/Settings": "androidx/leanback/system/Settings",
-      "android/support/v4/app/FragmentActivity$NonConfigurationInstances": "androidx/app/FragmentActivity$NonConfigurationInstances",
-      "android/support/v17/leanback/widget/GuidedActionAdapter$EditListener": "androidx/leanback/widget/GuidedActionAdapter$EditListener",
-      "android/support/v7/media/MediaRouteProvider$Callback": "androidx/media/MediaRouteProvider$Callback",
-      "android/support/v7/app/AppCompatDelegateImplV9$PanelMenuPresenterCallback": "androidx/app/AppCompatDelegateImplV9$PanelMenuPresenterCallback",
-      "android/support/constraint/ConstraintSet$Constraint": "androidx/constraint/ConstraintSet$Constraint",
-      "android/support/wear/R$dimen": "androidx/wear/R$dimen"
-    },
-    "fields": {
-      "android/support/v4/view/AbsSavedState": {
-        "androidx/view/AbsSavedState": [
-          "CREATOR",
-          "EMPTY_STATE"
-        ]
-      },
-      "android/support/v4/view/PagerTabStrip": {
-        "androidx/widget/PagerTabStrip": [
-          "TAG",
-          "TAB_PADDING",
-          "TAB_SPACING",
-          "FULL_UNDERLINE_HEIGHT",
-          "MIN_PADDING_BOTTOM",
-          "MIN_STRIP_HEIGHT",
-          "MIN_TEXT_SPACING",
-          "INDICATOR_HEIGHT"
-        ]
-      },
-      "android/support/media/tv/TvContractCompat$Channels": {
-        "androidx/media/tv/TvContractCompat$Channels": [
-          "VIDEO_FORMAT_4320P",
-          "VIDEO_RESOLUTION_HD",
-          "VIDEO_RESOLUTION_ED",
-          "VIDEO_FORMAT_720P",
-          "COLUMN_TRANSIENT",
-          "VIDEO_FORMAT_TO_RESOLUTION_MAP",
-          "COLUMN_DISPLAY_NAME",
-          "VIDEO_FORMAT_240P",
-          "COLUMN_VIDEO_FORMAT",
-          "COLUMN_APP_LINK_TEXT",
-          "COLUMN_APP_LINK_POSTER_ART_URI",
-          "VIDEO_FORMAT_360P",
-          "TYPE_OTHER",
-          "COLUMN_NETWORK_AFFILIATION",
-          "TYPE_PAL",
-          "SERVICE_TYPE_OTHER",
-          "VIDEO_FORMAT_480P",
-          "VIDEO_FORMAT_480I",
-          "CONTENT_URI",
-          "TYPE_CMMB",
-          "TYPE_ATSC_C",
-          "TYPE_ATSC_T",
-          "VIDEO_RESOLUTION_FHD",
-          "COLUMN_APP_LINK_INTENT_URI",
-          "VIDEO_FORMAT_2160P",
-          "TYPE_SECAM",
-          "COLUMN_INTERNAL_PROVIDER_FLAG2",
-          "COLUMN_INTERNAL_PROVIDER_FLAG1",
-          "COLUMN_INTERNAL_PROVIDER_FLAG4",
-          "COLUMN_INTERNAL_PROVIDER_FLAG3",
-          "TYPE_T_DMB",
-          "CONTENT_TYPE",
-          "COLUMN_TRANSPORT_STREAM_ID",
-          "VIDEO_FORMAT_576P",
-          "VIDEO_FORMAT_576I",
-          "COLUMN_LOCKED",
-          "COLUMN_SERVICE_TYPE",
-          "TYPE_ISDB_S",
-          "TYPE_ISDB_T",
-          "TYPE_ISDB_C",
-          "COLUMN_DESCRIPTION",
-          "TYPE_DVB_S2",
-          "TYPE_DVB_T2",
-          "TYPE_DVB_SH",
-          "TYPE_DTMB",
-          "COLUMN_INPUT_ID",
-          "VIDEO_RESOLUTION_SD",
-          "COLUMN_VERSION_NUMBER",
-          "COLUMN_SEARCHABLE",
-          "COLUMN_SERVICE_ID",
-          "TYPE_1SEG",
-          "TYPE_DVB_C2",
-          "TYPE_DVB_C",
-          "TYPE_DVB_H",
-          "TYPE_DVB_S",
-          "TYPE_DVB_T",
-          "CONTENT_ITEM_TYPE",
-          "SERVICE_TYPE_AUDIO",
-          "TYPE_ATSC_M_H",
-          "TYPE_NTSC",
-          "COLUMN_BROWSABLE",
-          "TYPE_ISDB_TB",
-          "COLUMN_INTERNAL_PROVIDER_DATA",
-          "COLUMN_DISPLAY_NUMBER",
-          "COLUMN_SYSTEM_APPROVED",
-          "VIDEO_FORMAT_1080I",
-          "VIDEO_FORMAT_1080P",
-          "COLUMN_TYPE",
-          "VIDEO_RESOLUTION_UHD",
-          "COLUMN_APP_LINK_ICON_URI",
-          "TYPE_S_DMB",
-          "COLUMN_APP_LINK_COLOR",
-          "SERVICE_TYPE_AUDIO_VIDEO",
-          "TYPE_PREVIEW",
-          "COLUMN_ORIGINAL_NETWORK_ID",
-          "COLUMN_INTERNAL_PROVIDER_ID"
-        ]
-      },
-      "android/support/v7/widget/ViewBoundsCheck": {
-        "androidx/widget/ViewBoundsCheck": [
-          "FLAG_CVS_EQ_PVE",
-          "FLAG_CVS_EQ_PVS",
-          "GT",
-          "LT",
-          "EQ",
-          "FLAG_CVS_GT_PVS",
-          "FLAG_CVS_GT_PVE",
-          "FLAG_CVE_EQ_PVE",
-          "FLAG_CVE_EQ_PVS",
-          "MASK",
-          "CVS_PVE_POS",
-          "CVE_PVE_POS",
-          "FLAG_CVS_LT_PVE",
-          "FLAG_CVS_LT_PVS",
-          "CVS_PVS_POS",
-          "FLAG_CVE_LT_PVS",
-          "FLAG_CVE_LT_PVE",
-          "CVE_PVS_POS",
-          "FLAG_CVE_GT_PVS",
-          "FLAG_CVE_GT_PVE"
-        ]
-      },
-      "android/support/constraint/ConstraintLayout$LayoutParams": {
-        "androidx/constraint/ConstraintLayout$LayoutParams": [
-          "topToTop",
-          "goneTopMargin",
-          "verticalWeight",
-          "horizontalDimensionFixed",
-          "goneBottomMargin",
-          "matchConstraintMaxHeight",
-          "resolveGoneLeftMargin",
-          "leftMargin",
-          "MATCH_CONSTRAINT",
-          "resolvedRightToLeft",
-          "needsBaseline",
-          "startToEnd",
-          "TOP",
-          "horizontalChainStyle",
-          "guidePercent",
-          "CHAIN_SPREAD",
-          "topMargin",
-          "goneStartMargin",
-          "goneRightMargin",
-          "UNSET",
-          "HORIZONTAL",
-          "dimensionRatioValue",
-          "MATCH_CONSTRAINT_SPREAD",
-          "END",
-          "guideBegin",
-          "matchConstraintMaxWidth",
-          "verticalDimensionFixed",
-          "resolvedRightToRight",
-          "BASELINE",
-          "START",
-          "resolvedHorizontalBias",
-          "bottomToBottom",
-          "MATCH_CONSTRAINT_WRAP",
-          "startToStart",
-          "RIGHT",
-          "orientation",
-          "matchConstraintDefaultHeight",
-          "guideEnd",
-          "bottomToTop",
-          "CHAIN_PACKED",
-          "isGuideline",
-          "dimensionRatioSide",
-          "dimensionRatio",
-          "goneLeftMargin",
-          "matchConstraintMinWidth",
-          "PARENT_ID",
-          "endToStart",
-          "LEFT",
-          "horizontalBias",
-          "leftToLeft",
-          "BOTTOM",
-          "resolveGoneRightMargin",
-          "leftToRight",
-          "verticalBias",
-          "goneEndMargin",
-          "VERTICAL",
-          "rightMargin",
-          "rightToRight",
-          "resolvedLeftToLeft",
-          "topToBottom",
-          "endToEnd",
-          "matchConstraintDefaultWidth",
-          "matchConstraintMinHeight",
-          "height",
-          "CHAIN_SPREAD_INSIDE",
-          "widget",
-          "resolvedLeftToRight",
-          "baselineToBaseline",
-          "rightToLeft",
-          "verticalChainStyle",
-          "editorAbsoluteY",
-          "editorAbsoluteX",
-          "bottomMargin",
-          "width",
-          "horizontalWeight"
-        ]
-      },
-      "android/support/v4/media/session/PlaybackStateCompat": {
-        "androidx/media/session/PlaybackStateCompat": [
-          "STATE_NONE",
-          "ACTION_SET_SHUFFLE_MODE",
-          "ACTION_SKIP_TO_QUEUE_ITEM",
-          "ERROR_CODE_CONTENT_ALREADY_PLAYING",
-          "STATE_ERROR",
-          "SHUFFLE_MODE_NONE",
-          "CREATOR",
-          "STATE_SKIPPING_TO_PREVIOUS",
-          "PLAYBACK_POSITION_UNKNOWN",
-          "REPEAT_MODE_INVALID",
-          "REPEAT_MODE_GROUP",
-          "ACTION_SET_REPEAT_MODE",
-          "ACTION_SKIP_TO_PREVIOUS",
-          "ACTION_PREPARE",
-          "ERROR_CODE_SKIP_LIMIT_REACHED",
-          "REPEAT_MODE_NONE",
-          "ACTION_PREPARE_FROM_URI",
-          "STATE_PLAYING",
-          "STATE_SKIPPING_TO_NEXT",
-          "ACTION_FAST_FORWARD",
-          "ERROR_CODE_END_OF_QUEUE",
-          "ERROR_CODE_PARENTAL_CONTROL_RESTRICTED",
-          "STATE_BUFFERING",
-          "ACTION_REWIND",
-          "KEYCODE_MEDIA_PAUSE",
-          "ACTION_PLAY_FROM_MEDIA_ID",
-          "STATE_FAST_FORWARDING",
-          "ACTION_STOP",
-          "KEYCODE_MEDIA_PLAY",
-          "ACTION_PLAY",
-          "ACTION_SET_CAPTIONING_ENABLED",
-          "ERROR_CODE_NOT_SUPPORTED",
-          "STATE_STOPPED",
-          "ACTION_PLAY_PAUSE",
-          "SHUFFLE_MODE_ALL",
-          "ERROR_CODE_AUTHENTICATION_EXPIRED",
-          "ERROR_CODE_APP_ERROR",
-          "ACTION_SEEK_TO",
-          "ERROR_CODE_CONCURRENT_STREAM_LIMIT",
-          "REPEAT_MODE_ALL",
-          "ERROR_CODE_NOT_AVAILABLE_IN_REGION",
-          "ERROR_CODE_ACTION_ABORTED",
-          "STATE_CONNECTING",
-          "ACTION_SKIP_TO_NEXT",
-          "SHUFFLE_MODE_INVALID",
-          "ACTION_PLAY_FROM_SEARCH",
-          "ERROR_CODE_UNKNOWN_ERROR",
-          "ACTION_PAUSE",
-          "ACTION_PLAY_FROM_URI",
-          "REPEAT_MODE_ONE",
-          "ACTION_SET_RATING",
-          "ACTION_PREPARE_FROM_SEARCH",
-          "STATE_PAUSED",
-          "SHUFFLE_MODE_GROUP",
-          "STATE_REWINDING",
-          "ACTION_PREPARE_FROM_MEDIA_ID",
-          "ERROR_CODE_PREMIUM_ACCOUNT_REQUIRED",
-          "STATE_SKIPPING_TO_QUEUE_ITEM",
-          "ACTION_SET_SHUFFLE_MODE_ENABLED"
-        ]
-      },
-      "android/support/v7/appcompat/R$styleable": {
-        "androidx/appcompat/R$styleable": [
-          "MenuItem_android_title",
-          "Toolbar_android_gravity",
-          "ActionMode_titleTextStyle",
-          "ActionBar_popupTheme",
-          "MenuView_android_itemTextAppearance",
-          "SearchView_goIcon",
-          "MenuItem_actionLayout",
-          "Toolbar_navigationIcon",
-          "ColorStateListItem_android_alpha",
-          "AppCompatTheme_android_windowAnimationStyle",
-          "LinearLayoutCompat_android_orientation",
-          "AppCompatTheme_windowActionBar",
-          "MenuItem_showAsAction",
-          "ColorStateListItem_android_color",
-          "ActivityChooserView_initialActivityCount",
-          "AppCompatSeekBar_tickMarkTint",
-          "CompoundButton_android_button",
-          "MenuGroup_android_orderInCategory",
-          "PopupWindow_overlapAnchor",
-          "ViewBackgroundHelper_backgroundTint",
-          "PopupWindow",
-          "Toolbar_contentInsetEndWithActions",
-          "MenuItem_android_titleCondensed",
-          "TextAppearance",
-          "MenuItem_android_id",
-          "LinearLayoutCompat_measureWithLargestChild",
-          "AppCompatTextView_autoSizeTextType",
-          "AppCompatTheme_windowMinWidthMajor",
-          "DrawerArrowToggle_color",
-          "AppCompatTheme",
-          "SwitchCompat_trackTintMode",
-          "AppCompatTheme_windowActionBarOverlay",
-          "DrawerArrowToggle_spinBars",
-          "LinearLayoutCompat",
-          "AppCompatTextHelper",
-          "ActionMode_subtitleTextStyle",
-          "Toolbar_titleTextAppearance",
-          "ActivityChooserView",
-          "LinearLayoutCompat_divider",
-          "MenuItem_android_alphabeticShortcut",
-          "Toolbar_subtitleTextColor",
-          "AppCompatImageView_tint",
-          "AppCompatTheme_windowFixedHeightMajor",
-          "LinearLayoutCompat_android_baselineAlignedChildIndex",
-          "AppCompatTheme_windowMinWidthMinor",
-          "SearchView_suggestionRowLayout",
-          "ListPopupWindow_android_dropDownHorizontalOffset",
-          "ActionBar_subtitleTextStyle",
-          "Toolbar_titleMarginEnd",
-          "Toolbar_titleMarginTop",
-          "LinearLayoutCompat_Layout",
-          "TextAppearance_android_textColor",
-          "Toolbar_subtitleTextAppearance",
-          "ActionBar_displayOptions",
-          "Toolbar_title",
-          "Spinner_android_entries",
-          "MenuItem_numericModifiers",
-          "RecycleListView",
-          "AppCompatTextHelper_android_drawableEnd",
-          "SearchView_searchHintIcon",
-          "Toolbar_collapseIcon",
-          "AppCompatImageView",
-          "MenuItem_android_icon",
-          "ActionBar_contentInsetStart",
-          "MenuItem_android_onClick",
-          "SearchView_searchIcon",
-          "MenuItem_actionViewClass",
-          "MenuGroup_android_enabled",
-          "Toolbar_subtitle",
-          "MenuGroup_android_id",
-          "TextAppearance_android_fontFamily",
-          "ViewBackgroundHelper_android_background",
-          "TextAppearance_android_textColorHint",
-          "LinearLayoutCompat_android_baselineAligned",
-          "MenuItem_contentDescription",
-          "SearchView_voiceIcon",
-          "ActionBar_background",
-          "ActionMenuItemView",
-          "SwitchCompat_switchMinWidth",
-          "AppCompatTheme_windowFixedWidthMajor",
-          "ActionMenuItemView_android_minWidth",
-          "AlertDialog_buttonPanelSideLayout",
-          "SearchView_defaultQueryHint",
-          "MenuItem_android_numericShortcut",
-          "ActionBar_homeAsUpIndicator",
-          "AppCompatTextHelper_android_drawableTop",
-          "DrawerArrowToggle_arrowHeadLength",
-          "TextAppearance_android_shadowRadius",
-          "Toolbar_titleMargins",
-          "SwitchCompat",
-          "ActionBar_height",
-          "LinearLayoutCompat_Layout_android_layout_gravity",
-          "AlertDialog_multiChoiceItemLayout",
-          "CompoundButton_buttonTint",
-          "SearchView_android_imeOptions",
-          "MenuGroup",
-          "ActionBar_customNavigationLayout",
-          "Toolbar_navigationContentDescription",
-          "Toolbar_popupTheme",
-          "View",
-          "ActionBar",
-          "SwitchCompat_android_textOff",
-          "MenuGroup_android_menuCategory",
-          "MenuItem_tooltipText",
-          "AppCompatTextView",
-          "Spinner",
-          "ViewStubCompat_android_inflatedId",
-          "Spinner_popupTheme",
-          "SearchView_closeIcon",
-          "TextAppearance_textAllCaps",
-          "SwitchCompat_trackTint",
-          "Toolbar_logoDescription",
-          "MenuView_android_itemBackground",
-          "TextAppearance_android_textSize",
-          "SearchView_queryBackground",
-          "MenuItem_android_checked",
-          "SearchView_commitIcon",
-          "LinearLayoutCompat_Layout_android_layout_weight",
-          "ViewStubCompat_android_id",
-          "AppCompatTextView_autoSizePresetSizes",
-          "ActionBar_hideOnContentScroll",
-          "Toolbar_contentInsetStartWithNavigation",
-          "AppCompatTextHelper_android_drawableBottom",
-          "PopupWindow_android_popupBackground",
-          "Toolbar_buttonGravity",
-          "AlertDialog",
-          "TextAppearance_android_textStyle",
-          "SwitchCompat_thumbTintMode",
-          "MenuItem_android_checkable",
-          "AppCompatTheme_windowFixedWidthMinor",
-          "TextAppearance_android_textColorLink",
-          "Toolbar_titleMarginStart",
-          "RecycleListView_paddingBottomNoButtons",
-          "ActionMode_closeItemLayout",
-          "Toolbar",
-          "Toolbar_collapseContentDescription",
-          "MenuItem_android_menuCategory",
-          "AppCompatTextHelper_android_textAppearance",
-          "View_theme",
-          "MenuItem_iconTintMode",
-          "Toolbar_contentInsetLeft",
-          "Toolbar_contentInsetStart",
-          "LinearLayoutCompat_android_weightSum",
-          "SwitchCompat_android_textOn",
-          "AppCompatSeekBar",
-          "MenuItem_actionProviderClass",
-          "Toolbar_titleMargin",
-          "AlertDialog_singleChoiceItemLayout",
-          "Toolbar_contentInsetRight",
-          "LinearLayoutCompat_showDividers",
-          "SwitchCompat_android_thumb",
-          "AlertDialog_showTitle",
-          "TextAppearance_android_shadowDy",
-          "TextAppearance_android_shadowDx",
-          "AppCompatTheme_windowActionModeOverlay",
-          "MenuItem_android_visible",
-          "MenuView",
-          "SearchView",
-          "MenuItem",
-          "SearchView_queryHint",
-          "SwitchCompat_thumbTint",
-          "SwitchCompat_thumbTextPadding",
-          "AlertDialog_listLayout",
-          "ActionBar_subtitle",
-          "AlertDialog_android_layout",
-          "ListPopupWindow_android_dropDownVerticalOffset",
-          "Toolbar_titleMarginBottom",
-          "AppCompatSeekBar_android_thumb",
-          "ListPopupWindow",
-          "ButtonBarLayout_allowStacking",
-          "MenuGroup_android_checkableBehavior",
-          "SwitchCompat_switchPadding",
-          "LinearLayoutCompat_android_gravity",
-          "AppCompatTheme_windowNoTitle",
-          "ActionBar_icon",
-          "AppCompatTextView_autoSizeMinTextSize",
-          "Toolbar_logo",
-          "ViewStubCompat_android_layout",
-          "MenuItem_android_enabled",
-          "MenuItem_iconTint",
-          "AppCompatTextHelper_android_drawableRight",
-          "AppCompatTheme_android_windowIsFloating",
-          "Spinner_android_popupBackground",
-          "TextAppearance_android_shadowColor",
-          "Toolbar_maxButtonHeight",
-          "TextAppearance_android_typeface",
-          "DrawerArrowToggle_drawableSize",
-          "DrawerArrowToggle_barLength",
-          "CompoundButton",
-          "ActionMode_height",
-          "DrawerArrowToggle_arrowShaftLength",
-          "DrawerArrowToggle_gapBetweenBars",
-          "SearchView_android_focusable",
-          "ActionMode",
-          "AppCompatTextHelper_android_drawableStart",
-          "SearchView_android_maxWidth",
-          "ActivityChooserView_expandActivityOverflowButtonDrawable",
-          "ActionMode_background",
-          "ActionBar_backgroundSplit",
-          "SwitchCompat_track",
-          "MenuItem_alphabeticModifiers",
-          "TextAppearance_fontFamily",
-          "DrawerArrowToggle_thickness",
-          "AppCompatTextHelper_android_drawableLeft",
-          "ActionBar_contentInsetEnd",
-          "Spinner_android_dropDownWidth",
-          "ColorStateListItem_alpha",
-          "LinearLayoutCompat_dividerPadding",
-          "ViewStubCompat",
-          "View_android_theme",
-          "ActionBar_backgroundStacked",
-          "SearchView_android_inputType",
-          "AlertDialog_listItemLayout",
-          "AppCompatTheme_panelBackground",
-          "AppCompatImageView_srcCompat",
-          "ColorStateListItem",
-          "AppCompatTheme_windowFixedHeightMinor",
-          "MenuView_preserveIconSpacing",
-          "ActionBar_logo",
-          "AppCompatSeekBar_tickMarkTintMode",
-          "SwitchCompat_showText",
-          "AppCompatTextView_autoSizeStepGranularity",
-          "Toolbar_contentInsetEnd",
-          "SearchView_submitBackground",
-          "MenuView_subMenuArrow",
-          "CompoundButton_buttonTintMode",
-          "MenuItem_android_orderInCategory",
-          "ViewBackgroundHelper_backgroundTintMode",
-          "SwitchCompat_switchTextAppearance",
-          "ActionBar_titleTextStyle",
-          "Toolbar_titleTextColor",
-          "MenuGroup_android_visible",
-          "SwitchCompat_splitTrack",
-          "ButtonBarLayout",
-          "AppCompatSeekBar_tickMark",
-          "Spinner_android_prompt",
-          "AppCompatTextView_autoSizeMaxTextSize",
-          "ActionBar_elevation",
-          "ActionBarLayout_android_layout_gravity",
-          "DrawerArrowToggle",
-          "ActionBar_title",
-          "AppCompatImageView_tintMode",
-          "SearchView_layout",
-          "ViewBackgroundHelper",
-          "RecycleListView_paddingTopNoTitle",
-          "ActionBarLayout",
-          "SearchView_iconifiedByDefault"
-        ]
-      },
-      "android/support/v17/leanback/widget/FocusHighlight": {
-        "androidx/leanback/widget/FocusHighlight": [
-          "ZOOM_FACTOR_SMALL",
-          "ZOOM_FACTOR_XSMALL",
-          "ZOOM_FACTOR_NONE",
-          "ZOOM_FACTOR_LARGE",
-          "ZOOM_FACTOR_MEDIUM"
-        ]
-      },
-      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplBase$Command": {
-        "androidx/media/session/MediaSessionCompat$MediaSessionImplBase$Command": [
-          "extras",
-          "command",
-          "stub"
-        ]
-      },
-      "android/support/v7/appcompat/R$attr": {
-        "androidx/appcompat/R$attr": [
-          "checkboxStyle",
-          "colorButtonNormal",
-          "editTextStyle",
-          "actionDropDownStyle",
-          "colorControlNormal",
-          "colorAccent",
-          "actionBarSize",
-          "listMenuViewStyle",
-          "buttonStyle",
-          "colorControlHighlight",
-          "panelMenuListTheme",
-          "seekBarStyle",
-          "actionModeStyle",
-          "alertDialogStyle",
-          "isLightTheme",
-          "ratingBarStyle",
-          "radioButtonStyle",
-          "actionBarTabTextStyle",
-          "alertDialogCenterButtons",
-          "actionBarStyle",
-          "listPopupWindowStyle",
-          "actionBarPopupTheme",
-          "actionOverflowButtonStyle",
-          "spinnerStyle",
-          "popupMenuStyle",
-          "colorPrimaryDark",
-          "drawerArrowStyle",
-          "actionBarWidgetTheme",
-          "alpha",
-          "actionBarTabStyle",
-          "imageButtonStyle",
-          "colorControlActivated",
-          "toolbarStyle",
-          "homeAsUpIndicator",
-          "toolbarNavigationButtonStyle",
-          "colorPrimary",
-          "actionBarTheme",
-          "actionOverflowMenuStyle",
-          "dropDownListViewStyle",
-          "actionModePopupWindowStyle",
-          "actionModeShareDrawable",
-          "dialogTheme",
-          "alertDialogTheme",
-          "searchViewStyle",
-          "colorSwitchThumbNormal",
-          "actionBarTabBarStyle",
-          "textColorSearchUrl",
-          "switchStyle",
-          "autoCompleteTextViewStyle"
-        ]
-      },
-      "android/support/v7/widget/StaggeredGridLayoutManager$Span": {
-        "androidx/widget/StaggeredGridLayoutManager$Span": [
-          "INVALID_LINE"
-        ]
-      },
-      "android/support/v4/app/NotificationManagerCompat": {
-        "androidx/app/NotificationManagerCompat": [
-          "OP_POST_NOTIFICATION",
-          "sEnabledNotificationListeners",
-          "IMPORTANCE_HIGH",
-          "SIDE_CHANNEL_RETRY_MAX_COUNT",
-          "TAG",
-          "SETTING_ENABLED_NOTIFICATION_LISTENERS",
-          "sSideChannelManager",
-          "sLock",
-          "IMPORTANCE_DEFAULT",
-          "SIDE_CHANNEL_RETRY_BASE_INTERVAL_MS",
-          "EXTRA_USE_SIDE_CHANNEL",
-          "IMPORTANCE_NONE",
-          "sEnabledNotificationListenersLock",
-          "ACTION_BIND_SIDE_CHANNEL",
-          "CHECK_OP_NO_THROW",
-          "sEnabledNotificationListenerPackages",
-          "IMPORTANCE_LOW",
-          "IMPORTANCE_MAX",
-          "MAX_SIDE_CHANNEL_SDK_VERSION",
-          "IMPORTANCE_MIN",
-          "IMPORTANCE_UNSPECIFIED"
-        ]
-      },
-      "android/support/v4/util/LruCache": {
-        "androidx/util/LruCache": [
-          "map",
-          "hitCount",
-          "missCount",
-          "maxSize",
-          "putCount",
-          "createCount",
-          "evictionCount",
-          "size"
-        ]
-      },
-      "android/support/v4/content/FileProvider": {
-        "androidx/content/FileProvider": [
-          "META_DATA_FILE_PROVIDER_PATHS",
-          "TAG_EXTERNAL_CACHE",
-          "TAG_FILES_PATH",
-          "TAG_EXTERNAL_FILES",
-          "ATTR_PATH",
-          "ATTR_NAME",
-          "DEVICE_ROOT",
-          "sCache",
-          "COLUMNS",
-          "TAG_EXTERNAL",
-          "TAG_ROOT_PATH",
-          "TAG_CACHE_PATH"
-        ]
-      },
-      "android/support/v4/media/AudioAttributesCompat": {
-        "androidx/media/AudioAttributesCompat": [
-          "FLAG_LOW_LATENCY",
-          "FLAG_DEEP_BUFFER",
-          "USAGE_NOTIFICATION",
-          "SUPPRESSIBLE_USAGES",
-          "SUPPRESSIBLE_CALL",
-          "USAGE_NOTIFICATION_COMMUNICATION_INSTANT",
-          "USAGE_NOTIFICATION_RINGTONE",
-          "USAGE_NOTIFICATION_EVENT",
-          "USAGE_VIRTUAL_SOURCE",
-          "FLAG_BYPASS_MUTE",
-          "USAGE_ASSISTANCE_SONIFICATION",
-          "CONTENT_TYPE_SPEECH",
-          "FLAG_BYPASS_INTERRUPTION_POLICY",
-          "SDK_USAGES",
-          "USAGE_GAME",
-          "USAGE_UNKNOWN",
-          "USAGE_NOTIFICATION_COMMUNICATION_DELAYED",
-          "FLAG_ALL_PUBLIC",
-          "FLAG_SCO",
-          "FLAG_SECURE",
-          "FLAG_ALL",
-          "USAGE_VOICE_COMMUNICATION",
-          "USAGE_VOICE_COMMUNICATION_SIGNALLING",
-          "USAGE_MEDIA",
-          "USAGE_ALARM",
-          "CONTENT_TYPE_MOVIE",
-          "TAG",
-          "FLAG_HW_AV_SYNC",
-          "sForceLegacyBehavior",
-          "USAGE_ASSISTANCE_NAVIGATION_GUIDANCE",
-          "FLAG_BEACON",
-          "CONTENT_TYPE_UNKNOWN",
-          "USAGE_ASSISTANT",
-          "FLAG_AUDIBILITY_ENFORCED",
-          "FLAG_HW_HOTWORD",
-          "USAGE_NOTIFICATION_COMMUNICATION_REQUEST",
-          "USAGE_ASSISTANCE_ACCESSIBILITY",
-          "CONTENT_TYPE_MUSIC",
-          "SUPPRESSIBLE_NOTIFICATION",
-          "CONTENT_TYPE_SONIFICATION"
-        ]
-      },
-      "android/support/v7/mediarouter/R$id": {
-        "androidx/mediarouter/R$id": [
-          "mr_custom_control",
-          "mr_art",
-          "mr_name",
-          "mr_control_subtitle",
-          "mr_control_title",
-          "mr_control_playback_ctrl",
-          "mr_chooser_title",
-          "mr_group_expand_collapse",
-          "mr_close",
-          "mr_chooser_list",
-          "mr_volume_group_list",
-          "mr_expandable_area",
-          "mr_chooser_route_desc",
-          "mr_chooser_route_icon",
-          "mr_control_divider",
-          "volume_item_container",
-          "mr_chooser_route_name",
-          "mr_volume_control",
-          "mr_dialog_area",
-          "mr_default_control",
-          "mr_volume_slider",
-          "mr_volume_item_icon",
-          "mr_media_main_control",
-          "mr_playback_control",
-          "mr_control_title_container"
-        ]
-      },
-      "android/support/text/emoji/flatbuffer/Table": {
-        "androidx/text/emoji/flatbuffer/Table": [
-          "UTF8_CHARSET",
-          "bb",
-          "bb_pos",
-          "UTF8_DECODER",
-          "CHAR_BUFFER"
-        ]
-      },
-      "android/support/v17/leanback/R$id": {
-        "androidx/leanback/R$id": [
-          "paused",
-          "content_container",
-          "guidedactions_item_title",
-          "container_list",
-          "lb_parallax_source",
-          "description_dock",
-          "guidedactions_list",
-          "browse_grid_dock",
-          "details_overview_image",
-          "scale_frame",
-          "details_overview_right_panel",
-          "playback_progress",
-          "guidedactions_sub_list_background",
-          "guidedactions_root2",
-          "mediaItemDetails",
-          "button_start",
-          "title_badge",
-          "lb_search_text_editor",
-          "bottom_spacer",
-          "lb_slide_transition_value",
-          "info_field",
-          "mediaItemActionsContainer",
-          "thumbs_row",
-          "controls_container",
-          "guidedactions_list_background2",
-          "guidedactions_item_content",
-          "lb_action_button",
-          "guidedactions_item_icon",
-          "guidedactions_item_checkmark",
-          "lb_control_closed_captioning",
-          "browse_grid",
-          "title_orb",
-          "details_root",
-          "guidedactions_list_background",
-          "total_time",
-          "controls_card",
-          "lb_control_more_actions",
-          "lb_control_shuffle",
-          "mediaRowSeparator",
-          "image",
-          "lb_control_fast_rewind",
-          "row_header",
-          "controls_card_right_panel",
-          "description",
-          "background_imagein",
-          "title_text",
-          "details_fragment_root",
-          "playback_fragment_background",
-          "browse_frame",
-          "title",
-          "current_time",
-          "browse_headers_dock",
-          "guidedactions_sub_list",
-          "details_overview_actions_background",
-          "background_imageout",
-          "guidedactions_item_chevron",
-          "mediaItemDuration",
-          "lb_control_skip_previous",
-          "browse_container_dock",
-          "lb_control_skip_next",
-          "mediaListHeader",
-          "main_image",
-          "lb_control_thumbs_down",
-          "mediaItemNumberViewFlipper",
-          "details_overview",
-          "actionIcon",
-          "guidedactions_item_description",
-          "guidance_container",
-          "guidedstep_background",
-          "guidedactions_activator_item",
-          "transport_row",
-          "playback_controls_dock",
-          "page_container",
-          "lb_shadow_focused",
-          "icon",
-          "guidedactions_content",
-          "playing",
-          "lb_control_high_quality",
-          "guidance_description",
-          "details_frame",
-          "guidance_icon",
-          "control_bar",
-          "page_indicator",
-          "lb_search_bar_speech_orb",
-          "details_rows_dock",
-          "row_header_description",
-          "lb_control_thumbs_up",
-          "secondary_controls_dock",
-          "button",
-          "lb_shadow_impl",
-          "lb_focus_animator",
-          "spacer",
-          "lb_search_bar_badge",
-          "initial",
-          "lb_control_repeat",
-          "guidedactions_content2",
-          "guidance_title",
-          "message",
-          "action_fragment_root",
-          "lb_shadow_normal",
-          "guidedactions_root",
-          "lb_details_description_title",
-          "guidance_breadcrumb",
-          "action_fragment",
-          "background_container",
-          "lb_row_container_header_dock",
-          "details_background_view",
-          "browse_title_group",
-          "main_icon",
-          "video_surface_container",
-          "lb_search_frame",
-          "picker",
-          "lb_control_play_pause",
-          "lb_details_description_body",
-          "controls_dock",
-          "lb_control_picture_in_picture",
-          "lb_results_frame",
-          "grid_frame",
-          "lb_control_fast_forward",
-          "details_overview_description",
-          "mediaItemRow",
-          "mediaItemName",
-          "content_fragment",
-          "details_overview_actions",
-          "more_actions_dock",
-          "fade_out_edge",
-          "label",
-          "action_fragment_background",
-          "browse_headers",
-          "foreground_container",
-          "transitionPosition",
-          "lb_search_bar",
-          "error_frame",
-          "guidedactions_list2",
-          "lb_details_description_subtitle",
-          "lb_search_bar_items",
-          "mediaRowSelector",
-          "bar3",
-          "bar2",
-          "bar1",
-          "logo",
-          "search_orb",
-          "row_content",
-          "guidedstep_background_view_root"
-        ]
-      },
-      "android/support/v17/leanback/widget/picker/Picker$ViewHolder": {
-        "androidx/leanback/widget/picker/Picker$ViewHolder": [
-          "textView",
-          "itemView"
-        ]
-      },
-      "android/support/v4/media/MediaMetadataCompat": {
-        "androidx/media/MediaMetadataCompat": [
-          "METADATA_KEY_COMPILATION",
-          "METADATA_KEY_ART",
-          "METADATA_KEY_NUM_TRACKS",
-          "METADATA_KEY_ALBUM",
-          "METADATA_TYPE_TEXT",
-          "METADATA_TYPE_LONG",
-          "METADATA_KEY_TRACK_NUMBER",
-          "METADATA_KEY_ARTIST",
-          "METADATA_KEY_DOWNLOAD_STATUS",
-          "METADATA_KEY_AUTHOR",
-          "METADATA_KEY_DATE",
-          "METADATA_KEY_DISPLAY_TITLE",
-          "METADATA_KEY_DISPLAY_DESCRIPTION",
-          "METADATA_KEY_DURATION",
-          "METADATA_KEY_YEAR",
-          "METADATA_TYPE_BITMAP",
-          "METADATA_KEY_USER_RATING",
-          "METADATA_KEY_ALBUM_ART_URI",
-          "METADATA_KEY_MEDIA_URI",
-          "METADATA_KEY_MEDIA_ID",
-          "PREFERRED_BITMAP_ORDER",
-          "CREATOR",
-          "METADATA_KEY_BT_FOLDER_TYPE",
-          "METADATA_KEY_TITLE",
-          "METADATA_KEY_DISPLAY_ICON_URI",
-          "PREFERRED_URI_ORDER",
-          "METADATA_TYPE_RATING",
-          "METADATA_KEY_WRITER",
-          "PREFERRED_DESCRIPTION_ORDER",
-          "TAG",
-          "METADATA_KEY_COMPOSER",
-          "METADATA_KEY_ALBUM_ART",
-          "METADATA_KEY_GENRE",
-          "METADATA_KEY_ART_URI",
-          "METADATA_KEY_DISPLAY_ICON",
-          "METADATA_KEY_ALBUM_ARTIST",
-          "METADATA_KEY_ADVERTISEMENT",
-          "METADATA_KEYS_TYPE",
-          "METADATA_KEY_RATING",
-          "METADATA_KEY_DISPLAY_SUBTITLE",
-          "METADATA_KEY_DISC_NUMBER"
-        ]
-      },
-      "android/support/transition/Fade": {
-        "androidx/transition/Fade": [
-          "PROPNAME_TRANSITION_ALPHA",
-          "IN",
-          "LOG_TAG",
-          "OUT"
-        ]
-      },
-      "android/support/v17/leanback/R$layout": {
-        "androidx/leanback/R$layout": [
-          "lb_rows_fragment",
-          "lb_video_surface",
-          "lb_headers_fragment",
-          "lb_image_card_view_themed_badge_left",
-          "lb_search_orb",
-          "lb_details_fragment",
-          "lb_guidedstep_fragment",
-          "lb_image_card_view",
-          "lb_details_overview",
-          "lb_playback_controls",
-          "lb_guidedactions_datepicker_item",
-          "lb_image_card_view_themed_title",
-          "lb_picker_column",
-          "lb_playback_transport_controls_row",
-          "lb_image_card_view_themed_badge_right",
-          "lb_row_media_item",
-          "lb_row_container",
-          "lb_search_bar",
-          "lb_shadow",
-          "lb_error_fragment",
-          "lb_guidedbuttonactions",
-          "lb_browse_fragment",
-          "lb_guidedactions_item",
-          "lb_browse_title",
-          "lb_list_row",
-          "lb_section_header",
-          "lb_image_card_view_themed_content",
-          "lb_action_1_line",
-          "lb_media_list_header",
-          "lb_media_item_number_view_flipper",
-          "lb_vertical_grid_fragment",
-          "lb_divider",
-          "lb_details_description",
-          "lb_playback_now_playing_bars",
-          "lb_row_media_item_action",
-          "lb_fullwidth_details_overview",
-          "lb_picker",
-          "lb_guidedstep_background",
-          "lb_guidance",
-          "lb_picker_item",
-          "lb_speech_orb",
-          "lb_vertical_grid",
-          "lb_control_button_primary",
-          "lb_search_fragment",
-          "lb_playback_fragment",
-          "lb_picker_separator",
-          "lb_onboarding_fragment",
-          "lb_playback_controls_row",
-          "lb_row_header",
-          "lb_list_row_hovercard",
-          "lb_control_bar",
-          "lb_header",
-          "lb_guidedactions",
-          "lb_action_2_lines",
-          "lb_control_button_secondary",
-          "lb_title_view",
-          "lb_fullwidth_details_overview_logo"
-        ]
-      },
-      "android/support/v4/app/NotificationCompat": {
-        "androidx/app/NotificationCompat": [
-          "EXTRA_BACKGROUND_IMAGE_URI",
-          "FLAG_FOREGROUND_SERVICE",
-          "CATEGORY_SYSTEM",
-          "EXTRA_REMOTE_INPUT_HISTORY",
-          "EXTRA_LARGE_ICON",
-          "EXTRA_SHOW_WHEN",
-          "EXTRA_COMPACT_ACTIONS",
-          "CATEGORY_ERROR",
-          "GROUP_ALERT_CHILDREN",
-          "BADGE_ICON_LARGE",
-          "PRIORITY_DEFAULT",
-          "EXTRA_PEOPLE",
-          "STREAM_DEFAULT",
-          "VISIBILITY_PRIVATE",
-          "FLAG_ONLY_ALERT_ONCE",
-          "CATEGORY_EMAIL",
-          "DEFAULT_VIBRATE",
-          "CATEGORY_PROGRESS",
-          "FLAG_ONGOING_EVENT",
-          "EXTRA_PROGRESS_MAX",
-          "EXTRA_TITLE",
-          "CATEGORY_PROMO",
-          "EXTRA_SELF_DISPLAY_NAME",
-          "VISIBILITY_SECRET",
-          "PRIORITY_LOW",
-          "EXTRA_LARGE_ICON_BIG",
-          "CATEGORY_TRANSPORT",
-          "DEFAULT_SOUND",
-          "CATEGORY_CALL",
-          "EXTRA_SMALL_ICON",
-          "CATEGORY_RECOMMENDATION",
-          "EXTRA_PROGRESS",
-          "PRIORITY_HIGH",
-          "EXTRA_CONVERSATION_TITLE",
-          "GROUP_ALERT_SUMMARY",
-          "EXTRA_INFO_TEXT",
-          "BADGE_ICON_NONE",
-          "EXTRA_BIG_TEXT",
-          "EXTRA_TEXT_LINES",
-          "EXTRA_PICTURE",
-          "PRIORITY_MIN",
-          "FLAG_HIGH_PRIORITY",
-          "COLOR_DEFAULT",
-          "PRIORITY_MAX",
-          "EXTRA_TEMPLATE",
-          "FLAG_LOCAL_ONLY",
-          "CATEGORY_ALARM",
-          "EXTRA_SUMMARY_TEXT",
-          "BADGE_ICON_SMALL",
-          "DEFAULT_ALL",
-          "CATEGORY_STATUS",
-          "CATEGORY_EVENT",
-          "GROUP_ALERT_ALL",
-          "EXTRA_SHOW_CHRONOMETER",
-          "DEFAULT_LIGHTS",
-          "VISIBILITY_PUBLIC",
-          "CATEGORY_SOCIAL",
-          "CATEGORY_MESSAGE",
-          "FLAG_INSISTENT",
-          "CATEGORY_REMINDER",
-          "EXTRA_AUDIO_CONTENTS_URI",
-          "CATEGORY_SERVICE",
-          "EXTRA_TITLE_BIG",
-          "FLAG_AUTO_CANCEL",
-          "EXTRA_MEDIA_SESSION",
-          "EXTRA_MESSAGES",
-          "EXTRA_TEXT",
-          "FLAG_SHOW_LIGHTS",
-          "FLAG_GROUP_SUMMARY",
-          "FLAG_NO_CLEAR",
-          "EXTRA_SUB_TEXT",
-          "EXTRA_PROGRESS_INDETERMINATE"
-        ]
-      },
-      "android/support/animation/AnimationHandler": {
-        "androidx/animation/AnimationHandler": [
-          "sAnimatorHandler",
-          "FRAME_DELAY_MS"
-        ]
-      },
-      "android/support/media/ExifInterface": {
-        "androidx/media/ExifInterface": [
-          "FLAG_FLASH_RED_EYE_SUPPORTED",
-          "sTagSetForCompatibility",
-          "TAG_CUSTOM_RENDERED",
-          "TAG_SENSITIVITY_TYPE",
-          "GAIN_CONTROL_HIGH_GAIN_UP",
-          "TAG_FOCAL_PLANE_Y_RESOLUTION",
-          "LIGHT_SOURCE_OTHER",
-          "TAG_GPS_TIMESTAMP",
-          "TAG_COMPRESSION",
-          "IFD_INTEROPERABILITY_TAGS",
-          "IFD_FORMAT_DOUBLE",
-          "TAG_PIXEL_Y_DIMENSION",
-          "TAG_GPS_IMG_DIRECTION_REF",
-          "JPEG_INTERCHANGE_FORMAT_LENGTH_TAG",
-          "FLIPPED_ROTATION_ORDER",
-          "LIGHT_SOURCE_WARM_WHITE_FLUORESCENT",
-          "LIGHT_SOURCE_UNKNOWN",
-          "WHITE_BALANCE_MANUAL",
-          "TAG_SUBSEC_TIME",
-          "FILE_SOURCE_DSC",
-          "IFD_FORMAT_SSHORT",
-          "MARKER",
-          "LONGITUDE_WEST",
-          "IMAGE_TYPE_UNKNOWN",
-          "METERING_MODE_SPOT",
-          "IMAGE_TYPE_CR2",
-          "TAG_GPS_DOP",
-          "MAX_THUMBNAIL_SIZE",
-          "SENSOR_TYPE_TWO_CHIP",
-          "TAG_GPS_TRACK",
-          "SENSITIVITY_TYPE_REI_AND_ISO",
-          "SENSOR_TYPE_ONE_CHIP",
-          "GPS_MEASUREMENT_NO_DIFFERENTIAL",
-          "ORIENTATION_ROTATE_90",
-          "TAG_WHITE_POINT",
-          "PEF_SIGNATURE",
-          "TAG_GPS_IMG_DIRECTION",
-          "ORIGINAL_RESOLUTION_IMAGE",
-          "METERING_MODE_CENTER_WEIGHT_AVERAGE",
-          "TAG_ORF_CAMERA_SETTINGS_IFD_POINTER",
-          "TAG_ISO_SPEED",
-          "IMAGE_TYPE_DNG",
-          "GAIN_CONTROL_NONE",
-          "LONGITUDE_EAST",
-          "IFD_TYPE_ORF_MAKER_NOTE",
-          "TAG_DEVICE_SETTING_DESCRIPTION",
-          "TAG_BRIGHTNESS_VALUE",
-          "TAG_GPS_MAP_DATUM",
-          "METERING_MODE_MULTI_SPOT",
-          "TAG_RW2_ISO",
-          "TAG_ORF_PREVIEW_IMAGE_START",
-          "LIGHT_SOURCE_FLUORESCENT",
-          "COLOR_SPACE_S_RGB",
-          "IMAGE_TYPE_SRW",
-          "FLAG_FLASH_RETURN_LIGHT_DETECTED",
-          "SUBJECT_DISTANCE_RANGE_DISTANT_VIEW",
-          "TAG_ISO_SPEED_LATITUDE_YYY",
-          "RAF_INFO_SIZE",
-          "TAG",
-          "ORIENTATION_NORMAL",
-          "TAG_SUB_IFD_POINTER",
-          "LIGHT_SOURCE_TUNGSTEN",
-          "RESOLUTION_UNIT_CENTIMETERS",
-          "ALTITUDE_ABOVE_SEA_LEVEL",
-          "BYTE_ALIGN_MM",
-          "METERING_MODE_OTHER",
-          "TAG_EXIF_IFD_POINTER",
-          "BYTE_ALIGN_II",
-          "TAG_GPS_TRACK_REF",
-          "SHARPNESS_NORMAL",
-          "FILE_SOURCE_OTHER",
-          "TAG_OECF",
-          "SENSOR_TYPE_COLOR_SEQUENTIAL",
-          "sFormatter",
-          "FLAG_FLASH_MODE_COMPULSORY_FIRING",
-          "GPS_SPEED_KNOTS",
-          "DATA_DEFLATE_ZIP",
-          "TAG_DNG_VERSION",
-          "IMAGE_TYPE_ARW",
-          "TAG_RELATED_SOUND_FILE",
-          "TAG_BODY_SERIAL_NUMBER",
-          "EXPOSURE_PROGRAM_NOT_DEFINED",
-          "SIGNATURE_CHECK_SIZE",
-          "JPEG_INTERCHANGE_FORMAT_TAG",
-          "TAG_RW2_SENSOR_RIGHT_BORDER",
-          "TAG_CAMARA_OWNER_NAME",
-          "TAG_SPATIAL_FREQUENCY_RESPONSE",
-          "COLOR_SPACE_UNCALIBRATED",
-          "EXPOSURE_PROGRAM_NORMAL",
-          "EXPOSURE_PROGRAM_SHUTTER_PRIORITY",
-          "TAG_THUMBNAIL_LENGTH",
-          "TAG_TRANSFER_FUNCTION",
-          "IMAGE_TYPE_RW2",
-          "TAG_RW2_SENSOR_LEFT_BORDER",
-          "TAG_CFA_PATTERN",
-          "TAG_THUMBNAIL_IMAGE_LENGTH",
-          "TAG_GPS_H_POSITIONING_ERROR",
-          "sGpsTimestampPattern",
-          "PEF_MAKER_NOTE_SKIP_SIZE",
-          "IFD_FORMAT_STRING",
-          "TAG_SUBJECT_DISTANCE",
-          "TAG_GPS_SPEED_REF",
-          "SENSITIVITY_TYPE_SOS_AND_REI_AND_ISO",
-          "TAG_ORIENTATION",
-          "TAG_PHOTOMETRIC_INTERPRETATION",
-          "LIGHT_SOURCE_DAYLIGHT",
-          "TAG_MODEL",
-          "IFD_TYPE_GPS",
-          "LIGHT_SOURCE_SHADE",
-          "Y_CB_CR_POSITIONING_CO_SITED",
-          "TAG_RAF_IMAGE_SIZE",
-          "IFD_FORMAT_BYTES_PER_FORMAT",
-          "SENSITIVITY_TYPE_SOS_AND_REI",
-          "TAG_Y_RESOLUTION",
-          "TAG_GPS_DIFFERENTIAL",
-          "EXPOSURE_MODE_AUTO",
-          "MARKER_SOS",
-          "MARKER_SOI",
-          "IFD_TYPE_PREVIEW",
-          "IMAGE_TYPE_RAF",
-          "IFD_FORMAT_SBYTE",
-          "ORIENTATION_FLIP_VERTICAL",
-          "TAG_LENS_SERIAL_NUMBER",
-          "TAG_FLASHPIX_VERSION",
-          "EXIF_ASCII_PREFIX",
-          "IFD_TYPE_ORF_IMAGE_PROCESSING",
-          "TAG_ORF_IMAGE_PROCESSING_IFD_POINTER",
-          "DATA_LOSSY_JPEG",
-          "TAG_GPS_SPEED",
-          "TAG_USER_COMMENT",
-          "TAG_SUBSEC_TIME_ORIGINAL",
-          "TAG_THUMBNAIL_IMAGE_WIDTH",
-          "IFD_FORMAT_UNDEFINED",
-          "RW2_SIGNATURE",
-          "ORF_MAKER_NOTE_HEADER_2",
-          "ORF_MAKER_NOTE_HEADER_1",
-          "TAG_WHITE_BALANCE",
-          "TAG_ISO_SPEED_LATITUDE_ZZZ",
-          "TAG_PHOTOGRAPHIC_SENSITIVITY",
-          "SCENE_CAPTURE_TYPE_LANDSCAPE",
-          "MARKER_COM",
-          "TAG_HAS_THUMBNAIL",
-          "TAG_EXPOSURE_TIME",
-          "TAG_GPS_SATELLITES",
-          "TAG_COLOR_SPACE",
-          "TAG_GPS_LATITUDE_REF",
-          "IMAGE_TYPE_JPEG",
-          "START_CODE",
-          "TAG_APERTURE_VALUE",
-          "TAG_BITS_PER_SAMPLE",
-          "TAG_DIGITAL_ZOOM_RATIO",
-          "METERING_MODE_PATTERN",
-          "TAG_SHUTTER_SPEED_VALUE",
-          "DATA_PACK_BITS_COMPRESSED",
-          "sExifPointerTagMap",
-          "EXPOSURE_PROGRAM_APERTURE_PRIORITY",
-          "TAG_SAMPLES_PER_PIXEL",
-          "TAG_FILE_SOURCE",
-          "LIGHT_SOURCE_DAY_WHITE_FLUORESCENT",
-          "IFD_EXIF_TAGS",
-          "TAG_GPS_INFO_IFD_POINTER",
-          "TAG_GAMMA",
-          "IMAGE_TYPE_ORF",
-          "TAG_GAIN_CONTROL",
-          "IFD_TYPE_EXIF",
-          "TAG_SUBJECT_AREA",
-          "FORMAT_CHUNKY",
-          "ASCII",
-          "ORF_IMAGE_PROCESSING_TAGS",
-          "TAG_ORF_THUMBNAIL_IMAGE",
-          "IMAGE_TYPE_PEF",
-          "IFD_TYPE_ORF_CAMERA_SETTINGS",
-          "EXPOSURE_MODE_MANUAL",
-          "TAG_GPS_DATESTAMP",
-          "IFD_FORMAT_SRATIONAL",
-          "TAG_SUBJECT_LOCATION",
-          "FILE_SOURCE_REFLEX_SCANNER",
-          "TAG_LENS_SPECIFICATION",
-          "LIGHT_SOURCE_DAYLIGHT_FLUORESCENT",
-          "TAG_COMPONENTS_CONFIGURATION",
-          "TAG_REFERENCE_BLACK_WHITE",
-          "IMAGE_TYPE_NEF",
-          "GAIN_CONTROL_HIGH_GAIN_DOWN",
-          "LIGHT_SOURCE_ISO_STUDIO_TUNGSTEN",
-          "ORIENTATION_TRANSVERSE",
-          "IFD_FORMAT_URATIONAL",
-          "EXPOSURE_PROGRAM_LANDSCAPE_MODE",
-          "IMAGE_TYPE_NRW",
-          "TAG_FLASH",
-          "RAF_SIGNATURE",
-          "EXPOSURE_PROGRAM_ACTION",
-          "TAG_PLANAR_CONFIGURATION",
-          "LIGHT_SOURCE_CLOUDY_WEATHER",
-          "FLAG_FLASH_FIRED",
-          "EXPOSURE_MODE_AUTO_BRACKET",
-          "ORIENTATION_TRANSPOSE",
-          "REDUCED_RESOLUTION_IMAGE",
-          "WHITE_BALANCE_AUTO",
-          "TAG_FOCAL_PLANE_RESOLUTION_UNIT",
-          "PHOTOMETRIC_INTERPRETATION_BLACK_IS_ZERO",
-          "DATA_UNCOMPRESSED",
-          "MARKER_EOI",
-          "TAG_SUBSEC_TIME_DIGITIZED",
-          "TAG_THUMBNAIL_DATA",
-          "TAG_GPS_DEST_BEARING_REF",
-          "EXPOSURE_PROGRAM_PORTRAIT_MODE",
-          "TAG_GPS_ALTITUDE",
-          "DATA_JPEG",
-          "TAG_GPS_DEST_LATITUDE_REF",
-          "ALTITUDE_BELOW_SEA_LEVEL",
-          "TAG_F_NUMBER",
-          "SUBJECT_DISTANCE_RANGE_UNKNOWN",
-          "TAG_SPECTRAL_SENSITIVITY",
-          "SCENE_CAPTURE_TYPE_NIGHT",
-          "TAG_PIXEL_X_DIMENSION",
-          "TAG_DEFAULT_CROP_SIZE",
-          "LIGHT_SOURCE_D75",
-          "LIGHT_SOURCE_D65",
-          "GPS_MEASUREMENT_INTERRUPTED",
-          "TAG_GPS_DEST_DISTANCE",
-          "LIGHT_SOURCE_D50",
-          "LIGHT_SOURCE_D55",
-          "ORIENTATION_ROTATE_180",
-          "SATURATION_NORMAL",
-          "TAG_THUMBNAIL_OFFSET",
-          "RESOLUTION_UNIT_INCHES",
-          "ORF_CAMERA_SETTINGS_TAGS",
-          "IFD_FORMAT_BYTE",
-          "TAG_LENS_MAKE",
-          "JPEG_SIGNATURE",
-          "EXPOSURE_PROGRAM_MANUAL",
-          "EXPOSURE_PROGRAM_CREATIVE",
-          "SUBJECT_DISTANCE_RANGE_CLOSE_VIEW",
-          "TAG_MAX_APERTURE_VALUE",
-          "DEBUG",
-          "METERING_MODE_AVERAGE",
-          "RENDERED_PROCESS_NORMAL",
-          "LIGHT_SOURCE_STANDARD_LIGHT_B",
-          "LIGHT_SOURCE_STANDARD_LIGHT_C",
-          "LIGHT_SOURCE_STANDARD_LIGHT_A",
-          "TAG_ISO_SPEED_RATINGS",
-          "TAG_STANDARD_OUTPUT_SENSITIVITY",
-          "PHOTOMETRIC_INTERPRETATION_YCBCR",
-          "TAG_ARTIST",
-          "IFD_TYPE_THUMBNAIL",
-          "PHOTOMETRIC_INTERPRETATION_WHITE_IS_ZERO",
-          "FLAG_FLASH_RETURN_LIGHT_NOT_DETECTED",
-          "TAG_FOCAL_PLANE_X_RESOLUTION",
-          "TAG_LIGHT_SOURCE",
-          "MARKER_SOF1",
-          "MARKER_SOF2",
-          "MARKER_SOF0",
-          "MARKER_SOF9",
-          "MARKER_SOF7",
-          "MARKER_SOF5",
-          "MARKER_SOF6",
-          "MARKER_SOF3",
-          "sExifTagMapsForWriting",
-          "SHARPNESS_SOFT",
-          "TAG_SCENE_TYPE",
-          "TAG_GPS_DEST_LONGITUDE",
-          "sNonZeroTimePattern",
-          "GPS_DIRECTION_MAGNETIC",
-          "EXIF_TAGS",
-          "TAG_GPS_AREA_INFORMATION",
-          "FLAG_FLASH_MODE_COMPULSORY_SUPPRESSION",
-          "IFD_THUMBNAIL_TAGS",
-          "IFD_FORMAT_ULONG",
-          "TAG_INTEROPERABILITY_IFD_POINTER",
-          "TAG_SUBFILE_TYPE",
-          "TAG_RW2_SENSOR_TOP_BORDER",
-          "TAG_INTEROPERABILITY_INDEX",
-          "GPS_MEASUREMENT_3D",
-          "GPS_DIRECTION_TRUE",
-          "GPS_MEASUREMENT_2D",
-          "sExifTagMapsForReading",
-          "TAG_JPEG_INTERCHANGE_FORMAT",
-          "LATITUDE_SOUTH",
-          "PHOTOMETRIC_INTERPRETATION_RGB",
-          "BITS_PER_SAMPLE_RGB",
-          "CONTRAST_HARD",
-          "SHARPNESS_HARD",
-          "LATITUDE_NORTH",
-          "TAG_CONTRAST",
-          "ORIENTATION_FLIP_HORIZONTAL",
-          "TAG_GPS_LONGITUDE",
-          "TAG_COMPRESSED_BITS_PER_PIXEL",
-          "TAG_METERING_MODE",
-          "BITS_PER_SAMPLE_GREYSCALE_1",
-          "BITS_PER_SAMPLE_GREYSCALE_2",
-          "TAG_ROWS_PER_STRIP",
-          "GPS_DISTANCE_MILES",
-          "TAG_MAKER_NOTE",
-          "SUBJECT_DISTANCE_RANGE_MACRO",
-          "GAIN_CONTROL_LOW_GAIN_DOWN",
-          "SATURATION_HIGH",
-          "SCENE_TYPE_DIRECTLY_PHOTOGRAPHED",
-          "LIGHT_SOURCE_WHITE_FLUORESCENT",
-          "TAG_SHARPNESS",
-          "GPS_DISTANCE_KILOMETERS",
-          "TAG_GPS_LATITUDE",
-          "TAG_RW2_SENSOR_BOTTOM_BORDER",
-          "WHITEBALANCE_AUTO",
-          "TAG_SCENE_CAPTURE_TYPE",
-          "TAG_STRIP_BYTE_COUNTS",
-          "TAG_GPS_LONGITUDE_REF",
-          "GPS_MEASUREMENT_IN_PROGRESS",
-          "ORIENTATION_UNDEFINED",
-          "RAF_OFFSET_TO_JPEG_IMAGE_OFFSET",
-          "TAG_SUBJECT_DISTANCE_RANGE",
-          "ROTATION_ORDER",
-          "TAG_GPS_STATUS",
-          "ORF_MAKER_NOTE_HEADER_1_SIZE",
-          "TAG_GPS_DEST_BEARING",
-          "TAG_Y_CB_CR_COEFFICIENTS",
-          "TAG_MAKE",
-          "IFD_TYPE_PEF",
-          "TAG_RESOLUTION_UNIT",
-          "TAG_IMAGE_DESCRIPTION",
-          "SENSOR_TYPE_NOT_DEFINED",
-          "ORF_MAKER_NOTE_HEADER_2_SIZE",
-          "IFD_FORMAT_IFD",
-          "TAG_SATURATION",
-          "TAG_FOCAL_LENGTH_IN_35MM_FILM",
-          "TAG_FOCAL_LENGTH",
-          "SENSITIVITY_TYPE_SOS_AND_ISO",
-          "TAG_EXIF_VERSION",
-          "TAG_ORF_PREVIEW_IMAGE_LENGTH",
-          "GPS_MEASUREMENT_DIFFERENTIAL_CORRECTED",
-          "IFD_FORMAT_SINGLE",
-          "CONTRAST_NORMAL",
-          "TAG_PRIMARY_CHROMATICITIES",
-          "TAG_LENS_MODEL",
-          "TAG_IMAGE_LENGTH",
-          "TAG_RW2_JPG_FROM_RAW",
-          "SATURATION_LOW",
-          "TAG_SOFTWARE",
-          "IFD_TIFF_TAGS",
-          "SENSITIVITY_TYPE_ISO_SPEED",
-          "TAG_GPS_PROCESSING_METHOD",
-          "TAG_X_RESOLUTION",
-          "LIGHT_SOURCE_COOL_WHITE_FLUORESCENT",
-          "DATA_HUFFMAN_COMPRESSED",
-          "SENSOR_TYPE_THREE_CHIP",
-          "TAG_IMAGE_WIDTH",
-          "METERING_MODE_PARTIAL",
-          "SENSOR_TYPE_COLOR_SEQUENTIAL_LINEAR",
-          "LIGHT_SOURCE_FINE_WEATHER",
-          "TAG_EXPOSURE_INDEX",
-          "TAG_STRIP_OFFSETS",
-          "TAG_EXPOSURE_PROGRAM",
-          "TAG_IMAGE_UNIQUE_ID",
-          "IFD_FORMAT_USHORT",
-          "TAG_GPS_VERSION_ID",
-          "CONTRAST_SOFT",
-          "TAG_DATETIME_DIGITIZED",
-          "EXIF_POINTER_TAGS",
-          "FLAG_FLASH_NO_FLASH_FUNCTION",
-          "IFD_FORMAT_NAMES",
-          "ORF_MAKER_NOTE_TAGS",
-          "TAG_EXPOSURE_BIAS_VALUE",
-          "TAG_GPS_DEST_LONGITUDE_REF",
-          "IFD_OFFSET",
-          "ORF_SIGNATURE_1",
-          "ORF_SIGNATURE_2",
-          "METERING_MODE_UNKNOWN",
-          "GPS_SPEED_KILOMETERS_PER_HOUR",
-          "FORMAT_PLANAR",
-          "MARKER_SOF10",
-          "MARKER_SOF11",
-          "MARKER_SOF13",
-          "MARKER_SOF14",
-          "MARKER_SOF15",
-          "IFD_FORMAT_SLONG",
-          "TAG_COPYRIGHT",
-          "TAG_GPS_DEST_DISTANCE_REF",
-          "TAG_GPS_MEASURE_MODE",
-          "Y_CB_CR_POSITIONING_CENTERED",
-          "TAG_Y_CB_CR_POSITIONING",
-          "GPS_DISTANCE_NAUTICAL_MILES",
-          "WHITEBALANCE_MANUAL",
-          "GAIN_CONTROL_LOW_GAIN_UP",
-          "IDENTIFIER_EXIF_APP1",
-          "DATA_JPEG_COMPRESSED",
-          "SCENE_CAPTURE_TYPE_PORTRAIT",
-          "GPS_SPEED_MILES_PER_HOUR",
-          "IFD_TYPE_PRIMARY",
-          "TAG_Y_CB_CR_SUB_SAMPLING",
-          "TAG_GPS_ALTITUDE_REF",
-          "SENSITIVITY_TYPE_SOS",
-          "TAG_SENSING_METHOD",
-          "TAG_ORF_ASPECT_FRAME",
-          "TAG_NEW_SUBFILE_TYPE",
-          "TAG_EXPOSURE_MODE",
-          "ORIENTATION_ROTATE_270",
-          "IFD_GPS_TAGS",
-          "RAF_JPEG_LENGTH_VALUE_SIZE",
-          "TAG_FLASH_ENERGY",
-          "TAG_RECOMMENDED_EXPOSURE_INDEX",
-          "SENSOR_TYPE_TRILINEAR",
-          "SCENE_CAPTURE_TYPE_STANDARD",
-          "PEF_TAGS",
-          "SENSITIVITY_TYPE_UNKNOWN",
-          "TAG_DATETIME",
-          "TAG_JPEG_INTERCHANGE_FORMAT_LENGTH",
-          "LIGHT_SOURCE_FLASH",
-          "FLAG_FLASH_MODE_AUTO",
-          "MARKER_APP1",
-          "SENSITIVITY_TYPE_REI",
-          "TAG_DATETIME_ORIGINAL",
-          "TAG_GPS_DEST_LATITUDE",
-          "FILE_SOURCE_TRANSPARENT_SCANNER",
-          "RENDERED_PROCESS_CUSTOM",
-          "IFD_TYPE_INTEROPERABILITY"
-        ]
-      },
-      "android/support/v4/widget/ViewDragHelper": {
-        "androidx/widget/ViewDragHelper": [
-          "DIRECTION_HORIZONTAL",
-          "TAG",
-          "INVALID_POINTER",
-          "EDGE_SIZE",
-          "EDGE_LEFT",
-          "STATE_IDLE",
-          "STATE_DRAGGING",
-          "EDGE_ALL",
-          "DIRECTION_ALL",
-          "EDGE_RIGHT",
-          "sInterpolator",
-          "EDGE_TOP",
-          "STATE_SETTLING",
-          "BASE_SETTLE_DURATION",
-          "EDGE_BOTTOM",
-          "MAX_SETTLE_DURATION",
-          "DIRECTION_VERTICAL"
-        ]
-      },
-      "android/support/design/widget/NavigationView": {
-        "androidx/design/widget/NavigationView": [
-          "EMPTY_STATE_SET",
-          "CHECKED_STATE_SET",
-          "PRESENTER_NAVIGATION_VIEW_ID",
-          "DISABLED_STATE_SET"
-        ]
-      },
-      "android/support/customtabs/ICustomTabsCallback$Stub": {
-        "androidx/browser/customtabs/ICustomTabsCallback$Stub": [
-          "TRANSACTION_onMessageChannelReady",
-          "TRANSACTION_onPostMessage",
-          "TRANSACTION_onNavigationEvent",
-          "TRANSACTION_onRelationshipValidationResult",
-          "TRANSACTION_extraCallback",
-          "DESCRIPTOR"
-        ]
-      },
-      "android/support/v7/media/MediaRouterJellybeanMr1$ActiveScanWorkaround": {
-        "androidx/media/MediaRouterJellybeanMr1$ActiveScanWorkaround": [
-          "WIFI_DISPLAY_SCAN_INTERVAL"
-        ]
-      },
-      "android/support/v17/leanback/widget/GridLayoutManager$LayoutParams": {
-        "androidx/leanback/widget/GridLayoutManager$LayoutParams": [
-          "bottomMargin",
-          "leftMargin",
-          "topMargin",
-          "width",
-          "height",
-          "rightMargin"
-        ]
-      },
-      "android/support/v7/cardview/R$styleable": {
-        "androidx/cardview/R$styleable": [
-          "CardView_contentPaddingRight",
-          "CardView",
-          "CardView_android_minWidth",
-          "CardView_cardCornerRadius",
-          "CardView_contentPaddingLeft",
-          "CardView_cardBackgroundColor",
-          "CardView_contentPadding",
-          "CardView_contentPaddingBottom",
-          "CardView_cardElevation",
-          "CardView_cardUseCompatPadding",
-          "CardView_contentPaddingTop",
-          "CardView_android_minHeight",
-          "CardView_cardPreventCornerOverlap",
-          "CardView_cardMaxElevation"
-        ]
-      },
-      "android/support/v17/leanback/widget/PlaybackControlsRow$ThumbsAction": {
-        "androidx/leanback/widget/PlaybackControlsRow$ThumbsAction": [
-          "INDEX_OUTLINE",
-          "OUTLINE",
-          "SOLID",
-          "INDEX_SOLID"
-        ]
-      },
-      "android/support/v4/media/session/IMediaSession$Stub": {
-        "androidx/media/session/IMediaSession$Stub": [
-          "TRANSACTION_playFromUri",
-          "TRANSACTION_playFromSearch",
-          "TRANSACTION_getRepeatMode",
-          "TRANSACTION_previous",
-          "TRANSACTION_getPlaybackState",
-          "TRANSACTION_adjustVolume",
-          "TRANSACTION_setShuffleMode",
-          "TRANSACTION_setVolumeTo",
-          "TRANSACTION_prepareFromSearch",
-          "TRANSACTION_removeQueueItemAt",
-          "TRANSACTION_playFromMediaId",
-          "TRANSACTION_getPackageName",
-          "TRANSACTION_sendCommand",
-          "TRANSACTION_isTransportControlEnabled",
-          "TRANSACTION_pause",
-          "DESCRIPTOR",
-          "TRANSACTION_rewind",
-          "TRANSACTION_getRatingType",
-          "TRANSACTION_prepareFromUri",
-          "TRANSACTION_getMetadata",
-          "TRANSACTION_addQueueItemAt",
-          "TRANSACTION_getQueueTitle",
-          "TRANSACTION_getLaunchPendingIntent",
-          "TRANSACTION_getQueue",
-          "TRANSACTION_registerCallbackListener",
-          "TRANSACTION_getShuffleMode",
-          "TRANSACTION_seekTo",
-          "TRANSACTION_prepareFromMediaId",
-          "TRANSACTION_setShuffleModeEnabledRemoved",
-          "TRANSACTION_removeQueueItem",
-          "TRANSACTION_setRepeatMode",
-          "TRANSACTION_getFlags",
-          "TRANSACTION_prepare",
-          "TRANSACTION_isShuffleModeEnabledRemoved",
-          "TRANSACTION_addQueueItem",
-          "TRANSACTION_isCaptioningEnabled",
-          "TRANSACTION_setCaptioningEnabled",
-          "TRANSACTION_rateWithExtras",
-          "TRANSACTION_stop",
-          "TRANSACTION_getVolumeAttributes",
-          "TRANSACTION_next",
-          "TRANSACTION_skipToQueueItem",
-          "TRANSACTION_rate",
-          "TRANSACTION_unregisterCallbackListener",
-          "TRANSACTION_play",
-          "TRANSACTION_getTag",
-          "TRANSACTION_sendMediaButton",
-          "TRANSACTION_sendCustomAction",
-          "TRANSACTION_fastForward",
-          "TRANSACTION_getExtras"
-        ]
-      },
-      "android/support/v4/provider/FontsContractCompat$Columns": {
-        "androidx/provider/FontsContractCompat$Columns": [
-          "TTC_INDEX",
-          "FILE_ID",
-          "RESULT_CODE",
-          "WEIGHT",
-          "ITALIC",
-          "VARIATION_SETTINGS",
-          "RESULT_CODE_OK",
-          "RESULT_CODE_MALFORMED_QUERY",
-          "RESULT_CODE_FONT_UNAVAILABLE",
-          "RESULT_CODE_FONT_NOT_FOUND"
-        ]
-      },
-      "android/support/v4/media/MediaBrowserProtocol": {
-        "androidx/media/MediaBrowserProtocol": [
-          "DATA_CALLING_UID",
-          "EXTRA_MESSENGER_BINDER",
-          "DATA_ROOT_HINTS",
-          "CLIENT_MSG_UNREGISTER_CALLBACK_MESSENGER",
-          "EXTRA_SERVICE_VERSION",
-          "SERVICE_VERSION_1",
-          "DATA_OPTIONS",
-          "CLIENT_MSG_DISCONNECT",
-          "EXTRA_SESSION_BINDER",
-          "SERVICE_VERSION_CURRENT",
-          "CLIENT_VERSION_CURRENT",
-          "EXTRA_CLIENT_VERSION",
-          "CLIENT_VERSION_1",
-          "CLIENT_MSG_GET_MEDIA_ITEM",
-          "DATA_MEDIA_ITEM_LIST",
-          "DATA_MEDIA_SESSION_TOKEN",
-          "SERVICE_MSG_ON_CONNECT",
-          "DATA_RESULT_RECEIVER",
-          "CLIENT_MSG_SEND_CUSTOM_ACTION",
-          "CLIENT_MSG_CONNECT",
-          "SERVICE_MSG_ON_CONNECT_FAILED",
-          "SERVICE_MSG_ON_LOAD_CHILDREN",
-          "DATA_MEDIA_ITEM_ID",
-          "DATA_CALLBACK_TOKEN",
-          "DATA_SEARCH_QUERY",
-          "DATA_CUSTOM_ACTION_EXTRAS",
-          "CLIENT_MSG_SEARCH",
-          "DATA_SEARCH_EXTRAS",
-          "CLIENT_MSG_ADD_SUBSCRIPTION",
-          "DATA_CUSTOM_ACTION",
-          "CLIENT_MSG_REGISTER_CALLBACK_MESSENGER",
-          "DATA_PACKAGE_NAME",
-          "CLIENT_MSG_REMOVE_SUBSCRIPTION"
-        ]
-      },
-      "android/support/v17/leanback/R$color": {
-        "androidx/leanback/R$color": [
-          "lb_error_background_color_opaque",
-          "lb_playback_controls_background_dark",
-          "lb_default_brand_color_dark",
-          "lb_error_background_color_translucent",
-          "lb_background_protection",
-          "lb_speech_orb_recording",
-          "lb_default_brand_color",
-          "lb_page_indicator_dot",
-          "lb_search_bar_hint",
-          "lb_playback_progress_color_no_theme",
-          "lb_speech_orb_not_recording",
-          "lb_search_bar_text_speech_mode",
-          "lb_view_dim_mask_color",
-          "lb_playback_controls_background_light",
-          "lb_playback_media_row_highlight_color",
-          "lb_default_search_color",
-          "lb_playback_icon_highlight_no_theme",
-          "lb_search_bar_hint_speech_mode",
-          "lb_page_indicator_arrow_shadow",
-          "lb_speech_orb_not_recording_icon",
-          "lb_speech_orb_not_recording_pulsed",
-          "lb_search_bar_text",
-          "lb_page_indicator_arrow_background"
-        ]
-      },
-      "android/support/transition/ViewGroupUtilsApi18": {
-        "androidx/transition/ViewGroupUtilsApi18": [
-          "sSuppressLayoutMethod",
-          "TAG",
-          "sSuppressLayoutMethodFetched"
-        ]
-      },
-      "android/support/v4/text/TextDirectionHeuristicsCompat": {
-        "androidx/text/TextDirectionHeuristicsCompat": [
-          "STATE_UNKNOWN",
-          "RTL",
-          "LOCALE",
-          "ANYRTL_LTR",
-          "LTR",
-          "FIRSTSTRONG_RTL",
-          "FIRSTSTRONG_LTR",
-          "STATE_TRUE",
-          "STATE_FALSE"
-        ]
-      },
-      "android/support/v7/widget/ListViewCompat": {
-        "androidx/widget/internal/ListViewCompat": [
-          "INVALID_POSITION",
-          "NO_POSITION",
-          "STATE_SET_NOTHING"
-        ]
-      },
-      "android/support/v17/leanback/app/GuidedStepSupportFragment": {
-        "androidx/leanback/app/GuidedStepSupportFragment": [
-          "SLIDE_FROM_BOTTOM",
-          "SLIDE_FROM_SIDE",
-          "EXTRA_BUTTON_ACTION_PREFIX",
-          "TAG_LEAN_BACK_ACTIONS_FRAGMENT",
-          "ENTRY_NAME_ENTRANCE",
-          "DEBUG",
-          "UI_STYLE_DEFAULT",
-          "UI_STYLE_REPLACE",
-          "IS_FRAMEWORK_FRAGMENT",
-          "UI_STYLE_ACTIVITY_ROOT",
-          "EXTRA_UI_STYLE",
-          "UI_STYLE_ENTRANCE",
-          "entranceTransitionType",
-          "TAG",
-          "ENTRY_NAME_REPLACE",
-          "EXTRA_ACTION_PREFIX"
-        ]
-      },
-      "android/support/v7/media/MediaRouter$GlobalMediaRouter$CallbackHandler": {
-        "androidx/media/MediaRouter$GlobalMediaRouter$CallbackHandler": [
-          "MSG_TYPE_MASK",
-          "MSG_PROVIDER_REMOVED",
-          "MSG_ROUTE_SELECTED",
-          "MSG_ROUTE_VOLUME_CHANGED",
-          "MSG_PROVIDER_ADDED",
-          "MSG_TYPE_ROUTE",
-          "MSG_ROUTE_REMOVED",
-          "MSG_ROUTE_UNSELECTED",
-          "MSG_TYPE_PROVIDER",
-          "MSG_PROVIDER_CHANGED",
-          "MSG_ROUTE_ADDED",
-          "MSG_ROUTE_PRESENTATION_DISPLAY_CHANGED",
-          "MSG_ROUTE_CHANGED"
-        ]
-      },
-      "android/support/v7/view/menu/ActionMenuItem": {
-        "androidx/view/menu/ActionMenuItem": [
-          "EXCLUSIVE",
-          "CHECKED",
-          "ENABLED",
-          "CHECKABLE",
-          "NO_ICON",
-          "HIDDEN"
-        ]
-      },
-      "android/support/v4/app/NotificationCompat$WearableExtender": {
-        "androidx/app/NotificationCompat$WearableExtender": [
-          "SCREEN_TIMEOUT_LONG",
-          "KEY_FLAGS",
-          "KEY_DISMISSAL_ID",
-          "SIZE_LARGE",
-          "KEY_GRAVITY",
-          "KEY_CONTENT_ICON",
-          "FLAG_START_SCROLL_BOTTOM",
-          "DEFAULT_FLAGS",
-          "DEFAULT_CONTENT_ICON_GRAVITY",
-          "FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE",
-          "UNSET_ACTION_INDEX",
-          "DEFAULT_GRAVITY",
-          "FLAG_HINT_SHOW_BACKGROUND_ONLY",
-          "SIZE_XSMALL",
-          "KEY_CUSTOM_CONTENT_HEIGHT",
-          "FLAG_HINT_AVOID_BACKGROUND_CLIPPING",
-          "SIZE_DEFAULT",
-          "KEY_BACKGROUND",
-          "FLAG_BIG_PICTURE_AMBIENT",
-          "SCREEN_TIMEOUT_SHORT",
-          "SIZE_FULL_SCREEN",
-          "KEY_ACTIONS",
-          "EXTRA_WEARABLE_EXTENSIONS",
-          "KEY_CONTENT_ACTION_INDEX",
-          "FLAG_HINT_CONTENT_INTENT_LAUNCHES_ACTIVITY",
-          "KEY_CONTENT_ICON_GRAVITY",
-          "KEY_DISPLAY_INTENT",
-          "SIZE_SMALL",
-          "KEY_CUSTOM_SIZE_PRESET",
-          "KEY_HINT_SCREEN_TIMEOUT",
-          "FLAG_HINT_HIDE_ICON",
-          "KEY_BRIDGE_TAG",
-          "SIZE_MEDIUM",
-          "KEY_PAGES"
-        ]
-      },
-      "android/support/design/R$styleable": {
-        "androidx/design/R$styleable": [
-          "TabLayout_tabSelectedTextColor",
-          "BottomSheetBehavior_Layout_behavior_peekHeight",
-          "TextInputLayout_counterOverflowTextAppearance",
-          "BottomNavigationView_itemTextColor",
-          "ScrimInsetsFrameLayout_insetForeground",
-          "TabItem_android_icon",
-          "CoordinatorLayout",
-          "TextInputLayout_counterTextAppearance",
-          "TabLayout_tabMode",
-          "TextInputLayout_hintAnimationEnabled",
-          "TextInputLayout_passwordToggleTint",
-          "NavigationView_android_fitsSystemWindows",
-          "AppBarLayout_android_background",
-          "BottomSheetBehavior_Layout",
-          "FloatingActionButton_fabSize",
-          "TextInputLayout_android_hint",
-          "FloatingActionButton_elevation",
-          "TabItem_android_text",
-          "CollapsingToolbarLayout_expandedTitleTextAppearance",
-          "TextInputLayout_hintTextAppearance",
-          "BottomNavigationView_elevation",
-          "BottomNavigationView_itemIconTint",
-          "CollapsingToolbarLayout_collapsedTitleTextAppearance",
-          "TabLayout_tabPaddingEnd",
-          "TextInputLayout",
-          "TextInputLayout_counterEnabled",
-          "TextInputLayout_passwordToggleContentDescription",
-          "NavigationView_itemBackground",
-          "CollapsingToolbarLayout_expandedTitleMarginBottom",
-          "AppBarLayout_android_keyboardNavigationCluster",
-          "FloatingActionButton_Behavior_Layout",
-          "NavigationView_itemTextAppearance",
-          "TabLayout_tabBackground",
-          "TabLayout_tabContentStart",
-          "ScrollingViewBehavior_Layout",
-          "TabItem_android_layout",
-          "TextInputLayout_hintEnabled",
-          "CollapsingToolbarLayout_scrimVisibleHeightTrigger",
-          "TabLayout_tabPaddingTop",
-          "CoordinatorLayout_Layout_layout_anchorGravity",
-          "CoordinatorLayout_statusBarBackground",
-          "NavigationView",
-          "CollapsingToolbarLayout_expandedTitleMarginEnd",
-          "CoordinatorLayout_Layout_layout_anchor",
-          "TabLayout_tabMinWidth",
-          "TabLayout_tabPaddingStart",
-          "TextInputLayout_errorEnabled",
-          "TabLayout_tabMaxWidth",
-          "TabLayout_tabTextColor",
-          "CollapsingToolbarLayout_collapsedTitleGravity",
-          "BottomNavigationView",
-          "TabLayout_tabTextAppearance",
-          "NavigationView_itemIconTint",
-          "TabLayout_tabIndicatorColor",
-          "TabLayout",
-          "TabLayout_tabIndicatorHeight",
-          "NavigationView_headerLayout",
-          "CoordinatorLayout_Layout",
-          "BottomNavigationView_menu",
-          "CollapsingToolbarLayout_Layout_layout_collapseParallaxMultiplier",
-          "NavigationView_menu",
-          "TextInputLayout_passwordToggleDrawable",
-          "ScrimInsetsFrameLayout",
-          "CoordinatorLayout_Layout_layout_insetEdge",
-          "CollapsingToolbarLayout_titleEnabled",
-          "ForegroundLinearLayout",
-          "TabLayout_tabGravity",
-          "CollapsingToolbarLayout_contentScrim",
-          "ForegroundLinearLayout_android_foreground",
-          "CollapsingToolbarLayout_expandedTitleGravity",
-          "TextInputLayout_errorTextAppearance",
-          "TabLayout_tabPaddingBottom",
-          "CollapsingToolbarLayout",
-          "AppBarLayout",
-          "FloatingActionButton_pressedTranslationZ",
-          "FloatingActionButton_Behavior_Layout_behavior_autoHide",
-          "FloatingActionButton_useCompatPadding",
-          "NavigationView_android_maxWidth",
-          "CollapsingToolbarLayout_title",
-          "CollapsingToolbarLayout_Layout",
-          "SnackbarLayout_maxActionInlineWidth",
-          "ForegroundLinearLayout_android_foregroundGravity",
-          "AppBarLayout_android_touchscreenBlocksFocus",
-          "ScrollingViewBehavior_Layout_behavior_overlapTop",
-          "BottomSheetBehavior_Layout_behavior_skipCollapsed",
-          "CollapsingToolbarLayout_expandedTitleMarginTop",
-          "BottomNavigationView_itemBackground",
-          "FloatingActionButton_rippleColor",
-          "NavigationView_android_background",
-          "SnackbarLayout_elevation",
-          "TextInputLayout_android_textColorHint",
-          "NavigationView_itemTextColor",
-          "BottomSheetBehavior_Layout_behavior_hideable",
-          "AppBarLayout_Layout_layout_scrollInterpolator",
-          "FloatingActionButton_backgroundTint",
-          "AppBarLayout_Layout_layout_scrollFlags",
-          "CollapsingToolbarLayout_Layout_layout_collapseMode",
-          "TabLayout_tabPadding",
-          "FloatingActionButton_backgroundTintMode",
-          "CoordinatorLayout_Layout_layout_behavior",
-          "CoordinatorLayout_Layout_android_layout_gravity",
-          "AppBarLayout_elevation",
-          "ForegroundLinearLayout_foregroundInsidePadding",
-          "TabItem",
-          "AppBarLayout_expanded",
-          "FloatingActionButton",
-          "TextInputLayout_passwordToggleTintMode",
-          "SnackbarLayout_android_maxWidth",
-          "TextInputLayout_passwordToggleEnabled",
-          "CollapsingToolbarLayout_expandedTitleMargin",
-          "NavigationView_elevation",
-          "FloatingActionButton_borderWidth",
-          "CoordinatorLayout_Layout_layout_keyline",
-          "SnackbarLayout",
-          "CollapsingToolbarLayout_toolbarId",
-          "CoordinatorLayout_keylines",
-          "CollapsingToolbarLayout_scrimAnimationDuration",
-          "TextInputLayout_counterMaxLength",
-          "CoordinatorLayout_Layout_layout_dodgeInsetEdges",
-          "AppBarLayout_Layout",
-          "CollapsingToolbarLayout_statusBarScrim",
-          "CollapsingToolbarLayout_expandedTitleMarginStart"
-        ]
-      },
-      "android/support/text/emoji/MetadataListReader": {
-        "androidx/text/emoji/MetadataListReader": [
-          "META_TABLE_NAME",
-          "EMJI_TAG_DEPRECATED",
-          "EMJI_TAG"
-        ]
-      },
-      "android/support/v4/widget/DrawerLayout": {
-        "androidx/widget/DrawerLayout": [
-          "TAG",
-          "DRAWER_ELEVATION",
-          "SET_DRAWER_SHADOW_FROM_ELEVATION",
-          "STATE_DRAGGING",
-          "MIN_FLING_VELOCITY",
-          "TOUCH_SLOP_SENSITIVITY",
-          "LOCK_MODE_UNDEFINED",
-          "MIN_DRAWER_MARGIN",
-          "STATE_IDLE",
-          "THEME_ATTRS",
-          "LOCK_MODE_LOCKED_OPEN",
-          "ALLOW_EDGE_LOCK",
-          "CAN_HIDE_DESCENDANTS",
-          "CHILDREN_DISALLOW_INTERCEPT",
-          "PEEK_DELAY",
-          "LOCK_MODE_UNLOCKED",
-          "DEFAULT_SCRIM_COLOR",
-          "STATE_SETTLING",
-          "LOCK_MODE_LOCKED_CLOSED",
-          "LAYOUT_ATTRS"
-        ]
-      },
-      "android/support/v4/content/ModernAsyncTask": {
-        "androidx/content/ModernAsyncTask": [
-          "MESSAGE_POST_RESULT",
-          "MESSAGE_POST_PROGRESS",
-          "sDefaultExecutor",
-          "KEEP_ALIVE",
-          "sThreadFactory",
-          "sPoolWorkQueue",
-          "THREAD_POOL_EXECUTOR",
-          "CORE_POOL_SIZE",
-          "MAXIMUM_POOL_SIZE",
-          "sHandler",
-          "LOG_TAG"
-        ]
-      },
-      "android/support/v7/media/MediaControlIntent": {
-        "androidx/media/MediaControlIntent": [
-          "EXTRA_SESSION_STATUS_UPDATE_RECEIVER",
-          "CATEGORY_REMOTE_PLAYBACK",
-          "ACTION_START_SESSION",
-          "ACTION_PLAY",
-          "ACTION_SEEK",
-          "ERROR_UNSUPPORTED_OPERATION",
-          "ERROR_INVALID_ITEM_ID",
-          "ACTION_ENQUEUE",
-          "ACTION_SEND_MESSAGE",
-          "EXTRA_ITEM_CONTENT_POSITION",
-          "ERROR_UNKNOWN",
-          "ACTION_STOP",
-          "CATEGORY_LIVE_VIDEO",
-          "EXTRA_ITEM_STATUS_UPDATE_RECEIVER",
-          "EXTRA_ITEM_METADATA",
-          "EXTRA_SESSION_ID",
-          "EXTRA_MESSAGE",
-          "EXTRA_ITEM_HTTP_HEADERS",
-          "CATEGORY_LIVE_AUDIO",
-          "ACTION_END_SESSION",
-          "EXTRA_MESSAGE_RECEIVER",
-          "ACTION_GET_SESSION_STATUS",
-          "ACTION_REMOVE",
-          "EXTRA_ITEM_STATUS",
-          "EXTRA_ERROR_CODE",
-          "ACTION_GET_STATUS",
-          "ERROR_INVALID_SESSION_ID",
-          "EXTRA_SESSION_STATUS",
-          "EXTRA_ITEM_ID",
-          "ACTION_RESUME",
-          "ACTION_PAUSE"
-        ]
-      },
-      "android/support/design/widget/CoordinatorLayout$LayoutParams": {
-        "androidx/design/widget/CoordinatorLayout$LayoutParams": [
-          "keyline",
-          "topMargin",
-          "leftMargin",
-          "anchorGravity",
-          "bottomMargin",
-          "rightMargin",
-          "height",
-          "gravity",
-          "dodgeInsetEdges",
-          "insetEdge"
-        ]
-      },
-      "android/support/design/internal/NavigationMenuPresenter$NormalViewHolder": {
-        "androidx/design/internal/NavigationMenuPresenter$NormalViewHolder": [
-          "itemView"
-        ]
-      },
-      "android/support/v7/recyclerview/R$styleable": {
-        "androidx/recyclerview/R$styleable": [
-          "RecyclerView_fastScrollHorizontalThumbDrawable",
-          "RecyclerView_fastScrollVerticalTrackDrawable",
-          "RecyclerView_android_descendantFocusability",
-          "RecyclerView_spanCount",
-          "RecyclerView_stackFromEnd",
-          "RecyclerView_reverseLayout",
-          "RecyclerView_fastScrollVerticalThumbDrawable",
-          "RecyclerView_layoutManager",
-          "RecyclerView_android_orientation",
-          "RecyclerView",
-          "RecyclerView_fastScrollEnabled",
-          "RecyclerView_fastScrollHorizontalTrackDrawable"
-        ]
-      },
-      "android/support/v4/app/ActionBarDrawerToggle": {
-        "androidx/app/legacy/ActionBarDrawerToggle": [
-          "TAG",
-          "ID_HOME",
-          "THEME_ATTRS",
-          "TOGGLE_DRAWABLE_OFFSET"
-        ]
-      },
-      "android/support/v7/widget/GridLayout$Axis": {
-        "androidx/widget/GridLayout$Axis": [
-          "backwardLinks",
-          "orderPreserved",
-          "trailingMargins",
-          "leadingMargins",
-          "locationsValid",
-          "groupBounds",
-          "hasWeights",
-          "groupBoundsValid",
-          "PENDING",
-          "arcsValid",
-          "trailingMarginsValid",
-          "arcs",
-          "locations",
-          "backwardLinksValid",
-          "leadingMarginsValid",
-          "maxIndex",
-          "horizontal",
-          "forwardLinksValid",
-          "definedCount",
-          "NEW",
-          "deltas",
-          "parentMax",
-          "parentMin",
-          "COMPLETE",
-          "hasWeightsValid",
-          "forwardLinks"
-        ]
-      },
-      "android/support/v4/app/BundleCompat$BundleCompatBaseImpl": {
-        "androidx/app/BundleCompat$BundleCompatBaseImpl": [
-          "sGetIBinderMethod",
-          "sGetIBinderMethodFetched",
-          "sPutIBinderMethodFetched",
-          "TAG",
-          "sPutIBinderMethod"
-        ]
-      },
-      "android/support/v7/app/AppCompatViewInflater": {
-        "androidx/app/AppCompatViewInflater": [
-          "sOnClickAttrs",
-          "sConstructorMap",
-          "sClassPrefixList",
-          "sConstructorSignature",
-          "LOG_TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/SearchBar": {
-        "androidx/leanback/widget/SearchBar": [
-          "FULL_RIGHT_VOLUME",
-          "DEBUG",
-          "DEFAULT_RATE",
-          "FULL_LEFT_VOLUME",
-          "DO_NOT_LOOP",
-          "DEFAULT_PRIORITY",
-          "TAG"
-        ]
-      },
-      "android/support/v7/appcompat/R$drawable": {
-        "androidx/appcompat/R$drawable": [
-          "abc_ic_ab_back_material",
-          "abc_text_select_handle_middle_mtrl_dark",
-          "abc_text_select_handle_left_mtrl_light",
-          "abc_textfield_activated_mtrl_alpha",
-          "abc_text_select_handle_left_mtrl_dark",
-          "abc_text_cursor_material",
-          "abc_text_select_handle_right_mtrl_light",
-          "abc_ratingbar_material",
-          "abc_ic_menu_share_mtrl_alpha",
-          "abc_ratingbar_small_material",
-          "abc_ic_menu_paste_mtrl_am_alpha",
-          "abc_textfield_search_default_mtrl_alpha",
-          "abc_menu_hardkey_panel_mtrl_mult",
-          "abc_text_select_handle_right_mtrl_dark",
-          "abc_dialog_material_background",
-          "abc_ratingbar_indicator_material",
-          "abc_btn_colored_material",
-          "abc_edit_text_material",
-          "abc_btn_borderless_material",
-          "abc_btn_check_material",
-          "abc_ab_share_pack_mtrl_alpha",
-          "abc_tab_indicator_material",
-          "abc_spinner_textfield_background_material",
-          "abc_ic_commit_search_api_mtrl_alpha",
-          "abc_textfield_default_mtrl_alpha",
-          "abc_switch_track_mtrl_alpha",
-          "abc_seekbar_thumb_material",
-          "abc_list_divider_mtrl_alpha",
-          "abc_spinner_mtrl_am_alpha",
-          "abc_btn_radio_material",
-          "abc_cab_background_top_material",
-          "abc_cab_background_top_mtrl_alpha",
-          "abc_text_select_handle_middle_mtrl_light",
-          "abc_vector_test",
-          "abc_btn_default_mtrl_shape",
-          "abc_switch_thumb_material",
-          "abc_seekbar_track_material",
-          "abc_popup_background_mtrl_mult",
-          "abc_seekbar_tick_mark_material",
-          "abc_ic_menu_copy_mtrl_am_alpha",
-          "abc_ic_menu_selectall_mtrl_alpha",
-          "abc_textfield_search_activated_mtrl_alpha",
-          "abc_cab_background_internal_bg",
-          "abc_ic_menu_cut_mtrl_alpha",
-          "abc_textfield_search_material"
-        ]
-      },
-      "android/support/v17/leanback/widget/GuidedActionsStylist": {
-        "androidx/leanback/widget/GuidedActionsStylist": [
-          "sGuidedActionItemAlignFacet",
-          "TAG",
-          "VIEW_TYPE_DEFAULT",
-          "VIEW_TYPE_DATE_PICKER"
-        ]
-      },
-      "android/support/v17/leanback/R$dimen": {
-        "androidx/leanback/R$dimen": [
-          "lb_details_v2_align_pos_for_description",
-          "lb_details_overview_image_margin_vertical",
-          "lb_search_browse_rows_align_top",
-          "lb_material_shadow_normal_z",
-          "lb_details_v2_left",
-          "lb_details_v2_description_margin_top",
-          "lb_playback_controls_child_margin_bigger",
-          "lb_details_v2_actions_height",
-          "lb_playback_transport_thumbs_height",
-          "lb_details_rows_align_top",
-          "lb_control_icon_width",
-          "lb_page_indicator_dot_radius",
-          "lb_playback_controls_z",
-          "lb_error_under_image_baseline_margin",
-          "lb_browse_rows_margin_start",
-          "lb_playback_transport_thumbs_margin",
-          "lb_playback_transport_hero_thumbs_width",
-          "lb_details_description_under_subtitle_baseline_margin",
-          "lb_rounded_rect_corner_radius",
-          "lb_search_orb_unfocused_z",
-          "lb_playback_transport_progressbar_active_bar_height",
-          "picker_item_height",
-          "lb_page_indicator_arrow_shadow_offset",
-          "lb_page_indicator_arrow_gap",
-          "lb_details_description_title_baseline",
-          "lb_details_v2_blank_height",
-          "lb_search_bar_height",
-          "lb_playback_controls_child_margin_default",
-          "lb_details_v2_logo_margin_start",
-          "lb_browse_selected_row_top_padding",
-          "lb_details_cover_drawable_parallax_movement",
-          "lb_playback_transport_hero_thumbs_height",
-          "lb_details_overview_height_small",
-          "lb_material_shadow_focused_z",
-          "lb_playback_transport_thumbs_width",
-          "lb_browse_rows_margin_top",
-          "lb_action_padding_horizontal",
-          "lb_page_indicator_arrow_radius",
-          "lb_details_description_body_line_spacing",
-          "lb_browse_expanded_selected_row_top_padding",
-          "lb_browse_header_select_scale",
-          "lb_details_v2_align_pos_for_actions",
-          "lb_action_with_icon_padding_start",
-          "lb_page_indicator_arrow_shadow_radius",
-          "lb_playback_transport_progressbar_bar_height",
-          "lb_playback_controls_child_margin_biggest",
-          "lb_playback_controls_padding_bottom",
-          "lb_browse_expanded_row_no_hovercard_bottom_padding",
-          "lb_browse_header_select_duration",
-          "lb_playback_other_rows_center_to_bottom",
-          "lb_details_overview_image_margin_horizontal",
-          "lb_search_orb_focused_z",
-          "lb_error_under_message_baseline_margin",
-          "lb_playback_major_fade_translate_y",
-          "lb_page_indicator_dot_gap",
-          "lb_details_overview_height_large",
-          "lb_details_overview_actions_fade_size",
-          "lb_action_with_icon_padding_end",
-          "lb_details_description_title_line_spacing",
-          "lb_playback_minor_fade_translate_y",
-          "lb_playback_transport_progressbar_active_radius",
-          "lb_details_description_under_title_baseline_margin"
-        ]
-      },
-      "android/support/v7/appcompat/R$layout": {
-        "androidx/appcompat/R$layout": [
-          "abc_screen_toolbar",
-          "abc_screen_simple",
-          "abc_action_mode_close_item_material",
-          "abc_dialog_title_material",
-          "abc_list_menu_item_checkbox",
-          "abc_activity_chooser_view",
-          "abc_search_dropdown_item_icons_2line",
-          "support_simple_spinner_dropdown_item",
-          "abc_list_menu_item_radio",
-          "abc_popup_menu_header_item_layout",
-          "abc_list_menu_item_layout",
-          "tooltip",
-          "abc_action_menu_layout",
-          "abc_list_menu_item_icon",
-          "abc_action_menu_item_layout",
-          "abc_action_bar_title_item",
-          "abc_popup_menu_item_layout",
-          "abc_activity_chooser_view_list_item",
-          "abc_search_view",
-          "abc_expanded_menu_layout",
-          "abc_screen_simple_overlay_action_mode"
-        ]
-      },
-      "android/support/v7/appcompat/R$id": {
-        "androidx/appcompat/R$id": [
-          "submit_area",
-          "split_action_bar",
-          "scrollIndicatorUp",
-          "search_button",
-          "contentPanel",
-          "title",
-          "action_mode_close_button",
-          "custom",
-          "search_edit_frame",
-          "decor_content_parent",
-          "action_bar_title",
-          "submenuarrow",
-          "search_voice_btn",
-          "title_template",
-          "action_bar",
-          "action_bar_subtitle",
-          "alertTitle",
-          "default_activity_button",
-          "search_close_btn",
-          "textSpacerNoTitle",
-          "action_mode_bar_stub",
-          "titleDividerNoCustom",
-          "action_bar_container",
-          "parentPanel",
-          "shortcut",
-          "icon",
-          "search_src_text",
-          "activity_chooser_view_content",
-          "search_plate",
-          "customPanel",
-          "edit_query",
-          "action_menu_presenter",
-          "spacer",
-          "scrollIndicatorDown",
-          "scrollView",
-          "message",
-          "buttonPanel",
-          "topPanel",
-          "list_item",
-          "action_context_bar",
-          "search_go_btn",
-          "textSpacerNoButtons",
-          "search_mag_icon",
-          "action_bar_activity_content",
-          "expand_activities_button",
-          "image"
-        ]
-      },
-      "android/support/v7/widget/Toolbar$LayoutParams": {
-        "androidx/widget/Toolbar$LayoutParams": [
-          "gravity",
-          "EXPANDED",
-          "width",
-          "SYSTEM",
-          "leftMargin",
-          "CUSTOM",
-          "bottomMargin",
-          "rightMargin",
-          "topMargin",
-          "height"
-        ]
-      },
-      "android/support/v4/app/NotificationCompatJellybean": {
-        "androidx/app/NotificationCompatJellybean": [
-          "KEY_LABEL",
-          "sActionIntentField",
-          "KEY_ACTION_INTENT",
-          "sActionClass",
-          "sExtrasLock",
-          "KEY_REMOTE_INPUTS",
-          "KEY_ALLOWED_DATA_TYPES",
-          "sActionsLock",
-          "KEY_CHOICES",
-          "sExtrasField",
-          "EXTRA_DATA_ONLY_REMOTE_INPUTS",
-          "sActionTitleField",
-          "sActionIconField",
-          "KEY_EXTRAS",
-          "KEY_TITLE",
-          "sActionsAccessFailed",
-          "TAG",
-          "KEY_ICON",
-          "EXTRA_ALLOW_GENERATED_REPLIES",
-          "KEY_ALLOW_FREE_FORM_INPUT",
-          "KEY_DATA_ONLY_REMOTE_INPUTS",
-          "sExtrasFieldAccessFailed",
-          "KEY_RESULT_KEY",
-          "sActionsField"
-        ]
-      },
-      "android/support/v7/widget/GridLayout": {
-        "androidx/widget/GridLayout": [
-          "RIGHT",
-          "DEFAULT_COUNT",
-          "DEFAULT_ORIENTATION",
-          "ROW_ORDER_PRESERVED",
-          "TOP",
-          "LEADING",
-          "START",
-          "BASELINE",
-          "UNDEFINED",
-          "ALIGN_BOUNDS",
-          "CENTER",
-          "MAX_SIZE",
-          "ALIGNMENT_MODE",
-          "COLUMN_COUNT",
-          "ROW_COUNT",
-          "CAN_STRETCH",
-          "USE_DEFAULT_MARGINS",
-          "FILL",
-          "HORIZONTAL",
-          "DEFAULT_CONTAINER_MARGIN",
-          "LOG_PRINTER",
-          "ALIGN_MARGINS",
-          "VERTICAL",
-          "DEFAULT_ALIGNMENT_MODE",
-          "COLUMN_ORDER_PRESERVED",
-          "ORIENTATION",
-          "LEFT",
-          "TRAILING",
-          "DEFAULT_ORDER_PRESERVED",
-          "BOTTOM",
-          "END",
-          "DEFAULT_USE_DEFAULT_MARGINS",
-          "INFLEXIBLE",
-          "UNINITIALIZED_HASH",
-          "UNDEFINED_ALIGNMENT",
-          "NO_PRINTER"
-        ]
-      },
-      "android/support/wear/widget/BoxInsetLayout$LayoutParams": {
-        "androidx/wear/widget/BoxInsetLayout$LayoutParams": [
-          "BOX_ALL",
-          "BOX_LEFT",
-          "BOX_TOP",
-          "gravity",
-          "height",
-          "topMargin",
-          "rightMargin",
-          "bottomMargin",
-          "boxedEdges",
-          "BOX_RIGHT",
-          "width",
-          "leftMargin",
-          "BOX_NONE",
-          "BOX_BOTTOM"
-        ]
-      },
-      "android/support/design/widget/TabLayout": {
-        "androidx/design/widget/TabLayout": [
-          "GRAVITY_FILL",
-          "TAB_MIN_WIDTH_MARGIN",
-          "DEFAULT_HEIGHT_WITH_TEXT_ICON",
-          "ANIMATION_DURATION",
-          "INVALID_WIDTH",
-          "FIXED_WRAP_GUTTER_MIN",
-          "MOTION_NON_ADJACENT_OFFSET",
-          "DEFAULT_HEIGHT",
-          "MODE_FIXED",
-          "SELECTED_STATE_SET",
-          "MODE_SCROLLABLE",
-          "EMPTY_STATE_SET",
-          "sTabPool",
-          "GRAVITY_CENTER",
-          "DEFAULT_GAP_TEXT_ICON"
-        ]
-      },
-      "android/support/v4/view/MotionEventCompat": {
-        "androidx/view/MotionEventCompat": [
-          "ACTION_SCROLL",
-          "AXIS_RUDDER",
-          "AXIS_BRAKE",
-          "AXIS_TOOL_MINOR",
-          "AXIS_GENERIC_3",
-          "AXIS_GENERIC_4",
-          "AXIS_GENERIC_5",
-          "AXIS_GENERIC_6",
-          "AXIS_GENERIC_7",
-          "AXIS_GENERIC_8",
-          "AXIS_GENERIC_9",
-          "AXIS_GENERIC_1",
-          "AXIS_GENERIC_2",
-          "AXIS_DISTANCE",
-          "AXIS_ORIENTATION",
-          "AXIS_LTRIGGER",
-          "AXIS_HSCROLL",
-          "ACTION_POINTER_DOWN",
-          "AXIS_TILT",
-          "AXIS_WHEEL",
-          "AXIS_Y",
-          "AXIS_Z",
-          "AXIS_X",
-          "AXIS_SCROLL",
-          "AXIS_TOUCH_MAJOR",
-          "ACTION_HOVER_ENTER",
-          "AXIS_GAS",
-          "ACTION_HOVER_MOVE",
-          "ACTION_HOVER_EXIT",
-          "AXIS_THROTTLE",
-          "AXIS_HAT_X",
-          "AXIS_HAT_Y",
-          "AXIS_SIZE",
-          "ACTION_POINTER_INDEX_SHIFT",
-          "AXIS_RTRIGGER",
-          "AXIS_RELATIVE_X",
-          "AXIS_RELATIVE_Y",
-          "AXIS_RY",
-          "AXIS_RZ",
-          "AXIS_RX",
-          "AXIS_TOUCH_MINOR",
-          "ACTION_POINTER_INDEX_MASK",
-          "BUTTON_PRIMARY",
-          "AXIS_PRESSURE",
-          "AXIS_TOOL_MAJOR",
-          "AXIS_GENERIC_13",
-          "AXIS_GENERIC_12",
-          "AXIS_GENERIC_11",
-          "AXIS_GENERIC_10",
-          "AXIS_GENERIC_16",
-          "AXIS_GENERIC_15",
-          "AXIS_GENERIC_14",
-          "ACTION_POINTER_UP",
-          "ACTION_MASK",
-          "AXIS_VSCROLL"
-        ]
-      },
-      "android/support/v4/view/PagerTitleStrip": {
-        "androidx/widget/PagerTitleStrip": [
-          "ATTRS",
-          "SIDE_ALPHA",
-          "TEXT_ATTRS",
-          "TEXT_SPACING"
-        ]
-      },
-      "android/support/v4/graphics/TypefaceCompatApi26Impl": {
-        "androidx/graphics/TypefaceCompatApi26Impl": [
-          "sAddFontFromAssetManager",
-          "sFreeze",
-          "TAG",
-          "RESOLVE_BY_FONT_TABLE",
-          "sFontFamily",
-          "ADD_FONT_FROM_ASSET_MANAGER_METHOD",
-          "sCreateFromFamiliesWithDefault",
-          "FONT_FAMILY_CLASS",
-          "ABORT_CREATION_METHOD",
-          "sFontFamilyCtor",
-          "CREATE_FROM_FAMILIES_WITH_DEFAULT_METHOD",
-          "sAbortCreation",
-          "ADD_FONT_FROM_BUFFER_METHOD",
-          "sAddFontFromBuffer",
-          "FREEZE_METHOD"
-        ]
-      },
-      "android/support/v7/app/AppCompatDelegate": {
-        "androidx/app/AppCompatDelegate": [
-          "sCompatVectorFromResourcesEnabled",
-          "MODE_NIGHT_FOLLOW_SYSTEM",
-          "MODE_NIGHT_YES",
-          "TAG",
-          "FEATURE_SUPPORT_ACTION_BAR_OVERLAY",
-          "sDefaultNightMode",
-          "MODE_NIGHT_NO",
-          "MODE_NIGHT_AUTO",
-          "FEATURE_ACTION_MODE_OVERLAY",
-          "FEATURE_SUPPORT_ACTION_BAR",
-          "MODE_NIGHT_UNSPECIFIED"
-        ]
-      },
-      "android/support/v7/view/menu/ListMenuItemView": {
-        "androidx/view/menu/ListMenuItemView": [
-          "TAG"
-        ]
-      },
-      "android/support/media/instantvideo/preload/InstantVideoPreloadManager": {
-        "androidx/media/instantvideo/preload/InstantVideoPreloadManager": [
-          "DEBUG",
-          "sInstance",
-          "TAG",
-          "DEFAULT_MAX_VIDEO_COUNT"
-        ]
-      },
-      "android/support/graphics/drawable/AndroidResources": {
-        "androidx/graphics/drawable/AndroidResources": [
-          "STYLEABLE_ANIMATED_VECTOR_DRAWABLE_TARGET",
-          "STYLEABLE_VECTOR_DRAWABLE_CLIP_PATH_NAME",
-          "STYLEABLE_VECTOR_DRAWABLE_GROUP_NAME",
-          "STYLEABLE_ANIMATED_VECTOR_DRAWABLE_DRAWABLE",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_END",
-          "STYLEABLE_PATH_INTERPOLATOR",
-          "STYLEABLE_PROPERTY_VALUES_HOLDER_PROPERTY_NAME",
-          "STYLEABLE_KEYFRAME_INTERPOLATOR",
-          "STYLEABLE_KEYFRAME_FRACTION",
-          "STYLEABLE_ANIMATOR_REPEAT_MODE",
-          "STYLEABLE_ANIMATED_VECTOR_DRAWABLE_TARGET_NAME",
-          "STYLEABLE_VECTOR_DRAWABLE_VIEWPORT_WIDTH",
-          "FAST_OUT_LINEAR_IN",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_LINE_JOIN",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH_PATH_DATA",
-          "STYLEABLE_VECTOR_DRAWABLE_TINT_MODE",
-          "STYLEABLE_VECTOR_DRAWABLE_TINT",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH_NAME",
-          "STYLEABLE_KEYFRAME_VALUE_TYPE",
-          "STYLEABLE_PATH_INTERPOLATOR_PATH_DATA",
-          "STYLEABLE_ANIMATOR_START_OFFSET",
-          "STYLEABLE_VECTOR_DRAWABLE_GROUP",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_COLOR",
-          "STYLEABLE_ANIMATED_VECTOR_DRAWABLE_TARGET_ANIMATION",
-          "STYLEABLE_VECTOR_DRAWABLE_GROUP_ROTATION",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_WIDTH",
-          "STYLEABLE_PROPERTY_ANIMATOR_PROPERTY_Y_NAME",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_ALPHA",
-          "STYLEABLE_ANIMATOR_INTERPOLATOR",
-          "STYLEABLE_VECTOR_DRAWABLE_WIDTH",
-          "STYLEABLE_ANIMATOR_SET_ORDERING",
-          "STYLEABLE_ANIMATED_VECTOR_DRAWABLE",
-          "STYLEABLE_ANIMATOR_DURATION",
-          "STYLEABLE_VECTOR_DRAWABLE_ALPHA",
-          "STYLEABLE_VECTOR_DRAWABLE_HEIGHT",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH_FILL_ALPHA",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_MITER_LIMIT",
-          "STYLEABLE_PATH_INTERPOLATOR_CONTROL_X_2",
-          "STYLEABLE_PATH_INTERPOLATOR_CONTROL_X_1",
-          "LINEAR_OUT_SLOW_IN",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH_FILL_COLOR",
-          "STYLEABLE_PROPERTY_VALUES_HOLDER_VALUE_TO",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH",
-          "STYLEABLE_ANIMATOR_REMOVE_BEFORE_M_RELEASE",
-          "STYLEABLE_PATH_INTERPOLATOR_CONTROL_Y_1",
-          "STYLEABLE_PATH_INTERPOLATOR_CONTROL_Y_2",
-          "FAST_OUT_SLOW_IN",
-          "STYLEABLE_ANIMATOR_VALUE_FROM",
-          "STYLEABLE_ANIMATOR_REPEAT_COUNT",
-          "STYLEABLE_ANIMATOR_SET",
-          "STYLEABLE_PROPERTY_ANIMATOR_PATH_DATA",
-          "STYLEABLE_ANIMATOR_VALUE_TO",
-          "STYLEABLE_VECTOR_DRAWABLE_VIEWPORT_HEIGHT",
-          "STYLEABLE_KEYFRAME",
-          "STYLEABLE_VECTOR_DRAWABLE_TYPE_ARRAY",
-          "STYLEABLE_ANIMATOR_VALUE_TYPE",
-          "STYLEABLE_PROPERTY_VALUES_HOLDER",
-          "STYLEABLE_VECTOR_DRAWABLE_GROUP_PIVOT_X",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_OFFSET",
-          "STYLEABLE_VECTOR_DRAWABLE_GROUP_PIVOT_Y",
-          "STYLEABLE_VECTOR_DRAWABLE_GROUP_TRANSLATE_X",
-          "STYLEABLE_VECTOR_DRAWABLE_GROUP_TRANSLATE_Y",
-          "STYLEABLE_VECTOR_DRAWABLE_AUTO_MIRRORED",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_START",
-          "STYLEABLE_KEYFRAME_VALUE",
-          "STYLEABLE_PROPERTY_VALUES_HOLDER_VALUE_TYPE",
-          "STYLEABLE_PROPERTY_ANIMATOR_PROPERTY_NAME",
-          "STYLEABLE_VECTOR_DRAWABLE_CLIP_PATH",
-          "STYLEABLE_VECTOR_DRAWABLE_NAME",
-          "STYLEABLE_PROPERTY_VALUES_HOLDER_VALUE_FROM",
-          "STYLEABLE_VECTOR_DRAWABLE_GROUP_SCALE_Y",
-          "STYLEABLE_VECTOR_DRAWABLE_GROUP_SCALE_X",
-          "STYLEABLE_ANIMATOR",
-          "STYLEABLE_VECTOR_DRAWABLE_CLIP_PATH_PATH_DATA",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH_STROKE_LINE_CAP",
-          "STYLEABLE_VECTOR_DRAWABLE_PATH_TRIM_PATH_FILLTYPE",
-          "STYLEABLE_PROPERTY_ANIMATOR",
-          "STYLEABLE_PROPERTY_ANIMATOR_PROPERTY_X_NAME"
-        ]
-      },
-      "android/support/v7/app/ActionBar$LayoutParams": {
-        "androidx/app/ActionBar$LayoutParams": [
-          "gravity"
-        ]
-      },
-      "android/support/v7/widget/LinearLayoutCompat": {
-        "androidx/widget/LinearLayoutCompat": [
-          "VERTICAL_GRAVITY_COUNT",
-          "SHOW_DIVIDER_BEGINNING",
-          "HORIZONTAL",
-          "SHOW_DIVIDER_MIDDLE",
-          "SHOW_DIVIDER_NONE",
-          "INDEX_CENTER_VERTICAL",
-          "INDEX_TOP",
-          "INDEX_FILL",
-          "VERTICAL",
-          "INDEX_BOTTOM",
-          "SHOW_DIVIDER_END"
-        ]
-      },
-      "android/support/percent/PercentLayoutHelper$PercentMarginLayoutParams": {
-        "androidx/PercentLayoutHelper$PercentMarginLayoutParams": [
-          "topMargin",
-          "leftMargin",
-          "rightMargin",
-          "height",
-          "width",
-          "bottomMargin"
-        ]
-      },
-      "android/support/v17/leanback/widget/StreamingTextView": {
-        "androidx/leanback/widget/StreamingTextView": [
-          "STREAM_POSITION_PROPERTY",
-          "DOTS_FOR_STABLE",
-          "ANIMATE_DOTS_FOR_PENDING",
-          "STREAM_UPDATE_DELAY_MILLIS",
-          "DEBUG",
-          "TEXT_DOT_SCALE",
-          "DOTS_FOR_PENDING",
-          "SPLIT_PATTERN",
-          "TAG"
-        ]
-      },
-      "android/support/v7/view/SupportMenuInflater$MenuState": {
-        "androidx/view/SupportMenuInflater$MenuState": [
-          "itemListenerMethodName",
-          "itemActionViewClassName",
-          "itemContentDescription",
-          "itemEnabled",
-          "defaultItemChecked",
-          "itemCategoryOrder",
-          "itemTitle",
-          "groupCategory",
-          "itemIconTintMode",
-          "itemAdded",
-          "groupCheckable",
-          "itemNumericShortcut",
-          "groupVisible",
-          "itemNumericModifiers",
-          "itemTitleCondensed",
-          "defaultItemVisible",
-          "itemAlphabeticShortcut",
-          "itemShowAsAction",
-          "menu",
-          "defaultItemCheckable",
-          "itemActionProvider",
-          "itemCheckable",
-          "itemActionViewLayout",
-          "itemIconResId",
-          "itemVisible",
-          "itemTooltipText",
-          "defaultItemCategory",
-          "defaultGroupId",
-          "groupOrder",
-          "defaultItemId",
-          "itemActionProviderClassName",
-          "itemId",
-          "itemIconTintList",
-          "itemChecked",
-          "groupId",
-          "defaultItemEnabled",
-          "defaultItemOrder",
-          "itemAlphabeticModifiers",
-          "groupEnabled"
-        ]
-      },
-      "android/support/v4/view/InputDeviceCompat": {
-        "androidx/view/InputDeviceCompat": [
-          "SOURCE_CLASS_JOYSTICK",
-          "SOURCE_KEYBOARD",
-          "SOURCE_CLASS_MASK",
-          "SOURCE_CLASS_POINTER",
-          "SOURCE_ROTARY_ENCODER",
-          "SOURCE_TOUCHSCREEN",
-          "SOURCE_TOUCHPAD",
-          "SOURCE_STYLUS",
-          "SOURCE_CLASS_POSITION",
-          "SOURCE_UNKNOWN",
-          "SOURCE_DPAD",
-          "SOURCE_CLASS_BUTTON",
-          "SOURCE_JOYSTICK",
-          "SOURCE_ANY",
-          "SOURCE_TOUCH_NAVIGATION",
-          "SOURCE_TRACKBALL",
-          "SOURCE_MOUSE",
-          "SOURCE_HDMI",
-          "SOURCE_GAMEPAD",
-          "SOURCE_CLASS_TRACKBALL",
-          "SOURCE_CLASS_NONE"
-        ]
-      },
-      "android/support/v17/leanback/R$styleable": {
-        "androidx/leanback/R$styleable": [
-          "lbImageCardView_lbImageCardViewType",
-          "LeanbackTheme_browseRowsMarginTop",
-          "lbPlaybackControlsActionIcons_thumb_down_outline",
-          "lbSlide_android_interpolator",
-          "lbBaseCardView_cardType",
-          "lbResizingTextView_resizedPaddingAdjustmentBottom",
-          "lbBaseGridView_android_horizontalSpacing",
-          "lbResizingTextView_maintainLineSpacing",
-          "lbBaseGridView_verticalMargin",
-          "lbPlaybackControlsActionIcons_repeat_one",
-          "lbBaseGridView_horizontalMargin",
-          "lbHorizontalGridView_rowHeight",
-          "lbHorizontalGridView_numberOfRows",
-          "LeanbackTheme_browseRowsFadingEdgeLength",
-          "PagingIndicator_dotToDotGap",
-          "PagingIndicator_arrowColor",
-          "PagingIndicator",
-          "lbSearchOrbView_searchOrbColor",
-          "lbTimePicker_is24HourFormat",
-          "lbDatePicker",
-          "lbSearchOrbView_searchOrbBrightColor",
-          "lbDatePicker_android_maxDate",
-          "lbVerticalGridView_columnWidth",
-          "PagingIndicator_arrowRadius",
-          "lbTimePicker_useCurrentTime",
-          "LeanbackGuidedStepTheme",
-          "lbPlaybackControlsActionIcons_shuffle",
-          "lbBaseCardView_cardBackground",
-          "lbPlaybackControlsActionIcons",
-          "lbBaseCardView",
-          "lbPlaybackControlsActionIcons_play",
-          "lbSlide_lb_slideEdge",
-          "lbBaseCardView_extraVisibility",
-          "LeanbackTheme_overlayDimActiveLevel",
-          "lbResizingTextView_resizeTrigger",
-          "lbPlaybackControlsActionIcons_picture_in_picture",
-          "lbBaseGridView_android_gravity",
-          "lbBaseGridView_focusOutEnd",
-          "LeanbackTheme",
-          "lbPlaybackControlsActionIcons_thumb_up",
-          "PagingIndicator_dotBgColor",
-          "lbSearchOrbView_searchOrbIconColor",
-          "lbSearchOrbView",
-          "lbBaseGridView_focusOutFront",
-          "lbBaseCardView_infoVisibility",
-          "lbResizingTextView_resizedTextSize",
-          "lbPlaybackControlsActionIcons_skip_previous",
-          "PagingIndicator_dotToArrowGap",
-          "lbHorizontalGridView",
-          "lbDatePicker_datePickerFormat",
-          "lbVerticalGridView_numberOfColumns",
-          "lbSlide_android_duration",
-          "PagingIndicator_lbDotRadius",
-          "lbPlaybackControlsActionIcons_skip_next",
-          "lbSlide",
-          "lbSlide_android_startDelay",
-          "lbPlaybackControlsActionIcons_fast_forward",
-          "lbImageCardView",
-          "LeanbackTheme_browseRowsMarginStart",
-          "lbBaseCardView_Layout_layout_viewType",
-          "lbTimePicker",
-          "lbResizingTextView",
-          "lbImageCardView_infoAreaBackground",
-          "lbBaseCardView_Layout",
-          "lbPlaybackControlsActionIcons_repeat",
-          "lbPlaybackControlsActionIcons_rewind",
-          "lbBaseCardView_selectedAnimationDelay",
-          "lbBaseGridView_focusOutSideStart",
-          "lbBaseCardView_selectedAnimationDuration",
-          "lbBaseGridView_android_verticalSpacing",
-          "lbSearchOrbView_searchOrbIcon",
-          "lbPlaybackControlsActionIcons_pause",
-          "lbBaseGridView",
-          "PagingIndicator_arrowBgColor",
-          "lbVerticalGridView",
-          "lbDatePicker_android_minDate",
-          "lbPlaybackControlsActionIcons_thumb_up_outline",
-          "LeanbackTheme_overlayDimDimmedLevel",
-          "lbBaseGridView_focusOutSideEnd",
-          "lbPlaybackControlsActionIcons_high_quality",
-          "lbResizingTextView_resizedPaddingAdjustmentTop",
-          "lbBaseCardView_activatedAnimationDuration",
-          "lbPlaybackControlsActionIcons_closed_captioning",
-          "LeanbackTheme_overlayDimMaskColor",
-          "lbPlaybackControlsActionIcons_thumb_down",
-          "LeanbackGuidedStepTheme_guidedStepKeyline",
-          "lbBaseCardView_cardForeground"
-        ]
-      },
-      "android/support/v17/leanback/R$drawable": {
-        "androidx/leanback/R$drawable": [
-          "lb_ic_in_app_search",
-          "lb_text_dot_one",
-          "lb_ic_search_mic_out",
-          "lb_ic_search_mic",
-          "lb_background",
-          "lb_text_dot_two",
-          "lb_ic_nav_arrow",
-          "lb_ic_more"
-        ]
-      },
-      "android/support/v7/widget/RecyclerView$ViewHolder": {
-        "androidx/widget/RecyclerView$ViewHolder": [
-          "FLAG_NOT_RECYCLABLE",
-          "FLAG_INVALID",
-          "FULLUPDATE_PAYLOADS",
-          "FLAG_RETURNED_FROM_SCRAP",
-          "PENDING_ACCESSIBILITY_STATE_NOT_SET",
-          "FLAG_REMOVED",
-          "FLAG_TMP_DETACHED",
-          "FLAG_ADAPTER_POSITION_UNKNOWN",
-          "FLAG_SET_A11Y_ITEM_DELEGATE",
-          "itemView",
-          "FLAG_APPEARED_IN_PRE_LAYOUT",
-          "FLAG_ADAPTER_FULLUPDATE",
-          "FLAG_BOUNCED_FROM_HIDDEN_LIST",
-          "FLAG_IGNORE",
-          "FLAG_BOUND",
-          "FLAG_UPDATE",
-          "FLAG_MOVED"
-        ]
-      },
-      "android/support/v4/media/session/MediaSessionCompat$Token": {
-        "androidx/media/session/MediaSessionCompat$Token": [
-          "CREATOR"
-        ]
-      },
-      "android/support/v17/leanback/app/BrowseFragment$ExpandPreLayout": {
-        "androidx/leanback/app/BrowseFragment$ExpandPreLayout": [
-          "STATE_SECOND_DRAW",
-          "STATE_INIT",
-          "mainFragmentAdapter",
-          "STATE_FIRST_DRAW"
-        ]
-      },
-      "android/support/v13/app/FragmentTabHost$TabInfo": {
-        "androidx/app/legacy/FragmentTabHost$TabInfo": [
-          "fragment",
-          "args",
-          "tag",
-          "clss"
-        ]
-      },
-      "android/support/media/tv/Channel": {
-        "androidx/media/tv/Channel": [
-          "IS_SEARCHABLE",
-          "IS_SYSTEM_APPROVED",
-          "INVALID_INT_VALUE",
-          "INVALID_CHANNEL_ID",
-          "PROJECTION",
-          "IS_TRANSIENT",
-          "IS_BROWSABLE",
-          "IS_LOCKED"
-        ]
-      },
-      "android/support/v4/text/BidiFormatter$DirectionalityEstimator": {
-        "androidx/text/BidiFormatter$DirectionalityEstimator": [
-          "lastChar",
-          "DIR_TYPE_CACHE_SIZE",
-          "DIR_TYPE_CACHE",
-          "charIndex",
-          "isHtml",
-          "text",
-          "length"
-        ]
-      },
-      "android/support/v7/widget/AppCompatDrawableManager": {
-        "androidx/widget/AppCompatDrawableManager": [
-          "COLOR_FILTER_CACHE",
-          "TINT_COLOR_CONTROL_NORMAL",
-          "TAG",
-          "COLORFILTER_TINT_COLOR_CONTROL_NORMAL",
-          "COLORFILTER_COLOR_CONTROL_ACTIVATED",
-          "TINT_CHECKABLE_BUTTON_LIST",
-          "INSTANCE",
-          "TINT_COLOR_CONTROL_STATE_LIST",
-          "DEFAULT_MODE",
-          "DEBUG",
-          "COLORFILTER_COLOR_BACKGROUND_MULTIPLY",
-          "PLATFORM_VD_CLAZZ",
-          "SKIP_DRAWABLE_TAG"
-        ]
-      },
-      "android/support/media/tv/TvContractCompat": {
-        "androidx/media/tv/TvContractCompat": [
-          "PARAM_INPUT",
-          "PATH_CHANNEL",
-          "ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED",
-          "ACTION_REQUEST_CHANNEL_BROWSABLE",
-          "EXTRA_PREVIEW_PROGRAM_ID",
-          "PATH_RECORDED_PROGRAM",
-          "PATH_PASSTHROUGH",
-          "PARAM_CHANNEL",
-          "AUTHORITY",
-          "PARAM_START_TIME",
-          "PARAM_BROWSABLE_ONLY",
-          "EXTRA_DATA_TYPE",
-          "EXTRA_DEFAULT_VALUE",
-          "PARAM_END_TIME",
-          "EXTRA_WATCH_NEXT_PROGRAM_ID",
-          "PARAM_CANONICAL_GENRE",
-          "METHOD_GET_COLUMNS",
-          "PATH_PROGRAM",
-          "METHOD_ADD_COLUMN",
-          "PATH_PREVIEW_PROGRAM",
-          "PATH_WATCH_NEXT_PROGRAM",
-          "EXTRA_COLUMN_NAME",
-          "ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED",
-          "PERMISSION_READ_TV_LISTINGS",
-          "EXTRA_EXISTING_COLUMN_NAMES",
-          "ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT",
-          "EXTRA_PACKAGE_NAME",
-          "ACTION_CHANNEL_BROWSABLE_REQUESTED",
-          "EXTRA_CHANNEL_ID",
-          "ACTION_INITIALIZE_PROGRAMS"
-        ]
-      },
-      "android/support/v17/leanback/widget/GridLayoutManager$PendingMoveSmoothScroller": {
-        "androidx/leanback/widget/GridLayoutManager$PendingMoveSmoothScroller": [
-          "TARGET_UNDEFINED"
-        ]
-      },
-      "android/support/v7/media/RemoteControlClientCompat$PlaybackInfo": {
-        "androidx/media/RemoteControlClientCompat$PlaybackInfo": [
-          "volumeMax",
-          "playbackType",
-          "volume",
-          "volumeHandling",
-          "playbackStream"
-        ]
-      },
-      "android/support/v4/util/ArraySet": {
-        "androidx/util/ArraySet": [
-          "OBJECT",
-          "TAG",
-          "sTwiceBaseCacheSize",
-          "CACHE_SIZE",
-          "sBaseCacheSize",
-          "sTwiceBaseCache",
-          "BASE_SIZE",
-          "INT",
-          "sBaseCache",
-          "DEBUG"
-        ]
-      },
-      "android/support/v17/leanback/app/OnboardingFragment": {
-        "androidx/leanback/app/OnboardingFragment": [
-          "DESCRIPTION_START_DELAY_MS",
-          "TAG",
-          "HEADER_ANIMATION_DURATION_MS",
-          "HEADER_APPEAR_DELAY_MS",
-          "KEY_LOGO_ANIMATION_FINISHED",
-          "HEADER_DISAPPEAR_INTERPOLATOR",
-          "DEBUG",
-          "HEADER_APPEAR_INTERPOLATOR",
-          "KEY_ENTER_ANIMATION_FINISHED",
-          "KEY_CURRENT_PAGE_INDEX",
-          "sSlideDistance",
-          "LOGO_SPLASH_PAUSE_DURATION_MS",
-          "SLIDE_DISTANCE"
-        ]
-      },
-      "android/support/v17/leanback/R$string": {
-        "androidx/leanback/R$string": [
-          "lb_control_display_fast_forward_multiplier",
-          "lb_playback_controls_repeat_one",
-          "lb_playback_controls_thumb_up_outline",
-          "lb_playback_controls_thumb_up",
-          "lb_playback_controls_repeat_none",
-          "lb_guidedaction_finish_title",
-          "lb_control_display_rewind_multiplier",
-          "lb_playback_controls_closed_captioning_disable",
-          "lb_playback_controls_repeat_all",
-          "lb_playback_controls_pause",
-          "lb_playback_controls_thumb_down",
-          "lb_playback_controls_shuffle_enable",
-          "lb_playback_controls_rewind_multiplier",
-          "lb_guidedaction_continue_title",
-          "lb_playback_controls_shuffle_disable",
-          "lb_media_player_error",
-          "lb_playback_controls_hidden",
-          "lb_playback_controls_play",
-          "lb_guidedactions_item_unselected_description_text_alpha",
-          "lb_playback_controls_skip_next",
-          "lb_playback_controls_fast_forward",
-          "lb_playback_controls_high_quality_enable",
-          "lb_search_bar_hint_speech",
-          "lb_search_bar_hint_with_title_speech",
-          "lb_playback_controls_closed_captioning_enable",
-          "lb_playback_controls_shown",
-          "lb_guidedactions_item_disabled_description_text_alpha",
-          "lb_search_bar_hint",
-          "lb_playback_controls_fast_forward_multiplier",
-          "lb_playback_controls_picture_in_picture",
-          "lb_playback_controls_thumb_down_outline",
-          "lb_playback_controls_high_quality_disable",
-          "lb_playback_controls_rewind",
-          "lb_playback_controls_more_actions",
-          "lb_guidedactions_item_unselected_text_alpha",
-          "lb_guidedactions_item_disabled_text_alpha",
-          "lb_playback_controls_skip_previous",
-          "lb_search_bar_hint_with_title"
-        ]
-      },
-      "android/support/v7/preference/PreferenceInflater": {
-        "androidx/preference/PreferenceInflater": [
-          "EXTRA_TAG_NAME",
-          "INTENT_TAG_NAME",
-          "CONSTRUCTOR_MAP",
-          "TAG",
-          "CONSTRUCTOR_SIGNATURE"
-        ]
-      },
-      "android/support/constraint/R$styleable": {
-        "androidx/constraint/R$styleable": [
-          "ConstraintLayout_Layout_layout_constraintWidth_max",
-          "ConstraintLayout_Layout_layout_constraintWidth_min",
-          "ConstraintSet_layout_constraintDimensionRatio",
-          "ConstraintSet_android_transformPivotY",
-          "ConstraintSet_android_transformPivotX",
-          "ConstraintSet_layout_goneMarginRight",
-          "ConstraintLayout_Layout_layout_constraintGuide_percent",
-          "ConstraintLayout_Layout_layout_constraintLeft_toLeftOf",
-          "ConstraintSet_layout_goneMarginStart",
-          "ConstraintSet_android_orientation",
-          "ConstraintLayout_Layout_layout_constraintRight_toLeftOf",
-          "ConstraintSet_android_layout_marginBottom",
-          "ConstraintSet_layout_constraintBaseline_toBaselineOf",
-          "ConstraintSet_android_layout_height",
-          "ConstraintSet_layout_constraintRight_creator",
-          "ConstraintSet_layout_constraintWidth_max",
-          "ConstraintSet_layout_constraintEnd_toStartOf",
-          "ConstraintLayout_Layout_layout_constraintBottom_creator",
-          "ConstraintSet_android_visibility",
-          "ConstraintLayout_Layout_layout_constraintTop_toBottomOf",
-          "ConstraintSet_layout_constraintGuide_begin",
-          "ConstraintSet_layout_constraintWidth_min",
-          "ConstraintLayout_Layout_android_maxHeight",
-          "ConstraintSet_android_id",
-          "ConstraintSet_layout_constraintBottom_creator",
-          "ConstraintLayout_Layout_layout_optimizationLevel",
-          "ConstraintLayout_Layout_layout_constraintVertical_bias",
-          "ConstraintSet_layout_constraintHorizontal_bias",
-          "ConstraintSet_layout_constraintHeight_default",
-          "ConstraintSet",
-          "ConstraintLayout_Layout_layout_constraintBottom_toBottomOf",
-          "ConstraintLayout_Layout",
-          "ConstraintLayout_Layout_layout_constraintBaseline_creator",
-          "ConstraintLayout_Layout_layout_constraintVertical_chainStyle",
-          "ConstraintSet_android_rotationY",
-          "ConstraintSet_android_rotationX",
-          "ConstraintSet_android_alpha",
-          "ConstraintLayout_Layout_layout_constraintDimensionRatio",
-          "ConstraintLayout_Layout_android_orientation",
-          "ConstraintSet_layout_constraintLeft_creator",
-          "ConstraintSet_layout_goneMarginLeft",
-          "ConstraintSet_layout_constraintLeft_toLeftOf",
-          "ConstraintLayout_Layout_layout_constraintVertical_weight",
-          "ConstraintSet_layout_constraintStart_toStartOf",
-          "ConstraintLayout_Layout_layout_constraintHorizontal_chainStyle",
-          "ConstraintLayout_Layout_layout_constraintEnd_toEndOf",
-          "ConstraintSet_layout_editor_absoluteY",
-          "ConstraintSet_layout_editor_absoluteX",
-          "ConstraintLayout_Layout_layout_constraintEnd_toStartOf",
-          "ConstraintLayout_Layout_layout_constraintTop_toTopOf",
-          "ConstraintSet_android_layout_marginEnd",
-          "ConstraintLayout_Layout_layout_goneMarginLeft",
-          "ConstraintLayout_Layout_layout_constraintGuide_begin",
-          "ConstraintSet_layout_constraintGuide_end",
-          "ConstraintSet_android_translationZ",
-          "ConstraintSet_android_translationY",
-          "ConstraintSet_android_translationX",
-          "ConstraintSet_layout_constraintStart_toEndOf",
-          "ConstraintSet_layout_constraintRight_toRightOf",
-          "ConstraintSet_layout_constraintHeight_max",
-          "ConstraintSet_android_layout_marginTop",
-          "ConstraintSet_layout_constraintHeight_min",
-          "ConstraintSet_layout_constraintTop_creator",
-          "ConstraintLayout_Layout_layout_editor_absoluteX",
-          "ConstraintLayout_Layout_layout_editor_absoluteY",
-          "ConstraintLayout_Layout_layout_goneMarginTop",
-          "ConstraintSet_layout_goneMarginEnd",
-          "ConstraintSet_layout_constraintLeft_toRightOf",
-          "ConstraintLayout_Layout_layout_goneMarginBottom",
-          "ConstraintLayout_Layout_android_minHeight",
-          "ConstraintLayout_Layout_layout_constraintBaseline_toBaselineOf",
-          "ConstraintSet_android_layout_marginLeft",
-          "ConstraintSet_layout_constraintHorizontal_weight",
-          "ConstraintLayout_Layout_layout_goneMarginEnd",
-          "ConstraintSet_layout_constraintVertical_weight",
-          "ConstraintSet_layout_constraintBaseline_creator",
-          "ConstraintSet_layout_constraintVertical_bias",
-          "ConstraintSet_layout_goneMarginTop",
-          "ConstraintLayout_Layout_layout_constraintRight_creator",
-          "ConstraintSet_layout_constraintBottom_toTopOf",
-          "ConstraintLayout_Layout_layout_constraintWidth_default",
-          "ConstraintSet_android_layout_marginStart",
-          "ConstraintSet_android_layout_width",
-          "ConstraintSet_layout_constraintWidth_default",
-          "ConstraintLayout_Layout_layout_constraintBottom_toTopOf",
-          "ConstraintLayout_Layout_layout_constraintStart_toEndOf",
-          "ConstraintLayout_Layout_layout_constraintHorizontal_weight",
-          "ConstraintSet_android_layout_marginRight",
-          "ConstraintSet_layout_constraintBottom_toBottomOf",
-          "ConstraintSet_android_scaleX",
-          "ConstraintSet_android_scaleY",
-          "ConstraintLayout_Layout_layout_constraintRight_toRightOf",
-          "ConstraintSet_layout_constraintGuide_percent",
-          "ConstraintLayout_Layout_layout_constraintLeft_creator",
-          "ConstraintLayout_Layout_layout_constraintTop_creator",
-          "ConstraintSet_layout_constraintTop_toTopOf",
-          "ConstraintLayout_Layout_layout_goneMarginRight",
-          "ConstraintSet_layout_constraintEnd_toEndOf",
-          "ConstraintLayout_Layout_layout_constraintHeight_max",
-          "ConstraintLayout_Layout_constraintSet",
-          "ConstraintLayout_Layout_layout_constraintHeight_min",
-          "ConstraintLayout_Layout_layout_goneMarginStart",
-          "ConstraintSet_android_elevation",
-          "ConstraintSet_layout_constraintTop_toBottomOf",
-          "ConstraintLayout_Layout_layout_constraintLeft_toRightOf",
-          "ConstraintLayout_Layout_layout_constraintStart_toStartOf",
-          "ConstraintSet_layout_constraintHorizontal_chainStyle",
-          "ConstraintLayout_Layout_android_maxWidth",
-          "ConstraintLayout_Layout_layout_constraintHorizontal_bias",
-          "ConstraintLayout_Layout_layout_constraintHeight_default",
-          "ConstraintSet_layout_constraintRight_toLeftOf",
-          "ConstraintLayout_Layout_android_minWidth",
-          "ConstraintSet_layout_constraintVertical_chainStyle",
-          "ConstraintLayout_Layout_layout_constraintGuide_end",
-          "ConstraintSet_layout_goneMarginBottom"
-        ]
-      },
-      "android/support/v4/view/ViewPager": {
-        "androidx/widget/ViewPager": [
-          "SCROLL_STATE_DRAGGING",
-          "MIN_FLING_VELOCITY",
-          "LAYOUT_ATTRS",
-          "DRAW_ORDER_DEFAULT",
-          "DEFAULT_OFFSCREEN_PAGES",
-          "USE_CACHE",
-          "INVALID_POINTER",
-          "sPositionComparator",
-          "SCROLL_STATE_IDLE",
-          "TAG",
-          "DEBUG",
-          "MAX_SETTLE_DURATION",
-          "SCROLL_STATE_SETTLING",
-          "DEFAULT_GUTTER_SIZE",
-          "sInterpolator",
-          "MIN_DISTANCE_FOR_FLING",
-          "DRAW_ORDER_REVERSE",
-          "CLOSE_ENOUGH",
-          "DRAW_ORDER_FORWARD",
-          "COMPARATOR"
-        ]
-      },
-      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplBase$MessageHandler": {
-        "androidx/media/session/MediaSessionCompat$MediaSessionImplBase$MessageHandler": [
-          "MSG_CUSTOM_ACTION",
-          "MSG_SET_VOLUME",
-          "MSG_SET_SHUFFLE_MODE",
-          "MSG_PREPARE",
-          "MSG_COMMAND",
-          "MSG_REMOVE_QUEUE_ITEM",
-          "MSG_RATE_EXTRA",
-          "MSG_PREPARE_SEARCH",
-          "MSG_FAST_FORWARD",
-          "MSG_PREPARE_URI",
-          "MSG_PAUSE",
-          "MSG_PLAY_URI",
-          "MSG_STOP",
-          "MSG_SKIP_TO_ITEM",
-          "MSG_ADD_QUEUE_ITEM",
-          "MSG_RATE",
-          "MSG_PLAY",
-          "MSG_NEXT",
-          "MSG_REMOVE_QUEUE_ITEM_AT",
-          "MSG_SET_REPEAT_MODE",
-          "MSG_PREVIOUS",
-          "MSG_SEEK_TO",
-          "MSG_PLAY_SEARCH",
-          "MSG_PLAY_MEDIA_ID",
-          "MSG_MEDIA_BUTTON",
-          "KEYCODE_MEDIA_PAUSE",
-          "MSG_PREPARE_MEDIA_ID",
-          "KEYCODE_MEDIA_PLAY",
-          "MSG_ADD_QUEUE_ITEM_AT",
-          "MSG_SET_CAPTIONING_ENABLED",
-          "MSG_ADJUST_VOLUME",
-          "MSG_REWIND"
-        ]
-      },
-      "android/support/design/R$dimen": {
-        "androidx/design/R$dimen": [
-          "design_bottom_navigation_item_min_width",
-          "design_tab_scrollable_min_width",
-          "design_tab_text_size_2line",
-          "design_bottom_sheet_peek_height_min",
-          "design_fab_size_mini",
-          "design_snackbar_padding_vertical_2lines",
-          "design_snackbar_padding_vertical",
-          "design_bottom_navigation_item_max_width",
-          "design_bottom_navigation_active_text_size",
-          "design_navigation_separator_vertical_padding",
-          "design_navigation_icon_size",
-          "design_bottom_navigation_text_size",
-          "design_fab_image_size",
-          "design_bottom_navigation_height",
-          "design_bottom_navigation_margin",
-          "design_fab_size_normal",
-          "design_bottom_navigation_active_item_max_width",
-          "design_bottom_navigation_shadow_height"
-        ]
-      },
-      "android/support/multidex/MultiDex": {
-        "androidx/multidex/MultiDex": [
-          "installedApk",
-          "CODE_CACHE_SECONDARY_FOLDER_NAME",
-          "CODE_CACHE_NAME",
-          "VM_WITH_MULTIDEX_VERSION_MAJOR",
-          "TAG",
-          "NO_KEY_PREFIX",
-          "IS_VM_MULTIDEX_CAPABLE",
-          "VM_WITH_MULTIDEX_VERSION_MINOR",
-          "MIN_SDK_VERSION",
-          "MAX_SUPPORTED_SDK_VERSION",
-          "OLD_SECONDARY_FOLDER_NAME"
-        ]
-      },
-      "android/support/constraint/ConstraintSet$Constraint": {
-        "androidx/constraint/ConstraintSet$Constraint": [
-          "guidePercent",
-          "topToTop",
-          "guideEnd",
-          "heightDefault",
-          "topMargin",
-          "goneRightMargin",
-          "goneTopMargin",
-          "visibility",
-          "elevation",
-          "dimensionRatio",
-          "startToStart",
-          "widthMax",
-          "applyElevation",
-          "widthMin",
-          "verticalWeight",
-          "endToStart",
-          "bottomToTop",
-          "rotationY",
-          "rotationX",
-          "horizontalBias",
-          "translationY",
-          "translationZ",
-          "translationX",
-          "transformPivotX",
-          "transformPivotY",
-          "leftMargin",
-          "horizontalChainStyle",
-          "orientation",
-          "leftToRight",
-          "endMargin",
-          "verticalBias",
-          "heightMax",
-          "scaleX",
-          "scaleY",
-          "rightMargin",
-          "leftToLeft",
-          "heightMin",
-          "endToEnd",
-          "topToBottom",
-          "startMargin",
-          "goneLeftMargin",
-          "bottomToBottom",
-          "editorAbsoluteY",
-          "editorAbsoluteX",
-          "baselineToBaseline",
-          "horizontalWeight",
-          "guideBegin",
-          "bottomMargin",
-          "widthDefault",
-          "startToEnd",
-          "rightToRight",
-          "alpha",
-          "UNSET",
-          "goneStartMargin",
-          "rightToLeft",
-          "goneBottomMargin",
-          "verticalChainStyle",
-          "goneEndMargin"
-        ]
-      },
-      "android/support/compat/R$id": {
-        "androidx/compat/R$id": [
-          "right_icon",
-          "action_container",
-          "icon",
-          "notification_background",
-          "line1",
-          "line3",
-          "text",
-          "action_divider",
-          "time",
-          "action_text",
-          "right_side",
-          "notification_main_column",
-          "action_image",
-          "tag_transition_group",
-          "title",
-          "text2",
-          "actions",
-          "notification_main_column_container",
-          "info",
-          "chronometer"
-        ]
-      },
-      "android/support/v7/widget/helper/ItemTouchHelper": {
-        "androidx/widget/helper/ItemTouchHelper": [
-          "DOWN",
-          "DEBUG",
-          "PIXELS_PER_SECOND",
-          "ACTION_STATE_SWIPE",
-          "ANIMATION_TYPE_SWIPE_CANCEL",
-          "END",
-          "UP",
-          "START",
-          "ANIMATION_TYPE_SWIPE_SUCCESS",
-          "ANIMATION_TYPE_DRAG",
-          "LEFT",
-          "ACTIVE_POINTER_ID_NONE",
-          "RIGHT",
-          "TAG",
-          "ACTION_STATE_DRAG",
-          "ACTION_MODE_IDLE_MASK",
-          "ACTION_MODE_SWIPE_MASK",
-          "DIRECTION_FLAG_COUNT",
-          "ACTION_MODE_DRAG_MASK",
-          "ACTION_STATE_IDLE"
-        ]
-      },
-      "android/support/graphics/drawable/VectorDrawableCompat": {
-        "androidx/graphics/drawable/VectorDrawableCompat": [
-          "LINECAP_ROUND",
-          "SHAPE_VECTOR",
-          "LOGTAG",
-          "DEFAULT_TINT_MODE",
-          "SHAPE_CLIP_PATH",
-          "LINECAP_SQUARE",
-          "LINEJOIN_MITER",
-          "LINEJOIN_ROUND",
-          "LINEJOIN_BEVEL",
-          "LINECAP_BUTT",
-          "SHAPE_PATH",
-          "MAX_CACHED_BITMAP_SIZE",
-          "DBG_VECTOR_DRAWABLE",
-          "SHAPE_GROUP"
-        ]
-      },
-      "android/support/v14/preference/R$styleable": {
-        "androidx/preference/R$styleable": [
-          "SwitchPreference_switchTextOff",
-          "SwitchPreference_switchTextOn",
-          "SwitchPreference_disableDependentsState",
-          "PreferenceFragment",
-          "SwitchPreference_android_summaryOn",
-          "PreferenceFragment_android_dividerHeight",
-          "SwitchPreference_android_switchTextOff",
-          "SwitchPreference_android_summaryOff",
-          "PreferenceFragment_allowDividerAfterLastItem",
-          "SwitchPreference",
-          "SwitchPreference_summaryOff",
-          "SwitchPreference_summaryOn",
-          "SwitchPreference_android_switchTextOn",
-          "PreferenceFragment_android_divider",
-          "SwitchPreference_android_disableDependentsState",
-          "PreferenceFragment_android_layout"
-        ]
-      },
-      "android/support/v7/app/MediaRouteControllerDialog": {
-        "androidx/app/MediaRouteControllerDialog": [
-          "BUTTON_DISCONNECT_RES_ID",
-          "DEBUG",
-          "BUTTON_NEUTRAL_RES_ID",
-          "VOLUME_UPDATE_DELAY_MILLIS",
-          "CONNECTION_TIMEOUT_MILLIS",
-          "BUTTON_STOP_RES_ID",
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/picker/PickerUtility": {
-        "androidx/leanback/widget/picker/PickerUtility": [
-          "SUPPORTS_BEST_DATE_TIME_PATTERN"
-        ]
-      },
-      "android/support/wear/widget/drawer/WearableActionDrawerView$TitleViewHolder": {
-        "androidx/wear/widget/drawer/WearableActionDrawerView$TitleViewHolder": [
-          "textView",
-          "view"
-        ]
-      },
-      "android/support/customtabs/CustomTabsIntent": {
-        "androidx/browser/customtabs/CustomTabsIntent": [
-          "TOOLBAR_ACTION_BUTTON_ID",
-          "EXTRA_ACTION_BUTTON_BUNDLE",
-          "EXTRA_EXIT_ANIMATION_BUNDLE",
-          "EXTRA_MENU_ITEMS",
-          "EXTRA_CLOSE_BUTTON_ICON",
-          "startAnimationBundle",
-          "KEY_ICON",
-          "EXTRA_SESSION",
-          "EXTRA_DEFAULT_SHARE_MENU_ITEM",
-          "MAX_TOOLBAR_ITEMS",
-          "intent",
-          "EXTRA_SECONDARY_TOOLBAR_COLOR",
-          "KEY_ID",
-          "EXTRA_TOOLBAR_COLOR",
-          "SHOW_PAGE_TITLE",
-          "EXTRA_TITLE_VISIBILITY_STATE",
-          "EXTRA_TOOLBAR_ITEMS",
-          "EXTRA_TINT_ACTION_BUTTON",
-          "NO_TITLE",
-          "KEY_DESCRIPTION",
-          "EXTRA_ENABLE_INSTANT_APPS",
-          "EXTRA_REMOTEVIEWS_PENDINGINTENT",
-          "EXTRA_REMOTEVIEWS_CLICKED_ID",
-          "KEY_MENU_ITEM_TITLE",
-          "EXTRA_ENABLE_URLBAR_HIDING",
-          "KEY_PENDING_INTENT",
-          "EXTRA_REMOTEVIEWS",
-          "EXTRA_USER_OPT_OUT_FROM_CUSTOM_TABS",
-          "EXTRA_REMOTEVIEWS_VIEW_IDS"
-        ]
-      },
-      "android/support/wear/R$styleable": {
-        "androidx/wear/R$styleable": [
-          "PageIndicatorView_wsPageIndicatorDotFadeInDuration",
-          "CircularProgressLayout_strokeWidth",
-          "WearableActionDrawerView",
-          "WearableRecyclerView_circularScrollingGestureEnabled",
-          "PageIndicatorView_wsPageIndicatorDotColor",
-          "PageIndicatorView",
-          "WearableActionDrawerView_actionMenu",
-          "PageIndicatorView_wsPageIndicatorDotFadeOutDelay",
-          "PageIndicatorView_wsPageIndicatorDotRadius",
-          "PageIndicatorView_wsPageIndicatorDotRadiusSelected",
-          "RoundedDrawable",
-          "WearableNavigationDrawerView_navigationStyle",
-          "CircledImageView_img_horizontal_offset_percentage",
-          "CircularProgressLayout",
-          "CircledImageView_img_tint",
-          "WearableActionDrawerView_showOverflowInPeek",
-          "CircledImageView_background_border_cap",
-          "CircledImageView_img_circle_percentage",
-          "BoxInsetLayout_Layout",
-          "CircledImageView_background_radius_pressed_percent",
-          "WearableActionDrawerView_drawerTitle",
-          "WearableRecyclerView",
-          "PageIndicatorView_wsPageIndicatorDotColorSelected",
-          "CircledImageView_img_padding",
-          "WearableDrawerView_android_elevation",
-          "RoundedDrawable_backgroundColor",
-          "PageIndicatorView_wsPageIndicatorDotShadowDx",
-          "PageIndicatorView_wsPageIndicatorDotShadowDy",
-          "CircularProgressLayout_backgroundColor",
-          "CircledImageView_background_radius_pressed",
-          "WearableDrawerView",
-          "BoxInsetLayout_Layout_boxedEdges",
-          "RoundedDrawable_radius",
-          "CircularProgressLayout_indeterminate",
-          "WearableDrawerView_peekView",
-          "WearableDrawerView_android_background",
-          "WearableDrawerView_enableAutoPeek",
-          "CircledImageView",
-          "PageIndicatorView_wsPageIndicatorDotFadeOutDuration",
-          "CircledImageView_background_shadow_width",
-          "CircledImageView_android_src",
-          "CircledImageView_background_radius_percent",
-          "PageIndicatorView_wsPageIndicatorDotShadowRadius",
-          "WearableRecyclerView_scrollDegreesPerScreen",
-          "CircledImageView_background_color",
-          "CircledImageView_clip_dimen",
-          "CircledImageView_background_radius",
-          "PageIndicatorView_wsPageIndicatorDotShadowColor",
-          "RoundedDrawable_clipEnabled",
-          "RoundedDrawable_android_src",
-          "WearableRecyclerView_bezelWidth",
-          "CircularProgressLayout_colorSchemeColors",
-          "WearableDrawerView_drawerContent",
-          "CircledImageView_background_border_color",
-          "WearableNavigationDrawerView",
-          "PageIndicatorView_wsPageIndicatorDotSpacing",
-          "CircledImageView_background_border_width",
-          "PageIndicatorView_wsPageIndicatorDotFadeWhenIdle"
-        ]
-      },
-      "android/support/v17/leanback/widget/PlaybackControlsRow$ShuffleAction": {
-        "androidx/leanback/widget/PlaybackControlsRow$ShuffleAction": [
-          "INDEX_ON",
-          "INDEX_OFF",
-          "ON",
-          "OFF"
-        ]
-      },
-      "android/support/v7/widget/TooltipCompatHandler": {
-        "androidx/widget/TooltipCompatHandler": [
-          "LONG_CLICK_HIDE_TIMEOUT_MS",
-          "sActiveHandler",
-          "HOVER_HIDE_TIMEOUT_MS",
-          "TAG",
-          "HOVER_HIDE_TIMEOUT_SHORT_MS"
-        ]
-      },
-      "android/support/v4/media/AudioAttributesCompat$AudioManagerHidden": {
-        "androidx/media/AudioAttributesCompat$AudioManagerHidden": [
-          "STREAM_TTS",
-          "STREAM_BLUETOOTH_SCO",
-          "STREAM_SYSTEM_ENFORCED",
-          "STREAM_ACCESSIBILITY"
-        ]
-      },
-      "android/support/v17/leanback/widget/CursorObjectAdapter": {
-        "androidx/leanback/widget/CursorObjectAdapter": [
-          "CACHE_SIZE"
-        ]
-      },
-      "android/support/v7/mediarouter/R$dimen": {
-        "androidx/mediarouter/R$dimen": [
-          "mr_controller_volume_group_list_padding_top",
-          "mr_controller_volume_group_list_max_height",
-          "mr_controller_volume_group_list_item_height",
-          "mr_controller_volume_group_list_item_icon_size",
-          "mr_dialog_fixed_width_major",
-          "mr_dialog_fixed_width_minor"
-        ]
-      },
-      "android/support/transition/Transition": {
-        "androidx/transition/Transition": [
-          "MATCH_INSTANCE",
-          "MATCH_LAST",
-          "MATCH_FIRST",
-          "sRunningAnimators",
-          "MATCH_ID_STR",
-          "DBG",
-          "MATCH_INSTANCE_STR",
-          "MATCH_ITEM_ID",
-          "DEFAULT_MATCH_ORDER",
-          "MATCH_NAME_STR",
-          "MATCH_NAME",
-          "STRAIGHT_PATH_MOTION",
-          "MATCH_ITEM_ID_STR",
-          "MATCH_ID",
-          "LOG_TAG"
-        ]
-      },
-      "android/support/design/widget/CoordinatorLayout": {
-        "androidx/widget/CoordinatorLayout": [
-          "EVENT_VIEW_REMOVED",
-          "sConstructors",
-          "TOP_SORTED_CHILDREN_COMPARATOR",
-          "TYPE_ON_TOUCH",
-          "sRectPool",
-          "CONSTRUCTOR_PARAMS",
-          "TAG",
-          "EVENT_NESTED_SCROLL",
-          "WIDGET_PACKAGE_NAME",
-          "EVENT_PRE_DRAW",
-          "TYPE_ON_INTERCEPT"
-        ]
-      },
-      "android/support/constraint/ConstraintSet": {
-        "androidx/constraint/ConstraintSet": [
-          "CHAIN_SPREAD_INSIDE",
-          "UNUSED",
-          "GONE_LEFT_MARGIN",
-          "WIDTH_MAX",
-          "DIMENSION_RATIO",
-          "WIDTH_MIN",
-          "GUIDE_BEGIN",
-          "START_TO_START",
-          "ORIENTATION",
-          "RIGHT_TO_LEFT",
-          "VERTICAL",
-          "GUIDE_PERCENT",
-          "GONE_END_MARGIN",
-          "CHAIN_SPREAD",
-          "LAYOUT_HEIGHT",
-          "HORIZONTAL_STYLE",
-          "TOP_MARGIN",
-          "TRANSLATION_X",
-          "TRANSLATION_Z",
-          "TRANSLATION_Y",
-          "ELEVATION",
-          "EDITOR_ABSOLUTE_Y",
-          "EDITOR_ABSOLUTE_X",
-          "END_TO_START",
-          "DEBUG",
-          "MATCH_CONSTRAINT",
-          "BOTTOM_TO_TOP",
-          "RIGHT_MARGIN",
-          "TRANSFORM_PIVOT_Y",
-          "TRANSFORM_PIVOT_X",
-          "WRAP_CONTENT",
-          "BASELINE",
-          "HORIZONTAL_BIAS",
-          "SCALE_Y",
-          "SCALE_X",
-          "VISIBILITY_FLAGS",
-          "CHAIN_PACKED",
-          "VERTICAL_STYLE",
-          "mapToConstant",
-          "HORIZONTAL_GUIDELINE",
-          "LEFT",
-          "START_MARGIN",
-          "PARENT_ID",
-          "GUIDE_END",
-          "END_TO_END",
-          "TOP",
-          "LAYOUT_VISIBILITY",
-          "GONE_BOTTOM_MARGIN",
-          "LEFT_MARGIN",
-          "RIGHT",
-          "GONE_TOP_MARGIN",
-          "VERTICAL_GUIDELINE",
-          "START",
-          "GONE_RIGHT_MARGIN",
-          "TAG",
-          "GONE_START_MARGIN",
-          "HEIGHT_MIN",
-          "MATCH_CONSTRAINT_WRAP",
-          "UNSET",
-          "HEIGHT_MAX",
-          "END",
-          "BASELINE_TO_BASELINE",
-          "LAYOUT_WIDTH",
-          "VERTICAL_BIAS",
-          "HORIZONTAL",
-          "MATCH_CONSTRAINT_SPREAD",
-          "ALPHA",
-          "TOP_TO_TOP",
-          "RIGHT_TO_RIGHT",
-          "TOP_TO_BOTTOM",
-          "BOTTOM",
-          "LEFT_TO_LEFT",
-          "VIEW_ID",
-          "INVISIBLE",
-          "VERTICAL_WEIGHT",
-          "VISIBLE",
-          "HEIGHT_DEFAULT",
-          "WIDTH_DEFAULT",
-          "LEFT_TO_RIGHT",
-          "END_MARGIN",
-          "BOTTOM_MARGIN",
-          "HORIZONTAL_WEIGHT",
-          "START_TO_END",
-          "BOTTOM_TO_BOTTOM",
-          "GONE",
-          "ROTATION_X",
-          "ROTATION_Y"
-        ]
-      },
-      "android/support/v4/app/FrameMetricsAggregator$FrameMetricsApi24Impl": {
-        "androidx/app/FrameMetricsAggregator$FrameMetricsApi24Impl": [
-          "NANOS_PER_MS",
-          "NANOS_ROUNDING_VALUE",
-          "sHandlerThread",
-          "sHandler"
-        ]
-      },
-      "android/support/v4/view/GestureDetectorCompat$GestureDetectorCompatImplBase": {
-        "androidx/view/GestureDetectorCompat$GestureDetectorCompatImplBase": [
-          "LONGPRESS_TIMEOUT",
-          "TAP_TIMEOUT",
-          "DOUBLE_TAP_TIMEOUT",
-          "LONG_PRESS",
-          "TAP",
-          "SHOW_PRESS"
-        ]
-      },
-      "android/support/multidex/MultiDexExtractor": {
-        "androidx/multidex/MultiDexExtractor": [
-          "KEY_DEX_TIME",
-          "MAX_EXTRACT_ATTEMPTS",
-          "TAG",
-          "DEX_PREFIX",
-          "DEX_SUFFIX",
-          "EXTRACTED_NAME_EXT",
-          "KEY_CRC",
-          "KEY_DEX_CRC",
-          "NO_VALUE",
-          "LOCK_FILENAME",
-          "KEY_TIME_STAMP",
-          "EXTRACTED_SUFFIX",
-          "BUFFER_SIZE",
-          "KEY_DEX_NUMBER",
-          "PREFS_FILE"
-        ]
-      },
-      "android/support/v4/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat": {
-        "androidx/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat": [
-          "ACTION_FOCUS",
-          "ACTION_SCROLL_BACKWARD",
-          "ACTION_SCROLL_DOWN",
-          "ACTION_CONTEXT_CLICK",
-          "ACTION_CLEAR_FOCUS",
-          "ACTION_ACCESSIBILITY_FOCUS",
-          "ACTION_PASTE",
-          "ACTION_SET_PROGRESS",
-          "ACTION_EXPAND",
-          "ACTION_NEXT_HTML_ELEMENT",
-          "ACTION_SCROLL_UP",
-          "ACTION_SCROLL_FORWARD",
-          "ACTION_CLEAR_SELECTION",
-          "ACTION_LONG_CLICK",
-          "ACTION_SET_TEXT",
-          "ACTION_NEXT_AT_MOVEMENT_GRANULARITY",
-          "ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY",
-          "ACTION_SHOW_ON_SCREEN",
-          "ACTION_COLLAPSE",
-          "ACTION_COPY",
-          "ACTION_SCROLL_LEFT",
-          "ACTION_PREVIOUS_HTML_ELEMENT",
-          "ACTION_SET_SELECTION",
-          "ACTION_CLEAR_ACCESSIBILITY_FOCUS",
-          "ACTION_SCROLL_TO_POSITION",
-          "ACTION_DISMISS",
-          "ACTION_CLICK",
-          "ACTION_CUT",
-          "ACTION_SCROLL_RIGHT",
-          "ACTION_SELECT"
-        ]
-      },
-      "android/support/v4/graphics/drawable/DrawableWrapperApi21": {
-        "androidx/graphics/drawable/DrawableWrapperApi21": [
-          "sIsProjectedDrawableMethod",
-          "TAG"
-        ]
-      },
-      "android/support/v7/media/MediaRouter$RouteInfo": {
-        "androidx/media/MediaRouter$RouteInfo": [
-          "PRESENTATION_DISPLAY_ID_NONE",
-          "SYSTEM_MEDIA_ROUTE_PROVIDER_PACKAGE_NAME",
-          "PLAYBACK_TYPE_REMOTE",
-          "CHANGE_VOLUME",
-          "DEVICE_TYPE_BLUETOOTH",
-          "CHANGE_PRESENTATION_DISPLAY",
-          "CHANGE_GENERAL",
-          "CONNECTION_STATE_DISCONNECTED",
-          "DEVICE_TYPE_TV",
-          "PLAYBACK_VOLUME_VARIABLE",
-          "CONNECTION_STATE_CONNECTING",
-          "PLAYBACK_TYPE_LOCAL",
-          "DEVICE_TYPE_UNKNOWN",
-          "CONNECTION_STATE_CONNECTED",
-          "PLAYBACK_VOLUME_FIXED",
-          "DEVICE_TYPE_SPEAKER"
-        ]
-      },
-      "android/support/v17/leanback/widget/picker/TimePicker": {
-        "androidx/leanback/widget/picker/TimePicker": [
-          "TAG",
-          "HOURS_IN_HALF_DAY",
-          "AM_INDEX",
-          "PM_INDEX"
-        ]
-      },
-      "android/support/v7/widget/RecyclerView": {
-        "androidx/widget/RecyclerView": [
-          "LAYOUT_MANAGER_CONSTRUCTOR_SIGNATURE",
-          "TRACE_ON_DATA_SET_CHANGE_LAYOUT_TAG",
-          "NO_ID",
-          "NO_POSITION",
-          "DISPATCH_TEMP_DETACH",
-          "TRACE_SCROLL_TAG",
-          "SCROLL_STATE_DRAGGING",
-          "TRACE_PREFETCH_TAG",
-          "INVALID_POINTER",
-          "MAX_SCROLL_DURATION",
-          "TOUCH_SLOP_PAGING",
-          "TOUCH_SLOP_DEFAULT",
-          "VERBOSE_TRACING",
-          "TRACE_CREATE_VIEW_TAG",
-          "ALLOW_SIZE_IN_UNSPECIFIED_SPEC",
-          "FORCE_ABS_FOCUS_SEARCH_DIRECTION",
-          "TRACE_BIND_VIEW_TAG",
-          "HORIZONTAL",
-          "ALLOW_THREAD_GAP_WORK",
-          "DEBUG",
-          "TRACE_NESTED_PREFETCH_TAG",
-          "SCROLL_STATE_SETTLING",
-          "POST_UPDATES_ON_ANIMATION",
-          "sQuinticInterpolator",
-          "VERTICAL",
-          "CLIP_TO_PADDING_ATTR",
-          "FOREVER_NS",
-          "IGNORE_DETACHED_FOCUSED_CHILD",
-          "INVALID_TYPE",
-          "SCROLL_STATE_IDLE",
-          "NESTED_SCROLLING_ATTRS",
-          "TAG",
-          "TRACE_ON_LAYOUT_TAG",
-          "FORCE_INVALIDATE_DISPLAY_LIST",
-          "TRACE_HANDLE_ADAPTER_UPDATES_TAG"
-        ]
-      },
-      "android/support/v4/view/PagerAdapter": {
-        "androidx/widget/PagerAdapter": [
-          "POSITION_NONE",
-          "POSITION_UNCHANGED"
-        ]
-      },
-      "android/support/v4/view/accessibility/AccessibilityNodeInfoCompat": {
-        "androidx/view/accessibility/AccessibilityNodeInfoCompat": [
-          "ACTION_PREVIOUS_HTML_ELEMENT",
-          "ACTION_ARGUMENT_SELECTION_END_INT",
-          "ACTION_SET_SELECTION",
-          "MOVEMENT_GRANULARITY_CHARACTER",
-          "MOVEMENT_GRANULARITY_LINE",
-          "ACTION_SET_TEXT",
-          "MOVEMENT_GRANULARITY_PARAGRAPH",
-          "ACTION_SELECT",
-          "FOCUS_ACCESSIBILITY",
-          "ACTION_DISMISS",
-          "ACTION_EXPAND",
-          "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE",
-          "ACTION_CLEAR_ACCESSIBILITY_FOCUS",
-          "ACTION_CUT",
-          "ACTION_PASTE",
-          "ACTION_ARGUMENT_ROW_INT",
-          "FOCUS_INPUT",
-          "ACTION_ARGUMENT_HTML_ELEMENT_STRING",
-          "MOVEMENT_GRANULARITY_PAGE",
-          "ACTION_ARGUMENT_PROGRESS_VALUE",
-          "ACTION_CLEAR_FOCUS",
-          "MOVEMENT_GRANULARITY_WORD",
-          "ACTION_SCROLL_BACKWARD",
-          "ROLE_DESCRIPTION_KEY",
-          "ACTION_FOCUS",
-          "ACTION_NEXT_HTML_ELEMENT",
-          "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN",
-          "ACTION_CLEAR_SELECTION",
-          "ACTION_ARGUMENT_COLUMN_INT",
-          "ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY",
-          "ACTION_NEXT_AT_MOVEMENT_GRANULARITY",
-          "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT",
-          "ACTION_ACCESSIBILITY_FOCUS",
-          "ACTION_CLICK",
-          "ACTION_ARGUMENT_SELECTION_START_INT",
-          "ACTION_SCROLL_FORWARD",
-          "ACTION_COPY",
-          "ACTION_COLLAPSE",
-          "ACTION_LONG_CLICK"
-        ]
-      },
-      "android/support/media/tv/TvContractCompat$RecordedPrograms": {
-        "androidx/media/tv/TvContractCompat$RecordedPrograms": [
-          "CONTENT_URI",
-          "COLUMN_RECORDING_DURATION_MILLIS",
-          "COLUMN_CHANNEL_ID",
-          "COLUMN_BROADCAST_GENRE",
-          "COLUMN_RECORDING_DATA_BYTES",
-          "COLUMN_END_TIME_UTC_MILLIS",
-          "CONTENT_TYPE",
-          "COLUMN_RECORDING_DATA_URI",
-          "COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS",
-          "COLUMN_INPUT_ID",
-          "COLUMN_START_TIME_UTC_MILLIS",
-          "CONTENT_ITEM_TYPE"
-        ]
-      },
-      "android/support/v17/leanback/app/PlaybackSupportFragment": {
-        "androidx/leanback/app/PlaybackSupportFragment": [
-          "IDLE",
-          "ANIMATION_MULTIPLIER",
-          "ANIMATING",
-          "BG_LIGHT",
-          "START_FADE_OUT",
-          "TAG",
-          "BG_DARK",
-          "BG_NONE",
-          "BUNDLE_CONTROL_VISIBLE_ON_CREATEVIEW",
-          "DEBUG"
-        ]
-      },
-      "android/support/v17/leanback/widget/ShadowOverlayHelper$Options": {
-        "androidx/leanback/widget/ShadowOverlayHelper$Options": [
-          "DEFAULT",
-          "roundedCornerRadius",
-          "dynamicShadowUnfocusedZ",
-          "dynamicShadowFocusedZ"
-        ]
-      },
-      "android/support/v17/leanback/widget/ShadowOverlayHelper": {
-        "androidx/leanback/widget/ShadowOverlayHelper": [
-          "SHADOW_NONE",
-          "SHADOW_STATIC",
-          "SHADOW_DYNAMIC"
-        ]
-      },
-      "android/support/v4/media/MediaBrowserServiceCompat": {
-        "androidx/media/MediaBrowserServiceCompat": [
-          "EPSILON",
-          "RESULT_ERROR",
-          "DEBUG",
-          "RESULT_FLAG_ON_SEARCH_NOT_IMPLEMENTED",
-          "RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED",
-          "KEY_MEDIA_ITEM",
-          "TAG",
-          "SERVICE_INTERFACE",
-          "KEY_SEARCH_RESULTS",
-          "RESULT_OK",
-          "RESULT_PROGRESS_UPDATE",
-          "RESULT_FLAG_OPTION_NOT_HANDLED"
-        ]
-      },
-      "android/support/v13/app/FragmentPagerAdapter": {
-        "androidx/app/legacy/FragmentPagerAdapter": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/design/widget/BaseTransientBottomBar$BaseCallback": {
-        "androidx/design/widget/BaseTransientBottomBar$BaseCallback": [
-          "DISMISS_EVENT_MANUAL",
-          "DISMISS_EVENT_SWIPE",
-          "DISMISS_EVENT_TIMEOUT",
-          "DISMISS_EVENT_ACTION",
-          "DISMISS_EVENT_CONSECUTIVE"
-        ]
-      },
-      "android/support/v7/widget/GapWorker": {
-        "androidx/widget/GapWorker": [
-          "sGapWorker",
-          "sTaskComparator"
-        ]
-      },
-      "android/support/v7/preference/PreferenceManager": {
-        "androidx/preference/PreferenceManager": [
-          "STORAGE_DEFAULT",
-          "KEY_HAS_SET_DEFAULT_VALUES",
-          "STORAGE_DEVICE_PROTECTED"
-        ]
-      },
-      "android/support/v4/widget/SlidingPaneLayout$LayoutParams": {
-        "androidx/widget/SlidingPaneLayout$LayoutParams": [
-          "width",
-          "ATTRS",
-          "height",
-          "dimPaint",
-          "leftMargin",
-          "weight",
-          "slideable",
-          "rightMargin",
-          "dimWhenOffset"
-        ]
-      },
-      "android/support/v17/leanback/widget/GuidedAction": {
-        "androidx/leanback/widget/GuidedAction": [
-          "ACTION_ID_CONTINUE",
-          "PF_ENABLED",
-          "ACTION_ID_YES",
-          "ACTION_ID_OK",
-          "ACTION_ID_NO",
-          "PF_INFO_ONLY",
-          "ACTION_ID_FINISH",
-          "TAG",
-          "EDITING_TITLE",
-          "EDITING_DESCRIPTION",
-          "PF_MULTI_lINE_DESCRIPTION",
-          "PF_CHECKED",
-          "DEFAULT_CHECK_SET_ID",
-          "ACTION_ID_CURRENT",
-          "CHECKBOX_CHECK_SET_ID",
-          "EDITING_NONE",
-          "PF_AUTORESTORE",
-          "EDITING_ACTIVATOR_VIEW",
-          "PF_HAS_NEXT",
-          "ACTION_ID_NEXT",
-          "ACTION_ID_CANCEL",
-          "PF_FOCUSABLE",
-          "NO_CHECK_SET"
-        ]
-      },
-      "android/support/media/tv/TvContractCompat$PreviewPrograms": {
-        "androidx/media/tv/TvContractCompat$PreviewPrograms": [
-          "COLUMN_CHANNEL_ID",
-          "CONTENT_ITEM_TYPE",
-          "CONTENT_URI",
-          "CONTENT_TYPE",
-          "COLUMN_WEIGHT"
-        ]
-      },
-      "android/support/v17/leanback/widget/BaseCardView": {
-        "androidx/leanback/widget/BaseCardView": [
-          "CARD_TYPE_INFO_OVER",
-          "CARD_TYPE_INVALID",
-          "DEBUG",
-          "CARD_TYPE_INFO_UNDER",
-          "CARD_TYPE_MAIN_ONLY",
-          "LB_PRESSED_STATE_SET",
-          "CARD_REGION_VISIBLE_ALWAYS",
-          "CARD_REGION_VISIBLE_SELECTED",
-          "TAG",
-          "CARD_TYPE_INFO_UNDER_WITH_EXTRA",
-          "CARD_REGION_VISIBLE_ACTIVATED"
-        ]
-      },
-      "android/support/v7/mediarouter/R$string": {
-        "androidx/mediarouter/R$string": [
-          "mr_user_route_category_name",
-          "mr_controller_no_info_available",
-          "mr_system_route_name",
-          "mr_controller_disconnect",
-          "mr_cast_button_disconnected",
-          "mr_controller_casting_screen",
-          "mr_button_content_description",
-          "mr_controller_no_media_selected",
-          "mr_controller_expand_group",
-          "mr_controller_play",
-          "mr_controller_stop",
-          "mr_cast_button_connected",
-          "mr_controller_pause",
-          "mr_controller_collapse_group",
-          "mr_cast_button_connecting",
-          "mr_controller_stop_casting"
-        ]
-      },
-      "android/support/v4/text/util/LinkifyCompat$LinkSpec": {
-        "androidx/text/util/LinkifyCompat$LinkSpec": [
-          "end",
-          "url",
-          "frameworkAddedSpan",
-          "start"
-        ]
-      },
-      "android/support/transition/ArcMotion": {
-        "androidx/transition/ArcMotion": [
-          "DEFAULT_MIN_ANGLE_DEGREES",
-          "DEFAULT_MAX_ANGLE_DEGREES",
-          "DEFAULT_MAX_TANGENT"
-        ]
-      },
-      "android/support/v17/leanback/widget/TitleViewAdapter": {
-        "androidx/leanback/widget/TitleViewAdapter": [
-          "BRANDING_VIEW_VISIBLE",
-          "FULL_VIEW_VISIBLE",
-          "SEARCH_VIEW_VISIBLE"
-        ]
-      },
-      "android/support/v17/leanback/app/DetailsFragment": {
-        "androidx/leanback/app/DetailsFragment": [
-          "EVT_ON_CREATE",
-          "EVT_SWITCH_TO_VIDEO",
-          "STATE_ENTRANCE_INIT",
-          "STATE_SWITCH_TO_VIDEO_IN_ON_CREATE",
-          "STATE_START",
-          "EVT_DETAILS_ROW_LOADED",
-          "STATE_ENTER_TRANSITION_INIT",
-          "STATE_ENTER_TRANSITION_CANCEL",
-          "COND_TRANSITION_NOT_SUPPORTED",
-          "STATE_ENTRANCE_ON_PREPARED",
-          "EVT_NO_ENTER_TRANSITION",
-          "EVT_ON_CREATEVIEW",
-          "STATE_ENTER_TRANSITION_PENDING",
-          "EVT_ONSTART",
-          "STATE_ON_SAFE_START",
-          "DEBUG",
-          "EVT_ENTER_TRANSIITON_DONE",
-          "STATE_SET_ENTRANCE_START_STATE",
-          "STATE_ENTRANCE_PERFORM",
-          "STATE_ENTRANCE_COMPLETE",
-          "STATE_ENTER_TRANSITION_COMPLETE",
-          "STATE_ENTER_TRANSITION_ADDLISTENER",
-          "TAG"
-        ]
-      },
-      "android/support/v7/widget/FastScroller": {
-        "androidx/widget/FastScroller": [
-          "ANIMATION_STATE_OUT",
-          "ANIMATION_STATE_IN",
-          "SHOW_DURATION_MS",
-          "STATE_VISIBLE",
-          "DRAG_NONE",
-          "STATE_HIDDEN",
-          "ANIMATION_STATE_FADING_IN",
-          "STATE_DRAGGING",
-          "HIDE_DELAY_AFTER_VISIBLE_MS",
-          "DRAG_X",
-          "DRAG_Y",
-          "HIDE_DELAY_AFTER_DRAGGING_MS",
-          "HIDE_DURATION_MS",
-          "SCROLLBAR_FULL_OPAQUE",
-          "ANIMATION_STATE_FADING_OUT",
-          "PRESSED_STATE_SET",
-          "EMPTY_STATE_SET"
-        ]
-      },
-      "android/support/v7/media/MediaRouteDescriptor": {
-        "androidx/media/MediaRouteDescriptor": [
-          "KEY_VOLUME",
-          "KEY_PLAYBACK_TYPE",
-          "KEY_SETTINGS_INTENT",
-          "KEY_ID",
-          "KEY_ENABLED",
-          "KEY_MAX_CLIENT_VERSION",
-          "KEY_ICON_URI",
-          "KEY_DESCRIPTION",
-          "KEY_PLAYBACK_STREAM",
-          "KEY_GROUP_MEMBER_IDS",
-          "KEY_CONNECTION_STATE",
-          "KEY_EXTRAS",
-          "KEY_VOLUME_HANDLING",
-          "KEY_PRESENTATION_DISPLAY_ID",
-          "KEY_MIN_CLIENT_VERSION",
-          "KEY_CONTROL_FILTERS",
-          "KEY_CAN_DISCONNECT",
-          "KEY_DEVICE_TYPE",
-          "KEY_NAME",
-          "KEY_VOLUME_MAX",
-          "KEY_CONNECTING"
-        ]
-      },
-      "android/support/design/widget/BottomNavigationView": {
-        "androidx/design/widget/BottomNavigationView": [
-          "DISABLED_STATE_SET",
-          "CHECKED_STATE_SET",
-          "EMPTY_STATE_SET",
-          "MENU_PRESENTER_ID"
-        ]
-      },
-      "android/support/wear/widget/drawer/WearableActionDrawerView": {
-        "androidx/wear/widget/drawer/WearableActionDrawerView": [
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/media/PlaybackBaseControlGlue": {
-        "androidx/leanback/media/PlaybackBaseControlGlue": [
-          "ACTION_FAST_FORWARD",
-          "DEBUG",
-          "ACTION_CUSTOM_LEFT_FIRST",
-          "ACTION_SKIP_TO_PREVIOUS",
-          "TAG",
-          "ACTION_SKIP_TO_NEXT",
-          "ACTION_CUSTOM_RIGHT_FIRST",
-          "ACTION_PLAY_PAUSE",
-          "ACTION_REPEAT",
-          "ACTION_REWIND",
-          "ACTION_SHUFFLE"
-        ]
-      },
-      "android/support/v4/app/AppLaunchChecker": {
-        "androidx/app/AppLaunchChecker": [
-          "KEY_STARTED_FROM_LAUNCHER",
-          "SHARED_PREFS_NAME"
-        ]
-      },
-      "android/support/transition/Styleable$ArcMotion": {
-        "androidx/transition/Styleable$ArcMotion": [
-          "MAXIMUM_ANGLE",
-          "MINIMUM_VERTICAL_ANGLE",
-          "MINIMUM_HORIZONTAL_ANGLE"
-        ]
-      },
-      "android/support/v7/cardview/R$color": {
-        "androidx/cardview/R$color": [
-          "cardview_shadow_end_color",
-          "cardview_light_background",
-          "cardview_dark_background",
-          "cardview_shadow_start_color"
-        ]
-      },
-      "android/support/v17/leanback/app/BrowseFragment": {
-        "androidx/leanback/app/BrowseFragment": [
-          "TAG",
-          "EVT_SCREEN_DATA_READY",
-          "LB_HEADERS_BACKSTACK",
-          "STATE_ENTRANCE_PERFORM",
-          "IS_PAGE_ROW",
-          "ARG_TITLE",
-          "HEADERS_HIDDEN",
-          "HEADER_SHOW",
-          "EVT_MAIN_FRAGMENT_VIEW_CREATED",
-          "CURRENT_SELECTED_POSITION",
-          "DEBUG",
-          "EVT_HEADER_VIEW_CREATED",
-          "STATE_ENTRANCE_ON_PREPARED",
-          "HEADERS_ENABLED",
-          "ARG_HEADERS_STATE",
-          "STATE_ENTRANCE_ON_PREPARED_ON_CREATEVIEW",
-          "STATE_SET_ENTRANCE_START_STATE",
-          "HEADERS_DISABLED",
-          "HEADER_STACK_INDEX"
-        ]
-      },
-      "android/support/media/tv/TvContractCompat$ProgramColumns": {
-        "androidx/media/tv/TvContractCompat$ProgramColumns": [
-          "COLUMN_SHORT_DESCRIPTION",
-          "COLUMN_SEASON_DISPLAY_NUMBER",
-          "COLUMN_SEASON_TITLE",
-          "COLUMN_VIDEO_WIDTH",
-          "COLUMN_AUDIO_LANGUAGE",
-          "REVIEW_RATING_STYLE_STARS",
-          "COLUMN_EPISODE_TITLE",
-          "REVIEW_RATING_STYLE_THUMBS_UP_DOWN",
-          "COLUMN_INTERNAL_PROVIDER_FLAG2",
-          "COLUMN_INTERNAL_PROVIDER_FLAG3",
-          "COLUMN_INTERNAL_PROVIDER_FLAG4",
-          "COLUMN_INTERNAL_PROVIDER_FLAG1",
-          "COLUMN_TITLE",
-          "COLUMN_POSTER_ART_URI",
-          "COLUMN_VERSION_NUMBER",
-          "COLUMN_THUMBNAIL_URI",
-          "REVIEW_RATING_STYLE_PERCENTAGE",
-          "COLUMN_EPISODE_DISPLAY_NUMBER",
-          "COLUMN_SEARCHABLE",
-          "COLUMN_VIDEO_HEIGHT",
-          "COLUMN_CANONICAL_GENRE",
-          "COLUMN_CONTENT_RATING",
-          "COLUMN_REVIEW_RATING",
-          "COLUMN_REVIEW_RATING_STYLE",
-          "COLUMN_LONG_DESCRIPTION",
-          "COLUMN_INTERNAL_PROVIDER_DATA"
-        ]
-      },
-      "android/support/v4/graphics/PaintCompat": {
-        "androidx/graphics/PaintCompat": [
-          "TOFU_STRING",
-          "sRectThreadLocal",
-          "EM_STRING"
-        ]
-      },
-      "android/support/v4/view/accessibility/AccessibilityEventCompat": {
-        "androidx/view/accessibility/AccessibilityEventCompat": [
-          "CONTENT_CHANGE_TYPE_UNDEFINED",
-          "TYPE_ANNOUNCEMENT",
-          "TYPE_TOUCH_INTERACTION_END",
-          "CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION",
-          "TYPE_TOUCH_INTERACTION_START",
-          "TYPE_TOUCH_EXPLORATION_GESTURE_END",
-          "TYPE_VIEW_HOVER_ENTER",
-          "TYPE_VIEW_ACCESSIBILITY_FOCUSED",
-          "CONTENT_CHANGE_TYPE_TEXT",
-          "TYPE_WINDOW_CONTENT_CHANGED",
-          "TYPES_ALL_MASK",
-          "TYPE_TOUCH_EXPLORATION_GESTURE_START",
-          "TYPE_WINDOWS_CHANGED",
-          "TYPE_VIEW_CONTEXT_CLICKED",
-          "TYPE_VIEW_HOVER_EXIT",
-          "CONTENT_CHANGE_TYPE_SUBTREE",
-          "TYPE_ASSIST_READING_CONTEXT",
-          "TYPE_VIEW_TEXT_SELECTION_CHANGED",
-          "TYPE_GESTURE_DETECTION_START",
-          "TYPE_VIEW_SCROLLED",
-          "TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY",
-          "TYPE_GESTURE_DETECTION_END",
-          "TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED"
-        ]
-      },
-      "android/support/v17/leanback/R$attr": {
-        "androidx/leanback/R$attr": [
-          "guidedActionContentWidthWeightTwoPanels",
-          "onboardingTheme",
-          "playbackProgressPrimaryColor",
-          "guidedActionTitleMaxLines",
-          "guidedActionPressedAnimation",
-          "playbackMediaItemNumberViewFlipperLayout",
-          "imageCardViewStyle",
-          "playbackControlsActionIcons",
-          "browseTitleViewLayout",
-          "playbackControlsIconHighlightColor",
-          "guidedStepTheme",
-          "guidedActionTitleMinLines",
-          "defaultBrandColorDark",
-          "baseCardViewStyle",
-          "browseTitleViewStyle",
-          "guidedActionVerticalPadding",
-          "guidedActionDisabledChevronAlpha",
-          "searchOrbViewStyle",
-          "defaultBrandColor",
-          "guidedStepThemeFlag",
-          "rowHeaderStyle",
-          "guidedActionDescriptionMinLines",
-          "guidedActionUnpressedAnimation",
-          "guidedActionEnabledChevronAlpha"
-        ]
-      },
-      "android/support/media/ExifInterface$ExifTag": {
-        "androidx/media/ExifInterface$ExifTag": [
-          "number",
-          "primaryFormat",
-          "name",
-          "secondaryFormat"
-        ]
-      },
-      "android/support/v4/widget/ContentLoadingProgressBar": {
-        "androidx/widget/ContentLoadingProgressBar": [
-          "MIN_DELAY",
-          "MIN_SHOW_TIME"
-        ]
-      },
-      "android/support/transition/ViewGroupUtilsApi14": {
-        "androidx/transition/ViewGroupUtilsApi14": [
-          "TAG",
-          "LAYOUT_TRANSITION_CHANGING",
-          "sEmptyLayoutTransition",
-          "sCancelMethod",
-          "sLayoutSuppressedField",
-          "sCancelMethodFetched",
-          "sLayoutSuppressedFieldFetched"
-        ]
-      },
-      "android/support/design/internal/NavigationMenuPresenter$NavigationMenuAdapter": {
-        "androidx/design/internal/NavigationMenuPresenter$NavigationMenuAdapter": [
-          "STATE_ACTION_VIEWS",
-          "VIEW_TYPE_SEPARATOR",
-          "VIEW_TYPE_HEADER",
-          "VIEW_TYPE_SUBHEADER",
-          "VIEW_TYPE_NORMAL",
-          "STATE_CHECKED_ITEM"
-        ]
-      },
-      "android/support/v4/os/LocaleListHelper": {
-        "androidx/os/LocaleListHelper": [
-          "EN_LATN",
-          "LOCALE_EN_XA",
-          "sDefaultAdjustedLocaleList",
-          "sLock",
-          "sLastExplicitlySetLocaleList",
-          "sEmptyLocaleList",
-          "sEmptyList",
-          "NUM_PSEUDO_LOCALES",
-          "STRING_AR_XB",
-          "sDefaultLocaleList",
-          "sLastDefaultLocale",
-          "STRING_EN_XA",
-          "LOCALE_AR_XB"
-        ]
-      },
-      "android/support/v4/app/NotificationCompat$CarExtender": {
-        "androidx/app/NotificationCompat$CarExtender": [
-          "KEY_TIMESTAMP",
-          "EXTRA_LARGE_ICON",
-          "KEY_ON_READ",
-          "KEY_PARTICIPANTS",
-          "KEY_ON_REPLY",
-          "KEY_AUTHOR",
-          "KEY_REMOTE_INPUT",
-          "KEY_TEXT",
-          "KEY_MESSAGES",
-          "EXTRA_CAR_EXTENDER",
-          "EXTRA_COLOR",
-          "EXTRA_CONVERSATION"
-        ]
-      },
-      "android/support/wear/R$layout": {
-        "androidx/wear/R$layout": [
-          "ws_navigation_drawer_item_view",
-          "ws_single_page_nav_drawer_7_item",
-          "ws_single_page_nav_drawer_4_item",
-          "ws_action_drawer_item_view",
-          "ws_single_page_nav_drawer_2_item",
-          "ws_navigation_drawer_view",
-          "ws_single_page_nav_drawer_5_item",
-          "ws_wearable_drawer_view",
-          "ws_single_page_nav_drawer_3_item",
-          "ws_single_page_nav_drawer_peek_view",
-          "ws_action_drawer_title_view",
-          "ws_action_drawer_peek_view",
-          "ws_single_page_nav_drawer_1_item",
-          "ws_single_page_nav_drawer_6_item"
-        ]
-      },
-      "android/support/v4/content/pm/ActivityInfoCompat": {
-        "androidx/content/pm/ActivityInfoCompat": [
-          "CONFIG_UI_MODE"
-        ]
-      },
-      "android/support/v7/mediarouter/R$layout": {
-        "androidx/mediarouter/R$layout": [
-          "mr_chooser_dialog",
-          "mr_controller_material_dialog_b",
-          "mr_chooser_list_item",
-          "mr_controller_volume_item"
-        ]
-      },
-      "android/support/v7/app/AppCompatDelegateImplV9$PanelFeatureState": {
-        "androidx/app/AppCompatDelegateImplV9$PanelFeatureState": [
-          "x",
-          "y",
-          "frozenActionViewState",
-          "refreshDecorView",
-          "createdPanelView",
-          "frozenMenuState",
-          "qwertyMode",
-          "featureId",
-          "listPresenterContext",
-          "listMenuPresenter",
-          "decorView",
-          "isPrepared",
-          "wasLastOpen",
-          "isOpen",
-          "gravity",
-          "background",
-          "isHandled",
-          "windowAnimations",
-          "refreshMenuContent",
-          "shownPanelView",
-          "menu"
-        ]
-      },
-      "android/support/v4/graphics/TypefaceCompatBaseImpl": {
-        "androidx/graphics/TypefaceCompatBaseImpl": [
-          "TAG",
-          "CACHE_FILE_PREFIX"
-        ]
-      },
-      "android/support/media/tv/TvContractCompat$PreviewProgramColumns": {
-        "androidx/media/tv/TvContractCompat$PreviewProgramColumns": [
-          "COLUMN_DURATION_MILLIS",
-          "COLUMN_LIVE",
-          "COLUMN_OFFER_PRICE",
-          "AVAILABILITY_PURCHASED",
-          "COLUMN_INTERACTION_COUNT",
-          "INTERACTION_TYPE_FOLLOWERS",
-          "INTERACTION_TYPE_FANS",
-          "COLUMN_GENRE",
-          "INTERACTION_TYPE_LISTENS",
-          "AVAILABILITY_PAID_CONTENT",
-          "COLUMN_START_TIME_UTC_MILLIS",
-          "COLUMN_INTERACTION_TYPE",
-          "TYPE_MOVIE",
-          "TYPE_GAME",
-          "TYPE_ALBUM",
-          "TYPE_TRACK",
-          "COLUMN_POSTER_ART_ASPECT_RATIO",
-          "TYPE_EVENT",
-          "COLUMN_AVAILABILITY",
-          "COLUMN_BROWSABLE",
-          "COLUMN_INTENT_URI",
-          "COLUMN_LOGO_URI",
-          "TYPE_TV_SERIES",
-          "COLUMN_ITEM_COUNT",
-          "INTERACTION_TYPE_VIEWS",
-          "COLUMN_PREVIEW_AUDIO_URI",
-          "AVAILABILITY_FREE_WITH_SUBSCRIPTION",
-          "COLUMN_PREVIEW_VIDEO_URI",
-          "COLUMN_LAST_PLAYBACK_POSITION_MILLIS",
-          "COLUMN_END_TIME_UTC_MILLIS",
-          "ASPECT_RATIO_4_3",
-          "INTERACTION_TYPE_THUMBS",
-          "INTERACTION_TYPE_VIEWERS",
-          "COLUMN_TYPE",
-          "ASPECT_RATIO_3_2",
-          "COLUMN_AUTHOR",
-          "TYPE_TV_EPISODE",
-          "ASPECT_RATIO_1_1",
-          "ASPECT_RATIO_2_3",
-          "COLUMN_INTERNAL_PROVIDER_ID",
-          "ASPECT_RATIO_MOVIE_POSTER",
-          "TYPE_CHANNEL",
-          "COLUMN_LOGO_CONTENT_DESCRIPTION",
-          "AVAILABILITY_FREE",
-          "COLUMN_TRANSIENT",
-          "TYPE_STATION",
-          "INTERACTION_TYPE_LIKES",
-          "TYPE_TV_SEASON",
-          "AVAILABILITY_AVAILABLE",
-          "TYPE_PLAYLIST",
-          "ASPECT_RATIO_16_9",
-          "COLUMN_RELEASE_DATE",
-          "COLUMN_CONTENT_ID",
-          "TYPE_ARTIST",
-          "COLUMN_THUMBNAIL_ASPECT_RATIO",
-          "COLUMN_STARTING_PRICE",
-          "TYPE_CLIP"
-        ]
-      },
-      "android/support/wear/widget/BoxInsetLayout": {
-        "androidx/wear/widget/BoxInsetLayout": [
-          "FACTOR",
-          "DEFAULT_CHILD_GRAVITY"
-        ]
-      },
-      "android/support/v7/graphics/ColorCutQuantizer": {
-        "androidx/graphics/palette/ColorCutQuantizer": [
-          "LOG_TAG",
-          "COMPONENT_GREEN",
-          "VBOX_COMPARATOR_VOLUME",
-          "LOG_TIMINGS",
-          "COMPONENT_RED",
-          "COMPONENT_BLUE",
-          "QUANTIZE_WORD_WIDTH",
-          "QUANTIZE_WORD_MASK"
-        ]
-      },
-      "android/support/text/emoji/flatbuffer/Struct": {
-        "androidx/text/emoji/flatbuffer/Struct": [
-          "bb",
-          "bb_pos"
-        ]
-      },
-      "android/support/v4/media/session/MediaSessionCompat": {
-        "androidx/media/session/MediaSessionCompat": [
-          "TAG",
-          "EXTRA_BINDER",
-          "ARGUMENT_MEDIA_ATTRIBUTE_VALUE",
-          "ACTION_PREPARE_FROM_MEDIA_ID",
-          "ACTION_FLAG_AS_INAPPROPRIATE",
-          "ACTION_SET_CAPTIONING_ENABLED",
-          "MEDIA_ATTRIBUTE_PLAYLIST",
-          "sMaxBitmapSize",
-          "MAX_BITMAP_SIZE_IN_DP",
-          "FLAG_HANDLES_MEDIA_BUTTONS",
-          "ACTION_ARGUMENT_CAPTIONING_ENABLED",
-          "ACTION_SET_SHUFFLE_MODE",
-          "ACTION_ARGUMENT_EXTRAS",
-          "ACTION_SKIP_AD",
-          "ACTION_ARGUMENT_REPEAT_MODE",
-          "FLAG_HANDLES_TRANSPORT_CONTROLS",
-          "ACTION_ARGUMENT_QUERY",
-          "ACTION_ARGUMENT_MEDIA_ID",
-          "ACTION_PREPARE_FROM_SEARCH",
-          "FLAG_HANDLES_QUEUE_COMMANDS",
-          "ACTION_UNFOLLOW",
-          "ACTION_ARGUMENT_RATING",
-          "ACTION_ARGUMENT_URI",
-          "ACTION_PLAY_FROM_URI",
-          "MEDIA_ATTRIBUTE_ALBUM",
-          "ACTION_SET_RATING",
-          "ACTION_SET_REPEAT_MODE",
-          "ACTION_ARGUMENT_SHUFFLE_MODE",
-          "ACTION_FOLLOW",
-          "ACTION_PREPARE_FROM_URI",
-          "ACTION_PREPARE",
-          "ARGUMENT_MEDIA_ATTRIBUTE",
-          "MEDIA_ATTRIBUTE_ARTIST"
-        ]
-      },
-      "android/support/v17/leanback/widget/GridLayoutManager": {
-        "androidx/leanback/widget/GridLayoutManager": [
-          "PREV_ROW",
-          "NEXT_ITEM",
-          "DEBUG",
-          "DEFAULT_MAX_PENDING_MOVES",
-          "TRACE",
-          "MIN_MS_SMOOTH_SCROLL_MAIN_SCREEN",
-          "sTempRect",
-          "NEXT_ROW",
-          "TAG",
-          "PREV_ITEM",
-          "sTwoInts"
-        ]
-      },
-      "android/support/v4/util/TimeUtils": {
-        "androidx/util/TimeUtils": [
-          "HUNDRED_DAY_FIELD_LEN",
-          "SECONDS_PER_MINUTE",
-          "sFormatSync",
-          "sFormatStr",
-          "SECONDS_PER_DAY",
-          "SECONDS_PER_HOUR"
-        ]
-      },
-      "android/support/v4/view/accessibility/AccessibilityWindowInfoCompat": {
-        "androidx/view/accessibility/AccessibilityWindowInfoCompat": [
-          "TYPE_APPLICATION",
-          "TYPE_SYSTEM",
-          "TYPE_ACCESSIBILITY_OVERLAY",
-          "TYPE_INPUT_METHOD",
-          "UNDEFINED",
-          "TYPE_SPLIT_SCREEN_DIVIDER"
-        ]
-      },
-      "android/support/v17/leanback/app/VerticalGridFragment": {
-        "androidx/leanback/app/VerticalGridFragment": [
-          "STATE_SET_ENTRANCE_START_STATE",
-          "EVT_ON_CREATEVIEW",
-          "STATE_ENTRANCE_ON_PREPARED",
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/v4/app/FrameMetricsAggregator": {
-        "androidx/app/FrameMetricsAggregator": [
-          "COMMAND_INDEX",
-          "SWAP_DURATION",
-          "SYNC_INDEX",
-          "ANIMATION_INDEX",
-          "LAYOUT_MEASURE_DURATION",
-          "INPUT_INDEX",
-          "TOTAL_INDEX",
-          "LAST_INDEX",
-          "LAYOUT_MEASURE_INDEX",
-          "DELAY_DURATION",
-          "COMMAND_DURATION",
-          "DBG",
-          "INPUT_DURATION",
-          "SWAP_INDEX",
-          "SYNC_DURATION",
-          "TOTAL_DURATION",
-          "TAG",
-          "ANIMATION_DURATION",
-          "DRAW_DURATION",
-          "DRAW_INDEX",
-          "EVERY_DURATION",
-          "DELAY_INDEX"
-        ]
-      },
-      "android/support/design/widget/FloatingActionButtonImpl": {
-        "androidx/design/widget/FloatingActionButtonImpl": [
-          "PRESSED_ENABLED_STATE_SET",
-          "PRESSED_ANIM_DURATION",
-          "PRESSED_ANIM_DELAY",
-          "FOCUSED_ENABLED_STATE_SET",
-          "ANIM_STATE_NONE",
-          "EMPTY_STATE_SET",
-          "ANIM_INTERPOLATOR",
-          "ENABLED_STATE_SET",
-          "ANIM_STATE_SHOWING",
-          "SHOW_HIDE_ANIM_DURATION",
-          "ANIM_STATE_HIDING"
-        ]
-      },
-      "android/support/transition/R$id": {
-        "androidx/transition/R$id": [
-          "transition_transform",
-          "ghost_view",
-          "transition_scene_layoutid_cache",
-          "save_image_matrix",
-          "save_scale_type",
-          "transition_current_scene",
-          "transition_layout_save",
-          "parent_matrix",
-          "transition_position",
-          "save_non_transition_alpha"
-        ]
-      },
-      "android/support/v7/app/ResourcesFlusher": {
-        "androidx/app/ResourcesFlusher": [
-          "sDrawableCacheField",
-          "sThemedResourceCacheClazz",
-          "sResourcesImplFieldFetched",
-          "sDrawableCacheFieldFetched",
-          "TAG",
-          "sThemedResourceCacheClazzFetched",
-          "sResourcesImplField",
-          "sThemedResourceCache_mUnthemedEntriesFieldFetched",
-          "sThemedResourceCache_mUnthemedEntriesField"
-        ]
-      },
-      "android/support/v4/app/RemoteInput": {
-        "androidx/app/RemoteInput": [
-          "EXTRA_RESULTS_DATA",
-          "TAG",
-          "RESULTS_CLIP_LABEL",
-          "EXTRA_DATA_TYPE_RESULTS_DATA"
-        ]
-      },
-      "android/support/media/tv/TvContractCompat$Programs$Genres": {
-        "androidx/media/tv/TvContractCompat$Programs$Genres": [
-          "EDUCATION",
-          "DELIMITER",
-          "LIFE_STYLE",
-          "SPORTS",
-          "GAMING",
-          "TECH_SCIENCE",
-          "DOUBLE_QUOTE",
-          "TRAVEL",
-          "CANONICAL_GENRES",
-          "MOVIES",
-          "FAMILY_KIDS",
-          "NEWS",
-          "ENTERTAINMENT",
-          "PREMIER",
-          "ARTS",
-          "EMPTY_STRING_ARRAY",
-          "DRAMA",
-          "MUSIC",
-          "COMMA",
-          "COMEDY",
-          "SHOPPING",
-          "ANIMAL_WILDLIFE"
-        ]
-      },
-      "android/support/v4/view/GravityCompat": {
-        "androidx/view/GravityCompat": [
-          "START",
-          "END",
-          "RELATIVE_LAYOUT_DIRECTION",
-          "RELATIVE_HORIZONTAL_GRAVITY_MASK"
-        ]
-      },
-      "android/support/design/R$color": {
-        "androidx/design/R$color": [
-          "design_fab_shadow_start_color",
-          "design_bottom_navigation_shadow_color",
-          "design_fab_stroke_end_outer_color",
-          "design_fab_shadow_mid_color",
-          "design_fab_stroke_end_inner_color",
-          "design_fab_shadow_end_color",
-          "design_fab_stroke_top_inner_color",
-          "design_fab_stroke_top_outer_color"
-        ]
-      },
-      "android/support/v4/view/LayoutInflaterCompat": {
-        "androidx/view/LayoutInflaterCompat": [
-          "sLayoutInflaterFactory2Field",
-          "TAG",
-          "sCheckedField",
-          "IMPL"
-        ]
-      },
-      "android/support/v13/view/inputmethod/EditorInfoCompat": {
-        "androidx/view/inputmethod/EditorInfoCompat": [
-          "IMPL",
-          "IME_FLAG_NO_PERSONALIZED_LEARNING",
-          "EMPTY_STRING_ARRAY",
-          "IME_FLAG_FORCE_ASCII"
-        ]
-      },
-      "android/support/v17/leanback/app/OnboardingSupportFragment": {
-        "androidx/leanback/app/OnboardingSupportFragment": [
-          "KEY_ENTER_ANIMATION_FINISHED",
-          "KEY_CURRENT_PAGE_INDEX",
-          "DEBUG",
-          "HEADER_DISAPPEAR_INTERPOLATOR",
-          "sSlideDistance",
-          "LOGO_SPLASH_PAUSE_DURATION_MS",
-          "HEADER_APPEAR_DELAY_MS",
-          "HEADER_ANIMATION_DURATION_MS",
-          "TAG",
-          "HEADER_APPEAR_INTERPOLATOR",
-          "DESCRIPTION_START_DELAY_MS",
-          "SLIDE_DISTANCE",
-          "KEY_LOGO_ANIMATION_FINISHED"
-        ]
-      },
-      "android/support/v4/app/BackStackRecord": {
-        "androidx/app/BackStackRecord": [
-          "TAG",
-          "OP_SET_PRIMARY_NAV",
-          "OP_DETACH",
-          "OP_NULL",
-          "OP_UNSET_PRIMARY_NAV",
-          "OP_REMOVE",
-          "OP_HIDE",
-          "OP_SHOW",
-          "OP_ADD",
-          "OP_REPLACE",
-          "OP_ATTACH"
-        ]
-      },
-      "android/support/v7/util/DiffUtil$DiffResult": {
-        "androidx/util/DiffUtil$DiffResult": [
-          "FLAG_MOVED_CHANGED",
-          "FLAG_IGNORE",
-          "FLAG_MASK",
-          "FLAG_OFFSET",
-          "FLAG_MOVED_NOT_CHANGED",
-          "FLAG_CHANGED",
-          "FLAG_NOT_CHANGED"
-        ]
-      },
-      "android/support/wear/widget/drawer/WearableDrawerView": {
-        "androidx/wear/widget/drawer/WearableDrawerView": [
-          "STATE_DRAGGING",
-          "STATE_SETTLING",
-          "STATE_IDLE"
-        ]
-      },
-      "android/support/wear/R$string": {
-        "androidx/wear/R$string": [
-          "ws_action_drawer_content_description",
-          "ws_navigation_drawer_content_description"
-        ]
-      },
-      "android/support/design/widget/SwipeDismissBehavior": {
-        "androidx/design/widget/SwipeDismissBehavior": [
-          "DEFAULT_ALPHA_START_DISTANCE",
-          "STATE_IDLE",
-          "STATE_DRAGGING",
-          "SWIPE_DIRECTION_START_TO_END",
-          "DEFAULT_ALPHA_END_DISTANCE",
-          "DEFAULT_DRAG_DISMISS_THRESHOLD",
-          "SWIPE_DIRECTION_ANY",
-          "STATE_SETTLING",
-          "SWIPE_DIRECTION_END_TO_START"
-        ]
-      },
-      "android/support/v17/leanback/widget/FullWidthDetailsOverviewSharedElementHelper": {
-        "androidx/leanback/widget/FullWidthDetailsOverviewSharedElementHelper": [
-          "DEFAULT_TIMEOUT",
-          "TAG",
-          "DEBUG"
-        ]
-      },
-      "android/support/transition/Styleable$TransitionTarget": {
-        "androidx/transition/Styleable$TransitionTarget": [
-          "EXCLUDE_CLASS",
-          "EXCLUDE_ID",
-          "TARGET_CLASS",
-          "EXCLUDE_NAME",
-          "TARGET_ID",
-          "TARGET_NAME"
-        ]
-      },
-      "android/support/v4/media/MediaDescriptionCompat": {
-        "androidx/media/MediaDescriptionCompat": [
-          "BT_FOLDER_TYPE_MIXED",
-          "CREATOR",
-          "STATUS_DOWNLOADED",
-          "STATUS_NOT_DOWNLOADED",
-          "EXTRA_BT_FOLDER_TYPE",
-          "BT_FOLDER_TYPE_GENRES",
-          "EXTRA_DOWNLOAD_STATUS",
-          "DESCRIPTION_KEY_MEDIA_URI",
-          "BT_FOLDER_TYPE_ARTISTS",
-          "DESCRIPTION_KEY_NULL_BUNDLE_FLAG",
-          "BT_FOLDER_TYPE_TITLES",
-          "STATUS_DOWNLOADING",
-          "BT_FOLDER_TYPE_YEARS",
-          "BT_FOLDER_TYPE_PLAYLISTS",
-          "BT_FOLDER_TYPE_ALBUMS"
-        ]
-      },
-      "android/support/v4/graphics/ColorUtils": {
-        "androidx/graphics/ColorUtils": [
-          "MIN_ALPHA_SEARCH_MAX_ITERATIONS",
-          "XYZ_KAPPA",
-          "MIN_ALPHA_SEARCH_PRECISION",
-          "TEMP_ARRAY",
-          "XYZ_WHITE_REFERENCE_Z",
-          "XYZ_WHITE_REFERENCE_Y",
-          "XYZ_WHITE_REFERENCE_X",
-          "XYZ_EPSILON"
-        ]
-      },
-      "android/support/v7/widget/AppCompatTextViewAutoSizeHelper": {
-        "androidx/widget/AppCompatTextViewAutoSizeHelper": [
-          "TAG",
-          "DEFAULT_AUTO_SIZE_GRANULARITY_IN_PX",
-          "UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE",
-          "DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP",
-          "VERY_WIDE",
-          "sTextViewMethodByNameCache",
-          "DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP",
-          "TEMP_RECTF"
-        ]
-      },
-      "android/support/design/R$style": {
-        "androidx/design/R$style": [
-          "Widget_Design_ScrimInsetsFrameLayout",
-          "Widget_Design_TextInputLayout",
-          "Widget_Design_TabLayout",
-          "Widget_Design_CollapsingToolbar",
-          "Widget_Design_NavigationView",
-          "TextAppearance_Design_Tab",
-          "Widget_Design_CoordinatorLayout",
-          "Theme_Design_Light_BottomSheetDialog",
-          "Widget_Design_FloatingActionButton",
-          "Widget_Design_AppBarLayout",
-          "Widget_Design_BottomNavigationView",
-          "TextAppearance_Design_CollapsingToolbar_Expanded"
-        ]
-      },
-      "android/support/v7/widget/GridLayoutManager": {
-        "androidx/widget/GridLayoutManager": [
-          "TAG",
-          "DEFAULT_SPAN_COUNT",
-          "DEBUG"
-        ]
-      },
-      "android/support/v7/appcompat/R$dimen": {
-        "androidx/appcompat/R$dimen": [
-          "tooltip_precise_anchor_extra_offset",
-          "abc_dropdownitem_icon_width",
-          "tooltip_precise_anchor_threshold",
-          "tooltip_y_offset_non_touch",
-          "abc_config_prefDialogWidth",
-          "abc_dropdownitem_text_padding_left",
-          "abc_action_bar_stacked_max_height",
-          "abc_search_view_preferred_height",
-          "abc_cascading_menus_min_smallest_width",
-          "abc_action_bar_stacked_tab_max_width",
-          "tooltip_y_offset_touch",
-          "abc_search_view_preferred_width"
-        ]
-      },
-      "android/support/wear/internal/widget/drawer/SinglePageUi": {
-        "androidx/wear/internal/widget/drawer/SinglePageUi": [
-          "SINGLE_PAGE_LAYOUT_RES",
-          "SINGLE_PAGE_BUTTON_IDS"
-        ]
-      },
-      "android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat": {
-        "androidx/accessibilityservice/AccessibilityServiceInfoCompat": [
-          "FLAG_REQUEST_TOUCH_EXPLORATION_MODE",
-          "CAPABILITY_CAN_FILTER_KEY_EVENTS",
-          "FLAG_INCLUDE_NOT_IMPORTANT_VIEWS",
-          "CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY",
-          "CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT",
-          "FEEDBACK_BRAILLE",
-          "FEEDBACK_ALL_MASK",
-          "FLAG_REPORT_VIEW_IDS",
-          "CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION",
-          "FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY",
-          "FLAG_REQUEST_FILTER_KEY_EVENTS"
-        ]
-      },
-      "android/support/graphics/drawable/AnimatorInflaterCompat": {
-        "androidx/graphics/drawable/AnimatorInflaterCompat": [
-          "MAX_NUM_POINTS",
-          "VALUE_TYPE_INT",
-          "VALUE_TYPE_FLOAT",
-          "VALUE_TYPE_COLOR",
-          "TAG",
-          "DBG_ANIMATOR_INFLATER",
-          "VALUE_TYPE_PATH",
-          "TOGETHER",
-          "VALUE_TYPE_UNDEFINED"
-        ]
-      },
-      "android/support/wear/R$id": {
-        "androidx/wear/R$id": [
-          "ws_navigation_drawer_item_icon",
-          "ws_drawer_view_peek_container",
-          "ws_navigation_drawer_item_text",
-          "ws_action_drawer_item_text",
-          "ws_drawer_view_peek_icon",
-          "ws_nav_drawer_icon_4",
-          "ws_nav_drawer_icon_5",
-          "ws_nav_drawer_icon_6",
-          "ws_nav_drawer_icon_0",
-          "ws_nav_drawer_icon_1",
-          "ws_nav_drawer_icon_2",
-          "ws_nav_drawer_icon_3",
-          "ws_navigation_drawer_page_indicator",
-          "ws_navigation_drawer_view_pager",
-          "ws_nav_drawer_text",
-          "ws_action_drawer_expand_icon",
-          "ws_action_drawer_item_icon",
-          "ws_action_drawer_title",
-          "ws_action_drawer_peek_action_icon"
-        ]
-      },
-      "android/support/v4/view/animation/LinearOutSlowInInterpolator": {
-        "androidx/view/animation/LinearOutSlowInInterpolator": [
-          "VALUES"
-        ]
-      },
-      "android/support/v4/graphics/TypefaceCompatApi24Impl": {
-        "androidx/graphics/TypefaceCompatApi24Impl": [
-          "FONT_FAMILY_CLASS",
-          "sFontFamily",
-          "TAG",
-          "sAddFontWeightStyle",
-          "sFontFamilyCtor",
-          "sCreateFromFamiliesWithDefault",
-          "ADD_FONT_WEIGHT_STYLE_METHOD",
-          "CREATE_FROM_FAMILIES_WITH_DEFAULT_METHOD"
-        ]
-      },
-      "android/support/v7/widget/AdapterHelper": {
-        "androidx/widget/AdapterHelper": [
-          "TAG",
-          "POSITION_TYPE_NEW_OR_LAID_OUT",
-          "DEBUG",
-          "POSITION_TYPE_INVISIBLE"
-        ]
-      },
-      "android/support/v4/media/session/ParcelableVolumeInfo": {
-        "androidx/media/session/ParcelableVolumeInfo": [
-          "audioStream",
-          "currentVolume",
-          "maxVolume",
-          "volumeType",
-          "CREATOR",
-          "controlType"
-        ]
-      },
-      "android/support/text/emoji/EmojiCompat": {
-        "androidx/text/emoji/EmojiCompat": [
-          "EDITOR_INFO_REPLACE_ALL_KEY",
-          "sInstanceLock",
-          "EMOJI_COUNT_UNLIMITED",
-          "LOAD_STATE_SUCCEEDED",
-          "EDITOR_INFO_METAVERSION_KEY",
-          "sInstance",
-          "REPLACE_STRATEGY_ALL",
-          "LOAD_STATE_FAILED",
-          "REPLACE_STRATEGY_NON_EXISTENT",
-          "LOAD_STATE_LOADING",
-          "REPLACE_STRATEGY_DEFAULT"
-        ]
-      },
-      "android/support/v7/graphics/Target": {
-        "androidx/graphics/palette/Target": [
-          "TARGET_MUTED_SATURATION",
-          "MUTED",
-          "MIN_NORMAL_LUMA",
-          "MAX_DARK_LUMA",
-          "VIBRANT",
-          "TARGET_LIGHT_LUMA",
-          "TARGET_NORMAL_LUMA",
-          "MAX_NORMAL_LUMA",
-          "WEIGHT_LUMA",
-          "INDEX_WEIGHT_LUMA",
-          "TARGET_VIBRANT_SATURATION",
-          "DARK_MUTED",
-          "DARK_VIBRANT",
-          "INDEX_MAX",
-          "INDEX_MIN",
-          "MAX_MUTED_SATURATION",
-          "MIN_LIGHT_LUMA",
-          "LIGHT_VIBRANT",
-          "LIGHT_MUTED",
-          "INDEX_TARGET",
-          "INDEX_WEIGHT_POP",
-          "TARGET_DARK_LUMA",
-          "WEIGHT_POPULATION",
-          "INDEX_WEIGHT_SAT",
-          "WEIGHT_SATURATION",
-          "MIN_VIBRANT_SATURATION"
-        ]
-      },
-      "android/support/v17/leanback/media/PlaybackControlGlue": {
-        "androidx/leanback/media/PlaybackControlGlue": [
-          "MSG_UPDATE_PLAYBACK_STATE",
-          "PLAYBACK_SPEED_INVALID",
-          "ACTION_REWIND",
-          "sHandler",
-          "ACTION_FAST_FORWARD",
-          "PLAYBACK_SPEED_FAST_L2",
-          "PLAYBACK_SPEED_FAST_L3",
-          "PLAYBACK_SPEED_FAST_L4",
-          "PLAYBACK_SPEED_FAST_L0",
-          "PLAYBACK_SPEED_FAST_L1",
-          "DEBUG",
-          "PLAYBACK_SPEED_PAUSED",
-          "UPDATE_PLAYBACK_STATE_DELAY_MS",
-          "PLAYBACK_SPEED_NORMAL",
-          "TAG",
-          "ACTION_SKIP_TO_NEXT",
-          "ACTION_SKIP_TO_PREVIOUS",
-          "ACTION_CUSTOM_LEFT_FIRST",
-          "ACTION_PLAY_PAUSE",
-          "NUMBER_OF_SEEK_SPEEDS",
-          "ACTION_CUSTOM_RIGHT_FIRST"
-        ]
-      },
-      "android/support/v7/widget/GridLayout$LayoutParams": {
-        "androidx/widget/GridLayout$LayoutParams": [
-          "bottomMargin",
-          "DEFAULT_SPAN",
-          "COLUMN_WEIGHT",
-          "leftMargin",
-          "GRAVITY",
-          "ROW_SPAN",
-          "ROW",
-          "COLUMN",
-          "topMargin",
-          "RIGHT_MARGIN",
-          "height",
-          "COLUMN_SPAN",
-          "rightMargin",
-          "width",
-          "ROW_WEIGHT",
-          "BOTTOM_MARGIN",
-          "DEFAULT_SPAN_SIZE",
-          "columnSpec",
-          "DEFAULT_ROW",
-          "DEFAULT_WIDTH",
-          "MARGIN",
-          "rowSpec",
-          "TOP_MARGIN",
-          "DEFAULT_HEIGHT",
-          "LEFT_MARGIN",
-          "DEFAULT_COLUMN",
-          "DEFAULT_MARGIN"
-        ]
-      },
-      "android/support/v17/leanback/app/DetailsSupportFragment": {
-        "androidx/leanback/app/DetailsSupportFragment": [
-          "EVT_ONSTART",
-          "STATE_ENTER_TRANSITION_CANCEL",
-          "DEBUG",
-          "STATE_SWITCH_TO_VIDEO_IN_ON_CREATE",
-          "STATE_ENTRANCE_COMPLETE",
-          "STATE_ENTER_TRANSITION_COMPLETE",
-          "STATE_ENTER_TRANSITION_ADDLISTENER",
-          "STATE_ENTRANCE_INIT",
-          "EVT_SWITCH_TO_VIDEO",
-          "STATE_START",
-          "STATE_ON_SAFE_START",
-          "STATE_ENTRANCE_PERFORM",
-          "EVT_ON_CREATEVIEW",
-          "STATE_SET_ENTRANCE_START_STATE",
-          "COND_TRANSITION_NOT_SUPPORTED",
-          "TAG",
-          "STATE_ENTER_TRANSITION_PENDING",
-          "EVT_ENTER_TRANSIITON_DONE",
-          "STATE_ENTRANCE_ON_PREPARED",
-          "EVT_ON_CREATE",
-          "EVT_DETAILS_ROW_LOADED",
-          "STATE_ENTER_TRANSITION_INIT",
-          "EVT_NO_ENTER_TRANSITION"
-        ]
-      },
-      "android/support/v17/leanback/app/ListRowDataAdapter": {
-        "androidx/leanback/app/ListRowDataAdapter": [
-          "ON_ITEM_RANGE_INSERTED",
-          "ON_ITEM_RANGE_CHANGED",
-          "ON_ITEM_RANGE_REMOVED",
-          "ON_CHANGED"
-        ]
-      },
-      "android/support/percent/PercentLayoutHelper$PercentLayoutInfo": {
-        "androidx/PercentLayoutHelper$PercentLayoutInfo": [
-          "topMarginPercent",
-          "endMarginPercent",
-          "aspectRatio",
-          "rightMarginPercent",
-          "heightPercent",
-          "leftMarginPercent",
-          "startMarginPercent",
-          "bottomMarginPercent",
-          "widthPercent"
-        ]
-      },
-      "android/support/v17/leanback/system/Settings": {
-        "androidx/leanback/system/Settings": [
-          "OUTLINE_CLIPPING_DISABLED",
-          "PREFER_STATIC_SHADOWS",
-          "DEBUG",
-          "sInstance",
-          "ACTION_PARTNER_CUSTOMIZATION",
-          "TAG"
-        ]
-      },
-      "android/support/v4/util/SimpleArrayMap": {
-        "androidx/util/SimpleArrayMap": [
-          "BASE_SIZE",
-          "CONCURRENT_MODIFICATION_EXCEPTIONS",
-          "DEBUG",
-          "TAG",
-          "CACHE_SIZE"
-        ]
-      },
-      "android/support/v4/widget/AutoScrollHelper": {
-        "androidx/widget/AutoScrollHelper": [
-          "EDGE_TYPE_OUTSIDE",
-          "NO_MIN",
-          "NO_MAX",
-          "HORIZONTAL",
-          "EDGE_TYPE_INSIDE_EXTEND",
-          "DEFAULT_MAXIMUM_EDGE",
-          "VERTICAL",
-          "EDGE_TYPE_INSIDE",
-          "RELATIVE_UNSPECIFIED",
-          "DEFAULT_MAXIMUM_VELOCITY_DIPS",
-          "DEFAULT_RAMP_DOWN_DURATION",
-          "DEFAULT_RELATIVE_VELOCITY",
-          "DEFAULT_ACTIVATION_DELAY",
-          "DEFAULT_MINIMUM_VELOCITY_DIPS",
-          "DEFAULT_RAMP_UP_DURATION",
-          "DEFAULT_EDGE_TYPE",
-          "DEFAULT_RELATIVE_EDGE"
-        ]
-      },
-      "android/support/v7/widget/ViewInfoStore$InfoRecord": {
-        "androidx/widget/ViewInfoStore$InfoRecord": [
-          "FLAG_PRE",
-          "postInfo",
-          "FLAG_APPEAR_AND_DISAPPEAR",
-          "FLAG_PRE_AND_POST",
-          "FLAG_DISAPPEARED",
-          "preInfo",
-          "flags",
-          "FLAG_APPEAR",
-          "FLAG_APPEAR_PRE_AND_POST",
-          "FLAG_POST",
-          "sPool"
-        ]
-      },
-      "android/support/design/widget/AnimationUtils": {
-        "androidx/design/widget/AnimationUtils": [
-          "LINEAR_OUT_SLOW_IN_INTERPOLATOR",
-          "LINEAR_INTERPOLATOR",
-          "FAST_OUT_LINEAR_IN_INTERPOLATOR",
-          "FAST_OUT_SLOW_IN_INTERPOLATOR",
-          "DECELERATE_INTERPOLATOR"
-        ]
-      },
-      "android/support/design/widget/SnackbarManager$SnackbarRecord": {
-        "androidx/design/widget/SnackbarManager$SnackbarRecord": [
-          "duration",
-          "callback",
-          "paused"
-        ]
-      },
-      "android/support/transition/ChangeScroll": {
-        "androidx/transition/ChangeScroll": [
-          "PROPNAME_SCROLL_X",
-          "PROPNAME_SCROLL_Y",
-          "PROPERTIES"
-        ]
-      },
-      "android/support/design/widget/FloatingActionButtonLollipop": {
-        "androidx/design/widget/FloatingActionButtonLollipop": [
-          "EMPTY_STATE_SET",
-          "ENABLED_STATE_SET",
-          "PRESSED_ENABLED_STATE_SET",
-          "ANIM_INTERPOLATOR",
-          "FOCUSED_ENABLED_STATE_SET"
-        ]
-      },
-      "android/support/v4/graphics/TypefaceCompat": {
-        "androidx/graphics/TypefaceCompat": [
-          "sTypefaceCompatImpl",
-          "TAG",
-          "sTypefaceCache"
-        ]
-      },
-      "android/support/v7/widget/LinearSmoothScroller": {
-        "androidx/widget/LinearSmoothScroller": [
-          "MILLISECONDS_PER_PX",
-          "SNAP_TO_ANY",
-          "SNAP_TO_END",
-          "DEBUG",
-          "TAG",
-          "MILLISECONDS_PER_INCH",
-          "TARGET_SEEK_SCROLL_DISTANCE_PX",
-          "TARGET_SEEK_EXTRA_SCROLL_RATIO",
-          "SNAP_TO_START"
-        ]
-      },
-      "android/support/transition/Styleable$ChangeTransform": {
-        "androidx/transition/Styleable$ChangeTransform": [
-          "REPARENT_WITH_OVERLAY",
-          "REPARENT"
-        ]
-      },
-      "android/support/animation/DynamicAnimation": {
-        "androidx/animation/DynamicAnimation": [
-          "MIN_VISIBLE_CHANGE_ALPHA",
-          "MIN_VISIBLE_CHANGE_ROTATION_DEGREES",
-          "UNSET",
-          "ROTATION_Y",
-          "ROTATION_X",
-          "ALPHA",
-          "Z",
-          "X",
-          "Y",
-          "SCROLL_Y",
-          "SCROLL_X",
-          "TRANSLATION_Z",
-          "TRANSLATION_X",
-          "TRANSLATION_Y",
-          "THRESHOLD_MULTIPLIER",
-          "ROTATION",
-          "MIN_VISIBLE_CHANGE_SCALE",
-          "SCALE_Y",
-          "SCALE_X",
-          "MIN_VISIBLE_CHANGE_PIXELS"
-        ]
-      },
-      "android/support/constraint/solver/widgets/ConstraintWidget$DimensionBehaviour": {
-        "androidx/constraint/solver/widgets/ConstraintWidget$DimensionBehaviour": [
-          "FIXED",
-          "MATCH_PARENT",
-          "WRAP_CONTENT",
-          "MATCH_CONSTRAINT"
-        ]
-      },
-      "android/support/v17/leanback/media/PlaybackBannerControlGlue": {
-        "androidx/leanback/media/PlaybackBannerControlGlue": [
-          "PLAYBACK_SPEED_PAUSED",
-          "ACTION_SKIP_TO_PREVIOUS",
-          "ACTION_SKIP_TO_NEXT",
-          "ACTION_CUSTOM_LEFT_FIRST",
-          "TAG",
-          "ACTION_PLAY_PAUSE",
-          "PLAYBACK_SPEED_NORMAL",
-          "ACTION_CUSTOM_RIGHT_FIRST",
-          "NUMBER_OF_SEEK_SPEEDS",
-          "ACTION_REWIND",
-          "PLAYBACK_SPEED_INVALID",
-          "PLAYBACK_SPEED_FAST_L1",
-          "PLAYBACK_SPEED_FAST_L0",
-          "PLAYBACK_SPEED_FAST_L4",
-          "PLAYBACK_SPEED_FAST_L3",
-          "PLAYBACK_SPEED_FAST_L2",
-          "ACTION_FAST_FORWARD"
-        ]
-      },
-      "android/support/transition/ChangeTransform": {
-        "androidx/transition/ChangeTransform": [
-          "PROPNAME_PARENT",
-          "TRANSLATIONS_PROPERTY",
-          "PROPNAME_INTERMEDIATE_PARENT_MATRIX",
-          "PROPNAME_TRANSFORMS",
-          "PROPNAME_INTERMEDIATE_MATRIX",
-          "sTransitionProperties",
-          "PROPNAME_MATRIX",
-          "PROPNAME_PARENT_MATRIX",
-          "NON_TRANSLATIONS_PROPERTY",
-          "SUPPORTS_VIEW_REMOVAL_SUPPRESSION"
-        ]
-      },
-      "android/support/v17/leanback/R$fraction": {
-        "androidx/leanback/R$fraction": [
-          "lb_focus_zoom_factor_xsmall",
-          "lb_focus_zoom_factor_medium",
-          "lb_browse_rows_scale",
-          "lb_search_orb_focused_zoom",
-          "lb_view_active_level",
-          "lb_focus_zoom_factor_large",
-          "lb_focus_zoom_factor_small",
-          "lb_browse_header_unselect_alpha",
-          "lb_view_dimmed_level",
-          "lb_search_bar_speech_orb_max_level_zoom"
-        ]
-      },
-      "android/support/v7/widget/LinearLayoutCompat$LayoutParams": {
-        "androidx/widget/LinearLayoutCompat$LayoutParams": [
-          "height",
-          "gravity",
-          "rightMargin",
-          "width",
-          "bottomMargin",
-          "leftMargin",
-          "topMargin",
-          "weight"
-        ]
-      },
-      "android/support/v7/preference/PreferenceViewHolder": {
-        "androidx/preference/PreferenceViewHolder": [
-          "itemView"
-        ]
-      },
-      "android/support/v7/util/MessageThreadUtil$SyncQueueItem": {
-        "androidx/util/MessageThreadUtil$SyncQueueItem": [
-          "sPoolLock",
-          "what",
-          "sPool",
-          "arg2",
-          "arg1",
-          "arg4",
-          "arg3",
-          "arg5",
-          "next",
-          "data"
-        ]
-      },
-      "android/support/v14/preference/PreferenceFragment": {
-        "androidx/preference/PreferenceFragment": [
-          "PREFERENCES_TAG",
-          "DIALOG_FRAGMENT_TAG",
-          "ARG_PREFERENCE_ROOT",
-          "MSG_BIND_PREFERENCES"
-        ]
-      },
-      "android/support/v7/gridlayout/R$styleable": {
-        "androidx/gridlayout/R$styleable": [
-          "GridLayout_Layout_android_layout_margin",
-          "GridLayout_Layout_layout_gravity",
-          "GridLayout_Layout_layout_column",
-          "GridLayout_Layout_layout_columnSpan",
-          "GridLayout_Layout_layout_row",
-          "GridLayout_Layout_layout_columnWeight",
-          "GridLayout_Layout_layout_rowWeight",
-          "GridLayout_Layout",
-          "GridLayout_Layout_android_layout_marginBottom",
-          "GridLayout_rowCount",
-          "GridLayout_columnCount",
-          "GridLayout_Layout_android_layout_marginRight",
-          "GridLayout",
-          "GridLayout_useDefaultMargins",
-          "GridLayout_rowOrderPreserved",
-          "GridLayout_columnOrderPreserved",
-          "GridLayout_Layout_android_layout_marginLeft",
-          "GridLayout_alignmentMode",
-          "GridLayout_Layout_layout_rowSpan",
-          "GridLayout_orientation",
-          "GridLayout_Layout_android_layout_marginTop"
-        ]
-      },
-      "android/support/v17/leanback/app/BackgroundManager": {
-        "androidx/leanback/app/BackgroundManager": [
-          "FULL_ALPHA",
-          "DEBUG",
-          "FRAGMENT_TAG",
-          "FADE_DURATION",
-          "CHANGE_BG_DELAY_MS",
-          "TAG"
-        ]
-      },
-      "android/support/customtabs/ICustomTabsService$Stub": {
-        "androidx/browser/customtabs/ICustomTabsService$Stub": [
-          "TRANSACTION_extraCommand",
-          "TRANSACTION_requestPostMessageChannel",
-          "TRANSACTION_postMessage",
-          "TRANSACTION_validateRelationship",
-          "TRANSACTION_warmup",
-          "TRANSACTION_updateVisuals",
-          "TRANSACTION_mayLaunchUrl",
-          "TRANSACTION_newSession",
-          "DESCRIPTOR"
-        ]
-      },
-      "android/support/v7/widget/Toolbar$SavedState": {
-        "androidx/widget/Toolbar$SavedState": [
-          "isOverflowOpen",
-          "expandedMenuItemId",
-          "CREATOR"
-        ]
-      },
-      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter": {
-        "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter": [
-          "ALIGN_MODE_START",
-          "sTmpRect",
-          "STATE_HALF",
-          "TAG",
-          "STATE_SMALL",
-          "sHandler",
-          "ALIGN_MODE_MIDDLE",
-          "STATE_FULL",
-          "DEBUG"
-        ]
-      },
-      "android/support/v4/app/FragmentTabHost$SavedState": {
-        "androidx/app/FragmentTabHost$SavedState": [
-          "CREATOR",
-          "curTab"
-        ]
-      },
-      "android/support/v4/app/ActivityOptionsCompat": {
-        "androidx/app/ActivityOptionsCompat": [
-          "EXTRA_USAGE_TIME_REPORT",
-          "EXTRA_USAGE_TIME_REPORT_PACKAGES"
-        ]
-      },
-      "android/support/v4/widget/NestedScrollView": {
-        "androidx/widget/NestedScrollView": [
-          "MAX_SCROLL_FACTOR",
-          "SCROLLVIEW_STYLEABLE",
-          "TAG",
-          "ANIMATED_SCROLL_GAP",
-          "INVALID_POINTER",
-          "ACCESSIBILITY_DELEGATE"
-        ]
-      },
-      "android/support/v4/app/BackStackRecord$Op": {
-        "androidx/app/BackStackRecord$Op": [
-          "enterAnim",
-          "fragment",
-          "popEnterAnim",
-          "exitAnim",
-          "popExitAnim",
-          "cmd"
-        ]
-      },
-      "android/support/v17/leanback/graphics/BoundsRule": {
-        "androidx/leanback/graphics/BoundsRule": [
-          "bottom",
-          "right",
-          "left",
-          "top"
-        ]
-      },
-      "android/support/v17/leanback/app/SearchSupportFragment": {
-        "androidx/leanback/app/SearchSupportFragment": [
-          "SPEECH_RECOGNITION_DELAY_MS",
-          "TAG",
-          "AUDIO_PERMISSION_REQUEST_CODE",
-          "ARG_QUERY",
-          "RESULTS_CHANGED",
-          "ARG_TITLE",
-          "EXTRA_LEANBACK_BADGE_PRESENT",
-          "ARG_PREFIX",
-          "QUERY_COMPLETE",
-          "DEBUG"
-        ]
-      },
-      "android/support/v7/util/SortedList": {
-        "androidx/util/SortedList": [
-          "INSERTION",
-          "DELETION",
-          "MIN_CAPACITY",
-          "INVALID_POSITION",
-          "CAPACITY_GROWTH",
-          "LOOKUP"
-        ]
-      },
-      "android/support/v4/view/ViewCompat": {
-        "androidx/view/legacy/ViewCompat": [
-          "IMPL",
-          "SCROLL_AXIS_VERTICAL",
-          "SCROLL_INDICATOR_END",
-          "MEASURED_HEIGHT_STATE_SHIFT",
-          "OVER_SCROLL_ALWAYS",
-          "SCROLL_INDICATOR_RIGHT",
-          "IMPORTANT_FOR_ACCESSIBILITY_AUTO",
-          "SCROLL_INDICATOR_START",
-          "LAYOUT_DIRECTION_LOCALE",
-          "ACCESSIBILITY_LIVE_REGION_ASSERTIVE",
-          "IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS",
-          "SCROLL_INDICATOR_TOP",
-          "MEASURED_STATE_MASK",
-          "SCROLL_INDICATOR_BOTTOM",
-          "LAYOUT_DIRECTION_LTR",
-          "OVER_SCROLL_IF_CONTENT_SCROLLS",
-          "SCROLL_AXIS_NONE",
-          "OVER_SCROLL_NEVER",
-          "ACCESSIBILITY_LIVE_REGION_POLITE",
-          "TYPE_TOUCH",
-          "MEASURED_STATE_TOO_SMALL",
-          "ACCESSIBILITY_LIVE_REGION_NONE",
-          "LAYOUT_DIRECTION_INHERIT",
-          "IMPORTANT_FOR_ACCESSIBILITY_NO",
-          "LAYER_TYPE_NONE",
-          "MEASURED_SIZE_MASK",
-          "SCROLL_INDICATOR_LEFT",
-          "TAG",
-          "SCROLL_AXIS_HORIZONTAL",
-          "TYPE_NON_TOUCH",
-          "LAYER_TYPE_HARDWARE",
-          "LAYER_TYPE_SOFTWARE",
-          "IMPORTANT_FOR_ACCESSIBILITY_YES",
-          "LAYOUT_DIRECTION_RTL"
-        ]
-      },
-      "android/support/v7/media/MediaRouter": {
-        "androidx/media/MediaRouter": [
-          "AVAILABILITY_FLAG_REQUIRE_MATCH",
-          "CALLBACK_FLAG_PERFORM_ACTIVE_SCAN",
-          "CALLBACK_FLAG_FORCE_DISCOVERY",
-          "UNSELECT_REASON_DISCONNECTED",
-          "AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE",
-          "UNSELECT_REASON_ROUTE_CHANGED",
-          "sGlobal",
-          "UNSELECT_REASON_UNKNOWN",
-          "TAG",
-          "CALLBACK_FLAG_REQUEST_DISCOVERY",
-          "DEBUG",
-          "UNSELECT_REASON_STOPPED",
-          "CALLBACK_FLAG_UNFILTERED_EVENTS"
-        ]
-      },
-      "android/support/v17/leanback/graphics/CompositeDrawable$ChildDrawable": {
-        "androidx/leanback/graphics/CompositeDrawable$ChildDrawable": [
-          "adjustedBounds",
-          "BOTTOM_FRACTION",
-          "RIGHT_FRACTION",
-          "BOTTOM_ABSOLUTE",
-          "RIGHT_ABSOLUTE",
-          "LEFT_ABSOLUTE",
-          "LEFT_FRACTION",
-          "TOP_FRACTION",
-          "TOP_ABSOLUTE"
-        ]
-      },
-      "android/support/v17/leanback/widget/PlaybackControlsRow$RepeatAction": {
-        "androidx/leanback/widget/PlaybackControlsRow$RepeatAction": [
-          "INDEX_NONE",
-          "INDEX_ALL",
-          "ALL",
-          "NONE",
-          "ONE",
-          "INDEX_ONE"
-        ]
-      },
-      "android/support/design/R$id": {
-        "androidx/design/R$id": [
-          "touch_outside",
-          "largeLabel",
-          "textinput_error",
-          "textinput_counter",
-          "snackbar_text",
-          "snackbar_action",
-          "icon",
-          "smallLabel",
-          "view_offset_helper",
-          "design_bottom_sheet",
-          "coordinator",
-          "design_menu_item_action_area_stub",
-          "design_menu_item_text"
-        ]
-      },
-      "android/support/v7/widget/ActivityChooserModel$HistoricalRecord": {
-        "androidx/widget/ActivityChooserModel$HistoricalRecord": [
-          "activity",
-          "weight",
-          "time"
-        ]
-      },
-      "android/support/media/tv/TvContractCompat$BaseTvColumns": {
-        "androidx/media/tv/TvContractCompat$BaseTvColumns": [
-          "COLUMN_PACKAGE_NAME"
-        ]
-      },
-      "android/support/v17/leanback/media/MediaPlayerGlue": {
-        "androidx/leanback/media/MediaPlayerGlue": [
-          "FAST_FORWARD_REWIND_STEP",
-          "TAG",
-          "REPEAT_ONE",
-          "FAST_FORWARD_REWIND_REPEAT_DELAY",
-          "NO_REPEAT",
-          "REPEAT_ALL"
-        ]
-      },
-      "android/support/text/emoji/EmojiProcessor$GlyphChecker": {
-        "androidx/text/emoji/EmojiProcessor$GlyphChecker": [
-          "PAINT_TEXT_SIZE",
-          "sStringBuilder"
-        ]
-      },
-      "android/support/v4/app/FragmentManager": {
-        "androidx/app/FragmentManager": [
-          "POP_BACK_STACK_INCLUSIVE"
-        ]
-      },
-      "android/support/v4/content/LocalBroadcastManager$ReceiverRecord": {
-        "androidx/content/LocalBroadcastManager$ReceiverRecord": [
-          "broadcasting",
-          "receiver",
-          "filter",
-          "dead"
-        ]
-      },
-      "android/support/percent/R$styleable": {
-        "androidx/R$styleable": [
-          "PercentLayout_Layout_layout_marginEndPercent",
-          "PercentLayout_Layout",
-          "PercentLayout_Layout_layout_marginBottomPercent",
-          "PercentLayout_Layout_layout_aspectRatio",
-          "PercentLayout_Layout_layout_widthPercent",
-          "PercentLayout_Layout_layout_heightPercent",
-          "PercentLayout_Layout_layout_marginLeftPercent",
-          "PercentLayout_Layout_layout_marginRightPercent",
-          "PercentLayout_Layout_layout_marginStartPercent",
-          "PercentLayout_Layout_layout_marginPercent",
-          "PercentLayout_Layout_layout_marginTopPercent"
-        ]
-      },
-      "android/support/v17/leanback/app/BrowseSupportFragment": {
-        "androidx/leanback/app/BrowseSupportFragment": [
-          "STATE_ENTRANCE_ON_PREPARED_ON_CREATEVIEW",
-          "STATE_SET_ENTRANCE_START_STATE",
-          "HEADERS_ENABLED",
-          "STATE_ENTRANCE_ON_PREPARED",
-          "HEADERS_HIDDEN",
-          "ARG_HEADERS_STATE",
-          "TAG",
-          "STATE_ENTRANCE_PERFORM",
-          "HEADER_SHOW",
-          "IS_PAGE_ROW",
-          "ARG_TITLE",
-          "LB_HEADERS_BACKSTACK",
-          "DEBUG",
-          "EVT_SCREEN_DATA_READY",
-          "CURRENT_SELECTED_POSITION",
-          "EVT_HEADER_VIEW_CREATED",
-          "EVT_MAIN_FRAGMENT_VIEW_CREATED",
-          "HEADERS_DISABLED",
-          "HEADER_STACK_INDEX"
-        ]
-      },
-      "android/support/v17/leanback/app/SearchFragment": {
-        "androidx/leanback/app/SearchFragment": [
-          "TAG",
-          "QUERY_COMPLETE",
-          "ARG_QUERY",
-          "RESULTS_CHANGED",
-          "ARG_TITLE",
-          "SPEECH_RECOGNITION_DELAY_MS",
-          "EXTRA_LEANBACK_BADGE_PRESENT",
-          "AUDIO_PERMISSION_REQUEST_CODE",
-          "DEBUG",
-          "ARG_PREFIX"
-        ]
-      },
-      "android/support/v4/graphics/drawable/IconCompat": {
-        "androidx/graphics/drawable/IconCompat": [
-          "ADAPTIVE_ICON_INSET_FACTOR",
-          "TYPE_RESOURCE",
-          "TYPE_BITMAP",
-          "ICON_DIAMETER_FACTOR",
-          "KEY_SHADOW_ALPHA",
-          "DEFAULT_VIEW_PORT_SCALE",
-          "AMBIENT_SHADOW_ALPHA",
-          "TYPE_DATA",
-          "BLUR_FACTOR",
-          "TYPE_URI",
-          "KEY_SHADOW_OFFSET_FACTOR",
-          "TYPE_ADAPTIVE_BITMAP"
-        ]
-      },
-      "android/support/v4/internal/view/SupportMenuItem": {
-        "androidx/internal/view/SupportMenuItem": [
-          "SHOW_AS_ACTION_ALWAYS",
-          "SHOW_AS_ACTION_NEVER",
-          "SHOW_AS_ACTION_WITH_TEXT",
-          "SHOW_AS_ACTION_IF_ROOM",
-          "SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW"
-        ]
-      },
-      "android/support/v7/cardview/R$dimen": {
-        "androidx/cardview/R$dimen": [
-          "cardview_compat_inset_shadow"
-        ]
-      },
-      "android/support/v4/widget/CompoundButtonCompat$CompoundButtonCompatBaseImpl": {
-        "androidx/widget/CompoundButtonCompat$CompoundButtonCompatBaseImpl": [
-          "sButtonDrawableField",
-          "sButtonDrawableFieldFetched",
-          "TAG"
-        ]
-      },
-      "android/support/v7/widget/StaggeredGridLayoutManager$LayoutParams": {
-        "androidx/widget/StaggeredGridLayoutManager$LayoutParams": [
-          "width",
-          "leftMargin",
-          "INVALID_SPAN_ID",
-          "bottomMargin",
-          "height",
-          "topMargin",
-          "rightMargin"
-        ]
-      },
-      "android/support/v17/leanback/widget/ItemAlignmentFacetHelper": {
-        "androidx/leanback/widget/ItemAlignmentFacetHelper": [
-          "sRect"
-        ]
-      },
-      "android/support/media/ExifInterface$ExifAttribute": {
-        "androidx/media/ExifInterface$ExifAttribute": [
-          "format",
-          "numberOfComponents",
-          "bytes"
-        ]
-      },
-      "android/support/compat/R$styleable": {
-        "androidx/compat/R$styleable": [
-          "FontFamily_fontProviderCerts",
-          "FontFamily_fontProviderAuthority",
-          "FontFamilyFont_fontWeight",
-          "FontFamilyFont_android_font",
-          "FontFamilyFont_android_fontStyle",
-          "FontFamilyFont_android_fontWeight",
-          "FontFamilyFont_fontStyle",
-          "FontFamilyFont",
-          "FontFamily_fontProviderFetchTimeout",
-          "FontFamily_fontProviderFetchStrategy",
-          "FontFamilyFont_font",
-          "FontFamily_fontProviderQuery",
-          "FontFamily",
-          "FontFamily_fontProviderPackage"
-        ]
-      },
-      "android/support/v7/widget/ButtonBarLayout": {
-        "androidx/widget/ButtonBarLayout": [
-          "PEEK_BUTTON_DP",
-          "ALLOW_STACKING_MIN_HEIGHT_DP"
-        ]
-      },
-      "android/support/v7/app/ActionBarDrawerToggleHoneycomb": {
-        "androidx/app/ActionBarDrawerToggleHoneycomb": [
-          "THEME_ATTRS",
-          "TAG"
-        ]
-      },
-      "android/support/v7/widget/RecyclerView$LayoutParams": {
-        "androidx/widget/RecyclerView$LayoutParams": [
-          "topMargin",
-          "bottomMargin",
-          "width",
-          "height",
-          "rightMargin",
-          "leftMargin"
-        ]
-      },
-      "android/support/v7/util/DiffUtil$Snake": {
-        "androidx/util/DiffUtil$Snake": [
-          "size",
-          "x",
-          "y",
-          "reverse",
-          "removal"
-        ]
-      },
-      "android/support/v4/print/PrintHelper": {
-        "androidx/print/PrintHelper": [
-          "COLOR_MODE_MONOCHROME",
-          "SCALE_MODE_FILL",
-          "ORIENTATION_PORTRAIT",
-          "SCALE_MODE_FIT",
-          "COLOR_MODE_COLOR",
-          "ORIENTATION_LANDSCAPE"
-        ]
-      },
-      "android/support/v4/widget/CompoundButtonCompat": {
-        "androidx/widget/CompoundButtonCompat": [
-          "IMPL"
-        ]
-      },
-      "android/support/v7/widget/DefaultItemAnimator$MoveInfo": {
-        "androidx/widget/DefaultItemAnimator$MoveInfo": [
-          "toY",
-          "toX",
-          "fromY",
-          "fromX",
-          "holder"
-        ]
-      },
-      "android/support/v7/widget/ActionMenuView": {
-        "androidx/widget/ActionMenuView": [
-          "MIN_CELL_SIZE",
-          "TAG",
-          "GENERATED_ITEM_PADDING"
-        ]
-      },
-      "android/support/v7/widget/GapWorker$Task": {
-        "androidx/widget/GapWorker$Task": [
-          "viewVelocity",
-          "position",
-          "view",
-          "immediate",
-          "distanceToItem"
-        ]
-      },
-      "android/support/v7/util/DiffUtil": {
-        "androidx/util/DiffUtil": [
-          "SNAKE_COMPARATOR"
-        ]
-      },
-      "android/support/v4/content/res/ResourcesCompat": {
-        "androidx/content/res/ResourcesCompat": [
-          "TAG"
-        ]
-      },
-      "android/support/v7/widget/ActionMenuView$LayoutParams": {
-        "androidx/widget/ActionMenuView$LayoutParams": [
-          "expandable",
-          "extraPixels",
-          "isOverflowButton",
-          "gravity",
-          "rightMargin",
-          "cellsUsed",
-          "expanded",
-          "leftMargin",
-          "preventEdgeOffset"
-        ]
-      },
-      "android/support/transition/Visibility": {
-        "androidx/transition/Visibility": [
-          "PROPNAME_PARENT",
-          "PROPNAME_VISIBILITY",
-          "MODE_OUT",
-          "PROPNAME_SCREEN_LOCATION",
-          "sTransitionProperties",
-          "MODE_IN"
-        ]
-      },
-      "android/support/v4/view/ViewPager$LayoutParams": {
-        "androidx/view/ViewPager$LayoutParams": [
-          "needsMeasure",
-          "height",
-          "width",
-          "childIndex",
-          "position",
-          "widthFactor",
-          "gravity",
-          "isDecor"
-        ]
-      },
-      "android/support/v17/preference/R$layout": {
-        "androidx/leanback/preference/R$layout": [
-          "leanback_list_preference_item_multi",
-          "leanback_list_preference_fragment",
-          "leanback_settings_fragment",
-          "leanback_list_preference_item_single",
-          "leanback_preferences_list",
-          "leanback_preference_fragment"
-        ]
-      },
-      "android/support/v4/widget/CircularProgressDrawable": {
-        "androidx/widget/CircularProgressDrawable": [
-          "ANIMATION_DURATION",
-          "CENTER_RADIUS",
-          "COLOR_CHANGE_OFFSET",
-          "ARROW_WIDTH",
-          "STROKE_WIDTH",
-          "MAX_PROGRESS_ARC",
-          "GROUP_FULL_ROTATION",
-          "MIN_PROGRESS_ARC",
-          "RING_ROTATION",
-          "DEFAULT",
-          "ARROW_WIDTH_LARGE",
-          "ARROW_HEIGHT_LARGE",
-          "CENTER_RADIUS_LARGE",
-          "COLORS",
-          "STROKE_WIDTH_LARGE",
-          "MATERIAL_INTERPOLATOR",
-          "ARROW_HEIGHT",
-          "SHRINK_OFFSET",
-          "LARGE",
-          "LINEAR_INTERPOLATOR"
-        ]
-      },
-      "android/support/v7/mediarouter/R$integer": {
-        "androidx/mediarouter/R$integer": [
-          "mr_controller_volume_group_list_animation_duration_ms",
-          "mr_controller_volume_group_list_fade_in_duration_ms",
-          "mr_controller_volume_group_list_fade_out_duration_ms"
-        ]
-      },
-      "android/support/v17/leanback/widget/ShadowOverlayContainer": {
-        "androidx/leanback/widget/ShadowOverlayContainer": [
-          "SHADOW_DYNAMIC",
-          "sTempRect",
-          "SHADOW_NONE",
-          "SHADOW_STATIC"
-        ]
-      },
-      "android/support/v4/widget/SwipeRefreshLayout": {
-        "androidx/widget/SwipeRefreshLayout": [
-          "LAYOUT_ATTRS",
-          "CIRCLE_DIAMETER_LARGE",
-          "ALPHA_ANIMATION_DURATION",
-          "MAX_ALPHA",
-          "ANIMATE_TO_START_DURATION",
-          "LOG_TAG",
-          "MAX_PROGRESS_ANGLE",
-          "ANIMATE_TO_TRIGGER_DURATION",
-          "DEFAULT",
-          "SCALE_DOWN_DURATION",
-          "CIRCLE_DIAMETER",
-          "INVALID_POINTER",
-          "DRAG_RATE",
-          "CIRCLE_BG_LIGHT",
-          "DECELERATE_INTERPOLATION_FACTOR",
-          "LARGE",
-          "DEFAULT_CIRCLE_TARGET",
-          "STARTING_PROGRESS_ALPHA"
-        ]
-      },
-      "android/support/annotation/Dimension": {
-        "androidx/annotation/Dimension": [
-          "DP",
-          "SP",
-          "PX"
-        ]
-      },
-      "android/support/v7/widget/AppCompatSpinner": {
-        "androidx/widget/AppCompatSpinner": [
-          "MAX_ITEMS_MEASURED",
-          "MODE_DIALOG",
-          "ATTRS_ANDROID_SPINNERMODE",
-          "TAG",
-          "MODE_THEME",
-          "MODE_DROPDOWN"
-        ]
-      },
-      "android/support/v13/view/inputmethod/InputConnectionCompat$InputContentInfoCompatBaseImpl": {
-        "androidx/view/inputmethod/InputConnectionCompat$InputContentInfoCompatBaseImpl": [
-          "COMMIT_CONTENT_RESULT_RECEIVER",
-          "COMMIT_CONTENT_OPTS_KEY",
-          "COMMIT_CONTENT_FLAGS_KEY",
-          "COMMIT_CONTENT_LINK_URI_KEY",
-          "COMMIT_CONTENT_DESCRIPTION_KEY",
-          "COMMIT_CONTENT_ACTION",
-          "COMMIT_CONTENT_CONTENT_URI_KEY"
-        ]
-      },
-      "android/support/v7/app/TwilightCalculator": {
-        "androidx/app/TwilightCalculator": [
-          "OBLIQUITY",
-          "ALTIDUTE_CORRECTION_CIVIL_TWILIGHT",
-          "UTC_2000",
-          "DEGREES_TO_RADIANS",
-          "NIGHT",
-          "sunrise",
-          "state",
-          "DAY",
-          "J0",
-          "C1",
-          "C2",
-          "C3",
-          "sunset",
-          "sInstance"
-        ]
-      },
-      "android/support/v7/widget/LinearLayoutManager$LayoutState": {
-        "androidx/widget/LinearLayoutManager$LayoutState": [
-          "TAG",
-          "SCROLLING_OFFSET_NaN",
-          "LAYOUT_START",
-          "ITEM_DIRECTION_TAIL",
-          "INVALID_LAYOUT",
-          "LAYOUT_END",
-          "ITEM_DIRECTION_HEAD"
-        ]
-      },
-      "android/support/wear/R$drawable": {
-        "androidx/wear/R$drawable": [
-          "ws_ic_more_horiz_24dp_wht",
-          "ws_ic_more_vert_24dp_wht"
-        ]
-      },
-      "android/support/v17/leanback/widget/ControlBarPresenter$BoundData": {
-        "androidx/leanback/widget/ControlBarPresenter$BoundData": [
-          "adapter",
-          "presenter"
-        ]
-      },
-      "android/support/v4/media/MediaBrowserServiceCompat$ConnectionRecord": {
-        "androidx/media/MediaBrowserServiceCompat$ConnectionRecord": [
-          "callbacks",
-          "pkg",
-          "subscriptions",
-          "rootHints",
-          "root"
-        ]
-      },
-      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplApi18": {
-        "androidx/media/session/MediaSessionCompat$MediaSessionImplApi18": [
-          "sIsMbrPendingIntentSupported"
-        ]
-      },
-      "android/support/v4/util/PatternsCompat": {
-        "androidx/util/PatternsCompat": [
-          "TLD_CHAR",
-          "USER_INFO",
-          "WEB_URL",
-          "AUTOLINK_WEB_URL",
-          "LABEL_CHAR",
-          "PATH_AND_QUERY",
-          "PUNYCODE_TLD",
-          "EMAIL_CHAR",
-          "STRICT_DOMAIN_NAME",
-          "STRICT_HOST_NAME",
-          "IP_ADDRESS",
-          "STRICT_TLD",
-          "WEB_URL_WITHOUT_PROTOCOL",
-          "PROTOCOL",
-          "EMAIL_ADDRESS",
-          "EMAIL_ADDRESS_LOCAL_PART",
-          "UCS_CHAR",
-          "TLD",
-          "IRI_LABEL",
-          "WEB_URL_WITH_PROTOCOL",
-          "AUTOLINK_EMAIL_ADDRESS",
-          "PORT_NUMBER",
-          "EMAIL_ADDRESS_DOMAIN",
-          "DOMAIN_NAME",
-          "HOST_NAME",
-          "IANA_TOP_LEVEL_DOMAINS",
-          "RELAXED_DOMAIN_NAME",
-          "WORD_BOUNDARY"
-        ]
-      },
-      "android/support/v17/leanback/widget/PlaybackControlsRow$ClosedCaptioningAction": {
-        "androidx/leanback/widget/PlaybackControlsRow$ClosedCaptioningAction": [
-          "INDEX_OFF",
-          "INDEX_ON",
-          "OFF",
-          "ON"
-        ]
-      },
-      "android/support/v4/widget/ExploreByTouchHelper": {
-        "androidx/widget/ExploreByTouchHelper": [
-          "INVALID_ID",
-          "NODE_ADAPTER",
-          "DEFAULT_CLASS_NAME",
-          "INVALID_PARENT_BOUNDS",
-          "HOST_ID",
-          "SPARSE_VALUES_ADAPTER"
-        ]
-      },
-      "android/support/v7/widget/OrientationHelper": {
-        "androidx/widget/OrientationHelper": [
-          "INVALID_SIZE",
-          "HORIZONTAL",
-          "VERTICAL"
-        ]
-      },
-      "android/support/animation/SpringForce": {
-        "androidx/animation/SpringForce": [
-          "DAMPING_RATIO_NO_BOUNCY",
-          "UNSET",
-          "DAMPING_RATIO_HIGH_BOUNCY",
-          "VELOCITY_THRESHOLD_MULTIPLIER",
-          "STIFFNESS_LOW",
-          "DAMPING_RATIO_LOW_BOUNCY",
-          "STIFFNESS_HIGH",
-          "STIFFNESS_MEDIUM",
-          "DAMPING_RATIO_MEDIUM_BOUNCY",
-          "STIFFNESS_VERY_LOW"
-        ]
-      },
-      "android/support/v7/view/menu/MenuAdapter": {
-        "androidx/view/menu/MenuAdapter": [
-          "ITEM_LAYOUT"
-        ]
-      },
-      "android/support/design/widget/ViewGroupUtils": {
-        "androidx/widget/ViewGroupUtils": [
-          "sMatrix",
-          "sRectF"
-        ]
-      },
-      "android/support/multidex/ZipUtil": {
-        "androidx/multidex/ZipUtil": [
-          "ENDSIG",
-          "ENDHDR",
-          "BUFFER_SIZE"
-        ]
-      },
-      "android/support/v7/media/MediaItemStatus": {
-        "androidx/media/MediaItemStatus": [
-          "KEY_EXTRAS",
-          "PLAYBACK_STATE_PLAYING",
-          "KEY_TIMESTAMP",
-          "KEY_CONTENT_POSITION",
-          "PLAYBACK_STATE_PENDING",
-          "PLAYBACK_STATE_FINISHED",
-          "PLAYBACK_STATE_BUFFERING",
-          "PLAYBACK_STATE_PAUSED",
-          "PLAYBACK_STATE_INVALIDATED",
-          "KEY_CONTENT_DURATION",
-          "PLAYBACK_STATE_ERROR",
-          "PLAYBACK_STATE_CANCELED",
-          "EXTRA_HTTP_RESPONSE_HEADERS",
-          "KEY_PLAYBACK_STATE",
-          "EXTRA_HTTP_STATUS_CODE"
-        ]
-      },
-      "android/support/v7/widget/RecyclerView$Recycler": {
-        "androidx/widget/RecyclerView$Recycler": [
-          "DEFAULT_CACHE_SIZE"
-        ]
-      },
-      "android/support/transition/ViewUtilsApi19": {
-        "androidx/transition/ViewUtilsApi19": [
-          "sSetTransitionAlphaMethod",
-          "sSetTransitionAlphaMethodFetched",
-          "TAG",
-          "sGetTransitionAlphaMethod",
-          "sGetTransitionAlphaMethodFetched"
-        ]
-      },
-      "android/support/v4/media/MediaBrowserCompat": {
-        "androidx/media/MediaBrowserCompat": [
-          "EXTRA_PAGE",
-          "DEBUG",
-          "EXTRA_MEDIA_ID",
-          "EXTRA_PAGE_SIZE",
-          "CUSTOM_ACTION_DOWNLOAD",
-          "CUSTOM_ACTION_REMOVE_DOWNLOADED_FILE",
-          "TAG",
-          "EXTRA_DOWNLOAD_PROGRESS"
-        ]
-      },
-      "android/support/v4/app/FragmentTransition$FragmentContainerTransition": {
-        "androidx/app/FragmentTransition$FragmentContainerTransition": [
-          "lastInTransaction",
-          "lastIn",
-          "lastInIsPop",
-          "firstOut",
-          "firstOutIsPop",
-          "firstOutTransaction"
-        ]
-      },
-      "android/support/v4/text/util/LinkifyCompat": {
-        "androidx/text/util/LinkifyCompat": [
-          "COMPARATOR",
-          "EMPTY_STRING"
-        ]
-      },
-      "android/support/v7/app/TwilightManager$TwilightState": {
-        "androidx/app/TwilightManager$TwilightState": [
-          "todaySunrise",
-          "todaySunset",
-          "yesterdaySunset",
-          "nextUpdate",
-          "tomorrowSunrise",
-          "isNight"
-        ]
-      },
-      "android/support/v4/content/res/FontResourcesParserCompat": {
-        "androidx/content/res/FontResourcesParserCompat": [
-          "NORMAL_WEIGHT",
-          "FETCH_STRATEGY_ASYNC",
-          "INFINITE_TIMEOUT_VALUE",
-          "DEFAULT_TIMEOUT_MILLIS",
-          "FETCH_STRATEGY_BLOCKING",
-          "ITALIC"
-        ]
-      },
-      "android/support/v7/widget/ListPopupWindow": {
-        "androidx/widget/ListPopupWindow": [
-          "sSetEpicenterBoundsMethod",
-          "WRAP_CONTENT",
-          "MATCH_PARENT",
-          "POSITION_PROMPT_BELOW",
-          "DEBUG",
-          "sGetMaxAvailableHeightMethod",
-          "INPUT_METHOD_FROM_FOCUSABLE",
-          "INPUT_METHOD_NEEDED",
-          "EXPAND_LIST_TIMEOUT",
-          "sClipToWindowEnabledMethod",
-          "POSITION_PROMPT_ABOVE",
-          "TAG",
-          "INPUT_METHOD_NOT_NEEDED"
-        ]
-      },
-      "android/support/v7/media/MediaRouteProviderProtocol": {
-        "androidx/media/MediaRouteProviderProtocol": [
-          "SERVICE_INTERFACE",
-          "CLIENT_MSG_RELEASE_ROUTE_CONTROLLER",
-          "CLIENT_DATA_ROUTE_ID",
-          "CLIENT_VERSION_CURRENT",
-          "CLIENT_VERSION_START",
-          "CLIENT_DATA_ROUTE_LIBRARY_GROUP",
-          "CLIENT_VERSION_1",
-          "CLIENT_VERSION_2",
-          "SERVICE_VERSION_CURRENT",
-          "SERVICE_MSG_CONTROL_REQUEST_SUCCEEDED",
-          "CLIENT_MSG_SELECT_ROUTE",
-          "CLIENT_MSG_UNREGISTER",
-          "CLIENT_MSG_UPDATE_ROUTE_VOLUME",
-          "SERVICE_MSG_REGISTERED",
-          "CLIENT_MSG_CREATE_ROUTE_CONTROLLER",
-          "CLIENT_MSG_ROUTE_CONTROL_REQUEST",
-          "CLIENT_DATA_UNSELECT_REASON",
-          "CLIENT_MSG_SET_DISCOVERY_REQUEST",
-          "SERVICE_MSG_CONTROL_REQUEST_FAILED",
-          "CLIENT_MSG_REGISTER",
-          "CLIENT_MSG_UNSELECT_ROUTE",
-          "SERVICE_MSG_GENERIC_FAILURE",
-          "SERVICE_MSG_GENERIC_SUCCESS",
-          "SERVICE_VERSION_1",
-          "CLIENT_DATA_VOLUME",
-          "SERVICE_DATA_ERROR",
-          "SERVICE_MSG_DESCRIPTOR_CHANGED",
-          "CLIENT_MSG_SET_ROUTE_VOLUME"
-        ]
-      },
-      "android/support/v4/app/Fragment": {
-        "androidx/app/Fragment": [
-          "CREATED",
-          "STARTED",
-          "ACTIVITY_CREATED",
-          "USE_DEFAULT_TRANSITION",
-          "RESUMED",
-          "sClassMap",
-          "INITIALIZING",
-          "STOPPED"
-        ]
-      },
-      "android/support/v7/app/AlertController$ButtonHandler": {
-        "androidx/app/AlertController$ButtonHandler": [
-          "MSG_DISMISS_DIALOG"
-        ]
-      },
-      "android/support/v4/text/BidiFormatter": {
-        "androidx/text/BidiFormatter": [
-          "DIR_LTR",
-          "DIR_UNKNOWN",
-          "DEFAULT_FLAGS",
-          "DEFAULT_LTR_INSTANCE",
-          "PDF",
-          "FLAG_STEREO_RESET",
-          "LRM_STRING",
-          "LRE",
-          "LRM",
-          "DEFAULT_TEXT_DIRECTION_HEURISTIC",
-          "DIR_RTL",
-          "DEFAULT_RTL_INSTANCE",
-          "RLM",
-          "RLE",
-          "EMPTY_STRING",
-          "RLM_STRING"
-        ]
-      },
-      "android/support/v17/leanback/widget/BaseGridView": {
-        "androidx/leanback/widget/BaseGridView": [
-          "WINDOW_ALIGN_NO_EDGE",
-          "SAVE_ALL_CHILD",
-          "WINDOW_ALIGN_BOTH_EDGE",
-          "FOCUS_SCROLL_PAGE",
-          "WINDOW_ALIGN_HIGH_EDGE",
-          "ITEM_ALIGN_OFFSET_PERCENT_DISABLED",
-          "WINDOW_ALIGN_LOW_EDGE",
-          "SAVE_ON_SCREEN_CHILD",
-          "SAVE_NO_CHILD",
-          "FOCUS_SCROLL_ALIGNED",
-          "WINDOW_ALIGN_OFFSET_PERCENT_DISABLED",
-          "FOCUS_SCROLL_ITEM",
-          "SAVE_LIMITED_CHILD"
-        ]
-      },
-      "android/support/v4/app/FragmentActivity": {
-        "androidx/app/FragmentActivity": [
-          "MSG_REALLY_STOPPED",
-          "NEXT_CANDIDATE_REQUEST_INDEX_TAG",
-          "MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS",
-          "FRAGMENTS_TAG",
-          "TAG",
-          "ALLOCATED_REQUEST_INDICIES_TAG",
-          "MSG_RESUME_PENDING",
-          "REQUEST_FRAGMENT_WHO_TAG"
-        ]
-      },
-      "android/support/v7/gridlayout/R$dimen": {
-        "androidx/gridlayout/R$dimen": [
-          "default_gap"
-        ]
-      },
-      "android/support/content/ContentPager$Stats": {
-        "androidx/content/ContentPager$Stats": [
-          "EXTRA_COMPAT_PAGED",
-          "EXTRA_PROVIDER_PAGED",
-          "EXTRA_RESOLVED_QUERIES",
-          "EXTRA_TOTAL_QUERIES"
-        ]
-      },
-      "android/support/design/widget/BaseTransientBottomBar": {
-        "androidx/design/widget/BaseTransientBottomBar": [
-          "ANIMATION_DURATION",
-          "USE_OFFSET_API",
-          "LENGTH_SHORT",
-          "MSG_SHOW",
-          "MSG_DISMISS",
-          "LENGTH_LONG",
-          "sHandler",
-          "ANIMATION_FADE_DURATION",
-          "LENGTH_INDEFINITE"
-        ]
-      },
-      "android/support/v17/leanback/widget/ArrayObjectAdapter": {
-        "androidx/leanback/widget/ArrayObjectAdapter": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/v4/view/AsyncLayoutInflater$InflateRequest": {
-        "androidx/view/AsyncLayoutInflater$InflateRequest": [
-          "inflater",
-          "callback",
-          "view",
-          "parent",
-          "resid"
-        ]
-      },
-      "android/support/transition/Styleable": {
-        "androidx/transition/Styleable": [
-          "TRANSITION",
-          "VISIBILITY_TRANSITION",
-          "CHANGE_TRANSFORM",
-          "SLIDE",
-          "TRANSITION_MANAGER",
-          "CHANGE_BOUNDS",
-          "TRANSITION_SET",
-          "FADE",
-          "TRANSITION_TARGET",
-          "ARC_MOTION",
-          "PATTERN_PATH_MOTION"
-        ]
-      },
-      "android/support/design/widget/Snackbar$Callback": {
-        "androidx/design/widget/Snackbar$Callback": [
-          "DISMISS_EVENT_ACTION",
-          "DISMISS_EVENT_TIMEOUT",
-          "DISMISS_EVENT_SWIPE",
-          "DISMISS_EVENT_CONSECUTIVE",
-          "DISMISS_EVENT_MANUAL"
-        ]
-      },
-      "android/support/v4/content/ModernAsyncTask$Status": {
-        "androidx/content/ModernAsyncTask$Status": [
-          "PENDING",
-          "FINISHED",
-          "RUNNING"
-        ]
-      },
-      "android/support/wear/widget/drawer/WearableActionDrawerView$ActionListAdapter": {
-        "androidx/wear/widget/drawer/WearableActionDrawerView$ActionListAdapter": [
-          "TYPE_TITLE",
-          "TYPE_ACTION"
-        ]
-      },
-      "android/support/design/widget/AppBarLayout$Behavior": {
-        "androidx/design/widget/AppBarLayout$Behavior": [
-          "INVALID_POSITION",
-          "MAX_OFFSET_ANIMATION_DURATION"
-        ]
-      },
-      "android/support/v17/leanback/app/BaseSupportFragment": {
-        "androidx/leanback/app/BaseSupportFragment": [
-          "STATE_ENTRANCE_INIT",
-          "EVT_PREPARE_ENTRANCE",
-          "EVT_ON_CREATE",
-          "COND_TRANSITION_NOT_SUPPORTED",
-          "STATE_ENTRANCE_PERFORM",
-          "EVT_ENTRANCE_END",
-          "EVT_ON_CREATEVIEW",
-          "STATE_ENTRANCE_ON_PREPARED",
-          "STATE_ENTRANCE_ON_PREPARED_ON_CREATEVIEW",
-          "EVT_START_ENTRANCE",
-          "STATE_ENTRANCE_ON_ENDED",
-          "STATE_START",
-          "STATE_ENTRANCE_COMPLETE"
-        ]
-      },
-      "android/support/annotation/VisibleForTesting": {
-        "androidx/annotation/VisibleForTesting": [
-          "PROTECTED",
-          "PACKAGE_PRIVATE",
-          "NONE",
-          "PRIVATE"
-        ]
-      },
-      "android/support/v17/leanback/widget/Parallax$IntProperty": {
-        "androidx/leanback/widget/Parallax$IntProperty": [
-          "UNKNOWN_AFTER",
-          "UNKNOWN_BEFORE"
-        ]
-      },
-      "android/support/v7/media/SystemMediaRouteProvider$JellybeanImpl": {
-        "androidx/media/SystemMediaRouteProvider$JellybeanImpl": [
-          "LIVE_AUDIO_CONTROL_FILTERS",
-          "LIVE_VIDEO_CONTROL_FILTERS"
-        ]
-      },
-      "android/support/constraint/ConstraintLayout": {
-        "androidx/constraint/ConstraintLayout": [
-          "VERSION",
-          "ALLOWS_EMBEDDED",
-          "SIMPLE_LAYOUT",
-          "TAG"
-        ]
-      },
-      "android/support/v4/widget/TextViewCompat": {
-        "androidx/widget/TextViewCompat": [
-          "AUTO_SIZE_TEXT_TYPE_UNIFORM",
-          "IMPL",
-          "AUTO_SIZE_TEXT_TYPE_NONE"
-        ]
-      },
-      "android/support/content/ContentPager": {
-        "androidx/content/ContentPager": [
-          "DEBUG",
-          "CURSOR_DISPOSITION",
-          "EXTRA_TOTAL_COUNT",
-          "EXTRA_HONORED_ARGS",
-          "CURSOR_DISPOSITION_REPAGED",
-          "QUERY_ARG_LIMIT",
-          "QUERY_ARG_OFFSET",
-          "EXTRA_SUGGESTED_LIMIT",
-          "EXTRA_REQUESTED_LIMIT",
-          "CURSOR_DISPOSITION_PAGED",
-          "TAG",
-          "CURSOR_DISPOSITION_WRAPPED",
-          "DEFAULT_CURSOR_CACHE_SIZE",
-          "CURSOR_DISPOSITION_COPIED"
-        ]
-      },
-      "android/support/v13/app/FragmentTabHost$SavedState": {
-        "androidx/app/legacy/FragmentTabHost$SavedState": [
-          "curTab",
-          "CREATOR"
-        ]
-      },
-      "android/support/design/widget/CollapsingToolbarLayout$LayoutParams": {
-        "androidx/design/widget/CollapsingToolbarLayout$LayoutParams": [
-          "DEFAULT_PARALLAX_MULTIPLIER",
-          "bottomMargin",
-          "COLLAPSE_MODE_PARALLAX",
-          "COLLAPSE_MODE_PIN",
-          "COLLAPSE_MODE_OFF"
-        ]
-      },
-      "android/support/v7/app/WindowDecorActionBar": {
-        "androidx/app/WindowDecorActionBar": [
-          "FADE_OUT_DURATION_MS",
-          "FADE_IN_DURATION_MS",
-          "sShowInterpolator",
-          "INVALID_POSITION",
-          "sHideInterpolator",
-          "TAG"
-        ]
-      },
-      "android/support/v4/view/PointerIconCompat": {
-        "androidx/view/PointerIconCompat": [
-          "TYPE_ZOOM_IN",
-          "TYPE_HELP",
-          "TYPE_WAIT",
-          "TYPE_VERTICAL_TEXT",
-          "TYPE_GRAB",
-          "TYPE_NULL",
-          "TYPE_CELL",
-          "TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW",
-          "TYPE_ARROW",
-          "TYPE_TEXT",
-          "TYPE_HORIZONTAL_DOUBLE_ARROW",
-          "TYPE_HAND",
-          "TYPE_DEFAULT",
-          "TYPE_VERTICAL_DOUBLE_ARROW",
-          "TYPE_NO_DROP",
-          "TYPE_COPY",
-          "TYPE_ALL_SCROLL",
-          "TYPE_GRABBING",
-          "TYPE_ALIAS",
-          "TYPE_CROSSHAIR",
-          "TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW",
-          "TYPE_ZOOM_OUT",
-          "TYPE_CONTEXT_MENU"
-        ]
-      },
-      "android/support/v7/widget/GridLayout$Bounds": {
-        "androidx/widget/GridLayout$Bounds": [
-          "after",
-          "flexibility",
-          "before"
-        ]
-      },
-      "android/support/v4/internal/view/SupportMenu": {
-        "androidx/internal/view/SupportMenu": [
-          "USER_SHIFT",
-          "SUPPORTED_MODIFIERS_MASK",
-          "USER_MASK",
-          "CATEGORY_SHIFT",
-          "FLAG_KEEP_OPEN_ON_SUBMENU_OPENED",
-          "CATEGORY_MASK"
-        ]
-      },
-      "android/support/multidex/ZipUtil$CentralDirectory": {
-        "androidx/multidex/ZipUtil$CentralDirectory": [
-          "offset",
-          "size"
-        ]
-      },
-      "android/support/app/recommendation/ContentRecommendation": {
-        "androidx/app/recommendation/ContentRecommendation": [
-          "CONTENT_TYPE_SERIAL",
-          "CONTENT_TYPE_SPORTS",
-          "CONTENT_TYPE_APP",
-          "CONTENT_MATURITY_LOW",
-          "CONTENT_MATURITY_ALL",
-          "CONTENT_PRICING_PREORDER",
-          "INTENT_TYPE_BROADCAST",
-          "CONTENT_STATUS_AVAILABLE",
-          "CONTENT_PRICING_SUBSCRIPTION",
-          "CONTENT_TYPE_MAGAZINE",
-          "CONTENT_TYPE_VIDEO",
-          "CONTENT_MATURITY_MEDIUM",
-          "CONTENT_PRICING_PURCHASE",
-          "CONTENT_TYPE_RADIO",
-          "CONTENT_TYPE_WEBSITE",
-          "CONTENT_TYPE_MUSIC",
-          "INTENT_TYPE_ACTIVITY",
-          "CONTENT_STATUS_UNAVAILABLE",
-          "CONTENT_PRICING_FREE",
-          "CONTENT_TYPE_TRAILER",
-          "CONTENT_TYPE_GAME",
-          "CONTENT_MATURITY_HIGH",
-          "CONTENT_TYPE_NEWS",
-          "CONTENT_STATUS_READY",
-          "CONTENT_TYPE_MOVIE",
-          "CONTENT_STATUS_PENDING",
-          "INTENT_TYPE_SERVICE",
-          "CONTENT_TYPE_PODCAST",
-          "CONTENT_PRICING_RENTAL",
-          "CONTENT_TYPE_COMIC",
-          "CONTENT_TYPE_BOOK"
-        ]
-      },
-      "android/support/v4/media/app/NotificationCompat$MediaStyle": {
-        "androidx/media/app/NotificationCompat$MediaStyle": [
-          "MAX_MEDIA_BUTTONS",
-          "MAX_MEDIA_BUTTONS_IN_COMPACT"
-        ]
-      },
-      "android/support/v4/media/session/MediaControllerCompat$Callback$MessageHandler": {
-        "androidx/media/session/MediaControllerCompat$Callback$MessageHandler": [
-          "MSG_EVENT",
-          "MSG_UPDATE_QUEUE_TITLE",
-          "MSG_UPDATE_EXTRAS",
-          "MSG_UPDATE_METADATA",
-          "MSG_UPDATE_VOLUME",
-          "MSG_UPDATE_SHUFFLE_MODE",
-          "MSG_DESTROYED",
-          "MSG_SESSION_READY",
-          "MSG_UPDATE_REPEAT_MODE",
-          "MSG_UPDATE_CAPTIONING_ENABLED",
-          "MSG_UPDATE_QUEUE",
-          "MSG_UPDATE_PLAYBACK_STATE"
-        ]
-      },
-      "android/support/v7/widget/LinearLayoutManager": {
-        "androidx/widget/LinearLayoutManager": [
-          "TAG",
-          "MAX_SCROLL_FACTOR",
-          "VERTICAL",
-          "INVALID_OFFSET",
-          "DEBUG",
-          "HORIZONTAL"
-        ]
-      },
-      "android/support/v4/view/ViewParentCompat": {
-        "androidx/view/ViewParentCompat": [
-          "IMPL",
-          "TAG"
-        ]
-      },
-      "android/support/v4/widget/DrawerLayout$LayoutParams": {
-        "androidx/widget/DrawerLayout$LayoutParams": [
-          "gravity",
-          "width",
-          "FLAG_IS_OPENED",
-          "openState",
-          "onScreen",
-          "isPeeking",
-          "leftMargin",
-          "bottomMargin",
-          "FLAG_IS_OPENING",
-          "topMargin",
-          "FLAG_IS_CLOSING",
-          "height",
-          "rightMargin"
-        ]
-      },
-      "android/support/v4/graphics/drawable/DrawableWrapperApi14": {
-        "androidx/graphics/drawable/DrawableWrapperApi14": [
-          "DEFAULT_TINT_MODE"
-        ]
-      },
-      "android/support/v7/widget/GridLayoutManager$LayoutParams": {
-        "androidx/widget/GridLayoutManager$LayoutParams": [
-          "bottomMargin",
-          "rightMargin",
-          "height",
-          "topMargin",
-          "width",
-          "INVALID_SPAN_ID",
-          "leftMargin"
-        ]
-      },
-      "android/support/v4/app/NotificationManagerCompat$SideChannelManager$ListenerRecord": {
-        "androidx/app/NotificationManagerCompat$SideChannelManager$ListenerRecord": [
-          "taskQueue",
-          "service",
-          "componentName",
-          "retryCount",
-          "bound"
-        ]
-      },
-      "android/support/v17/leanback/widget/picker/DatePicker": {
-        "androidx/leanback/widget/picker/DatePicker": [
-          "DATE_FORMAT",
-          "LOG_TAG",
-          "DATE_FIELDS"
-        ]
-      },
-      "android/support/v7/widget/DrawableUtils": {
-        "androidx/widget/DrawableUtils": [
-          "INSETS_NONE",
-          "VECTOR_DRAWABLE_CLAZZ_NAME",
-          "TAG",
-          "sInsetsClazz"
-        ]
-      },
-      "android/support/v4/media/session/MediaControllerCompat$PlaybackInfo": {
-        "androidx/media/session/MediaControllerCompat$PlaybackInfo": [
-          "PLAYBACK_TYPE_LOCAL",
-          "PLAYBACK_TYPE_REMOTE"
-        ]
-      },
-      "android/support/v17/leanback/widget/SearchOrbView$Colors": {
-        "androidx/leanback/widget/SearchOrbView$Colors": [
-          "sBrightnessAlpha",
-          "brightColor",
-          "iconColor",
-          "color"
-        ]
-      },
-      "android/support/v7/widget/LayoutState": {
-        "androidx/widget/LayoutState": [
-          "TAG",
-          "LAYOUT_END",
-          "INVALID_LAYOUT",
-          "ITEM_DIRECTION_HEAD",
-          "ITEM_DIRECTION_TAIL",
-          "LAYOUT_START"
-        ]
-      },
-      "android/support/v17/leanback/app/BaseFragment": {
-        "androidx/leanback/app/BaseFragment": [
-          "STATE_ENTRANCE_COMPLETE",
-          "EVT_ON_CREATEVIEW",
-          "COND_TRANSITION_NOT_SUPPORTED",
-          "STATE_ENTRANCE_ON_PREPARED_ON_CREATEVIEW",
-          "STATE_ENTRANCE_ON_ENDED",
-          "EVT_START_ENTRANCE",
-          "EVT_PREPARE_ENTRANCE",
-          "STATE_ENTRANCE_INIT",
-          "STATE_START",
-          "STATE_ENTRANCE_ON_PREPARED",
-          "EVT_ENTRANCE_END",
-          "STATE_ENTRANCE_PERFORM",
-          "EVT_ON_CREATE"
-        ]
-      },
-      "android/support/v7/widget/ActivityChooserView": {
-        "androidx/widget/ActivityChooserView": [
-          "LOG_TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/picker/PickerUtility$TimeConstant": {
-        "androidx/leanback/widget/picker/PickerUtility$TimeConstant": [
-          "ampm",
-          "minutes",
-          "locale",
-          "hours12",
-          "hours24"
-        ]
-      },
-      "android/support/design/widget/DrawableUtils": {
-        "androidx/design/widget/DrawableUtils": [
-          "LOG_TAG",
-          "sSetConstantStateMethod",
-          "sSetConstantStateMethodFetched"
-        ]
-      },
-      "android/support/v7/util/AsyncListUtil": {
-        "androidx/util/AsyncListUtil": [
-          "TAG",
-          "DEBUG"
-        ]
-      },
-      "android/support/v7/widget/ActivityChooserView$ActivityChooserViewAdapter": {
-        "androidx/widget/ActivityChooserView$ActivityChooserViewAdapter": [
-          "ITEM_VIEW_TYPE_COUNT",
-          "MAX_ACTIVITY_COUNT_DEFAULT",
-          "ITEM_VIEW_TYPE_ACTIVITY",
-          "ITEM_VIEW_TYPE_FOOTER",
-          "MAX_ACTIVITY_COUNT_UNLIMITED"
-        ]
-      },
-      "android/support/v17/leanback/widget/ControlBarPresenter": {
-        "androidx/leanback/widget/ControlBarPresenter": [
-          "sChildMarginDefault",
-          "MAX_CONTROLS",
-          "sControlIconWidth"
-        ]
-      },
-      "android/support/v4/app/FragmentTransaction": {
-        "androidx/app/FragmentTransaction": [
-          "TRANSIT_FRAGMENT_CLOSE",
-          "TRANSIT_EXIT_MASK",
-          "TRANSIT_FRAGMENT_OPEN",
-          "TRANSIT_UNSET",
-          "TRANSIT_FRAGMENT_FADE",
-          "TRANSIT_NONE",
-          "TRANSIT_ENTER_MASK"
-        ]
-      },
-      "android/support/design/widget/BottomSheetBehavior": {
-        "androidx/design/widget/BottomSheetBehavior": [
-          "STATE_COLLAPSED",
-          "HIDE_THRESHOLD",
-          "STATE_SETTLING",
-          "STATE_HIDDEN",
-          "STATE_DRAGGING",
-          "HIDE_FRICTION",
-          "STATE_EXPANDED",
-          "PEEK_HEIGHT_AUTO"
-        ]
-      },
-      "android/support/v17/leanback/app/VerticalGridSupportFragment": {
-        "androidx/leanback/app/VerticalGridSupportFragment": [
-          "DEBUG",
-          "STATE_ENTRANCE_ON_PREPARED",
-          "EVT_ON_CREATEVIEW",
-          "STATE_SET_ENTRANCE_START_STATE",
-          "TAG"
-        ]
-      },
-      "android/support/v7/media/MediaItemMetadata": {
-        "androidx/media/MediaItemMetadata": [
-          "KEY_ALBUM_TITLE",
-          "KEY_DURATION",
-          "KEY_YEAR",
-          "KEY_TRACK_NUMBER",
-          "KEY_AUTHOR",
-          "KEY_DISC_NUMBER",
-          "KEY_ALBUM_ARTIST",
-          "KEY_COMPOSER",
-          "KEY_ARTIST",
-          "KEY_ARTWORK_URI",
-          "KEY_TITLE"
-        ]
-      },
-      "android/support/v7/appcompat/R$bool": {
-        "androidx/appcompat/R$bool": [
-          "abc_config_showMenuShortcutsWhenKeyboardPresent",
-          "abc_action_bar_embed_tabs"
-        ]
-      },
-      "android/support/transition/ViewUtilsApi21": {
-        "androidx/transition/ViewUtilsApi21": [
-          "sTransformMatrixToGlobalMethodFetched",
-          "sTransformMatrixToLocalMethodFetched",
-          "TAG",
-          "sSetAnimationMatrixMethod",
-          "sTransformMatrixToGlobalMethod",
-          "sTransformMatrixToLocalMethod",
-          "sSetAnimationMatrixMethodFetched"
-        ]
-      },
-      "android/support/v4/util/Pair": {
-        "androidx/util/Pair": [
-          "first",
-          "second"
-        ]
-      },
-      "android/support/v7/preference/SeekBarPreference$SavedState": {
-        "androidx/preference/SeekBarPreference$SavedState": [
-          "min",
-          "max",
-          "CREATOR",
-          "seekBarValue"
-        ]
-      },
-      "android/support/v7/mediarouter/R$attr": {
-        "androidx/mediarouter/R$attr": [
-          "mediaRouteTheme",
-          "mediaRouteTvIconDrawable",
-          "mediaRouteButtonStyle",
-          "mediaRouteStopDrawable",
-          "mediaRoutePauseDrawable",
-          "mediaRouteSpeakerGroupIconDrawable",
-          "mediaRouteSpeakerIconDrawable",
-          "mediaRouteDefaultIconDrawable",
-          "mediaRoutePlayDrawable"
-        ]
-      },
-      "android/support/v7/view/SupportMenuInflater": {
-        "androidx/view/SupportMenuInflater": [
-          "XML_ITEM",
-          "XML_GROUP",
-          "LOG_TAG",
-          "ACTION_VIEW_CONSTRUCTOR_SIGNATURE",
-          "XML_MENU",
-          "ACTION_PROVIDER_CONSTRUCTOR_SIGNATURE",
-          "NO_ID"
-        ]
-      },
-      "android/support/v4/view/AsyncLayoutInflater$InflateThread": {
-        "androidx/view/AsyncLayoutInflater$InflateThread": [
-          "sInstance"
-        ]
-      },
-      "android/support/design/widget/CollapsingTextHelper": {
-        "androidx/design/widget/CollapsingTextHelper": [
-          "DEBUG_DRAW",
-          "USE_SCALING_TEXTURE",
-          "DEBUG_DRAW_PAINT"
-        ]
-      },
-      "android/support/v4/app/FragmentTabHost$TabInfo": {
-        "androidx/app/FragmentTabHost$TabInfo": [
-          "tag",
-          "fragment",
-          "args",
-          "clss"
-        ]
-      },
-      "android/support/v17/leanback/app/VideoFragment": {
-        "androidx/leanback/app/VideoFragment": [
-          "SURFACE_NOT_CREATED",
-          "SURFACE_CREATED"
-        ]
-      },
-      "android/support/text/emoji/bundled/BundledEmojiCompatConfig$InitRunnable": {
-        "androidx/text/emoji/bundled/BundledEmojiCompatConfig$InitRunnable": [
-          "FONT_NAME"
-        ]
-      },
-      "android/support/mediacompat/R$layout": {
-        "androidx/mediacompat/R$layout": [
-          "notification_template_big_media_custom",
-          "notification_template_media",
-          "notification_media_action",
-          "notification_template_big_media_narrow_custom",
-          "notification_template_media_custom",
-          "notification_template_big_media",
-          "notification_template_big_media_narrow"
-        ]
-      },
-      "android/support/v4/app/NotificationCompat$MessagingStyle$Message": {
-        "androidx/app/NotificationCompat$MessagingStyle$Message": [
-          "KEY_DATA_URI",
-          "KEY_EXTRAS_BUNDLE",
-          "KEY_DATA_MIME_TYPE",
-          "KEY_TIMESTAMP",
-          "KEY_SENDER",
-          "KEY_TEXT"
-        ]
-      },
-      "android/support/v4/media/session/MediaControllerCompat": {
-        "androidx/media/session/MediaControllerCompat": [
-          "COMMAND_GET_EXTRA_BINDER",
-          "COMMAND_REMOVE_QUEUE_ITEM_AT",
-          "COMMAND_ARGUMENT_INDEX",
-          "COMMAND_ARGUMENT_MEDIA_DESCRIPTION",
-          "COMMAND_ADD_QUEUE_ITEM_AT",
-          "COMMAND_ADD_QUEUE_ITEM",
-          "COMMAND_REMOVE_QUEUE_ITEM",
-          "TAG"
-        ]
-      },
-      "android/support/v4/text/TextDirectionHeuristicsCompat$AnyStrong": {
-        "androidx/text/TextDirectionHeuristicsCompat$AnyStrong": [
-          "INSTANCE_RTL",
-          "INSTANCE_LTR"
-        ]
-      },
-      "android/support/wear/widget/ProgressDrawable": {
-        "androidx/wear/widget/ProgressDrawable": [
-          "FULL_CIRCLE",
-          "LEVEL",
-          "CORRECTION_ANGLE",
-          "GROW_SHRINK_RATIO",
-          "MAX_LEVEL",
-          "sInterpolator",
-          "NUMBER_OF_SEGMENTS",
-          "STARTING_ANGLE",
-          "MAX_SWEEP",
-          "ANIMATION_DURATION",
-          "LEVELS_PER_SEGMENT"
-        ]
-      },
-      "android/support/v7/app/MediaRouteControllerDialog$FetchArtTask": {
-        "androidx/app/MediaRouteControllerDialog$FetchArtTask": [
-          "SHOW_ANIM_TIME_THRESHOLD_MILLIS"
-        ]
-      },
-      "android/support/v17/leanback/transition/SlideKitkat": {
-        "androidx/leanback/transition/SlideKitkat": [
-          "sCalculateRight",
-          "sCalculateStart",
-          "sAccelerate",
-          "sDecelerate",
-          "sCalculateTop",
-          "sCalculateEnd",
-          "sCalculateLeft",
-          "sCalculateBottom",
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/ImageCardView": {
-        "androidx/leanback/widget/ImageCardView": [
-          "CARD_TYPE_FLAG_CONTENT",
-          "ALPHA",
-          "CARD_TYPE_FLAG_ICON_RIGHT",
-          "CARD_TYPE_FLAG_TITLE",
-          "CARD_TYPE_FLAG_IMAGE_ONLY",
-          "CARD_TYPE_FLAG_ICON_LEFT"
-        ]
-      },
-      "android/support/v17/leanback/app/VideoSupportFragment": {
-        "androidx/leanback/app/VideoSupportFragment": [
-          "SURFACE_NOT_CREATED",
-          "SURFACE_CREATED"
-        ]
-      },
-      "android/support/v17/leanback/widget/PlaybackControlsRow$PlayPauseAction": {
-        "androidx/leanback/widget/PlaybackControlsRow$PlayPauseAction": [
-          "INDEX_PAUSE",
-          "PLAY",
-          "INDEX_PLAY",
-          "PAUSE"
-        ]
-      },
-      "android/support/v7/widget/SearchView$AutoCompleteTextViewReflector": {
-        "androidx/widget/SearchView$AutoCompleteTextViewReflector": [
-          "showSoftInputUnchecked",
-          "doAfterTextChanged",
-          "ensureImeVisible",
-          "doBeforeTextChanged"
-        ]
-      },
-      "android/support/text/emoji/R$styleable": {
-        "androidx/text/emoji/R$styleable": [
-          "EmojiExtractTextLayout",
-          "EmojiEditText_maxEmojiCount",
-          "EmojiExtractTextLayout_emojiReplaceStrategy",
-          "EmojiEditText"
-        ]
-      },
-      "android/support/v4/view/animation/PathInterpolatorApi14": {
-        "androidx/view/animation/PathInterpolatorApi14": [
-          "PRECISION"
-        ]
-      },
-      "android/support/v4/app/FragmentTransition": {
-        "androidx/app/FragmentTransition": [
-          "PLATFORM_IMPL",
-          "INVERSE_OPS",
-          "SUPPORT_IMPL"
-        ]
-      },
-      "android/support/v7/widget/GridLayout$Spec": {
-        "androidx/widget/GridLayout$Spec": [
-          "weight",
-          "alignment",
-          "UNDEFINED",
-          "startDefined",
-          "span",
-          "DEFAULT_WEIGHT"
-        ]
-      },
-      "android/support/v4/app/INotificationSideChannel$Stub": {
-        "androidx/app/INotificationSideChannel$Stub": [
-          "TRANSACTION_notify",
-          "TRANSACTION_cancel",
-          "TRANSACTION_cancelAll",
-          "DESCRIPTOR"
-        ]
-      },
-      "android/support/v4/app/FragmentManagerImpl": {
-        "androidx/app/FragmentManagerImpl": [
-          "sAnimationListenerField",
-          "TAG",
-          "ANIM_DUR",
-          "ANIM_STYLE_FADE_EXIT",
-          "DEBUG",
-          "ACCELERATE_QUINT",
-          "TARGET_REQUEST_CODE_STATE_TAG",
-          "ANIM_STYLE_OPEN_EXIT",
-          "ANIM_STYLE_OPEN_ENTER",
-          "TARGET_STATE_TAG",
-          "USER_VISIBLE_HINT_TAG",
-          "ANIM_STYLE_FADE_ENTER",
-          "VIEW_STATE_TAG",
-          "DECELERATE_QUINT",
-          "DECELERATE_CUBIC",
-          "ANIM_STYLE_CLOSE_ENTER",
-          "ACCELERATE_CUBIC",
-          "ANIM_STYLE_CLOSE_EXIT"
-        ]
-      },
-      "android/support/v7/app/MediaRouteButton": {
-        "androidx/app/MediaRouteButton": [
-          "TAG",
-          "sRemoteIndicatorCache",
-          "CHECKED_STATE_SET",
-          "CHECKABLE_STATE_SET",
-          "CONTROLLER_FRAGMENT_TAG",
-          "CHOOSER_FRAGMENT_TAG"
-        ]
-      },
-      "android/support/v7/widget/VectorEnabledTintResources": {
-        "androidx/widget/VectorEnabledTintResources": [
-          "MAX_SDK_WHERE_REQUIRED"
-        ]
-      },
-      "android/support/v7/view/menu/MenuItemImpl": {
-        "androidx/view/menu/MenuItemImpl": [
-          "NO_ICON",
-          "HIDDEN",
-          "sEnterShortcutLabel",
-          "CHECKABLE",
-          "SHOW_AS_ACTION_MASK",
-          "sSpaceShortcutLabel",
-          "EXCLUSIVE",
-          "CHECKED",
-          "TAG",
-          "sDeleteShortcutLabel",
-          "IS_ACTION",
-          "ENABLED",
-          "sPrependShortcutLabel"
-        ]
-      },
-      "android/support/content/InMemoryCursor": {
-        "androidx/content/InMemoryCursor": [
-          "NUM_TYPES"
-        ]
-      },
-      "android/support/v4/app/FragmentPagerAdapter": {
-        "androidx/app/FragmentPagerAdapter": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/v4/text/ICUCompat": {
-        "androidx/text/ICUCompat": [
-          "TAG",
-          "sAddLikelySubtagsMethod",
-          "sGetScriptMethod"
-        ]
-      },
-      "android/support/v4/media/session/MediaControllerCompatApi21$PlaybackInfo": {
-        "androidx/media/session/MediaControllerCompatApi21$PlaybackInfo": [
-          "FLAG_SCO",
-          "STREAM_BLUETOOTH_SCO",
-          "STREAM_SYSTEM_ENFORCED"
-        ]
-      },
-      "android/support/text/emoji/R$id": {
-        "androidx/text/emoji/R$id": [
-          "inputExtractAccessories",
-          "inputExtractAction"
-        ]
-      },
-      "android/support/v17/leanback/R$animator": {
-        "androidx/leanback/R$animator": [
-          "lb_onboarding_page_indicator_fade_in",
-          "lb_onboarding_page_indicator_fade_out",
-          "lb_onboarding_start_button_fade_in",
-          "lb_playback_controls_fade_in",
-          "lb_playback_controls_fade_out",
-          "lb_onboarding_logo_enter",
-          "lb_onboarding_start_button_fade_out",
-          "lb_onboarding_page_indicator_enter",
-          "lb_playback_bg_fade_out",
-          "lb_onboarding_title_enter",
-          "lb_onboarding_description_enter",
-          "lb_playback_bg_fade_in",
-          "lb_onboarding_logo_exit"
-        ]
-      },
-      "android/support/transition/TransitionInflater": {
-        "androidx/transition/TransitionInflater": [
-          "CONSTRUCTOR_SIGNATURE",
-          "CONSTRUCTORS"
-        ]
-      },
-      "android/support/v4/media/RatingCompat": {
-        "androidx/media/RatingCompat": [
-          "RATING_THUMB_UP_DOWN",
-          "RATING_5_STARS",
-          "RATING_HEART",
-          "RATING_PERCENTAGE",
-          "CREATOR",
-          "RATING_4_STARS",
-          "RATING_NONE",
-          "RATING_NOT_RATED",
-          "TAG",
-          "RATING_3_STARS"
-        ]
-      },
-      "android/support/v17/leanback/transition/FadeAndShortSlide": {
-        "androidx/leanback/transition/FadeAndShortSlide": [
-          "sCalculateTopBottom",
-          "sCalculateStartEnd",
-          "sCalculateEnd",
-          "sCalculateBottom",
-          "PROPNAME_SCREEN_POSITION",
-          "sDecelerate",
-          "sCalculateStart",
-          "sCalculateTop"
-        ]
-      },
-      "android/support/design/R$attr": {
-        "androidx/design/R$attr": [
-          "state_collapsible",
-          "state_collapsed",
-          "bottomSheetDialogTheme"
-        ]
-      },
-      "android/support/graphics/drawable/PathInterpolatorCompat": {
-        "androidx/graphics/drawable/PathInterpolatorCompat": [
-          "EPSILON",
-          "PRECISION",
-          "MAX_NUM_POINTS"
-        ]
-      },
-      "android/support/animation/SpringAnimation": {
-        "androidx/animation/SpringAnimation": [
-          "UNSET"
-        ]
-      },
-      "android/support/v7/app/AppCompatDelegateImplV9$PanelFeatureState$SavedState": {
-        "androidx/app/AppCompatDelegateImplV9$PanelFeatureState$SavedState": [
-          "featureId",
-          "menuState",
-          "CREATOR",
-          "isOpen"
-        ]
-      },
-      "android/support/v7/view/menu/MenuBuilder": {
-        "androidx/view/menu/MenuBuilder": [
-          "EXPANDED_ACTION_VIEW_ID",
-          "TAG",
-          "PRESENTER_KEY",
-          "ACTION_VIEW_STATES_KEY",
-          "sCategoryToOrder"
-        ]
-      },
-      "android/support/v4/view/ViewGroupCompat": {
-        "androidx/view/ViewGroupCompat": [
-          "LAYOUT_MODE_OPTICAL_BOUNDS",
-          "LAYOUT_MODE_CLIP_BOUNDS",
-          "IMPL"
-        ]
-      },
-      "android/support/v14/preference/MultiSelectListPreferenceDialogFragment": {
-        "androidx/preference/MultiSelectListPreferenceDialogFragment": [
-          "SAVE_STATE_ENTRY_VALUES",
-          "SAVE_STATE_VALUES",
-          "SAVE_STATE_ENTRIES",
-          "SAVE_STATE_CHANGED"
-        ]
-      },
-      "android/support/v4/print/PrintHelper$PrintHelperApi19": {
-        "androidx/print/PrintHelper$PrintHelperApi19": [
-          "MAX_PRINT_SIZE",
-          "LOG_TAG"
-        ]
-      },
-      "android/support/v7/widget/AdapterHelper$UpdateOp": {
-        "androidx/widget/AdapterHelper$UpdateOp": [
-          "positionStart",
-          "payload",
-          "MOVE",
-          "REMOVE",
-          "ADD",
-          "UPDATE",
-          "cmd",
-          "POOL_SIZE",
-          "itemCount"
-        ]
-      },
-      "android/support/v17/leanback/app/BrowseFragment$SetSelectionRunnable": {
-        "androidx/leanback/app/BrowseFragment$SetSelectionRunnable": [
-          "TYPE_INTERNAL_SYNC",
-          "TYPE_USER_REQUEST",
-          "TYPE_INVALID"
-        ]
-      },
-      "android/support/v17/leanback/app/BrowseSupportFragment$ExpandPreLayout": {
-        "androidx/leanback/app/BrowseSupportFragment$ExpandPreLayout": [
-          "STATE_SECOND_DRAW",
-          "STATE_INIT",
-          "STATE_FIRST_DRAW",
-          "mainFragmentAdapter"
-        ]
-      },
-      "android/support/v4/widget/PopupWindowCompat$PopupWindowCompatBaseImpl": {
-        "androidx/widget/PopupWindowCompat$PopupWindowCompatBaseImpl": [
-          "sGetWindowLayoutTypeMethodAttempted",
-          "sGetWindowLayoutTypeMethod",
-          "sSetWindowLayoutTypeMethod",
-          "sSetWindowLayoutTypeMethodAttempted"
-        ]
-      },
-      "android/support/v7/widget/SwitchCompat": {
-        "androidx/widget/SwitchCompat": [
-          "MONOSPACE",
-          "CHECKED_STATE_SET",
-          "TOUCH_MODE_DRAGGING",
-          "TOUCH_MODE_DOWN",
-          "THUMB_POS",
-          "TOUCH_MODE_IDLE",
-          "SERIF",
-          "THUMB_ANIMATION_DURATION",
-          "ACCESSIBILITY_EVENT_CLASS_NAME",
-          "SANS"
-        ]
-      },
-      "android/support/v7/widget/RecyclerView$LayoutManager$Properties": {
-        "androidx/widget/RecyclerView$LayoutManager$Properties": [
-          "reverseLayout",
-          "stackFromEnd",
-          "spanCount",
-          "orientation"
-        ]
-      },
-      "android/support/v4/app/NotificationManagerCompat$SideChannelManager": {
-        "androidx/app/NotificationManagerCompat$SideChannelManager": [
-          "MSG_QUEUE_TASK",
-          "MSG_RETRY_LISTENER_QUEUE",
-          "MSG_SERVICE_CONNECTED",
-          "MSG_SERVICE_DISCONNECTED"
-        ]
-      },
-      "android/support/v17/leanback/app/BrowseSupportFragment$MainFragmentAdapterRegistry": {
-        "androidx/leanback/app/BrowseSupportFragment$MainFragmentAdapterRegistry": [
-          "sDefaultFragmentFactory"
-        ]
-      },
-      "android/support/v7/preference/PreferenceFragmentCompat": {
-        "androidx/preference/PreferenceFragmentCompat": [
-          "MSG_BIND_PREFERENCES",
-          "PREFERENCES_TAG",
-          "ARG_PREFERENCE_ROOT",
-          "DIALOG_FRAGMENT_TAG"
-        ]
-      },
-      "android/support/v7/widget/SearchView": {
-        "androidx/widget/SearchView": [
-          "ENABLED_STATE_SET",
-          "EMPTY_STATE_SET",
-          "FOCUSED_STATE_SET",
-          "DBG",
-          "IME_OPTION_NO_MICROPHONE",
-          "LOG_TAG",
-          "HIDDEN_METHOD_INVOKER"
-        ]
-      },
-      "android/support/v4/view/AsyncLayoutInflater$BasicInflater": {
-        "androidx/view/AsyncLayoutInflater$BasicInflater": [
-          "sClassPrefixList"
-        ]
-      },
-      "android/support/v7/widget/DividerItemDecoration": {
-        "androidx/widget/DividerItemDecoration": [
-          "VERTICAL",
-          "HORIZONTAL",
-          "ATTRS",
-          "TAG"
-        ]
-      },
-      "android/support/wear/widget/SwipeDismissFrameLayout": {
-        "androidx/wear/widget/SwipeDismissFrameLayout": [
-          "DEFAULT_INTERPOLATION_FACTOR",
-          "TRANSLATION_MIN_ALPHA",
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/app/HeadersFragment": {
-        "androidx/leanback/app/HeadersFragment": [
-          "sHeaderPresenter",
-          "sLayoutChangeListener"
-        ]
-      },
-      "android/support/customtabs/CustomTabsService": {
-        "androidx/browser/customtabs/CustomTabsService": [
-          "RESULT_FAILURE_MESSAGING_ERROR",
-          "RESULT_SUCCESS",
-          "RESULT_FAILURE_REMOTE_ERROR",
-          "ACTION_CUSTOM_TABS_CONNECTION",
-          "KEY_URL",
-          "RESULT_FAILURE_DISALLOWED",
-          "RELATION_HANDLE_ALL_URLS",
-          "RELATION_USE_AS_ORIGIN"
-        ]
-      },
-      "android/support/v17/leanback/app/GuidedStepFragment": {
-        "androidx/leanback/app/GuidedStepFragment": [
-          "IS_FRAMEWORK_FRAGMENT",
-          "entranceTransitionType",
-          "ENTRY_NAME_ENTRANCE",
-          "TAG_LEAN_BACK_ACTIONS_FRAGMENT",
-          "UI_STYLE_REPLACE",
-          "EXTRA_BUTTON_ACTION_PREFIX",
-          "UI_STYLE_DEFAULT",
-          "DEBUG",
-          "SLIDE_FROM_BOTTOM",
-          "UI_STYLE_ENTRANCE",
-          "SLIDE_FROM_SIDE",
-          "TAG",
-          "EXTRA_UI_STYLE",
-          "EXTRA_ACTION_PREFIX",
-          "ENTRY_NAME_REPLACE",
-          "UI_STYLE_ACTIVITY_ROOT"
-        ]
-      },
-      "android/support/v17/leanback/util/StateMachine": {
-        "androidx/leanback/util/StateMachine": [
-          "STATUS_ZERO",
-          "STATUS_INVOKED",
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/compat/R$drawable": {
-        "androidx/compat/R$drawable": [
-          "notification_template_icon_bg",
-          "notification_bg",
-          "notification_icon_background",
-          "notification_template_icon_low_bg",
-          "notification_bg_low"
-        ]
-      },
-      "android/support/v4/provider/DocumentsContractApi19": {
-        "androidx/provider/DocumentsContractApi19": [
-          "TAG",
-          "FLAG_VIRTUAL_DOCUMENT"
-        ]
-      },
-      "android/support/v4/app/JobIntentService": {
-        "androidx/app/JobIntentService": [
-          "TAG",
-          "sClassWorkEnqueuer",
-          "DEBUG",
-          "sLock"
-        ]
-      },
-      "android/support/v4/graphics/TypefaceCompatUtil": {
-        "androidx/graphics/TypefaceCompatUtil": [
-          "CACHE_FILE_PREFIX",
-          "TAG"
-        ]
-      },
-      "android/support/transition/Explode": {
-        "androidx/transition/Explode": [
-          "PROPNAME_SCREEN_BOUNDS",
-          "sDecelerate",
-          "sAccelerate"
-        ]
-      },
-      "android/support/v4/view/AccessibilityDelegateCompat": {
-        "androidx/view/AccessibilityDelegateCompat": [
-          "DEFAULT_DELEGATE",
-          "IMPL"
-        ]
-      },
-      "android/support/v4/view/MenuItemCompat": {
-        "androidx/view/MenuItemCompat": [
-          "IMPL",
-          "SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW",
-          "SHOW_AS_ACTION_WITH_TEXT",
-          "SHOW_AS_ACTION_NEVER",
-          "SHOW_AS_ACTION_ALWAYS",
-          "SHOW_AS_ACTION_IF_ROOM",
-          "TAG"
-        ]
-      },
-      "android/support/v4/widget/CircleImageView": {
-        "androidx/widget/CircleImageView": [
-          "SHADOW_RADIUS",
-          "Y_OFFSET",
-          "X_OFFSET",
-          "KEY_SHADOW_COLOR",
-          "SHADOW_ELEVATION",
-          "FILL_SHADOW_COLOR"
-        ]
-      },
-      "android/support/v7/widget/SuggestionsAdapter": {
-        "androidx/widget/SuggestionsAdapter": [
-          "REFINE_NONE",
-          "LOG_TAG",
-          "REFINE_ALL",
-          "INVALID_INDEX",
-          "DBG",
-          "QUERY_LIMIT",
-          "REFINE_BY_ENTRY"
-        ]
-      },
-      "android/support/wear/widget/drawer/WearableActionDrawerView$ActionItemViewHolder": {
-        "androidx/wear/widget/drawer/WearableActionDrawerView$ActionItemViewHolder": [
-          "view",
-          "iconView",
-          "textView"
-        ]
-      },
-      "android/support/v14/preference/PreferenceDialogFragment": {
-        "androidx/preference/PreferenceDialogFragment": [
-          "SAVE_STATE_POSITIVE_TEXT",
-          "SAVE_STATE_TITLE",
-          "SAVE_STATE_ICON",
-          "ARG_KEY",
-          "SAVE_STATE_MESSAGE",
-          "SAVE_STATE_NEGATIVE_TEXT",
-          "SAVE_STATE_LAYOUT"
-        ]
-      },
-      "android/support/v4/media/session/IMediaControllerCallback$Stub": {
-        "androidx/media/session/IMediaControllerCallback$Stub": [
-          "TRANSACTION_onSessionDestroyed",
-          "TRANSACTION_onMetadataChanged",
-          "TRANSACTION_onEvent",
-          "TRANSACTION_onQueueChanged",
-          "TRANSACTION_onSessionReady",
-          "TRANSACTION_onCaptioningEnabledChanged",
-          "TRANSACTION_onVolumeInfoChanged",
-          "TRANSACTION_onShuffleModeChangedRemoved",
-          "TRANSACTION_onRepeatModeChanged",
-          "TRANSACTION_onPlaybackStateChanged",
-          "TRANSACTION_onQueueTitleChanged",
-          "TRANSACTION_onShuffleModeChanged",
-          "DESCRIPTOR",
-          "TRANSACTION_onExtrasChanged"
-        ]
-      },
-      "android/support/v7/preference/EditTextPreference$SavedState": {
-        "androidx/preference/EditTextPreference$SavedState": [
-          "text",
-          "CREATOR"
-        ]
-      },
-      "android/support/v17/leanback/widget/PagingIndicator$Dot": {
-        "androidx/leanback/widget/PagingIndicator$Dot": [
-          "LEFT",
-          "LTR",
-          "RIGHT",
-          "RTL"
-        ]
-      },
-      "android/support/v7/widget/ScrollingTabContainerView$TabView": {
-        "androidx/widget/ScrollingTabContainerView$TabView": [
-          "BG_ATTRS"
-        ]
-      },
-      "android/support/wear/ambient/SharedLibraryVersion$PresenceHolder": {
-        "androidx/wear/ambient/SharedLibraryVersion$PresenceHolder": [
-          "PRESENT"
-        ]
-      },
-      "android/support/v4/graphics/BitmapCompat": {
-        "androidx/graphics/BitmapCompat": [
-          "IMPL"
-        ]
-      },
-      "android/support/wear/R$fraction": {
-        "androidx/wear/R$fraction": [
-          "ws_action_drawer_item_right_padding",
-          "ws_action_drawer_item_last_item_bottom_padding",
-          "ws_action_drawer_item_left_padding",
-          "ws_action_drawer_item_first_item_top_padding"
-        ]
-      },
-      "android/support/v7/media/MediaSessionStatus": {
-        "androidx/media/MediaSessionStatus": [
-          "KEY_TIMESTAMP",
-          "SESSION_STATE_INVALIDATED",
-          "KEY_EXTRAS",
-          "KEY_QUEUE_PAUSED",
-          "KEY_SESSION_STATE",
-          "SESSION_STATE_ENDED",
-          "SESSION_STATE_ACTIVE"
-        ]
-      },
-      "android/support/v4/app/NotificationManagerCompat$CancelTask": {
-        "androidx/app/NotificationManagerCompat$CancelTask": [
-          "tag",
-          "all",
-          "id",
-          "packageName"
-        ]
-      },
-      "android/support/v4/media/MediaBrowserCompat$MediaBrowserImplBase": {
-        "androidx/media/MediaBrowserCompat$MediaBrowserImplBase": [
-          "CONNECT_STATE_DISCONNECTED",
-          "CONNECT_STATE_CONNECTED",
-          "CONNECT_STATE_CONNECTING",
-          "CONNECT_STATE_SUSPENDED",
-          "CONNECT_STATE_DISCONNECTING"
-        ]
-      },
-      "android/support/wear/widget/WearableRecyclerView": {
-        "androidx/wear/widget/WearableRecyclerView": [
-          "TAG",
-          "NO_VALUE"
-        ]
-      },
-      "android/support/app/recommendation/RecommendationExtender": {
-        "androidx/app/recommendation/RecommendationExtender": [
-          "KEY_CONTENT_RUN_LENGTH",
-          "KEY_CONTENT_GENRES",
-          "KEY_CONTENT_TYPE",
-          "TAG",
-          "EXTRA_CONTENT_INFO_EXTENDER",
-          "KEY_CONTENT_MATURITY_RATING",
-          "KEY_CONTENT_STATUS",
-          "KEY_CONTENT_PRICING_VALUE",
-          "KEY_CONTENT_PRICING_TYPE"
-        ]
-      },
-      "android/support/v7/widget/ThemeUtils": {
-        "androidx/widget/ThemeUtils": [
-          "TEMP_ARRAY",
-          "DISABLED_STATE_SET",
-          "ACTIVATED_STATE_SET",
-          "NOT_PRESSED_OR_FOCUSED_STATE_SET",
-          "FOCUSED_STATE_SET",
-          "SELECTED_STATE_SET",
-          "CHECKED_STATE_SET",
-          "PRESSED_STATE_SET",
-          "EMPTY_STATE_SET",
-          "TL_TYPED_VALUE"
-        ]
-      },
-      "android/support/media/ExifInterface$ByteOrderedDataInputStream": {
-        "androidx/media/ExifInterface$ByteOrderedDataInputStream": [
-          "BIG_ENDIAN",
-          "LITTLE_ENDIAN"
-        ]
-      },
-      "android/support/v7/widget/helper/ItemTouchHelper$Callback": {
-        "androidx/widget/helper/ItemTouchHelper$Callback": [
-          "ABS_HORIZONTAL_DIR_FLAGS",
-          "sDragScrollInterpolator",
-          "DRAG_SCROLL_ACCELERATION_LIMIT_TIME_MS",
-          "DEFAULT_DRAG_ANIMATION_DURATION",
-          "RELATIVE_DIR_FLAGS",
-          "DEFAULT_SWIPE_ANIMATION_DURATION",
-          "sDragViewScrollCapInterpolator",
-          "sUICallback"
-        ]
-      },
-      "android/support/v4/media/MediaBrowserServiceCompat$BrowserRoot": {
-        "androidx/media/MediaBrowserServiceCompat$BrowserRoot": [
-          "EXTRA_SUGGESTION_KEYWORDS",
-          "EXTRA_SUGGESTED",
-          "EXTRA_OFFLINE",
-          "EXTRA_RECENT"
-        ]
-      },
-      "android/support/v17/leanback/widget/PlaybackControlsPresenter": {
-        "androidx/leanback/widget/PlaybackControlsPresenter": [
-          "sChildMarginBigger",
-          "sChildMarginBiggest"
-        ]
-      },
-      "android/support/v7/preference/PreferenceDialogFragmentCompat": {
-        "androidx/preference/PreferenceDialogFragmentCompat": [
-          "SAVE_STATE_LAYOUT",
-          "ARG_KEY",
-          "SAVE_STATE_ICON",
-          "SAVE_STATE_MESSAGE",
-          "SAVE_STATE_TITLE",
-          "SAVE_STATE_NEGATIVE_TEXT",
-          "SAVE_STATE_POSITIVE_TEXT"
-        ]
-      },
-      "android/support/v7/app/TwilightManager": {
-        "androidx/app/TwilightManager": [
-          "SUNRISE",
-          "SUNSET",
-          "TAG",
-          "sInstance"
-        ]
-      },
-      "android/support/v4/graphics/drawable/DrawableCompat": {
-        "androidx/graphics/drawable/DrawableCompat": [
-          "sSetLayoutDirectionMethod",
-          "sGetLayoutDirectionMethodFetched",
-          "sGetLayoutDirectionMethod",
-          "TAG",
-          "sSetLayoutDirectionMethodFetched"
-        ]
-      },
-      "android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory": {
-        "androidx/graphics/drawable/RoundedBitmapDrawableFactory": [
-          "TAG"
-        ]
-      },
-      "android/support/transition/GhostViewApi21": {
-        "androidx/transition/GhostViewApi21": [
-          "sAddGhostMethod",
-          "TAG",
-          "sRemoveGhostMethod",
-          "sAddGhostMethodFetched",
-          "sRemoveGhostMethodFetched",
-          "sGhostViewClassFetched",
-          "sGhostViewClass"
-        ]
-      },
-      "android/support/v7/app/ActionBar": {
-        "androidx/app/ActionBar": [
-          "NAVIGATION_MODE_TABS",
-          "NAVIGATION_MODE_LIST",
-          "DISPLAY_SHOW_TITLE",
-          "DISPLAY_SHOW_CUSTOM",
-          "DISPLAY_USE_LOGO",
-          "NAVIGATION_MODE_STANDARD",
-          "DISPLAY_HOME_AS_UP",
-          "DISPLAY_SHOW_HOME"
-        ]
-      },
-      "android/support/media/tv/TvContractCompat$WatchNextPrograms": {
-        "androidx/media/tv/TvContractCompat$WatchNextPrograms": [
-          "WATCH_NEXT_TYPE_WATCHLIST",
-          "WATCH_NEXT_TYPE_CONTINUE",
-          "WATCH_NEXT_TYPE_NEXT",
-          "COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS",
-          "CONTENT_URI",
-          "WATCH_NEXT_TYPE_NEW",
-          "CONTENT_TYPE",
-          "COLUMN_WATCH_NEXT_TYPE",
-          "CONTENT_ITEM_TYPE"
-        ]
-      },
-      "android/support/v4/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat": {
-        "androidx/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat": [
-          "SELECTION_MODE_MULTIPLE",
-          "SELECTION_MODE_SINGLE",
-          "SELECTION_MODE_NONE"
-        ]
-      },
-      "android/support/v17/preference/R$id": {
-        "androidx/leanback/preference/R$id": [
-          "button",
-          "settings_preference_fragment_container",
-          "main_frame",
-          "container",
-          "decor_title",
-          "settings_dialog_container"
-        ]
-      },
-      "android/support/wear/R$style": {
-        "androidx/wear/R$style": [
-          "Widget_Wear_WearableDrawerView",
-          "WsPageIndicatorViewStyle"
-        ]
-      },
-      "android/support/v17/leanback/widget/GuidedActionAdapterGroup": {
-        "androidx/leanback/widget/GuidedActionAdapterGroup": [
-          "TAG_EDIT",
-          "DEBUG_EDIT"
-        ]
-      },
-      "android/support/v7/widget/GridLayout$PackedMap": {
-        "androidx/widget/GridLayout$PackedMap": [
-          "values",
-          "index",
-          "keys"
-        ]
-      },
-      "android/support/v7/widget/ActionBarOverlayLayout": {
-        "androidx/widget/ActionBarOverlayLayout": [
-          "TAG",
-          "ATTRS",
-          "ACTION_BAR_ANIMATE_DELAY"
-        ]
-      },
-      "android/support/v4/app/NavUtils": {
-        "androidx/app/NavUtils": [
-          "TAG",
-          "PARENT_ACTIVITY"
-        ]
-      },
-      "android/support/v7/media/RemotePlaybackClient$ActionReceiver": {
-        "androidx/media/RemotePlaybackClient$ActionReceiver": [
-          "ACTION_ITEM_STATUS_CHANGED",
-          "ACTION_MESSAGE_RECEIVED",
-          "ACTION_SESSION_STATUS_CHANGED"
-        ]
-      },
-      "android/support/v4/app/JobIntentService$JobServiceEngineImpl": {
-        "androidx/app/JobIntentService$JobServiceEngineImpl": [
-          "TAG",
-          "DEBUG"
-        ]
-      },
-      "android/support/v4/app/FragmentActivity$NonConfigurationInstances": {
-        "androidx/app/FragmentActivity$NonConfigurationInstances": [
-          "custom",
-          "fragments",
-          "loaders"
-        ]
-      },
-      "android/support/text/emoji/flatbuffer/FlatBufferBuilder": {
-        "androidx/text/emoji/flatbuffer/FlatBufferBuilder": [
-          "encoder",
-          "vtable_in_use",
-          "minalign",
-          "vtables",
-          "num_vtables",
-          "force_defaults",
-          "space",
-          "bb",
-          "object_start",
-          "vtable",
-          "dst",
-          "vector_num_elems",
-          "nested",
-          "finished",
-          "utf8charset"
-        ]
-      },
-      "android/support/v7/mediarouter/R$interpolator": {
-        "androidx/mediarouter/R$interpolator": [
-          "mr_fast_out_slow_in",
-          "mr_linear_out_slow_in"
-        ]
-      },
-      "android/support/v7/recyclerview/R$dimen": {
-        "androidx/recyclerview/R$dimen": [
-          "item_touch_helper_max_drag_scroll_per_frame",
-          "fastscroll_minimum_range",
-          "item_touch_helper_swipe_escape_max_velocity",
-          "fastscroll_default_thickness",
-          "item_touch_helper_swipe_escape_velocity",
-          "fastscroll_margin"
-        ]
-      },
-      "android/support/v4/app/ShareCompat": {
-        "androidx/app/ShareCompat": [
-          "EXTRA_CALLING_PACKAGE",
-          "HISTORY_FILENAME_PREFIX",
-          "EXTRA_CALLING_ACTIVITY"
-        ]
-      },
-      "android/support/v4/media/AudioAttributesCompatApi21": {
-        "androidx/media/AudioAttributesCompatApi21": [
-          "TAG",
-          "sAudioAttributesToLegacyStreamType"
-        ]
-      },
-      "android/support/customtabs/CustomTabsCallback": {
-        "androidx/browser/customtabs/CustomTabsCallback": [
-          "NAVIGATION_FINISHED",
-          "NAVIGATION_ABORTED",
-          "NAVIGATION_FAILED",
-          "NAVIGATION_STARTED",
-          "TAB_HIDDEN",
-          "TAB_SHOWN"
-        ]
-      },
-      "android/support/wear/widget/CircularProgressLayout": {
-        "androidx/wear/widget/CircularProgressLayout": [
-          "DEFAULT_ROTATION",
-          "DEFAULT_UPDATE_INTERVAL"
-        ]
-      },
-      "android/support/v17/leanback/widget/ListRowPresenter": {
-        "androidx/leanback/widget/ListRowPresenter": [
-          "DEBUG",
-          "TAG",
-          "sExpandedSelectedRowTopPadding",
-          "DEFAULT_RECYCLED_POOL_SIZE",
-          "sExpandedRowNoHovercardBottomPadding",
-          "sSelectedRowTopPadding"
-        ]
-      },
-      "android/support/v7/preference/PreferenceGroupAdapter$PreferenceLayout": {
-        "androidx/preference/PreferenceGroupAdapter$PreferenceLayout": [
-          "widgetResId",
-          "resId",
-          "name"
-        ]
-      },
-      "android/support/transition/Styleable$Transition": {
-        "androidx/transition/Styleable$Transition": [
-          "MATCH_ORDER",
-          "START_DELAY",
-          "DURATION",
-          "INTERPOLATOR"
-        ]
-      },
-      "android/support/v4/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat": {
-        "androidx/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat": [
-          "RANGE_TYPE_PERCENT",
-          "RANGE_TYPE_INT",
-          "RANGE_TYPE_FLOAT"
-        ]
-      },
-      "android/support/transition/Styleable$Fade": {
-        "androidx/transition/Styleable$Fade": [
-          "FADING_MODE"
-        ]
-      },
-      "android/support/v4/app/SharedElementCallback": {
-        "androidx/app/SharedElementCallback": [
-          "BUNDLE_SNAPSHOT_BITMAP",
-          "BUNDLE_SNAPSHOT_IMAGE_MATRIX",
-          "BUNDLE_SNAPSHOT_IMAGE_SCALETYPE",
-          "MAX_IMAGE_SIZE"
-        ]
-      },
-      "android/support/design/widget/ThemeUtils": {
-        "androidx/design/widget/ThemeUtils": [
-          "APPCOMPAT_CHECK_ATTRS"
-        ]
-      },
-      "android/support/media/tv/TvContractCompat$Programs": {
-        "androidx/media/tv/TvContractCompat$Programs": [
-          "COLUMN_BROADCAST_GENRE",
-          "COLUMN_CHANNEL_ID",
-          "COLUMN_START_TIME_UTC_MILLIS",
-          "CONTENT_ITEM_TYPE",
-          "CONTENT_TYPE",
-          "COLUMN_EPISODE_NUMBER",
-          "COLUMN_END_TIME_UTC_MILLIS",
-          "COLUMN_RECORDING_PROHIBITED",
-          "CONTENT_URI",
-          "COLUMN_SEASON_NUMBER"
-        ]
-      },
-      "android/support/v17/leanback/R$integer": {
-        "androidx/leanback/R$integer": [
-          "lb_details_description_body_min_lines",
-          "lb_search_orb_pulse_duration_ms",
-          "lb_search_bar_speech_mode_background_alpha",
-          "lb_search_bar_text_mode_background_alpha",
-          "lb_details_description_body_max_lines",
-          "lb_card_activated_animation_duration",
-          "lb_card_selected_animation_duration",
-          "lb_search_orb_scale_duration_ms",
-          "lb_browse_rows_anim_duration",
-          "lb_playback_controls_show_time_ms",
-          "lb_card_selected_animation_delay"
-        ]
-      },
-      "android/support/mediacompat/R$id": {
-        "androidx/mediacompat/R$id": [
-          "action0",
-          "media_actions",
-          "cancel_action",
-          "status_bar_latest_event_content",
-          "end_padder"
-        ]
-      },
-      "android/support/v17/leanback/widget/Row": {
-        "androidx/leanback/widget/Row": [
-          "FLAG_ID_USE_HEADER",
-          "FLAG_ID_USE_ID",
-          "FLAG_ID_USE_MASK"
-        ]
-      },
-      "android/support/compat/R$layout": {
-        "androidx/compat/R$layout": [
-          "notification_action_tombstone",
-          "notification_template_custom_big",
-          "notification_action"
-        ]
-      },
-      "android/support/v4/app/FragmentManagerImpl$AnimationOrAnimator": {
-        "androidx/app/FragmentManagerImpl$AnimationOrAnimator": [
-          "animator",
-          "animation"
-        ]
-      },
-      "android/support/transition/VisibilityPropagation": {
-        "androidx/transition/VisibilityPropagation": [
-          "PROPNAME_VISIBILITY",
-          "PROPNAME_VIEW_CENTER",
-          "VISIBILITY_PROPAGATION_VALUES"
-        ]
-      },
-      "android/support/v4/app/NotificationCompat$Action$WearableExtender": {
-        "androidx/app/NotificationCompat$Action$WearableExtender": [
-          "KEY_FLAGS",
-          "KEY_CONFIRM_LABEL",
-          "KEY_CANCEL_LABEL",
-          "FLAG_HINT_LAUNCHES_ACTIVITY",
-          "KEY_IN_PROGRESS_LABEL",
-          "EXTRA_WEARABLE_EXTENSIONS",
-          "FLAG_AVAILABLE_OFFLINE",
-          "FLAG_HINT_DISPLAY_INLINE",
-          "DEFAULT_FLAGS"
-        ]
-      },
-      "android/support/v4/view/ViewPager$ItemInfo": {
-        "androidx/view/ViewPager$ItemInfo": [
-          "offset",
-          "object",
-          "position",
-          "widthFactor",
-          "scrolling"
-        ]
-      },
-      "android/support/v17/leanback/transition/TransitionHelper": {
-        "androidx/leanback/transition/TransitionHelper": [
-          "SLIDE_RIGHT",
-          "sImpl",
-          "SLIDE_BOTTOM",
-          "FADE_OUT",
-          "SLIDE_TOP",
-          "FADE_IN",
-          "SLIDE_LEFT"
-        ]
-      },
-      "android/support/v4/widget/AutoSizeableTextView": {
-        "androidx/widget/AutoSizeableTextView": [
-          "PLATFORM_SUPPORTS_AUTOSIZE"
-        ]
-      },
-      "android/support/v7/widget/SimpleItemAnimator": {
-        "androidx/widget/SimpleItemAnimator": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/transition/TransitionManager": {
-        "androidx/transition/TransitionManager": [
-          "sPendingTransitions",
-          "sRunningTransitions",
-          "sDefaultTransition",
-          "LOG_TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/WindowAlignment$Axis": {
-        "androidx/leanback/widget/WindowAlignment$Axis": [
-          "PF_KEYLINE_OVER_HIGH_EDGE",
-          "PF_KEYLINE_OVER_LOW_EDGE"
-        ]
-      },
-      "android/support/v7/widget/AppCompatPopupWindow": {
-        "androidx/widget/AppCompatPopupWindow": [
-          "COMPAT_OVERLAP_ANCHOR"
-        ]
-      },
-      "android/support/constraint/solver/widgets/ConstraintAnchor$Type": {
-        "androidx/constraint/solver/widgets/ConstraintAnchor$Type": [
-          "RIGHT",
-          "TOP",
-          "BOTTOM",
-          "LEFT",
-          "BASELINE"
-        ]
-      },
-      "android/support/wear/widget/drawer/WearableDrawerLayout": {
-        "androidx/wear/widget/drawer/WearableDrawerLayout": [
-          "TAG",
-          "UP",
-          "OPENED_PERCENT_THRESHOLD",
-          "NESTED_SCROLL_SLOP_DP",
-          "GRAVITY_UNDEFINED",
-          "DOWN",
-          "PEEK_FADE_DURATION_MS",
-          "PEEK_AUTO_CLOSE_DELAY_MS"
-        ]
-      },
-      "android/support/v17/leanback/widget/ShadowOverlayHelper$Builder": {
-        "androidx/leanback/widget/ShadowOverlayHelper$Builder": [
-          "options",
-          "needsRoundedCorner",
-          "keepForegroundDrawable",
-          "preferZOrder",
-          "needsOverlay",
-          "needsShadow"
-        ]
-      },
-      "android/support/v7/media/MediaRouteProvider": {
-        "androidx/media/MediaRouteProvider": [
-          "MSG_DELIVER_DESCRIPTOR_CHANGED",
-          "MSG_DELIVER_DISCOVERY_REQUEST_CHANGED"
-        ]
-      },
-      "android/support/design/widget/AppBarLayout$LayoutParams": {
-        "androidx/design/widget/AppBarLayout$LayoutParams": [
-          "SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED",
-          "bottomMargin",
-          "topMargin",
-          "SCROLL_FLAG_EXIT_UNTIL_COLLAPSED",
-          "SCROLL_FLAG_SCROLL",
-          "COLLAPSIBLE_FLAGS",
-          "FLAG_SNAP",
-          "SCROLL_FLAG_SNAP",
-          "FLAG_QUICK_RETURN",
-          "SCROLL_FLAG_ENTER_ALWAYS"
-        ]
-      },
-      "android/support/v7/media/MediaRouterJellybean": {
-        "androidx/media/MediaRouterJellybean": [
-          "TAG",
-          "DEVICE_OUT_BLUETOOTH",
-          "ROUTE_TYPE_LIVE_AUDIO",
-          "ROUTE_TYPE_USER",
-          "ROUTE_TYPE_LIVE_VIDEO",
-          "ALL_ROUTE_TYPES"
-        ]
-      },
-      "android/support/content/LoaderQueryRunner": {
-        "androidx/content/LoaderQueryRunner": [
-          "TAG",
-          "CONTENT_URI_KEY",
-          "DEBUG"
-        ]
-      },
-      "android/support/v17/leanback/app/BackgroundManager$BackgroundContinuityService": {
-        "androidx/leanback/app/BackgroundManager$BackgroundContinuityService": [
-          "DEBUG",
-          "TAG",
-          "sService"
-        ]
-      },
-      "android/support/design/internal/NavigationMenuPresenter": {
-        "androidx/design/internal/NavigationMenuPresenter": [
-          "STATE_HEADER",
-          "STATE_ADAPTER",
-          "STATE_HIERARCHY"
-        ]
-      },
-      "android/support/v17/leanback/widget/RowPresenter$ViewHolder": {
-        "androidx/leanback/widget/RowPresenter$ViewHolder": [
-          "ACTIVATED_NOT_ASSIGNED",
-          "NOT_ACTIVATED",
-          "ACTIVATED",
-          "view"
-        ]
-      },
-      "android/support/v7/widget/AppCompatCheckedTextView": {
-        "androidx/widget/AppCompatCheckedTextView": [
-          "TINT_ATTRS"
-        ]
-      },
-      "android/support/transition/ChangeImageTransform": {
-        "androidx/transition/ChangeImageTransform": [
-          "PROPNAME_BOUNDS",
-          "NULL_MATRIX_EVALUATOR",
-          "ANIMATED_TRANSFORM_PROPERTY",
-          "sTransitionProperties",
-          "PROPNAME_MATRIX"
-        ]
-      },
-      "android/support/design/widget/AppBarLayout$Behavior$SavedState": {
-        "androidx/design/widget/AppBarLayout$Behavior$SavedState": [
-          "firstVisibleChildIndex",
-          "firstVisibleChildPercentageShown",
-          "firstVisibleChildAtMinimumHeight",
-          "CREATOR"
-        ]
-      },
-      "android/support/design/widget/Snackbar": {
-        "androidx/design/widget/Snackbar": [
-          "LENGTH_SHORT",
-          "LENGTH_INDEFINITE",
-          "LENGTH_LONG"
-        ]
-      },
-      "android/support/v7/app/ActionBarDrawerToggleHoneycomb$SetIndicatorInfo": {
-        "androidx/app/ActionBarDrawerToggleHoneycomb$SetIndicatorInfo": [
-          "setHomeActionContentDescription",
-          "setHomeAsUpIndicator",
-          "upIndicatorView"
-        ]
-      },
-      "android/support/v17/leanback/widget/Grid": {
-        "androidx/leanback/widget/Grid": [
-          "START_DEFAULT"
-        ]
-      },
-      "android/support/media/tv/WatchNextProgram": {
-        "androidx/media/tv/WatchNextProgram": [
-          "PROJECTION",
-          "INVALID_INT_VALUE",
-          "INVALID_LONG_VALUE"
-        ]
-      },
-      "android/support/v7/widget/TintContextWrapper": {
-        "androidx/widget/TintContextWrapper": [
-          "CACHE_LOCK",
-          "sCache"
-        ]
-      },
-      "android/support/text/emoji/flatbuffer/Constants": {
-        "androidx/text/emoji/flatbuffer/Constants": [
-          "SIZEOF_INT",
-          "SIZEOF_FLOAT",
-          "SIZEOF_LONG",
-          "FILE_IDENTIFIER_LENGTH",
-          "SIZEOF_SHORT",
-          "SIZEOF_BYTE",
-          "SIZEOF_DOUBLE"
-        ]
-      },
-      "android/support/wear/widget/CurvingLayoutCallback": {
-        "androidx/wear/widget/CurvingLayoutCallback": [
-          "EPSILON"
-        ]
-      },
-      "android/support/v4/app/AppOpsManagerCompat": {
-        "androidx/app/AppOpsManagerCompat": [
-          "MODE_IGNORED",
-          "MODE_DEFAULT",
-          "MODE_ALLOWED"
-        ]
-      },
-      "android/support/v4/widget/CursorAdapter": {
-        "androidx/widget/CursorAdapter": [
-          "FLAG_AUTO_REQUERY",
-          "FLAG_REGISTER_CONTENT_OBSERVER"
-        ]
-      },
-      "android/support/v17/leanback/app/DetailsBackgroundVideoHelper": {
-        "androidx/leanback/app/DetailsBackgroundVideoHelper": [
-          "NO_VIDEO",
-          "CROSSFADE_DELAY",
-          "INITIAL",
-          "BACKGROUND_CROSS_FADE_DURATION",
-          "PLAY_VIDEO"
-        ]
-      },
-      "android/support/transition/ChangeBounds": {
-        "androidx/transition/ChangeBounds": [
-          "PROPNAME_BOUNDS",
-          "POSITION_PROPERTY",
-          "sRectEvaluator",
-          "BOTTOM_RIGHT_PROPERTY",
-          "BOTTOM_RIGHT_ONLY_PROPERTY",
-          "DRAWABLE_ORIGIN_PROPERTY",
-          "sTransitionProperties",
-          "TOP_LEFT_ONLY_PROPERTY",
-          "PROPNAME_PARENT",
-          "TOP_LEFT_PROPERTY",
-          "PROPNAME_CLIP",
-          "PROPNAME_WINDOW_X",
-          "PROPNAME_WINDOW_Y"
-        ]
-      },
-      "android/support/v4/widget/SwipeProgressBar": {
-        "androidx/widget/SwipeProgressBar": [
-          "INTERPOLATOR",
-          "ANIMATION_DURATION_MS",
-          "FINISH_ANIMATION_DURATION_MS",
-          "COLOR2",
-          "COLOR1",
-          "COLOR4",
-          "COLOR3"
-        ]
-      },
-      "android/support/v17/leanback/media/PlaybackTransportControlGlue": {
-        "androidx/leanback/media/PlaybackTransportControlGlue": [
-          "UPDATE_PLAYBACK_STATE_DELAY_MS",
-          "sHandler",
-          "TAG",
-          "DEBUG",
-          "MSG_UPDATE_PLAYBACK_STATE"
-        ]
-      },
-      "android/support/media/tv/BasePreviewProgram": {
-        "androidx/media/tv/BasePreviewProgram": [
-          "IS_LIVE",
-          "IS_TRANSIENT",
-          "PROJECTION",
-          "INVALID_LONG_VALUE",
-          "INVALID_INT_VALUE",
-          "IS_BROWSABLE"
-        ]
-      },
-      "android/support/v4/widget/TextViewCompat$TextViewCompatBaseImpl": {
-        "androidx/widget/TextViewCompat$TextViewCompatBaseImpl": [
-          "sMaxModeFieldFetched",
-          "sMinimumFieldFetched",
-          "sMinModeField",
-          "sMaximumField",
-          "sMinModeFieldFetched",
-          "sMaxModeField",
-          "sMinimumField",
-          "LOG_TAG",
-          "sMaximumFieldFetched",
-          "LINES"
-        ]
-      },
-      "android/support/v7/media/SystemMediaRouteProvider$LegacyImpl$VolumeChangeReceiver": {
-        "androidx/media/SystemMediaRouteProvider$LegacyImpl$VolumeChangeReceiver": [
-          "EXTRA_VOLUME_STREAM_TYPE",
-          "VOLUME_CHANGED_ACTION",
-          "EXTRA_VOLUME_STREAM_VALUE"
-        ]
-      },
-      "android/support/transition/Styleable$ChangeBounds": {
-        "androidx/transition/Styleable$ChangeBounds": [
-          "RESIZE_CLIP"
-        ]
-      },
-      "android/support/v7/widget/ActivityChooserModel": {
-        "androidx/widget/ActivityChooserModel": [
-          "DEFAULT_ACTIVITY_INFLATION",
-          "ATTRIBUTE_TIME",
-          "TAG_HISTORICAL_RECORD",
-          "DEFAULT_HISTORY_FILE_NAME",
-          "HISTORY_FILE_EXTENSION",
-          "TAG_HISTORICAL_RECORDS",
-          "ATTRIBUTE_ACTIVITY",
-          "ATTRIBUTE_WEIGHT",
-          "DEBUG",
-          "INVALID_INDEX",
-          "DEFAULT_HISTORICAL_RECORD_WEIGHT",
-          "sDataModelRegistry",
-          "sRegistryLock",
-          "DEFAULT_HISTORY_MAX_LENGTH",
-          "LOG_TAG"
-        ]
-      },
-      "android/support/v7/widget/ViewUtils": {
-        "androidx/widget/ViewUtils": [
-          "TAG",
-          "sComputeFitSystemWindowsMethod"
-        ]
-      },
-      "android/support/v14/preference/ListPreferenceDialogFragment": {
-        "androidx/preference/ListPreferenceDialogFragment": [
-          "SAVE_STATE_ENTRIES",
-          "SAVE_STATE_INDEX",
-          "SAVE_STATE_ENTRY_VALUES"
-        ]
-      },
-      "android/support/v17/leanback/widget/RoundedRectHelper": {
-        "androidx/leanback/widget/RoundedRectHelper": [
-          "sInstance"
-        ]
-      },
-      "android/support/transition/Styleable$TransitionManager": {
-        "androidx/transition/Styleable$TransitionManager": [
-          "FROM_SCENE",
-          "TRANSITION",
-          "TO_SCENE"
-        ]
-      },
-      "android/support/v17/leanback/R$style": {
-        "androidx/leanback/R$style": [
-          "TextAppearance_Leanback_SearchTextEdit",
-          "Widget_Leanback_ImageCardView"
-        ]
-      },
-      "android/support/v7/widget/ShareActionProvider": {
-        "androidx/widget/ShareActionProvider": [
-          "DEFAULT_SHARE_HISTORY_FILE_NAME",
-          "DEFAULT_INITIAL_ACTIVITY_COUNT"
-        ]
-      },
-      "android/support/v4/app/ListFragment": {
-        "androidx/app/ListFragment": [
-          "INTERNAL_EMPTY_ID",
-          "INTERNAL_PROGRESS_CONTAINER_ID",
-          "INTERNAL_LIST_CONTAINER_ID"
-        ]
-      },
-      "android/support/design/widget/BottomSheetBehavior$SavedState": {
-        "androidx/design/widget/BottomSheetBehavior$SavedState": [
-          "state",
-          "CREATOR"
-        ]
-      },
-      "android/support/v7/appcompat/R$color": {
-        "androidx/appcompat/R$color": [
-          "abc_tint_switch_track",
-          "abc_tint_edittext",
-          "abc_tint_btn_checkable",
-          "abc_tint_default",
-          "abc_tint_spinner",
-          "abc_tint_seek_thumb",
-          "error_color_material",
-          "abc_input_method_navigation_guard"
-        ]
-      },
-      "android/support/v17/leanback/R$raw": {
-        "androidx/leanback/R$raw": [
-          "lb_voice_no_input",
-          "lb_voice_failure",
-          "lb_voice_success",
-          "lb_voice_open"
-        ]
-      },
-      "android/support/v7/util/DiffUtil$PostponedUpdate": {
-        "androidx/util/DiffUtil$PostponedUpdate": [
-          "posInOwnerList",
-          "removal",
-          "currentPos"
-        ]
-      },
-      "android/support/v7/graphics/drawable/DrawerArrowDrawable": {
-        "androidx/graphics/drawable/DrawerArrowDrawable": [
-          "ARROW_DIRECTION_LEFT",
-          "ARROW_HEAD_ANGLE",
-          "ARROW_DIRECTION_RIGHT",
-          "ARROW_DIRECTION_END",
-          "ARROW_DIRECTION_START"
-        ]
-      },
-      "android/support/v4/os/IResultReceiver$Stub": {
-        "androidx/os/IResultReceiver$Stub": [
-          "TRANSACTION_send",
-          "DESCRIPTOR"
-        ]
-      },
-      "android/support/v7/util/DiffUtil$Range": {
-        "androidx/util/DiffUtil$Range": [
-          "newListEnd",
-          "oldListEnd",
-          "newListStart",
-          "oldListStart"
-        ]
-      },
-      "android/support/v7/widget/ActionMenuPresenter$SavedState": {
-        "androidx/widget/ActionMenuPresenter$SavedState": [
-          "CREATOR",
-          "openSubMenuId"
-        ]
-      },
-      "android/support/v17/leanback/widget/GuidedActionAdapter": {
-        "androidx/leanback/widget/GuidedActionAdapter": [
-          "DEBUG",
-          "DEBUG_EDIT",
-          "TAG_EDIT",
-          "TAG"
-        ]
-      },
-      "android/support/v7/widget/AppCompatMultiAutoCompleteTextView": {
-        "androidx/widget/AppCompatMultiAutoCompleteTextView": [
-          "TINT_ATTRS"
-        ]
-      },
-      "android/support/compat/R$dimen": {
-        "androidx/compat/R$dimen": [
-          "notification_small_icon_background_padding",
-          "notification_top_pad_large_text",
-          "notification_large_icon_width",
-          "notification_small_icon_size_as_large",
-          "notification_big_circle_margin",
-          "notification_subtext_size",
-          "notification_top_pad",
-          "notification_right_icon_size"
-        ]
-      },
-      "android/support/customtabs/CustomTabsSessionToken": {
-        "androidx/browser/customtabs/CustomTabsSessionToken": [
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/StaggeredGrid$Location": {
-        "androidx/leanback/widget/StaggeredGrid$Location": [
-          "row",
-          "offset",
-          "size"
-        ]
-      },
-      "android/support/compat/R$color": {
-        "androidx/compat/R$color": [
-          "notification_action_color_filter"
-        ]
-      },
-      "android/support/v7/widget/DefaultItemAnimator$ChangeInfo": {
-        "androidx/widget/DefaultItemAnimator$ChangeInfo": [
-          "toY",
-          "toX",
-          "oldHolder",
-          "newHolder",
-          "fromY",
-          "fromX"
-        ]
-      },
-      "android/support/v17/leanback/widget/PlaybackControlsPresenter$ViewHolder": {
-        "androidx/leanback/widget/PlaybackControlsPresenter$ViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/v4/app/DialogFragment": {
-        "androidx/app/DialogFragment": [
-          "SAVED_SHOWS_DIALOG",
-          "STYLE_NORMAL",
-          "STYLE_NO_INPUT",
-          "SAVED_CANCELABLE",
-          "SAVED_THEME",
-          "SAVED_DIALOG_STATE_TAG",
-          "STYLE_NO_TITLE",
-          "SAVED_BACK_STACK_ID",
-          "STYLE_NO_FRAME",
-          "SAVED_STYLE"
-        ]
-      },
-      "android/support/v17/leanback/widget/BaseCardView$LayoutParams": {
-        "androidx/leanback/widget/BaseCardView$LayoutParams": [
-          "VIEW_TYPE_INFO",
-          "VIEW_TYPE_MAIN",
-          "VIEW_TYPE_EXTRA",
-          "viewType"
-        ]
-      },
-      "android/support/wear/ambient/WearableControllerProvider": {
-        "androidx/wear/ambient/WearableControllerProvider": [
-          "TAG",
-          "sAmbientCallbacksVerifiedPresent"
-        ]
-      },
-      "android/support/design/R$anim": {
-        "androidx/design/R$anim": [
-          "design_snackbar_out",
-          "design_snackbar_in"
-        ]
-      },
-      "android/support/wear/ambient/AmbientMode": {
-        "androidx/wear/ambient/AmbientMode": [
-          "FRAGMENT_TAG",
-          "EXTRA_BURN_IN_PROTECTION",
-          "EXTRA_LOWBIT_AMBIENT"
-        ]
-      },
-      "android/support/text/emoji/flatbuffer/MetadataItem": {
-        "androidx/text/emoji/flatbuffer/MetadataItem": [
-          "bb_pos",
-          "bb"
-        ]
-      },
-      "android/support/v13/app/FragmentStatePagerAdapter": {
-        "androidx/app/legacy/FragmentStatePagerAdapter": [
-          "TAG",
-          "DEBUG"
-        ]
-      },
-      "android/support/v17/leanback/transition/LeanbackTransitionHelper": {
-        "androidx/leanback/transition/LeanbackTransitionHelper": [
-          "sImpl"
-        ]
-      },
-      "android/support/v7/view/menu/MenuItemWrapperICS": {
-        "androidx/view/menu/MenuItemWrapperICS": [
-          "LOG_TAG"
-        ]
-      },
-      "android/support/v4/content/IntentCompat": {
-        "androidx/content/IntentCompat": [
-          "EXTRA_HTML_TEXT",
-          "CATEGORY_LEANBACK_LAUNCHER",
-          "EXTRA_START_PLAYBACK"
-        ]
-      },
-      "android/support/graphics/drawable/AnimatedVectorDrawableCompat": {
-        "androidx/graphics/drawable/AnimatedVectorDrawableCompat": [
-          "LOGTAG",
-          "TARGET",
-          "ANIMATED_VECTOR",
-          "DBG_ANIMATION_VECTOR_DRAWABLE"
-        ]
-      },
-      "android/support/v7/appcompat/R$style": {
-        "androidx/appcompat/R$style": [
-          "Base_Widget_AppCompat_DrawerArrowToggle",
-          "Theme_AppCompat_Light",
-          "TextAppearance_AppCompat_Caption",
-          "Theme_AppCompat_CompactMenu",
-          "TextAppearance_AppCompat_Widget_ActionBar_Title",
-          "Animation_AppCompat_Tooltip"
-        ]
-      },
-      "android/support/media/instantvideo/widget/InstantVideoView": {
-        "androidx/media/instantvideo/widget/InstantVideoView": [
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/transition/Scale": {
-        "androidx/leanback/transition/Scale": [
-          "PROPNAME_SCALE"
-        ]
-      },
-      "android/support/v4/content/WakefulBroadcastReceiver": {
-        "androidx/content/WakefulBroadcastReceiver": [
-          "EXTRA_WAKE_LOCK_ID",
-          "sActiveWakeLocks"
-        ]
-      },
-      "android/support/v17/leanback/widget/VerticalGridPresenter": {
-        "androidx/leanback/widget/VerticalGridPresenter": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/PersistentFocusWrapper": {
-        "androidx/leanback/widget/PersistentFocusWrapper": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/v4/provider/SelfDestructiveThread": {
-        "androidx/provider/SelfDestructiveThread": [
-          "MSG_DESTRUCTION",
-          "MSG_INVOKE_RUNNABLE"
-        ]
-      },
-      "android/support/customtabs/TrustedWebUtils": {
-        "androidx/browser/customtabs/TrustedWebUtils": [
-          "EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY"
-        ]
-      },
-      "android/support/v17/leanback/app/RowsSupportFragment": {
-        "androidx/leanback/app/RowsSupportFragment": [
-          "TAG",
-          "ALIGN_TOP_NOT_SET",
-          "DEBUG"
-        ]
-      },
-      "android/support/v17/leanback/widget/ScaleFrameLayout": {
-        "androidx/leanback/widget/ScaleFrameLayout": [
-          "DEFAULT_CHILD_GRAVITY"
-        ]
-      },
-      "android/support/v4/media/MediaBrowserCompat$MediaItem": {
-        "androidx/media/MediaBrowserCompat$MediaItem": [
-          "CREATOR",
-          "FLAG_PLAYABLE",
-          "FLAG_BROWSABLE"
-        ]
-      },
-      "android/support/v4/provider/FontsContractCompat$FontRequestCallback": {
-        "androidx/provider/FontsContractCompat$FontRequestCallback": [
-          "FAIL_REASON_WRONG_CERTIFICATES",
-          "FAIL_REASON_FONT_UNAVAILABLE",
-          "FAIL_REASON_MALFORMED_QUERY",
-          "FAIL_REASON_SECURITY_VIOLATION",
-          "FAIL_REASON_FONT_LOAD_ERROR",
-          "RESULT_OK",
-          "FAIL_REASON_FONT_NOT_FOUND",
-          "FAIL_REASON_PROVIDER_NOT_FOUND"
-        ]
-      },
-      "android/support/v4/widget/NestedScrollView$SavedState": {
-        "androidx/widget/NestedScrollView$SavedState": [
-          "CREATOR",
-          "scrollPosition"
-        ]
-      },
-      "android/support/text/emoji/R$layout": {
-        "androidx/text/emoji/R$layout": [
-          "input_method_extract_view"
-        ]
-      },
-      "android/support/v4/app/FragmentManagerImpl$FragmentTag": {
-        "androidx/app/FragmentManagerImpl$FragmentTag": [
-          "Fragment",
-          "Fragment_tag",
-          "Fragment_name",
-          "Fragment_id"
-        ]
-      },
-      "android/support/v7/widget/GridLayout$Assoc": {
-        "androidx/widget/GridLayout$Assoc": [
-          "keyType",
-          "valueType"
-        ]
-      },
-      "android/support/v4/app/LoaderManagerImpl": {
-        "androidx/app/LoaderManagerImpl": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/v7/appcompat/R$string": {
-        "androidx/appcompat/R$string": [
-          "abc_action_bar_up_description",
-          "abc_searchview_description_search",
-          "abc_activity_chooser_view_see_all",
-          "abc_shareactionprovider_share_with",
-          "abc_shareactionprovider_share_with_application",
-          "abc_activitychooserview_choose_application"
-        ]
-      },
-      "android/support/v7/widget/AppCompatAutoCompleteTextView": {
-        "androidx/widget/AppCompatAutoCompleteTextView": [
-          "TINT_ATTRS"
-        ]
-      },
-      "android/support/v7/widget/ChildHelper": {
-        "androidx/widget/ChildHelper": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/wear/ambient/SharedLibraryVersion$VersionHolder": {
-        "androidx/wear/ambient/SharedLibraryVersion$VersionHolder": [
-          "VERSION"
-        ]
-      },
-      "android/support/media/tv/BaseProgram": {
-        "androidx/media/tv/BaseProgram": [
-          "INVALID_LONG_VALUE",
-          "PROJECTION",
-          "IS_SEARCHABLE",
-          "INVALID_INT_VALUE"
-        ]
-      },
-      "android/support/transition/TransitionUtils": {
-        "androidx/transition/TransitionUtils": [
-          "MAX_IMAGE_SIZE"
-        ]
-      },
-      "android/support/v17/leanback/widget/ItemAlignment": {
-        "androidx/leanback/widget/ItemAlignment": [
-          "horizontal",
-          "vertical"
-        ]
-      },
-      "android/support/design/widget/NavigationView$SavedState": {
-        "androidx/design/widget/NavigationView$SavedState": [
-          "CREATOR",
-          "menuState"
-        ]
-      },
-      "android/support/v17/leanback/widget/WindowAlignment": {
-        "androidx/leanback/widget/WindowAlignment": [
-          "horizontal",
-          "vertical"
-        ]
-      },
-      "android/support/design/internal/BottomNavigationMenuView": {
-        "androidx/design/internal/BottomNavigationMenuView": [
-          "ACTIVE_ANIMATION_DURATION_MS"
-        ]
-      },
-      "android/support/transition/Slide": {
-        "androidx/transition/Slide": [
-          "sDecelerate",
-          "PROPNAME_SCREEN_POSITION",
-          "sCalculateTop",
-          "sCalculateBottom",
-          "sCalculateRight",
-          "sAccelerate",
-          "sCalculateStart",
-          "sCalculateEnd",
-          "sCalculateLeft"
-        ]
-      },
-      "android/support/text/emoji/MetadataRepo": {
-        "androidx/text/emoji/MetadataRepo": [
-          "DEFAULT_ROOT_SIZE"
-        ]
-      },
-      "android/support/v7/app/AppCompatDelegateImplBase": {
-        "androidx/app/AppCompatDelegateImplBase": [
-          "EXCEPTION_HANDLER_MESSAGE_SUFFIX",
-          "sInstalledExceptionHandler",
-          "sWindowBackgroundStyleable",
-          "DEBUG",
-          "SHOULD_INSTALL_EXCEPTION_HANDLER"
-        ]
-      },
-      "android/support/v7/widget/StaggeredGridLayoutManager$LazySpanLookup$FullSpanItem": {
-        "androidx/widget/StaggeredGridLayoutManager$LazySpanLookup$FullSpanItem": [
-          "CREATOR"
-        ]
-      },
-      "android/support/v17/leanback/R$anim": {
-        "androidx/leanback/R$anim": [
-          "lb_decelerator_4"
-        ]
-      },
-      "android/support/v17/leanback/widget/PagingIndicator": {
-        "androidx/leanback/widget/PagingIndicator": [
-          "DURATION_DIAMETER",
-          "DURATION_TRANSLATION_X",
-          "DECELERATE_INTERPOLATOR",
-          "DOT_DIAMETER",
-          "DURATION_ALPHA",
-          "DOT_TRANSLATION_X",
-          "DOT_ALPHA"
-        ]
-      },
-      "android/support/v7/widget/ScrollingTabContainerView": {
-        "androidx/widget/ScrollingTabContainerView": [
-          "sAlphaInterpolator",
-          "TAG",
-          "FADE_DURATION"
-        ]
-      },
-      "android/support/v4/text/TextDirectionHeuristicsCompat$FirstStrong": {
-        "androidx/text/TextDirectionHeuristicsCompat$FirstStrong": [
-          "INSTANCE"
-        ]
-      },
-      "android/support/design/internal/NavigationMenuPresenter$NavigationMenuTextItem": {
-        "androidx/design/internal/NavigationMenuPresenter$NavigationMenuTextItem": [
-          "needsEmptyIcon"
-        ]
-      },
-      "android/support/v17/leanback/widget/Presenter$ViewHolder": {
-        "androidx/leanback/widget/Presenter$ViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/customtabs/IPostMessageService$Stub": {
-        "androidx/browser/customtabs/IPostMessageService$Stub": [
-          "TRANSACTION_onPostMessage",
-          "DESCRIPTOR",
-          "TRANSACTION_onMessageChannelReady"
-        ]
-      },
-      "android/support/v4/view/ViewPropertyAnimatorCompat": {
-        "androidx/view/ViewPropertyAnimatorCompat": [
-          "LISTENER_TAG_ID",
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/AbstractMediaItemPresenter": {
-        "androidx/leanback/widget/AbstractMediaItemPresenter": [
-          "PLAY_STATE_PLAYING",
-          "PLAY_STATE_PAUSED",
-          "sTempRect",
-          "PLAY_STATE_INITIAL"
-        ]
-      },
-      "android/support/v4/media/session/MediaControllerCompat$TransportControls": {
-        "androidx/media/session/MediaControllerCompat$TransportControls": [
-          "EXTRA_LEGACY_STREAM_TYPE"
-        ]
-      },
-      "android/support/v4/view/WindowCompat": {
-        "androidx/view/WindowCompat": [
-          "FEATURE_ACTION_MODE_OVERLAY",
-          "FEATURE_ACTION_BAR",
-          "FEATURE_ACTION_BAR_OVERLAY"
-        ]
-      },
-      "android/support/v4/content/PermissionChecker": {
-        "androidx/content/PermissionChecker": [
-          "PERMISSION_GRANTED",
-          "PERMISSION_DENIED",
-          "PERMISSION_DENIED_APP_OP"
-        ]
-      },
-      "android/support/v4/text/TextUtilsCompat": {
-        "androidx/text/TextUtilsCompat": [
-          "ROOT",
-          "ARAB_SCRIPT_SUBTAG",
-          "HEBR_SCRIPT_SUBTAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter": {
-        "androidx/leanback/widget/DetailsOverviewRowPresenter": [
-          "MORE_ACTIONS_FADE_MS",
-          "DEBUG",
-          "TAG",
-          "DEFAULT_TIMEOUT"
-        ]
-      },
-      "android/support/design/widget/TextInputLayout": {
-        "androidx/design/widget/TextInputLayout": [
-          "LOG_TAG",
-          "INVALID_MAX_LENGTH",
-          "ANIMATION_DURATION"
-        ]
-      },
-      "android/support/v7/media/RemotePlaybackClient": {
-        "androidx/media/RemotePlaybackClient": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/ListRowPresenter$ViewHolder": {
-        "androidx/leanback/widget/ListRowPresenter$ViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/v7/content/res/AppCompatColorStateListInflater": {
-        "androidx/content/res/AppCompatColorStateListInflater": [
-          "DEFAULT_COLOR"
-        ]
-      },
-      "android/support/v7/view/menu/ExpandedMenuView": {
-        "androidx/view/menu/ExpandedMenuView": [
-          "TINT_ATTRS"
-        ]
-      },
-      "android/support/v7/widget/PositionMap$ContainerHelpers": {
-        "androidx/widget/PositionMap$ContainerHelpers": [
-          "EMPTY_BOOLEANS",
-          "EMPTY_INTS",
-          "EMPTY_OBJECTS",
-          "EMPTY_LONGS"
-        ]
-      },
-      "android/support/design/widget/TextInputLayout$SavedState": {
-        "androidx/design/widget/TextInputLayout$SavedState": [
-          "error",
-          "isPasswordToggledVisible",
-          "CREATOR"
-        ]
-      },
-      "android/support/v7/widget/GridLayout$MutableInt": {
-        "androidx/widget/GridLayout$MutableInt": [
-          "value"
-        ]
-      },
-      "android/support/wear/R$dimen": {
-        "androidx/wear/R$dimen": [
-          "ws_action_drawer_item_icon_right_margin",
-          "ws_action_drawer_item_bottom_padding",
-          "ws_wearable_drawer_view_elevation",
-          "circular_progress_layout_stroke_width",
-          "ws_wrv_curve_default_x_offset",
-          "ws_action_drawer_item_top_padding"
-        ]
-      },
-      "android/support/wear/widget/drawer/WearableNavigationDrawerView": {
-        "androidx/wear/widget/drawer/WearableNavigationDrawerView": [
-          "MULTI_PAGE",
-          "SINGLE_PAGE",
-          "AUTO_CLOSE_DRAWER_DELAY_MS",
-          "TAG",
-          "DEFAULT_STYLE"
-        ]
-      },
-      "android/support/v7/graphics/Palette": {
-        "androidx/graphics/palette/Palette": [
-          "DEFAULT_CALCULATE_NUMBER_COLORS",
-          "MIN_CONTRAST_BODY_TEXT",
-          "LOG_TIMINGS",
-          "DEFAULT_FILTER",
-          "LOG_TAG",
-          "MIN_CONTRAST_TITLE_TEXT",
-          "DEFAULT_RESIZE_BITMAP_AREA"
-        ]
-      },
-      "android/support/v7/widget/RecyclerView$State": {
-        "androidx/widget/RecyclerView$State": [
-          "STEP_ANIMATIONS",
-          "STEP_LAYOUT",
-          "STEP_START"
-        ]
-      },
-      "android/support/design/widget/AppBarLayout": {
-        "androidx/design/widget/AppBarLayout": [
-          "PENDING_ACTION_FORCE",
-          "PENDING_ACTION_NONE",
-          "PENDING_ACTION_COLLAPSED",
-          "INVALID_SCROLL_RANGE",
-          "PENDING_ACTION_EXPANDED",
-          "PENDING_ACTION_ANIMATE_ENABLED"
-        ]
-      },
-      "android/support/design/widget/ViewUtilsLollipop": {
-        "androidx/design/widget/ViewUtilsLollipop": [
-          "STATE_LIST_ANIM_ATTRS"
-        ]
-      },
-      "android/support/v4/provider/FontsContractCompat": {
-        "androidx/provider/FontsContractCompat": [
-          "sByteArrayComparator",
-          "sBackgroundThread",
-          "BACKGROUND_THREAD_KEEP_ALIVE_DURATION_MS",
-          "sTypefaceCache",
-          "RESULT_CODE_WRONG_CERTIFICATES",
-          "RESULT_CODE_PROVIDER_NOT_FOUND",
-          "PARCEL_FONT_RESULTS",
-          "sPendingReplies",
-          "TAG",
-          "sLock"
-        ]
-      },
-      "android/support/media/tv/TvContractUtils": {
-        "androidx/media/tv/TvContractUtils": [
-          "DEBUG",
-          "EMPTY",
-          "TAG",
-          "DELIMITER"
-        ]
-      },
-      "android/support/v17/leanback/widget/RoundedRectHelperApi21": {
-        "androidx/leanback/widget/RoundedRectHelperApi21": [
-          "sRoundedRectProvider",
-          "MAX_CACHED_PROVIDER"
-        ]
-      },
-      "android/support/v17/leanback/app/BrowseFragment$MainFragmentAdapterRegistry": {
-        "androidx/leanback/app/BrowseFragment$MainFragmentAdapterRegistry": [
-          "sDefaultFragmentFactory"
-        ]
-      },
-      "android/support/v7/util/BatchingListUpdateCallback": {
-        "androidx/util/BatchingListUpdateCallback": [
-          "TYPE_CHANGE",
-          "TYPE_REMOVE",
-          "TYPE_NONE",
-          "TYPE_ADD"
-        ]
-      },
-      "android/support/v4/widget/DrawerLayout$SavedState": {
-        "androidx/widget/DrawerLayout$SavedState": [
-          "lockModeLeft",
-          "lockModeEnd",
-          "CREATOR",
-          "lockModeStart",
-          "openDrawerGravity",
-          "lockModeRight"
-        ]
-      },
-      "android/support/design/internal/NavigationMenuItemView": {
-        "androidx/design/internal/NavigationMenuItemView": [
-          "CHECKED_STATE_SET",
-          "EMPTY_STATE_SET"
-        ]
-      },
-      "android/support/text/emoji/EmojiProcessor$ProcessorSm": {
-        "androidx/text/emoji/EmojiProcessor$ProcessorSm": [
-          "STATE_DEFAULT",
-          "STATE_WALKING"
-        ]
-      },
-      "android/support/v7/widget/ActivityChooserModel$DefaultSorter": {
-        "androidx/widget/ActivityChooserModel$DefaultSorter": [
-          "WEIGHT_DECAY_COEFFICIENT"
-        ]
-      },
-      "android/support/v4/content/pm/ShortcutManagerCompat": {
-        "androidx/content/pm/ShortcutManagerCompat": [
-          "ACTION_INSTALL_SHORTCUT",
-          "INSTALL_SHORTCUT_PERMISSION"
-        ]
-      },
-      "android/support/media/tv/TvContractCompat$Channels$Logo": {
-        "androidx/media/tv/TvContractCompat$Channels$Logo": [
-          "CONTENT_DIRECTORY"
-        ]
-      },
-      "android/support/v4/view/ViewCompat$ViewCompatBaseImpl": {
-        "androidx/view/legacy/ViewCompat$ViewCompatBaseImpl": [
-          "sChildrenDrawingOrderMethod",
-          "sMinHeightField",
-          "sMinHeightFieldFetched",
-          "sTransitionNameMap",
-          "sAccessibilityDelegateCheckFailed",
-          "sMinWidthField",
-          "sMinWidthFieldFetched",
-          "sAccessibilityDelegateField"
-        ]
-      },
-      "android/support/v4/content/res/TypedArrayUtils": {
-        "androidx/content/res/TypedArrayUtils": [
-          "NAMESPACE"
-        ]
-      },
-      "android/support/annotation/RestrictTo$Scope": {
-        "androidx/annotation/RestrictTo$Scope": [
-          "GROUP_ID",
-          "TESTS",
-          "LIBRARY",
-          "SUBCLASSES",
-          "LIBRARY_GROUP"
-        ]
-      },
-      "android/support/media/tv/ChannelLogoUtils": {
-        "androidx/media/tv/ChannelLogoUtils": [
-          "TAG",
-          "CONNECTION_TIMEOUT_MS_FOR_URLCONNECTION",
-          "READ_TIMEOUT_MS_FOR_URLCONNECTION"
-        ]
-      },
-      "android/support/text/emoji/EmojiProcessor": {
-        "androidx/text/emoji/EmojiProcessor": [
-          "ACTION_FLUSH",
-          "ACTION_ADVANCE_BOTH",
-          "ACTION_ADVANCE_END"
-        ]
-      },
-      "android/support/design/R$layout": {
-        "androidx/design/R$layout": [
-          "design_navigation_item",
-          "design_navigation_menu_item",
-          "design_navigation_item_separator",
-          "design_navigation_item_subheader",
-          "design_navigation_item_header",
-          "design_bottom_navigation_item",
-          "design_text_input_password_icon",
-          "design_layout_snackbar_include",
-          "design_layout_tab_text",
-          "design_layout_snackbar",
-          "design_bottom_sheet_dialog",
-          "design_layout_tab_icon",
-          "design_navigation_menu"
-        ]
-      },
-      "android/support/v4/app/NotificationCompatExtras": {
-        "androidx/app/NotificationCompatExtras": [
-          "EXTRA_ACTION_EXTRAS",
-          "EXTRA_GROUP_KEY",
-          "EXTRA_SORT_KEY",
-          "EXTRA_REMOTE_INPUTS",
-          "EXTRA_LOCAL_ONLY",
-          "EXTRA_GROUP_SUMMARY"
-        ]
-      },
-      "android/support/v17/leanback/widget/GridLayoutManager$SavedState": {
-        "androidx/leanback/widget/GridLayoutManager$SavedState": [
-          "CREATOR",
-          "index",
-          "childStates"
-        ]
-      },
-      "android/support/v7/widget/RecyclerView$ItemAnimator": {
-        "androidx/widget/RecyclerView$ItemAnimator": [
-          "FLAG_CHANGED",
-          "FLAG_REMOVED",
-          "FLAG_APPEARED_IN_PRE_LAYOUT",
-          "FLAG_INVALIDATED",
-          "FLAG_MOVED"
-        ]
-      },
-      "android/support/v17/leanback/widget/Grid$Location": {
-        "androidx/leanback/widget/Grid$Location": [
-          "row"
-        ]
-      },
-      "android/support/v17/leanback/media/MediaControllerGlue": {
-        "androidx/leanback/media/MediaControllerGlue": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/v17/preference/LeanbackListPreferenceDialogFragment": {
-        "androidx/leanback/preference/LeanbackListPreferenceDialogFragment": [
-          "SAVE_STATE_ENTRY_VALUES",
-          "SAVE_STATE_TITLE",
-          "SAVE_STATE_INITIAL_SELECTIONS",
-          "SAVE_STATE_IS_MULTI",
-          "SAVE_STATE_ENTRIES",
-          "SAVE_STATE_INITIAL_SELECTION",
-          "SAVE_STATE_MESSAGE"
-        ]
-      },
-      "android/support/v4/app/ServiceCompat": {
-        "androidx/app/ServiceCompat": [
-          "STOP_FOREGROUND_DETACH",
-          "START_STICKY",
-          "STOP_FOREGROUND_REMOVE"
-        ]
-      },
-      "android/support/wear/widget/SwipeDismissLayout": {
-        "androidx/wear/widget/SwipeDismissLayout": [
-          "TAG",
-          "DEFAULT_DISMISS_DRAG_WIDTH_RATIO",
-          "EDGE_SWIPE_THRESHOLD"
-        ]
-      },
-      "android/support/v4/os/LocaleListCompat": {
-        "androidx/os/LocaleListCompat": [
-          "sEmptyLocaleList",
-          "IMPL"
-        ]
-      },
-      "android/support/v7/preference/Preference$BaseSavedState": {
-        "androidx/preference/Preference$BaseSavedState": [
-          "CREATOR",
-          "EMPTY_STATE"
-        ]
-      },
-      "android/support/v7/media/MediaRouteProviderService": {
-        "androidx/media/MediaRouteProviderService": [
-          "TAG",
-          "SERVICE_INTERFACE",
-          "DEBUG",
-          "PRIVATE_MSG_CLIENT_DIED"
-        ]
-      },
-      "android/support/v7/view/menu/CascadingMenuPopup$CascadingMenuInfo": {
-        "androidx/view/menu/CascadingMenuPopup$CascadingMenuInfo": [
-          "position",
-          "menu",
-          "window"
-        ]
-      },
-      "android/support/v7/widget/ToolbarWidgetWrapper": {
-        "androidx/widget/ToolbarWidgetWrapper": [
-          "DEFAULT_FADE_DURATION_MS",
-          "AFFECTS_LOGO_MASK",
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter$ViewHolder": {
-        "androidx/leanback/widget/PlaybackTransportRowPresenter$ViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/v7/widget/DefaultItemAnimator": {
-        "androidx/widget/DefaultItemAnimator": [
-          "DEBUG",
-          "sDefaultInterpolator"
-        ]
-      },
-      "android/support/v4/widget/PopupWindowCompat$PopupWindowCompatApi21Impl": {
-        "androidx/widget/PopupWindowCompat$PopupWindowCompatApi21Impl": [
-          "sOverlapAnchorField",
-          "TAG"
-        ]
-      },
-      "android/support/v17/preference/LeanbackSettingsFragment": {
-        "androidx/leanback/preference/LeanbackSettingsFragment": [
-          "PREFERENCE_FRAGMENT_TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/ParallaxTarget$PropertyValuesHolderTarget": {
-        "androidx/leanback/widget/ParallaxTarget$PropertyValuesHolderTarget": [
-          "PSEUDO_DURATION"
-        ]
-      },
-      "android/support/design/widget/SnackbarManager": {
-        "androidx/design/widget/SnackbarManager": [
-          "MSG_TIMEOUT",
-          "sSnackbarManager",
-          "LONG_DURATION_MS",
-          "SHORT_DURATION_MS"
-        ]
-      },
-      "android/support/v17/leanback/app/BaseRowSupportFragment": {
-        "androidx/leanback/app/BaseRowSupportFragment": [
-          "CURRENT_SELECTED_POSITION"
-        ]
-      },
-      "android/support/v7/app/MediaRouteVolumeSlider": {
-        "androidx/app/MediaRouteVolumeSlider": [
-          "TAG"
-        ]
-      },
-      "android/support/v7/util/AsyncListUtil$ViewCallback": {
-        "androidx/util/AsyncListUtil$ViewCallback": [
-          "HINT_SCROLL_DESC",
-          "HINT_SCROLL_NONE",
-          "HINT_SCROLL_ASC"
-        ]
-      },
-      "android/support/multidex/MultiDexExtractor$ExtractedDex": {
-        "androidx/multidex/MultiDexExtractor$ExtractedDex": [
-          "crc"
-        ]
-      },
-      "android/support/transition/AnimatorUtils": {
-        "androidx/transition/AnimatorUtils": [
-          "IMPL"
-        ]
-      },
-      "android/support/v7/app/AppCompatDelegateImplV14": {
-        "androidx/app/AppCompatDelegateImplV14": [
-          "KEY_LOCAL_NIGHT_MODE"
-        ]
-      },
-      "android/support/transition/Styleable$PatternPathMotion": {
-        "androidx/transition/Styleable$PatternPathMotion": [
-          "PATTERN_PATH_DATA"
-        ]
-      },
-      "android/support/v7/media/SystemMediaRouteProvider": {
-        "androidx/media/SystemMediaRouteProvider": [
-          "TAG",
-          "DEFAULT_ROUTE_ID",
-          "PACKAGE_NAME"
-        ]
-      },
-      "android/support/design/internal/BottomNavigationItemView": {
-        "androidx/design/internal/BottomNavigationItemView": [
-          "CHECKED_STATE_SET",
-          "INVALID_ITEM_POSITION"
-        ]
-      },
-      "android/support/wear/widget/ScrollManager": {
-        "androidx/wear/widget/ScrollManager": [
-          "ONE_SEC_IN_MS",
-          "FLING_EDGE_RATIO",
-          "VELOCITY_MULTIPLIER"
-        ]
-      },
-      "android/support/v7/widget/AppCompatTextHelper": {
-        "androidx/widget/AppCompatTextHelper": [
-          "MONOSPACE",
-          "SANS",
-          "SERIF"
-        ]
-      },
-      "android/support/v17/leanback/app/DetailsSupportFragment$WaitEnterTransitionTimeout": {
-        "androidx/leanback/app/DetailsSupportFragment$WaitEnterTransitionTimeout": [
-          "WAIT_ENTERTRANSITION_START"
-        ]
-      },
-      "android/support/v7/media/MediaRouteProviderDescriptor": {
-        "androidx/media/MediaRouteProviderDescriptor": [
-          "KEY_ROUTES"
-        ]
-      },
-      "android/support/v17/leanback/widget/TitleView": {
-        "androidx/leanback/widget/TitleView": [
-          "flags"
-        ]
-      },
-      "android/support/v4/media/session/MediaSessionCompat$QueueItem": {
-        "androidx/media/session/MediaSessionCompat$QueueItem": [
-          "CREATOR",
-          "UNKNOWN_ID"
-        ]
-      },
-      "android/support/v7/mediarouter/R$styleable": {
-        "androidx/mediarouter/R$styleable": [
-          "MediaRouteButton_android_minHeight",
-          "MediaRouteButton_mediaRouteButtonTint",
-          "MediaRouteButton_android_minWidth",
-          "MediaRouteButton_externalRouteEnabledDrawable",
-          "MediaRouteButton"
-        ]
-      },
-      "android/support/v7/view/menu/ActionMenuItemView": {
-        "androidx/view/menu/ActionMenuItemView": [
-          "TAG",
-          "MAX_ICON_SIZE"
-        ]
-      },
-      "android/support/v4/app/FragmentStatePagerAdapter": {
-        "androidx/app/FragmentStatePagerAdapter": [
-          "TAG",
-          "DEBUG"
-        ]
-      },
-      "android/support/wear/widget/drawer/ScrollViewFlingWatcher": {
-        "androidx/wear/widget/drawer/ScrollViewFlingWatcher": [
-          "MAX_WAIT_TIME_MS"
-        ]
-      },
-      "android/support/transition/MatrixUtils": {
-        "androidx/transition/MatrixUtils": [
-          "IDENTITY_MATRIX"
-        ]
-      },
-      "android/support/v4/app/NotificationCompat$Action": {
-        "androidx/app/NotificationCompat$Action": [
-          "icon",
-          "title",
-          "actionIntent"
-        ]
-      },
-      "android/support/v4/os/ResultReceiver": {
-        "androidx/os/ResultReceiver": [
-          "CREATOR"
-        ]
-      },
-      "android/support/v7/widget/AppCompatTextView": {
-        "androidx/widget/AppCompatTextView": [
-          "PLATFORM_SUPPORTS_AUTOSIZE"
-        ]
-      },
-      "android/support/v7/widget/StaggeredGridLayoutManager": {
-        "androidx/widget/StaggeredGridLayoutManager": [
-          "GAP_HANDLING_LAZY",
-          "GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS",
-          "TAG",
-          "VERTICAL",
-          "INVALID_OFFSET",
-          "MAX_SCROLL_FACTOR",
-          "GAP_HANDLING_NONE",
-          "DEBUG",
-          "HORIZONTAL"
-        ]
-      },
-      "android/support/design/widget/BottomNavigationView$SavedState": {
-        "androidx/design/widget/BottomNavigationView$SavedState": [
-          "CREATOR",
-          "menuPresenterState"
-        ]
-      },
-      "android/support/v7/widget/RoundRectDrawableWithShadow": {
-        "androidx/widget/RoundRectDrawableWithShadow": [
-          "sRoundRectHelper",
-          "COS_45",
-          "SHADOW_MULTIPLIER"
-        ]
-      },
-      "android/support/v7/preference/PreferenceCategory": {
-        "androidx/preference/PreferenceCategory": [
-          "TAG"
-        ]
-      },
-      "android/support/v7/widget/RecyclerView$ItemAnimator$ItemHolderInfo": {
-        "androidx/widget/RecyclerView$ItemAnimator$ItemHolderInfo": [
-          "left",
-          "changeFlags",
-          "top",
-          "right",
-          "bottom"
-        ]
-      },
-      "android/support/v7/preference/ListPreference$SavedState": {
-        "androidx/preference/ListPreference$SavedState": [
-          "CREATOR",
-          "value"
-        ]
-      },
-      "android/support/v7/widget/TooltipPopup": {
-        "androidx/widget/TooltipPopup": [
-          "TAG"
-        ]
-      },
-      "android/support/v4/net/ConnectivityManagerCompat": {
-        "androidx/net/ConnectivityManagerCompat": [
-          "RESTRICT_BACKGROUND_STATUS_ENABLED",
-          "RESTRICT_BACKGROUND_STATUS_WHITELISTED",
-          "RESTRICT_BACKGROUND_STATUS_DISABLED"
-        ]
-      },
-      "android/support/v7/widget/MenuPopupWindow": {
-        "androidx/widget/MenuPopupWindow": [
-          "sSetTouchModalMethod",
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/app/RowsFragment": {
-        "androidx/leanback/app/RowsFragment": [
-          "TAG",
-          "ALIGN_TOP_NOT_SET",
-          "DEBUG"
-        ]
-      },
-      "android/support/v17/leanback/app/ProgressBarManager": {
-        "androidx/leanback/app/ProgressBarManager": [
-          "runnable",
-          "rootView",
-          "DEFAULT_PROGRESS_BAR_DELAY"
-        ]
-      },
-      "android/support/v7/media/RegisteredMediaRouteProvider": {
-        "androidx/media/RegisteredMediaRouteProvider": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/design/widget/CheckableImageButton": {
-        "androidx/design/widget/CheckableImageButton": [
-          "DRAWABLE_STATE_CHECKED"
-        ]
-      },
-      "android/support/transition/ImageViewUtils": {
-        "androidx/transition/ImageViewUtils": [
-          "IMPL"
-        ]
-      },
-      "android/support/v17/leanback/widget/PlaybackControlsRow$HighQualityAction": {
-        "androidx/leanback/widget/PlaybackControlsRow$HighQualityAction": [
-          "INDEX_OFF",
-          "INDEX_ON",
-          "OFF",
-          "ON"
-        ]
-      },
-      "android/support/wear/widget/drawer/PageIndicatorView": {
-        "androidx/wear/widget/drawer/PageIndicatorView": [
-          "TAG"
-        ]
-      },
-      "android/support/transition/TransitionValues": {
-        "androidx/transition/TransitionValues": [
-          "view",
-          "values"
-        ]
-      },
-      "android/support/v17/leanback/app/BaseRowFragment": {
-        "androidx/leanback/app/BaseRowFragment": [
-          "CURRENT_SELECTED_POSITION"
-        ]
-      },
-      "android/support/v7/mediarouter/R$drawable": {
-        "androidx/mediarouter/R$drawable": [
-          "mr_group_collapse",
-          "mr_group_expand"
-        ]
-      },
-      "android/support/transition/ViewUtils": {
-        "androidx/transition/ViewUtils": [
-          "sViewFlagsField",
-          "TRANSITION_ALPHA",
-          "IMPL",
-          "sViewFlagsFieldFetched",
-          "TAG",
-          "CLIP_BOUNDS",
-          "VISIBILITY_MASK"
-        ]
-      },
-      "android/support/v7/preference/AndroidResources": {
-        "androidx/preference/AndroidResources": [
-          "ANDROID_R_ICON_FRAME",
-          "ANDROID_R_SWITCH_WIDGET",
-          "ANDROID_R_PREFERENCE_FRAGMENT_STYLE",
-          "ANDROID_R_LIST_CONTAINER",
-          "ANDROID_R_EDITTEXT_PREFERENCE_STYLE"
-        ]
-      },
-      "android/support/v4/net/DatagramSocketWrapper$DatagramSocketImplWrapper": {
-        "androidx/net/DatagramSocketWrapper$DatagramSocketImplWrapper": [
-          "localport",
-          "fd"
-        ]
-      },
-      "android/support/v17/leanback/widget/PlaybackControlsRowPresenter$BoundData": {
-        "androidx/leanback/widget/PlaybackControlsRowPresenter$BoundData": [
-          "secondaryActionsAdapter",
-          "presenter",
-          "adapter"
-        ]
-      },
-      "android/support/v17/leanback/widget/PlaybackControlsRowPresenter$ViewHolder": {
-        "androidx/leanback/widget/PlaybackControlsRowPresenter$ViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/v17/leanback/widget/Parallax$FloatProperty": {
-        "androidx/leanback/widget/Parallax$FloatProperty": [
-          "UNKNOWN_AFTER",
-          "UNKNOWN_BEFORE"
-        ]
-      },
-      "android/support/v17/leanback/widget/AbstractDetailsDescriptionPresenter$ViewHolder": {
-        "androidx/leanback/widget/AbstractDetailsDescriptionPresenter$ViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/design/R$string": {
-        "androidx/design/R$string": [
-          "character_counter_pattern"
-        ]
-      },
-      "android/support/wear/ambient/AmbientDelegate": {
-        "androidx/wear/ambient/AmbientDelegate": [
-          "TAG",
-          "sInitAutoResumeEnabledMethod",
-          "sHasAutoResumeEnabledMethod"
-        ]
-      },
-      "android/support/v17/leanback/app/PlaybackFragment": {
-        "androidx/leanback/app/PlaybackFragment": [
-          "ANIMATION_MULTIPLIER",
-          "BG_DARK",
-          "BG_NONE",
-          "DEBUG",
-          "BUNDLE_CONTROL_VISIBLE_ON_CREATEVIEW",
-          "BG_LIGHT",
-          "TAG",
-          "ANIMATING",
-          "IDLE",
-          "START_FADE_OUT"
-        ]
-      },
-      "android/support/v7/widget/ActionBarOverlayLayout$LayoutParams": {
-        "androidx/widget/ActionBarOverlayLayout$LayoutParams": [
-          "topMargin",
-          "rightMargin",
-          "bottomMargin",
-          "leftMargin"
-        ]
-      },
-      "android/support/v4/os/EnvironmentCompat": {
-        "androidx/os/EnvironmentCompat": [
-          "MEDIA_UNKNOWN",
-          "TAG"
-        ]
-      },
-      "android/support/compat/R$string": {
-        "androidx/compat/R$string": [
-          "status_bar_notification_info_overflow"
-        ]
-      },
-      "android/support/v7/widget/PositionMap": {
-        "androidx/widget/PositionMap": [
-          "DELETED"
-        ]
-      },
-      "android/support/media/tv/Program": {
-        "androidx/media/tv/Program": [
-          "INVALID_LONG_VALUE",
-          "PROJECTION",
-          "IS_RECORDING_PROHIBITED"
-        ]
-      },
-      "android/support/v7/widget/ActionBarContextView": {
-        "androidx/widget/ActionBarContextView": [
-          "TAG"
-        ]
-      },
-      "android/support/v4/media/VolumeProviderCompat": {
-        "androidx/media/VolumeProviderCompat": [
-          "VOLUME_CONTROL_RELATIVE",
-          "VOLUME_CONTROL_FIXED",
-          "VOLUME_CONTROL_ABSOLUTE"
-        ]
-      },
-      "android/support/v7/view/menu/CascadingMenuPopup": {
-        "androidx/view/menu/CascadingMenuPopup": [
-          "SUBMENU_TIMEOUT_MS",
-          "HORIZ_POSITION_LEFT",
-          "HORIZ_POSITION_RIGHT"
-        ]
-      },
-      "android/support/v4/app/NotificationManagerCompat$ServiceConnectedEvent": {
-        "androidx/app/NotificationManagerCompat$ServiceConnectedEvent": [
-          "componentName",
-          "iBinder"
-        ]
-      },
-      "android/support/v7/app/AlertDialog": {
-        "androidx/app/AlertDialog": [
-          "LAYOUT_HINT_NONE",
-          "LAYOUT_HINT_SIDE"
-        ]
-      },
-      "android/support/v17/leanback/widget/picker/PickerUtility$DateConstant": {
-        "androidx/leanback/widget/picker/PickerUtility$DateConstant": [
-          "months",
-          "days",
-          "locale"
-        ]
-      },
-      "android/support/v7/app/MediaRouteChooserDialogFragment": {
-        "androidx/app/MediaRouteChooserDialogFragment": [
-          "ARGUMENT_SELECTOR"
-        ]
-      },
-      "android/support/design/widget/CoordinatorLayout$SavedState": {
-        "androidx/design/widget/CoordinatorLayout$SavedState": [
-          "behaviorStates",
-          "CREATOR"
-        ]
-      },
-      "android/support/v7/media/MediaRouteDiscoveryRequest": {
-        "androidx/media/MediaRouteDiscoveryRequest": [
-          "KEY_ACTIVE_SCAN",
-          "KEY_SELECTOR"
-        ]
-      },
-      "android/support/v17/leanback/widget/StaticShadowHelper": {
-        "androidx/leanback/widget/StaticShadowHelper": [
-          "sInstance"
-        ]
-      },
-      "android/support/design/widget/ShadowDrawableWrapper": {
-        "androidx/design/widget/ShadowDrawableWrapper": [
-          "SHADOW_MULTIPLIER",
-          "SHADOW_TOP_SCALE",
-          "COS_45",
-          "SHADOW_HORIZ_SCALE",
-          "SHADOW_BOTTOM_SCALE"
-        ]
-      },
-      "android/support/v13/app/FragmentCompat": {
-        "androidx/app/FragmentCompat": [
-          "sDelegate",
-          "IMPL"
-        ]
-      },
-      "android/support/v7/widget/GridLayout$Arc": {
-        "androidx/widget/GridLayout$Arc": [
-          "span",
-          "valid",
-          "value"
-        ]
-      },
-      "android/support/v4/content/AsyncTaskLoader": {
-        "androidx/content/AsyncTaskLoader": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/text/emoji/flatbuffer/MetadataList": {
-        "androidx/text/emoji/flatbuffer/MetadataList": [
-          "bb_pos",
-          "bb"
-        ]
-      },
-      "android/support/text/emoji/widget/EditTextAttributeHelper": {
-        "androidx/text/emoji/widget/EditTextAttributeHelper": [
-          "MAX_EMOJI_COUNT"
-        ]
-      },
-      "android/support/v7/widget/ChildHelper$Bucket": {
-        "androidx/widget/ChildHelper$Bucket": [
-          "LAST_BIT",
-          "BITS_PER_WORD"
-        ]
-      },
-      "android/support/v4/content/LocalBroadcastManager": {
-        "androidx/content/LocalBroadcastManager": [
-          "DEBUG",
-          "MSG_EXEC_PENDING_BROADCASTS",
-          "TAG"
-        ]
-      },
-      "android/support/v7/widget/TooltipCompat": {
-        "androidx/widget/TooltipCompat": [
-          "IMPL"
-        ]
-      },
-      "android/support/media/tv/PreviewProgram": {
-        "androidx/media/tv/PreviewProgram": [
-          "INVALID_INT_VALUE",
-          "PROJECTION",
-          "INVALID_LONG_VALUE"
-        ]
-      },
-      "android/support/v7/preference/ListPreferenceDialogFragmentCompat": {
-        "androidx/preference/ListPreferenceDialogFragmentCompat": [
-          "SAVE_STATE_INDEX",
-          "SAVE_STATE_ENTRIES",
-          "SAVE_STATE_ENTRY_VALUES"
-        ]
-      },
-      "android/support/v7/widget/ViewInfoStore": {
-        "androidx/widget/ViewInfoStore": [
-          "DEBUG"
-        ]
-      },
-      "android/support/v7/widget/ActivityChooserModel$ActivityResolveInfo": {
-        "androidx/widget/ActivityChooserModel$ActivityResolveInfo": [
-          "weight",
-          "resolveInfo"
-        ]
-      },
-      "android/support/v7/preference/SeekBarPreference": {
-        "androidx/preference/SeekBarPreference": [
-          "TAG"
-        ]
-      },
-      "android/support/v7/widget/ActivityChooserView$InnerLayout": {
-        "androidx/widget/ActivityChooserView$InnerLayout": [
-          "TINT_ATTRS"
-        ]
-      },
-      "android/support/v7/app/AppCompatDelegateImplV9": {
-        "androidx/app/AppCompatDelegateImplV9": [
-          "IS_PRE_LOLLIPOP"
-        ]
-      },
-      "android/support/v7/media/SystemMediaRouteProvider$LegacyImpl": {
-        "androidx/media/SystemMediaRouteProvider$LegacyImpl": [
-          "PLAYBACK_STREAM",
-          "CONTROL_FILTERS"
-        ]
-      },
-      "android/support/transition/ViewUtilsApi22": {
-        "androidx/transition/ViewUtilsApi22": [
-          "sSetLeftTopRightBottomMethod",
-          "TAG",
-          "sSetLeftTopRightBottomMethodFetched"
-        ]
-      },
-      "android/support/v17/leanback/widget/ObjectAdapter": {
-        "androidx/leanback/widget/ObjectAdapter": [
-          "NO_ID"
-        ]
-      },
-      "android/support/content/Query": {
-        "androidx/content/Query": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/media/MediaControllerAdapter": {
-        "androidx/leanback/media/MediaControllerAdapter": [
-          "TAG",
-          "DEBUG"
-        ]
-      },
-      "android/support/v7/recyclerview/R$id": {
-        "androidx/recyclerview/R$id": [
-          "item_touch_helper_previous_elevation"
-        ]
-      },
-      "android/support/v4/media/session/MediaSessionCompat$Callback$CallbackHandler": {
-        "androidx/media/session/MediaSessionCompat$Callback$CallbackHandler": [
-          "MSG_MEDIA_PLAY_PAUSE_KEY_DOUBLE_TAP_TIMEOUT"
-        ]
-      },
-      "android/support/design/widget/FloatingActionButton": {
-        "androidx/design/widget/FloatingActionButton": [
-          "LOG_TAG",
-          "AUTO_MINI_LARGEST_SCREEN_WIDTH",
-          "SIZE_AUTO",
-          "SIZE_NORMAL",
-          "SIZE_MINI"
-        ]
-      },
-      "android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper": {
-        "androidx/leanback/widget/DetailsOverviewSharedElementHelper": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/v7/app/AlertDialog$Builder": {
-        "androidx/app/AlertDialog$Builder": [
-          "P"
-        ]
-      },
-      "android/support/wear/internal/widget/drawer/SinglePagePresenter": {
-        "androidx/wear/internal/widget/drawer/SinglePagePresenter": [
-          "DRAWER_CLOSE_DELAY_MS"
-        ]
-      },
-      "android/support/v17/leanback/app/BrowseSupportFragment$SetSelectionRunnable": {
-        "androidx/leanback/app/BrowseSupportFragment$SetSelectionRunnable": [
-          "TYPE_INTERNAL_SYNC",
-          "TYPE_USER_REQUEST",
-          "TYPE_INVALID"
-        ]
-      },
-      "android/support/media/tv/BasePreviewProgram$Builder": {
-        "androidx/media/tv/BasePreviewProgram$Builder": [
-          "sFormat"
-        ]
-      },
-      "android/support/v4/widget/SlidingPaneLayout": {
-        "androidx/widget/SlidingPaneLayout": [
-          "DEFAULT_OVERHANG_SIZE",
-          "IMPL",
-          "DEFAULT_FADE_COLOR",
-          "TAG",
-          "MIN_FLING_VELOCITY"
-        ]
-      },
-      "android/support/v7/app/MediaRouteChooserDialog": {
-        "androidx/app/MediaRouteChooserDialog": [
-          "UPDATE_ROUTES_DELAY_MS",
-          "TAG",
-          "MSG_UPDATE_ROUTES"
-        ]
-      },
-      "android/support/v4/app/ShareCompat$IntentReader": {
-        "androidx/app/ShareCompat$IntentReader": [
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/ItemBridgeAdapter$ViewHolder": {
-        "androidx/leanback/widget/ItemBridgeAdapter$ViewHolder": [
-          "itemView"
-        ]
-      },
-      "android/support/v17/leanback/app/BrandedFragment": {
-        "androidx/leanback/app/BrandedFragment": [
-          "TITLE_SHOW"
-        ]
-      },
-      "android/support/v17/leanback/widget/SearchEditText": {
-        "androidx/leanback/widget/SearchEditText": [
-          "DEBUG",
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/PersistentFocusWrapper$SavedState": {
-        "androidx/leanback/widget/PersistentFocusWrapper$SavedState": [
-          "CREATOR"
-        ]
-      },
-      "android/support/percent/PercentFrameLayout$LayoutParams": {
-        "androidx/PercentFrameLayout$LayoutParams": [
-          "gravity"
-        ]
-      },
-      "android/support/text/emoji/widget/EmojiEditableFactory": {
-        "androidx/text/emoji/widget/EmojiEditableFactory": [
-          "sWatcherClass",
-          "sInstanceLock",
-          "sInstance"
-        ]
-      },
-      "android/support/v4/view/ViewPager$SavedState": {
-        "androidx/view/ViewPager$SavedState": [
-          "position",
-          "adapterState",
-          "CREATOR",
-          "loader"
-        ]
-      },
-      "android/support/v17/leanback/widget/RowPresenter": {
-        "androidx/leanback/widget/RowPresenter": [
-          "SYNC_ACTIVATED_TO_SELECTED",
-          "SYNC_ACTIVATED_TO_EXPANDED_AND_SELECTED",
-          "SYNC_ACTIVATED_CUSTOM",
-          "SYNC_ACTIVATED_TO_EXPANDED"
-        ]
-      },
-      "android/support/v7/preference/EditTextPreferenceDialogFragmentCompat": {
-        "androidx/preference/EditTextPreferenceDialogFragmentCompat": [
-          "SAVE_STATE_TEXT"
-        ]
-      },
-      "android/support/v17/leanback/graphics/ColorFilterCache": {
-        "androidx/leanback/graphics/ColorFilterCache": [
-          "sColorToFiltersMap"
-        ]
-      },
-      "android/support/v7/view/menu/ListMenuPresenter": {
-        "androidx/view/menu/ListMenuPresenter": [
-          "VIEWS_TAG",
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/VerticalGridPresenter$ViewHolder": {
-        "androidx/leanback/widget/VerticalGridPresenter$ViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/v4/app/TaskStackBuilder": {
-        "androidx/app/TaskStackBuilder": [
-          "TAG",
-          "IMPL"
-        ]
-      },
-      "android/support/v7/content/res/AppCompatResources": {
-        "androidx/content/res/AppCompatResources": [
-          "LOG_TAG",
-          "sColorStateCaches",
-          "TL_TYPED_VALUE",
-          "sColorStateCacheLock"
-        ]
-      },
-      "android/support/v4/hardware/display/DisplayManagerCompat": {
-        "androidx/hardware/display/DisplayManagerCompat": [
-          "DISPLAY_CATEGORY_PRESENTATION",
-          "sInstances"
-        ]
-      },
-      "android/support/v7/widget/ActionMenuPresenter": {
-        "androidx/widget/ActionMenuPresenter": [
-          "TAG"
-        ]
-      },
-      "android/support/v4/app/NotificationManagerCompat$NotifyTask": {
-        "androidx/app/NotificationManagerCompat$NotifyTask": [
-          "notif",
-          "id",
-          "tag",
-          "packageName"
-        ]
-      },
-      "android/support/text/emoji/FontRequestEmojiCompatConfig": {
-        "androidx/text/emoji/FontRequestEmojiCompatConfig": [
-          "DEFAULT_FONTS_CONTRACT"
-        ]
-      },
-      "android/support/v17/leanback/widget/ShadowHelperApi21": {
-        "androidx/leanback/widget/ShadowHelperApi21": [
-          "sOutlineProvider"
-        ]
-      },
-      "android/support/v17/leanback/widget/ItemBridgeAdapter": {
-        "androidx/leanback/widget/ItemBridgeAdapter": [
-          "TAG",
-          "DEBUG"
-        ]
-      },
-      "android/support/wear/utils/MetadataConstants": {
-        "androidx/wear/utils/MetadataConstants": [
-          "STANDALONE_METADATA_NAME",
-          "WATCH_FACE_PREVIEW_CIRCULAR_METADATA_NAME",
-          "NOTIFICATION_BRIDGE_MODE_NO_BRIDGING",
-          "NOTIFICATION_BRIDGE_MODE_BRIDGING",
-          "WATCH_FACE_PREVIEW_METADATA_NAME",
-          "NOTIFICATION_BRIDGE_MODE_METADATA_NAME"
-        ]
-      },
-      "android/support/transition/GhostViewUtils": {
-        "androidx/transition/GhostViewUtils": [
-          "CREATOR"
-        ]
-      },
-      "android/support/v17/leanback/widget/AbstractMediaListHeaderPresenter$ViewHolder": {
-        "androidx/leanback/widget/AbstractMediaListHeaderPresenter$ViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/v17/leanback/widget/PlaybackControlsRowPresenter": {
-        "androidx/leanback/widget/PlaybackControlsRowPresenter": [
-          "sShadowZ"
-        ]
-      },
-      "android/support/v7/widget/CardView": {
-        "androidx/widget/CardView": [
-          "COLOR_BACKGROUND_ATTR",
-          "IMPL"
-        ]
-      },
-      "android/support/v7/app/ActionBar$Tab": {
-        "androidx/app/ActionBar$Tab": [
-          "INVALID_POSITION"
-        ]
-      },
-      "android/support/v7/app/MediaRouterThemeHelper": {
-        "androidx/app/MediaRouterThemeHelper": [
-          "MIN_CONTRAST",
-          "COLOR_WHITE_ON_DARK_BACKGROUND",
-          "COLOR_DARK_ON_LIGHT_BACKGROUND"
-        ]
-      },
-      "android/support/transition/ChangeClipBounds": {
-        "androidx/transition/ChangeClipBounds": [
-          "PROPNAME_CLIP",
-          "PROPNAME_BOUNDS",
-          "sTransitionProperties"
-        ]
-      },
-      "android/support/transition/Styleable$Slide": {
-        "androidx/transition/Styleable$Slide": [
-          "SLIDE_EDGE"
-        ]
-      },
-      "android/support/transition/TransitionSet": {
-        "androidx/transition/TransitionSet": [
-          "ORDERING_TOGETHER",
-          "ORDERING_SEQUENTIAL"
-        ]
-      },
-      "android/support/v7/widget/SearchView$SavedState": {
-        "androidx/widget/SearchView$SavedState": [
-          "CREATOR",
-          "isIconified"
-        ]
-      },
-      "android/support/v17/leanback/widget/PlaybackControlsPresenter$BoundData": {
-        "androidx/leanback/widget/PlaybackControlsPresenter$BoundData": [
-          "secondaryActionsAdapter"
-        ]
-      },
-      "android/support/v4/content/LocalBroadcastManager$BroadcastRecord": {
-        "androidx/content/LocalBroadcastManager$BroadcastRecord": [
-          "intent",
-          "receivers"
-        ]
-      },
-      "android/support/v7/preference/MultiSelectListPreferenceDialogFragmentCompat": {
-        "androidx/preference/MultiSelectListPreferenceDialogFragmentCompat": [
-          "SAVE_STATE_ENTRIES",
-          "SAVE_STATE_CHANGED",
-          "SAVE_STATE_ENTRY_VALUES",
-          "SAVE_STATE_VALUES"
-        ]
-      },
-      "android/support/transition/ViewGroupUtils": {
-        "androidx/transition/ViewGroupUtils": [
-          "IMPL"
-        ]
-      },
-      "android/support/v17/leanback/widget/ControlBarPresenter$ViewHolder": {
-        "androidx/leanback/widget/ControlBarPresenter$ViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/v17/leanback/R$transition": {
-        "androidx/leanback/R$transition": [
-          "lb_title_in",
-          "lb_browse_headers_out",
-          "lb_title_out",
-          "lb_browse_entrance_transition",
-          "lb_details_enter_transition",
-          "lb_vertical_grid_entrance_transition",
-          "lb_browse_headers_in"
-        ]
-      },
-      "android/support/design/R$drawable": {
-        "androidx/design/R$drawable": [
-          "navigation_empty_icon",
-          "design_bottom_navigation_item_background"
-        ]
-      },
-      "android/support/wear/widget/drawer/NestedScrollViewFlingWatcher": {
-        "androidx/wear/widget/drawer/NestedScrollViewFlingWatcher": [
-          "MAX_WAIT_TIME_MS"
-        ]
-      },
-      "android/support/v17/leanback/app/HeadersSupportFragment": {
-        "androidx/leanback/app/HeadersSupportFragment": [
-          "sHeaderPresenter",
-          "sLayoutChangeListener"
-        ]
-      },
-      "android/support/v17/leanback/widget/ShadowHelper": {
-        "androidx/leanback/widget/ShadowHelper": [
-          "sInstance"
-        ]
-      },
-      "android/support/percent/PercentLayoutHelper": {
-        "androidx/PercentLayoutHelper": [
-          "TAG",
-          "VERBOSE",
-          "DEBUG"
-        ]
-      },
-      "android/support/design/internal/BottomNavigationMenu": {
-        "androidx/design/internal/BottomNavigationMenu": [
-          "MAX_ITEM_COUNT"
-        ]
-      },
-      "android/support/design/internal/TextScale": {
-        "androidx/design/internal/TextScale": [
-          "PROPNAME_SCALE"
-        ]
-      },
-      "android/support/v17/leanback/widget/PlaybackTransportRowPresenter$BoundData": {
-        "androidx/leanback/widget/PlaybackTransportRowPresenter$BoundData": [
-          "adapter",
-          "presenter"
-        ]
-      },
-      "android/support/v13/view/inputmethod/EditorInfoCompat$EditorInfoCompatBaseImpl": {
-        "androidx/view/inputmethod/EditorInfoCompat$EditorInfoCompatBaseImpl": [
-          "CONTENT_MIME_TYPES_KEY"
-        ]
-      },
-      "android/support/v17/leanback/widget/ViewsStateBundle": {
-        "androidx/leanback/widget/ViewsStateBundle": [
-          "UNLIMITED",
-          "LIMIT_DEFAULT"
-        ]
-      },
-      "android/support/v4/content/ContextCompat": {
-        "androidx/content/ContextCompat": [
-          "sLock",
-          "TAG",
-          "sTempValue"
-        ]
-      },
-      "android/support/v4/util/SparseArrayCompat": {
-        "androidx/util/SparseArrayCompat": [
-          "DELETED"
-        ]
-      },
-      "android/support/transition/Styleable$VisibilityTransition": {
-        "androidx/transition/Styleable$VisibilityTransition": [
-          "TRANSITION_VISIBILITY_MODE"
-        ]
-      },
-      "android/support/v14/preference/MultiSelectListPreference$SavedState": {
-        "androidx/preference/MultiSelectListPreference$SavedState": [
-          "CREATOR",
-          "values"
-        ]
-      },
-      "android/support/v17/leanback/app/DetailsFragment$WaitEnterTransitionTimeout": {
-        "androidx/leanback/app/DetailsFragment$WaitEnterTransitionTimeout": [
-          "WAIT_ENTERTRANSITION_START"
-        ]
-      },
-      "android/support/text/emoji/MetadataListReader$OpenTypeReader": {
-        "androidx/text/emoji/MetadataListReader$OpenTypeReader": [
-          "UINT16_BYTE_COUNT",
-          "UINT32_BYTE_COUNT"
-        ]
-      },
-      "android/support/v7/preference/TwoStatePreference$SavedState": {
-        "androidx/preference/TwoStatePreference$SavedState": [
-          "checked",
-          "CREATOR"
-        ]
-      },
-      "android/support/v17/leanback/widget/Action": {
-        "androidx/leanback/widget/Action": [
-          "NO_ID"
-        ]
-      },
-      "android/support/v7/widget/Toolbar": {
-        "androidx/widget/Toolbar": [
-          "TAG"
-        ]
-      },
-      "android/support/v17/preference/LeanbackPreferenceDialogFragment": {
-        "androidx/leanback/preference/LeanbackPreferenceDialogFragment": [
-          "ARG_KEY"
-        ]
-      },
-      "android/support/v4/content/SharedPreferencesCompat$EditorCompat": {
-        "androidx/content/SharedPreferencesCompat$EditorCompat": [
-          "sInstance"
-        ]
-      },
-      "android/support/v17/leanback/widget/RowPresenter$ContainerViewHolder": {
-        "androidx/leanback/widget/RowPresenter$ContainerViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/v7/app/MediaRouteChooserDialog$RouteComparator": {
-        "androidx/app/MediaRouteChooserDialog$RouteComparator": [
-          "sInstance"
-        ]
-      },
-      "android/support/v4/widget/PopupWindowCompat": {
-        "androidx/widget/PopupWindowCompat": [
-          "IMPL"
-        ]
-      },
-      "android/support/v4/widget/ImageViewCompat": {
-        "androidx/widget/ImageViewCompat": [
-          "IMPL"
-        ]
-      },
-      "android/support/v17/leanback/widget/GuidedActionsStylist$ViewHolder": {
-        "androidx/leanback/widget/GuidedActionsStylist$ViewHolder": [
-          "itemView"
-        ]
-      },
-      "android/support/v4/view/ActionProvider": {
-        "androidx/view/ActionProvider": [
-          "TAG"
-        ]
-      },
-      "android/support/v4/view/ViewConfigurationCompat": {
-        "androidx/view/ViewConfigurationCompat": [
-          "TAG",
-          "sGetScaledScrollFactorMethod"
-        ]
-      },
-      "android/support/customtabs/CustomTabsSession": {
-        "androidx/browser/customtabs/CustomTabsSession": [
-          "TAG"
-        ]
-      },
-      "android/support/v7/mediarouter/R$style": {
-        "androidx/mediarouter/R$style": [
-          "Theme_MediaRouter_LightControlPanel",
-          "Theme_MediaRouter_Light",
-          "Theme_MediaRouter_Light_DarkControlPanel",
-          "Theme_MediaRouter"
-        ]
-      },
-      "android/support/text/emoji/EmojiProcessor$CodepointIndexFinder": {
-        "androidx/text/emoji/EmojiProcessor$CodepointIndexFinder": [
-          "INVALID_INDEX"
-        ]
-      },
-      "android/support/v17/leanback/widget/NonOverlappingLinearLayoutWithForeground": {
-        "androidx/leanback/widget/NonOverlappingLinearLayoutWithForeground": [
-          "VERSION_M"
-        ]
-      },
-      "android/support/v4/view/ViewCompat$ViewCompatApi21Impl": {
-        "androidx/view/legacy/ViewCompat$ViewCompatApi21Impl": [
-          "sThreadLocalRect"
-        ]
-      },
-      "android/support/v4/app/NotificationCompat$DecoratedCustomViewStyle": {
-        "androidx/app/NotificationCompat$DecoratedCustomViewStyle": [
-          "MAX_ACTION_BUTTONS"
-        ]
-      },
-      "android/support/v7/widget/PagerSnapHelper": {
-        "androidx/widget/PagerSnapHelper": [
-          "MAX_SCROLL_ON_FLING_DURATION"
-        ]
-      },
-      "android/support/wear/widget/CircledImageView": {
-        "androidx/wear/widget/CircledImageView": [
-          "SQUARE_DIMEN_WIDTH",
-          "SQUARE_DIMEN_NONE",
-          "SQUARE_DIMEN_HEIGHT",
-          "ARGB_EVALUATOR"
-        ]
-      },
-      "android/support/v7/widget/RtlSpacingHelper": {
-        "androidx/widget/RtlSpacingHelper": [
-          "UNDEFINED"
-        ]
-      },
-      "android/support/v4/media/MediaBrowserServiceCompatApi26": {
-        "androidx/media/MediaBrowserServiceCompatApi26": [
-          "sResultFlags",
-          "TAG"
-        ]
-      },
-      "android/support/text/emoji/EmojiMetadata": {
-        "androidx/text/emoji/EmojiMetadata": [
-          "HAS_GLYPH_EXISTS",
-          "HAS_GLYPH_ABSENT",
-          "HAS_GLYPH_UNKNOWN",
-          "sMetadataItem"
-        ]
-      },
-      "android/support/mediacompat/R$integer": {
-        "androidx/mediacompat/R$integer": [
-          "cancel_button_image_alpha"
-        ]
-      },
-      "android/support/v7/content/res/AppCompatResources$ColorStateListCacheEntry": {
-        "androidx/content/res/AppCompatResources$ColorStateListCacheEntry": [
-          "value",
-          "configuration"
-        ]
-      },
-      "android/support/v17/leanback/widget/DetailsOverviewRowPresenter$ViewHolder": {
-        "androidx/leanback/widget/DetailsOverviewRowPresenter$ViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/wear/R$color": {
-        "androidx/wear/R$color": [
-          "circular_progress_layout_background_color"
-        ]
-      },
-      "android/support/v17/leanback/widget/ItemAlignmentFacet": {
-        "androidx/leanback/widget/ItemAlignmentFacet": [
-          "ITEM_ALIGN_OFFSET_PERCENT_DISABLED"
-        ]
-      },
-      "android/support/wear/ambient/AmbientMode$AmbientController": {
-        "androidx/wear/ambient/AmbientMode$AmbientController": [
-          "TAG"
-        ]
-      },
-      "android/support/v13/view/inputmethod/InputConnectionCompat": {
-        "androidx/view/inputmethod/InputConnectionCompat": [
-          "INPUT_CONTENT_GRANT_READ_URI_PERMISSION",
-          "IMPL"
-        ]
-      },
-      "android/support/wear/widget/BezierSCurveInterpolator": {
-        "androidx/wear/widget/BezierSCurveInterpolator": [
-          "STEP_SIZE",
-          "VALUES",
-          "INSTANCE"
-        ]
-      },
-      "android/support/v4/graphics/PathParser": {
-        "androidx/graphics/PathParser": [
-          "LOGTAG"
-        ]
-      },
-      "android/support/v7/widget/RecyclerView$RecycledViewPool": {
-        "androidx/widget/RecyclerView$RecycledViewPool": [
-          "DEFAULT_MAX_SCRAP"
-        ]
-      },
-      "android/support/v7/media/MediaRouteSelector": {
-        "androidx/media/MediaRouteSelector": [
-          "KEY_CONTROL_CATEGORIES",
-          "EMPTY"
-        ]
-      },
-      "android/support/transition/PropertyValuesHolderUtils": {
-        "androidx/transition/PropertyValuesHolderUtils": [
-          "IMPL"
-        ]
-      },
-      "android/support/graphics/drawable/VectorDrawableCompat$VFullPath": {
-        "androidx/graphics/drawable/VectorDrawableCompat$VFullPath": [
-          "FILL_TYPE_WINDING"
-        ]
-      },
-      "android/support/mediacompat/R$color": {
-        "androidx/mediacompat/R$color": [
-          "notification_material_background_media_default_color"
-        ]
-      },
-      "android/support/v17/leanback/widget/RowHeaderPresenter$ViewHolder": {
-        "androidx/leanback/widget/RowHeaderPresenter$ViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/design/widget/CollapsingToolbarLayout": {
-        "androidx/design/widget/CollapsingToolbarLayout": [
-          "DEFAULT_SCRIM_ANIMATION_DURATION"
-        ]
-      },
-      "android/support/v17/leanback/app/BrandedSupportFragment": {
-        "androidx/leanback/app/BrandedSupportFragment": [
-          "TITLE_SHOW"
-        ]
-      },
-      "android/support/design/internal/BottomNavigationPresenter$SavedState": {
-        "androidx/design/internal/BottomNavigationPresenter$SavedState": [
-          "CREATOR",
-          "selectedItemId"
-        ]
-      },
-      "android/support/v4/app/BackStackState": {
-        "androidx/app/BackStackState": [
-          "CREATOR"
-        ]
-      },
-      "android/support/v4/provider/FontsContractCompat$FontFamilyResult": {
-        "androidx/provider/FontsContractCompat$FontFamilyResult": [
-          "STATUS_WRONG_CERTIFICATES",
-          "STATUS_OK",
-          "STATUS_UNEXPECTED_DATA_PROVIDED"
-        ]
-      },
-      "android/support/v4/app/FragmentManagerState": {
-        "androidx/app/FragmentManagerState": [
-          "CREATOR"
-        ]
-      },
-      "android/support/media/ExifInterface$Rational": {
-        "androidx/media/ExifInterface$Rational": [
-          "denominator",
-          "numerator"
-        ]
-      },
-      "android/support/text/emoji/TypefaceEmojiSpan": {
-        "androidx/text/emoji/TypefaceEmojiSpan": [
-          "sDebugPaint"
-        ]
-      },
-      "android/support/design/widget/FloatingActionButton$Behavior": {
-        "androidx/design/widget/FloatingActionButton$Behavior": [
-          "AUTO_HIDE_DEFAULT"
-        ]
-      },
-      "android/support/graphics/drawable/ArgbEvaluator": {
-        "androidx/graphics/drawable/ArgbEvaluator": [
-          "sInstance"
-        ]
-      },
-      "android/support/v4/util/ContainerHelpers": {
-        "androidx/util/ContainerHelpers": [
-          "EMPTY_INTS",
-          "EMPTY_LONGS",
-          "EMPTY_OBJECTS"
-        ]
-      },
-      "android/support/v7/media/MediaRouterJellybeanMr1": {
-        "androidx/media/MediaRouterJellybeanMr1": [
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/ActionPresenterSelector$ActionViewHolder": {
-        "androidx/leanback/widget/ActionPresenterSelector$ActionViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/v4/app/FragmentState": {
-        "androidx/app/FragmentState": [
-          "CREATOR"
-        ]
-      },
-      "android/support/v7/widget/LinearSnapHelper": {
-        "androidx/widget/LinearSnapHelper": [
-          "INVALID_DISTANCE"
-        ]
-      },
-      "android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder": {
-        "androidx/leanback/widget/FullWidthDetailsOverviewRowPresenter$ViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/constraint/solver/widgets/ConstraintAnchor$Strength": {
-        "androidx/constraint/solver/widgets/ConstraintAnchor$Strength": [
-          "STRONG"
-        ]
-      },
-      "android/support/design/widget/HeaderBehavior": {
-        "androidx/design/widget/HeaderBehavior": [
-          "INVALID_POINTER"
-        ]
-      },
-      "android/support/v7/widget/LinearLayoutManager$SavedState": {
-        "androidx/widget/LinearLayoutManager$SavedState": [
-          "CREATOR"
-        ]
-      },
-      "android/support/v7/widget/GridLayout$Interval": {
-        "androidx/widget/GridLayout$Interval": [
-          "min",
-          "max"
-        ]
-      },
-      "android/support/v4/widget/SlidingPaneLayout$SavedState": {
-        "androidx/widget/SlidingPaneLayout$SavedState": [
-          "CREATOR",
-          "isOpen"
-        ]
-      },
-      "android/support/v17/leanback/widget/DetailsOverviewLogoPresenter$ViewHolder": {
-        "androidx/leanback/widget/DetailsOverviewLogoPresenter$ViewHolder": [
-          "view"
-        ]
-      },
-      "android/support/v4/media/session/MediaSessionCompatApi24": {
-        "androidx/media/session/MediaSessionCompatApi24": [
-          "TAG"
-        ]
-      },
-      "android/support/v7/app/MediaRouteActionProvider": {
-        "androidx/app/MediaRouteActionProvider": [
-          "TAG"
-        ]
-      },
-      "android/support/v4/media/session/MediaButtonReceiver": {
-        "androidx/media/session/MediaButtonReceiver": [
-          "TAG"
-        ]
-      },
-      "android/support/v4/content/AsyncTaskLoader$LoadTask": {
-        "androidx/content/AsyncTaskLoader$LoadTask": [
-          "waiting"
-        ]
-      },
-      "android/support/v4/media/session/MediaSessionCompatApi21": {
-        "androidx/media/session/MediaSessionCompatApi21": [
-          "TAG"
-        ]
-      },
-      "android/support/design/internal/NavigationMenuPresenter$ViewHolder": {
-        "androidx/design/internal/NavigationMenuPresenter$ViewHolder": [
-          "itemView"
-        ]
-      },
-      "android/support/v7/widget/AppCompatButton": {
-        "androidx/widget/AppCompatButton": [
-          "PLATFORM_SUPPORTS_AUTOSIZE"
-        ]
-      },
-      "android/support/v17/leanback/widget/CheckableImageView": {
-        "androidx/leanback/widget/CheckableImageView": [
-          "CHECKED_STATE_SET"
-        ]
-      },
-      "android/support/v4/view/animation/FastOutLinearInInterpolator": {
-        "androidx/view/animation/FastOutLinearInInterpolator": [
-          "VALUES"
-        ]
-      },
-      "android/support/v7/app/MediaRouteDiscoveryFragment": {
-        "androidx/app/MediaRouteDiscoveryFragment": [
-          "ARGUMENT_SELECTOR"
-        ]
-      },
-      "android/support/v4/graphics/TypefaceCompatApi21Impl": {
-        "androidx/graphics/TypefaceCompatApi21Impl": [
-          "TAG"
-        ]
-      },
-      "android/support/v17/leanback/widget/FocusHighlightHelper$BrowseItemFocusHighlight": {
-        "androidx/leanback/widget/FocusHighlightHelper$BrowseItemFocusHighlight": [
-          "DURATION_MS"
-        ]
-      },
-      "android/support/transition/ImageViewUtilsApi21": {
-        "androidx/transition/ImageViewUtilsApi21": [
-          "TAG",
-          "sAnimateTransformMethodFetched",
-          "sAnimateTransformMethod"
-        ]
-      },
-      "android/support/v7/widget/RecyclerView$SmoothScroller$Action": {
-        "androidx/widget/RecyclerView$SmoothScroller$Action": [
-          "UNDEFINED_DURATION"
-        ]
-      },
-      "android/support/v4/media/session/PlaybackStateCompat$CustomAction": {
-        "androidx/media/session/PlaybackStateCompat$CustomAction": [
-          "CREATOR"
-        ]
-      },
-      "android/support/design/R$integer": {
-        "androidx/design/R$integer": [
-          "app_bar_elevation_anim_duration"
-        ]
-      },
-      "android/support/v4/provider/DocumentFile": {
-        "androidx/provider/DocumentFile": [
-          "TAG"
-        ]
-      },
-      "android/support/v7/widget/StaggeredGridLayoutManager$SavedState": {
-        "androidx/widget/StaggeredGridLayoutManager$SavedState": [
-          "CREATOR"
-        ]
-      },
-      "android/support/animation/FlingAnimation$DragForce": {
-        "androidx/animation/FlingAnimation$DragForce": [
-          "VELOCITY_THRESHOLD_MULTIPLIER",
-          "DEFAULT_FRICTION"
-        ]
-      },
-      "android/support/v17/leanback/transition/ParallaxTransition": {
-        "androidx/leanback/transition/ParallaxTransition": [
-          "sInterpolator"
-        ]
-      },
-      "android/support/v4/app/NotificationCompat$MessagingStyle": {
-        "androidx/app/NotificationCompat$MessagingStyle": [
-          "MAXIMUM_RETAINED_MESSAGES"
-        ]
-      },
-      "android/support/v7/widget/RecyclerView$SavedState": {
-        "androidx/widget/RecyclerView$SavedState": [
-          "CREATOR"
-        ]
-      },
-      "android/support/v17/leanback/widget/ResizingTextView": {
-        "androidx/leanback/widget/ResizingTextView": [
-          "TRIGGER_MAX_LINES"
-        ]
-      },
-      "android/support/v7/widget/StaggeredGridLayoutManager$LazySpanLookup": {
-        "androidx/widget/StaggeredGridLayoutManager$LazySpanLookup": [
-          "MIN_SIZE"
-        ]
-      },
-      "android/support/v4/media/session/MediaSessionCompat$MediaSessionImplBase": {
-        "androidx/media/session/MediaSessionCompat$MediaSessionImplBase": [
-          "RCC_PLAYSTATE_NONE"
-        ]
-      },
-      "android/support/v4/util/LongSparseArray": {
-        "androidx/util/LongSparseArray": [
-          "DELETED"
-        ]
-      },
-      "android/support/v4/view/accessibility/AccessibilityNodeProviderCompat": {
-        "androidx/view/accessibility/AccessibilityNodeProviderCompat": [
-          "HOST_VIEW_ID"
-        ]
-      },
-      "android/support/v4/view/AsyncLayoutInflater": {
-        "androidx/view/AsyncLayoutInflater": [
-          "TAG"
-        ]
-      },
-      "android/support/graphics/drawable/VectorDrawableCompat$VPathRenderer": {
-        "androidx/graphics/drawable/VectorDrawableCompat$VPathRenderer": [
-          "IDENTITY_MATRIX"
-        ]
-      },
-      "android/support/v13/view/DragAndDropPermissionsCompat": {
-        "androidx/view/DragAndDropPermissionsCompat": [
-          "IMPL"
-        ]
-      },
-      "android/support/v4/media/MediaBrowserCompatApi21": {
-        "androidx/media/MediaBrowserCompatApi21": [
-          "NULL_MEDIA_ITEM_ID"
-        ]
-      },
-      "android/support/v4/view/animation/FastOutSlowInInterpolator": {
-        "androidx/view/animation/FastOutSlowInInterpolator": [
-          "VALUES"
-        ]
-      },
-      "android/support/v7/widget/AppCompatProgressBarHelper": {
-        "androidx/widget/AppCompatProgressBarHelper": [
-          "TINT_ATTRS"
-        ]
-      },
-      "android/support/v4/media/ParceledListSliceAdapterApi21": {
-        "androidx/media/ParceledListSliceAdapterApi21": [
-          "sConstructor"
-        ]
-      },
-      "android/support/compat/R$integer": {
-        "androidx/compat/R$integer": [
-          "status_bar_notification_info_maxnum"
-        ]
-      },
-      "android/support/v14/preference/EditTextPreferenceDialogFragment": {
-        "androidx/preference/EditTextPreferenceDialogFragment": [
-          "SAVE_STATE_TEXT"
-        ]
-      },
-      "android/support/wear/R$array": {
-        "androidx/wear/R$array": [
-          "circular_progress_layout_color_scheme_colors"
-        ]
-      },
-      "android/support/v7/cardview/R$style": {
-        "androidx/cardview/R$style": [
-          "CardView"
-        ]
-      },
-      "android/support/design/internal/ParcelableSparseArray": {
-        "androidx/design/internal/ParcelableSparseArray": [
-          "CREATOR"
-        ]
-      },
-      "android/support/design/widget/CircularBorderDrawable": {
-        "androidx/design/widget/CircularBorderDrawable": [
-          "DRAW_STROKE_WIDTH_MULTIPLE"
-        ]
-      },
-      "android/support/transition/ObjectAnimatorUtils": {
-        "androidx/transition/ObjectAnimatorUtils": [
-          "IMPL"
-        ]
-      },
-      "android/support/v4/app/ActivityCompat": {
-        "androidx/app/legacy/ActivityCompat": [
-          "sDelegate"
-        ]
-      },
-      "android/support/wear/internal/widget/drawer/MultiPageUi": {
-        "androidx/wear/internal/widget/drawer/MultiPageUi": [
-          "TAG"
-        ]
-      },
-      "android/support/transition/ViewOverlayApi14$OverlayViewGroup": {
-        "androidx/transition/ViewOverlayApi14$OverlayViewGroup": [
-          "sInvalidateChildInParentFastMethod"
-        ]
-      },
-      "android/support/v4/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicLocale": {
-        "androidx/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicLocale": [
-          "INSTANCE"
-        ]
-      },
-      "android/support/v7/preference/Preference": {
-        "androidx/preference/Preference": [
-          "DEFAULT_ORDER"
-        ]
-      },
-      "android/support/v4/graphics/drawable/RoundedBitmapDrawable": {
-        "androidx/graphics/drawable/RoundedBitmapDrawable": [
-          "DEFAULT_PAINT_FLAGS"
-        ]
-      },
-      "android/support/design/widget/TabLayout$Tab": {
-        "androidx/design/widget/TabLayout$Tab": [
-          "INVALID_POSITION"
-        ]
-      },
-      "android/support/v7/widget/SnapHelper": {
-        "androidx/widget/SnapHelper": [
-          "MILLISECONDS_PER_INCH"
-        ]
-      },
-      "android/support/v7/widget/AbsActionBarView": {
-        "androidx/widget/AbsActionBarView": [
-          "FADE_DURATION"
-        ]
-      },
-      "android/support/v17/leanback/graphics/FitWidthBitmapDrawable": {
-        "androidx/leanback/graphics/FitWidthBitmapDrawable": [
-          "PROPERTY_VERTICAL_OFFSET"
-        ]
-      },
-      "android/support/v4/media/session/MediaSessionCompat$ResultReceiverWrapper": {
-        "androidx/media/session/MediaSessionCompat$ResultReceiverWrapper": [
-          "CREATOR"
-        ]
-      },
-      "android/support/v7/view/SupportMenuInflater$InflatedOnMenuItemClickListener": {
-        "androidx/view/SupportMenuInflater$InflatedOnMenuItemClickListener": [
-          "PARAM_TYPES"
-        ]
-      },
-      "android/support/v4/widget/EdgeEffectCompat": {
-        "androidx/widget/EdgeEffectCompat": [
-          "IMPL"
-        ]
-      },
-      "android/support/v7/app/MediaRouteDialogFactory": {
-        "androidx/app/MediaRouteDialogFactory": [
-          "sDefault"
-        ]
-      },
-      "android/support/v4/app/Fragment$SavedState": {
-        "androidx/app/Fragment$SavedState": [
-          "CREATOR"
-        ]
-      },
-      "android/support/transition/Styleable$TransitionSet": {
-        "androidx/transition/Styleable$TransitionSet": [
-          "TRANSITION_ORDERING"
-        ]
-      },
-      "android/support/v7/preference/PreferenceGroupAdapter": {
-        "androidx/preference/PreferenceGroupAdapter": [
-          "TAG"
-        ]
-      },
-      "android/support/v7/view/menu/MenuPopupHelper": {
-        "androidx/view/menu/MenuPopupHelper": [
-          "TOUCH_EPICENTER_SIZE_DP"
-        ]
-      },
-      "android/support/v4/app/NotificationCompat$Builder": {
-        "androidx/app/NotificationCompat$Builder": [
-          "MAX_CHARSEQUENCE_LENGTH"
-        ]
-      }
+      "android/support/text/emoji/R$id": "androidx/text/emoji/R$id",
+      "android/support/text/emoji/widget/ExtractButtonCompat": "androidx/text/emoji/widget/ExtractButtonCompat",
+      "android/support/text/emoji/widget/EmojiInputFilter$InitCallbackImpl": "androidx/text/emoji/widget/EmojiInputFilter$InitCallbackImpl",
+      "android/support/text/emoji/widget/EmojiInputFilter": "androidx/text/emoji/widget/EmojiInputFilter",
+      "android/support/text/emoji/widget/EmojiTextView": "androidx/text/emoji/widget/EmojiTextView",
+      "android/support/text/emoji/widget/EmojiTextViewHelper$1": "androidx/text/emoji/widget/EmojiTextViewHelper$1",
+      "android/support/text/emoji/widget/EmojiTextViewHelper$HelperInternal": "androidx/text/emoji/widget/EmojiTextViewHelper$HelperInternal",
+      "android/support/text/emoji/widget/EmojiTextViewHelper$HelperInternal19": "androidx/text/emoji/widget/EmojiTextViewHelper$HelperInternal19",
+      "android/support/text/emoji/widget/EmojiTransformationMethod": "androidx/text/emoji/widget/EmojiTransformationMethod",
+      "android/support/text/emoji/widget/EmojiTextWatcher$InitCallbackImpl": "androidx/text/emoji/widget/EmojiTextWatcher$InitCallbackImpl",
+      "android/support/text/emoji/widget/SpannableBuilder$WatcherWrapper": "androidx/text/emoji/widget/SpannableBuilder$WatcherWrapper",
+      "android/support/customtabs/CustomTabsCallback": "androidx/browser/customtabs/CustomTabsCallback",
+      "android/support/customtabs/CustomTabsClient$1": "androidx/browser/customtabs/CustomTabsClient$1",
+      "android/support/customtabs/CustomTabsServiceConnection": "androidx/browser/customtabs/CustomTabsServiceConnection",
+      "android/support/customtabs/CustomTabsClient": "androidx/browser/customtabs/CustomTabsClient",
+      "android/support/customtabs/CustomTabsClient$2$1": "androidx/browser/customtabs/CustomTabsClient$2$1",
+      "android/support/customtabs/CustomTabsClient$2": "androidx/browser/customtabs/CustomTabsClient$2",
+      "android/support/customtabs/CustomTabsClient$2$2": "androidx/browser/customtabs/CustomTabsClient$2$2",
+      "android/support/customtabs/CustomTabsClient$2$3": "androidx/browser/customtabs/CustomTabsClient$2$3",
+      "android/support/customtabs/CustomTabsClient$2$4": "androidx/browser/customtabs/CustomTabsClient$2$4",
+      "android/support/customtabs/CustomTabsClient$2$5": "androidx/browser/customtabs/CustomTabsClient$2$5",
+      "android/support/customtabs/ICustomTabsCallback$Stub": "androidx/browser/customtabs/ICustomTabsCallback$Stub",
+      "android/support/customtabs/CustomTabsSession": "androidx/browser/customtabs/CustomTabsSession",
+      "android/support/customtabs/ICustomTabsCallback": "androidx/browser/customtabs/ICustomTabsCallback",
+      "android/support/customtabs/ICustomTabsService": "androidx/browser/customtabs/ICustomTabsService",
+      "android/support/customtabs/CustomTabsIntent$1": "androidx/browser/customtabs/CustomTabsIntent$1",
+      "android/support/customtabs/CustomTabsIntent": "androidx/browser/customtabs/CustomTabsIntent",
+      "android/support/customtabs/CustomTabsIntent$Builder": "androidx/browser/customtabs/CustomTabsIntent$Builder",
+      "android/support/customtabs/CustomTabsService$1$1": "androidx/browser/customtabs/CustomTabsService$1$1",
+      "android/support/customtabs/CustomTabsService$1": "androidx/browser/customtabs/CustomTabsService$1",
+      "android/support/customtabs/CustomTabsSessionToken": "androidx/browser/customtabs/CustomTabsSessionToken",
+      "android/support/customtabs/CustomTabsService": "androidx/browser/customtabs/CustomTabsService",
+      "android/support/customtabs/ICustomTabsService$Stub": "androidx/browser/customtabs/ICustomTabsService$Stub",
+      "android/support/customtabs/CustomTabsService$Relation": "androidx/browser/customtabs/CustomTabsService$Relation",
+      "android/support/customtabs/CustomTabsService$Result": "androidx/browser/customtabs/CustomTabsService$Result",
+      "android/support/customtabs/CustomTabsServiceConnection$1": "androidx/browser/customtabs/CustomTabsServiceConnection$1",
+      "android/support/customtabs/CustomTabsSessionToken$MockCallback": "androidx/browser/customtabs/CustomTabsSessionToken$MockCallback",
+      "android/support/customtabs/CustomTabsSessionToken$1": "androidx/browser/customtabs/CustomTabsSessionToken$1",
+      "android/support/customtabs/ICustomTabsCallback$Stub$Proxy": "androidx/browser/customtabs/ICustomTabsCallback$Stub$Proxy",
+      "android/support/customtabs/ICustomTabsService$Stub$Proxy": "androidx/browser/customtabs/ICustomTabsService$Stub$Proxy",
+      "android/support/customtabs/IPostMessageService$Stub$Proxy": "androidx/browser/customtabs/IPostMessageService$Stub$Proxy",
+      "android/support/customtabs/IPostMessageService": "androidx/browser/customtabs/IPostMessageService",
+      "android/support/customtabs/IPostMessageService$Stub": "androidx/browser/customtabs/IPostMessageService$Stub",
+      "android/support/customtabs/PostMessageService$1": "androidx/browser/customtabs/PostMessageService$1",
+      "android/support/customtabs/PostMessageService": "androidx/browser/customtabs/PostMessageService",
+      "android/support/customtabs/PostMessageServiceConnection": "androidx/browser/customtabs/PostMessageServiceConnection",
+      "android/support/customtabs/TrustedWebUtils": "androidx/browser/customtabs/TrustedWebUtils",
+      "android/support/media/ExifInterface$1": "androidx/media/ExifInterface$1",
+      "android/support/media/ExifInterface": "androidx/media/ExifInterface",
+      "android/support/media/ExifInterface$ByteOrderedDataInputStream": "androidx/media/ExifInterface$ByteOrderedDataInputStream",
+      "android/support/media/ExifInterface$ByteOrderedDataOutputStream": "androidx/media/ExifInterface$ByteOrderedDataOutputStream",
+      "android/support/media/ExifInterface$ExifAttribute": "androidx/media/ExifInterface$ExifAttribute",
+      "android/support/media/ExifInterface$Rational": "androidx/media/ExifInterface$Rational",
+      "android/support/media/ExifInterface$ExifTag": "androidx/media/ExifInterface$ExifTag",
+      "android/support/media/ExifInterface$IfdType": "androidx/media/ExifInterface$IfdType",
+      "android/arch/persistence/room/RoomDatabase$Callback": "androidx/persistence/room/RoomDatabase$Callback",
+      "android/arch/persistence/room/EntityDeletionOrUpdateAdapter": "androidx/persistence/room/EntityDeletionOrUpdateAdapter",
+      "android/arch/persistence/room/SharedSQLiteStatement": "androidx/persistence/room/SharedSQLiteStatement",
+      "android/arch/persistence/room/EntityInsertionAdapter": "androidx/persistence/room/EntityInsertionAdapter",
+      "android/arch/persistence/room/InvalidationTracker$1": "androidx/persistence/room/InvalidationTracker$1",
+      "android/arch/persistence/room/InvalidationTracker$ObservedTableTracker": "androidx/persistence/room/InvalidationTracker$ObservedTableTracker",
+      "android/arch/persistence/room/InvalidationTracker$2": "androidx/persistence/room/InvalidationTracker$2",
+      "android/arch/persistence/room/InvalidationTracker$ObserverWrapper": "androidx/persistence/room/InvalidationTracker$ObserverWrapper",
+      "android/arch/persistence/room/InvalidationTracker$WeakObserver": "androidx/persistence/room/InvalidationTracker$WeakObserver",
+      "android/arch/persistence/room/Room": "androidx/persistence/room/Room",
+      "android/arch/persistence/room/RoomDatabase$Builder": "androidx/persistence/room/RoomDatabase$Builder",
+      "android/arch/persistence/room/RoomSQLiteQuery": "androidx/persistence/room/RoomSQLiteQuery",
+      "android/arch/persistence/room/paging/LimitOffsetDataSource$1": "androidx/persistence/room/paging/LimitOffsetDataSource$1",
+      "android/arch/persistence/room/paging/LimitOffsetDataSource": "androidx/persistence/room/paging/LimitOffsetDataSource",
+      "android/arch/persistence/room/util/StringUtil": "androidx/persistence/room/util/StringUtil",
+      "android/arch/persistence/room/ColumnInfo$SQLiteTypeAffinity": "androidx/persistence/room/ColumnInfo$SQLiteTypeAffinity",
+      "android/arch/persistence/room/util/TableInfo$ForeignKeyWithSequence": "androidx/persistence/room/util/TableInfo$ForeignKeyWithSequence",
+      "android/support/design/internal/BaselineLayout": "androidx/design/internal/BaselineLayout",
+      "android/support/design/internal/BottomNavigationItemView": "androidx/design/internal/BottomNavigationItemView",
+      "android/support/design/R$dimen": "androidx/design/R$dimen",
+      "android/support/design/R": "androidx/design/R",
+      "android/support/design/R$layout": "androidx/design/R$layout",
+      "android/support/design/R$drawable": "androidx/design/R$drawable",
+      "android/support/design/R$id": "androidx/design/R$id",
+      "android/support/design/internal/BottomNavigationMenu": "androidx/design/internal/BottomNavigationMenu",
+      "android/support/design/internal/BottomNavigationMenuView$1": "androidx/design/internal/BottomNavigationMenuView$1",
+      "android/support/design/internal/BottomNavigationMenuView": "androidx/design/internal/BottomNavigationMenuView",
+      "android/support/design/internal/BottomNavigationPresenter": "androidx/design/internal/BottomNavigationPresenter",
+      "android/support/design/internal/TextScale": "androidx/design/internal/TextScale",
+      "android/support/design/internal/BottomNavigationPresenter$SavedState$1": "androidx/design/internal/BottomNavigationPresenter$SavedState$1",
+      "android/support/design/internal/BottomNavigationPresenter$SavedState": "androidx/design/internal/BottomNavigationPresenter$SavedState",
+      "android/support/design/internal/ForegroundLinearLayout": "androidx/design/internal/ForegroundLinearLayout",
+      "android/support/design/R$styleable": "androidx/design/R$styleable",
+      "android/support/design/internal/NavigationMenu": "androidx/design/internal/NavigationMenu",
+      "android/support/design/internal/NavigationSubMenu": "androidx/design/internal/NavigationSubMenu",
+      "android/support/design/internal/NavigationMenuItemView$1": "androidx/design/internal/NavigationMenuItemView$1",
+      "android/support/design/internal/NavigationMenuItemView": "androidx/design/internal/NavigationMenuItemView",
+      "android/support/design/internal/NavigationMenuPresenter$1": "androidx/design/internal/NavigationMenuPresenter$1",
+      "android/support/design/internal/NavigationMenuPresenter": "androidx/design/internal/NavigationMenuPresenter",
+      "android/support/design/internal/NavigationMenuPresenter$NavigationMenuAdapter": "androidx/design/internal/NavigationMenuPresenter$NavigationMenuAdapter",
+      "android/support/design/internal/NavigationMenuPresenter$HeaderViewHolder": "androidx/design/internal/NavigationMenuPresenter$HeaderViewHolder",
+      "android/support/design/internal/NavigationMenuPresenter$ViewHolder": "androidx/design/internal/NavigationMenuPresenter$ViewHolder",
+      "android/support/design/internal/NavigationMenuPresenter$NavigationMenuItem": "androidx/design/internal/NavigationMenuPresenter$NavigationMenuItem",
+      "android/support/design/internal/NavigationMenuPresenter$NavigationMenuTextItem": "androidx/design/internal/NavigationMenuPresenter$NavigationMenuTextItem",
+      "android/support/design/internal/NavigationMenuPresenter$NavigationMenuSeparatorItem": "androidx/design/internal/NavigationMenuPresenter$NavigationMenuSeparatorItem",
+      "android/support/design/internal/NavigationMenuPresenter$NavigationMenuHeaderItem": "androidx/design/internal/NavigationMenuPresenter$NavigationMenuHeaderItem",
+      "android/support/design/internal/NavigationMenuPresenter$NormalViewHolder": "androidx/design/internal/NavigationMenuPresenter$NormalViewHolder",
+      "android/support/design/internal/NavigationMenuPresenter$SubheaderViewHolder": "androidx/design/internal/NavigationMenuPresenter$SubheaderViewHolder",
+      "android/support/design/internal/NavigationMenuPresenter$SeparatorViewHolder": "androidx/design/internal/NavigationMenuPresenter$SeparatorViewHolder",
+      "android/support/design/internal/ParcelableSparseArray": "androidx/design/internal/ParcelableSparseArray",
+      "android/support/design/internal/NavigationMenuView": "androidx/design/internal/NavigationMenuView",
+      "android/support/design/internal/ParcelableSparseArray$1": "androidx/design/internal/ParcelableSparseArray$1",
+      "android/support/design/internal/ScrimInsetsFrameLayout$1": "androidx/design/internal/ScrimInsetsFrameLayout$1",
+      "android/support/design/internal/ScrimInsetsFrameLayout": "androidx/design/internal/ScrimInsetsFrameLayout",
+      "android/support/design/R$style": "androidx/design/R$style",
+      "android/support/design/internal/SnackbarContentLayout": "androidx/design/internal/SnackbarContentLayout",
+      "android/support/design/widget/BaseTransientBottomBar$ContentViewCallback": "androidx/design/widget/BaseTransientBottomBar$ContentViewCallback",
+      "android/support/design/widget/BaseTransientBottomBar": "androidx/design/widget/BaseTransientBottomBar",
+      "android/support/design/internal/TextScale$1": "androidx/design/internal/TextScale$1",
+      "android/support/design/widget/AnimationUtils": "androidx/design/widget/AnimationUtils",
+      "android/support/design/widget/AppBarLayout$1": "androidx/design/widget/AppBarLayout$1",
+      "android/support/design/widget/AppBarLayout": "androidx/design/widget/AppBarLayout",
+      "android/support/design/widget/AppBarLayout$Behavior$1": "androidx/design/widget/AppBarLayout$Behavior$1",
+      "android/support/design/widget/AppBarLayout$Behavior": "androidx/design/widget/AppBarLayout$Behavior",
+      "android/support/design/widget/AppBarLayout$Behavior$DragCallback": "androidx/design/widget/AppBarLayout$Behavior$DragCallback",
+      "android/support/design/widget/AppBarLayout$Behavior$SavedState$1": "androidx/design/widget/AppBarLayout$Behavior$SavedState$1",
+      "android/support/design/widget/AppBarLayout$Behavior$SavedState": "androidx/design/widget/AppBarLayout$Behavior$SavedState",
+      "android/support/design/widget/HeaderBehavior": "androidx/design/widget/HeaderBehavior",
+      "android/support/design/widget/AppBarLayout$LayoutParams": "androidx/design/widget/AppBarLayout$LayoutParams",
+      "android/support/design/widget/AppBarLayout$ScrollingViewBehavior": "androidx/design/widget/AppBarLayout$ScrollingViewBehavior",
+      "android/support/design/widget/AppBarLayout$LayoutParams$ScrollFlags": "androidx/design/widget/AppBarLayout$LayoutParams$ScrollFlags",
+      "android/support/design/widget/AppBarLayout$OnOffsetChangedListener": "androidx/design/widget/AppBarLayout$OnOffsetChangedListener",
+      "android/support/design/widget/HeaderScrollingViewBehavior": "androidx/design/widget/HeaderScrollingViewBehavior",
+      "android/support/design/R$attr": "androidx/design/R$attr",
+      "android/support/design/widget/ThemeUtils": "androidx/design/widget/ThemeUtils",
+      "android/support/design/widget/ViewUtilsLollipop": "androidx/design/widget/ViewUtilsLollipop",
+      "android/support/design/widget/BaseTransientBottomBar$1": "androidx/design/widget/BaseTransientBottomBar$1",
+      "android/support/design/widget/BaseTransientBottomBar$10": "androidx/design/widget/BaseTransientBottomBar$10",
+      "android/support/design/widget/BaseTransientBottomBar$11": "androidx/design/widget/BaseTransientBottomBar$11",
+      "android/support/design/widget/BaseTransientBottomBar$SnackbarBaseLayout": "androidx/design/widget/BaseTransientBottomBar$SnackbarBaseLayout",
+      "android/support/design/widget/BaseTransientBottomBar$12": "androidx/design/widget/BaseTransientBottomBar$12",
+      "android/support/design/widget/BaseTransientBottomBar$2": "androidx/design/widget/BaseTransientBottomBar$2",
+      "android/support/design/widget/BaseTransientBottomBar$3": "androidx/design/widget/BaseTransientBottomBar$3",
+      "android/support/design/widget/SnackbarManager$Callback": "androidx/design/widget/SnackbarManager$Callback",
+      "android/support/design/widget/SnackbarManager": "androidx/design/widget/SnackbarManager",
+      "android/support/design/widget/BaseTransientBottomBar$4": "androidx/design/widget/BaseTransientBottomBar$4",
+      "android/support/design/widget/SwipeDismissBehavior$OnDismissListener": "androidx/design/widget/SwipeDismissBehavior$OnDismissListener",
+      "android/support/design/widget/BaseTransientBottomBar$BaseCallback": "androidx/design/widget/BaseTransientBottomBar$BaseCallback",
+      "android/support/design/widget/SwipeDismissBehavior": "androidx/design/widget/SwipeDismissBehavior",
+      "android/support/design/widget/BaseTransientBottomBar$5$1": "androidx/design/widget/BaseTransientBottomBar$5$1",
+      "android/support/design/widget/BaseTransientBottomBar$5": "androidx/design/widget/BaseTransientBottomBar$5",
+      "android/support/design/widget/BaseTransientBottomBar$OnAttachStateChangeListener": "androidx/design/widget/BaseTransientBottomBar$OnAttachStateChangeListener",
+      "android/support/design/widget/BaseTransientBottomBar$6": "androidx/design/widget/BaseTransientBottomBar$6",
+      "android/support/design/widget/BaseTransientBottomBar$OnLayoutChangeListener": "androidx/design/widget/BaseTransientBottomBar$OnLayoutChangeListener",
+      "android/support/design/widget/BaseTransientBottomBar$7": "androidx/design/widget/BaseTransientBottomBar$7",
+      "android/support/design/widget/BaseTransientBottomBar$8": "androidx/design/widget/BaseTransientBottomBar$8",
+      "android/support/design/widget/BaseTransientBottomBar$9": "androidx/design/widget/BaseTransientBottomBar$9",
+      "android/support/design/widget/BaseTransientBottomBar$BaseCallback$DismissEvent": "androidx/design/widget/BaseTransientBottomBar$BaseCallback$DismissEvent",
+      "android/support/design/widget/BaseTransientBottomBar$Behavior": "androidx/design/widget/BaseTransientBottomBar$Behavior",
+      "android/support/design/widget/BaseTransientBottomBar$Duration": "androidx/design/widget/BaseTransientBottomBar$Duration",
+      "android/support/design/R$anim": "androidx/design/R$anim",
+      "android/support/design/widget/BottomNavigationView$1": "androidx/design/widget/BottomNavigationView$1",
+      "android/support/design/widget/BottomNavigationView": "androidx/design/widget/BottomNavigationView",
+      "android/support/design/widget/BottomNavigationView$OnNavigationItemReselectedListener": "androidx/design/widget/BottomNavigationView$OnNavigationItemReselectedListener",
+      "android/support/design/widget/BottomNavigationView$OnNavigationItemSelectedListener": "androidx/design/widget/BottomNavigationView$OnNavigationItemSelectedListener",
+      "android/support/design/widget/BottomNavigationView$SavedState$1": "androidx/design/widget/BottomNavigationView$SavedState$1",
+      "android/support/design/widget/BottomNavigationView$SavedState": "androidx/design/widget/BottomNavigationView$SavedState",
+      "android/support/design/R$color": "androidx/design/R$color",
+      "android/support/design/widget/BottomSheetBehavior$1": "androidx/design/widget/BottomSheetBehavior$1",
+      "android/support/design/widget/BottomSheetBehavior": "androidx/design/widget/BottomSheetBehavior",
+      "android/support/design/widget/BottomSheetBehavior$2": "androidx/design/widget/BottomSheetBehavior$2",
+      "android/support/design/widget/BottomSheetBehavior$SettleRunnable": "androidx/design/widget/BottomSheetBehavior$SettleRunnable",
+      "android/support/design/widget/BottomSheetBehavior$BottomSheetCallback": "androidx/design/widget/BottomSheetBehavior$BottomSheetCallback",
+      "android/support/design/widget/BottomSheetBehavior$SavedState$1": "androidx/design/widget/BottomSheetBehavior$SavedState$1",
+      "android/support/design/widget/BottomSheetBehavior$SavedState": "androidx/design/widget/BottomSheetBehavior$SavedState",
+      "android/support/design/widget/BottomSheetBehavior$State": "androidx/design/widget/BottomSheetBehavior$State",
+      "android/support/design/widget/BottomSheetDialog$1": "androidx/design/widget/BottomSheetDialog$1",
+      "android/support/design/widget/BottomSheetDialog": "androidx/design/widget/BottomSheetDialog",
+      "android/support/design/widget/BottomSheetDialog$2": "androidx/design/widget/BottomSheetDialog$2",
+      "android/support/design/widget/BottomSheetDialog$3": "androidx/design/widget/BottomSheetDialog$3",
+      "android/support/design/widget/BottomSheetDialog$4": "androidx/design/widget/BottomSheetDialog$4",
+      "android/support/design/widget/BottomSheetDialogFragment": "androidx/design/widget/BottomSheetDialogFragment",
+      "android/support/design/widget/CheckableImageButton$1": "androidx/design/widget/CheckableImageButton$1",
+      "android/support/design/widget/CheckableImageButton": "androidx/design/widget/CheckableImageButton",
+      "android/support/design/widget/CircularBorderDrawable": "androidx/design/widget/CircularBorderDrawable",
+      "android/support/design/widget/CircularBorderDrawableLollipop": "androidx/design/widget/CircularBorderDrawableLollipop",
+      "android/support/design/widget/CollapsingTextHelper": "androidx/design/widget/CollapsingTextHelper",
+      "android/support/design/widget/CollapsingToolbarLayout$1": "androidx/design/widget/CollapsingToolbarLayout$1",
+      "android/support/design/widget/CollapsingToolbarLayout": "androidx/design/widget/CollapsingToolbarLayout",
+      "android/support/design/widget/CollapsingToolbarLayout$2": "androidx/design/widget/CollapsingToolbarLayout$2",
+      "android/support/design/widget/CollapsingToolbarLayout$LayoutParams$CollapseMode": "androidx/design/widget/CollapsingToolbarLayout$LayoutParams$CollapseMode",
+      "android/support/design/widget/CollapsingToolbarLayout$LayoutParams": "androidx/design/widget/CollapsingToolbarLayout$LayoutParams",
+      "android/support/design/widget/CollapsingToolbarLayout$OffsetUpdateListener": "androidx/design/widget/CollapsingToolbarLayout$OffsetUpdateListener",
+      "android/support/design/widget/ViewOffsetHelper": "androidx/design/widget/ViewOffsetHelper",
+      "android/support/design/widget/DrawableUtils": "androidx/design/widget/DrawableUtils",
+      "android/support/design/widget/FloatingActionButton$1": "androidx/design/widget/FloatingActionButton$1",
+      "android/support/design/widget/FloatingActionButtonImpl$InternalVisibilityChangedListener": "androidx/design/widget/FloatingActionButtonImpl$InternalVisibilityChangedListener",
+      "android/support/design/widget/FloatingActionButton": "androidx/design/widget/FloatingActionButton",
+      "android/support/design/widget/FloatingActionButton$OnVisibilityChangedListener": "androidx/design/widget/FloatingActionButton$OnVisibilityChangedListener",
+      "android/support/design/widget/FloatingActionButtonImpl": "androidx/design/widget/FloatingActionButtonImpl",
+      "android/support/design/widget/FloatingActionButton$Behavior": "androidx/design/widget/FloatingActionButton$Behavior",
+      "android/support/design/widget/FloatingActionButton$ShadowDelegateImpl": "androidx/design/widget/FloatingActionButton$ShadowDelegateImpl",
+      "android/support/design/widget/ShadowViewDelegate": "androidx/design/widget/ShadowViewDelegate",
+      "android/support/design/widget/FloatingActionButton$Size": "androidx/design/widget/FloatingActionButton$Size",
+      "android/support/design/widget/VisibilityAwareImageButton": "androidx/design/widget/VisibilityAwareImageButton",
+      "android/support/design/widget/ViewUtils": "androidx/design/widget/ViewUtils",
+      "android/support/design/widget/FloatingActionButtonLollipop": "androidx/design/widget/FloatingActionButtonLollipop",
+      "android/support/design/widget/FloatingActionButtonImpl$1": "androidx/design/widget/FloatingActionButtonImpl$1",
+      "android/support/design/widget/FloatingActionButtonImpl$2": "androidx/design/widget/FloatingActionButtonImpl$2",
+      "android/support/design/widget/FloatingActionButtonImpl$3": "androidx/design/widget/FloatingActionButtonImpl$3",
+      "android/support/design/widget/FloatingActionButtonImpl$DisabledElevationAnimation": "androidx/design/widget/FloatingActionButtonImpl$DisabledElevationAnimation",
+      "android/support/design/widget/FloatingActionButtonImpl$ShadowAnimatorImpl": "androidx/design/widget/FloatingActionButtonImpl$ShadowAnimatorImpl",
+      "android/support/design/widget/FloatingActionButtonImpl$ElevateToTranslationZAnimation": "androidx/design/widget/FloatingActionButtonImpl$ElevateToTranslationZAnimation",
+      "android/support/design/widget/FloatingActionButtonImpl$ResetElevationAnimation": "androidx/design/widget/FloatingActionButtonImpl$ResetElevationAnimation",
+      "android/support/design/widget/ShadowDrawableWrapper": "androidx/design/widget/ShadowDrawableWrapper",
+      "android/support/design/widget/StateListAnimator": "androidx/design/widget/StateListAnimator",
+      "android/support/design/widget/FloatingActionButtonLollipop$AlwaysStatefulGradientDrawable": "androidx/design/widget/FloatingActionButtonLollipop$AlwaysStatefulGradientDrawable",
+      "android/support/design/widget/HeaderBehavior$FlingRunnable": "androidx/design/widget/HeaderBehavior$FlingRunnable",
+      "android/support/design/widget/ViewOffsetBehavior": "androidx/design/widget/ViewOffsetBehavior",
+      "android/support/design/widget/NavigationView$1": "androidx/design/widget/NavigationView$1",
+      "android/support/design/widget/NavigationView": "androidx/design/widget/NavigationView",
+      "android/support/design/widget/NavigationView$OnNavigationItemSelectedListener": "androidx/design/widget/NavigationView$OnNavigationItemSelectedListener",
+      "android/support/design/widget/NavigationView$SavedState$1": "androidx/design/widget/NavigationView$SavedState$1",
+      "android/support/design/widget/NavigationView$SavedState": "androidx/design/widget/NavigationView$SavedState",
+      "android/support/design/widget/Snackbar$1": "androidx/design/widget/Snackbar$1",
+      "android/support/design/widget/Snackbar": "androidx/design/widget/Snackbar",
+      "android/support/design/widget/Snackbar$Callback": "androidx/design/widget/Snackbar$Callback",
+      "android/support/design/widget/Snackbar$SnackbarLayout": "androidx/design/widget/Snackbar$SnackbarLayout",
+      "android/support/design/widget/SnackbarManager$1": "androidx/design/widget/SnackbarManager$1",
+      "android/support/design/widget/SnackbarManager$SnackbarRecord": "androidx/design/widget/SnackbarManager$SnackbarRecord",
+      "android/support/design/widget/StateListAnimator$1": "androidx/design/widget/StateListAnimator$1",
+      "android/support/design/widget/StateListAnimator$Tuple": "androidx/design/widget/StateListAnimator$Tuple",
+      "android/support/design/widget/SwipeDismissBehavior$1": "androidx/design/widget/SwipeDismissBehavior$1",
+      "android/support/design/widget/SwipeDismissBehavior$SettleRunnable": "androidx/design/widget/SwipeDismissBehavior$SettleRunnable",
+      "android/support/design/widget/SwipeDismissBehavior$SwipeDirection": "androidx/design/widget/SwipeDismissBehavior$SwipeDirection",
+      "android/support/design/widget/TabItem": "androidx/design/widget/TabItem",
+      "android/support/design/widget/TabLayout$1": "androidx/design/widget/TabLayout$1",
+      "android/support/design/widget/TabLayout": "androidx/design/widget/TabLayout",
+      "android/support/design/widget/TabLayout$AdapterChangeListener": "androidx/design/widget/TabLayout$AdapterChangeListener",
+      "android/support/design/widget/TabLayout$Mode": "androidx/design/widget/TabLayout$Mode",
+      "android/support/design/widget/TabLayout$OnTabSelectedListener": "androidx/design/widget/TabLayout$OnTabSelectedListener",
+      "android/support/design/widget/TabLayout$Tab": "androidx/design/widget/TabLayout$Tab",
+      "android/support/design/widget/TabLayout$PagerAdapterObserver": "androidx/design/widget/TabLayout$PagerAdapterObserver",
+      "android/support/design/widget/TabLayout$SlidingTabStrip$1": "androidx/design/widget/TabLayout$SlidingTabStrip$1",
+      "android/support/design/widget/TabLayout$SlidingTabStrip": "androidx/design/widget/TabLayout$SlidingTabStrip",
+      "android/support/design/widget/TabLayout$SlidingTabStrip$2": "androidx/design/widget/TabLayout$SlidingTabStrip$2",
+      "android/support/design/widget/TabLayout$TabView": "androidx/design/widget/TabLayout$TabView",
+      "android/support/design/widget/TabLayout$TabGravity": "androidx/design/widget/TabLayout$TabGravity",
+      "android/support/design/widget/TabLayout$TabLayoutOnPageChangeListener": "androidx/design/widget/TabLayout$TabLayoutOnPageChangeListener",
+      "android/support/design/widget/TabLayout$ViewPagerOnTabSelectedListener": "androidx/design/widget/TabLayout$ViewPagerOnTabSelectedListener",
+      "android/support/design/widget/TextInputEditText": "androidx/design/widget/TextInputEditText",
+      "android/support/design/widget/TextInputLayout$1": "androidx/design/widget/TextInputLayout$1",
+      "android/support/design/widget/TextInputLayout": "androidx/design/widget/TextInputLayout",
+      "android/support/design/widget/TextInputLayout$2": "androidx/design/widget/TextInputLayout$2",
+      "android/support/design/widget/TextInputLayout$3": "androidx/design/widget/TextInputLayout$3",
+      "android/support/design/widget/TextInputLayout$4": "androidx/design/widget/TextInputLayout$4",
+      "android/support/design/widget/TextInputLayout$5": "androidx/design/widget/TextInputLayout$5",
+      "android/support/design/widget/TextInputLayout$SavedState$1": "androidx/design/widget/TextInputLayout$SavedState$1",
+      "android/support/design/widget/TextInputLayout$SavedState": "androidx/design/widget/TextInputLayout$SavedState",
+      "android/support/design/widget/TextInputLayout$TextInputAccessibilityDelegate": "androidx/design/widget/TextInputLayout$TextInputAccessibilityDelegate",
+      "android/support/design/R$string": "androidx/design/R$string",
+      "android/support/design/R$integer": "androidx/design/R$integer",
+      "android/support/text/emoji/bundled/BundledEmojiCompatConfig$1": "androidx/text/emoji/bundled/BundledEmojiCompatConfig$1",
+      "android/support/text/emoji/bundled/BundledEmojiCompatConfig": "androidx/text/emoji/bundled/BundledEmojiCompatConfig",
+      "android/support/text/emoji/bundled/BundledEmojiCompatConfig$BundledMetadataLoader": "androidx/text/emoji/bundled/BundledEmojiCompatConfig$BundledMetadataLoader",
+      "android/support/text/emoji/bundled/BundledEmojiCompatConfig$InitRunnable": "androidx/text/emoji/bundled/BundledEmojiCompatConfig$InitRunnable",
+      "android/arch/lifecycle/AndroidViewModel": "androidx/lifecycle/AndroidViewModel",
+      "android/arch/lifecycle/ViewModel": "androidx/lifecycle/ViewModel",
+      "android/arch/lifecycle/ViewModelProvider$NewInstanceFactory": "androidx/lifecycle/ViewModelProvider$NewInstanceFactory",
+      "android/arch/persistence/room/ForeignKey": "androidx/persistence/room/ForeignKey",
+      "android/arch/persistence/room/ForeignKey$Action": "androidx/persistence/room/ForeignKey$Action",
+      "android/arch/persistence/room/OnConflictStrategy": "androidx/persistence/room/OnConflictStrategy",
+      "android/arch/persistence/room/Index": "androidx/persistence/room/Index",
+      "android/arch/persistence/room/ColumnInfo$Collate": "androidx/persistence/room/ColumnInfo$Collate",
+      "android/arch/persistence/room/RoomWarnings": "androidx/persistence/room/RoomWarnings",
+      "android/support/v4/app/NotificationCompat$Action$SemanticAction": "androidx/app/NotificationCompat$Action$SemanticAction",
+      "android/support/v4/graphics/TypefaceCompatApi28Impl": "androidx/graphics/TypefaceCompatApi28Impl",
+      "android/support/v7/util/AdapterListUpdateCallback": "androidx/widget/recyclerview/AdapterListUpdateCallback",
+      "android/support/v7/recyclerview/extensions/ListAdapterConfig$Builder$MainThreadExecutor": "androidx/widget/recyclerview/ListAdapterConfig$Builder$MainThreadExecutor"
     }
   },
   "proGuardMap": {
-    "rules": {}
+    "rules": {
+      "android/support/transition/ChangeBounds$*": "androidx/transition/ChangeBounds$*",
+      "android/support/graphics/drawable/VectorDrawableCompat$*": "androidx/graphics/drawable/VectorDrawableCompat$*"
+    }
   }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/config/ConfigParserTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/config/ConfigParserTest.kt
index 4a03ef3..97cfc2f 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/config/ConfigParserTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/config/ConfigParserTest.kt
@@ -44,7 +44,12 @@
                 "                {groupId: \"g\", artifactId: \"a\", version: \"2.0\"} \n" +
                 "            ]\n" +
                 "        }\n" +
-                "    ]\n" +
+                "    ],\n" +
+                "   proGuardMap: {\n" +
+                "       rules: {\n" +
+                "           \"android/support/**\": \"androidx/**\"\n" +
+                "       }\n" +
+                "    }" +
                 "}"
 
         val config = ConfigParser.parseFromString(confStr)
@@ -52,6 +57,7 @@
         Truth.assertThat(config).isNotNull()
         Truth.assertThat(config!!.restrictToPackagePrefixes[0]).isEqualTo("android/support/")
         Truth.assertThat(config.rewriteRules.size).isEqualTo(2)
+        Truth.assertThat(config.proGuardMap.rules.size).isEqualTo(1)
     }
 }
 
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/map/MapGenerationTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/map/MapGenerationTest.kt
index ecf9ccf..6f4eb59 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/map/MapGenerationTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/map/MapGenerationTest.kt
@@ -17,7 +17,6 @@
 package android.support.tools.jetifier.core.map
 
 import android.support.tools.jetifier.core.config.Config
-import android.support.tools.jetifier.core.rules.JavaField
 import android.support.tools.jetifier.core.rules.JavaType
 import android.support.tools.jetifier.core.rules.RewriteRule
 import android.support.tools.jetifier.core.transform.proguard.ProGuardTypesMap
@@ -40,8 +39,6 @@
             .mapInto(
                 types = mapOf(
                     "android/support/v7/pref/Preference" to "android/test/pref/Preference"
-                ),
-                fields = mapOf(
                 )
             )
             .andIsComplete()
@@ -63,8 +60,6 @@
             .mapInto(
                 types = mapOf(
                     "android/support/v7/pref/Preference" to "android/test/pref/Preference"
-                ),
-                fields = mapOf(
                 )
             )
             .andIsComplete()
@@ -89,8 +84,6 @@
                     "android/support/v7/pref/Preference" to "android/test/pref/Preference",
                     "android/support/v14/pref/PreferenceDialog"
                         to "android/test/pref/PreferenceDialog"
-                ),
-                fields = mapOf(
                 )
             )
             .andIsComplete()
@@ -114,166 +107,16 @@
                     "android/support/v7/pref/Preference" to "android/fallback/v7/pref/Preference",
                     "android/support/v14/pref/PreferenceDialog"
                         to "android/test/pref/PreferenceDialog"
-                ),
-                fields = mapOf(
                 )
             )
             .andIsComplete()
     }
 
-    @Test fun mapTwoFields_usingOneTypeRule() {
-        ScanTester
-            .testThatRules(
-                RewriteRule("android/support/v7/(.*)", "android/test/{0}")
-            )
-            .withAllowedPrefixes(
-                "android/support/"
-            )
-            .forGivenFields(
-                JavaField("android/support/v7/pref/Preference", "count"),
-                JavaField("android/support/v7/pref/Preference", "min")
-            )
-            .mapInto(
-                types = mapOf(
-                ),
-                fields = mapOf(
-                    "android/support/v7/pref/Preference" to mapOf(
-                        "android/test/pref/Preference" to listOf(
-                            "count",
-                            "min"
-                        )
-                    )
-                )
-            )
-            .andIsComplete()
-    }
-
-    @Test fun mapFieldInInnerClass_usingOneTypeRule() {
-        ScanTester
-            .testThatRules(
-                RewriteRule("android/support/v7/(.*)", "android/test/{0}")
-            )
-            .withAllowedPrefixes(
-                "android/support/"
-            )
-            .forGivenFields(
-                JavaField("android/support/v7/pref/R\$attr", "border")
-            )
-            .mapInto(
-                types = mapOf(
-                ),
-                fields = mapOf(
-                    "android/support/v7/pref/R\$attr" to mapOf(
-                        "android/test/pref/R\$attr" to listOf(
-                            "border"
-                        )
-                    )
-                )
-            )
-            .andIsComplete()
-    }
-
-    @Test fun mapPrivateFields_shouldIgnore() {
-        ScanTester
-            .testThatRules(
-                RewriteRule("android/support/v7/(.*)", "android/test/{0}")
-            )
-            .withAllowedPrefixes(
-                "android/support/"
-            )
-            .forGivenFields(
-                JavaField("android/support/v7/pref/Preference", "mCount"),
-                JavaField("android/support/v7/pref/Preference", "this$0")
-            )
-            .mapInto(
-                types = mapOf(
-                ),
-                fields = mapOf(
-                )
-            )
-            .andIsComplete()
-    }
-
-    @Test fun mapType_usingFieldSelector_shouldNotApply() {
-        ScanTester
-            .testThatRules(
-                RewriteRule("android/support/v7/(.*)", "android/test/{0}", listOf("count"))
-            )
-            .withAllowedPrefixes(
-                "android/support/"
-            )
-            .forGivenTypes(
-                JavaType("android/support/v7/pref/Preference")
-            )
-            .mapInto(
-                types = mapOf(
-                    "android/support/v7/pref/Preference" to "android/support/v7/pref/Preference"
-                ),
-                fields = mapOf(
-                )
-            )
-            .andIsNotComplete()
-    }
-
-    @Test fun mapField_noApplicableRule() {
-        ScanTester
-            .testThatRules(
-                RewriteRule("android/support/v7/(.*)", "android/test/{0}", listOf("count2"))
-            )
-            .withAllowedPrefixes(
-                "android/support/"
-            )
-            .forGivenFields(
-                JavaField("android/support/v7/pref/Preference", "count")
-            )
-            .mapInto(
-                types = mapOf(
-                ),
-                fields = mapOf(
-                    "android/support/v7/pref/Preference" to mapOf(
-                        "android/support/v7/pref/Preference" to listOf(
-                            "count"
-                        )
-                    )
-                )
-            )
-            .andIsNotComplete()
-    }
-
-    @Test fun mapTwoFields_usingTwoFieldsSelectors() {
-        ScanTester
-            .testThatRules(
-                RewriteRule("android/support/v7/(.*)", "android/test/{0}", listOf("count")),
-                RewriteRule("android/support/v7/(.*)", "android/test2/{0}", listOf("size"))
-            )
-            .withAllowedPrefixes(
-                "android/support/"
-            )
-            .forGivenFields(
-                JavaField("android/support/v7/pref/Preference", "count"),
-                JavaField("android/support/v7/pref/Preference", "size")
-            )
-            .mapInto(
-                types = mapOf(
-                ),
-                fields = mapOf(
-                    "android/support/v7/pref/Preference" to mapOf(
-                        "android/test/pref/Preference" to listOf(
-                            "count"
-                        ),
-                        "android/test2/pref/Preference" to listOf(
-                            "size"
-                        )
-                    )
-                )
-            )
-            .andIsComplete()
-    }
-
-    @Test fun mapTwoTypes_shouldIgnoreOne() {
+    @Test fun mapTwoTypes_shouldIgnoreFirstTwo() {
         ScanTester
             .testThatRules(
                 RewriteRule("android/support/v7/(.*)", "ignore"),
+                RewriteRule("android/support/v8/(.*)", "ignoreInPreprocessorOnly"),
                 RewriteRule("android/support/v14/(.*)", "android/test/{0}")
             )
             .withAllowedPrefixes(
@@ -281,40 +124,12 @@
             )
             .forGivenTypes(
                 JavaType("android/support/v7/pref/Preference"),
+                JavaType("android/support/v8/pref/Preference"),
                 JavaType("android/support/v14/pref/Preference")
             )
             .mapInto(
                 types = mapOf(
                     "android/support/v14/pref/Preference" to "android/test/pref/Preference"
-                ),
-                fields = mapOf(
-                )
-            )
-            .andIsComplete()
-    }
-
-    @Test fun mapTwoFields_shouldIgnoreOne() {
-        ScanTester
-            .testThatRules(
-                RewriteRule("android/support/v7/(.*)", "ignore"),
-                RewriteRule("android/support/v14/(.*)", "android/test/{0}")
-            )
-            .withAllowedPrefixes(
-                "android/support/"
-            )
-            .forGivenFields(
-                JavaField("android/support/v7/pref/Preference", "count"),
-                JavaField("android/support/v14/pref/Preference", "size")
-            )
-            .mapInto(
-                types = mapOf(
-                ),
-                fields = mapOf(
-                    "android/support/v14/pref/Preference" to mapOf(
-                        "android/test/pref/Preference" to listOf(
-                            "size"
-                        )
-                    )
                 )
             )
             .andIsComplete()
@@ -333,7 +148,6 @@
             class Step2(private val rules: List<RewriteRule>, private val prefixes: List<String>) {
 
                 private val allTypes: MutableList<JavaType> = mutableListOf()
-                private val allFields: MutableList<JavaField> = mutableListOf()
                 private var wasMapIncomplete = false
 
 
@@ -342,29 +156,23 @@
                     return this
                 }
 
-                fun forGivenFields(vararg fields: JavaField): Step2 {
-                    allFields.addAll(fields)
-                    return this
-                }
 
-                fun mapInto(types: Map<String, String>,
-                            fields: Map<String, Map<String, List<String>>>): Step2 {
+                fun mapInto(types: Map<String, String>): Step2 {
                     val config = Config(
                         restrictToPackagePrefixes = prefixes,
                         rewriteRules = rules,
+                        slRules = emptyList(),
                         pomRewriteRules = emptyList(),
                         typesMap = TypesMap.EMPTY,
                         proGuardMap = ProGuardTypesMap.EMPTY)
                     val scanner = MapGeneratorRemapper(config)
 
                     allTypes.forEach { scanner.rewriteType(it) }
-                    allFields.forEach { scanner.rewriteField(it) }
 
                     val typesMap = scanner.createTypesMap().toJson()
                     wasMapIncomplete = scanner.isMapNotComplete
 
                     Truth.assertThat(typesMap.types).containsExactlyEntriesIn(types)
-                    Truth.assertThat(typesMap.fields).containsExactlyEntriesIn(fields)
                     return this
                 }
 
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/RewriteRuleTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/RewriteRuleTest.kt
index 298d46c..ebb48dd 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/RewriteRuleTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/RewriteRuleTest.kt
@@ -1,3 +1,4 @@
+
 /*
  * Copyright (C) 2017 The Android Open Source Project
  *
@@ -16,13 +17,11 @@
 
 package android.support.tools.jetifier.core.transform
 
-import android.support.tools.jetifier.core.rules.JavaField
 import android.support.tools.jetifier.core.rules.JavaType
 import android.support.tools.jetifier.core.rules.RewriteRule
 import com.google.common.truth.Truth
 import org.junit.Test
 
-
 class RewriteRuleTest {
 
     @Test fun noRegEx_shouldRewrite() {
@@ -53,14 +52,6 @@
             .into("A/C\$D")
     }
 
-    @Test fun fieldRule_noRegEx_shouldRewrite() {
-        RuleTester
-            .testThatRule("A/B", "A/C")
-            .withFieldSelector("MyField")
-            .rewritesField("A/B", "MyField")
-            .into("A/C", "MyField")
-    }
-
     @Test fun fieldRule_innerClass_groupRegEx_shouldRewrite() {
         RuleTester
             .testThatRule("A/B$(.*)", "A/C\${0}")
@@ -68,13 +59,19 @@
             .into("A/C\$D")
     }
 
-    @Test fun noFieldRule_shouldRewriteEvenWithField() {
+    @Test fun typeRewrite_ignore() {
         RuleTester
-            .testThatRule("A/B", "A/C")
-            .rewritesField("A/B", "test")
-            .into("A/C", "test")
+            .testThatRule("A/B", "ignore")
+            .rewritesType("A/B")
+            .isIgnored()
     }
 
+    @Test fun typeRewrite_ignoreInPreprocessor() {
+        RuleTester
+            .testThatRule("A/B", "ignoreInPreprocessorOnly")
+            .rewritesType("A/B")
+            .isIgnored()
+    }
 
     object RuleTester {
 
@@ -82,53 +79,31 @@
 
         class RuleTesterStep1(val from: String, val to: String) {
 
-            val fieldSelectors: MutableList<String> = mutableListOf()
-
-            fun withFieldSelector(input: String): RuleTesterStep1 {
-                fieldSelectors.add(input)
-                return this
-            }
-
-            fun rewritesField(inputType: String, inputField: String)
-                    = RuleTesterFinalFieldStep(from, to, inputType, inputField, fieldSelectors)
-
             fun rewritesType(inputType: String)
-                    = RuleTesterFinalTypeStep(from, to, inputType, fieldSelectors)
-        }
-
-        class RuleTesterFinalFieldStep(val fromType: String,
-                                       val toType: String,
-                                       val inputType: String,
-                                       val inputField: String,
-                                       val fieldSelectors: List<String>) {
-
-            fun into(expectedTypeName: String, expectedFieldName: String) {
-                val fieldRule = RewriteRule(fromType, toType, fieldSelectors)
-                val result = fieldRule.apply(JavaField(inputType, inputField))
-                Truth.assertThat(result).isNotNull()
-
-                Truth.assertThat(result.result!!.owner.fullName).isEqualTo(expectedTypeName)
-                Truth.assertThat(result.result!!.name).isEqualTo(expectedFieldName)
-            }
-
+                    = RuleTesterFinalTypeStep(from, to, inputType)
         }
 
         class RuleTesterFinalTypeStep(val fromType: String,
                                       val toType: String,
-                                      val inputType: String,
-                                      val fieldSelectors: List<String>) {
+                                      val inputType: String) {
 
             fun into(expectedResult: String) {
-                val fieldRule = RewriteRule(fromType, toType, fieldSelectors)
+                val fieldRule = RewriteRule(fromType, toType)
                 val result = fieldRule.apply(JavaType(inputType))
-                Truth.assertThat(result).isNotNull()
 
                 Truth.assertThat(result).isNotNull()
                 Truth.assertThat(result.result!!.fullName).isEqualTo(expectedResult)
             }
 
-        }
-    }
+            fun isIgnored() {
+                val fieldRule = RewriteRule(fromType, toType)
+                val result = fieldRule.apply(JavaType(inputType))
 
+                Truth.assertThat(result).isNotNull()
+                Truth.assertThat(result.isIgnored).isTrue()
+            }
+        }
+
+    }
 }
 
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt
new file mode 100644
index 0000000..3b189e6
--- /dev/null
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt
@@ -0,0 +1,200 @@
+package android.support.tools.jetifier.core.transform.bytecode
+
+import android.support.tools.jetifier.core.Processor
+import android.support.tools.jetifier.core.archive.Archive
+import android.support.tools.jetifier.core.archive.ArchiveFile
+import android.support.tools.jetifier.core.archive.ArchiveItemVisitor
+import android.support.tools.jetifier.core.config.Config
+import android.support.tools.jetifier.core.map.TypesMap
+import android.support.tools.jetifier.core.rules.JavaType
+import android.support.tools.jetifier.core.rules.RewriteRule
+import android.support.tools.jetifier.core.transform.proguard.ProGuardTypesMap
+import com.google.common.truth.Truth
+import org.junit.Test
+import java.io.File
+
+/**
+ * Tests that individual files were moved properly due to their owner types rewrites.
+ */
+class ClassFilesMoveTest {
+
+    companion object {
+        private val TEST_CONFIG = Config(
+            restrictToPackagePrefixes = listOf("android/support"),
+            rewriteRules = listOf(
+                RewriteRule("android/support/annotation/(.*)", "ignore"),
+                RewriteRule("android/support/v7/preference/R(.*)", "ignore"),
+                RewriteRule("android/support/v4/(.*)", "ignore")
+            ),
+            slRules = listOf(
+                RewriteRule("android/support/annotation/(.*)", "ignore"),
+                RewriteRule("android/support/v7/preference/R(.*)", "ignore"),
+                RewriteRule("android/support/v4/(.*)", "ignore")
+            ),
+            pomRewriteRules = emptyList(),
+            typesMap = TypesMap(mapOf(
+                "android/support/v7/preference/Preference"
+                    to "androidx/support/preference/Preference",
+                "android/support/v7/preference/Preference\$1"
+                    to "androidx/support/preference/Preference\$1",
+                "android/support/v7/preference/TwoStatePreference"
+                    to "androidx/support/preference/TwoStatePreference",
+                "android/support/v7/preference/PreferenceGroup"
+                    to "androidx/support/preference/PreferenceGroup",
+                "android/support/v7/preference/Preference\$OnPreferenceChangeListener"
+                    to "androidx/support/preference/Preference\$OnPreferenceChangeListener",
+                "android/support/v7/preference/Preference\$OnPreferenceClickListener"
+                    to "androidx/support/preference/Preference\$OnPreferenceClickListener",
+                "android/support/v7/preference/Preference\$OnPreferenceChangeInternalListener"
+                    to "androidx/support/preference/Preference\$OnPreferenceChangeInternalListener",
+                "android/support/v7/preference/PreferenceManager\$OnPreferenceTreeClickListener"
+                    to "androidx/support/preference/PreferenceManager\$OnPreferenceTreeClickLisnr",
+                "android/support/v7/preference/PreferenceViewHolder"
+                    to "androidx/support/preference/PreferenceViewHolder",
+                "android/support/v7/preference/PreferenceManager"
+                    to "androidx/support/preference/PreferenceManager",
+                "android/support/v14/preference/SwitchPreference"
+                    to "androidx/support/preference/SwitchPreference",
+                "android/support/v14/preference/SwitchPreference\$1"
+                    to "androidx/support/preference/SwitchPreference\$1",
+                "android/support/v14/preference/SwitchPreference\$Listener"
+                    to "androidx/support/preference/SwitchPreference\$Listener",
+                "android/support/v7/preference/PreferenceDataStore"
+                    to "androidx/support/preference/PreferenceDataStore",
+                "android/support/v7/preference/Preference\$BaseSavedState"
+                    to "androidx/support/preference/Preference\$BaseSavedState"
+            ).map { JavaType(it.key) to JavaType(it.value) }.toMap()),
+            proGuardMap = ProGuardTypesMap.EMPTY
+        )
+    }
+
+    /**
+     * Tests that after rewrite of a input archive the internal classes are properly moved to new
+     * locations (based on the rewrite rules) which is compared with the expected archive.
+     *
+     * Note: The expected archive does not contain rewritten classes - they were only manually
+     * moved. Which is fine because this test validates only files locations.
+     *
+     * Note: This runs in support library rewrite mode which allows to move classes around.
+     */
+    @Test fun fileMove_forwardRewrite_shouldMoveFilesProperly() {
+        val inputZipPath = "/fileRenameTest/inputTestLib.zip"
+        val expectedZipPath = "/fileRenameTest/expectedTestLib.zip"
+
+        val processor = Processor.createProcessor(TEST_CONFIG, rewritingSupportLib = true)
+        val inputFile = File(javaClass.getResource(inputZipPath).file)
+
+        val tempDir = createTempDir()
+        val result = processor.transform(setOf(inputFile), tempDir.toPath(), true)
+
+        Truth.assertThat(result.filesToAdd).hasSize(1)
+        testArchivesAreSame(result.filesToAdd.first(),
+            File(javaClass.getResource(expectedZipPath).file))
+
+        tempDir.delete()
+    }
+
+    /**
+     * Does exactly the same as [fileMove_forwardRewrite_nestedArchive_shouldMoveFilesProperly] but
+     * the files are in a nested archive e.g. archive.zip/classes.jar/some files.
+     */
+    @Test fun fileMove_forwardRewrite_nestedArchive_shouldMoveFilesProperly() {
+        val inputZipPath = "/fileRenameTest/inputTestLibNested.zip"
+        val expectedZipPath = "/fileRenameTest/expectedTestLibNested.zip"
+
+        val processor = Processor.createProcessor(TEST_CONFIG, rewritingSupportLib = true)
+        val inputFile = File(javaClass.getResource(inputZipPath).file)
+
+        val tempDir = createTempDir()
+        val result = processor.transform(setOf(inputFile), tempDir.toPath(), true)
+
+        Truth.assertThat(result.filesToAdd).hasSize(1)
+        testArchivesAreSame(result.filesToAdd.first(),
+            File(javaClass.getResource(expectedZipPath).file))
+
+        tempDir.delete()
+    }
+
+    /**
+     * Rewrites the input archive and then applies reversed mode to rewrite it back. The final
+     * produced archive has to have the same directory structure as the input one.
+     *
+     * Note: This runs in support library rewrite mode which allows to move classes around.
+     */
+    @Test fun fileMove_forwardRewrite_backwardsRewrite_shouldKeepFilesProperly() {
+        val inputZipPath = "/fileRenameTest/inputTestLib.zip"
+
+        // Transform forward
+        val processor = Processor.createProcessor(TEST_CONFIG,
+            rewritingSupportLib = true)
+        val inputFile = File(javaClass.getResource(inputZipPath).file)
+        val tempDir = createTempDir()
+        val result = processor.transform(setOf(inputFile), tempDir.toPath(), true)
+
+        // Take previous result & reverse it
+        val processor2 = Processor.createProcessor(TEST_CONFIG,
+            rewritingSupportLib = true,
+            reversedMode = true)
+        val result2 = processor2.transform(setOf(result.filesToAdd.first()), tempDir.toPath(), true)
+
+        testArchivesAreSame(result2.filesToAdd.first(),
+            File(javaClass.getResource(inputZipPath).file))
+
+        tempDir.delete()
+    }
+
+    /**
+     * Runs the rewrite but with support library rewrite mode off which means that none of the files
+     * should be moved.
+     */
+    @Test fun fileMove_forwardRewrite_noSupportLibMode_noFilesMove() {
+        val inputZipPath = "/fileRenameTest/inputTestLib.zip"
+
+        val processor = Processor.createProcessor(TEST_CONFIG, rewritingSupportLib = false)
+        val inputFile = File(javaClass.getResource(inputZipPath).file)
+
+        val tempDir = createTempDir()
+        val result = processor.transform(setOf(inputFile), tempDir.toPath(), true)
+
+        Truth.assertThat(result.filesToAdd).hasSize(1)
+        testArchivesAreSame(result.filesToAdd.first(),
+            File(javaClass.getResource(inputZipPath).file))
+
+        tempDir.delete()
+    }
+
+    fun testArchivesAreSame(givenZip: File, expectedZip: File) {
+        testArchivesAreSame(Archive.Builder.extract(givenZip), Archive.Builder.extract(expectedZip))
+    }
+
+    fun testArchivesAreSame(givenZip: Archive, expectedZip: Archive) {
+        val givenFiles = ArchiveBrowser.grabAllPathsIn(givenZip)
+        val expectedFiles = ArchiveBrowser.grabAllPathsIn(expectedZip)
+        Truth.assertThat(givenFiles).containsExactlyElementsIn(expectedFiles)
+    }
+
+    /**
+     * Just a helper utility to get all file paths in the archive.
+     */
+    class ArchiveBrowser : ArchiveItemVisitor {
+
+        companion object {
+            fun grabAllPathsIn(archive: Archive): MutableSet<String> {
+                val grabber = ArchiveBrowser()
+                archive.accept(grabber)
+                return grabber.allPaths
+            }
+        }
+
+        val allPaths = mutableSetOf<String>()
+
+        override fun visit(archiveFile: ArchiveFile) {
+            allPaths.add(archiveFile.relativePath.toString())
+            println("Visited ${archiveFile.relativePath}")
+        }
+
+        override fun visit(archive: Archive) {
+            archive.files.forEach { it.accept(this) }
+        }
+    }
+}
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformerTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformerTest.kt
new file mode 100644
index 0000000..db6cd21
--- /dev/null
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformerTest.kt
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 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 android.support.tools.jetifier.core.transform.metainf
+
+import android.support.tools.jetifier.core.archive.ArchiveFile
+import android.support.tools.jetifier.core.config.Config
+import android.support.tools.jetifier.core.map.TypesMap
+import android.support.tools.jetifier.core.transform.PackageMap
+import android.support.tools.jetifier.core.transform.TransformationContext
+import android.support.tools.jetifier.core.transform.proguard.ProGuardTypesMap
+import com.google.common.truth.Truth
+import org.junit.Test
+import java.nio.charset.Charset
+import java.nio.file.Path
+import java.nio.file.Paths
+
+class MetaInfTransformerTest {
+
+    @Test
+    fun rewriteVersion_forward() {
+        testRewrite(
+            given = "28.0.0-SNAPSHOT",
+            expected = "1.0.0-SNAPSHOT",
+            filePath = Paths.get("something/META-INF", "support_preference-v7.version"),
+            reverseMode = false
+        )
+    }
+
+    @Test
+    fun rewriteVersion_reversed() {
+        testRewrite(
+            given = "1.0.0-SNAPSHOT",
+            expected = "28.0.0-SNAPSHOT",
+            filePath = Paths.get("something/META-INF", "support_preference-v7.version"),
+            reverseMode = true
+        )
+    }
+
+    @Test
+    fun rewriteVersion_notSLRewrite_shouldSkip() {
+        testRewrite(
+            given = "28.0.0-SNAPSHOT",
+            expected = "28.0.0-SNAPSHOT",
+            filePath = Paths.get("something/META-INF", "support_preference-v7.version"),
+            reverseMode = false,
+            rewritingSupportLib = false,
+            expectedCanTransform = false
+        )
+    }
+
+    @Test
+    fun rewriteVersion_notMatchingVersion_shouldNoOp() {
+        testRewrite(
+            given = "test",
+            expected = "test",
+            filePath = Paths.get("something/META-INF", "support_preference-v7.version")
+        )
+    }
+
+    @Test
+    fun rewriteVersion_notValidSuffix_shouldSkip() {
+        testRewrite(
+            given = "28.0.0-SNAPSHOT",
+            expected = "28.0.0-SNAPSHOT",
+            filePath = Paths.get("something/META-INF", "support_preference-v7.none"),
+            expectedCanTransform = false
+        )
+    }
+
+    @Test
+    fun rewriteVersion_notInMetaInfDir_shouldSkip() {
+        testRewrite(
+            given = "28.0.0-SNAPSHOT",
+            expected = "28.0.0-SNAPSHOT",
+            filePath = Paths.get("something/else", "support_preference-v7.version"),
+            expectedCanTransform = false
+        )
+    }
+
+    private fun testRewrite(
+        given: String,
+        expected: String,
+        filePath: Path,
+        reverseMode: Boolean = false,
+        expectedCanTransform: Boolean = true,
+        rewritingSupportLib: Boolean = true
+    ) {
+        val config = Config(
+            restrictToPackagePrefixes = emptyList(),
+            rewriteRules = emptyList(),
+            slRules = emptyList(),
+            pomRewriteRules = emptyList(),
+            packageMap = PackageMap.EMPTY,
+            typesMap = TypesMap.EMPTY,
+            proGuardMap = ProGuardTypesMap.EMPTY
+        )
+        val context = TransformationContext(config,
+            rewritingSupportLib = rewritingSupportLib,
+            isInReversedMode = reverseMode)
+        val transformer = MetaInfTransformer(context)
+
+        val file = ArchiveFile(filePath, given.toByteArray())
+
+        val canTransform = transformer.canTransform(file)
+        if (canTransform) {
+            transformer.runTransform(file)
+        }
+
+        val strResult = file.data.toString(Charset.defaultCharset())
+
+        Truth.assertThat(canTransform).isEqualTo(expectedCanTransform)
+        Truth.assertThat(strResult).isEqualTo(expected)
+    }
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassFilterTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassFilterTest.kt
index 2c7d7e2..86b1599 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassFilterTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassFilterTest.kt
@@ -21,7 +21,7 @@
 class ClassFilterTest {
 
     @Test fun proGuard_classFilter() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -38,7 +38,7 @@
     }
 
     @Test fun proGuard_classFilter_newLineIgnored() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -57,7 +57,7 @@
     }
 
     @Test fun proGuard_classFilter_spacesRespected() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -74,7 +74,7 @@
     }
 
     @Test fun proGuard_classFilter_negation() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest.kt
index e64590f..dc3e470 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest.kt
@@ -21,7 +21,7 @@
 class ClassSpecTest {
 
     @Test fun proGuard_classSpec_simple() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -39,7 +39,7 @@
     }
 
     @Test fun proGuard_classSpec_allExistingRules() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -71,7 +71,7 @@
     }
 
     @Test fun proGuard_classSpec_rulesModifiers() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -99,7 +99,7 @@
     }
 
     @Test fun proGuard_classSpec_extends() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -119,7 +119,7 @@
     }
 
     @Test fun proGuard_classSpec_modifiers_extends() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -137,7 +137,7 @@
     }
 
     @Test fun proGuard_classSpec_annotation() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -157,7 +157,7 @@
     }
 
     @Test fun proGuard_classSpec_annotation_extends() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -177,7 +177,7 @@
     }
 
     @Test fun proGuard_classSpec_annotation_extends_spaces() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -193,5 +193,4 @@
                 "-keep \t @test.Annotation \t public  class  *  extends test.Activity"
             )
     }
-
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_FieldTypeSelector.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_FieldTypeSelector.kt
index 2832385..d08bbbe 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_FieldTypeSelector.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_FieldTypeSelector.kt
@@ -21,7 +21,7 @@
 class ClassSpecTest_FieldTypeSelector {
 
     @Test fun proGuard_fieldTypeSelector() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -46,7 +46,7 @@
     }
 
     @Test fun proGuard_fieldTypeSelector_modifiers() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -71,7 +71,7 @@
     }
 
     @Test fun proGuard_fieldTypeSelector_annotation() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -95,7 +95,7 @@
     }
 
     @Test fun proGuard_fieldTypeSelector_modifiers_annotation() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -121,7 +121,7 @@
     }
 
     @Test fun proGuard_fieldTypeSelector_modifiers_annotation_spaces() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -141,5 +141,4 @@
                 "}"
             )
     }
-
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_FieldsSelector.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_FieldsSelector.kt
index 6f6a1f9..2a0f752 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_FieldsSelector.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_FieldsSelector.kt
@@ -21,7 +21,7 @@
 class ClassSpecTest_FieldsSelector {
 
     @Test fun proGuard_fieldsSelector_minimal() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -41,7 +41,7 @@
     }
 
     @Test fun proGuard_fieldsSelector_modifiers() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
             )
             .forGivenTypesMap(
@@ -63,7 +63,7 @@
     }
 
     @Test fun proGuard_fieldsSelector_modifiers_annotation() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -87,7 +87,7 @@
     }
 
     @Test fun proGuard_fieldsSelector_modifiers_annotation_spaces() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_MethodInitSelector.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_MethodInitSelector.kt
index 9a792cf..d681bda 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_MethodInitSelector.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_MethodInitSelector.kt
@@ -21,7 +21,7 @@
 class ClassSpecTest_MethodInitSelector {
 
     @Test fun proGuard_methodsInitSelector() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
             )
             .forGivenTypesMap(
@@ -39,7 +39,7 @@
     }
 
     @Test fun proGuard_methodsInitSelector_modifiers() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
             )
             .forGivenTypesMap(
@@ -63,7 +63,7 @@
     }
 
     @Test fun proGuard_methodsInitSelector_modifiers_annotation() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -89,7 +89,7 @@
     }
 
     @Test fun proGuard_methodInitSelector() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -118,7 +118,7 @@
     }
 
     @Test fun proGuard_methodInitSelector_modifiers() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -147,7 +147,7 @@
     }
 
     @Test fun proGuard_methodInitSelector_annotation() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -162,7 +162,8 @@
                 "  @support.Annotation <init>(*); \n" +
                 "  @support.Annotation <init>(...); \n" +
                 "  @keep.Me <init>(support.Activity); \n" +
-                "  @support.Annotation <init>(support.Activity, support.Fragment, keep.Please); \n" +
+                "  @support.Annotation <init>(support.Activity, support.Fragment, keep.Please);" +
+                " \n" +
                 "}"
             )
             .rewritesTo(
@@ -177,7 +178,7 @@
     }
 
     @Test fun proGuard_methodInitSelector_modifiers_annotation() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -192,7 +193,8 @@
                 "  @support.Annotation public static <init>(*); \n" +
                 "  @support.Annotation !public !static <init>(...); \n" +
                 "  @support.Annotation !private static <init>(support.Activity); \n" +
-                "  @support.Annotation public !abstract <init>(support.Activity, support.Fragment, keep.Please); \n" +
+                "  @support.Annotation public !abstract <init>(support.Activity, support.Fragment" +
+                ", keep.Please); \n" +
                 "}"
             )
             .rewritesTo(
@@ -201,13 +203,14 @@
                 "  @test.Annotation public static <init>(*); \n" +
                 "  @test.Annotation !public !static <init>(...); \n" +
                 "  @test.Annotation !private static <init>(test.Activity); \n" +
-                "  @test.Annotation public !abstract <init>(test.Activity, test.Fragment, keep.Please); \n" +
+                "  @test.Annotation public !abstract <init>(test.Activity, test.Fragment, " +
+                "keep.Please); \n" +
                 "}"
             )
     }
 
     @Test fun proGuard_methodInitSelector_modifiers_annotation_test() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -218,12 +221,14 @@
             )
             .testThatGivenProGuard(
                 "-keep public class * { \n" +
-                "  @support.Annotation  public  !abstract \t <init> ( support.Activity , support.Fragment, keep.Please); \n" +
+                "  @support.Annotation  public  !abstract \t <init> ( support.Activity , " +
+                "support.Fragment, keep.Please); \n" +
                 "}"
             )
             .rewritesTo(
                 "-keep public class * { \n" +
-                "  @test.Annotation  public  !abstract \t <init> (test.Activity, test.Fragment, keep.Please); \n" +
+                "  @test.Annotation  public  !abstract \t <init> (test.Activity, test.Fragment, " +
+                "keep.Please); \n" +
                 "}"
             )
     }
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_MethodSelectorWithReturnType.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_MethodSelectorWithReturnType.kt
index d9960b4..1cee765 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_MethodSelectorWithReturnType.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_MethodSelectorWithReturnType.kt
@@ -21,7 +21,7 @@
 class ClassSpecTest_MethodSelectorWithReturnType {
 
     @Test fun proGuard_methodReturnTypeSelector() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -54,7 +54,7 @@
     }
 
     @Test fun proGuard_methodReturnTypeSelector_voidResult() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -83,7 +83,7 @@
     }
 
     @Test fun proGuard_methodReturnTypeSelector_starResult() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -112,7 +112,7 @@
     }
 
     @Test fun proGuard_methodReturnTypeSelector_typeResult() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -141,7 +141,7 @@
     }
 
     @Test fun proGuard_methodReturnTypeSelector_typeResult_wildcards() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -170,7 +170,7 @@
     }
 
     @Test fun proGuard_methodReturnTypeSelector_typeResult_modifiers() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -184,7 +184,8 @@
                 "  public static support.Fragment get(...); \n" +
                 "  !public !static support.Fragment get(*); \n" +
                 "  private support.Fragment get(support.Activity); \n" +
-                "  public abstract support.Fragment get(support.Activity, support.Fragment, keep.Please); \n" +
+                "  public abstract support.Fragment get(support.Activity, support.Fragment, " +
+                "keep.Please); \n" +
                 "}"
             )
             .rewritesTo(
@@ -193,13 +194,14 @@
                 "  public static test.Fragment get(...); \n" +
                 "  !public !static test.Fragment get(*); \n" +
                 "  private test.Fragment get(test.Activity); \n" +
-                "  public abstract test.Fragment get(test.Activity, test.Fragment, keep.Please); \n" +
+                "  public abstract test.Fragment get(test.Activity, test.Fragment, keep.Please); " +
+                "\n" +
                 "}"
             )
     }
 
     @Test fun proGuard_methodReturnTypeSelector_typeResult_annotation() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -214,7 +216,8 @@
                 "  @support.Annotation support.Fragment get(...); \n" +
                 "  @support.Annotation support.Fragment get(*); \n" +
                 "  @keep.Me support.Fragment get(support.Activity); \n" +
-                "  @support.Annotation support.Fragment get(support.Activity, support.Fragment, keep.Please); \n" +
+                "  @support.Annotation support.Fragment get(support.Activity, support.Fragment, " +
+                "keep.Please); \n" +
                 "}"
             )
             .rewritesTo(
@@ -223,13 +226,14 @@
                 "  @test.Annotation test.Fragment get(...); \n" +
                 "  @test.Annotation test.Fragment get(*); \n" +
                 "  @keep.Me test.Fragment get(test.Activity); \n" +
-                "  @test.Annotation test.Fragment get(test.Activity, test.Fragment, keep.Please); \n" +
+                "  @test.Annotation test.Fragment get(test.Activity, test.Fragment, keep.Please" +
+                "); \n" +
                 "}"
             )
     }
 
     @Test fun proGuard_methodReturnTypeSelector_typeResult_modifiers_annotation() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -244,7 +248,8 @@
                 "  @support.Annotation public static support.Fragment get(...); \n" +
                 "  @support.Annotation !public !static support.Fragment get(*); \n" +
                 "  @support.Annotation private support.Fragment get(support.Activity); \n" +
-                "  @support.Annotation public abstract support.Fragment get(support.Activity, support.Fragment,  keep.Please); \n" +
+                "  @support.Annotation public abstract support.Fragment get(support.Activity, " +
+                "support.Fragment,  keep.Please); \n" +
                 "}"
             )
             .rewritesTo(
@@ -253,13 +258,14 @@
                 "  @test.Annotation public static test.Fragment get(...); \n" +
                 "  @test.Annotation !public !static test.Fragment get(*); \n" +
                 "  @test.Annotation private test.Fragment get(test.Activity); \n" +
-                "  @test.Annotation public abstract test.Fragment get(test.Activity, test.Fragment, keep.Please); \n" +
+                "  @test.Annotation public abstract test.Fragment get(test.Activity, " +
+                "test.Fragment, keep.Please); \n" +
                 "}"
             )
     }
 
     @Test fun proGuard_methodReturnTypeSelector_typeResult_modifiers_annotation_spaces() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -270,12 +276,14 @@
             )
             .testThatGivenProGuard(
                 "-keep public class * { \n" +
-                "  @support.Annotation  support.Fragment \t get(support.Activity ,  support.Fragment ,  keep.Please) ; \n" +
+                "  @support.Annotation  support.Fragment \t get(support.Activity ,  " +
+                "support.Fragment ,  keep.Please) ; \n" +
                 "}"
             )
             .rewritesTo(
                 "-keep public class * { \n" +
-                "  @test.Annotation  test.Fragment \t get(test.Activity, test.Fragment, keep.Please) ; \n" +
+                "  @test.Annotation  test.Fragment \t get(test.Activity, test.Fragment, " +
+                "keep.Please) ; \n" +
                 "}"
             )
     }
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_NamedCtorSelector.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_NamedCtorSelector.kt
index 21b8b8c..671be61 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_NamedCtorSelector.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ClassSpecTest_NamedCtorSelector.kt
@@ -21,7 +21,7 @@
 class ClassSpecTest_NamedCtorSelector {
 
     @Test fun proGuard_ctorSelector() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -50,7 +50,7 @@
     }
 
     @Test fun proGuard_ctorSelector_modifiers() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -64,7 +64,8 @@
                 "  public static support.Activity(...); \n" +
                 "  !private support.Activity(*); \n" +
                 "  !public !static support.Activity(support.Activity); \n" +
-                "  !protected support.Activity(support.Activity, support.Fragment, keep.Please); \n" +
+                "  !protected support.Activity(support.Activity, support.Fragment, keep.Please);" +
+                " \n" +
                 "}"
             )
             .rewritesTo(
@@ -79,7 +80,7 @@
     }
 
     @Test fun proGuard_ctorSelector_annotation() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -94,7 +95,8 @@
                 "  @support.Annotation support.Activity(...); \n" +
                 "  @support.Annotation support.Activity(*); \n" +
                 "  @support.Annotation support.Activity(support.Activity); \n" +
-                "  @support.Annotation support.Activity(support.Activity, support.Fragment, keep.Please); \n" +
+                "  @support.Annotation support.Activity(support.Activity, support.Fragment, " +
+                "keep.Please); \n" +
                 "}"
             )
             .rewritesTo(
@@ -109,7 +111,7 @@
     }
 
     @Test fun proGuard_ctorSelector_modifiers_annotation() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -124,7 +126,8 @@
                 "  @support.Annotation public static support.Activity(...); \n" +
                 "  @support.Annotation !private support.Activity(*); \n" +
                 "  @support.Annotation !public !static support.Activity(support.Activity); \n" +
-                "  @support.Annotation !protected support.Activity(support.Activity, support.Fragment, keep.Please); \n" +
+                "  @support.Annotation !protected support.Activity(support.Activity, " +
+                "support.Fragment, keep.Please); \n" +
                 "}"
             )
             .rewritesTo(
@@ -133,13 +136,14 @@
                 "  @test.Annotation public static test.Activity(...); \n" +
                 "  @test.Annotation !private test.Activity(*); \n" +
                 "  @test.Annotation !public !static test.Activity(test.Activity); \n" +
-                "  @test.Annotation !protected test.Activity(test.Activity, test.Fragment, keep.Please); \n" +
+                "  @test.Annotation !protected test.Activity(test.Activity, test.Fragment, " +
+                "keep.Please); \n" +
                 "}"
             )
     }
 
     @Test fun proGuard_ctorSelector_modifiers_annotation_spaces() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTester.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTester.kt
index cae21d0..37075d3 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTester.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTester.kt
@@ -20,62 +20,68 @@
 import android.support.tools.jetifier.core.config.Config
 import android.support.tools.jetifier.core.map.TypesMap
 import android.support.tools.jetifier.core.rules.JavaType
+import android.support.tools.jetifier.core.rules.RewriteRule
 import android.support.tools.jetifier.core.transform.TransformationContext
 import com.google.common.truth.Truth
 import java.nio.charset.StandardCharsets
 import java.nio.file.Paths
 
-
 /**
  * Helper to test ProGuard rewriting logic using lightweight syntax.
  */
-object ProGuardTester {
+class ProGuardTester {
 
     private var javaTypes = emptyList<Pair<String, String>>()
+    private var rewriteRules = emptyList<Pair<String, String>>()
     private var proGuardTypes = emptyList<Pair<ProGuardType, ProGuardType>>()
     private var prefixes = emptyList<String>()
 
-    fun forGivenPrefixes(vararg prefixes: String) : ProGuardTester {
+    fun forGivenPrefixes(vararg prefixes: String): ProGuardTester {
         this.prefixes = prefixes.toList()
         return this
     }
 
-    fun forGivenTypesMap(vararg rules: Pair<String, String>) : ProGuardTester {
-        this.javaTypes = rules.toList()
+    fun forGivenTypesMap(vararg types: Pair<String, String>): ProGuardTester {
+        this.javaTypes = types.toList()
         return this
     }
 
-    fun forGivenProGuardMap(vararg rules: Pair<String, String>) : ProGuardTester {
+    fun forGivenRules(vararg rules: Pair<String, String>): ProGuardTester {
+        this.rewriteRules = rules.toList()
+        return this
+    }
+
+    fun forGivenProGuardMap(vararg rules: Pair<String, String>): ProGuardTester {
         this.proGuardTypes = rules.map {
             ProGuardType.fromDotNotation(it.first) to ProGuardType.fromDotNotation(it.second) }
             .toList()
         return this
     }
 
-    fun testThatGivenType(givenType: String) : ProGuardTesterForType {
+    fun testThatGivenType(givenType: String): ProGuardTesterForType {
         return ProGuardTesterForType(createConfig(), givenType)
     }
 
-    fun testThatGivenArguments(givenArgs: String) : ProGuardTesterForArgs {
+    fun testThatGivenArguments(givenArgs: String): ProGuardTesterForArgs {
         return ProGuardTesterForArgs(createConfig(), givenArgs)
     }
 
-    fun testThatGivenProGuard(given: String) : ProGuardTesterForFile {
+    fun testThatGivenProGuard(given: String): ProGuardTesterForFile {
         return ProGuardTesterForFile(createConfig(), given)
     }
 
-    private fun createConfig() : Config {
+    private fun createConfig(): Config {
         return Config(
             restrictToPackagePrefixes = prefixes,
-            rewriteRules = emptyList(),
-            pomRewriteRules =  emptyList(),
+            rewriteRules = rewriteRules.map { RewriteRule(it.first, it.second) },
+            slRules = emptyList(),
+            pomRewriteRules = emptyList(),
             typesMap = TypesMap(
-                types = javaTypes.map { JavaType(it.first) to JavaType(it.second) }.toMap(),
-                fields = emptyMap()),
+                types = javaTypes.map { JavaType(it.first) to JavaType(it.second) }.toMap()
+            ),
             proGuardMap = ProGuardTypesMap(proGuardTypes.toMap()))
     }
 
-
     class ProGuardTesterForFile(private val config: Config, private val given: String) {
 
         fun rewritesTo(expected: String) {
@@ -87,8 +93,8 @@
             val result = file.data.toString(StandardCharsets.UTF_8)
 
             Truth.assertThat(result).isEqualTo(expected)
+            Truth.assertThat(context.errorsTotal()).isEqualTo(0)
         }
-
     }
 
     class ProGuardTesterForType(private val config: Config, private val given: String) {
@@ -99,8 +105,8 @@
             val result = mapper.replaceType(given)
 
             Truth.assertThat(result).isEqualTo(expectedType)
+            Truth.assertThat(context.errorsTotal()).isEqualTo(0)
         }
-
     }
 
     class ProGuardTesterForArgs(private val config: Config, private val given: String) {
@@ -111,8 +117,7 @@
             val result = mapper.replaceMethodArgs(given)
 
             Truth.assertThat(result).isEqualTo(expectedArguments)
+            Truth.assertThat(context.errorsTotal()).isEqualTo(0)
         }
     }
-
-}
-
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTypesMapperTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTypesMapperTest.kt
index 5e12aff..b1da4e2 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTypesMapperTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTypesMapperTest.kt
@@ -21,25 +21,25 @@
 class ProGuardTypesMapperTest {
 
     @Test fun proGuard_typeMapper_wildcard_simple() {
-        ProGuardTester
+        ProGuardTester()
             .testThatGivenType("*")
             .getsRewrittenTo("*")
     }
 
     @Test fun proGuard_typeMapper_wildcard_double() {
-        ProGuardTester
+        ProGuardTester()
             .testThatGivenType("**")
             .getsRewrittenTo("**")
     }
 
     @Test fun proGuard_typeMapper_wildcard_composed() {
-        ProGuardTester
+        ProGuardTester()
             .testThatGivenType("**/*")
             .getsRewrittenTo("**/*")
     }
 
     @Test fun proGuard_typeMapper_wildcard_viaMap() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -51,7 +51,7 @@
     }
 
     @Test fun proGuard_typeMapper_wildcard_viaMap2() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -63,7 +63,7 @@
     }
 
     @Test fun proGuard_typeMapper_wildcard_viaTypesMap() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -75,7 +75,7 @@
     }
 
     @Test fun proGuard_typeMapper_wildcard_notFoundInMap() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -87,7 +87,7 @@
     }
 
     @Test fun proGuard_typeMapper_differentPrefix_notRewritten() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -99,7 +99,7 @@
     }
 
     @Test fun proGuard_typeMapper_differentPrefix_wildcard_getsRewritten() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -111,7 +111,7 @@
     }
 
     @Test fun proGuard_typeMapper_innerClass() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -123,7 +123,7 @@
     }
 
     @Test fun proGuard_typeMapper_innerClass_wildcard() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -135,25 +135,25 @@
     }
 
     @Test fun proGuard_argsMapper_tripleDots() {
-        ProGuardTester
+        ProGuardTester()
             .testThatGivenArguments("...")
             .getRewrittenTo("...")
     }
 
     @Test fun proGuard_argsMapper_wildcard() {
-        ProGuardTester
+        ProGuardTester()
             .testThatGivenArguments("*")
             .getRewrittenTo("*")
     }
 
     @Test fun proGuard_argsMapper_wildcards() {
-        ProGuardTester
+        ProGuardTester()
             .testThatGivenArguments("**, **")
             .getRewrittenTo("**, **")
     }
 
     @Test fun proGuard_argsMapper_viaMaps() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -168,7 +168,7 @@
     }
 
     @Test fun proGuard_argsMapper_viaMaps_spaces() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -182,4 +182,41 @@
             .getRewrittenTo("test.Activity, test.v7.**, keep.Me")
     }
 
+    @Test fun proGuard_shouldIgnore() {
+        ProGuardTester()
+            .forGivenPrefixes(
+                "support/"
+            )
+            .forGivenRules(
+                "support/v7/Activity" to "ignore"
+            )
+            .testThatGivenType("support.v7.Activity")
+            .getsRewrittenTo("support.v7.Activity")
+    }
+
+    @Test fun proGuard_shouldIgnore_withWildcard() {
+        ProGuardTester()
+            .forGivenPrefixes(
+                "support/"
+            )
+            .forGivenRules(
+                "support/v7/(.*)" to "ignore"
+            )
+            .testThatGivenType("support.v7.**")
+            .getsRewrittenTo("support.v7.**")
+    }
+
+
+    @Test(expected = AssertionError::class)
+    fun proGuard_shouldNotIgnore() {
+        ProGuardTester()
+            .forGivenPrefixes(
+                "support/"
+            )
+            .forGivenRules(
+                "support/v7/Activity" to "ignoreInPreprocessor"
+            )
+            .testThatGivenType("support.v7.Activity")
+            .getsRewrittenTo("support.v7.Activity")
+    }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProguardSamplesTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProguardSamplesTest.kt
index 0542e7d..f9554f1 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProguardSamplesTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProguardSamplesTest.kt
@@ -21,7 +21,7 @@
 class ProguardSamplesTest {
 
     @Test fun proGuard_sample() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "android/app/",
                 "android/view/",
@@ -39,51 +39,51 @@
                 "android/webkit/JavascriptInterface" to "test/webkit/JavascriptInterface"
             )
             .testThatGivenProGuard(
-               "-injars      bin/classes \n" +
-               "-injars      libs \n" +
-               "-outjars     bin/classes-processed.jar \n" +
-               "-libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar \n" +
-               "\n" +
-               "-dontpreverify \n" +
-               "-repackageclasses '' \n" +
-               "-allowaccessmodification \n" +
-               "-optimizations !code/simplification/arithmetic \n" +
-               "-keepattributes *Annotation* \n" +
-               "\n" +
-               "-keep public class * extends android.app.Activity \n" +
-               "-keep public class * extends android.app.Application \n" +
-               " \n" +
-               "-keep public class * extends android.view.View { \n" +
-               "      public <init>(android.content.Context); \n" +
-               "      public <init>(android.content.Context, android.util.AttributeSet); \n" +
-               "      public <init>(android.content.Context, android.util.AttributeSet, int); \n" +
-               "      public void set*(...); \n" +
-               "} \n" +
-               "\n" +
-               "-keepclasseswithmembers class * { \n" +
-               "    public <init>(android.content.Context, android.util.AttributeSet); \n" +
-               "} \n" +
-               "\n" +
-               "-keepclasseswithmembers class * { \n" +
-               "    public <init>(android.content.Context, android.util.AttributeSet, int); \n" +
-               "} \n" +
-               "\n" +
-               "-keepclassmembers class * extends android.content.Context { \n" +
-               "    public void *(android.view.View); \n" +
-               "    public void *(android.view.MenuItem); \n" +
-               "} \n" +
-               "\n" +
-               "-keepclassmembers class * implements android.os.Parcelable { \n" +
-               "    static ** CREATOR; \n" +
-               "} \n" +
-               "\n" +
-               "-keepclassmembers class **.R\$* { \n" +
-               "    public static <fields>; \n" +
-               "} \n" +
-               "\n" +
-               "-keepclassmembers class * { \n" +
-               "    @android.webkit.JavascriptInterface <methods>; \n" +
-               "} "
+                "-injars      bin/classes \n" +
+                "-injars      libs \n" +
+                "-outjars     bin/classes-processed.jar \n" +
+                "-libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar \n" +
+                "\n" +
+                "-dontpreverify \n" +
+                "-repackageclasses '' \n" +
+                "-allowaccessmodification \n" +
+                "-optimizations !code/simplification/arithmetic \n" +
+                "-keepattributes *Annotation* \n" +
+                "\n" +
+                "-keep public class * extends android.app.Activity \n" +
+                "-keep public class * extends android.app.Application \n" +
+                " \n" +
+                "-keep public class * extends android.view.View { \n" +
+                "      public <init>(android.content.Context); \n" +
+                "      public <init>(android.content.Context, android.util.AttributeSet); \n" +
+                "      public <init>(android.content.Context, android.util.AttributeSet, int); \n" +
+                "      public void set*(...); \n" +
+                "} \n" +
+                "\n" +
+                "-keepclasseswithmembers class * { \n" +
+                "    public <init>(android.content.Context, android.util.AttributeSet); \n" +
+                "} \n" +
+                "\n" +
+                "-keepclasseswithmembers class * { \n" +
+                "    public <init>(android.content.Context, android.util.AttributeSet, int); \n" +
+                "} \n" +
+                "\n" +
+                "-keepclassmembers class * extends android.content.Context { \n" +
+                "    public void *(android.view.View); \n" +
+                "    public void *(android.view.MenuItem); \n" +
+                "} \n" +
+                "\n" +
+                "-keepclassmembers class * implements android.os.Parcelable { \n" +
+                "    static ** CREATOR; \n" +
+                "} \n" +
+                "\n" +
+                "-keepclassmembers class **.R\$* { \n" +
+                "    public static <fields>; \n" +
+                "} \n" +
+                "\n" +
+                "-keepclassmembers class * { \n" +
+                "    @android.webkit.JavascriptInterface <methods>; \n" +
+                "} "
             )
             .rewritesTo(
                 "-injars      bin/classes \n" +
@@ -135,7 +135,7 @@
     }
 
     @Test fun proGuard_sample2() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "android/support/v7/"
             )
@@ -161,7 +161,7 @@
     }
 
     @Test fun proGuard_sample3() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "android/support/design/",
                 "android/support/v7/"
@@ -191,7 +191,7 @@
     }
 
     @Test fun proGuard_sample4() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "android/support/design/",
                 "android/support/v7/",
@@ -238,7 +238,7 @@
     }
 
     @Test fun proGuard_sample5() {
-        ProGuardTester
+        ProGuardTester()
             .forGivenPrefixes(
                 "support/"
             )
@@ -270,5 +270,4 @@
                 "}"
             )
     }
-
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformerTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformerTest.kt
index 5788b40..4aaaae0 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformerTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformerTest.kt
@@ -16,14 +16,17 @@
 
 package android.support.tools.jetifier.core.transform.resource
 
+import android.support.tools.jetifier.core.archive.ArchiveFile
 import android.support.tools.jetifier.core.config.Config
 import android.support.tools.jetifier.core.rules.JavaType
 import android.support.tools.jetifier.core.map.TypesMap
+import android.support.tools.jetifier.core.transform.PackageMap
 import android.support.tools.jetifier.core.transform.TransformationContext
 import android.support.tools.jetifier.core.transform.proguard.ProGuardTypesMap
 import com.google.common.truth.Truth
 import org.junit.Test
 import java.nio.charset.Charset
+import java.nio.file.Paths
 
 class XmlResourcesTransformerTest {
 
@@ -45,7 +48,8 @@
                 "<android.support.v7.preference.Preference>\n" +
                 "</android.support.v7.preference.Preference>",
             prefixes = listOf("android/support/v7/"),
-            map = mapOf()
+            map = mapOf(),
+            errorsExpected = true
         )
     }
 
@@ -81,7 +85,8 @@
             prefixes = listOf("android/support/"),
             map = mapOf(
                 "android/support2/v7/preference/Preference" to "android/test/pref/Preference"
-            )
+            ),
+            errorsExpected = true
         )
     }
 
@@ -92,7 +97,7 @@
             expectedXml =
                 "<android.test.pref.Preference/>",
             prefixes = listOf("android/support/"),
-            map = mapOf(
+            typesMap = mapOf(
                 "android/support/v7/preference/Preference" to "android/test/pref/Preference"
             )
         )
@@ -107,7 +112,7 @@
                 "<android.test.pref.Preference \n" +
                 "    someAttribute=\"android.support.v7.preference.Preference\"/>",
             prefixes = listOf("android/support/"),
-            map =  mapOf(
+            typesMap = mapOf(
                 "android/support/v7/preference/Preference" to "android/test/pref/Preference"
             )
         )
@@ -122,7 +127,7 @@
                 "<android.test.pref.Preference>\n" +
                 "</android.test.pref.Preference>",
             prefixes = listOf("android/support/"),
-            map = mapOf(
+            typesMap = mapOf(
                 "android/support/v7/preference/Preference" to "android/test/pref/Preference"
             )
         )
@@ -135,7 +140,7 @@
             expectedXml =
                 "<view class=\"android.test.pref.Preference\">",
             prefixes = listOf("android/support/"),
-            map = mapOf(
+            typesMap = mapOf(
                 "android/support/v7/preference/Preference" to "android/test/pref/Preference"
             )
         )
@@ -152,7 +157,7 @@
                 "      class=\"android.test.pref.Preference\"" +
                 "      ignoreMe=\"android.support.v7.preference.Preference\">",
             prefixes = listOf("android/support/"),
-            map = mapOf(
+            typesMap = mapOf(
                 "android/support/v7/preference/Preference" to "android/test/pref/Preference"
             )
         )
@@ -178,8 +183,9 @@
                 "<android.support.v7.preference.Preference>\n" +
                 "</android.support.v7.preference.Preference>",
             prefixes = listOf("android/support/"),
-            map = mapOf(
-                "android/support/v7/preference/Preference" to "android/support/v7/preference/Preference"
+            typesMap = mapOf(
+                "android/support/v7/preference/Preference"
+                    to "android/support/v7/preference/Preference"
             )
         )
     }
@@ -214,25 +220,98 @@
                 "android/support/v7/",
                 "android/support/v14/"
             ),
-            map = mapOf(
-                "android/support/v7/preference/ListPreference" to "android/test/pref/ListPref",
-                "android/support/v7/preference/Preference" to "android/test/pref/Preference",
-                "android/support/v14/preference/DialogPreference" to "android/test14/pref/DialogPreference",
-                "android/support/v21/preference/DialogPreference" to "android/test21/pref/DialogPreference"
+            typesMap = mapOf(
+                "android/support/v7/preference/ListPreference"
+                    to "android/test/pref/ListPref",
+                "android/support/v7/preference/Preference"
+                    to "android/test/pref/Preference",
+                "android/support/v14/preference/DialogPreference"
+                    to "android/test14/pref/DialogPreference",
+                "android/support/v21/preference/DialogPreference"
+                    to "android/test21/pref/DialogPreference"
             )
         )
     }
 
-    private fun testRewriteToTheSame(givenAndExpectedXml: String,
-                                     prefixes: List<String>,
-                                     map: Map<String, String>) {
-        testRewrite(givenAndExpectedXml, givenAndExpectedXml, prefixes, map)
+    @Test fun manifestFile_packageRewrite() {
+        testRewrite(
+            givenXml =
+                "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
+                "          package=\"android.support.v7.preference\">\n" +
+                "    <uses-sdk android:minSdkVersion=\"14\"/>\n" +
+                "</manifest>",
+            expectedXml =
+                "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
+                "          package=\"androidx.preference\">\n" +
+                "    <uses-sdk android:minSdkVersion=\"14\"/>\n" +
+                "</manifest>",
+            prefixes = listOf(
+            ),
+            typesMap = mapOf(
+            ),
+            packageMap = PackageMap(listOf(
+                PackageMap.PackageRule(
+                    from = "android/support/v7/preference",
+                    to = "androidx/preference")
+            )),
+            rewritingSupportLib = true,
+            isManifestFile = true
+        )
     }
 
-    private fun testRewrite(givenXml : String,
-                            expectedXml : String,
-                            prefixes: List<String>,
-                            map: Map<String, String>) {
+    @Test fun manifestFile_packageRewrite_chooseBasedOnArtifactName() {
+        testRewrite(
+            givenXml =
+            "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
+                "          package=\"androidx.preference\">\n" +
+                "    <uses-sdk android:minSdkVersion=\"14\"/>\n" +
+                "</manifest>",
+            expectedXml =
+            "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
+                "          package=\"android.support.v14.preference\">\n" +
+                "    <uses-sdk android:minSdkVersion=\"14\"/>\n" +
+                "</manifest>",
+            prefixes = listOf(
+            ),
+            typesMap = mapOf(
+            ),
+            packageMap = PackageMap(listOf(
+                PackageMap.PackageRule(
+                    from = "androidx/preference",
+                    to = "android/support/v7/preference",
+                    filePrefix = "preference-7"),
+                PackageMap.PackageRule(
+                    from = "androidx/preference",
+                    to = "android/support/v14/preference",
+                    filePrefix = "preference-v14")
+            )),
+            rewritingSupportLib = true,
+            isManifestFile = true,
+            libraryName = "preference-v14-28.0.0-123.aar"
+        )
+    }
+
+    private fun testRewriteToTheSame(
+        givenAndExpectedXml: String,
+        prefixes: List<String>,
+        map: Map<String, String>,
+        errorsExpected: Boolean = false
+    ) {
+        testRewrite(givenAndExpectedXml, givenAndExpectedXml, prefixes, map,
+            errorsExpected = errorsExpected)
+    }
+
+    private fun testRewrite(
+        givenXml: String,
+        expectedXml: String,
+        prefixes: List<String>,
+        typesMap: Map<String, String>,
+        packageMap: PackageMap = PackageMap.EMPTY,
+        rewritingSupportLib: Boolean = false,
+        isManifestFile: Boolean = false,
+        libraryName: String = "",
+        errorsExpected: Boolean = false
+    ) {
         val given =
             "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
             "$givenXml\n"
@@ -241,15 +320,35 @@
             "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
             "$expectedXml\n"
 
-        val typesMap = TypesMap(map.map{ JavaType(it.key) to JavaType(it.value) }.toMap(),
-            emptyMap())
-        val config = Config(prefixes, emptyList(), emptyList(), typesMap, ProGuardTypesMap.EMPTY)
-        val context = TransformationContext(config)
+        val typeMap = TypesMap(typesMap.map { JavaType(it.key) to JavaType(it.value) }.toMap())
+        val config = Config(
+            restrictToPackagePrefixes = prefixes,
+            rewriteRules = emptyList(),
+            slRules = emptyList(),
+            pomRewriteRules = emptyList(),
+            typesMap = typeMap,
+            proGuardMap = ProGuardTypesMap.EMPTY,
+            packageMap = packageMap
+        )
+        val context = TransformationContext(config, rewritingSupportLib = rewritingSupportLib)
+        context.libraryName = libraryName
         val processor = XmlResourcesTransformer(context)
-        val result = processor.transform(given.toByteArray())
-        val strResult = result.toString(Charset.defaultCharset())
+        val fileName = if (isManifestFile) {
+            Paths.get("AndroidManifest.xml")
+        } else {
+            Paths.get("random.xml")
+        }
+        val file = ArchiveFile(fileName, given.toByteArray())
+        processor.runTransform(file)
+        val strResult = file.data.toString(Charset.defaultCharset())
 
         Truth.assertThat(strResult).isEqualTo(expected)
+
+        if (errorsExpected) {
+            Truth.assertThat(context.errorsTotal()).isAtLeast(1)
+        } else {
+            Truth.assertThat(context.errorsTotal()).isEqualTo(0)
+        }
     }
 }
 
diff --git a/jetifier/jetifier/core/src/test/resources/fileRenameTest/expectedTestLib.zip b/jetifier/jetifier/core/src/test/resources/fileRenameTest/expectedTestLib.zip
new file mode 100644
index 0000000..7ee64b7
--- /dev/null
+++ b/jetifier/jetifier/core/src/test/resources/fileRenameTest/expectedTestLib.zip
Binary files differ
diff --git a/jetifier/jetifier/core/src/test/resources/fileRenameTest/expectedTestLibNested.zip b/jetifier/jetifier/core/src/test/resources/fileRenameTest/expectedTestLibNested.zip
new file mode 100644
index 0000000..11c328d
--- /dev/null
+++ b/jetifier/jetifier/core/src/test/resources/fileRenameTest/expectedTestLibNested.zip
Binary files differ
diff --git a/jetifier/jetifier/core/src/test/resources/fileRenameTest/inputTestLib.zip b/jetifier/jetifier/core/src/test/resources/fileRenameTest/inputTestLib.zip
new file mode 100644
index 0000000..239baa1
--- /dev/null
+++ b/jetifier/jetifier/core/src/test/resources/fileRenameTest/inputTestLib.zip
Binary files differ
diff --git a/jetifier/jetifier/core/src/test/resources/fileRenameTest/inputTestLibNested.zip b/jetifier/jetifier/core/src/test/resources/fileRenameTest/inputTestLibNested.zip
new file mode 100644
index 0000000..e722db1
--- /dev/null
+++ b/jetifier/jetifier/core/src/test/resources/fileRenameTest/inputTestLibNested.zip
Binary files differ
diff --git a/jetifier/jetifier/gradle b/jetifier/jetifier/gradle
deleted file mode 120000
index 1ce6c4c..0000000
--- a/jetifier/jetifier/gradle
+++ /dev/null
@@ -1 +0,0 @@
-../../gradle
\ No newline at end of file
diff --git a/jetifier/jetifier/gradle-plugin/build.gradle b/jetifier/jetifier/gradle-plugin/build.gradle
index 3b001f8..4a8d0fb 100644
--- a/jetifier/jetifier/gradle-plugin/build.gradle
+++ b/jetifier/jetifier/gradle-plugin/build.gradle
@@ -14,30 +14,29 @@
  * limitations under the License
  */
 
-apply plugin: 'maven'
+import static android.support.dependencies.DependenciesKt.KOTLIN_STDLIB
 
-version '0.2'
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+  id("SupportKotlinLibraryPlugin")
+}
 
 dependencies {
-    compile project(':core')
+    compile project(':jetifier-core')
+    compile(KOTLIN_STDLIB)
     compileOnly gradleApi()
 }
 
-// Task to create a jar with all the required dependencies bundled inside
-task fatJar(type: Jar) {
-    baseName = project.name + '-all'
-    destinationDir = rootProject.ext.distDir
-    from { configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } }
-    with jar
+
+supportLibrary {
+    name = "Android Jetifier Gradle Plugin"
+    publish = true
+    mavenVersion = LibraryVersions.JETIFIER
+    mavenGroup = LibraryGroups.JETIFIER
+    generateDocs = false
+    inceptionYear = "2017"
+    description = "Android Jetifier Gradle Plugin"
 }
 
-uploadArchives {
-    repositories {
-        mavenDeployer {
-            repository(url: rootProject.ext.repoDir)
-        }
-    }
-}
-
-rootProject.mainUpload.dependsOn tasks["uploadArchives"]
-tasks["uploadArchives"].dependsOn rootProject.prepareRepo
\ No newline at end of file
diff --git a/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/JetifierExtension.kt b/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/JetifierExtension.kt
index 7b516ec..e0eb60c 100644
--- a/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/JetifierExtension.kt
+++ b/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/JetifierExtension.kt
@@ -16,6 +16,7 @@
 
 package android.support.tools.jetifier.plugin.gradle
 
+import groovy.lang.Closure
 import org.gradle.api.Project
 import org.gradle.api.artifacts.Configuration
 import org.gradle.api.artifacts.Dependency
@@ -31,7 +32,6 @@
     /**
      * Adds dependency defined via string notation to be processed by jetifyLibs task.
      *
-     *
      * Example usage in Gradle:
      * dependencies {
      *   compile jetifier.process('groupId:artifactId:1.0')
@@ -42,21 +42,20 @@
     }
 
     /**
-     * Adds dependency defined via string notation to be processed by jetifyLibs task while also
-     * applying the given exclude rules.
-     *
+     * Adds dependency defined via string notation to be processed by jetifyLibs task. This version
+     * supports Gradle's configuration closure that is passed to the Gradle's DependencyHandler.
      *
      * Example usage in Gradle:
      * dependencies {
-     *   compile jetifier.processAndExclude('groupId:artifactId:1.0',
-     *     [group: 'some.package', module: 'moduleName'])
+     *   compile jetifier.process('groupId:artifactId:1.0') {
+     *     exclude group: 'groupId'
+     *
+     *     transitive = false
+     *   }
      * }
      */
-    fun processAndExclude(
-        dependencyNotation: String,
-        vararg excludes: Map<String, String>
-    ): FileCollection {
-        return processAndExclude(project.dependencies.create(dependencyNotation), *excludes)
+    fun process(dependencyNotation: String, closure: Closure<Any>): FileCollection {
+        return process(project.dependencies.create(dependencyNotation, closure))
     }
 
     /**
@@ -69,20 +68,6 @@
     }
 
     /**
-     * Adds dependency to be processed by jetifyLibs task while also applying the given excludes
-     * rules.
-     */
-    fun processAndExclude(
-        dependency: Dependency,
-        vararg excludes: Map<String, String>
-    ): FileCollection {
-        val configuration = project.configurations.detachedConfiguration()
-        configuration.dependencies.add(dependency)
-        excludes.forEach { configuration.exclude(it) }
-        return process(configuration)
-    }
-
-    /**
      * Adds dependencies defined via file collection to be processed by jetifyLibs task.
      *
      * Example usage in Gradle for a single file:
diff --git a/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/TasksCommon.kt b/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/TasksCommon.kt
index dcc6375..082034fb 100644
--- a/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/TasksCommon.kt
+++ b/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/TasksCommon.kt
@@ -31,8 +31,10 @@
 
         var configFilePath: Path? = null
 
-
-        fun processFiles(config: Config, filesToProcess: Set<File>, logger: Logger, outputDir: File) : TransformationResult {
+        fun processFiles(config: Config,
+                         filesToProcess: Set<File>,
+                         logger: Logger,
+                         outputDir: File): TransformationResult {
             outputDir.mkdirs()
 
             logger.log(LogLevel.DEBUG, "Jetifier will now process the following files:")
@@ -43,15 +45,14 @@
             // Hook to the gradle logger
             Log.logConsumer = JetifierLoggerAdapter(logger)
 
-            val processor = Processor(config)
-            return processor.transform(filesToProcess, outputDir.toPath())
+            val processor = Processor.createProcessor(config)
+            return processor.transform(filesToProcess, outputDir.toPath(), true)
         }
 
-        fun shouldSkipArtifact(artifactId: String, groupId: String?, config: Config) : Boolean {
+        fun shouldSkipArtifact(artifactId: String, groupId: String?, config: Config): Boolean {
             return config.pomRewriteRules.any {
                 it.from.artifactId == artifactId && it.from.groupId == groupId
             }
         }
     }
-
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/gradlew b/jetifier/jetifier/gradlew
deleted file mode 120000
index 343e0d2..0000000
--- a/jetifier/jetifier/gradlew
+++ /dev/null
@@ -1 +0,0 @@
-../../gradlew
\ No newline at end of file
diff --git a/jetifier/jetifier/preprocessor/build.gradle b/jetifier/jetifier/preprocessor/build.gradle
index b688a9d..a2b9eb2 100644
--- a/jetifier/jetifier/preprocessor/build.gradle
+++ b/jetifier/jetifier/preprocessor/build.gradle
@@ -14,13 +14,16 @@
  * limitations under the License
  */
 
-version '1.0'
+plugins {
+    id("SupportKotlinLibraryPlugin")
+    id("application")
+}
 
-apply plugin: "application"
+version '1.0'
 
 mainClassName = "android.support.tools.jetifier.preprocessor.MainKt"
 
 dependencies {
-    compile project(':core')
+    compile project(':jetifier-core')
     compile group: 'commons-cli', name: 'commons-cli', version: '1.3.1'
-}
\ No newline at end of file
+}
diff --git a/jetifier/jetifier/preprocessor/scripts/processDefaultConfig.sh b/jetifier/jetifier/preprocessor/scripts/processDefaultConfig.sh
old mode 100644
new mode 100755
index 2b61811..5ddc2df
--- a/jetifier/jetifier/preprocessor/scripts/processDefaultConfig.sh
+++ b/jetifier/jetifier/preprocessor/scripts/processDefaultConfig.sh
@@ -18,6 +18,8 @@
 # Grabs all the support libraries and runs them through a preprocessor
 # using the default Jetifier config to generate the final mappings.
 
+set -e
+
 ROOT_DIR=$(dirname $(readlink -f $0))
 OUT_DIR="$ROOT_DIR/out"
 TEMP_LOG="$OUT_DIR/tempLog"
@@ -28,15 +30,16 @@
 GENERATED_CONFIG="$JETIFIER_DIR/core/src/main/resources/default.generated.config"
 PREPROCESSOR_DISTRO_PATH="$BUILD_DIR/preprocessor/build/distributions/preprocessor-1.0.zip"
 PREPROCESSOR_BIN_PATH="$OUT_DIR/preprocessor-1.0/bin/preprocessor"
-SUPPORT_LIBS_DOWNLOADED="$OUT_DIR/supportLibs"
+SUPPORT_LIBS_BUILD_NUMBER="4560478"
+SUPPORT_LIBS_DOWNLOADED="$OUT_DIR/supportLibs/downloaded"
+SUPPORT_LIBS_UNPACKED="$OUT_DIR/supportLibs/unpacked"
 
 GREEN='\033[0;32m'
 RED='\033[0;31m'
 NC='\033[0m' # No Color
 
-function exitAndFail() {
-	cat $TEMP_LOG
-	echo -e "${RED}FAILED${NC}"
+function die() {
+	echo "$@"
 	exit 1
 }
 
@@ -53,16 +56,38 @@
 
 function buildProjectUsingGradle() {
 	cd $1
-	sh gradlew clean build $2 > $TEMP_LOG --stacktrace || exitAndFail 2>&1
+	sh gradlew clean build $2 > $TEMP_LOG --stacktrace
 }
 
 
-rm -r $OUT_DIR
+rm -rf $OUT_DIR
 mkdir $OUT_DIR
 echo "OUT dir is at '$OUT_DIR'"
 
-printSectionStart "Downloading all affected support libraries"
-wget -nd -i $ROOT_DIR/repo-links -P $SUPPORT_LIBS_DOWNLOADED
+function getPreRenamedSupportLib() {
+	INPUT_FILENAME="top-of-tree-m2repository-$SUPPORT_LIBS_BUILD_NUMBER.zip"
+	printSectionStart "Downloading all affected support libraries"
+	mkdir -p "$SUPPORT_LIBS_DOWNLOADED"
+
+	if [ "$FETCH_ARTIFACT" == "" ]; then
+		if which fetch_artifact; then
+			FETCH_ARTIFACT="$(which fetch_artifact)"
+		fi
+	fi
+	if [ ! -f "$FETCH_ARTIFACT" ]; then
+		die "fetch_artifact not found. Please set the environment variable FETCH_ARTIFACT equal to the path of fetch_artifact and try again"
+	fi
+
+	cd "$SUPPORT_LIBS_DOWNLOADED"
+	"$FETCH_ARTIFACT" --bid "$SUPPORT_LIBS_BUILD_NUMBER" --target support_library "$INPUT_FILENAME" "$SUPPORT_LIBS_DOWNLOADED/support-lib-${SUPPORT_LIBS_BUILD_NUMBER}.zip"
+	"$FETCH_ARTIFACT" --bid "$SUPPORT_LIBS_BUILD_NUMBER" --target support_library_app_toolkit "$INPUT_FILENAME" "$SUPPORT_LIBS_DOWNLOADED/arch-${SUPPORT_LIBS_BUILD_NUMBER}.zip"
+	cd -
+
+
+	unzip -oj "$SUPPORT_LIBS_DOWNLOADED/support-lib-${SUPPORT_LIBS_BUILD_NUMBER}.zip" -d "$SUPPORT_LIBS_UNPACKED"
+	unzip -oj "$SUPPORT_LIBS_DOWNLOADED/arch-${SUPPORT_LIBS_BUILD_NUMBER}.zip" -d "$SUPPORT_LIBS_UNPACKED"
+}
+getPreRenamedSupportLib
 
 printSectionStart "Preparing Jetifier"
 buildProjectUsingGradle $JETIFIER_DIR
@@ -72,7 +97,7 @@
 echo "[OK] Copied & unziped jetifier preprocessor"
 
 printSectionStart "Preprocessing mappings on support libraries"
-sh $PREPROCESSOR_BIN_PATH -i "$SUPPORT_LIBS_DOWNLOADED" -o "$GENERATED_CONFIG" -c "$DEFAULT_CONFIG" -l verbose || exitAndFail
+sh $PREPROCESSOR_BIN_PATH -i "$SUPPORT_LIBS_UNPACKED" -o "$GENERATED_CONFIG" -c "$DEFAULT_CONFIG" -l verbose || exitAndFail
 echo "[OK] Done, config generated into $GENERATED_CONFIG"
 
 printSuccess
diff --git a/jetifier/jetifier/preprocessor/scripts/repo-links b/jetifier/jetifier/preprocessor/scripts/repo-links
deleted file mode 100644
index 961c149..0000000
--- a/jetifier/jetifier/preprocessor/scripts/repo-links
+++ /dev/null
@@ -1,52 +0,0 @@
-# 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
-
-https://maven.google.com/com/android/support/animated-vector-drawable/27.0.1/animated-vector-drawable-27.0.1.aar
-https://maven.google.com/com/android/support/appcompat-v7/27.0.1/appcompat-v7-27.0.1.aar
-https://maven.google.com/com/android/support/cardview-v7/27.0.1/cardview-v7-27.0.1.aar
-https://maven.google.com/com/android/support/customtabs/27.0.1/customtabs-27.0.1.aar
-https://maven.google.com/com/android/support/design/27.0.1/design-27.0.1.aar
-https://maven.google.com/com/android/support/exifinterface/27.0.1/exifinterface-27.0.1.aar
-https://maven.google.com/com/android/support/gridlayout-v7/27.0.1/gridlayout-v7-27.0.1.aar
-https://maven.google.com/com/android/support/instantvideo/26.0.0-alpha1/instantvideo-26.0.0-alpha1.aar
-https://maven.google.com/com/android/support/leanback-v17/27.0.1/leanback-v17-27.0.1.aar
-https://maven.google.com/com/android/support/mediarouter-v7/27.0.1/mediarouter-v7-27.0.1.aar
-https://maven.google.com/com/android/support/multidex/1.0.2/multidex-1.0.2.aar
-https://maven.google.com/com/android/support/multidex-instrumentation/1.0.2/multidex-instrumentation-1.0.2.aar
-https://maven.google.com/com/android/support/palette-v7/27.0.1/palette-v7-27.0.1.aar
-https://maven.google.com/com/android/support/percent/27.0.1/percent-27.0.1.aar
-https://maven.google.com/com/android/support/preference-leanback-v17/27.0.1/preference-leanback-v17-27.0.1.aar
-https://maven.google.com/com/android/support/preference-v14/27.0.1/preference-v14-27.0.1.aar
-https://maven.google.com/com/android/support/preference-v7/27.0.1/preference-v7-27.0.1.aar
-https://maven.google.com/com/android/support/recommendation/27.0.1/recommendation-27.0.1.aar
-https://maven.google.com/com/android/support/recyclerview-v7/27.0.1/recyclerview-v7-27.0.1.aar
-https://maven.google.com/com/android/support/support-annotations/27.0.1/support-annotations-27.0.1.jar
-https://maven.google.com/com/android/support/support-compat/27.0.1/support-compat-27.0.1.aar
-https://maven.google.com/com/android/support/support-content/27.0.1/support-content-27.0.1.aar
-https://maven.google.com/com/android/support/support-core-ui/27.0.1/support-core-ui-27.0.1.aar
-https://maven.google.com/com/android/support/support-core-utils/27.0.1/support-core-utils-27.0.1.aar
-https://maven.google.com/com/android/support/support-dynamic-animation/27.0.1/support-dynamic-animation-27.0.1.aar
-https://maven.google.com/com/android/support/support-emoji/27.0.1/support-emoji-27.0.1.aar
-https://maven.google.com/com/android/support/support-emoji-appcompat/27.0.1/support-emoji-appcompat-27.0.1.aar
-https://maven.google.com/com/android/support/support-emoji-bundled/27.0.1/support-emoji-bundled-27.0.1.aar
-https://maven.google.com/com/android/support/support-fragment/27.0.1/support-fragment-27.0.1.aar
-https://maven.google.com/com/android/support/support-media-compat/27.0.1/support-media-compat-27.0.1.aar
-https://maven.google.com/com/android/support/support-tv-provider/27.0.1/support-tv-provider-27.0.1.aar
-https://maven.google.com/com/android/support/support-v13/27.0.1/support-v13-27.0.1.aar
-https://maven.google.com/com/android/support/support-v4/27.0.1/support-v4-27.0.1.aar
-https://maven.google.com/com/android/support/support-vector-drawable/27.0.1/support-vector-drawable-27.0.1.aar
-https://maven.google.com/com/android/support/transition/27.0.1/transition-27.0.1.aar
-https://maven.google.com/com/android/support/wear/27.0.1/wear-27.0.1.aar
-https://maven.google.com/com/android/support/wearable/27.0.1/wearable-27.0.1.aar
-https://maven.google.com/com/android/support/constraint/constraint-layout/1.0.2/constraint-layout-1.0.2.aar
diff --git a/jetifier/jetifier/preprocessor/src/main/kotlin/android/support/tools/jetifier/preprocessor/ConfigGenerator.kt b/jetifier/jetifier/preprocessor/src/main/kotlin/android/support/tools/jetifier/preprocessor/ConfigGenerator.kt
index ec12ac8..3f79553 100644
--- a/jetifier/jetifier/preprocessor/src/main/kotlin/android/support/tools/jetifier/preprocessor/ConfigGenerator.kt
+++ b/jetifier/jetifier/preprocessor/src/main/kotlin/android/support/tools/jetifier/preprocessor/ConfigGenerator.kt
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 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 android.support.tools.jetifier.preprocessor
 
 import android.support.tools.jetifier.core.archive.Archive
@@ -11,7 +27,7 @@
 
     companion object {
         private const val LEGAL_NOTICE =
-            "# Copyright (C) 2017 The Android Open Source Project\n" +
+            "# Copyright (C) 2018 The Android Open Source Project\n" +
             "#\n" +
             "# Licensed under the Apache License, Version 2.0 (the \"License\");\n" +
             "# you may not use this file except in compliance with the License.\n" +
@@ -49,13 +65,14 @@
             }
         }
 
-        val map = mapper.generateMap()
+        val map = mapper.generateMap().mergetWith(config.typesMap)
+        map.reverseMapOrDie() // Check that map can be reversed
         val newConfig = config.setNewMap(map)
 
         saveConfigToFile(newConfig, outputConfigPath.toFile())
     }
 
-    private fun saveConfigToFile(configToSave: Config, outputFile : File) {
+    private fun saveConfigToFile(configToSave: Config, outputFile: File) {
         val sb = StringBuilder()
         sb.append(LEGAL_NOTICE)
         sb.append("\n")
diff --git a/jetifier/jetifier/settings.gradle b/jetifier/jetifier/settings.gradle
deleted file mode 100644
index 7d13b73..0000000
--- a/jetifier/jetifier/settings.gradle
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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
- */
-
-rootProject.name = 'jetifier'
-include 'core'
-include 'gradle-plugin'
-include 'standalone'
-include 'preprocessor'
-
diff --git a/jetifier/jetifier/standalone/build.gradle b/jetifier/jetifier/standalone/build.gradle
index 8814d50..8e1d9b9 100644
--- a/jetifier/jetifier/standalone/build.gradle
+++ b/jetifier/jetifier/standalone/build.gradle
@@ -14,14 +14,17 @@
  * limitations under the License
  */
 
-version '1.0'
+plugins {
+    id("SupportKotlinLibraryPlugin")
+    id("application")
+}
 
-apply plugin: "application"
+version '1.0'
 
 mainClassName = "android.support.tools.jetifier.standalone.MainKt"
 
 dependencies {
-    compile project(':core')
+    compile project(':jetifier-core')
     compile group: 'commons-cli', name: 'commons-cli', version: '1.3.1'
 }
 
diff --git a/jetifier/jetifier/standalone/src/main/kotlin/android/support/tools/jetifier/standalone/Main.kt b/jetifier/jetifier/standalone/src/main/kotlin/android/support/tools/jetifier/standalone/Main.kt
index de310e4..8fdb78e 100644
--- a/jetifier/jetifier/standalone/src/main/kotlin/android/support/tools/jetifier/standalone/Main.kt
+++ b/jetifier/jetifier/standalone/src/main/kotlin/android/support/tools/jetifier/standalone/Main.kt
@@ -27,6 +27,7 @@
 import org.apache.commons.cli.Options
 import org.apache.commons.cli.ParseException
 import java.io.File
+import java.nio.file.Path
 import java.nio.file.Paths
 
 class Main {
@@ -37,16 +38,27 @@
 
         val OPTIONS = Options()
         val OPTION_INPUT = createOption("i", "Input libraries paths", multiple = true)
-        val OPTION_OUTPUT = createOption("o", "Output config path")
+        val OPTION_OUTPUT_DIR = createOption("outputdir", "Output directory path",
+                isRequired = false)
+        val OPTION_OUTPUT_FILE = createOption("outputfile", "Output file", isRequired = false)
         val OPTION_CONFIG = createOption("c", "Input config path", isRequired = false)
-        val OPTION_LOG_LEVEL = createOption("l", "Logging level. debug, verbose, default",
+        val OPTION_LOG_LEVEL = createOption("l", "Logging level. debug, verbose, error, info " +
+            "(default)", isRequired = false)
+        val OPTION_REVERSED = createOption("r", "Run reversed process", hasArgs = false,
             isRequired = false)
+        val OPTION_REWRITE_SUPPORT_LIB = createOption("s", "If set, all libraries being rewritten" +
+            " are assumed to be part of Support Library. Otherwise only general dependencies are" +
+            " expected.",
+            hasArgs = false, isRequired = false)
 
-        private fun createOption(argName: String,
-                                 desc: String,
-                                 isRequired: Boolean = true,
-                                 multiple: Boolean = false) : Option {
-            val op = Option(argName, true, desc)
+        private fun createOption(
+            argName: String,
+            desc: String,
+            hasArgs: Boolean = true,
+            isRequired: Boolean = true,
+            multiple: Boolean = false
+        ): Option {
+            val op = Option(argName, hasArgs, desc)
             op.isRequired = isRequired
             if (multiple) {
                 op.args = Option.UNLIMITED_VALUES
@@ -56,7 +68,7 @@
         }
     }
 
-    fun run(args : Array<String>) {
+    fun run(args: Array<String>) {
         val cmd = parseCmdLine(args)
         if (cmd == null) {
             System.exit(1)
@@ -66,9 +78,31 @@
         Log.setLevel(cmd.getOptionValue(OPTION_LOG_LEVEL.opt))
 
         val inputLibraries = cmd.getOptionValues(OPTION_INPUT.opt).map { File(it) }.toSet()
-        val outputPath = Paths.get(cmd.getOptionValue(OPTION_OUTPUT.opt))
+        val outputDir = cmd.getOptionValue(OPTION_OUTPUT_DIR.opt)
+        val outputFile = cmd.getOptionValue(OPTION_OUTPUT_FILE.opt)
+        if (outputDir == null && outputFile == null) {
+            throw IllegalArgumentException("Must specify -outputdir or -outputfile")
+        }
+        if (outputDir != null && outputFile != null) {
+            throw IllegalArgumentException("Cannot specify both -outputdir and -outputfile")
+        }
+        if (inputLibraries.size > 1 && outputFile != null) {
+            throw IllegalArgumentException(
+                    "Cannot specify -outputfile when multiple input libraries are given")
+        }
 
-        val config : Config?
+        var outputIsDir = false
+        fun chooseOutputPath(): Path {
+            if (outputFile == null) {
+                outputIsDir = true
+                return Paths.get(outputDir)
+            } else {
+                return Paths.get(outputFile)
+            }
+        }
+        val outputPath = chooseOutputPath()
+
+        val config: Config?
         if (cmd.hasOption(OPTION_CONFIG.opt)) {
             val configPath = Paths.get(cmd.getOptionValue(OPTION_CONFIG.opt))
             config = ConfigParser.loadFromFile(configPath)
@@ -82,11 +116,16 @@
             return
         }
 
-        val processor = Processor(config)
-        processor.transform(inputLibraries, outputPath)
+        val isReversed = cmd.hasOption(OPTION_REVERSED.opt)
+        val rewriteSupportLib = cmd.hasOption(OPTION_REWRITE_SUPPORT_LIB.opt)
+        val processor = Processor.createProcessor(
+            config = config,
+            reversedMode = isReversed,
+            rewritingSupportLib = rewriteSupportLib)
+        processor.transform(inputLibraries, outputPath, outputIsDir)
     }
 
-    private fun parseCmdLine(args : Array<String>) : CommandLine? {
+    private fun parseCmdLine(args: Array<String>): CommandLine? {
         try {
             return DefaultParser().parse(OPTIONS, args)
         } catch (e: ParseException) {
@@ -95,10 +134,8 @@
         }
         return null
     }
-
 }
 
-
-fun main(args : Array<String>) {
+fun main(args: Array<String>) {
     Main().run(args)
 }
\ No newline at end of file
diff --git a/leanback/Android.mk b/leanback/Android.mk
deleted file mode 100644
index e39261f..0000000
--- a/leanback/Android.mk
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright (C) 2014 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.
-
-LOCAL_PATH:= $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-v17-leanback \
-#       android-support-v7-recyclerview \
-#       android-support-v4
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_AAPT2_ONLY := true
-LOCAL_MODULE := android-support-v17-leanback
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := \
-    $(call all-java-files-under, common) \
-    $(call all-java-files-under, jbmr2) \
-    $(call all-java-files-under, kitkat) \
-    $(call all-java-files-under, api21) \
-    $(call all-java-files-under, src)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-v7-recyclerview \
-    android-support-compat \
-    android-support-core-ui \
-    android-support-media-compat \
-    android-support-fragment
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/leanback/api/27.1.0.txt b/leanback/api/27.1.0.txt
new file mode 100644
index 0000000..3a5a22b
--- /dev/null
+++ b/leanback/api/27.1.0.txt
@@ -0,0 +1,3104 @@
+package android.support.v17.leanback.app {
+
+  public final class BackgroundManager {
+    method public void attach(android.view.Window);
+    method public void attachToView(android.view.View);
+    method public void clearDrawable();
+    method public int getColor();
+    method public deprecated android.graphics.drawable.Drawable getDefaultDimLayer();
+    method public deprecated android.graphics.drawable.Drawable getDimLayer();
+    method public android.graphics.drawable.Drawable getDrawable();
+    method public static android.support.v17.leanback.app.BackgroundManager getInstance(android.app.Activity);
+    method public boolean isAttached();
+    method public boolean isAutoReleaseOnStop();
+    method public void release();
+    method public void setAutoReleaseOnStop(boolean);
+    method public void setBitmap(android.graphics.Bitmap);
+    method public void setColor(int);
+    method public deprecated void setDimLayer(android.graphics.drawable.Drawable);
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setThemeDrawableResourceId(int);
+  }
+
+  public deprecated class BaseFragment extends android.support.v17.leanback.app.BrandedFragment {
+    method protected java.lang.Object createEntranceTransition();
+    method public final android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+    method protected void onEntranceTransitionEnd();
+    method protected void onEntranceTransitionPrepare();
+    method protected void onEntranceTransitionStart();
+    method public void prepareEntranceTransition();
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void startEntranceTransition();
+  }
+
+  public class BaseSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
+    method protected java.lang.Object createEntranceTransition();
+    method public final android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+    method protected void onEntranceTransitionEnd();
+    method protected void onEntranceTransitionPrepare();
+    method protected void onEntranceTransitionStart();
+    method public void prepareEntranceTransition();
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void startEntranceTransition();
+  }
+
+  public deprecated class BrandedFragment extends android.app.Fragment {
+    ctor public BrandedFragment();
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public int getSearchAffordanceColor();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public java.lang.CharSequence getTitle();
+    method public android.view.View getTitleView();
+    method public android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+    method public void installTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public final boolean isShowingTitle();
+    method public android.view.View onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
+    method public void setSearchAffordanceColor(int);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitleView(android.view.View);
+    method public void showTitle(boolean);
+    method public void showTitle(int);
+  }
+
+  public class BrandedSupportFragment extends android.support.v4.app.Fragment {
+    ctor public BrandedSupportFragment();
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public int getSearchAffordanceColor();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public java.lang.CharSequence getTitle();
+    method public android.view.View getTitleView();
+    method public android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+    method public void installTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public final boolean isShowingTitle();
+    method public android.view.View onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
+    method public void setSearchAffordanceColor(int);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitleView(android.view.View);
+    method public void showTitle(boolean);
+    method public void showTitle(int);
+  }
+
+  public deprecated class BrowseFragment extends android.support.v17.leanback.app.BaseFragment {
+    ctor public BrowseFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
+    method public void enableMainFragmentScaling(boolean);
+    method public deprecated void enableRowScaling(boolean);
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public int getBrandColor();
+    method public android.support.v17.leanback.app.HeadersFragment getHeadersFragment();
+    method public int getHeadersState();
+    method public android.app.Fragment getMainFragment();
+    method public final android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapterRegistry getMainFragmentRegistry();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.app.RowsFragment getRowsFragment();
+    method public int getSelectedPosition();
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getSelectedRowViewHolder();
+    method public final boolean isHeadersTransitionOnBackEnabled();
+    method public boolean isInHeadersTransition();
+    method public boolean isShowingHeaders();
+    method public android.support.v17.leanback.app.HeadersFragment onCreateHeadersFragment();
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setBrandColor(int);
+    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseFragment.BrowseTransitionListener);
+    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public void setHeadersState(int);
+    method public final void setHeadersTransitionOnBackEnabled(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void startHeadersTransition(boolean);
+    field public static final int HEADERS_DISABLED = 3; // 0x3
+    field public static final int HEADERS_ENABLED = 1; // 0x1
+    field public static final int HEADERS_HIDDEN = 2; // 0x2
+  }
+
+  public static deprecated class BrowseFragment.BrowseTransitionListener {
+    ctor public BrowseFragment.BrowseTransitionListener();
+    method public void onHeadersTransitionStart(boolean);
+    method public void onHeadersTransitionStop(boolean);
+  }
+
+  public static abstract deprecated class BrowseFragment.FragmentFactory<T extends android.app.Fragment> {
+    ctor public BrowseFragment.FragmentFactory();
+    method public abstract T createFragment(java.lang.Object);
+  }
+
+  public static abstract deprecated interface BrowseFragment.FragmentHost {
+    method public abstract void notifyDataReady(android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter);
+    method public abstract void notifyViewCreated(android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter);
+    method public abstract void showTitleView(boolean);
+  }
+
+  public static deprecated class BrowseFragment.ListRowFragmentFactory extends android.support.v17.leanback.app.BrowseFragment.FragmentFactory {
+    ctor public BrowseFragment.ListRowFragmentFactory();
+    method public android.support.v17.leanback.app.RowsFragment createFragment(java.lang.Object);
+  }
+
+  public static deprecated class BrowseFragment.MainFragmentAdapter<T extends android.app.Fragment> {
+    ctor public BrowseFragment.MainFragmentAdapter(T);
+    method public final T getFragment();
+    method public final android.support.v17.leanback.app.BrowseFragment.FragmentHost getFragmentHost();
+    method public boolean isScalingEnabled();
+    method public boolean isScrolling();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void onTransitionStart();
+    method public void setAlignment(int);
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setScalingEnabled(boolean);
+  }
+
+  public static abstract deprecated interface BrowseFragment.MainFragmentAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter getMainFragmentAdapter();
+  }
+
+  public static final deprecated class BrowseFragment.MainFragmentAdapterRegistry {
+    ctor public BrowseFragment.MainFragmentAdapterRegistry();
+    method public android.app.Fragment createFragment(java.lang.Object);
+    method public void registerFragment(java.lang.Class, android.support.v17.leanback.app.BrowseFragment.FragmentFactory);
+  }
+
+  public static deprecated class BrowseFragment.MainFragmentRowsAdapter<T extends android.app.Fragment> {
+    ctor public BrowseFragment.MainFragmentRowsAdapter(T);
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
+    method public final T getFragment();
+    method public int getSelectedPosition();
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void setSelectedPosition(int, boolean);
+  }
+
+  public static abstract deprecated interface BrowseFragment.MainFragmentRowsAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+  }
+
+  public class BrowseSupportFragment extends android.support.v17.leanback.app.BaseSupportFragment {
+    ctor public BrowseSupportFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
+    method public void enableMainFragmentScaling(boolean);
+    method public deprecated void enableRowScaling(boolean);
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public int getBrandColor();
+    method public int getHeadersState();
+    method public android.support.v17.leanback.app.HeadersSupportFragment getHeadersSupportFragment();
+    method public android.support.v4.app.Fragment getMainFragment();
+    method public final android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapterRegistry getMainFragmentRegistry();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.app.RowsSupportFragment getRowsSupportFragment();
+    method public int getSelectedPosition();
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getSelectedRowViewHolder();
+    method public final boolean isHeadersTransitionOnBackEnabled();
+    method public boolean isInHeadersTransition();
+    method public boolean isShowingHeaders();
+    method public android.support.v17.leanback.app.HeadersSupportFragment onCreateHeadersSupportFragment();
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setBrandColor(int);
+    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseSupportFragment.BrowseTransitionListener);
+    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public void setHeadersState(int);
+    method public final void setHeadersTransitionOnBackEnabled(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void startHeadersTransition(boolean);
+    field public static final int HEADERS_DISABLED = 3; // 0x3
+    field public static final int HEADERS_ENABLED = 1; // 0x1
+    field public static final int HEADERS_HIDDEN = 2; // 0x2
+  }
+
+  public static class BrowseSupportFragment.BrowseTransitionListener {
+    ctor public BrowseSupportFragment.BrowseTransitionListener();
+    method public void onHeadersTransitionStart(boolean);
+    method public void onHeadersTransitionStop(boolean);
+  }
+
+  public static abstract class BrowseSupportFragment.FragmentFactory<T extends android.support.v4.app.Fragment> {
+    ctor public BrowseSupportFragment.FragmentFactory();
+    method public abstract T createFragment(java.lang.Object);
+  }
+
+  public static abstract interface BrowseSupportFragment.FragmentHost {
+    method public abstract void notifyDataReady(android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter);
+    method public abstract void notifyViewCreated(android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter);
+    method public abstract void showTitleView(boolean);
+  }
+
+  public static class BrowseSupportFragment.ListRowFragmentFactory extends android.support.v17.leanback.app.BrowseSupportFragment.FragmentFactory {
+    ctor public BrowseSupportFragment.ListRowFragmentFactory();
+    method public android.support.v17.leanback.app.RowsSupportFragment createFragment(java.lang.Object);
+  }
+
+  public static class BrowseSupportFragment.MainFragmentAdapter<T extends android.support.v4.app.Fragment> {
+    ctor public BrowseSupportFragment.MainFragmentAdapter(T);
+    method public final T getFragment();
+    method public final android.support.v17.leanback.app.BrowseSupportFragment.FragmentHost getFragmentHost();
+    method public boolean isScalingEnabled();
+    method public boolean isScrolling();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void onTransitionStart();
+    method public void setAlignment(int);
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setScalingEnabled(boolean);
+  }
+
+  public static abstract interface BrowseSupportFragment.MainFragmentAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter getMainFragmentAdapter();
+  }
+
+  public static final class BrowseSupportFragment.MainFragmentAdapterRegistry {
+    ctor public BrowseSupportFragment.MainFragmentAdapterRegistry();
+    method public android.support.v4.app.Fragment createFragment(java.lang.Object);
+    method public void registerFragment(java.lang.Class, android.support.v17.leanback.app.BrowseSupportFragment.FragmentFactory);
+  }
+
+  public static class BrowseSupportFragment.MainFragmentRowsAdapter<T extends android.support.v4.app.Fragment> {
+    ctor public BrowseSupportFragment.MainFragmentRowsAdapter(T);
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
+    method public final T getFragment();
+    method public int getSelectedPosition();
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void setSelectedPosition(int, boolean);
+  }
+
+  public static abstract interface BrowseSupportFragment.MainFragmentRowsAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+  }
+
+  public deprecated class DetailsFragment extends android.support.v17.leanback.app.BaseFragment {
+    ctor public DetailsFragment();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.DetailsParallax getParallax();
+    method public android.support.v17.leanback.app.RowsFragment getRowsFragment();
+    method protected deprecated android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
+    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
+    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
+  }
+
+  public deprecated class DetailsFragmentBackgroundController {
+    ctor public DetailsFragmentBackgroundController(android.support.v17.leanback.app.DetailsFragment);
+    method public boolean canNavigateToVideoFragment();
+    method public void enableParallax();
+    method public void enableParallax(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.support.v17.leanback.widget.ParallaxTarget.PropertyValuesHolderTarget);
+    method public final android.app.Fragment findOrCreateVideoFragment();
+    method public final android.graphics.drawable.Drawable getBottomDrawable();
+    method public final android.graphics.Bitmap getCoverBitmap();
+    method public final android.graphics.drawable.Drawable getCoverDrawable();
+    method public final int getParallaxDrawableMaxOffset();
+    method public final android.support.v17.leanback.media.PlaybackGlue getPlaybackGlue();
+    method public final int getSolidColor();
+    method public android.support.v17.leanback.media.PlaybackGlueHost onCreateGlueHost();
+    method public android.app.Fragment onCreateVideoFragment();
+    method public final void setCoverBitmap(android.graphics.Bitmap);
+    method public final void setParallaxDrawableMaxOffset(int);
+    method public final void setSolidColor(int);
+    method public void setupVideoPlayback(android.support.v17.leanback.media.PlaybackGlue);
+    method public final void switchToRows();
+    method public final void switchToVideo();
+  }
+
+  public class DetailsSupportFragment extends android.support.v17.leanback.app.BaseSupportFragment {
+    ctor public DetailsSupportFragment();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.DetailsParallax getParallax();
+    method public android.support.v17.leanback.app.RowsSupportFragment getRowsSupportFragment();
+    method protected deprecated android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
+    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
+    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
+  }
+
+  public class DetailsSupportFragmentBackgroundController {
+    ctor public DetailsSupportFragmentBackgroundController(android.support.v17.leanback.app.DetailsSupportFragment);
+    method public boolean canNavigateToVideoSupportFragment();
+    method public void enableParallax();
+    method public void enableParallax(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.support.v17.leanback.widget.ParallaxTarget.PropertyValuesHolderTarget);
+    method public final android.support.v4.app.Fragment findOrCreateVideoSupportFragment();
+    method public final android.graphics.drawable.Drawable getBottomDrawable();
+    method public final android.graphics.Bitmap getCoverBitmap();
+    method public final android.graphics.drawable.Drawable getCoverDrawable();
+    method public final int getParallaxDrawableMaxOffset();
+    method public final android.support.v17.leanback.media.PlaybackGlue getPlaybackGlue();
+    method public final int getSolidColor();
+    method public android.support.v17.leanback.media.PlaybackGlueHost onCreateGlueHost();
+    method public android.support.v4.app.Fragment onCreateVideoSupportFragment();
+    method public final void setCoverBitmap(android.graphics.Bitmap);
+    method public final void setParallaxDrawableMaxOffset(int);
+    method public final void setSolidColor(int);
+    method public void setupVideoPlayback(android.support.v17.leanback.media.PlaybackGlue);
+    method public final void switchToRows();
+    method public final void switchToVideo();
+  }
+
+  public deprecated class ErrorFragment extends android.support.v17.leanback.app.BrandedFragment {
+    ctor public ErrorFragment();
+    method public android.graphics.drawable.Drawable getBackgroundDrawable();
+    method public android.view.View.OnClickListener getButtonClickListener();
+    method public java.lang.String getButtonText();
+    method public android.graphics.drawable.Drawable getImageDrawable();
+    method public java.lang.CharSequence getMessage();
+    method public boolean isBackgroundTranslucent();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setButtonClickListener(android.view.View.OnClickListener);
+    method public void setButtonText(java.lang.String);
+    method public void setDefaultBackground(boolean);
+    method public void setImageDrawable(android.graphics.drawable.Drawable);
+    method public void setMessage(java.lang.CharSequence);
+  }
+
+  public class ErrorSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
+    ctor public ErrorSupportFragment();
+    method public android.graphics.drawable.Drawable getBackgroundDrawable();
+    method public android.view.View.OnClickListener getButtonClickListener();
+    method public java.lang.String getButtonText();
+    method public android.graphics.drawable.Drawable getImageDrawable();
+    method public java.lang.CharSequence getMessage();
+    method public boolean isBackgroundTranslucent();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setButtonClickListener(android.view.View.OnClickListener);
+    method public void setButtonText(java.lang.String);
+    method public void setDefaultBackground(boolean);
+    method public void setImageDrawable(android.graphics.drawable.Drawable);
+    method public void setMessage(java.lang.CharSequence);
+  }
+
+  public deprecated class GuidedStepFragment extends android.app.Fragment {
+    ctor public GuidedStepFragment();
+    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment);
+    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment, int);
+    method public static int addAsRoot(android.app.Activity, android.support.v17.leanback.app.GuidedStepFragment, int);
+    method public void collapseAction(boolean);
+    method public void collapseSubActions();
+    method public void expandAction(android.support.v17.leanback.widget.GuidedAction, boolean);
+    method public void expandSubActions(android.support.v17.leanback.widget.GuidedAction);
+    method public android.support.v17.leanback.widget.GuidedAction findActionById(long);
+    method public int findActionPositionById(long);
+    method public android.support.v17.leanback.widget.GuidedAction findButtonActionById(long);
+    method public int findButtonActionPositionById(long);
+    method public void finishGuidedStepFragments();
+    method public android.view.View getActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
+    method public android.view.View getButtonActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getButtonActions();
+    method public static android.support.v17.leanback.app.GuidedStepFragment getCurrentGuidedStepFragment(android.app.FragmentManager);
+    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
+    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
+    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedButtonActionsStylist();
+    method public int getSelectedActionPosition();
+    method public int getSelectedButtonActionPosition();
+    method public int getUiStyle();
+    method public boolean isExpanded();
+    method public boolean isFocusOutEndAllowed();
+    method public boolean isFocusOutStartAllowed();
+    method public boolean isSubActionsExpanded();
+    method public void notifyActionChanged(int);
+    method public void notifyButtonActionChanged(int);
+    method protected void onAddSharedElementTransition(android.app.FragmentTransaction, android.support.v17.leanback.app.GuidedStepFragment);
+    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
+    method public android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onCreateButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateButtonActionsStylist();
+    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
+    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
+    method public void onGuidedActionEditCanceled(android.support.v17.leanback.widget.GuidedAction);
+    method public deprecated void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
+    method public long onGuidedActionEditedAndProceed(android.support.v17.leanback.widget.GuidedAction);
+    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
+    method protected void onProvideFragmentTransitions();
+    method public int onProvideTheme();
+    method public boolean onSubGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
+    method public void openInEditMode(android.support.v17.leanback.widget.GuidedAction);
+    method public void popBackStackToGuidedStepFragment(java.lang.Class, int);
+    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public void setActionsDiffCallback(android.support.v17.leanback.widget.DiffCallback<android.support.v17.leanback.widget.GuidedAction>);
+    method public void setButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public void setSelectedActionPosition(int);
+    method public void setSelectedButtonActionPosition(int);
+    method public void setUiStyle(int);
+    field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
+    field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
+    field public static final deprecated int UI_STYLE_DEFAULT = 0; // 0x0
+    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
+    field public static final int UI_STYLE_REPLACE = 0; // 0x0
+  }
+
+  public class GuidedStepSupportFragment extends android.support.v4.app.Fragment {
+    ctor public GuidedStepSupportFragment();
+    method public static int add(android.support.v4.app.FragmentManager, android.support.v17.leanback.app.GuidedStepSupportFragment);
+    method public static int add(android.support.v4.app.FragmentManager, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
+    method public static int addAsRoot(android.support.v4.app.FragmentActivity, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
+    method public void collapseAction(boolean);
+    method public void collapseSubActions();
+    method public void expandAction(android.support.v17.leanback.widget.GuidedAction, boolean);
+    method public void expandSubActions(android.support.v17.leanback.widget.GuidedAction);
+    method public android.support.v17.leanback.widget.GuidedAction findActionById(long);
+    method public int findActionPositionById(long);
+    method public android.support.v17.leanback.widget.GuidedAction findButtonActionById(long);
+    method public int findButtonActionPositionById(long);
+    method public void finishGuidedStepSupportFragments();
+    method public android.view.View getActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
+    method public android.view.View getButtonActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getButtonActions();
+    method public static android.support.v17.leanback.app.GuidedStepSupportFragment getCurrentGuidedStepSupportFragment(android.support.v4.app.FragmentManager);
+    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
+    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
+    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedButtonActionsStylist();
+    method public int getSelectedActionPosition();
+    method public int getSelectedButtonActionPosition();
+    method public int getUiStyle();
+    method public boolean isExpanded();
+    method public boolean isFocusOutEndAllowed();
+    method public boolean isFocusOutStartAllowed();
+    method public boolean isSubActionsExpanded();
+    method public void notifyActionChanged(int);
+    method public void notifyButtonActionChanged(int);
+    method protected void onAddSharedElementTransition(android.support.v4.app.FragmentTransaction, android.support.v17.leanback.app.GuidedStepSupportFragment);
+    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
+    method public android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onCreateButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateButtonActionsStylist();
+    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
+    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
+    method public void onGuidedActionEditCanceled(android.support.v17.leanback.widget.GuidedAction);
+    method public deprecated void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
+    method public long onGuidedActionEditedAndProceed(android.support.v17.leanback.widget.GuidedAction);
+    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
+    method protected void onProvideFragmentTransitions();
+    method public int onProvideTheme();
+    method public boolean onSubGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
+    method public void openInEditMode(android.support.v17.leanback.widget.GuidedAction);
+    method public void popBackStackToGuidedStepSupportFragment(java.lang.Class, int);
+    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public void setActionsDiffCallback(android.support.v17.leanback.widget.DiffCallback<android.support.v17.leanback.widget.GuidedAction>);
+    method public void setButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public void setSelectedActionPosition(int);
+    method public void setSelectedButtonActionPosition(int);
+    method public void setUiStyle(int);
+    field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
+    field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
+    field public static final deprecated int UI_STYLE_DEFAULT = 0; // 0x0
+    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
+    field public static final int UI_STYLE_REPLACE = 0; // 0x0
+  }
+
+  public deprecated class HeadersFragment extends android.app.Fragment {
+    ctor public HeadersFragment();
+    method public boolean isScrolling();
+    method public void onTransitionEnd();
+    method public void onTransitionStart();
+    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener);
+    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener);
+  }
+
+  public static abstract deprecated interface HeadersFragment.OnHeaderClickedListener {
+    method public abstract void onHeaderClicked(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public static abstract deprecated interface HeadersFragment.OnHeaderViewSelectedListener {
+    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public class HeadersSupportFragment extends android.support.v4.app.Fragment {
+    ctor public HeadersSupportFragment();
+    method public boolean isScrolling();
+    method public void onTransitionEnd();
+    method public void onTransitionStart();
+    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener);
+    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener);
+  }
+
+  public static abstract interface HeadersSupportFragment.OnHeaderClickedListener {
+    method public abstract void onHeaderClicked(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public static abstract interface HeadersSupportFragment.OnHeaderViewSelectedListener {
+    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public abstract deprecated class OnboardingFragment extends android.app.Fragment {
+    ctor public OnboardingFragment();
+    method public final int getArrowBackgroundColor();
+    method public final int getArrowColor();
+    method protected final int getCurrentPageIndex();
+    method public final int getDescriptionViewTextColor();
+    method public final int getDotBackgroundColor();
+    method public final int getIconResourceId();
+    method public final int getLogoResourceId();
+    method protected abstract int getPageCount();
+    method protected abstract java.lang.CharSequence getPageDescription(int);
+    method protected abstract java.lang.CharSequence getPageTitle(int);
+    method public final java.lang.CharSequence getStartButtonText();
+    method public final int getTitleViewTextColor();
+    method protected final boolean isLogoAnimationFinished();
+    method protected void moveToNextPage();
+    method protected void moveToPreviousPage();
+    method protected abstract android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected abstract android.view.View onCreateContentView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateDescriptionAnimator();
+    method protected android.animation.Animator onCreateEnterAnimation();
+    method protected abstract android.view.View onCreateForegroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateLogoAnimation();
+    method protected android.animation.Animator onCreateTitleAnimator();
+    method protected void onFinishFragment();
+    method protected void onLogoAnimationFinished();
+    method protected void onPageChanged(int, int);
+    method public int onProvideTheme();
+    method public void setArrowBackgroundColor(int);
+    method public void setArrowColor(int);
+    method public void setDescriptionViewTextColor(int);
+    method public void setDotBackgroundColor(int);
+    method public final void setIconResouceId(int);
+    method public final void setLogoResourceId(int);
+    method public void setStartButtonText(java.lang.CharSequence);
+    method public void setTitleViewTextColor(int);
+    method protected final void startEnterAnimation(boolean);
+  }
+
+  public abstract class OnboardingSupportFragment extends android.support.v4.app.Fragment {
+    ctor public OnboardingSupportFragment();
+    method public final int getArrowBackgroundColor();
+    method public final int getArrowColor();
+    method protected final int getCurrentPageIndex();
+    method public final int getDescriptionViewTextColor();
+    method public final int getDotBackgroundColor();
+    method public final int getIconResourceId();
+    method public final int getLogoResourceId();
+    method protected abstract int getPageCount();
+    method protected abstract java.lang.CharSequence getPageDescription(int);
+    method protected abstract java.lang.CharSequence getPageTitle(int);
+    method public final java.lang.CharSequence getStartButtonText();
+    method public final int getTitleViewTextColor();
+    method protected final boolean isLogoAnimationFinished();
+    method protected void moveToNextPage();
+    method protected void moveToPreviousPage();
+    method protected abstract android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected abstract android.view.View onCreateContentView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateDescriptionAnimator();
+    method protected android.animation.Animator onCreateEnterAnimation();
+    method protected abstract android.view.View onCreateForegroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateLogoAnimation();
+    method protected android.animation.Animator onCreateTitleAnimator();
+    method protected void onFinishFragment();
+    method protected void onLogoAnimationFinished();
+    method protected void onPageChanged(int, int);
+    method public int onProvideTheme();
+    method public void setArrowBackgroundColor(int);
+    method public void setArrowColor(int);
+    method public void setDescriptionViewTextColor(int);
+    method public void setDotBackgroundColor(int);
+    method public final void setIconResouceId(int);
+    method public final void setLogoResourceId(int);
+    method public void setStartButtonText(java.lang.CharSequence);
+    method public void setTitleViewTextColor(int);
+    method protected final void startEnterAnimation(boolean);
+  }
+
+  public deprecated class PlaybackFragment extends android.app.Fragment {
+    ctor public PlaybackFragment();
+    method public deprecated void fadeOut();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public int getBackgroundType();
+    method public android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+    method public void hideControlsOverlay(boolean);
+    method public boolean isControlsOverlayAutoHideEnabled();
+    method public boolean isControlsOverlayVisible();
+    method public deprecated boolean isFadingEnabled();
+    method public void notifyPlaybackRowChanged();
+    method protected void onBufferingStateChanged(boolean);
+    method protected void onError(int, java.lang.CharSequence);
+    method protected void onVideoSizeChanged(int, int);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setBackgroundType(int);
+    method public void setControlsOverlayAutoHideEnabled(boolean);
+    method public deprecated void setFadingEnabled(boolean);
+    method public void setHostCallback(android.support.v17.leanback.media.PlaybackGlueHost.HostCallback);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public final void setOnKeyInterceptListener(android.view.View.OnKeyListener);
+    method public void setOnPlaybackItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setPlaybackRow(android.support.v17.leanback.widget.Row);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method public void showControlsOverlay(boolean);
+    method public void tickle();
+    field public static final int BG_DARK = 1; // 0x1
+    field public static final int BG_LIGHT = 2; // 0x2
+    field public static final int BG_NONE = 0; // 0x0
+  }
+
+  public deprecated class PlaybackFragmentGlueHost extends android.support.v17.leanback.media.PlaybackGlueHost implements android.support.v17.leanback.widget.PlaybackSeekUi {
+    ctor public PlaybackFragmentGlueHost(android.support.v17.leanback.app.PlaybackFragment);
+    method public void fadeOut();
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+  }
+
+  public class PlaybackSupportFragment extends android.support.v4.app.Fragment {
+    ctor public PlaybackSupportFragment();
+    method public deprecated void fadeOut();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public int getBackgroundType();
+    method public android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+    method public void hideControlsOverlay(boolean);
+    method public boolean isControlsOverlayAutoHideEnabled();
+    method public boolean isControlsOverlayVisible();
+    method public deprecated boolean isFadingEnabled();
+    method public void notifyPlaybackRowChanged();
+    method protected void onBufferingStateChanged(boolean);
+    method protected void onError(int, java.lang.CharSequence);
+    method protected void onVideoSizeChanged(int, int);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setBackgroundType(int);
+    method public void setControlsOverlayAutoHideEnabled(boolean);
+    method public deprecated void setFadingEnabled(boolean);
+    method public void setHostCallback(android.support.v17.leanback.media.PlaybackGlueHost.HostCallback);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public final void setOnKeyInterceptListener(android.view.View.OnKeyListener);
+    method public void setOnPlaybackItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setPlaybackRow(android.support.v17.leanback.widget.Row);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method public void showControlsOverlay(boolean);
+    method public void tickle();
+    field public static final int BG_DARK = 1; // 0x1
+    field public static final int BG_LIGHT = 2; // 0x2
+    field public static final int BG_NONE = 0; // 0x0
+  }
+
+  public class PlaybackSupportFragmentGlueHost extends android.support.v17.leanback.media.PlaybackGlueHost implements android.support.v17.leanback.widget.PlaybackSeekUi {
+    ctor public PlaybackSupportFragmentGlueHost(android.support.v17.leanback.app.PlaybackSupportFragment);
+    method public void fadeOut();
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+  }
+
+  public final class ProgressBarManager {
+    ctor public ProgressBarManager();
+    method public void disableProgressBar();
+    method public void enableProgressBar();
+    method public long getInitialDelay();
+    method public void hide();
+    method public void setInitialDelay(long);
+    method public void setProgressBarView(android.view.View);
+    method public void setRootView(android.view.ViewGroup);
+    method public void show();
+  }
+
+  public deprecated class RowsFragment extends android.app.Fragment implements android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapterProvider android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapterProvider {
+    ctor public RowsFragment();
+    method public deprecated void enableRowScaling(boolean);
+    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
+    method public android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter getMainFragmentAdapter();
+    method public android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(int);
+    method public boolean isScrolling();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void setAlignment(int);
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+  }
+
+  public static class RowsFragment.MainFragmentAdapter extends android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter {
+    ctor public RowsFragment.MainFragmentAdapter(android.support.v17.leanback.app.RowsFragment);
+  }
+
+  public static deprecated class RowsFragment.MainFragmentRowsAdapter extends android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter {
+    ctor public RowsFragment.MainFragmentRowsAdapter(android.support.v17.leanback.app.RowsFragment);
+  }
+
+  public class RowsSupportFragment extends android.support.v4.app.Fragment implements android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapterProvider android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapterProvider {
+    ctor public RowsSupportFragment();
+    method public deprecated void enableRowScaling(boolean);
+    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
+    method public android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter getMainFragmentAdapter();
+    method public android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(int);
+    method public boolean isScrolling();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void setAlignment(int);
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+  }
+
+  public static class RowsSupportFragment.MainFragmentAdapter extends android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter {
+    ctor public RowsSupportFragment.MainFragmentAdapter(android.support.v17.leanback.app.RowsSupportFragment);
+  }
+
+  public static class RowsSupportFragment.MainFragmentRowsAdapter extends android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter {
+    ctor public RowsSupportFragment.MainFragmentRowsAdapter(android.support.v17.leanback.app.RowsSupportFragment);
+  }
+
+  public deprecated class SearchFragment extends android.app.Fragment {
+    ctor public SearchFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
+    method public void displayCompletions(java.util.List<java.lang.String>);
+    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.content.Intent getRecognizerIntent();
+    method public android.support.v17.leanback.app.RowsFragment getRowsFragment();
+    method public java.lang.String getTitle();
+    method public static android.support.v17.leanback.app.SearchFragment newInstance(java.lang.String);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSearchQuery(java.lang.String, boolean);
+    method public void setSearchQuery(android.content.Intent, boolean);
+    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchFragment.SearchResultProvider);
+    method public deprecated void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
+    method public void setTitle(java.lang.String);
+    method public void startRecognition();
+  }
+
+  public static abstract interface SearchFragment.SearchResultProvider {
+    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
+    method public abstract boolean onQueryTextChange(java.lang.String);
+    method public abstract boolean onQueryTextSubmit(java.lang.String);
+  }
+
+  public class SearchSupportFragment extends android.support.v4.app.Fragment {
+    ctor public SearchSupportFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
+    method public void displayCompletions(java.util.List<java.lang.String>);
+    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.content.Intent getRecognizerIntent();
+    method public android.support.v17.leanback.app.RowsSupportFragment getRowsSupportFragment();
+    method public java.lang.String getTitle();
+    method public static android.support.v17.leanback.app.SearchSupportFragment newInstance(java.lang.String);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSearchQuery(java.lang.String, boolean);
+    method public void setSearchQuery(android.content.Intent, boolean);
+    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchSupportFragment.SearchResultProvider);
+    method public deprecated void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
+    method public void setTitle(java.lang.String);
+    method public void startRecognition();
+  }
+
+  public static abstract interface SearchSupportFragment.SearchResultProvider {
+    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
+    method public abstract boolean onQueryTextChange(java.lang.String);
+    method public abstract boolean onQueryTextSubmit(java.lang.String);
+  }
+
+  public deprecated class VerticalGridFragment extends android.support.v17.leanback.app.BaseFragment {
+    ctor public VerticalGridFragment();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+  }
+
+  public class VerticalGridSupportFragment extends android.support.v17.leanback.app.BaseSupportFragment {
+    ctor public VerticalGridSupportFragment();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+  }
+
+  public deprecated class VideoFragment extends android.support.v17.leanback.app.PlaybackFragment {
+    ctor public VideoFragment();
+    method public android.view.SurfaceView getSurfaceView();
+    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+  public deprecated class VideoFragmentGlueHost extends android.support.v17.leanback.app.PlaybackFragmentGlueHost implements android.support.v17.leanback.media.SurfaceHolderGlueHost {
+    ctor public VideoFragmentGlueHost(android.support.v17.leanback.app.VideoFragment);
+    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+  public class VideoSupportFragment extends android.support.v17.leanback.app.PlaybackSupportFragment {
+    ctor public VideoSupportFragment();
+    method public android.view.SurfaceView getSurfaceView();
+    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+  public class VideoSupportFragmentGlueHost extends android.support.v17.leanback.app.PlaybackSupportFragmentGlueHost implements android.support.v17.leanback.media.SurfaceHolderGlueHost {
+    ctor public VideoSupportFragmentGlueHost(android.support.v17.leanback.app.VideoSupportFragment);
+    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+}
+
+package android.support.v17.leanback.database {
+
+  public abstract class CursorMapper {
+    ctor public CursorMapper();
+    method protected abstract java.lang.Object bind(android.database.Cursor);
+    method protected abstract void bindColumns(android.database.Cursor);
+    method public java.lang.Object convert(android.database.Cursor);
+  }
+
+}
+
+package android.support.v17.leanback.graphics {
+
+  public class BoundsRule {
+    ctor public BoundsRule();
+    ctor public BoundsRule(android.support.v17.leanback.graphics.BoundsRule);
+    method public void calculateBounds(android.graphics.Rect, android.graphics.Rect);
+    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule bottom;
+    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule left;
+    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule right;
+    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule top;
+  }
+
+  public static final class BoundsRule.ValueRule {
+    method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule absoluteValue(int);
+    method public int getAbsoluteValue();
+    method public float getFraction();
+    method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule inheritFromParent(float);
+    method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule inheritFromParentWithOffset(float, int);
+    method public void setAbsoluteValue(int);
+    method public void setFraction(float);
+  }
+
+  public final class ColorFilterCache {
+    method public static android.support.v17.leanback.graphics.ColorFilterCache getColorFilterCache(int);
+    method public android.graphics.ColorFilter getFilterForLevel(float);
+  }
+
+  public final class ColorFilterDimmer {
+    method public void applyFilterToView(android.view.View);
+    method public static android.support.v17.leanback.graphics.ColorFilterDimmer create(android.support.v17.leanback.graphics.ColorFilterCache, float, float);
+    method public static android.support.v17.leanback.graphics.ColorFilterDimmer createDefault(android.content.Context);
+    method public android.graphics.ColorFilter getColorFilter();
+    method public android.graphics.Paint getPaint();
+    method public void setActiveLevel(float);
+  }
+
+  public final class ColorOverlayDimmer {
+    method public int applyToColor(int);
+    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createColorOverlayDimmer(int, float, float);
+    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createDefault(android.content.Context);
+    method public void drawColorOverlay(android.graphics.Canvas, android.view.View, boolean);
+    method public int getAlpha();
+    method public float getAlphaFloat();
+    method public android.graphics.Paint getPaint();
+    method public boolean needsDraw();
+    method public void setActiveLevel(float);
+  }
+
+  public class CompositeDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public CompositeDrawable();
+    method public void addChildDrawable(android.graphics.drawable.Drawable);
+    method public void draw(android.graphics.Canvas);
+    method public android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable getChildAt(int);
+    method public int getChildCount();
+    method public android.graphics.drawable.Drawable getDrawable(int);
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable);
+    method public void removeChild(int);
+    method public void removeDrawable(android.graphics.drawable.Drawable);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
+    method public void setAlpha(int);
+    method public void setChildDrawableAt(int, android.graphics.drawable.Drawable);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+  }
+
+  public static final class CompositeDrawable.ChildDrawable {
+    ctor public CompositeDrawable.ChildDrawable(android.graphics.drawable.Drawable, android.support.v17.leanback.graphics.CompositeDrawable);
+    method public android.support.v17.leanback.graphics.BoundsRule getBoundsRule();
+    method public android.graphics.drawable.Drawable getDrawable();
+    method public void recomputeBounds();
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> BOTTOM_ABSOLUTE;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> BOTTOM_FRACTION;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> LEFT_ABSOLUTE;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> LEFT_FRACTION;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> RIGHT_ABSOLUTE;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> RIGHT_FRACTION;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> TOP_ABSOLUTE;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> TOP_FRACTION;
+  }
+
+  public class FitWidthBitmapDrawable extends android.graphics.drawable.Drawable {
+    ctor public FitWidthBitmapDrawable();
+    method public void draw(android.graphics.Canvas);
+    method public android.graphics.Bitmap getBitmap();
+    method public int getOpacity();
+    method public android.graphics.Rect getSource();
+    method public int getVerticalOffset();
+    method public void setAlpha(int);
+    method public void setBitmap(android.graphics.Bitmap);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setSource(android.graphics.Rect);
+    method public void setVerticalOffset(int);
+    field public static final android.util.Property<android.support.v17.leanback.graphics.FitWidthBitmapDrawable, java.lang.Integer> PROPERTY_VERTICAL_OFFSET;
+  }
+
+}
+
+package android.support.v17.leanback.media {
+
+  public class MediaControllerAdapter extends android.support.v17.leanback.media.PlayerAdapter {
+    ctor public MediaControllerAdapter(android.support.v4.media.session.MediaControllerCompat);
+    method public android.graphics.drawable.Drawable getMediaArt(android.content.Context);
+    method public android.support.v4.media.session.MediaControllerCompat getMediaController();
+    method public java.lang.CharSequence getMediaSubtitle();
+    method public java.lang.CharSequence getMediaTitle();
+    method public void pause();
+    method public void play();
+  }
+
+  public abstract deprecated class MediaControllerGlue extends android.support.v17.leanback.media.PlaybackControlGlue {
+    ctor public MediaControllerGlue(android.content.Context, int[], int[]);
+    method public void attachToMediaController(android.support.v4.media.session.MediaControllerCompat);
+    method public void detach();
+    method public int getCurrentPosition();
+    method public int getCurrentSpeedId();
+    method public android.graphics.drawable.Drawable getMediaArt();
+    method public final android.support.v4.media.session.MediaControllerCompat getMediaController();
+    method public int getMediaDuration();
+    method public java.lang.CharSequence getMediaSubtitle();
+    method public java.lang.CharSequence getMediaTitle();
+    method public long getSupportedActions();
+    method public boolean hasValidMedia();
+    method public boolean isMediaPlaying();
+  }
+
+  public class MediaPlayerAdapter extends android.support.v17.leanback.media.PlayerAdapter {
+    ctor public MediaPlayerAdapter(android.content.Context);
+    method protected boolean onError(int, int);
+    method protected boolean onInfo(int, int);
+    method protected void onSeekComplete();
+    method public void pause();
+    method public void play();
+    method public void release();
+    method public void reset();
+    method public boolean setDataSource(android.net.Uri);
+  }
+
+  public class PlaybackBannerControlGlue<T extends android.support.v17.leanback.media.PlayerAdapter> extends android.support.v17.leanback.media.PlaybackBaseControlGlue {
+    ctor public PlaybackBannerControlGlue(android.content.Context, int[], T);
+    ctor public PlaybackBannerControlGlue(android.content.Context, int[], int[], T);
+    method public int[] getFastForwardSpeeds();
+    method public int[] getRewindSpeeds();
+    method public void onActionClicked(android.support.v17.leanback.widget.Action);
+    method protected android.support.v17.leanback.widget.PlaybackRowPresenter onCreateRowPresenter();
+    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
+    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
+    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
+    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
+    field public static final int ACTION_REWIND = 32; // 0x20
+    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
+    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
+    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
+    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
+    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
+    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
+    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
+    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
+    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
+    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
+  }
+
+  public abstract class PlaybackBaseControlGlue<T extends android.support.v17.leanback.media.PlayerAdapter> extends android.support.v17.leanback.media.PlaybackGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
+    ctor public PlaybackBaseControlGlue(android.content.Context, T);
+    method public android.graphics.drawable.Drawable getArt();
+    method public final long getBufferedPosition();
+    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
+    method public long getCurrentPosition();
+    method public final long getDuration();
+    method public android.support.v17.leanback.widget.PlaybackRowPresenter getPlaybackRowPresenter();
+    method public final T getPlayerAdapter();
+    method public java.lang.CharSequence getSubtitle();
+    method public long getSupportedActions();
+    method public java.lang.CharSequence getTitle();
+    method public boolean isControlsOverlayAutoHideEnabled();
+    method public final boolean isPlaying();
+    method public final boolean isPrepared();
+    method protected static void notifyItemChanged(android.support.v17.leanback.widget.ArrayObjectAdapter, java.lang.Object);
+    method protected void onCreatePrimaryActions(android.support.v17.leanback.widget.ArrayObjectAdapter);
+    method protected abstract android.support.v17.leanback.widget.PlaybackRowPresenter onCreateRowPresenter();
+    method protected void onCreateSecondaryActions(android.support.v17.leanback.widget.ArrayObjectAdapter);
+    method protected void onMetadataChanged();
+    method protected void onPlayCompleted();
+    method protected void onPlayStateChanged();
+    method protected void onPreparedStateChanged();
+    method protected void onUpdateBufferedProgress();
+    method protected void onUpdateDuration();
+    method protected void onUpdateProgress();
+    method public final void seekTo(long);
+    method public void setArt(android.graphics.drawable.Drawable);
+    method public void setControlsOverlayAutoHideEnabled(boolean);
+    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    method public void setSubtitle(java.lang.CharSequence);
+    method public void setTitle(java.lang.CharSequence);
+    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
+    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
+    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
+    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
+    field public static final int ACTION_REPEAT = 512; // 0x200
+    field public static final int ACTION_REWIND = 32; // 0x20
+    field public static final int ACTION_SHUFFLE = 1024; // 0x400
+    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
+    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
+  }
+
+  public abstract class PlaybackControlGlue extends android.support.v17.leanback.media.PlaybackGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
+    ctor public PlaybackControlGlue(android.content.Context, int[]);
+    ctor public PlaybackControlGlue(android.content.Context, int[], int[]);
+    method public void enableProgressUpdating(boolean);
+    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
+    method public deprecated android.support.v17.leanback.widget.PlaybackControlsRowPresenter getControlsRowPresenter();
+    method public abstract int getCurrentPosition();
+    method public abstract int getCurrentSpeedId();
+    method public int[] getFastForwardSpeeds();
+    method public abstract android.graphics.drawable.Drawable getMediaArt();
+    method public abstract int getMediaDuration();
+    method public abstract java.lang.CharSequence getMediaSubtitle();
+    method public abstract java.lang.CharSequence getMediaTitle();
+    method public android.support.v17.leanback.widget.PlaybackRowPresenter getPlaybackRowPresenter();
+    method public int[] getRewindSpeeds();
+    method public abstract long getSupportedActions();
+    method public int getUpdatePeriod();
+    method public abstract boolean hasValidMedia();
+    method public boolean isFadingEnabled();
+    method public abstract boolean isMediaPlaying();
+    method public void onActionClicked(android.support.v17.leanback.widget.Action);
+    method protected void onCreateControlsRowAndPresenter();
+    method protected void onCreatePrimaryActions(android.support.v17.leanback.widget.SparseArrayObjectAdapter);
+    method protected void onCreateSecondaryActions(android.support.v17.leanback.widget.ArrayObjectAdapter);
+    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+    method protected void onMetadataChanged();
+    method protected void onStateChanged();
+    method public void play(int);
+    method public final void play();
+    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method public deprecated void setControlsRowPresenter(android.support.v17.leanback.widget.PlaybackControlsRowPresenter);
+    method public void setFadingEnabled(boolean);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    method public void updateProgress();
+    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
+    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
+    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
+    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
+    field public static final int ACTION_REWIND = 32; // 0x20
+    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
+    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
+    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
+    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
+    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
+    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
+    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
+    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
+    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
+    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
+  }
+
+  public abstract class PlaybackGlue {
+    ctor public PlaybackGlue(android.content.Context);
+    method public void addPlayerCallback(android.support.v17.leanback.media.PlaybackGlue.PlayerCallback);
+    method public android.content.Context getContext();
+    method public android.support.v17.leanback.media.PlaybackGlueHost getHost();
+    method protected java.util.List<android.support.v17.leanback.media.PlaybackGlue.PlayerCallback> getPlayerCallbacks();
+    method public boolean isPlaying();
+    method public boolean isPrepared();
+    method public void next();
+    method protected void onAttachedToHost(android.support.v17.leanback.media.PlaybackGlueHost);
+    method protected void onDetachedFromHost();
+    method protected void onHostPause();
+    method protected void onHostResume();
+    method protected void onHostStart();
+    method protected void onHostStop();
+    method public void pause();
+    method public void play();
+    method public void playWhenPrepared();
+    method public void previous();
+    method public void removePlayerCallback(android.support.v17.leanback.media.PlaybackGlue.PlayerCallback);
+    method public final void setHost(android.support.v17.leanback.media.PlaybackGlueHost);
+  }
+
+  public static abstract class PlaybackGlue.PlayerCallback {
+    ctor public PlaybackGlue.PlayerCallback();
+    method public void onPlayCompleted(android.support.v17.leanback.media.PlaybackGlue);
+    method public void onPlayStateChanged(android.support.v17.leanback.media.PlaybackGlue);
+    method public void onPreparedStateChanged(android.support.v17.leanback.media.PlaybackGlue);
+  }
+
+  public abstract class PlaybackGlueHost {
+    ctor public PlaybackGlueHost();
+    method public deprecated void fadeOut();
+    method public android.support.v17.leanback.media.PlaybackGlueHost.PlayerCallback getPlayerCallback();
+    method public void hideControlsOverlay(boolean);
+    method public boolean isControlsOverlayAutoHideEnabled();
+    method public boolean isControlsOverlayVisible();
+    method public void notifyPlaybackRowChanged();
+    method public void setControlsOverlayAutoHideEnabled(boolean);
+    method public deprecated void setFadingEnabled(boolean);
+    method public void setHostCallback(android.support.v17.leanback.media.PlaybackGlueHost.HostCallback);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public void setOnKeyInterceptListener(android.view.View.OnKeyListener);
+    method public void setPlaybackRow(android.support.v17.leanback.widget.Row);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    method public void showControlsOverlay(boolean);
+  }
+
+  public static abstract class PlaybackGlueHost.HostCallback {
+    ctor public PlaybackGlueHost.HostCallback();
+    method public void onHostDestroy();
+    method public void onHostPause();
+    method public void onHostResume();
+    method public void onHostStart();
+    method public void onHostStop();
+  }
+
+  public static class PlaybackGlueHost.PlayerCallback {
+    ctor public PlaybackGlueHost.PlayerCallback();
+    method public void onBufferingStateChanged(boolean);
+    method public void onError(int, java.lang.CharSequence);
+    method public void onVideoSizeChanged(int, int);
+  }
+
+  public class PlaybackTransportControlGlue<T extends android.support.v17.leanback.media.PlayerAdapter> extends android.support.v17.leanback.media.PlaybackBaseControlGlue {
+    ctor public PlaybackTransportControlGlue(android.content.Context, T);
+    method public final android.support.v17.leanback.widget.PlaybackSeekDataProvider getSeekProvider();
+    method public final boolean isSeekEnabled();
+    method public void onActionClicked(android.support.v17.leanback.widget.Action);
+    method protected android.support.v17.leanback.widget.PlaybackRowPresenter onCreateRowPresenter();
+    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+    method public final void setSeekEnabled(boolean);
+    method public final void setSeekProvider(android.support.v17.leanback.widget.PlaybackSeekDataProvider);
+  }
+
+  public abstract class PlayerAdapter {
+    ctor public PlayerAdapter();
+    method public void fastForward();
+    method public long getBufferedPosition();
+    method public final android.support.v17.leanback.media.PlayerAdapter.Callback getCallback();
+    method public long getCurrentPosition();
+    method public long getDuration();
+    method public long getSupportedActions();
+    method public boolean isPlaying();
+    method public boolean isPrepared();
+    method public void next();
+    method public void onAttachedToHost(android.support.v17.leanback.media.PlaybackGlueHost);
+    method public void onDetachedFromHost();
+    method public abstract void pause();
+    method public abstract void play();
+    method public void previous();
+    method public void rewind();
+    method public void seekTo(long);
+    method public final void setCallback(android.support.v17.leanback.media.PlayerAdapter.Callback);
+    method public void setProgressUpdatingEnabled(boolean);
+    method public void setRepeatAction(int);
+    method public void setShuffleAction(int);
+  }
+
+  public static class PlayerAdapter.Callback {
+    ctor public PlayerAdapter.Callback();
+    method public void onBufferedPositionChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onBufferingStateChanged(android.support.v17.leanback.media.PlayerAdapter, boolean);
+    method public void onCurrentPositionChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onDurationChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onError(android.support.v17.leanback.media.PlayerAdapter, int, java.lang.String);
+    method public void onMetadataChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onPlayCompleted(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onPlayStateChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onPreparedStateChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onVideoSizeChanged(android.support.v17.leanback.media.PlayerAdapter, int, int);
+  }
+
+  public abstract interface SurfaceHolderGlueHost {
+    method public abstract void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+}
+
+package android.support.v17.leanback.system {
+
+  public class Settings {
+    method public boolean getBoolean(java.lang.String);
+    method public static android.support.v17.leanback.system.Settings getInstance(android.content.Context);
+    method public void setBoolean(java.lang.String, boolean);
+    field public static final java.lang.String OUTLINE_CLIPPING_DISABLED = "OUTLINE_CLIPPING_DISABLED";
+    field public static final java.lang.String PREFER_STATIC_SHADOWS = "PREFER_STATIC_SHADOWS";
+  }
+
+}
+
+package android.support.v17.leanback.widget {
+
+  public abstract class AbstractDetailsDescriptionPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public AbstractDetailsDescriptionPresenter();
+    method protected abstract void onBindDescription(android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder, java.lang.Object);
+    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public final android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+  }
+
+  public static class AbstractDetailsDescriptionPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public AbstractDetailsDescriptionPresenter.ViewHolder(android.view.View);
+    method public android.widget.TextView getBody();
+    method public android.widget.TextView getSubtitle();
+    method public android.widget.TextView getTitle();
+  }
+
+  public abstract class AbstractMediaItemPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public AbstractMediaItemPresenter();
+    ctor public AbstractMediaItemPresenter(int);
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public android.support.v17.leanback.widget.Presenter getActionPresenter();
+    method protected int getMediaPlayState(java.lang.Object);
+    method public int getThemeId();
+    method public boolean hasMediaRowSeparator();
+    method protected abstract void onBindMediaDetails(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder, java.lang.Object);
+    method public void onBindMediaPlayState(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
+    method protected void onBindRowActions(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
+    method protected void onUnbindMediaDetails(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
+    method public void onUnbindMediaPlayState(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
+    method public void setActionPresenter(android.support.v17.leanback.widget.Presenter);
+    method public void setBackgroundColor(int);
+    method public void setHasMediaRowSeparator(boolean);
+    method public void setThemeId(int);
+    field public static final int PLAY_STATE_INITIAL = 0; // 0x0
+    field public static final int PLAY_STATE_PAUSED = 1; // 0x1
+    field public static final int PLAY_STATE_PLAYING = 2; // 0x2
+  }
+
+  public static class AbstractMediaItemPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public AbstractMediaItemPresenter.ViewHolder(android.view.View);
+    method public android.view.ViewGroup getMediaItemActionsContainer();
+    method public android.view.View getMediaItemDetailsView();
+    method public android.widget.TextView getMediaItemDurationView();
+    method public android.widget.TextView getMediaItemNameView();
+    method public android.widget.TextView getMediaItemNumberView();
+    method public android.widget.ViewFlipper getMediaItemNumberViewFlipper();
+    method public android.view.View getMediaItemPausedView();
+    method public android.view.View getMediaItemPlayingView();
+    method public android.support.v17.leanback.widget.MultiActionsProvider.MultiAction[] getMediaItemRowActions();
+    method public android.view.View getMediaItemRowSeparator();
+    method public android.view.View getSelectorView();
+    method public void notifyActionChanged(android.support.v17.leanback.widget.MultiActionsProvider.MultiAction);
+    method public void notifyDetailsChanged();
+    method public void notifyPlayStateChanged();
+    method public void onBindRowActions();
+    method public void setSelectedMediaItemNumberView(int);
+  }
+
+  public abstract class AbstractMediaListHeaderPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public AbstractMediaListHeaderPresenter(android.content.Context, int);
+    ctor public AbstractMediaListHeaderPresenter();
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method protected abstract void onBindMediaListHeaderViewHolder(android.support.v17.leanback.widget.AbstractMediaListHeaderPresenter.ViewHolder, java.lang.Object);
+    method public void setBackgroundColor(int);
+  }
+
+  public static class AbstractMediaListHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public AbstractMediaListHeaderPresenter.ViewHolder(android.view.View);
+    method public android.widget.TextView getHeaderView();
+  }
+
+  public class Action {
+    ctor public Action(long);
+    ctor public Action(long, java.lang.CharSequence);
+    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence);
+    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence, android.graphics.drawable.Drawable);
+    method public final void addKeyCode(int);
+    method public final android.graphics.drawable.Drawable getIcon();
+    method public final long getId();
+    method public final java.lang.CharSequence getLabel1();
+    method public final java.lang.CharSequence getLabel2();
+    method public final void removeKeyCode(int);
+    method public final boolean respondsToKeyCode(int);
+    method public final void setIcon(android.graphics.drawable.Drawable);
+    method public final void setId(long);
+    method public final void setLabel1(java.lang.CharSequence);
+    method public final void setLabel2(java.lang.CharSequence);
+    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
+  }
+
+  public class ArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
+    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
+    ctor public ArrayObjectAdapter();
+    method public void add(java.lang.Object);
+    method public void add(int, java.lang.Object);
+    method public void addAll(int, java.util.Collection);
+    method public void clear();
+    method public java.lang.Object get(int);
+    method public int indexOf(java.lang.Object);
+    method public void move(int, int);
+    method public void notifyArrayItemRangeChanged(int, int);
+    method public boolean remove(java.lang.Object);
+    method public int removeItems(int, int);
+    method public void replace(int, java.lang.Object);
+    method public void setItems(java.util.List, android.support.v17.leanback.widget.DiffCallback);
+    method public int size();
+    method public <E> java.util.List<E> unmodifiableList();
+  }
+
+  public class BaseCardView extends android.widget.FrameLayout {
+    ctor public BaseCardView(android.content.Context);
+    ctor public BaseCardView(android.content.Context, android.util.AttributeSet);
+    ctor public BaseCardView(android.content.Context, android.util.AttributeSet, int);
+    method protected android.support.v17.leanback.widget.BaseCardView.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v17.leanback.widget.BaseCardView.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v17.leanback.widget.BaseCardView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getCardType();
+    method public deprecated int getExtraVisibility();
+    method public int getInfoVisibility();
+    method public boolean isSelectedAnimationDelayed();
+    method public void setCardType(int);
+    method public deprecated void setExtraVisibility(int);
+    method public void setInfoVisibility(int);
+    method public void setSelectedAnimationDelayed(boolean);
+    field public static final int CARD_REGION_VISIBLE_ACTIVATED = 1; // 0x1
+    field public static final int CARD_REGION_VISIBLE_ALWAYS = 0; // 0x0
+    field public static final int CARD_REGION_VISIBLE_SELECTED = 2; // 0x2
+    field public static final int CARD_TYPE_INFO_OVER = 1; // 0x1
+    field public static final int CARD_TYPE_INFO_UNDER = 2; // 0x2
+    field public static final int CARD_TYPE_INFO_UNDER_WITH_EXTRA = 3; // 0x3
+    field public static final int CARD_TYPE_MAIN_ONLY = 0; // 0x0
+  }
+
+  public static class BaseCardView.LayoutParams extends android.widget.FrameLayout.LayoutParams {
+    ctor public BaseCardView.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public BaseCardView.LayoutParams(int, int);
+    ctor public BaseCardView.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public BaseCardView.LayoutParams(android.support.v17.leanback.widget.BaseCardView.LayoutParams);
+    field public static final int VIEW_TYPE_EXTRA = 2; // 0x2
+    field public static final int VIEW_TYPE_INFO = 1; // 0x1
+    field public static final int VIEW_TYPE_MAIN = 0; // 0x0
+    field public int viewType;
+  }
+
+  public abstract class BaseGridView extends android.support.v7.widget.RecyclerView {
+    method public void addOnChildViewHolderSelectedListener(android.support.v17.leanback.widget.OnChildViewHolderSelectedListener);
+    method public void animateIn();
+    method public void animateOut();
+    method public int getChildDrawingOrder(int, int);
+    method public deprecated int getHorizontalMargin();
+    method public int getHorizontalSpacing();
+    method public int getInitialPrefetchItemCount();
+    method public int getItemAlignmentOffset();
+    method public float getItemAlignmentOffsetPercent();
+    method public int getItemAlignmentViewId();
+    method public android.support.v17.leanback.widget.BaseGridView.OnUnhandledKeyListener getOnUnhandledKeyListener();
+    method public final int getSaveChildrenLimitNumber();
+    method public final int getSaveChildrenPolicy();
+    method public int getSelectedPosition();
+    method public deprecated int getVerticalMargin();
+    method public int getVerticalSpacing();
+    method public void getViewSelectedOffsets(android.view.View, int[]);
+    method public int getWindowAlignment();
+    method public int getWindowAlignmentOffset();
+    method public float getWindowAlignmentOffsetPercent();
+    method public boolean hasPreviousViewInSameRow(int);
+    method public boolean isChildLayoutAnimated();
+    method public boolean isFocusDrawingOrderEnabled();
+    method public final boolean isFocusSearchDisabled();
+    method public boolean isItemAlignmentOffsetWithPadding();
+    method public boolean isScrollEnabled();
+    method public boolean isWindowAlignmentPreferKeyLineOverHighEdge();
+    method public boolean isWindowAlignmentPreferKeyLineOverLowEdge();
+    method public boolean onRequestFocusInDescendants(int, android.graphics.Rect);
+    method public void removeOnChildViewHolderSelectedListener(android.support.v17.leanback.widget.OnChildViewHolderSelectedListener);
+    method public void setAnimateChildLayout(boolean);
+    method public void setChildrenVisibility(int);
+    method public void setFocusDrawingOrderEnabled(boolean);
+    method public final void setFocusSearchDisabled(boolean);
+    method public void setGravity(int);
+    method public void setHasOverlappingRendering(boolean);
+    method public deprecated void setHorizontalMargin(int);
+    method public void setHorizontalSpacing(int);
+    method public void setInitialPrefetchItemCount(int);
+    method public void setItemAlignmentOffset(int);
+    method public void setItemAlignmentOffsetPercent(float);
+    method public void setItemAlignmentOffsetWithPadding(boolean);
+    method public void setItemAlignmentViewId(int);
+    method public deprecated void setItemMargin(int);
+    method public void setItemSpacing(int);
+    method public void setLayoutEnabled(boolean);
+    method public void setOnChildLaidOutListener(android.support.v17.leanback.widget.OnChildLaidOutListener);
+    method public void setOnChildSelectedListener(android.support.v17.leanback.widget.OnChildSelectedListener);
+    method public void setOnChildViewHolderSelectedListener(android.support.v17.leanback.widget.OnChildViewHolderSelectedListener);
+    method public void setOnKeyInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnKeyInterceptListener);
+    method public void setOnMotionInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnMotionInterceptListener);
+    method public void setOnTouchInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnTouchInterceptListener);
+    method public void setOnUnhandledKeyListener(android.support.v17.leanback.widget.BaseGridView.OnUnhandledKeyListener);
+    method public void setPruneChild(boolean);
+    method public final void setSaveChildrenLimitNumber(int);
+    method public final void setSaveChildrenPolicy(int);
+    method public void setScrollEnabled(boolean);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, int);
+    method public void setSelectedPosition(int, android.support.v17.leanback.widget.ViewHolderTask);
+    method public void setSelectedPositionSmooth(int);
+    method public void setSelectedPositionSmooth(int, android.support.v17.leanback.widget.ViewHolderTask);
+    method public deprecated void setVerticalMargin(int);
+    method public void setVerticalSpacing(int);
+    method public void setWindowAlignment(int);
+    method public void setWindowAlignmentOffset(int);
+    method public void setWindowAlignmentOffsetPercent(float);
+    method public void setWindowAlignmentPreferKeyLineOverHighEdge(boolean);
+    method public void setWindowAlignmentPreferKeyLineOverLowEdge(boolean);
+    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+    field public static final int SAVE_ALL_CHILD = 3; // 0x3
+    field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
+    field public static final int SAVE_NO_CHILD = 0; // 0x0
+    field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
+    field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
+    field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
+    field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
+    field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
+    field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+  }
+
+  public static abstract interface BaseGridView.OnKeyInterceptListener {
+    method public abstract boolean onInterceptKeyEvent(android.view.KeyEvent);
+  }
+
+  public static abstract interface BaseGridView.OnMotionInterceptListener {
+    method public abstract boolean onInterceptMotionEvent(android.view.MotionEvent);
+  }
+
+  public static abstract interface BaseGridView.OnTouchInterceptListener {
+    method public abstract boolean onInterceptTouchEvent(android.view.MotionEvent);
+  }
+
+  public static abstract interface BaseGridView.OnUnhandledKeyListener {
+    method public abstract boolean onUnhandledKey(android.view.KeyEvent);
+  }
+
+  public abstract interface BaseOnItemViewClickedListener<T> {
+    method public abstract void onItemClicked(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, T);
+  }
+
+  public abstract interface BaseOnItemViewSelectedListener<T> {
+    method public abstract void onItemSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, T);
+  }
+
+  public class BrowseFrameLayout extends android.widget.FrameLayout {
+    ctor public BrowseFrameLayout(android.content.Context);
+    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet);
+    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet, int);
+    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener getOnChildFocusListener();
+    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
+    method public void setOnChildFocusListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener);
+    method public void setOnDispatchKeyListener(android.view.View.OnKeyListener);
+    method public void setOnFocusSearchListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener);
+  }
+
+  public static abstract interface BrowseFrameLayout.OnChildFocusListener {
+    method public abstract void onRequestChildFocus(android.view.View, android.view.View);
+    method public abstract boolean onRequestFocusInDescendants(int, android.graphics.Rect);
+  }
+
+  public static abstract interface BrowseFrameLayout.OnFocusSearchListener {
+    method public abstract android.view.View onFocusSearch(android.view.View, int);
+  }
+
+  public final class ClassPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
+    ctor public ClassPresenterSelector();
+    method public android.support.v17.leanback.widget.ClassPresenterSelector addClassPresenter(java.lang.Class<?>, android.support.v17.leanback.widget.Presenter);
+    method public android.support.v17.leanback.widget.ClassPresenterSelector addClassPresenterSelector(java.lang.Class<?>, android.support.v17.leanback.widget.PresenterSelector);
+    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+  }
+
+  public class ControlButtonPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
+    ctor public ControlButtonPresenterSelector();
+    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+    method public android.support.v17.leanback.widget.Presenter getPrimaryPresenter();
+    method public android.support.v17.leanback.widget.Presenter getSecondaryPresenter();
+  }
+
+  public class CursorObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
+    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.Presenter);
+    ctor public CursorObjectAdapter();
+    method public void changeCursor(android.database.Cursor);
+    method public void close();
+    method public java.lang.Object get(int);
+    method public final android.database.Cursor getCursor();
+    method public final android.support.v17.leanback.database.CursorMapper getMapper();
+    method protected final void invalidateCache(int);
+    method protected final void invalidateCache(int, int);
+    method public boolean isClosed();
+    method protected void onCursorChanged();
+    method protected void onMapperChanged();
+    method public final void setMapper(android.support.v17.leanback.database.CursorMapper);
+    method public int size();
+    method public android.database.Cursor swapCursor(android.database.Cursor);
+  }
+
+  public class DetailsOverviewLogoPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public DetailsOverviewLogoPresenter();
+    method public boolean isBoundToImage(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.DetailsOverviewRow);
+    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public android.view.View onCreateView(android.view.ViewGroup);
+    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void setContext(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
+  }
+
+  public static class DetailsOverviewLogoPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public DetailsOverviewLogoPresenter.ViewHolder(android.view.View);
+    method public android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter getParentPresenter();
+    method public android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder getParentViewHolder();
+    method public boolean isSizeFromDrawableIntrinsic();
+    method public void setSizeFromDrawableIntrinsic(boolean);
+    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter mParentPresenter;
+    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder mParentViewHolder;
+  }
+
+  public class DetailsOverviewRow extends android.support.v17.leanback.widget.Row {
+    ctor public DetailsOverviewRow(java.lang.Object);
+    method public final deprecated void addAction(android.support.v17.leanback.widget.Action);
+    method public final deprecated void addAction(int, android.support.v17.leanback.widget.Action);
+    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
+    method public final deprecated java.util.List<android.support.v17.leanback.widget.Action> getActions();
+    method public final android.support.v17.leanback.widget.ObjectAdapter getActionsAdapter();
+    method public final android.graphics.drawable.Drawable getImageDrawable();
+    method public final java.lang.Object getItem();
+    method public boolean isImageScaleUpAllowed();
+    method public final deprecated boolean removeAction(android.support.v17.leanback.widget.Action);
+    method public final void setActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
+    method public final void setImageDrawable(android.graphics.drawable.Drawable);
+    method public void setImageScaleUpAllowed(boolean);
+    method public final void setItem(java.lang.Object);
+  }
+
+  public static class DetailsOverviewRow.Listener {
+    ctor public DetailsOverviewRow.Listener();
+    method public void onActionsAdapterChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
+    method public void onImageDrawableChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
+    method public void onItemChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
+  }
+
+  public deprecated class DetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public DetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public int getBackgroundColor();
+    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
+    method public boolean isStyleLarge();
+    method public final boolean isUsingDefaultSelectEffect();
+    method public void setBackgroundColor(int);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
+    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
+    method public void setStyleLarge(boolean);
+  }
+
+  public final class DetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public DetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
+    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDetailsDescriptionViewHolder;
+  }
+
+  public class DetailsParallax extends android.support.v17.leanback.widget.RecyclerViewParallax {
+    ctor public DetailsParallax();
+    method public android.support.v17.leanback.widget.Parallax.IntProperty getOverviewRowBottom();
+    method public android.support.v17.leanback.widget.Parallax.IntProperty getOverviewRowTop();
+  }
+
+  public abstract class DiffCallback<Value> {
+    ctor public DiffCallback();
+    method public abstract boolean areContentsTheSame(Value, Value);
+    method public abstract boolean areItemsTheSame(Value, Value);
+    method public java.lang.Object getChangePayload(Value, Value);
+  }
+
+  public class DividerPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public DividerPresenter();
+    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+  }
+
+  public class DividerRow extends android.support.v17.leanback.widget.Row {
+    ctor public DividerRow();
+    method public final boolean isRenderedAsRowView();
+  }
+
+  public abstract interface FacetProvider {
+    method public abstract java.lang.Object getFacet(java.lang.Class<?>);
+  }
+
+  public abstract interface FacetProviderAdapter {
+    method public abstract android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
+  }
+
+  public abstract interface FocusHighlight {
+    field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
+    field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
+    field public static final int ZOOM_FACTOR_NONE = 0; // 0x0
+    field public static final int ZOOM_FACTOR_SMALL = 1; // 0x1
+    field public static final int ZOOM_FACTOR_XSMALL = 4; // 0x4
+  }
+
+  public class FocusHighlightHelper {
+    ctor public FocusHighlightHelper();
+    method public static void setupBrowseItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, int, boolean);
+    method public static deprecated void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView);
+    method public static deprecated void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView, boolean);
+    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter);
+    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, boolean);
+  }
+
+  public abstract interface FragmentAnimationProvider {
+    method public abstract void onImeAppearing(java.util.List<android.animation.Animator>);
+    method public abstract void onImeDisappearing(java.util.List<android.animation.Animator>);
+  }
+
+  public class FullWidthDetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
+    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public final int getActionsBackgroundColor();
+    method public final int getAlignmentMode();
+    method public final int getBackgroundColor();
+    method public final int getInitialState();
+    method protected int getLayoutResourceId();
+    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
+    method public final boolean isParticipatingEntranceTransition();
+    method public final boolean isUsingDefaultSelectEffect();
+    method public final void notifyOnBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
+    method protected void onLayoutLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
+    method protected void onLayoutOverviewFrame(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
+    method protected void onStateChanged(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
+    method public final void setActionsBackgroundColor(int);
+    method public final void setAlignmentMode(int);
+    method public final void setBackgroundColor(int);
+    method public final void setInitialState(int);
+    method public final void setListener(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public final void setParticipatingEntranceTransition(boolean);
+    method public final void setState(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
+    field public static final int ALIGN_MODE_MIDDLE = 1; // 0x1
+    field public static final int ALIGN_MODE_START = 0; // 0x0
+    field public static final int STATE_FULL = 1; // 0x1
+    field public static final int STATE_HALF = 0; // 0x0
+    field public static final int STATE_SMALL = 2; // 0x2
+    field protected int mInitialState;
+  }
+
+  public static abstract class FullWidthDetailsOverviewRowPresenter.Listener {
+    ctor public FullWidthDetailsOverviewRowPresenter.Listener();
+    method public void onBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
+  }
+
+  public class FullWidthDetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
+    method protected android.support.v17.leanback.widget.DetailsOverviewRow.Listener createRowListener();
+    method public final android.view.ViewGroup getActionsRow();
+    method public final android.view.ViewGroup getDetailsDescriptionFrame();
+    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getDetailsDescriptionViewHolder();
+    method public final android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder getLogoViewHolder();
+    method public final android.view.ViewGroup getOverviewView();
+    method public final int getState();
+    field protected final android.support.v17.leanback.widget.DetailsOverviewRow.Listener mRowListener;
+  }
+
+  public class FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener extends android.support.v17.leanback.widget.DetailsOverviewRow.Listener {
+    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener();
+  }
+
+  public class FullWidthDetailsOverviewSharedElementHelper extends android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener {
+    ctor public FullWidthDetailsOverviewSharedElementHelper();
+    method public boolean getAutoStartSharedElementTransition();
+    method public void setAutoStartSharedElementTransition(boolean);
+    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
+    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
+    method public void startPostponedEnterTransition();
+  }
+
+  public class GuidanceStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
+    ctor public GuidanceStylist();
+    method public android.widget.TextView getBreadcrumbView();
+    method public android.widget.TextView getDescriptionView();
+    method public android.widget.ImageView getIconView();
+    method public android.widget.TextView getTitleView();
+    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.support.v17.leanback.widget.GuidanceStylist.Guidance);
+    method public void onDestroyView();
+    method public void onImeAppearing(java.util.List<android.animation.Animator>);
+    method public void onImeDisappearing(java.util.List<android.animation.Animator>);
+    method public int onProvideLayoutId();
+  }
+
+  public static class GuidanceStylist.Guidance {
+    ctor public GuidanceStylist.Guidance(java.lang.String, java.lang.String, java.lang.String, android.graphics.drawable.Drawable);
+    method public java.lang.String getBreadcrumb();
+    method public java.lang.String getDescription();
+    method public android.graphics.drawable.Drawable getIconDrawable();
+    method public java.lang.String getTitle();
+  }
+
+  public class GuidedAction extends android.support.v17.leanback.widget.Action {
+    ctor protected GuidedAction();
+    method public int getCheckSetId();
+    method public java.lang.CharSequence getDescription();
+    method public int getDescriptionEditInputType();
+    method public int getDescriptionInputType();
+    method public java.lang.CharSequence getEditDescription();
+    method public int getEditInputType();
+    method public java.lang.CharSequence getEditTitle();
+    method public int getInputType();
+    method public android.content.Intent getIntent();
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getSubActions();
+    method public java.lang.CharSequence getTitle();
+    method public boolean hasEditableActivatorView();
+    method public boolean hasMultilineDescription();
+    method public boolean hasNext();
+    method public boolean hasSubActions();
+    method public boolean hasTextEditable();
+    method public boolean infoOnly();
+    method public final boolean isAutoSaveRestoreEnabled();
+    method public boolean isChecked();
+    method public boolean isDescriptionEditable();
+    method public boolean isEditTitleUsed();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public void onRestoreInstanceState(android.os.Bundle, java.lang.String);
+    method public void onSaveInstanceState(android.os.Bundle, java.lang.String);
+    method public void setChecked(boolean);
+    method public void setDescription(java.lang.CharSequence);
+    method public void setEditDescription(java.lang.CharSequence);
+    method public void setEditTitle(java.lang.CharSequence);
+    method public void setEnabled(boolean);
+    method public void setFocusable(boolean);
+    method public void setIntent(android.content.Intent);
+    method public void setSubActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public void setTitle(java.lang.CharSequence);
+    field public static final long ACTION_ID_CANCEL = -5L; // 0xfffffffffffffffbL
+    field public static final long ACTION_ID_CONTINUE = -7L; // 0xfffffffffffffff9L
+    field public static final long ACTION_ID_CURRENT = -3L; // 0xfffffffffffffffdL
+    field public static final long ACTION_ID_FINISH = -6L; // 0xfffffffffffffffaL
+    field public static final long ACTION_ID_NEXT = -2L; // 0xfffffffffffffffeL
+    field public static final long ACTION_ID_NO = -9L; // 0xfffffffffffffff7L
+    field public static final long ACTION_ID_OK = -4L; // 0xfffffffffffffffcL
+    field public static final long ACTION_ID_YES = -8L; // 0xfffffffffffffff8L
+    field public static final int CHECKBOX_CHECK_SET_ID = -1; // 0xffffffff
+    field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
+    field public static final int NO_CHECK_SET = 0; // 0x0
+  }
+
+  public static class GuidedAction.Builder extends android.support.v17.leanback.widget.GuidedAction.BuilderBase {
+    ctor public deprecated GuidedAction.Builder();
+    ctor public GuidedAction.Builder(android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedAction build();
+  }
+
+  public static abstract class GuidedAction.BuilderBase<B extends android.support.v17.leanback.widget.GuidedAction.BuilderBase> {
+    ctor public GuidedAction.BuilderBase(android.content.Context);
+    method protected final void applyValues(android.support.v17.leanback.widget.GuidedAction);
+    method public B autoSaveRestoreEnabled(boolean);
+    method public B checkSetId(int);
+    method public B checked(boolean);
+    method public B clickAction(long);
+    method public B description(java.lang.CharSequence);
+    method public B description(int);
+    method public B descriptionEditInputType(int);
+    method public B descriptionEditable(boolean);
+    method public B descriptionInputType(int);
+    method public B editDescription(java.lang.CharSequence);
+    method public B editDescription(int);
+    method public B editInputType(int);
+    method public B editTitle(java.lang.CharSequence);
+    method public B editTitle(int);
+    method public B editable(boolean);
+    method public B enabled(boolean);
+    method public B focusable(boolean);
+    method public android.content.Context getContext();
+    method public B hasEditableActivatorView(boolean);
+    method public B hasNext(boolean);
+    method public B icon(android.graphics.drawable.Drawable);
+    method public B icon(int);
+    method public deprecated B iconResourceId(int, android.content.Context);
+    method public B id(long);
+    method public B infoOnly(boolean);
+    method public B inputType(int);
+    method public B intent(android.content.Intent);
+    method public B multilineDescription(boolean);
+    method public B subActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public B title(java.lang.CharSequence);
+    method public B title(int);
+  }
+
+  public class GuidedActionDiffCallback extends android.support.v17.leanback.widget.DiffCallback {
+    ctor public GuidedActionDiffCallback();
+    method public boolean areContentsTheSame(android.support.v17.leanback.widget.GuidedAction, android.support.v17.leanback.widget.GuidedAction);
+    method public boolean areItemsTheSame(android.support.v17.leanback.widget.GuidedAction, android.support.v17.leanback.widget.GuidedAction);
+    method public static android.support.v17.leanback.widget.GuidedActionDiffCallback getInstance();
+  }
+
+  public class GuidedActionEditText extends android.widget.EditText implements android.support.v17.leanback.widget.ImeKeyMonitor {
+    ctor public GuidedActionEditText(android.content.Context);
+    ctor public GuidedActionEditText(android.content.Context, android.util.AttributeSet);
+    ctor public GuidedActionEditText(android.content.Context, android.util.AttributeSet, int);
+    method public void setImeKeyListener(android.support.v17.leanback.widget.ImeKeyMonitor.ImeKeyListener);
+  }
+
+  public class GuidedActionsStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
+    ctor public GuidedActionsStylist();
+    method public void collapseAction(boolean);
+    method public void expandAction(android.support.v17.leanback.widget.GuidedAction, boolean);
+    method public android.support.v17.leanback.widget.VerticalGridView getActionsGridView();
+    method public android.support.v17.leanback.widget.GuidedAction getExpandedAction();
+    method public int getItemViewType(android.support.v17.leanback.widget.GuidedAction);
+    method public android.support.v17.leanback.widget.VerticalGridView getSubActionsGridView();
+    method public final boolean isBackKeyToCollapseActivatorView();
+    method public final boolean isBackKeyToCollapseSubActions();
+    method public boolean isButtonActions();
+    method public boolean isExpandTransitionSupported();
+    method public boolean isExpanded();
+    method public boolean isInExpandTransition();
+    method public boolean isSubActionsExpanded();
+    method public void onAnimateItemChecked(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
+    method public void onAnimateItemFocused(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
+    method public void onAnimateItemPressed(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
+    method public void onAnimateItemPressedCancelled(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+    method public void onBindActivatorView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void onBindCheckMarkView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void onBindChevronView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void onBindViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onDestroyView();
+    method protected deprecated void onEditingModeChange(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
+    method protected void onEditingModeChange(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean, boolean);
+    method public void onImeAppearing(java.util.List<android.animation.Animator>);
+    method public void onImeDisappearing(java.util.List<android.animation.Animator>);
+    method public int onProvideItemLayoutId();
+    method public int onProvideItemLayoutId(int);
+    method public int onProvideLayoutId();
+    method public boolean onUpdateActivatorView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void onUpdateExpandedViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+    method public void openInEditMode(android.support.v17.leanback.widget.GuidedAction);
+    method public void setAsButtonActions();
+    method public final void setBackKeyToCollapseActivatorView(boolean);
+    method public final void setBackKeyToCollapseSubActions(boolean);
+    method public deprecated void setEditingMode(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
+    method public deprecated void setExpandedViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+    method protected void setupImeOptions(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public deprecated void startExpandedTransition(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+    field public static final int VIEW_TYPE_DATE_PICKER = 1; // 0x1
+    field public static final int VIEW_TYPE_DEFAULT = 0; // 0x0
+  }
+
+  public static class GuidedActionsStylist.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
+    ctor public GuidedActionsStylist.ViewHolder(android.view.View);
+    ctor public GuidedActionsStylist.ViewHolder(android.view.View, boolean);
+    method public android.support.v17.leanback.widget.GuidedAction getAction();
+    method public android.widget.ImageView getCheckmarkView();
+    method public android.widget.ImageView getChevronView();
+    method public android.view.View getContentView();
+    method public android.widget.TextView getDescriptionView();
+    method public android.widget.EditText getEditableDescriptionView();
+    method public android.widget.EditText getEditableTitleView();
+    method public android.view.View getEditingView();
+    method public java.lang.Object getFacet(java.lang.Class<?>);
+    method public android.widget.ImageView getIconView();
+    method public android.widget.TextView getTitleView();
+    method public boolean isInEditing();
+    method public boolean isInEditingActivatorView();
+    method public boolean isInEditingDescription();
+    method public boolean isInEditingText();
+    method public boolean isInEditingTitle();
+    method public boolean isSubAction();
+  }
+
+  public class GuidedDatePickerAction extends android.support.v17.leanback.widget.GuidedAction {
+    ctor public GuidedDatePickerAction();
+    method public long getDate();
+    method public java.lang.String getDatePickerFormat();
+    method public long getMaxDate();
+    method public long getMinDate();
+    method public void setDate(long);
+  }
+
+  public static final class GuidedDatePickerAction.Builder extends android.support.v17.leanback.widget.GuidedDatePickerAction.BuilderBase {
+    ctor public GuidedDatePickerAction.Builder(android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedDatePickerAction build();
+  }
+
+  public static abstract class GuidedDatePickerAction.BuilderBase<B extends android.support.v17.leanback.widget.GuidedDatePickerAction.BuilderBase> extends android.support.v17.leanback.widget.GuidedAction.BuilderBase {
+    ctor public GuidedDatePickerAction.BuilderBase(android.content.Context);
+    method protected final void applyDatePickerValues(android.support.v17.leanback.widget.GuidedDatePickerAction);
+    method public B date(long);
+    method public B datePickerFormat(java.lang.String);
+    method public B maxDate(long);
+    method public B minDate(long);
+  }
+
+  public class HeaderItem {
+    ctor public HeaderItem(long, java.lang.String);
+    ctor public HeaderItem(java.lang.String);
+    method public java.lang.CharSequence getContentDescription();
+    method public java.lang.CharSequence getDescription();
+    method public final long getId();
+    method public final java.lang.String getName();
+    method public void setContentDescription(java.lang.CharSequence);
+    method public void setDescription(java.lang.CharSequence);
+  }
+
+  public class HorizontalGridView extends android.support.v17.leanback.widget.BaseGridView {
+    ctor public HorizontalGridView(android.content.Context);
+    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet);
+    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet, int);
+    method public final boolean getFadingLeftEdge();
+    method public final int getFadingLeftEdgeLength();
+    method public final int getFadingLeftEdgeOffset();
+    method public final boolean getFadingRightEdge();
+    method public final int getFadingRightEdgeLength();
+    method public final int getFadingRightEdgeOffset();
+    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
+    method public final void setFadingLeftEdge(boolean);
+    method public final void setFadingLeftEdgeLength(int);
+    method public final void setFadingLeftEdgeOffset(int);
+    method public final void setFadingRightEdge(boolean);
+    method public final void setFadingRightEdgeLength(int);
+    method public final void setFadingRightEdgeOffset(int);
+    method public void setNumRows(int);
+    method public void setRowHeight(int);
+  }
+
+  public final class HorizontalHoverCardSwitcher extends android.support.v17.leanback.widget.PresenterSwitcher {
+    ctor public HorizontalHoverCardSwitcher();
+    method protected void insertView(android.view.View);
+    method public void select(android.support.v17.leanback.widget.HorizontalGridView, android.view.View, java.lang.Object);
+  }
+
+  public class ImageCardView extends android.support.v17.leanback.widget.BaseCardView {
+    ctor public deprecated ImageCardView(android.content.Context, int);
+    ctor public ImageCardView(android.content.Context, android.util.AttributeSet, int);
+    ctor public ImageCardView(android.content.Context);
+    ctor public ImageCardView(android.content.Context, android.util.AttributeSet);
+    method public android.graphics.drawable.Drawable getBadgeImage();
+    method public java.lang.CharSequence getContentText();
+    method public android.graphics.drawable.Drawable getInfoAreaBackground();
+    method public android.graphics.drawable.Drawable getMainImage();
+    method public final android.widget.ImageView getMainImageView();
+    method public java.lang.CharSequence getTitleText();
+    method public void setBadgeImage(android.graphics.drawable.Drawable);
+    method public void setContentText(java.lang.CharSequence);
+    method public void setInfoAreaBackground(android.graphics.drawable.Drawable);
+    method public void setInfoAreaBackgroundColor(int);
+    method public void setMainImage(android.graphics.drawable.Drawable);
+    method public void setMainImage(android.graphics.drawable.Drawable, boolean);
+    method public void setMainImageAdjustViewBounds(boolean);
+    method public void setMainImageDimensions(int, int);
+    method public void setMainImageScaleType(android.widget.ImageView.ScaleType);
+    method public void setTitleText(java.lang.CharSequence);
+    field public static final int CARD_TYPE_FLAG_CONTENT = 2; // 0x2
+    field public static final int CARD_TYPE_FLAG_ICON_LEFT = 8; // 0x8
+    field public static final int CARD_TYPE_FLAG_ICON_RIGHT = 4; // 0x4
+    field public static final int CARD_TYPE_FLAG_IMAGE_ONLY = 0; // 0x0
+    field public static final int CARD_TYPE_FLAG_TITLE = 1; // 0x1
+  }
+
+  public abstract interface ImeKeyMonitor {
+    method public abstract void setImeKeyListener(android.support.v17.leanback.widget.ImeKeyMonitor.ImeKeyListener);
+  }
+
+  public static abstract interface ImeKeyMonitor.ImeKeyListener {
+    method public abstract boolean onKeyPreIme(android.widget.EditText, int, android.view.KeyEvent);
+  }
+
+  public final class ItemAlignmentFacet {
+    ctor public ItemAlignmentFacet();
+    method public android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[] getAlignmentDefs();
+    method public boolean isMultiAlignment();
+    method public void setAlignmentDefs(android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[]);
+    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+  }
+
+  public static class ItemAlignmentFacet.ItemAlignmentDef {
+    ctor public ItemAlignmentFacet.ItemAlignmentDef();
+    method public final int getItemAlignmentFocusViewId();
+    method public final int getItemAlignmentOffset();
+    method public final float getItemAlignmentOffsetPercent();
+    method public final int getItemAlignmentViewId();
+    method public boolean isAlignedToTextViewBaseLine();
+    method public final boolean isItemAlignmentOffsetWithPadding();
+    method public final void setAlignedToTextViewBaseline(boolean);
+    method public final void setItemAlignmentFocusViewId(int);
+    method public final void setItemAlignmentOffset(int);
+    method public final void setItemAlignmentOffsetPercent(float);
+    method public final void setItemAlignmentOffsetWithPadding(boolean);
+    method public final void setItemAlignmentViewId(int);
+  }
+
+  public class ItemBridgeAdapter extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.leanback.widget.FacetProviderAdapter {
+    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter, android.support.v17.leanback.widget.PresenterSelector);
+    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    ctor public ItemBridgeAdapter();
+    method public void clear();
+    method public android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
+    method public int getItemCount();
+    method public java.util.ArrayList<android.support.v17.leanback.widget.Presenter> getPresenterMapper();
+    method public android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper getWrapper();
+    method protected void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
+    method protected void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method protected void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public final void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, int);
+    method public final void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, int, java.util.List);
+    method protected void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public final android.support.v7.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method protected void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method protected void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public final void onViewAttachedToWindow(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void onViewDetachedFromWindow(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setAdapterListener(android.support.v17.leanback.widget.ItemBridgeAdapter.AdapterListener);
+    method public void setPresenter(android.support.v17.leanback.widget.PresenterSelector);
+    method public void setPresenterMapper(java.util.ArrayList<android.support.v17.leanback.widget.Presenter>);
+    method public void setWrapper(android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper);
+  }
+
+  public static class ItemBridgeAdapter.AdapterListener {
+    ctor public ItemBridgeAdapter.AdapterListener();
+    method public void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
+    method public void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder, java.util.List);
+    method public void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+  }
+
+  public class ItemBridgeAdapter.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
+    method public final java.lang.Object getExtraObject();
+    method public java.lang.Object getFacet(java.lang.Class<?>);
+    method public final java.lang.Object getItem();
+    method public final android.support.v17.leanback.widget.Presenter getPresenter();
+    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getViewHolder();
+    method public void setExtraObject(java.lang.Object);
+  }
+
+  public static abstract class ItemBridgeAdapter.Wrapper {
+    ctor public ItemBridgeAdapter.Wrapper();
+    method public abstract android.view.View createWrapper(android.view.View);
+    method public abstract void wrap(android.view.View, android.view.View);
+  }
+
+  public class ItemBridgeAdapterShadowOverlayWrapper extends android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper {
+    ctor public ItemBridgeAdapterShadowOverlayWrapper(android.support.v17.leanback.widget.ShadowOverlayHelper);
+    method public android.view.View createWrapper(android.view.View);
+    method public void wrap(android.view.View, android.view.View);
+  }
+
+  public class ListRow extends android.support.v17.leanback.widget.Row {
+    ctor public ListRow(android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
+    ctor public ListRow(long, android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
+    ctor public ListRow(android.support.v17.leanback.widget.ObjectAdapter);
+    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public java.lang.CharSequence getContentDescription();
+    method public void setContentDescription(java.lang.CharSequence);
+  }
+
+  public final class ListRowHoverCardView extends android.widget.LinearLayout {
+    ctor public ListRowHoverCardView(android.content.Context);
+    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet);
+    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet, int);
+    method public java.lang.CharSequence getDescription();
+    method public java.lang.CharSequence getTitle();
+    method public void setDescription(java.lang.CharSequence);
+    method public void setTitle(java.lang.CharSequence);
+  }
+
+  public class ListRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public ListRowPresenter();
+    ctor public ListRowPresenter(int);
+    ctor public ListRowPresenter(int, boolean);
+    method protected void applySelectLevelToChild(android.support.v17.leanback.widget.ListRowPresenter.ViewHolder, android.view.View);
+    method public final boolean areChildRoundedCornersEnabled();
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method protected android.support.v17.leanback.widget.ShadowOverlayHelper.Options createShadowOverlayOptions();
+    method public final void enableChildRoundedCorners(boolean);
+    method public int getExpandedRowHeight();
+    method public final int getFocusZoomFactor();
+    method public final android.support.v17.leanback.widget.PresenterSelector getHoverCardPresenterSelector();
+    method public int getRecycledPoolSize(android.support.v17.leanback.widget.Presenter);
+    method public int getRowHeight();
+    method public final boolean getShadowEnabled();
+    method public final deprecated int getZoomFactor();
+    method public final boolean isFocusDimmerUsed();
+    method public final boolean isKeepChildForeground();
+    method public boolean isUsingDefaultListSelectEffect();
+    method public final boolean isUsingDefaultSelectEffect();
+    method public boolean isUsingDefaultShadow();
+    method public boolean isUsingOutlineClipping(android.content.Context);
+    method public boolean isUsingZOrder(android.content.Context);
+    method public void setExpandedRowHeight(int);
+    method public final void setHoverCardPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public final void setKeepChildForeground(boolean);
+    method public void setNumRows(int);
+    method public void setRecycledPoolSize(android.support.v17.leanback.widget.Presenter, int);
+    method public void setRowHeight(int);
+    method public final void setShadowEnabled(boolean);
+  }
+
+  public static class ListRowPresenter.SelectItemViewHolderTask extends android.support.v17.leanback.widget.Presenter.ViewHolderTask {
+    ctor public ListRowPresenter.SelectItemViewHolderTask(int);
+    method public int getItemPosition();
+    method public android.support.v17.leanback.widget.Presenter.ViewHolderTask getItemTask();
+    method public boolean isSmoothScroll();
+    method public void setItemPosition(int);
+    method public void setItemTask(android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void setSmoothScroll(boolean);
+  }
+
+  public static class ListRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public ListRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.HorizontalGridView, android.support.v17.leanback.widget.ListRowPresenter);
+    method public final android.support.v17.leanback.widget.ItemBridgeAdapter getBridgeAdapter();
+    method public final android.support.v17.leanback.widget.HorizontalGridView getGridView();
+    method public android.support.v17.leanback.widget.Presenter.ViewHolder getItemViewHolder(int);
+    method public final android.support.v17.leanback.widget.ListRowPresenter getListRowPresenter();
+    method public int getSelectedPosition();
+  }
+
+  public final class ListRowView extends android.widget.LinearLayout {
+    ctor public ListRowView(android.content.Context);
+    ctor public ListRowView(android.content.Context, android.util.AttributeSet);
+    ctor public ListRowView(android.content.Context, android.util.AttributeSet, int);
+    method public android.support.v17.leanback.widget.HorizontalGridView getGridView();
+  }
+
+  public abstract interface MultiActionsProvider {
+    method public abstract android.support.v17.leanback.widget.MultiActionsProvider.MultiAction[] getActions();
+  }
+
+  public static class MultiActionsProvider.MultiAction {
+    ctor public MultiActionsProvider.MultiAction(long);
+    method public android.graphics.drawable.Drawable getCurrentDrawable();
+    method public android.graphics.drawable.Drawable[] getDrawables();
+    method public long getId();
+    method public int getIndex();
+    method public void incrementIndex();
+    method public void setDrawables(android.graphics.drawable.Drawable[]);
+    method public void setIndex(int);
+  }
+
+  public abstract class ObjectAdapter {
+    ctor public ObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    ctor public ObjectAdapter(android.support.v17.leanback.widget.Presenter);
+    ctor public ObjectAdapter();
+    method public abstract java.lang.Object get(int);
+    method public long getId(int);
+    method public final android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
+    method public final boolean hasStableIds();
+    method public boolean isImmediateNotifySupported();
+    method protected final void notifyChanged();
+    method protected final void notifyItemMoved(int, int);
+    method public final void notifyItemRangeChanged(int, int);
+    method public final void notifyItemRangeChanged(int, int, java.lang.Object);
+    method protected final void notifyItemRangeInserted(int, int);
+    method protected final void notifyItemRangeRemoved(int, int);
+    method protected void onHasStableIdsChanged();
+    method protected void onPresenterSelectorChanged();
+    method public final void registerObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
+    method public final void setHasStableIds(boolean);
+    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public abstract int size();
+    method public final void unregisterAllObservers();
+    method public final void unregisterObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
+    field public static final int NO_ID = -1; // 0xffffffff
+  }
+
+  public static abstract class ObjectAdapter.DataObserver {
+    ctor public ObjectAdapter.DataObserver();
+    method public void onChanged();
+    method public void onItemMoved(int, int);
+    method public void onItemRangeChanged(int, int);
+    method public void onItemRangeChanged(int, int, java.lang.Object);
+    method public void onItemRangeInserted(int, int);
+    method public void onItemRangeRemoved(int, int);
+  }
+
+  public abstract interface OnActionClickedListener {
+    method public abstract void onActionClicked(android.support.v17.leanback.widget.Action);
+  }
+
+  public abstract interface OnChildLaidOutListener {
+    method public abstract void onChildLaidOut(android.view.ViewGroup, android.view.View, int, long);
+  }
+
+  public abstract deprecated interface OnChildSelectedListener {
+    method public abstract void onChildSelected(android.view.ViewGroup, android.view.View, int, long);
+  }
+
+  public abstract class OnChildViewHolderSelectedListener {
+    ctor public OnChildViewHolderSelectedListener();
+    method public void onChildViewHolderSelected(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, int);
+    method public void onChildViewHolderSelectedAndPositioned(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, int);
+  }
+
+  public abstract interface OnItemViewClickedListener implements android.support.v17.leanback.widget.BaseOnItemViewClickedListener {
+  }
+
+  public abstract interface OnItemViewSelectedListener implements android.support.v17.leanback.widget.BaseOnItemViewSelectedListener {
+  }
+
+  public class PageRow extends android.support.v17.leanback.widget.Row {
+    ctor public PageRow(android.support.v17.leanback.widget.HeaderItem);
+    method public final boolean isRenderedAsRowView();
+  }
+
+  public abstract class Parallax<PropertyT extends android.util.Property> {
+    ctor public Parallax();
+    method public android.support.v17.leanback.widget.ParallaxEffect addEffect(android.support.v17.leanback.widget.Parallax.PropertyMarkerValue...);
+    method public final PropertyT addProperty(java.lang.String);
+    method public abstract PropertyT createProperty(java.lang.String, int);
+    method public java.util.List<android.support.v17.leanback.widget.ParallaxEffect> getEffects();
+    method public abstract float getMaxValue();
+    method public final java.util.List<PropertyT> getProperties();
+    method public void removeAllEffects();
+    method public void removeEffect(android.support.v17.leanback.widget.ParallaxEffect);
+    method public void updateValues();
+  }
+
+  public static class Parallax.FloatProperty extends android.util.Property {
+    ctor public Parallax.FloatProperty(java.lang.String, int);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue at(float, float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atAbsolute(float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atFraction(float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMax();
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMin();
+    method public final java.lang.Float get(android.support.v17.leanback.widget.Parallax);
+    method public final int getIndex();
+    method public final float getValue(android.support.v17.leanback.widget.Parallax);
+    method public final void set(android.support.v17.leanback.widget.Parallax, java.lang.Float);
+    method public final void setValue(android.support.v17.leanback.widget.Parallax, float);
+    field public static final float UNKNOWN_AFTER = 3.4028235E38f;
+    field public static final float UNKNOWN_BEFORE = -3.4028235E38f;
+  }
+
+  public static class Parallax.IntProperty extends android.util.Property {
+    ctor public Parallax.IntProperty(java.lang.String, int);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue at(int, float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atAbsolute(int);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atFraction(float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMax();
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMin();
+    method public final java.lang.Integer get(android.support.v17.leanback.widget.Parallax);
+    method public final int getIndex();
+    method public final int getValue(android.support.v17.leanback.widget.Parallax);
+    method public final void set(android.support.v17.leanback.widget.Parallax, java.lang.Integer);
+    method public final void setValue(android.support.v17.leanback.widget.Parallax, int);
+    field public static final int UNKNOWN_AFTER = 2147483647; // 0x7fffffff
+    field public static final int UNKNOWN_BEFORE = -2147483648; // 0x80000000
+  }
+
+  public static class Parallax.PropertyMarkerValue<PropertyT> {
+    ctor public Parallax.PropertyMarkerValue(PropertyT);
+    method public PropertyT getProperty();
+  }
+
+  public abstract class ParallaxEffect {
+    method public final void addTarget(android.support.v17.leanback.widget.ParallaxTarget);
+    method public final java.util.List<android.support.v17.leanback.widget.Parallax.PropertyMarkerValue> getPropertyRanges();
+    method public final java.util.List<android.support.v17.leanback.widget.ParallaxTarget> getTargets();
+    method public final void performMapping(android.support.v17.leanback.widget.Parallax);
+    method public final void removeTarget(android.support.v17.leanback.widget.ParallaxTarget);
+    method public final void setPropertyRanges(android.support.v17.leanback.widget.Parallax.PropertyMarkerValue...);
+    method public final android.support.v17.leanback.widget.ParallaxEffect target(android.support.v17.leanback.widget.ParallaxTarget);
+    method public final android.support.v17.leanback.widget.ParallaxEffect target(java.lang.Object, android.animation.PropertyValuesHolder);
+    method public final <T, V extends java.lang.Number> android.support.v17.leanback.widget.ParallaxEffect target(T, android.util.Property<T, V>);
+  }
+
+  public abstract class ParallaxTarget {
+    ctor public ParallaxTarget();
+    method public void directUpdate(java.lang.Number);
+    method public boolean isDirectMapping();
+    method public void update(float);
+  }
+
+  public static final class ParallaxTarget.DirectPropertyTarget<T, V extends java.lang.Number> extends android.support.v17.leanback.widget.ParallaxTarget {
+    ctor public ParallaxTarget.DirectPropertyTarget(java.lang.Object, android.util.Property<T, V>);
+  }
+
+  public static final class ParallaxTarget.PropertyValuesHolderTarget extends android.support.v17.leanback.widget.ParallaxTarget {
+    ctor public ParallaxTarget.PropertyValuesHolderTarget(java.lang.Object, android.animation.PropertyValuesHolder);
+  }
+
+  public class PlaybackControlsRow extends android.support.v17.leanback.widget.Row {
+    ctor public PlaybackControlsRow(java.lang.Object);
+    ctor public PlaybackControlsRow();
+    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
+    method public android.support.v17.leanback.widget.Action getActionForKeyCode(android.support.v17.leanback.widget.ObjectAdapter, int);
+    method public long getBufferedPosition();
+    method public deprecated int getBufferedProgress();
+    method public deprecated long getBufferedProgressLong();
+    method public long getCurrentPosition();
+    method public deprecated int getCurrentTime();
+    method public deprecated long getCurrentTimeLong();
+    method public long getDuration();
+    method public final android.graphics.drawable.Drawable getImageDrawable();
+    method public final java.lang.Object getItem();
+    method public final android.support.v17.leanback.widget.ObjectAdapter getPrimaryActionsAdapter();
+    method public final android.support.v17.leanback.widget.ObjectAdapter getSecondaryActionsAdapter();
+    method public deprecated int getTotalTime();
+    method public deprecated long getTotalTimeLong();
+    method public void setBufferedPosition(long);
+    method public deprecated void setBufferedProgress(int);
+    method public deprecated void setBufferedProgressLong(long);
+    method public void setCurrentPosition(long);
+    method public deprecated void setCurrentTime(int);
+    method public deprecated void setCurrentTimeLong(long);
+    method public void setDuration(long);
+    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
+    method public final void setImageDrawable(android.graphics.drawable.Drawable);
+    method public void setOnPlaybackProgressChangedListener(android.support.v17.leanback.widget.PlaybackControlsRow.OnPlaybackProgressCallback);
+    method public final void setPrimaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public final void setSecondaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public deprecated void setTotalTime(int);
+    method public deprecated void setTotalTimeLong(long);
+  }
+
+  public static class PlaybackControlsRow.ClosedCaptioningAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context);
+    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context, int);
+    field public static final int INDEX_OFF = 0; // 0x0
+    field public static final int INDEX_ON = 1; // 0x1
+    field public static deprecated int OFF;
+    field public static deprecated int ON;
+  }
+
+  public static class PlaybackControlsRow.FastForwardAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context);
+    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context, int);
+  }
+
+  public static class PlaybackControlsRow.HighQualityAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context);
+    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context, int);
+    field public static final int INDEX_OFF = 0; // 0x0
+    field public static final int INDEX_ON = 1; // 0x1
+    field public static deprecated int OFF;
+    field public static deprecated int ON;
+  }
+
+  public static class PlaybackControlsRow.MoreActions extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.MoreActions(android.content.Context);
+  }
+
+  public static abstract class PlaybackControlsRow.MultiAction extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.MultiAction(int);
+    method public int getActionCount();
+    method public android.graphics.drawable.Drawable getDrawable(int);
+    method public int getIndex();
+    method public java.lang.String getLabel(int);
+    method public java.lang.String getSecondaryLabel(int);
+    method public void nextIndex();
+    method public void setDrawables(android.graphics.drawable.Drawable[]);
+    method public void setIndex(int);
+    method public void setLabels(java.lang.String[]);
+    method public void setSecondaryLabels(java.lang.String[]);
+  }
+
+  public static class PlaybackControlsRow.OnPlaybackProgressCallback {
+    ctor public PlaybackControlsRow.OnPlaybackProgressCallback();
+    method public void onBufferedPositionChanged(android.support.v17.leanback.widget.PlaybackControlsRow, long);
+    method public void onCurrentPositionChanged(android.support.v17.leanback.widget.PlaybackControlsRow, long);
+    method public void onDurationChanged(android.support.v17.leanback.widget.PlaybackControlsRow, long);
+  }
+
+  public static class PlaybackControlsRow.PictureInPictureAction extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.PictureInPictureAction(android.content.Context);
+  }
+
+  public static class PlaybackControlsRow.PlayPauseAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context);
+    field public static final int INDEX_PAUSE = 1; // 0x1
+    field public static final int INDEX_PLAY = 0; // 0x0
+    field public static deprecated int PAUSE;
+    field public static deprecated int PLAY;
+  }
+
+  public static class PlaybackControlsRow.RepeatAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.RepeatAction(android.content.Context);
+    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int);
+    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int, int);
+    field public static deprecated int ALL;
+    field public static final int INDEX_ALL = 1; // 0x1
+    field public static final int INDEX_NONE = 0; // 0x0
+    field public static final int INDEX_ONE = 2; // 0x2
+    field public static deprecated int NONE;
+    field public static deprecated int ONE;
+  }
+
+  public static class PlaybackControlsRow.RewindAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.RewindAction(android.content.Context);
+    ctor public PlaybackControlsRow.RewindAction(android.content.Context, int);
+  }
+
+  public static class PlaybackControlsRow.ShuffleAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context);
+    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context, int);
+    field public static final int INDEX_OFF = 0; // 0x0
+    field public static final int INDEX_ON = 1; // 0x1
+    field public static deprecated int OFF;
+    field public static deprecated int ON;
+  }
+
+  public static class PlaybackControlsRow.SkipNextAction extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.SkipNextAction(android.content.Context);
+  }
+
+  public static class PlaybackControlsRow.SkipPreviousAction extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.SkipPreviousAction(android.content.Context);
+  }
+
+  public static abstract class PlaybackControlsRow.ThumbsAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.ThumbsAction(int, android.content.Context, int, int);
+    field public static final int INDEX_OUTLINE = 1; // 0x1
+    field public static final int INDEX_SOLID = 0; // 0x0
+    field public static deprecated int OUTLINE;
+    field public static deprecated int SOLID;
+  }
+
+  public static class PlaybackControlsRow.ThumbsDownAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
+    ctor public PlaybackControlsRow.ThumbsDownAction(android.content.Context);
+  }
+
+  public static class PlaybackControlsRow.ThumbsUpAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
+    ctor public PlaybackControlsRow.ThumbsUpAction(android.content.Context);
+  }
+
+  public class PlaybackControlsRowPresenter extends android.support.v17.leanback.widget.PlaybackRowPresenter {
+    ctor public PlaybackControlsRowPresenter(android.support.v17.leanback.widget.Presenter);
+    ctor public PlaybackControlsRowPresenter();
+    method public boolean areSecondaryActionsHidden();
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public int getBackgroundColor();
+    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
+    method public int getProgressColor();
+    method public void setBackgroundColor(int);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public void setProgressColor(int);
+    method public void setSecondaryActionsHidden(boolean);
+    method public void showBottomSpace(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder, boolean);
+    method public void showPrimaryActions(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder);
+  }
+
+  public class PlaybackControlsRowPresenter.ViewHolder extends android.support.v17.leanback.widget.PlaybackRowPresenter.ViewHolder {
+    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDescriptionViewHolder;
+  }
+
+  public abstract class PlaybackRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public PlaybackRowPresenter();
+    method public void onReappear(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+  }
+
+  public static class PlaybackRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public PlaybackRowPresenter.ViewHolder(android.view.View);
+  }
+
+  public class PlaybackSeekDataProvider {
+    ctor public PlaybackSeekDataProvider();
+    method public long[] getSeekPositions();
+    method public void getThumbnail(int, android.support.v17.leanback.widget.PlaybackSeekDataProvider.ResultCallback);
+    method public void reset();
+  }
+
+  public static class PlaybackSeekDataProvider.ResultCallback {
+    ctor public PlaybackSeekDataProvider.ResultCallback();
+    method public void onThumbnailLoaded(android.graphics.Bitmap, int);
+  }
+
+  public abstract interface PlaybackSeekUi {
+    method public abstract void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+  }
+
+  public static class PlaybackSeekUi.Client {
+    ctor public PlaybackSeekUi.Client();
+    method public android.support.v17.leanback.widget.PlaybackSeekDataProvider getPlaybackSeekDataProvider();
+    method public boolean isSeekEnabled();
+    method public void onSeekFinished(boolean);
+    method public void onSeekPositionChanged(long);
+    method public void onSeekStarted();
+  }
+
+  public class PlaybackTransportRowPresenter extends android.support.v17.leanback.widget.PlaybackRowPresenter {
+    ctor public PlaybackTransportRowPresenter();
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public float getDefaultSeekIncrement();
+    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
+    method public int getProgressColor();
+    method protected void onProgressBarClicked(android.support.v17.leanback.widget.PlaybackTransportRowPresenter.ViewHolder);
+    method public void setDefaultSeekIncrement(float);
+    method public void setDescriptionPresenter(android.support.v17.leanback.widget.Presenter);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public void setProgressColor(int);
+  }
+
+  public class PlaybackTransportRowPresenter.ViewHolder extends android.support.v17.leanback.widget.PlaybackRowPresenter.ViewHolder implements android.support.v17.leanback.widget.PlaybackSeekUi {
+    ctor public PlaybackTransportRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
+    method public final android.widget.TextView getCurrentPositionView();
+    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getDescriptionViewHolder();
+    method public final android.widget.TextView getDurationView();
+    method protected void onSetCurrentPositionLabel(long);
+    method protected void onSetDurationLabel(long);
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+  }
+
+  public abstract class Presenter implements android.support.v17.leanback.widget.FacetProvider {
+    ctor public Presenter();
+    method protected static void cancelAnimationsRecursive(android.view.View);
+    method public final java.lang.Object getFacet(java.lang.Class<?>);
+    method public abstract void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, java.util.List<java.lang.Object>);
+    method public abstract android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public abstract void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
+    method public void setOnClickListener(android.support.v17.leanback.widget.Presenter.ViewHolder, android.view.View.OnClickListener);
+  }
+
+  public static class Presenter.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
+    ctor public Presenter.ViewHolder(android.view.View);
+    method public final java.lang.Object getFacet(java.lang.Class<?>);
+    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
+    field public final android.view.View view;
+  }
+
+  public static abstract class Presenter.ViewHolderTask {
+    ctor public Presenter.ViewHolderTask();
+    method public void run(android.support.v17.leanback.widget.Presenter.ViewHolder);
+  }
+
+  public abstract class PresenterSelector {
+    ctor public PresenterSelector();
+    method public abstract android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+    method public android.support.v17.leanback.widget.Presenter[] getPresenters();
+  }
+
+  public abstract class PresenterSwitcher {
+    ctor public PresenterSwitcher();
+    method public void clear();
+    method public final android.view.ViewGroup getParentViewGroup();
+    method public void init(android.view.ViewGroup, android.support.v17.leanback.widget.PresenterSelector);
+    method protected abstract void insertView(android.view.View);
+    method protected void onViewSelected(android.view.View);
+    method public void select(java.lang.Object);
+    method protected void showView(android.view.View, boolean);
+    method public void unselect();
+  }
+
+  public class RecyclerViewParallax extends android.support.v17.leanback.widget.Parallax {
+    ctor public RecyclerViewParallax();
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty createProperty(java.lang.String, int);
+    method public float getMaxValue();
+    method public android.support.v7.widget.RecyclerView getRecyclerView();
+    method public void setRecyclerView(android.support.v7.widget.RecyclerView);
+  }
+
+  public static final class RecyclerViewParallax.ChildPositionProperty extends android.support.v17.leanback.widget.Parallax.IntProperty {
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty adapterPosition(int);
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty fraction(float);
+    method public int getAdapterPosition();
+    method public float getFraction();
+    method public int getOffset();
+    method public int getViewId();
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty offset(int);
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty viewId(int);
+  }
+
+  public class Row {
+    ctor public Row(long, android.support.v17.leanback.widget.HeaderItem);
+    ctor public Row(android.support.v17.leanback.widget.HeaderItem);
+    ctor public Row();
+    method public final android.support.v17.leanback.widget.HeaderItem getHeaderItem();
+    method public final long getId();
+    method public boolean isRenderedAsRowView();
+    method public final void setHeaderItem(android.support.v17.leanback.widget.HeaderItem);
+    method public final void setId(long);
+  }
+
+  public class RowHeaderPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public RowHeaderPresenter();
+    method protected static float getFontDescent(android.widget.TextView, android.graphics.Paint);
+    method public int getSpaceUnderBaseline(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
+    method public boolean isNullItemVisibilityGone();
+    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
+    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void setNullItemVisibilityGone(boolean);
+    method public final void setSelectLevel(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, float);
+  }
+
+  public static class RowHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public RowHeaderPresenter.ViewHolder(android.view.View);
+    method public final float getSelectLevel();
+  }
+
+  public final class RowHeaderView extends android.widget.TextView {
+    ctor public RowHeaderView(android.content.Context);
+    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet);
+    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public abstract class RowPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public RowPresenter();
+    method protected abstract android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method protected void dispatchItemSelectedListener(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method public void freeze(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method public final android.support.v17.leanback.widget.RowHeaderPresenter getHeaderPresenter();
+    method public final android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final boolean getSelectEffectEnabled();
+    method public final float getSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final int getSyncActivatePolicy();
+    method protected void initializeRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method protected boolean isClippingChildren();
+    method public boolean isUsingDefaultSelectEffect();
+    method protected void onBindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder, java.lang.Object);
+    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public final android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method protected void onRowViewAttachedToWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method protected void onRowViewDetachedFromWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method protected void onRowViewExpanded(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method protected void onRowViewSelected(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method protected void onUnbindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method public final void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void setEntranceTransitionState(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method public final void setHeaderPresenter(android.support.v17.leanback.widget.RowHeaderPresenter);
+    method public final void setRowViewExpanded(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
+    method public final void setRowViewSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
+    method public final void setSelectEffectEnabled(boolean);
+    method public final void setSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder, float);
+    method public final void setSyncActivatePolicy(int);
+    field public static final int SYNC_ACTIVATED_CUSTOM = 0; // 0x0
+    field public static final int SYNC_ACTIVATED_TO_EXPANDED = 1; // 0x1
+    field public static final int SYNC_ACTIVATED_TO_EXPANDED_AND_SELECTED = 3; // 0x3
+    field public static final int SYNC_ACTIVATED_TO_SELECTED = 2; // 0x2
+  }
+
+  public static class RowPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public RowPresenter.ViewHolder(android.view.View);
+    method public final android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder getHeaderViewHolder();
+    method public final android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public final android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.view.View.OnKeyListener getOnKeyListener();
+    method public final android.support.v17.leanback.widget.Row getRow();
+    method public final java.lang.Object getRowObject();
+    method public final float getSelectLevel();
+    method public java.lang.Object getSelectedItem();
+    method public android.support.v17.leanback.widget.Presenter.ViewHolder getSelectedItemViewHolder();
+    method public final boolean isExpanded();
+    method public final boolean isSelected();
+    method public final void setActivated(boolean);
+    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public void setOnKeyListener(android.view.View.OnKeyListener);
+    method public final void syncActivatedStatus(android.view.View);
+    field protected final android.support.v17.leanback.graphics.ColorOverlayDimmer mColorDimmer;
+  }
+
+  public class SearchBar extends android.widget.RelativeLayout {
+    ctor public SearchBar(android.content.Context);
+    ctor public SearchBar(android.content.Context, android.util.AttributeSet);
+    ctor public SearchBar(android.content.Context, android.util.AttributeSet, int);
+    method public void displayCompletions(java.util.List<java.lang.String>);
+    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public java.lang.CharSequence getHint();
+    method public java.lang.String getTitle();
+    method public boolean isRecognizing();
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setPermissionListener(android.support.v17.leanback.widget.SearchBar.SearchBarPermissionListener);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSearchBarListener(android.support.v17.leanback.widget.SearchBar.SearchBarListener);
+    method public void setSearchQuery(java.lang.String);
+    method public deprecated void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
+    method public void setSpeechRecognizer(android.speech.SpeechRecognizer);
+    method public void setTitle(java.lang.String);
+    method public void startRecognition();
+    method public void stopRecognition();
+  }
+
+  public static abstract interface SearchBar.SearchBarListener {
+    method public abstract void onKeyboardDismiss(java.lang.String);
+    method public abstract void onSearchQueryChange(java.lang.String);
+    method public abstract void onSearchQuerySubmit(java.lang.String);
+  }
+
+  public static abstract interface SearchBar.SearchBarPermissionListener {
+    method public abstract void requestAudioPermission();
+  }
+
+  public class SearchEditText extends android.widget.EditText {
+    ctor public SearchEditText(android.content.Context);
+    ctor public SearchEditText(android.content.Context, android.util.AttributeSet);
+    ctor public SearchEditText(android.content.Context, android.util.AttributeSet, int);
+    method public void setOnKeyboardDismissListener(android.support.v17.leanback.widget.SearchEditText.OnKeyboardDismissListener);
+  }
+
+  public static abstract interface SearchEditText.OnKeyboardDismissListener {
+    method public abstract void onKeyboardDismiss();
+  }
+
+  public class SearchOrbView extends android.widget.FrameLayout implements android.view.View.OnClickListener {
+    ctor public SearchOrbView(android.content.Context);
+    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet);
+    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet, int);
+    method public void enableOrbColorAnimation(boolean);
+    method public int getOrbColor();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getOrbColors();
+    method public android.graphics.drawable.Drawable getOrbIcon();
+    method public void onClick(android.view.View);
+    method public void setOnOrbClickedListener(android.view.View.OnClickListener);
+    method public void setOrbColor(int);
+    method public deprecated void setOrbColor(int, int);
+    method public void setOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setOrbIcon(android.graphics.drawable.Drawable);
+  }
+
+  public static class SearchOrbView.Colors {
+    ctor public SearchOrbView.Colors(int);
+    ctor public SearchOrbView.Colors(int, int);
+    ctor public SearchOrbView.Colors(int, int, int);
+    method public static int getBrightColor(int);
+    field public int brightColor;
+    field public int color;
+    field public int iconColor;
+  }
+
+  public class SectionRow extends android.support.v17.leanback.widget.Row {
+    ctor public SectionRow(android.support.v17.leanback.widget.HeaderItem);
+    ctor public SectionRow(long, java.lang.String);
+    ctor public SectionRow(java.lang.String);
+    method public final boolean isRenderedAsRowView();
+  }
+
+  public class ShadowOverlayContainer extends android.widget.FrameLayout {
+    ctor public ShadowOverlayContainer(android.content.Context);
+    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet);
+    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet, int);
+    method public int getShadowType();
+    method public android.view.View getWrappedView();
+    method public deprecated void initialize(boolean, boolean);
+    method public deprecated void initialize(boolean, boolean, boolean);
+    method public static void prepareParentForShadow(android.view.ViewGroup);
+    method public void setOverlayColor(int);
+    method public void setShadowFocusLevel(float);
+    method public static boolean supportsDynamicShadow();
+    method public static boolean supportsShadow();
+    method public void useDynamicShadow();
+    method public void useDynamicShadow(float, float);
+    method public void useStaticShadow();
+    method public void wrap(android.view.View);
+    field public static final int SHADOW_DYNAMIC = 3; // 0x3
+    field public static final int SHADOW_NONE = 1; // 0x1
+    field public static final int SHADOW_STATIC = 2; // 0x2
+  }
+
+  public final class ShadowOverlayHelper {
+    method public android.support.v17.leanback.widget.ShadowOverlayContainer createShadowOverlayContainer(android.content.Context);
+    method public int getShadowType();
+    method public boolean needsOverlay();
+    method public boolean needsRoundedCorner();
+    method public boolean needsWrapper();
+    method public void onViewCreated(android.view.View);
+    method public void prepareParentForShadow(android.view.ViewGroup);
+    method public static void setNoneWrapperOverlayColor(android.view.View, int);
+    method public static void setNoneWrapperShadowFocusLevel(android.view.View, float);
+    method public void setOverlayColor(android.view.View, int);
+    method public void setShadowFocusLevel(android.view.View, float);
+    method public static boolean supportsDynamicShadow();
+    method public static boolean supportsForeground();
+    method public static boolean supportsRoundedCorner();
+    method public static boolean supportsShadow();
+    field public static final int SHADOW_DYNAMIC = 3; // 0x3
+    field public static final int SHADOW_NONE = 1; // 0x1
+    field public static final int SHADOW_STATIC = 2; // 0x2
+  }
+
+  public static final class ShadowOverlayHelper.Builder {
+    ctor public ShadowOverlayHelper.Builder();
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper build(android.content.Context);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder keepForegroundDrawable(boolean);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsOverlay(boolean);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsRoundedCorner(boolean);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsShadow(boolean);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder options(android.support.v17.leanback.widget.ShadowOverlayHelper.Options);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder preferZOrder(boolean);
+  }
+
+  public static final class ShadowOverlayHelper.Options {
+    ctor public ShadowOverlayHelper.Options();
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Options dynamicShadowZ(float, float);
+    method public float getDynamicShadowFocusedZ();
+    method public float getDynamicShadowUnfocusedZ();
+    method public int getRoundedCornerRadius();
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Options roundedCornerRadius(int);
+    field public static final android.support.v17.leanback.widget.ShadowOverlayHelper.Options DEFAULT;
+  }
+
+  public final class SinglePresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
+    ctor public SinglePresenterSelector(android.support.v17.leanback.widget.Presenter);
+    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+  }
+
+  public class SparseArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
+    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
+    ctor public SparseArrayObjectAdapter();
+    method public void clear(int);
+    method public void clear();
+    method public java.lang.Object get(int);
+    method public int indexOf(java.lang.Object);
+    method public int indexOf(int);
+    method public java.lang.Object lookup(int);
+    method public void notifyArrayItemRangeChanged(int, int);
+    method public void set(int, java.lang.Object);
+    method public int size();
+  }
+
+  public class SpeechOrbView extends android.support.v17.leanback.widget.SearchOrbView {
+    ctor public SpeechOrbView(android.content.Context);
+    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet);
+    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet, int);
+    method public void setListeningOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setNotListeningOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSoundLevel(int);
+    method public void showListening();
+    method public void showNotListening();
+  }
+
+  public abstract deprecated interface SpeechRecognitionCallback {
+    method public abstract void recognizeSpeech();
+  }
+
+  public class TitleHelper {
+    ctor public TitleHelper(android.view.ViewGroup, android.view.View);
+    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
+    method public android.view.ViewGroup getSceneRoot();
+    method public android.view.View getTitleView();
+    method public void showTitle(boolean);
+  }
+
+  public class TitleView extends android.widget.FrameLayout implements android.support.v17.leanback.widget.TitleViewAdapter.Provider {
+    ctor public TitleView(android.content.Context);
+    ctor public TitleView(android.content.Context, android.util.AttributeSet);
+    ctor public TitleView(android.content.Context, android.util.AttributeSet, int);
+    method public void enableAnimation(boolean);
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public android.view.View getSearchAffordanceView();
+    method public java.lang.CharSequence getTitle();
+    method public android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setTitle(java.lang.CharSequence);
+    method public void updateComponentsVisibility(int);
+  }
+
+  public abstract class TitleViewAdapter {
+    ctor public TitleViewAdapter();
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public abstract android.view.View getSearchAffordanceView();
+    method public java.lang.CharSequence getTitle();
+    method public void setAnimationEnabled(boolean);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setTitle(java.lang.CharSequence);
+    method public void updateComponentsVisibility(int);
+    field public static final int BRANDING_VIEW_VISIBLE = 2; // 0x2
+    field public static final int FULL_VIEW_VISIBLE = 6; // 0x6
+    field public static final int SEARCH_VIEW_VISIBLE = 4; // 0x4
+  }
+
+  public static abstract interface TitleViewAdapter.Provider {
+    method public abstract android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+  }
+
+  public class VerticalGridPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public VerticalGridPresenter();
+    ctor public VerticalGridPresenter(int);
+    ctor public VerticalGridPresenter(int, boolean);
+    method public final boolean areChildRoundedCornersEnabled();
+    method protected android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder createGridViewHolder(android.view.ViewGroup);
+    method protected android.support.v17.leanback.widget.ShadowOverlayHelper.Options createShadowOverlayOptions();
+    method public final void enableChildRoundedCorners(boolean);
+    method public final int getFocusZoomFactor();
+    method public final boolean getKeepChildForeground();
+    method public int getNumberOfColumns();
+    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public final boolean getShadowEnabled();
+    method protected void initializeGridViewHolder(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder);
+    method public final boolean isFocusDimmerUsed();
+    method public boolean isUsingDefaultShadow();
+    method public boolean isUsingZOrder(android.content.Context);
+    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public final android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void setEntranceTransitionState(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder, boolean);
+    method public final void setKeepChildForeground(boolean);
+    method public void setNumberOfColumns(int);
+    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public final void setShadowEnabled(boolean);
+  }
+
+  public static class VerticalGridPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public VerticalGridPresenter.ViewHolder(android.support.v17.leanback.widget.VerticalGridView);
+    method public android.support.v17.leanback.widget.VerticalGridView getGridView();
+  }
+
+  public class VerticalGridView extends android.support.v17.leanback.widget.BaseGridView {
+    ctor public VerticalGridView(android.content.Context);
+    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet);
+    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet, int);
+    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
+    method public void setColumnWidth(int);
+    method public void setNumColumns(int);
+  }
+
+  public abstract interface ViewHolderTask {
+    method public abstract void run(android.support.v7.widget.RecyclerView.ViewHolder);
+  }
+
+}
+
+package android.support.v17.leanback.widget.picker {
+
+  public class Picker extends android.widget.FrameLayout {
+    ctor public Picker(android.content.Context, android.util.AttributeSet, int);
+    method public void addOnValueChangedListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
+    method public float getActivatedVisibleItemCount();
+    method public android.support.v17.leanback.widget.picker.PickerColumn getColumnAt(int);
+    method public int getColumnsCount();
+    method protected int getPickerItemHeightPixels();
+    method public final int getPickerItemLayoutId();
+    method public final int getPickerItemTextViewId();
+    method public int getSelectedColumn();
+    method public final deprecated java.lang.CharSequence getSeparator();
+    method public final java.util.List<java.lang.CharSequence> getSeparators();
+    method public float getVisibleItemCount();
+    method public void onColumnValueChanged(int, int);
+    method public void removeOnValueChangedListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
+    method public void setActivatedVisibleItemCount(float);
+    method public void setColumnAt(int, android.support.v17.leanback.widget.picker.PickerColumn);
+    method public void setColumnValue(int, int, boolean);
+    method public void setColumns(java.util.List<android.support.v17.leanback.widget.picker.PickerColumn>);
+    method public final void setPickerItemTextViewId(int);
+    method public void setSelectedColumn(int);
+    method public final void setSeparator(java.lang.CharSequence);
+    method public final void setSeparators(java.util.List<java.lang.CharSequence>);
+    method public void setVisibleItemCount(float);
+  }
+
+  public static abstract interface Picker.PickerValueListener {
+    method public abstract void onValueChanged(android.support.v17.leanback.widget.picker.Picker, int);
+  }
+
+  public class PickerColumn {
+    ctor public PickerColumn();
+    method public int getCount();
+    method public int getCurrentValue();
+    method public java.lang.CharSequence getLabelFor(int);
+    method public java.lang.String getLabelFormat();
+    method public int getMaxValue();
+    method public int getMinValue();
+    method public java.lang.CharSequence[] getStaticLabels();
+    method public void setCurrentValue(int);
+    method public void setLabelFormat(java.lang.String);
+    method public void setMaxValue(int);
+    method public void setMinValue(int);
+    method public void setStaticLabels(java.lang.CharSequence[]);
+  }
+
+  public class TimePicker extends android.support.v17.leanback.widget.picker.Picker {
+    ctor public TimePicker(android.content.Context, android.util.AttributeSet);
+    ctor public TimePicker(android.content.Context, android.util.AttributeSet, int);
+    method public int getHour();
+    method public int getMinute();
+    method public boolean is24Hour();
+    method public boolean isPm();
+    method public void setHour(int);
+    method public void setIs24Hour(boolean);
+    method public void setMinute(int);
+  }
+
+}
+
diff --git a/leanback/res/values-mr/strings.xml b/leanback/res/values-mr/strings.xml
index 8629ef1..1fcb920 100644
--- a/leanback/res/values-mr/strings.xml
+++ b/leanback/res/values-mr/strings.xml
@@ -47,7 +47,7 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"उच्च गुणवत्ता अक्षम करा"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"उपशीर्षके सक्षम करा"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"सबटायटल अक्षम करा"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"चित्र मोडमध्ये चित्र प्रविष्ट करा"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"चित्र मोडमध्ये चित्र एंटर करा"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"मीडिया नियंत्रणे दर्शवली आहेत"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"मीडिया नियंत्रणे लपलेली आहेत, दर्शवण्‍यासाठी d-pad दाबा"</string>
diff --git a/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java b/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
index 92655d9..d360d15 100644
--- a/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
+++ b/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
@@ -3715,9 +3715,11 @@
         }
         switch (translatedAction) {
             case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD:
+                processPendingMovement(false);
                 processSelectionMoves(false, -1);
                 break;
             case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD:
+                processPendingMovement(true);
                 processSelectionMoves(false, 1);
                 break;
         }
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java b/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java
index 4029a29..0ca1562 100644
--- a/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java
+++ b/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java
@@ -4493,23 +4493,34 @@
         }
     }
 
-    @Test
-    public void testAccessibilityRespondToLeftRightPartiallyVisible() throws Throwable {
-        // Tests the case when there are two children, and the second child is partially visible
+    private void setUpActivityForScrollingTest(final boolean isRTL, boolean isHorizontal,
+            int numChildViews, boolean isSiblingViewVisible) throws Throwable {
         Intent intent = new Intent();
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.horizontal_linear);
+        int layout;
+        if (isHorizontal) {
+            layout = isRTL ? R.layout.horizontal_linear_rtl : R.layout.horizontal_linear;
+        } else {
+            layout = R.layout.vertical_linear;
+        }
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, layout);
         intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.item_button_at_bottom);
         intent.putExtra(GridActivity.EXTRA_ITEMS,  new int[]{});
         intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
         initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
+        mOrientation = isHorizontal ? BaseGridView.HORIZONTAL : BaseGridView.VERTICAL;
         mNumRows = 1;
 
-        final int offset = 2 * mGridView.getHorizontalSpacing();
-        final int childWidth = mGridView.getWidth() - offset - 2 * mGridView.getHorizontalSpacing();
+        final int offset = (isSiblingViewVisible ? 2 : 1) * (isHorizontal
+                ? mGridView.getHorizontalSpacing() : mGridView.getVerticalSpacing());
+        final int childSize = (isHorizontal ? mGridView.getWidth() : mGridView.getHeight())
+                - offset - (isHorizontal ? 2 * mGridView.getHorizontalSpacing() :
+                mGridView.getVerticalSpacing());
         mActivityTestRule.runOnUiThread(new Runnable() {
             @Override
             public void run() {
+                if (isRTL) {
+                    mGridView.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
+                }
                 mGridView.setWindowAlignment(BaseGridView.WINDOW_ALIGN_NO_EDGE);
                 mGridView.setWindowAlignmentOffset(offset);
                 mGridView.setWindowAlignmentOffsetPercent(BaseGridView
@@ -4519,7 +4530,12 @@
                         .ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
             }
         });
-        mActivity.addItems(0, new int[]{childWidth, childWidth});
+        int[] widthArrays = new int[numChildViews];
+        Arrays.fill(widthArrays, childSize);
+        mActivity.addItems(0, widthArrays);
+    }
+
+    private void testScrollingAction(boolean isRTL, boolean isHorizontal) throws Throwable {
         waitForItemAnimation();
         setSelectedPosition(1);
         final RecyclerViewAccessibilityDelegate delegateCompat = mGridView
@@ -4531,30 +4547,52 @@
                 delegateCompat.onInitializeAccessibilityNodeInfo(mGridView, info);
             }
         });
+        // We are currently focusing on item 1, calculating the direction to get me to item 0
+        final AccessibilityNodeInfoCompat.AccessibilityActionCompat itemZeroDirection;
+        if (isHorizontal) {
+            itemZeroDirection = isRTL
+                    ? AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_RIGHT :
+                    AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_LEFT;
+        } else {
+            itemZeroDirection =
+                    AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_UP;
+        }
+        final int translatedItemZeroDirection = AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD;
+
         assertTrue("test sanity", info.isScrollable());
         if (Build.VERSION.SDK_INT >= 23) {
-            assertTrue("test sanity", hasAction(info, AccessibilityNodeInfoCompat
-                    .AccessibilityActionCompat.ACTION_SCROLL_LEFT));
+            assertTrue("test sanity", hasAction(info, itemZeroDirection));
         } else {
-            assertTrue("test sanity", hasAction(info, AccessibilityNodeInfoCompat
-                    .ACTION_SCROLL_BACKWARD));
+            assertTrue("test sanity", hasAction(info, translatedItemZeroDirection));
         }
 
         mActivityTestRule.runOnUiThread(new Runnable() {
             @Override
             public void run() {
                 if (Build.VERSION.SDK_INT >= 23) {
-                    delegateCompat.performAccessibilityAction(mGridView, AccessibilityNodeInfoCompat
-                            .AccessibilityActionCompat.ACTION_SCROLL_LEFT.getId(), null);
+                    delegateCompat.performAccessibilityAction(mGridView, itemZeroDirection.getId(),
+                            null);
                 } else {
-                    delegateCompat.performAccessibilityAction(mGridView, AccessibilityNodeInfoCompat
-                            .ACTION_SCROLL_BACKWARD, null);
+                    delegateCompat.performAccessibilityAction(mGridView,
+                            translatedItemZeroDirection, null);
                 }
             }
         });
         waitForScrollIdle(mVerifyLayout);
         assertEquals(0, mGridView.getSelectedPosition());
         setSelectedPosition(0);
+        // We are at item 0, calculate the direction that lead us to the item 1
+        final AccessibilityNodeInfoCompat.AccessibilityActionCompat itemOneDirection;
+        if (isHorizontal) {
+            itemOneDirection = isRTL
+                    ? AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_LEFT
+                    : AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_RIGHT;
+        } else {
+            itemOneDirection =
+                    AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_DOWN;
+        }
+        final int translatedItemOneDirection = AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD;
+
         mActivityTestRule.runOnUiThread(new Runnable() {
             @Override
             public void run() {
@@ -4562,21 +4600,19 @@
             }
         });
         if (Build.VERSION.SDK_INT >= 23) {
-            assertTrue("test sanity", hasAction(info, AccessibilityNodeInfoCompat
-                    .AccessibilityActionCompat.ACTION_SCROLL_RIGHT));
+            assertTrue("test sanity", hasAction(info, itemOneDirection));
         } else {
-            assertTrue("test sanity", hasAction(info, AccessibilityNodeInfoCompat
-                    .ACTION_SCROLL_FORWARD));
+            assertTrue("test sanity", hasAction(info, translatedItemOneDirection));
         }
         mActivityTestRule.runOnUiThread(new Runnable() {
             @Override
             public void run() {
                 if (Build.VERSION.SDK_INT >= 23) {
-                    delegateCompat.performAccessibilityAction(mGridView, AccessibilityNodeInfoCompat
-                            .AccessibilityActionCompat.ACTION_SCROLL_RIGHT.getId(), null);
+                    delegateCompat.performAccessibilityAction(mGridView, itemOneDirection.getId(),
+                            null);
                 } else {
-                    delegateCompat.performAccessibilityAction(mGridView, AccessibilityNodeInfoCompat
-                            .ACTION_SCROLL_FORWARD, null);
+                    delegateCompat.performAccessibilityAction(mGridView, translatedItemOneDirection,
+                            null);
                 }
             }
         });
@@ -4585,159 +4621,58 @@
     }
 
     @Test
+    public void testAccessibilityRespondToLeftRightInvisible() throws Throwable {
+        boolean isRTL = false;
+        boolean isHorizontal = true;
+        setUpActivityForScrollingTest(isRTL, isHorizontal, 2 /* numChild */,
+                false /* next child partially visible */);
+        testScrollingAction(isRTL, isHorizontal);
+    }
+
+    @Test
+    public void testAccessibilityRespondToLeftRightPartiallyVisible() throws Throwable {
+        boolean isRTL = false;
+        boolean isHorizontal = true;
+        setUpActivityForScrollingTest(isRTL, isHorizontal, 2 /* numChild */,
+                true /* next child partially visible */);
+        testScrollingAction(isRTL, isHorizontal);
+    }
+
+    @Test
+    public void testAccessibilityRespondToLeftRightRtlInvisible()
+            throws Throwable {
+        boolean isRTL = true;
+        boolean isHorizontal = true;
+        setUpActivityForScrollingTest(isRTL, isHorizontal, 2 /* numChild */,
+                false /* next child partially visible */);
+        testScrollingAction(isRTL, isHorizontal);
+    }
+
+    @Test
     public void testAccessibilityRespondToLeftRightRtlPartiallyVisible() throws Throwable {
-        // Tests the case when there are two children, and the second child is partially visible
-        Intent intent = new Intent();
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.horizontal_linear_rtl);
-        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.item_button_at_bottom);
-        intent.putExtra(GridActivity.EXTRA_ITEMS,  new int[]{});
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 1;
-
-        final int offset = 2 * mGridView.getHorizontalSpacing();
-        final int childWidth = mGridView.getWidth() - offset - 2 * mGridView.getHorizontalSpacing();
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mGridView.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
-                mGridView.setWindowAlignment(BaseGridView.WINDOW_ALIGN_NO_EDGE);
-                mGridView.setWindowAlignmentOffset(offset);
-                mGridView.setWindowAlignmentOffsetPercent(BaseGridView
-                        .WINDOW_ALIGN_OFFSET_PERCENT_DISABLED);
-                mGridView.setItemAlignmentOffset(0);
-                mGridView.setItemAlignmentOffsetPercent(BaseGridView
-                        .ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
-            }
-        });
-        mActivity.addItems(0, new int[]{childWidth, childWidth});
-        waitForItemAnimation();
-        setSelectedPosition(1);
-        final RecyclerViewAccessibilityDelegate delegateCompat = mGridView
-                .getCompatAccessibilityDelegate();
-        final AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain();
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                delegateCompat.onInitializeAccessibilityNodeInfo(mGridView, info);
-            }
-        });
-        assertTrue("test sanity", info.isScrollable());
-        if (Build.VERSION.SDK_INT >= 23) {
-            assertTrue("test sanity", hasAction(info, AccessibilityNodeInfoCompat
-                    .AccessibilityActionCompat.ACTION_SCROLL_RIGHT));
-        } else {
-            assertTrue("test sanity", hasAction(info, AccessibilityNodeInfoCompat
-                    .ACTION_SCROLL_BACKWARD));
-        }
-
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                if (Build.VERSION.SDK_INT >= 23) {
-                    delegateCompat.performAccessibilityAction(mGridView, AccessibilityNodeInfoCompat
-                            .AccessibilityActionCompat.ACTION_SCROLL_RIGHT.getId(), null);
-                } else {
-                    delegateCompat.performAccessibilityAction(mGridView, AccessibilityNodeInfoCompat
-                            .ACTION_SCROLL_BACKWARD, null);
-                }
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        assertEquals(0, mGridView.getSelectedPosition());
-        setSelectedPosition(0);
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                delegateCompat.onInitializeAccessibilityNodeInfo(mGridView, info);
-            }
-        });
-        if (Build.VERSION.SDK_INT >= 23) {
-            assertTrue("test sanity", hasAction(info, AccessibilityNodeInfoCompat
-                    .AccessibilityActionCompat.ACTION_SCROLL_LEFT));
-        } else {
-            assertTrue("test sanity", hasAction(info, AccessibilityNodeInfoCompat
-                    .ACTION_SCROLL_FORWARD));
-        }
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                if (Build.VERSION.SDK_INT >= 23) {
-                    delegateCompat.performAccessibilityAction(mGridView, AccessibilityNodeInfoCompat
-                            .AccessibilityActionCompat.ACTION_SCROLL_LEFT.getId(), null);
-                } else {
-                    delegateCompat.performAccessibilityAction(mGridView, AccessibilityNodeInfoCompat
-                            .ACTION_SCROLL_FORWARD, null);
-                }
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        assertEquals(1, mGridView.getSelectedPosition());
+        boolean isRTL = true;
+        boolean isHorizontal = true;
+        setUpActivityForScrollingTest(isRTL, isHorizontal, 2 /* numChild */,
+                true /* next child partially visible */);
+        testScrollingAction(isRTL, isHorizontal);
     }
 
     @Test
-    public void testAccessibilityRespondToScrollUpActionPartiallyVisible() throws Throwable {
-        // Tests the case when there are two children, and the second child is partially visible
-        Intent intent = new Intent();
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.item_button_at_bottom);
-        intent.putExtra(GridActivity.EXTRA_ITEMS,  new int[]{});
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        initActivity(intent);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
+    public void testAccessibilityRespondToScrollUpDownActionInvisible() throws Throwable {
+        boolean isRTL = false;
+        boolean isHorizontal = false;
+        setUpActivityForScrollingTest(isRTL, isHorizontal, 2 /* numChild */,
+                false /* next child partially visible */);
+        testScrollingAction(isRTL, isHorizontal);
+    }
 
-        final int offset = 2 * mGridView.getVerticalSpacing();
-        final int childHeight = mGridView.getHeight() - offset - 2 * mGridView.getVerticalSpacing();
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mGridView.setWindowAlignment(BaseGridView.WINDOW_ALIGN_NO_EDGE);
-                mGridView.setWindowAlignmentOffset(offset);
-                mGridView.setWindowAlignmentOffsetPercent(BaseGridView
-                        .WINDOW_ALIGN_OFFSET_PERCENT_DISABLED);
-                mGridView.setItemAlignmentOffset(0);
-                mGridView.setItemAlignmentOffsetPercent(BaseGridView
-                        .ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
-            }
-        });
-        mActivity.addItems(0, new int[]{childHeight, childHeight});
-        waitForItemAnimation();
-        setSelectedPosition(1);
-
-        final RecyclerViewAccessibilityDelegate delegateCompat = mGridView
-                .getCompatAccessibilityDelegate();
-        final AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain();
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                delegateCompat.onInitializeAccessibilityNodeInfo(mGridView, info);
-            }
-        });
-        assertTrue("test sanity", info.isScrollable());
-        if (Build.VERSION.SDK_INT >= 23) {
-            assertTrue("test sanity", hasAction(info, AccessibilityNodeInfoCompat
-                    .AccessibilityActionCompat.ACTION_SCROLL_UP));
-        } else {
-            assertTrue("test sanity", hasAction(info, AccessibilityNodeInfoCompat
-                    .ACTION_SCROLL_BACKWARD));
-        }
-
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                if (Build.VERSION.SDK_INT >= 23) {
-                    delegateCompat.performAccessibilityAction(mGridView, AccessibilityNodeInfoCompat
-                            .AccessibilityActionCompat.ACTION_SCROLL_UP.getId(), null);
-                } else {
-                    delegateCompat.performAccessibilityAction(mGridView, AccessibilityNodeInfoCompat
-                            .ACTION_SCROLL_BACKWARD, null);
-                }
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        assertEquals(0, mGridView.getSelectedPosition());
+    @Test
+    public void testAccessibilityRespondToScrollUpDownActionPartiallyVisible() throws Throwable {
+        boolean isRTL = false;
+        boolean isHorizontal = false;
+        setUpActivityForScrollingTest(isRTL, isHorizontal, 2 /* numChild */,
+                true /* next child partially visible */);
+        testScrollingAction(isRTL, isHorizontal);
     }
 
     @Test
diff --git a/lifecycle/extensions/src/androidTest/AndroidManifest.xml b/lifecycle/extensions/src/androidTest/AndroidManifest.xml
index 08e1de6..db921fd 100644
--- a/lifecycle/extensions/src/androidTest/AndroidManifest.xml
+++ b/lifecycle/extensions/src/androidTest/AndroidManifest.xml
@@ -17,6 +17,7 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.lifecycle.extensions.test">
+    <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
 
     <application>
         <activity android:name="android.arch.lifecycle.viewmodeltest.ViewModelActivity"
diff --git a/lifecycle/reactivestreams/src/androidTest/AndroidManifest.xml b/lifecycle/reactivestreams/src/androidTest/AndroidManifest.xml
index 722f480..e60c9f4 100644
--- a/lifecycle/reactivestreams/src/androidTest/AndroidManifest.xml
+++ b/lifecycle/reactivestreams/src/androidTest/AndroidManifest.xml
@@ -17,6 +17,7 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.lifecycle.reactivestreams.test">
+    <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
 
     <application>
         <activity android:name="android.arch.lifecycle.viewmodeltest.ViewModelActivity"
diff --git a/media-compat/Android.mk b/media-compat/Android.mk
deleted file mode 100644
index 8538752..0000000
--- a/media-compat/Android.mk
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright (C) 2011 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-media-compat \
-#       android-support-compat \
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-media-compat
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/java
-LOCAL_SRC_FILES := \
-    $(call all-java-files-under,api21) \
-    $(call all-java-files-under,api22) \
-    $(call all-java-files-under,api23) \
-    $(call all-java-files-under,api24) \
-    $(call all-java-files-under,api26) \
-    $(call all-java-files-under,java) \
-    $(call all-Iaidl-files-under,java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-compat
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/media-compat/api/27.1.0.txt b/media-compat/api/27.1.0.txt
new file mode 100644
index 0000000..b53de68
--- /dev/null
+++ b/media-compat/api/27.1.0.txt
@@ -0,0 +1,649 @@
+package android.support.v4.media {
+
+  public class AudioAttributesCompat {
+    method public int getContentType();
+    method public int getFlags();
+    method public int getLegacyStreamType();
+    method public int getUsage();
+    method public int getVolumeControlStream();
+    method public java.lang.Object unwrap();
+    method public static android.support.v4.media.AudioAttributesCompat wrap(java.lang.Object);
+    field public static final int CONTENT_TYPE_MOVIE = 3; // 0x3
+    field public static final int CONTENT_TYPE_MUSIC = 2; // 0x2
+    field public static final int CONTENT_TYPE_SONIFICATION = 4; // 0x4
+    field public static final int CONTENT_TYPE_SPEECH = 1; // 0x1
+    field public static final int CONTENT_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FLAG_AUDIBILITY_ENFORCED = 1; // 0x1
+    field public static final int FLAG_HW_AV_SYNC = 16; // 0x10
+    field public static final int USAGE_ALARM = 4; // 0x4
+    field public static final int USAGE_ASSISTANCE_ACCESSIBILITY = 11; // 0xb
+    field public static final int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12; // 0xc
+    field public static final int USAGE_ASSISTANCE_SONIFICATION = 13; // 0xd
+    field public static final int USAGE_ASSISTANT = 16; // 0x10
+    field public static final int USAGE_GAME = 14; // 0xe
+    field public static final int USAGE_MEDIA = 1; // 0x1
+    field public static final int USAGE_NOTIFICATION = 5; // 0x5
+    field public static final int USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9; // 0x9
+    field public static final int USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8; // 0x8
+    field public static final int USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7; // 0x7
+    field public static final int USAGE_NOTIFICATION_EVENT = 10; // 0xa
+    field public static final int USAGE_NOTIFICATION_RINGTONE = 6; // 0x6
+    field public static final int USAGE_UNKNOWN = 0; // 0x0
+    field public static final int USAGE_VOICE_COMMUNICATION = 2; // 0x2
+    field public static final int USAGE_VOICE_COMMUNICATION_SIGNALLING = 3; // 0x3
+  }
+
+  public static class AudioAttributesCompat.Builder {
+    ctor public AudioAttributesCompat.Builder();
+    ctor public AudioAttributesCompat.Builder(android.support.v4.media.AudioAttributesCompat);
+    method public android.support.v4.media.AudioAttributesCompat build();
+    method public android.support.v4.media.AudioAttributesCompat.Builder setContentType(int);
+    method public android.support.v4.media.AudioAttributesCompat.Builder setFlags(int);
+    method public android.support.v4.media.AudioAttributesCompat.Builder setLegacyStreamType(int);
+    method public android.support.v4.media.AudioAttributesCompat.Builder setUsage(int);
+  }
+
+  public final class MediaBrowserCompat {
+    ctor public MediaBrowserCompat(android.content.Context, android.content.ComponentName, android.support.v4.media.MediaBrowserCompat.ConnectionCallback, android.os.Bundle);
+    method public void connect();
+    method public void disconnect();
+    method public android.os.Bundle getExtras();
+    method public void getItem(java.lang.String, android.support.v4.media.MediaBrowserCompat.ItemCallback);
+    method public java.lang.String getRoot();
+    method public android.content.ComponentName getServiceComponent();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public boolean isConnected();
+    method public void search(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.SearchCallback);
+    method public void sendCustomAction(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.CustomActionCallback);
+    method public void subscribe(java.lang.String, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+    method public void subscribe(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+    method public void unsubscribe(java.lang.String);
+    method public void unsubscribe(java.lang.String, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+    field public static final java.lang.String CUSTOM_ACTION_DOWNLOAD = "android.support.v4.media.action.DOWNLOAD";
+    field public static final java.lang.String CUSTOM_ACTION_REMOVE_DOWNLOADED_FILE = "android.support.v4.media.action.REMOVE_DOWNLOADED_FILE";
+    field public static final java.lang.String EXTRA_DOWNLOAD_PROGRESS = "android.media.browse.extra.DOWNLOAD_PROGRESS";
+    field public static final java.lang.String EXTRA_MEDIA_ID = "android.media.browse.extra.MEDIA_ID";
+    field public static final java.lang.String EXTRA_PAGE = "android.media.browse.extra.PAGE";
+    field public static final java.lang.String EXTRA_PAGE_SIZE = "android.media.browse.extra.PAGE_SIZE";
+  }
+
+  public static class MediaBrowserCompat.ConnectionCallback {
+    ctor public MediaBrowserCompat.ConnectionCallback();
+    method public void onConnected();
+    method public void onConnectionFailed();
+    method public void onConnectionSuspended();
+  }
+
+  public static abstract class MediaBrowserCompat.CustomActionCallback {
+    ctor public MediaBrowserCompat.CustomActionCallback();
+    method public void onError(java.lang.String, android.os.Bundle, android.os.Bundle);
+    method public void onProgressUpdate(java.lang.String, android.os.Bundle, android.os.Bundle);
+    method public void onResult(java.lang.String, android.os.Bundle, android.os.Bundle);
+  }
+
+  public static abstract class MediaBrowserCompat.ItemCallback {
+    ctor public MediaBrowserCompat.ItemCallback();
+    method public void onError(java.lang.String);
+    method public void onItemLoaded(android.support.v4.media.MediaBrowserCompat.MediaItem);
+  }
+
+  public static class MediaBrowserCompat.MediaItem implements android.os.Parcelable {
+    ctor public MediaBrowserCompat.MediaItem(android.support.v4.media.MediaDescriptionCompat, int);
+    method public int describeContents();
+    method public static android.support.v4.media.MediaBrowserCompat.MediaItem fromMediaItem(java.lang.Object);
+    method public static java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem> fromMediaItemList(java.util.List<?>);
+    method public android.support.v4.media.MediaDescriptionCompat getDescription();
+    method public int getFlags();
+    method public java.lang.String getMediaId();
+    method public boolean isBrowsable();
+    method public boolean isPlayable();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaBrowserCompat.MediaItem> CREATOR;
+    field public static final int FLAG_BROWSABLE = 1; // 0x1
+    field public static final int FLAG_PLAYABLE = 2; // 0x2
+  }
+
+  public static abstract class MediaBrowserCompat.SearchCallback {
+    ctor public MediaBrowserCompat.SearchCallback();
+    method public void onError(java.lang.String, android.os.Bundle);
+    method public void onSearchResult(java.lang.String, android.os.Bundle, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+  }
+
+  public static abstract class MediaBrowserCompat.SubscriptionCallback {
+    ctor public MediaBrowserCompat.SubscriptionCallback();
+    method public void onChildrenLoaded(java.lang.String, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+    method public void onChildrenLoaded(java.lang.String, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>, android.os.Bundle);
+    method public void onError(java.lang.String);
+    method public void onError(java.lang.String, android.os.Bundle);
+  }
+
+  public abstract class MediaBrowserServiceCompat extends android.app.Service {
+    ctor public MediaBrowserServiceCompat();
+    method public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public final android.os.Bundle getBrowserRootHints();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public void notifyChildrenChanged(java.lang.String);
+    method public void notifyChildrenChanged(java.lang.String, android.os.Bundle);
+    method public android.os.IBinder onBind(android.content.Intent);
+    method public void onCustomAction(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserServiceCompat.Result<android.os.Bundle>);
+    method public abstract android.support.v4.media.MediaBrowserServiceCompat.BrowserRoot onGetRoot(java.lang.String, int, android.os.Bundle);
+    method public abstract void onLoadChildren(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>);
+    method public void onLoadChildren(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>, android.os.Bundle);
+    method public void onLoadItem(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+    method public void onSearch(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>);
+    method public void setSessionToken(android.support.v4.media.session.MediaSessionCompat.Token);
+    field public static final java.lang.String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
+  }
+
+  public static final class MediaBrowserServiceCompat.BrowserRoot {
+    ctor public MediaBrowserServiceCompat.BrowserRoot(java.lang.String, android.os.Bundle);
+    method public android.os.Bundle getExtras();
+    method public java.lang.String getRootId();
+    field public static final java.lang.String EXTRA_OFFLINE = "android.service.media.extra.OFFLINE";
+    field public static final java.lang.String EXTRA_RECENT = "android.service.media.extra.RECENT";
+    field public static final java.lang.String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED";
+    field public static final deprecated java.lang.String EXTRA_SUGGESTION_KEYWORDS = "android.service.media.extra.SUGGESTION_KEYWORDS";
+  }
+
+  public static class MediaBrowserServiceCompat.Result<T> {
+    method public void detach();
+    method public void sendError(android.os.Bundle);
+    method public void sendProgressUpdate(android.os.Bundle);
+    method public void sendResult(T);
+  }
+
+  public final class MediaDescriptionCompat implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.MediaDescriptionCompat fromMediaDescription(java.lang.Object);
+    method public java.lang.CharSequence getDescription();
+    method public android.os.Bundle getExtras();
+    method public android.graphics.Bitmap getIconBitmap();
+    method public android.net.Uri getIconUri();
+    method public java.lang.Object getMediaDescription();
+    method public java.lang.String getMediaId();
+    method public android.net.Uri getMediaUri();
+    method public java.lang.CharSequence getSubtitle();
+    method public java.lang.CharSequence getTitle();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final long BT_FOLDER_TYPE_ALBUMS = 2L; // 0x2L
+    field public static final long BT_FOLDER_TYPE_ARTISTS = 3L; // 0x3L
+    field public static final long BT_FOLDER_TYPE_GENRES = 4L; // 0x4L
+    field public static final long BT_FOLDER_TYPE_MIXED = 0L; // 0x0L
+    field public static final long BT_FOLDER_TYPE_PLAYLISTS = 5L; // 0x5L
+    field public static final long BT_FOLDER_TYPE_TITLES = 1L; // 0x1L
+    field public static final long BT_FOLDER_TYPE_YEARS = 6L; // 0x6L
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat> CREATOR;
+    field public static final java.lang.String EXTRA_BT_FOLDER_TYPE = "android.media.extra.BT_FOLDER_TYPE";
+    field public static final java.lang.String EXTRA_DOWNLOAD_STATUS = "android.media.extra.DOWNLOAD_STATUS";
+    field public static final long STATUS_DOWNLOADED = 2L; // 0x2L
+    field public static final long STATUS_DOWNLOADING = 1L; // 0x1L
+    field public static final long STATUS_NOT_DOWNLOADED = 0L; // 0x0L
+  }
+
+  public static final class MediaDescriptionCompat.Builder {
+    ctor public MediaDescriptionCompat.Builder();
+    method public android.support.v4.media.MediaDescriptionCompat build();
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setDescription(java.lang.CharSequence);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setExtras(android.os.Bundle);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconBitmap(android.graphics.Bitmap);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconUri(android.net.Uri);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaId(java.lang.String);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaUri(android.net.Uri);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setSubtitle(java.lang.CharSequence);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setTitle(java.lang.CharSequence);
+  }
+
+  public final class MediaMetadataCompat implements android.os.Parcelable {
+    method public boolean containsKey(java.lang.String);
+    method public int describeContents();
+    method public static android.support.v4.media.MediaMetadataCompat fromMediaMetadata(java.lang.Object);
+    method public android.graphics.Bitmap getBitmap(java.lang.String);
+    method public android.os.Bundle getBundle();
+    method public android.support.v4.media.MediaDescriptionCompat getDescription();
+    method public long getLong(java.lang.String);
+    method public java.lang.Object getMediaMetadata();
+    method public android.support.v4.media.RatingCompat getRating(java.lang.String);
+    method public java.lang.String getString(java.lang.String);
+    method public java.lang.CharSequence getText(java.lang.String);
+    method public java.util.Set<java.lang.String> keySet();
+    method public int size();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaMetadataCompat> CREATOR;
+    field public static final java.lang.String METADATA_KEY_ADVERTISEMENT = "android.media.metadata.ADVERTISEMENT";
+    field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
+    field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
+    field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
+    field public static final java.lang.String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
+    field public static final java.lang.String METADATA_KEY_ART = "android.media.metadata.ART";
+    field public static final java.lang.String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
+    field public static final java.lang.String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
+    field public static final java.lang.String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
+    field public static final java.lang.String METADATA_KEY_BT_FOLDER_TYPE = "android.media.metadata.BT_FOLDER_TYPE";
+    field public static final java.lang.String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
+    field public static final java.lang.String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
+    field public static final java.lang.String METADATA_KEY_DATE = "android.media.metadata.DATE";
+    field public static final java.lang.String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
+    field public static final java.lang.String METADATA_KEY_DOWNLOAD_STATUS = "android.media.metadata.DOWNLOAD_STATUS";
+    field public static final java.lang.String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
+    field public static final java.lang.String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
+    field public static final java.lang.String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
+    field public static final java.lang.String METADATA_KEY_MEDIA_URI = "android.media.metadata.MEDIA_URI";
+    field public static final java.lang.String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
+    field public static final java.lang.String METADATA_KEY_RATING = "android.media.metadata.RATING";
+    field public static final java.lang.String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
+    field public static final java.lang.String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
+    field public static final java.lang.String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
+    field public static final java.lang.String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
+    field public static final java.lang.String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
+  }
+
+  public static final class MediaMetadataCompat.Builder {
+    ctor public MediaMetadataCompat.Builder();
+    ctor public MediaMetadataCompat.Builder(android.support.v4.media.MediaMetadataCompat);
+    method public android.support.v4.media.MediaMetadataCompat build();
+    method public android.support.v4.media.MediaMetadataCompat.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
+    method public android.support.v4.media.MediaMetadataCompat.Builder putLong(java.lang.String, long);
+    method public android.support.v4.media.MediaMetadataCompat.Builder putRating(java.lang.String, android.support.v4.media.RatingCompat);
+    method public android.support.v4.media.MediaMetadataCompat.Builder putString(java.lang.String, java.lang.String);
+    method public android.support.v4.media.MediaMetadataCompat.Builder putText(java.lang.String, java.lang.CharSequence);
+  }
+
+  public final class RatingCompat implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.RatingCompat fromRating(java.lang.Object);
+    method public float getPercentRating();
+    method public java.lang.Object getRating();
+    method public int getRatingStyle();
+    method public float getStarRating();
+    method public boolean hasHeart();
+    method public boolean isRated();
+    method public boolean isThumbUp();
+    method public static android.support.v4.media.RatingCompat newHeartRating(boolean);
+    method public static android.support.v4.media.RatingCompat newPercentageRating(float);
+    method public static android.support.v4.media.RatingCompat newStarRating(int, float);
+    method public static android.support.v4.media.RatingCompat newThumbRating(boolean);
+    method public static android.support.v4.media.RatingCompat newUnratedRating(int);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.RatingCompat> CREATOR;
+    field public static final int RATING_3_STARS = 3; // 0x3
+    field public static final int RATING_4_STARS = 4; // 0x4
+    field public static final int RATING_5_STARS = 5; // 0x5
+    field public static final int RATING_HEART = 1; // 0x1
+    field public static final int RATING_NONE = 0; // 0x0
+    field public static final int RATING_PERCENTAGE = 6; // 0x6
+    field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
+  }
+
+  public abstract class VolumeProviderCompat {
+    ctor public VolumeProviderCompat(int, int, int);
+    method public final int getCurrentVolume();
+    method public final int getMaxVolume();
+    method public final int getVolumeControl();
+    method public java.lang.Object getVolumeProvider();
+    method public void onAdjustVolume(int);
+    method public void onSetVolumeTo(int);
+    method public void setCallback(android.support.v4.media.VolumeProviderCompat.Callback);
+    method public final void setCurrentVolume(int);
+    field public static final int VOLUME_CONTROL_ABSOLUTE = 2; // 0x2
+    field public static final int VOLUME_CONTROL_FIXED = 0; // 0x0
+    field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
+  }
+
+  public static abstract class VolumeProviderCompat.Callback {
+    ctor public VolumeProviderCompat.Callback();
+    method public abstract void onVolumeChanged(android.support.v4.media.VolumeProviderCompat);
+  }
+
+}
+
+package android.support.v4.media.app {
+
+  public class NotificationCompat {
+  }
+
+  public static class NotificationCompat.DecoratedMediaCustomViewStyle extends android.support.v4.media.app.NotificationCompat.MediaStyle {
+    ctor public NotificationCompat.DecoratedMediaCustomViewStyle();
+  }
+
+  public static class NotificationCompat.MediaStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.MediaStyle();
+    ctor public NotificationCompat.MediaStyle(android.support.v4.app.NotificationCompat.Builder);
+    method public static android.support.v4.media.session.MediaSessionCompat.Token getMediaSession(android.app.Notification);
+    method public android.support.v4.media.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
+    method public android.support.v4.media.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
+    method public android.support.v4.media.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
+    method public android.support.v4.media.app.NotificationCompat.MediaStyle setShowCancelButton(boolean);
+  }
+
+}
+
+package android.support.v4.media.session {
+
+  public class MediaButtonReceiver extends android.content.BroadcastReceiver {
+    ctor public MediaButtonReceiver();
+    method public static android.app.PendingIntent buildMediaButtonPendingIntent(android.content.Context, long);
+    method public static android.app.PendingIntent buildMediaButtonPendingIntent(android.content.Context, android.content.ComponentName, long);
+    method public static android.view.KeyEvent handleIntent(android.support.v4.media.session.MediaSessionCompat, android.content.Intent);
+    method public void onReceive(android.content.Context, android.content.Intent);
+  }
+
+  public final class MediaControllerCompat {
+    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat);
+    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat.Token) throws android.os.RemoteException;
+    method public void addQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public void addQueueItem(android.support.v4.media.MediaDescriptionCompat, int);
+    method public void adjustVolume(int, int);
+    method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
+    method public android.os.Bundle getExtras();
+    method public long getFlags();
+    method public static android.support.v4.media.session.MediaControllerCompat getMediaController(android.app.Activity);
+    method public java.lang.Object getMediaController();
+    method public android.support.v4.media.MediaMetadataCompat getMetadata();
+    method public java.lang.String getPackageName();
+    method public android.support.v4.media.session.MediaControllerCompat.PlaybackInfo getPlaybackInfo();
+    method public android.support.v4.media.session.PlaybackStateCompat getPlaybackState();
+    method public java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> getQueue();
+    method public java.lang.CharSequence getQueueTitle();
+    method public int getRatingType();
+    method public int getRepeatMode();
+    method public android.app.PendingIntent getSessionActivity();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public int getShuffleMode();
+    method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
+    method public boolean isCaptioningEnabled();
+    method public boolean isSessionReady();
+    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
+    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback, android.os.Handler);
+    method public void removeQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public deprecated void removeQueueItemAt(int);
+    method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
+    method public static void setMediaController(android.app.Activity, android.support.v4.media.session.MediaControllerCompat);
+    method public void setVolumeTo(int, int);
+    method public void unregisterCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
+  }
+
+  public static abstract class MediaControllerCompat.Callback implements android.os.IBinder.DeathRecipient {
+    ctor public MediaControllerCompat.Callback();
+    method public void binderDied();
+    method public void onAudioInfoChanged(android.support.v4.media.session.MediaControllerCompat.PlaybackInfo);
+    method public void onCaptioningEnabledChanged(boolean);
+    method public void onExtrasChanged(android.os.Bundle);
+    method public void onMetadataChanged(android.support.v4.media.MediaMetadataCompat);
+    method public void onPlaybackStateChanged(android.support.v4.media.session.PlaybackStateCompat);
+    method public void onQueueChanged(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
+    method public void onQueueTitleChanged(java.lang.CharSequence);
+    method public void onRepeatModeChanged(int);
+    method public void onSessionDestroyed();
+    method public void onSessionEvent(java.lang.String, android.os.Bundle);
+    method public void onSessionReady();
+    method public void onShuffleModeChanged(int);
+  }
+
+  public static final class MediaControllerCompat.PlaybackInfo {
+    method public int getAudioStream();
+    method public int getCurrentVolume();
+    method public int getMaxVolume();
+    method public int getPlaybackType();
+    method public int getVolumeControl();
+    field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1
+    field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2
+  }
+
+  public static abstract class MediaControllerCompat.TransportControls {
+    method public abstract void fastForward();
+    method public abstract void pause();
+    method public abstract void play();
+    method public abstract void playFromMediaId(java.lang.String, android.os.Bundle);
+    method public abstract void playFromSearch(java.lang.String, android.os.Bundle);
+    method public abstract void playFromUri(android.net.Uri, android.os.Bundle);
+    method public abstract void prepare();
+    method public abstract void prepareFromMediaId(java.lang.String, android.os.Bundle);
+    method public abstract void prepareFromSearch(java.lang.String, android.os.Bundle);
+    method public abstract void prepareFromUri(android.net.Uri, android.os.Bundle);
+    method public abstract void rewind();
+    method public abstract void seekTo(long);
+    method public abstract void sendCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction, android.os.Bundle);
+    method public abstract void sendCustomAction(java.lang.String, android.os.Bundle);
+    method public abstract void setCaptioningEnabled(boolean);
+    method public abstract void setRating(android.support.v4.media.RatingCompat);
+    method public abstract void setRating(android.support.v4.media.RatingCompat, android.os.Bundle);
+    method public abstract void setRepeatMode(int);
+    method public abstract void setShuffleMode(int);
+    method public abstract void skipToNext();
+    method public abstract void skipToPrevious();
+    method public abstract void skipToQueueItem(long);
+    method public abstract void stop();
+    field public static final java.lang.String EXTRA_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
+  }
+
+  public class MediaSessionCompat {
+    ctor public MediaSessionCompat(android.content.Context, java.lang.String);
+    ctor public MediaSessionCompat(android.content.Context, java.lang.String, android.content.ComponentName, android.app.PendingIntent);
+    method public void addOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
+    method public static android.support.v4.media.session.MediaSessionCompat fromMediaSession(android.content.Context, java.lang.Object);
+    method public android.support.v4.media.session.MediaControllerCompat getController();
+    method public java.lang.Object getMediaSession();
+    method public java.lang.Object getRemoteControlClient();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public boolean isActive();
+    method public void release();
+    method public void removeOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
+    method public void sendSessionEvent(java.lang.String, android.os.Bundle);
+    method public void setActive(boolean);
+    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback);
+    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback, android.os.Handler);
+    method public void setCaptioningEnabled(boolean);
+    method public void setExtras(android.os.Bundle);
+    method public void setFlags(int);
+    method public void setMediaButtonReceiver(android.app.PendingIntent);
+    method public void setMetadata(android.support.v4.media.MediaMetadataCompat);
+    method public void setPlaybackState(android.support.v4.media.session.PlaybackStateCompat);
+    method public void setPlaybackToLocal(int);
+    method public void setPlaybackToRemote(android.support.v4.media.VolumeProviderCompat);
+    method public void setQueue(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
+    method public void setQueueTitle(java.lang.CharSequence);
+    method public void setRatingType(int);
+    method public void setRepeatMode(int);
+    method public void setSessionActivity(android.app.PendingIntent);
+    method public void setShuffleMode(int);
+    field public static final java.lang.String ACTION_FLAG_AS_INAPPROPRIATE = "android.support.v4.media.session.action.FLAG_AS_INAPPROPRIATE";
+    field public static final java.lang.String ACTION_FOLLOW = "android.support.v4.media.session.action.FOLLOW";
+    field public static final java.lang.String ACTION_SKIP_AD = "android.support.v4.media.session.action.SKIP_AD";
+    field public static final java.lang.String ACTION_UNFOLLOW = "android.support.v4.media.session.action.UNFOLLOW";
+    field public static final java.lang.String ARGUMENT_MEDIA_ATTRIBUTE = "android.support.v4.media.session.ARGUMENT_MEDIA_ATTRIBUTE";
+    field public static final java.lang.String ARGUMENT_MEDIA_ATTRIBUTE_VALUE = "android.support.v4.media.session.ARGUMENT_MEDIA_ATTRIBUTE_VALUE";
+    field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
+    field public static final int FLAG_HANDLES_QUEUE_COMMANDS = 4; // 0x4
+    field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
+    field public static final int MEDIA_ATTRIBUTE_ALBUM = 1; // 0x1
+    field public static final int MEDIA_ATTRIBUTE_ARTIST = 0; // 0x0
+    field public static final int MEDIA_ATTRIBUTE_PLAYLIST = 2; // 0x2
+  }
+
+  public static abstract class MediaSessionCompat.Callback {
+    ctor public MediaSessionCompat.Callback();
+    method public void onAddQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public void onAddQueueItem(android.support.v4.media.MediaDescriptionCompat, int);
+    method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
+    method public void onCustomAction(java.lang.String, android.os.Bundle);
+    method public void onFastForward();
+    method public boolean onMediaButtonEvent(android.content.Intent);
+    method public void onPause();
+    method public void onPlay();
+    method public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
+    method public void onPlayFromSearch(java.lang.String, android.os.Bundle);
+    method public void onPlayFromUri(android.net.Uri, android.os.Bundle);
+    method public void onPrepare();
+    method public void onPrepareFromMediaId(java.lang.String, android.os.Bundle);
+    method public void onPrepareFromSearch(java.lang.String, android.os.Bundle);
+    method public void onPrepareFromUri(android.net.Uri, android.os.Bundle);
+    method public void onRemoveQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public deprecated void onRemoveQueueItemAt(int);
+    method public void onRewind();
+    method public void onSeekTo(long);
+    method public void onSetCaptioningEnabled(boolean);
+    method public void onSetRating(android.support.v4.media.RatingCompat);
+    method public void onSetRating(android.support.v4.media.RatingCompat, android.os.Bundle);
+    method public void onSetRepeatMode(int);
+    method public void onSetShuffleMode(int);
+    method public void onSkipToNext();
+    method public void onSkipToPrevious();
+    method public void onSkipToQueueItem(long);
+    method public void onStop();
+  }
+
+  public static abstract interface MediaSessionCompat.OnActiveChangeListener {
+    method public abstract void onActiveChanged();
+  }
+
+  public static final class MediaSessionCompat.QueueItem implements android.os.Parcelable {
+    ctor public MediaSessionCompat.QueueItem(android.support.v4.media.MediaDescriptionCompat, long);
+    method public int describeContents();
+    method public static android.support.v4.media.session.MediaSessionCompat.QueueItem fromQueueItem(java.lang.Object);
+    method public static java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> fromQueueItemList(java.util.List<?>);
+    method public android.support.v4.media.MediaDescriptionCompat getDescription();
+    method public long getQueueId();
+    method public java.lang.Object getQueueItem();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.QueueItem> CREATOR;
+    field public static final int UNKNOWN_ID = -1; // 0xffffffff
+  }
+
+  public static final class MediaSessionCompat.Token implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.session.MediaSessionCompat.Token fromToken(java.lang.Object);
+    method public java.lang.Object getToken();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.Token> CREATOR;
+  }
+
+  public class ParcelableVolumeInfo implements android.os.Parcelable {
+    ctor public ParcelableVolumeInfo(int, int, int, int, int);
+    ctor public ParcelableVolumeInfo(android.os.Parcel);
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.ParcelableVolumeInfo> CREATOR;
+    field public int audioStream;
+    field public int controlType;
+    field public int currentVolume;
+    field public int maxVolume;
+    field public int volumeType;
+  }
+
+  public final class PlaybackStateCompat implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.session.PlaybackStateCompat fromPlaybackState(java.lang.Object);
+    method public long getActions();
+    method public long getActiveQueueItemId();
+    method public long getBufferedPosition();
+    method public java.util.List<android.support.v4.media.session.PlaybackStateCompat.CustomAction> getCustomActions();
+    method public int getErrorCode();
+    method public java.lang.CharSequence getErrorMessage();
+    method public android.os.Bundle getExtras();
+    method public long getLastPositionUpdateTime();
+    method public float getPlaybackSpeed();
+    method public java.lang.Object getPlaybackState();
+    method public long getPosition();
+    method public int getState();
+    method public static int toKeyCode(long);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final long ACTION_FAST_FORWARD = 64L; // 0x40L
+    field public static final long ACTION_PAUSE = 2L; // 0x2L
+    field public static final long ACTION_PLAY = 4L; // 0x4L
+    field public static final long ACTION_PLAY_FROM_MEDIA_ID = 1024L; // 0x400L
+    field public static final long ACTION_PLAY_FROM_SEARCH = 2048L; // 0x800L
+    field public static final long ACTION_PLAY_FROM_URI = 8192L; // 0x2000L
+    field public static final long ACTION_PLAY_PAUSE = 512L; // 0x200L
+    field public static final long ACTION_PREPARE = 16384L; // 0x4000L
+    field public static final long ACTION_PREPARE_FROM_MEDIA_ID = 32768L; // 0x8000L
+    field public static final long ACTION_PREPARE_FROM_SEARCH = 65536L; // 0x10000L
+    field public static final long ACTION_PREPARE_FROM_URI = 131072L; // 0x20000L
+    field public static final long ACTION_REWIND = 8L; // 0x8L
+    field public static final long ACTION_SEEK_TO = 256L; // 0x100L
+    field public static final long ACTION_SET_CAPTIONING_ENABLED = 1048576L; // 0x100000L
+    field public static final long ACTION_SET_RATING = 128L; // 0x80L
+    field public static final long ACTION_SET_REPEAT_MODE = 262144L; // 0x40000L
+    field public static final long ACTION_SET_SHUFFLE_MODE = 2097152L; // 0x200000L
+    field public static final deprecated long ACTION_SET_SHUFFLE_MODE_ENABLED = 524288L; // 0x80000L
+    field public static final long ACTION_SKIP_TO_NEXT = 32L; // 0x20L
+    field public static final long ACTION_SKIP_TO_PREVIOUS = 16L; // 0x10L
+    field public static final long ACTION_SKIP_TO_QUEUE_ITEM = 4096L; // 0x1000L
+    field public static final long ACTION_STOP = 1L; // 0x1L
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat> CREATOR;
+    field public static final int ERROR_CODE_ACTION_ABORTED = 10; // 0xa
+    field public static final int ERROR_CODE_APP_ERROR = 1; // 0x1
+    field public static final int ERROR_CODE_AUTHENTICATION_EXPIRED = 3; // 0x3
+    field public static final int ERROR_CODE_CONCURRENT_STREAM_LIMIT = 5; // 0x5
+    field public static final int ERROR_CODE_CONTENT_ALREADY_PLAYING = 8; // 0x8
+    field public static final int ERROR_CODE_END_OF_QUEUE = 11; // 0xb
+    field public static final int ERROR_CODE_NOT_AVAILABLE_IN_REGION = 7; // 0x7
+    field public static final int ERROR_CODE_NOT_SUPPORTED = 2; // 0x2
+    field public static final int ERROR_CODE_PARENTAL_CONTROL_RESTRICTED = 6; // 0x6
+    field public static final int ERROR_CODE_PREMIUM_ACCOUNT_REQUIRED = 4; // 0x4
+    field public static final int ERROR_CODE_SKIP_LIMIT_REACHED = 9; // 0x9
+    field public static final int ERROR_CODE_UNKNOWN_ERROR = 0; // 0x0
+    field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
+    field public static final int REPEAT_MODE_ALL = 2; // 0x2
+    field public static final int REPEAT_MODE_GROUP = 3; // 0x3
+    field public static final int REPEAT_MODE_INVALID = -1; // 0xffffffff
+    field public static final int REPEAT_MODE_NONE = 0; // 0x0
+    field public static final int REPEAT_MODE_ONE = 1; // 0x1
+    field public static final int SHUFFLE_MODE_ALL = 1; // 0x1
+    field public static final int SHUFFLE_MODE_GROUP = 2; // 0x2
+    field public static final int SHUFFLE_MODE_INVALID = -1; // 0xffffffff
+    field public static final int SHUFFLE_MODE_NONE = 0; // 0x0
+    field public static final int STATE_BUFFERING = 6; // 0x6
+    field public static final int STATE_CONNECTING = 8; // 0x8
+    field public static final int STATE_ERROR = 7; // 0x7
+    field public static final int STATE_FAST_FORWARDING = 4; // 0x4
+    field public static final int STATE_NONE = 0; // 0x0
+    field public static final int STATE_PAUSED = 2; // 0x2
+    field public static final int STATE_PLAYING = 3; // 0x3
+    field public static final int STATE_REWINDING = 5; // 0x5
+    field public static final int STATE_SKIPPING_TO_NEXT = 10; // 0xa
+    field public static final int STATE_SKIPPING_TO_PREVIOUS = 9; // 0x9
+    field public static final int STATE_SKIPPING_TO_QUEUE_ITEM = 11; // 0xb
+    field public static final int STATE_STOPPED = 1; // 0x1
+  }
+
+  public static final class PlaybackStateCompat.Builder {
+    ctor public PlaybackStateCompat.Builder();
+    ctor public PlaybackStateCompat.Builder(android.support.v4.media.session.PlaybackStateCompat);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(java.lang.String, java.lang.String, int);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction);
+    method public android.support.v4.media.session.PlaybackStateCompat build();
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActions(long);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActiveQueueItemId(long);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setBufferedPosition(long);
+    method public deprecated android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(java.lang.CharSequence);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(int, java.lang.CharSequence);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setExtras(android.os.Bundle);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float, long);
+  }
+
+  public static final class PlaybackStateCompat.CustomAction implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.session.PlaybackStateCompat.CustomAction fromCustomAction(java.lang.Object);
+    method public java.lang.String getAction();
+    method public java.lang.Object getCustomAction();
+    method public android.os.Bundle getExtras();
+    method public int getIcon();
+    method public java.lang.CharSequence getName();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat.CustomAction> CREATOR;
+  }
+
+  public static final class PlaybackStateCompat.CustomAction.Builder {
+    ctor public PlaybackStateCompat.CustomAction.Builder(java.lang.String, java.lang.CharSequence, int);
+    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction build();
+    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction.Builder setExtras(android.os.Bundle);
+  }
+
+}
+
diff --git a/media-compat/api21/android/support/v4/media/session/MediaSessionCompatApi21.java b/media-compat/api21/android/support/v4/media/session/MediaSessionCompatApi21.java
index 698e37d..624637a 100644
--- a/media-compat/api21/android/support/v4/media/session/MediaSessionCompatApi21.java
+++ b/media-compat/api21/android/support/v4/media/session/MediaSessionCompatApi21.java
@@ -31,6 +31,7 @@
 import android.os.Parcelable;
 import android.os.ResultReceiver;
 import android.support.annotation.RequiresApi;
+import android.support.v4.os.BuildCompat;
 import android.util.Log;
 
 import java.lang.reflect.Field;
@@ -140,8 +141,9 @@
 
     public static boolean hasCallback(Object sessionObj) {
         Field callbackField = null;
+        String callbackFieldName = BuildCompat.isAtLeastP() ? "mCallbackHandler" : "mCallback";
         try {
-            callbackField = sessionObj.getClass().getDeclaredField("mCallback");
+            callbackField = sessionObj.getClass().getDeclaredField(callbackFieldName);
             if (callbackField != null) {
                 callbackField.setAccessible(true);
                 return callbackField.get(sessionObj) != null;
diff --git a/pathmap.mk b/pathmap.mk
index 3e73be7..5da9377 100644
--- a/pathmap.mk
+++ b/pathmap.mk
@@ -14,58 +14,54 @@
 # limitations under the License.
 #
 
-#
-# A list of all source roots under frameworks/support.
-#
-FRAMEWORKS_SUPPORT_SUBDIRS := \
-    annotations \
-    compat \
-    core-ui \
-    core-utils \
-    customtabs \
-    design \
-    dynamic-animation \
-    exifinterface \
-    fragment \
-    media-compat \
-    percent \
-    recommendation \
-    transition \
-    tv-provider \
-    v7/cardview \
-    v7/gridlayout \
-    v7/mediarouter \
-    v7/palette \
-    v7/preference \
-    v13 \
-    v14/preference \
-    v17/leanback \
-    v17/preference-leanback \
-    wear
-
-#
-# A version of FRAMEWORKS_SUPPORT_SUBDIRS that is expanded to full paths from
-# the root of the tree.
-#
-FRAMEWORKS_SUPPORT_JAVA_SRC_DIRS := \
-    $(addprefix frameworks/support/,$(FRAMEWORKS_SUPPORT_SUBDIRS)) \
-    frameworks/support/graphics/drawable/animated \
-    frameworks/support/graphics/drawable/static \
-    frameworks/support/v7/appcompat/src \
-    frameworks/support/v7/recyclerview/src \
-    frameworks/support/emoji/core/src \
-    frameworks/support/emoji/appcompat/src \
-    frameworks/support/emoji/bundled/src
-
-#
-# A list of support library modules.
-#
+# The list of support library modules made available to the platform docs build.
 FRAMEWORKS_SUPPORT_JAVA_LIBRARIES := \
-    $(foreach dir,$(FRAMEWORKS_SUPPORT_SUBDIRS),android-support-$(subst /,-,$(dir))) \
-    android-support-vectordrawable \
     android-support-animatedvectordrawable \
-    android-support-v7-appcompat \
-    android-support-v7-recyclerview \
+    android-support-annotations \
     android-support-emoji \
     android-support-emoji-appcompat \
-    android-support-emoji-bundled
+    android-support-emoji-bundled \
+    android-support-compat \
+    android-support-core-ui \
+    android-support-core-utils \
+    android-support-customtabs \
+    android-support-design \
+    android-support-dynamic-animation \
+    android-support-exifinterface \
+    android-support-fragment \
+    android-support-media-compat \
+    android-support-percent \
+    android-support-recommendation \
+    android-support-transition \
+    android-support-tv-provider \
+    android-support-v7-appcompat \
+    android-support-v7-cardview \
+    android-support-v7-gridlayout \
+    android-support-v7-mediarouter \
+    android-support-v7-palette \
+    android-support-v7-preference \
+    android-support-v7-recyclerview \
+    android-support-v13 \
+    android-support-v14-preference \
+    android-support-v17-leanback \
+    android-support-v17-preference-leanback \
+    android-support-vectordrawable \
+    android-support-wear
+
+# List of all Design transitive dependencies. Use this instead of android-support-design.
+ANDROID_SUPPORT_DESIGN_TARGETS := \
+    android-support-design \
+    android-support-compat \
+    android-support-core-ui \
+    android-support-core-utils \
+    android-support-fragment \
+    android-support-transition \
+    android-support-v7-appcompat \
+    android-support-v7-recyclerview \
+
+# List of all Car transitive dependencies. Use this instead of android-support-car.
+ANDROID_SUPPORT_CAR_TARGETS := \
+    android-support-car \
+    $(ANDROID_SUPPORT_DESIGN_TARGETS) \
+    android-support-media-compat \
+    android-support-v7-cardview
diff --git a/percent/Android.mk b/percent/Android.mk
deleted file mode 100644
index 66ce397..0000000
--- a/percent/Android.mk
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright (C) 2015 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must include it with
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-percent \
-#       android-support-compat
-#
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-percent
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_SHARED_ANDROID_LIBRARIES := android-support-v4
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/percent/api/27.1.0.txt b/percent/api/27.1.0.txt
new file mode 100644
index 0000000..088c0de
--- /dev/null
+++ b/percent/api/27.1.0.txt
@@ -0,0 +1,70 @@
+package android.support.percent {
+
+  public deprecated class PercentFrameLayout extends android.widget.FrameLayout {
+    ctor public PercentFrameLayout(android.content.Context);
+    ctor public PercentFrameLayout(android.content.Context, android.util.AttributeSet);
+    ctor public PercentFrameLayout(android.content.Context, android.util.AttributeSet, int);
+    method protected android.support.percent.PercentFrameLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.support.percent.PercentFrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+  }
+
+  public static deprecated class PercentFrameLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams implements android.support.percent.PercentLayoutHelper.PercentLayoutParams {
+    ctor public PercentFrameLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public PercentFrameLayout.LayoutParams(int, int);
+    ctor public PercentFrameLayout.LayoutParams(int, int, int);
+    ctor public PercentFrameLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public PercentFrameLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public PercentFrameLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
+    ctor public PercentFrameLayout.LayoutParams(android.support.percent.PercentFrameLayout.LayoutParams);
+    method public android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
+  }
+
+  public deprecated class PercentLayoutHelper {
+    ctor public PercentLayoutHelper(android.view.ViewGroup);
+    method public void adjustChildren(int, int);
+    method public static void fetchWidthAndHeight(android.view.ViewGroup.LayoutParams, android.content.res.TypedArray, int, int);
+    method public static android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo(android.content.Context, android.util.AttributeSet);
+    method public boolean handleMeasuredStateTooSmall();
+    method public void restoreOriginalParams();
+  }
+
+  public static deprecated class PercentLayoutHelper.PercentLayoutInfo {
+    ctor public PercentLayoutHelper.PercentLayoutInfo();
+    method public void fillLayoutParams(android.view.ViewGroup.LayoutParams, int, int);
+    method public deprecated void fillMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams, int, int);
+    method public void fillMarginLayoutParams(android.view.View, android.view.ViewGroup.MarginLayoutParams, int, int);
+    method public void restoreLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public void restoreMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    field public float aspectRatio;
+    field public float bottomMarginPercent;
+    field public float endMarginPercent;
+    field public float heightPercent;
+    field public float leftMarginPercent;
+    field public float rightMarginPercent;
+    field public float startMarginPercent;
+    field public float topMarginPercent;
+    field public float widthPercent;
+  }
+
+  public static abstract deprecated interface PercentLayoutHelper.PercentLayoutParams {
+    method public abstract android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
+  }
+
+  public deprecated class PercentRelativeLayout extends android.widget.RelativeLayout {
+    ctor public PercentRelativeLayout(android.content.Context);
+    ctor public PercentRelativeLayout(android.content.Context, android.util.AttributeSet);
+    ctor public PercentRelativeLayout(android.content.Context, android.util.AttributeSet, int);
+    method protected android.support.percent.PercentRelativeLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.support.percent.PercentRelativeLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+  }
+
+  public static deprecated class PercentRelativeLayout.LayoutParams extends android.widget.RelativeLayout.LayoutParams implements android.support.percent.PercentLayoutHelper.PercentLayoutParams {
+    ctor public PercentRelativeLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public PercentRelativeLayout.LayoutParams(int, int);
+    ctor public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    method public android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
+  }
+
+}
+
diff --git a/preference-leanback/Android.mk b/preference-leanback/Android.mk
deleted file mode 100644
index e2ad1de..0000000
--- a/preference-leanback/Android.mk
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright (C) 2015 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-v17-preference-leanback \
-#       android-support-v17-leanback \
-#       android-support-v14-preference \
-#       android-support-v7-preference \
-#       android-support-v7-appcompat \
-#       android-support-v7-recyclerview \
-#       android-support-v4
-#
-# in their makefiles to include the resources in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_AAPT2_ONLY := true
-LOCAL_MODULE := android-support-v17-preference-leanback
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := \
-    $(call all-java-files-under,api21) \
-    $(call all-java-files-under,src)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-v17-leanback \
-    android-support-v14-preference \
-    android-support-v7-preference \
-    android-support-v7-appcompat \
-    android-support-v7-recyclerview \
-    android-support-v4
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/preference-leanback/api/27.1.0.txt b/preference-leanback/api/27.1.0.txt
new file mode 100644
index 0000000..4703ae3
--- /dev/null
+++ b/preference-leanback/api/27.1.0.txt
@@ -0,0 +1,62 @@
+package android.support.v17.preference {
+
+  public abstract class BaseLeanbackPreferenceFragment extends android.support.v14.preference.PreferenceFragment {
+    ctor public BaseLeanbackPreferenceFragment();
+  }
+
+  public class LeanbackListPreferenceDialogFragment extends android.support.v17.preference.LeanbackPreferenceDialogFragment {
+    ctor public LeanbackListPreferenceDialogFragment();
+    method public static android.support.v17.preference.LeanbackListPreferenceDialogFragment newInstanceMulti(java.lang.String);
+    method public static android.support.v17.preference.LeanbackListPreferenceDialogFragment newInstanceSingle(java.lang.String);
+    method public android.support.v7.widget.RecyclerView.Adapter onCreateAdapter();
+  }
+
+  public class LeanbackListPreferenceDialogFragment.AdapterMulti extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
+    ctor public LeanbackListPreferenceDialogFragment.AdapterMulti(java.lang.CharSequence[], java.lang.CharSequence[], java.util.Set<java.lang.String>);
+    method public int getItemCount();
+    method public void onBindViewHolder(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder, int);
+    method public android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
+  }
+
+  public class LeanbackListPreferenceDialogFragment.AdapterSingle extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
+    ctor public LeanbackListPreferenceDialogFragment.AdapterSingle(java.lang.CharSequence[], java.lang.CharSequence[], java.lang.CharSequence);
+    method public int getItemCount();
+    method public void onBindViewHolder(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder, int);
+    method public android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
+  }
+
+  public static class LeanbackListPreferenceDialogFragment.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.view.View.OnClickListener {
+    ctor public LeanbackListPreferenceDialogFragment.ViewHolder(android.view.View, android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener);
+    method public android.view.ViewGroup getContainer();
+    method public android.widget.TextView getTitleView();
+    method public android.widget.Checkable getWidgetView();
+    method public void onClick(android.view.View);
+  }
+
+  public static abstract interface LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
+    method public abstract void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
+  }
+
+  public class LeanbackPreferenceDialogFragment extends android.app.Fragment {
+    ctor public LeanbackPreferenceDialogFragment();
+    method public android.support.v7.preference.DialogPreference getPreference();
+    field public static final java.lang.String ARG_KEY = "key";
+  }
+
+  public abstract class LeanbackPreferenceFragment extends android.support.v17.preference.BaseLeanbackPreferenceFragment {
+    ctor public LeanbackPreferenceFragment();
+    method public void setTitle(java.lang.CharSequence);
+  }
+
+  public abstract class LeanbackSettingsFragment extends android.app.Fragment implements android.support.v14.preference.PreferenceFragment.OnPreferenceDisplayDialogCallback android.support.v14.preference.PreferenceFragment.OnPreferenceStartFragmentCallback android.support.v14.preference.PreferenceFragment.OnPreferenceStartScreenCallback {
+    ctor public LeanbackSettingsFragment();
+    method public boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
+    method public abstract void onPreferenceStartInitialScreen();
+    method public void startImmersiveFragment(android.app.Fragment);
+    method public void startPreferenceFragment(android.app.Fragment);
+  }
+
+}
+
diff --git a/recommendation/Android.mk b/recommendation/Android.mk
deleted file mode 100644
index 6249df7..0000000
--- a/recommendation/Android.mk
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright (C) 2015 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must include it with
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-recommendation \
-#       android-support-v4
-#
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-recommendation
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-v4
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/recommendation/api/27.1.0.txt b/recommendation/api/27.1.0.txt
new file mode 100644
index 0000000..ce69b31
--- /dev/null
+++ b/recommendation/api/27.1.0.txt
@@ -0,0 +1,132 @@
+package android.support.app.recommendation {
+
+  public final class ContentRecommendation {
+    method public java.lang.String getBackgroundImageUri();
+    method public int getBadgeImageResourceId();
+    method public int getColor();
+    method public android.graphics.Bitmap getContentImage();
+    method public android.support.app.recommendation.ContentRecommendation.IntentData getContentIntent();
+    method public java.lang.String[] getContentTypes();
+    method public android.support.app.recommendation.ContentRecommendation.IntentData getDismissIntent();
+    method public java.lang.String[] getGenres();
+    method public java.lang.String getGroup();
+    method public java.lang.String getIdTag();
+    method public java.lang.String getMaturityRating();
+    method public android.app.Notification getNotificationObject(android.content.Context);
+    method public java.lang.String getPricingType();
+    method public java.lang.String getPricingValue();
+    method public java.lang.String getPrimaryContentType();
+    method public int getProgressMax();
+    method public int getProgressValue();
+    method public long getRunningTime();
+    method public java.lang.String getSortKey();
+    method public java.lang.String getSourceName();
+    method public int getStatus();
+    method public java.lang.String getText();
+    method public java.lang.String getTitle();
+    method public boolean hasProgressInfo();
+    method public boolean isAutoDismiss();
+    method public void setAutoDismiss(boolean);
+    method public void setGroup(java.lang.String);
+    method public void setProgress(int, int);
+    method public void setSortKey(java.lang.String);
+    method public void setStatus(int);
+    field public static final java.lang.String CONTENT_MATURITY_ALL = "android.contentMaturity.all";
+    field public static final java.lang.String CONTENT_MATURITY_HIGH = "android.contentMaturity.high";
+    field public static final java.lang.String CONTENT_MATURITY_LOW = "android.contentMaturity.low";
+    field public static final java.lang.String CONTENT_MATURITY_MEDIUM = "android.contentMaturity.medium";
+    field public static final java.lang.String CONTENT_PRICING_FREE = "android.contentPrice.free";
+    field public static final java.lang.String CONTENT_PRICING_PREORDER = "android.contentPrice.preorder";
+    field public static final java.lang.String CONTENT_PRICING_PURCHASE = "android.contentPrice.purchase";
+    field public static final java.lang.String CONTENT_PRICING_RENTAL = "android.contentPrice.rental";
+    field public static final java.lang.String CONTENT_PRICING_SUBSCRIPTION = "android.contentPrice.subscription";
+    field public static final int CONTENT_STATUS_AVAILABLE = 2; // 0x2
+    field public static final int CONTENT_STATUS_PENDING = 1; // 0x1
+    field public static final int CONTENT_STATUS_READY = 0; // 0x0
+    field public static final int CONTENT_STATUS_UNAVAILABLE = 3; // 0x3
+    field public static final java.lang.String CONTENT_TYPE_APP = "android.contentType.app";
+    field public static final java.lang.String CONTENT_TYPE_BOOK = "android.contentType.book";
+    field public static final java.lang.String CONTENT_TYPE_COMIC = "android.contentType.comic";
+    field public static final java.lang.String CONTENT_TYPE_GAME = "android.contentType.game";
+    field public static final java.lang.String CONTENT_TYPE_MAGAZINE = "android.contentType.magazine";
+    field public static final java.lang.String CONTENT_TYPE_MOVIE = "android.contentType.movie";
+    field public static final java.lang.String CONTENT_TYPE_MUSIC = "android.contentType.music";
+    field public static final java.lang.String CONTENT_TYPE_NEWS = "android.contentType.news";
+    field public static final java.lang.String CONTENT_TYPE_PODCAST = "android.contentType.podcast";
+    field public static final java.lang.String CONTENT_TYPE_RADIO = "android.contentType.radio";
+    field public static final java.lang.String CONTENT_TYPE_SERIAL = "android.contentType.serial";
+    field public static final java.lang.String CONTENT_TYPE_SPORTS = "android.contentType.sports";
+    field public static final java.lang.String CONTENT_TYPE_TRAILER = "android.contentType.trailer";
+    field public static final java.lang.String CONTENT_TYPE_VIDEO = "android.contentType.video";
+    field public static final java.lang.String CONTENT_TYPE_WEBSITE = "android.contentType.website";
+    field public static final int INTENT_TYPE_ACTIVITY = 1; // 0x1
+    field public static final int INTENT_TYPE_BROADCAST = 2; // 0x2
+    field public static final int INTENT_TYPE_SERVICE = 3; // 0x3
+  }
+
+  public static final class ContentRecommendation.Builder {
+    ctor public ContentRecommendation.Builder();
+    method public android.support.app.recommendation.ContentRecommendation build();
+    method public android.support.app.recommendation.ContentRecommendation.Builder setAutoDismiss(boolean);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setBackgroundImageUri(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setBadgeIcon(int);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setColor(int);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setContentImage(android.graphics.Bitmap);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setContentIntentData(int, android.content.Intent, int, android.os.Bundle);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setContentTypes(java.lang.String[]);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setDismissIntentData(int, android.content.Intent, int, android.os.Bundle);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setGenres(java.lang.String[]);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setGroup(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setIdTag(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setMaturityRating(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setPricingInformation(java.lang.String, java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setProgress(int, int);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setRunningTime(long);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setSortKey(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setSourceName(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setStatus(int);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setText(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setTitle(java.lang.String);
+  }
+
+  public static abstract class ContentRecommendation.ContentMaturity implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract class ContentRecommendation.ContentPricing implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract class ContentRecommendation.ContentStatus implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract class ContentRecommendation.ContentType implements java.lang.annotation.Annotation {
+  }
+
+  public static class ContentRecommendation.IntentData {
+    ctor public ContentRecommendation.IntentData();
+  }
+
+  public static abstract class ContentRecommendation.IntentType implements java.lang.annotation.Annotation {
+  }
+
+  public final class RecommendationExtender implements android.app.Notification.Extender {
+    ctor public RecommendationExtender();
+    ctor public RecommendationExtender(android.app.Notification);
+    method public android.app.Notification.Builder extend(android.app.Notification.Builder);
+    method public java.lang.String[] getContentTypes();
+    method public java.lang.String[] getGenres();
+    method public java.lang.String getMaturityRating();
+    method public java.lang.String getPricingType();
+    method public java.lang.String getPricingValue();
+    method public java.lang.String getPrimaryContentType();
+    method public long getRunningTime();
+    method public int getStatus();
+    method public android.support.app.recommendation.RecommendationExtender setContentTypes(java.lang.String[]);
+    method public android.support.app.recommendation.RecommendationExtender setGenres(java.lang.String[]);
+    method public android.support.app.recommendation.RecommendationExtender setMaturityRating(java.lang.String);
+    method public android.support.app.recommendation.RecommendationExtender setPricingInformation(java.lang.String, java.lang.String);
+    method public android.support.app.recommendation.RecommendationExtender setRunningTime(long);
+    method public android.support.app.recommendation.RecommendationExtender setStatus(int);
+  }
+
+}
+
diff --git a/recyclerview-selection/Android.mk b/recyclerview-selection/Android.mk
deleted file mode 100644
index 511806f..0000000
--- a/recyclerview-selection/Android.mk
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-recyclerview-selection
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-v7-recyclerview \
-    android-support-compat
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/recyclerview-selection/tests/AndroidManifest.xml b/recyclerview-selection/tests/AndroidManifest.xml
index 144adb5..01f1904 100644
--- a/recyclerview-selection/tests/AndroidManifest.xml
+++ b/recyclerview-selection/tests/AndroidManifest.xml
@@ -15,9 +15,8 @@
   ~ limitations under the License.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
           package="androidx.widget.recyclerview.selection.test">
-    <uses-sdk android:minSdkVersion="14" />
+    <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
 
     <application android:supportsRtl="true">
     </application>
diff --git a/room/compiler/build.gradle b/room/compiler/build.gradle
index 0d62cf8..c3319ac 100644
--- a/room/compiler/build.gradle
+++ b/room/compiler/build.gradle
@@ -49,6 +49,7 @@
     compile(JAVAPOET)
     compile(ANTLR)
     compile(XERIAL)
+    compile(KOTLIN_METADATA)
     compile(APACHE_COMMONS_CODEC)
     testCompile(GOOGLE_COMPILE_TESTING)
     testCompile project(":paging:common")
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/javapoet_ext.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/javapoet_ext.kt
index b2d6231..acc3111 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/javapoet_ext.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/javapoet_ext.kt
@@ -116,6 +116,7 @@
     val SET = ClassName.get("java.util", "Set")
     val STRING = ClassName.get("java.lang", "String")
     val INTEGER = ClassName.get("java.lang", "Integer")
+    val OPTIONAL = ClassName.get("java.util", "Optional")
 }
 
 object GuavaBaseTypeNames {
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt
index 0ba311e..3d73948 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt
@@ -47,6 +47,13 @@
 import com.google.auto.common.AnnotationMirrors
 import com.google.auto.common.MoreElements
 import com.google.auto.common.MoreTypes
+import me.eugeniomarletti.kotlin.metadata.KotlinClassMetadata
+import me.eugeniomarletti.kotlin.metadata.KotlinMetadataUtils
+import me.eugeniomarletti.kotlin.metadata.jvm.getJvmConstructorSignature
+import me.eugeniomarletti.kotlin.metadata.kotlinMetadata
+import org.jetbrains.kotlin.serialization.ProtoBuf
+import org.jetbrains.kotlin.serialization.deserialization.NameResolver
+import javax.annotation.processing.ProcessingEnvironment
 import javax.lang.model.element.ExecutableElement
 import javax.lang.model.element.Modifier.ABSTRACT
 import javax.lang.model.element.Modifier.PRIVATE
@@ -69,12 +76,28 @@
                     val element: TypeElement,
                     val bindingScope: FieldProcessor.BindingScope,
                     val parent: EmbeddedField?,
-                    val referenceStack: LinkedHashSet<Name> = LinkedHashSet<Name>()) {
+                    val referenceStack: LinkedHashSet<Name> = LinkedHashSet())
+    : KotlinMetadataUtils {
     val context = baseContext.fork(element)
+
+    // for KotlinMetadataUtils
+    override val processingEnv: ProcessingEnvironment
+        get() = context.processingEnv
+
+    // opportunistic kotlin metadata
+    private val kotlinMetadata by lazy {
+        try {
+            element.kotlinMetadata
+        } catch (throwable: Throwable) {
+            context.logger.d(element, "failed to read get kotlin metadata from %s", element)
+        }
+    }
+
     companion object {
         val PROCESSED_ANNOTATIONS = listOf(ColumnInfo::class, Embedded::class,
-                    Relation::class)
+                Relation::class)
     }
+
     fun process(): Pojo {
         return context.cache.pojos.get(Cache.PojoKey(element, bindingScope, parent), {
             referenceStack.add(element.qualifiedName)
@@ -94,9 +117,9 @@
                     !it.hasAnnotation(Ignore::class)
                             && !it.hasAnyOf(STATIC)
                             && (!it.hasAnyOf(TRANSIENT)
-                                    || it.hasAnnotation(ColumnInfo::class)
-                                    || it.hasAnnotation(Embedded::class)
-                                    || it.hasAnnotation(Relation::class))
+                            || it.hasAnnotation(ColumnInfo::class)
+                            || it.hasAnnotation(Embedded::class)
+                            || it.hasAnnotation(Relation::class))
                 }
                 .groupBy { field ->
                     context.checker.check(
@@ -199,6 +222,40 @@
                 constructor = constructor)
     }
 
+    /**
+     * Retrieves the parameter names of a method. If the method is inherited from a dependency
+     * module, the parameter name is not available (not in java spec). For kotlin, since parameter
+     * names are part of the API, we can read them via the kotlin metadata annotation.
+     * <p>
+     * Since we are using an unofficial library to read the metadata, all access to that code
+     * is safe guarded to avoid unexpected failures. In other words, it is a best effort but
+     * better than not supporting these until JB provides a proper API.
+     */
+    private fun getParamNames(method: ExecutableElement): List<String> {
+        val paramNames = method.parameters.map { it.simpleName.toString() }
+        if (paramNames.isEmpty()) {
+            return emptyList()
+        }
+        (kotlinMetadata as? KotlinClassMetadata)?.let {
+            try {
+                val kotlinParams = it
+                        .findConstructor(method)
+                        ?.tryGetParameterNames(it.data.nameResolver)
+                if (kotlinParams != null) {
+                    return kotlinParams
+                }
+            } catch (throwable: Throwable) {
+                context.logger.d(
+                        method,
+                        "Cannot read kotlin metadata, falling back to jvm signature. %s",
+                        throwable.message as Any)
+            }
+        }
+        // either it is java or something went wrong w/ kotlin metadata. default to whatever
+        // we can read.
+        return paramNames
+    }
+
     private fun chooseConstructor(
             myFields: List<Field>,
             embedded: List<EmbeddedField>,
@@ -208,10 +265,12 @@
         val fieldMap = myFields.associateBy { it.name }
         val embeddedMap = embedded.associateBy { it.field.name }
         val typeUtils = context.processingEnv.typeUtils
-        val failedConstructors = mutableMapOf<ExecutableElement, List<Constructor.Param?>>()
+        // list of param names -> matched params pairs for each failed constructor
+        val failedConstructors = arrayListOf<FailedConstructor>()
         val goodConstructors = constructors.map { constructor ->
-            val params = constructor.parameters.map param@ { param ->
-                val paramName = param.simpleName.toString()
+            val parameterNames = getParamNames(constructor)
+            val params = constructor.parameters.mapIndexed param@ { index, param ->
+                val paramName = parameterNames[index]
                 val paramType = param.asType()
 
                 val matches = fun(field: Field?): Boolean {
@@ -261,7 +320,7 @@
                 } else {
                     context.logger.e(param, ProcessorErrors.ambigiousConstructor(
                             pojo = element.qualifiedName.toString(),
-                            paramName = param.simpleName.toString(),
+                            paramName = paramName,
                             matchingFields = matchingFields.map { it.getPath() }
                                     + embedded.map { it.field.getPath() }
                     ))
@@ -269,7 +328,7 @@
                 }
             }
             if (params.any { it == null }) {
-                failedConstructors.put(constructor, params)
+                failedConstructors.add(FailedConstructor(constructor, parameterNames, params))
                 null
             } else {
                 @Suppress("UNCHECKED_CAST")
@@ -278,12 +337,8 @@
         }.filterNotNull()
         if (goodConstructors.isEmpty()) {
             if (failedConstructors.isNotEmpty()) {
-                val failureMsg = failedConstructors.entries.joinToString("\n") { entry ->
-                    val paramsMatching = entry.key.parameters.withIndex().joinToString(", ") {
-                        "param:${it.value.simpleName} -> matched field:" +
-                                (entry.value[it.index]?.log() ?: "unmatched")
-                    }
-                    "${entry.key} -> [$paramsMatching]"
+                val failureMsg = failedConstructors.joinToString("\n") { entry ->
+                    entry.log()
                 }
                 context.logger.e(element, ProcessorErrors.MISSING_POJO_CONSTRUCTOR +
                         "\nTried the following constructors but they failed to match:\n$failureMsg")
@@ -512,7 +567,7 @@
         val recursiveTailTypeName = typeElement.qualifiedName
 
         val referenceRecursionList = mutableListOf<Name>()
-        with (referenceRecursionList) {
+        with(referenceRecursionList) {
             add(recursiveTailTypeName)
             addAll(referenceStack.toList().takeLastWhile { it != recursiveTailTypeName })
             add(recursiveTailTypeName)
@@ -650,4 +705,51 @@
         }
         return candidates.first()
     }
+
+    /**
+     * Finds the kotlin meteadata for a constructor.
+     */
+    private fun KotlinClassMetadata.findConstructor(
+            executableElement: ExecutableElement
+    ): ProtoBuf.Constructor? {
+        val (nameResolver, classProto) = data
+        val jvmSignature = executableElement.jvmMethodSignature
+        // find constructor
+        return classProto.constructorList.singleOrNull {
+            it.getJvmConstructorSignature(nameResolver, classProto.typeTable) == jvmSignature
+        }
+    }
+
+    /**
+     * Tries to get the parameter names of a kotlin method
+     */
+    private fun ProtoBuf.Constructor.tryGetParameterNames(
+            nameResolver: NameResolver
+    ): List<String>? {
+        return valueParameterList.map {
+            if (it.hasName()) {
+                nameResolver.getName(it.name)
+                        .asString()
+                        .replace("`", "")
+                        .removeSuffix("?")
+                        .trim()
+            } else {
+                // early return bad parameter
+                return null
+            }
+        }
+    }
+
+    private data class FailedConstructor(
+            val method: ExecutableElement,
+            val params: List<String>,
+            val matches: List<Constructor.Param?>
+    ) {
+        fun log(): String {
+            val logPerParam = params.withIndex().joinToString(", ") {
+                "param:${it.value} -> matched field:" + (matches[it.index]?.log() ?: "unmatched")
+            }
+            return "$method -> [$logPerParam]"
+        }
+    }
 }
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/TypeAdapterStore.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/TypeAdapterStore.kt
index 1acaae6..13359f7 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/TypeAdapterStore.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/TypeAdapterStore.kt
@@ -17,6 +17,7 @@
 package android.arch.persistence.room.solver
 
 import android.arch.persistence.room.Entity
+import android.arch.persistence.room.ext.CommonTypeNames
 import android.arch.persistence.room.ext.GuavaBaseTypeNames
 import android.arch.persistence.room.ext.hasAnnotation
 import android.arch.persistence.room.ext.typeName
@@ -43,6 +44,7 @@
 import android.arch.persistence.room.solver.query.result.GuavaOptionalQueryResultAdapter
 import android.arch.persistence.room.solver.query.result.InstantQueryResultBinder
 import android.arch.persistence.room.solver.query.result.ListQueryResultAdapter
+import android.arch.persistence.room.solver.query.result.OptionalQueryResultAdapter
 import android.arch.persistence.room.solver.query.result.PojoRowAdapter
 import android.arch.persistence.room.solver.query.result.QueryResultAdapter
 import android.arch.persistence.room.solver.query.result.QueryResultBinder
@@ -285,6 +287,13 @@
                 val typeArg = declared.typeArguments.first()
                 val rowAdapter = findRowAdapter(typeArg, query) ?: return null
                 return GuavaOptionalQueryResultAdapter(rowAdapter)
+            } else if (
+                    context.processingEnv.typeUtils.erasure(typeMirror).typeName() ==
+                    CommonTypeNames.OPTIONAL) {
+                // Handle java.util.Optional similarly.
+                val typeArg = declared.typeArguments.first()
+                val rowAdapter = findRowAdapter(typeArg, query) ?: return null
+                return OptionalQueryResultAdapter(SingleEntityQueryResultAdapter(rowAdapter))
             } else if (MoreTypes.isTypeOf(java.util.List::class.java, typeMirror)) {
                 val typeArg = declared.typeArguments.first()
                 val rowAdapter = findRowAdapter(typeArg, query) ?: return null
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/OptionalQueryResultAdapter.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/OptionalQueryResultAdapter.kt
new file mode 100644
index 0000000..6f08622
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/OptionalQueryResultAdapter.kt
@@ -0,0 +1,48 @@
+/*
+ * 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 android.arch.persistence.room.solver.query.result
+
+import android.arch.persistence.room.ext.CommonTypeNames
+import android.arch.persistence.room.ext.L
+import android.arch.persistence.room.ext.T
+import android.arch.persistence.room.ext.typeName
+import android.arch.persistence.room.solver.CodeGenScope
+import com.squareup.javapoet.ParameterizedTypeName
+
+/**
+ * Wraps a row adapter when there is only 1 item in the result, and the result's outer type is
+ * {@link java.util.Optional}.
+ *
+ * <p>n.b. this will only be useful if the project uses Java 8.
+ */
+class OptionalQueryResultAdapter(private val resultAdapter: SingleEntityQueryResultAdapter)
+    : QueryResultAdapter(resultAdapter.rowAdapter) {
+    val type = resultAdapter.rowAdapter?.out
+    override fun convert(
+            outVarName: String, cursorVarName: String, scope: CodeGenScope) {
+        scope.builder().apply {
+            val valueVarName = scope.getTmpVar("_value")
+            resultAdapter?.convert(valueVarName, cursorVarName, scope)
+            addStatement(
+                    "final $T $L = $T.ofNullable($L)",
+                    ParameterizedTypeName.get(CommonTypeNames.OPTIONAL, type?.typeName()) ,
+                    outVarName,
+                    CommonTypeNames.OPTIONAL,
+                    valueVarName)
+        }
+    }
+}
diff --git a/room/integration-tests/kotlintestapp/build.gradle b/room/integration-tests/kotlintestapp/build.gradle
index 64db19c..421e192 100644
--- a/room/integration-tests/kotlintestapp/build.gradle
+++ b/room/integration-tests/kotlintestapp/build.gradle
@@ -43,7 +43,6 @@
     implementation(project(":arch:runtime"))
 
     implementation(SUPPORT_APPCOMPAT, libs.support_exclude_config)
-    kapt project(":room:compiler")
     kaptAndroidTest project(":room:compiler")
 
     androidTestImplementation(TEST_RUNNER) {
diff --git a/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.TestDatabase/1.json b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.TestDatabase/1.json
index 6362ae8..014d98c 100644
--- a/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.TestDatabase/1.json
+++ b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.TestDatabase/1.json
@@ -2,7 +2,7 @@
   "formatVersion": 1,
   "database": {
     "version": 1,
-    "identityHash": "0729a81dd89abcbdd49f45ab0807043d",
+    "identityHash": "f78c9a055453bd6db377a3fcc3007e54",
     "entities": [
       {
         "tableName": "Book",
@@ -199,11 +199,37 @@
         },
         "indices": [],
         "foreignKeys": []
+      },
+      {
+        "tableName": "DataClassFromDependency",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL)",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "id"
+          ],
+          "autoGenerate": true
+        },
+        "indices": [],
+        "foreignKeys": []
       }
     ],
     "setupQueries": [
       "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
-      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"0729a81dd89abcbdd49f45ab0807043d\")"
+      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"f78c9a055453bd6db377a3fcc3007e54\")"
     ]
   }
 }
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/TestDatabase.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/TestDatabase.kt
index 74d8853..33162ee 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/TestDatabase.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/TestDatabase.kt
@@ -19,19 +19,22 @@
 import android.arch.persistence.room.Database
 import android.arch.persistence.room.RoomDatabase
 import android.arch.persistence.room.integration.kotlintestapp.dao.BooksDao
+import android.arch.persistence.room.integration.kotlintestapp.dao.DependencyDao
 import android.arch.persistence.room.integration.kotlintestapp.dao.DerivedDao
 import android.arch.persistence.room.integration.kotlintestapp.vo.Author
 import android.arch.persistence.room.integration.kotlintestapp.vo.Book
 import android.arch.persistence.room.integration.kotlintestapp.vo.BookAuthor
+import android.arch.persistence.room.integration.kotlintestapp.vo.DataClassFromDependency
 import android.arch.persistence.room.integration.kotlintestapp.vo.NoArgClass
 import android.arch.persistence.room.integration.kotlintestapp.vo.Publisher
 
-@Database(entities = arrayOf(Book::class, Author::class, Publisher::class, BookAuthor::class,
-        NoArgClass::class),
-        version = 1)
+@Database(entities = [Book::class, Author::class, Publisher::class, BookAuthor::class,
+    NoArgClass::class, DataClassFromDependency::class], version = 1)
 abstract class TestDatabase : RoomDatabase() {
 
     abstract fun booksDao(): BooksDao
 
     abstract fun derivedDao(): DerivedDao
+
+    abstract fun dependencyDao(): DependencyDao
 }
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/dao/BooksDao.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/dao/BooksDao.kt
index c3c5ca7..d8cba31 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/dao/BooksDao.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/dao/BooksDao.kt
@@ -67,6 +67,9 @@
     fun getBookFlowable(bookId: String): Flowable<Book>
 
     @Query("SELECT * FROM book WHERE bookId = :bookId")
+    fun getBookJavaOptional(bookId: String): java.util.Optional<Book>
+
+    @Query("SELECT * FROM book WHERE bookId = :bookId")
     fun getBookOptional(bookId: String): Optional<Book>
 
     @Query("SELECT * FROM book WHERE bookId = :bookId")
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/BooksDaoTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/BooksDaoTest.kt
index d85ba28..82a8ab5 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/BooksDaoTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/BooksDaoTest.kt
@@ -49,6 +49,24 @@
     }
 
     @Test
+    fun bookByIdJavaOptional() {
+        booksDao.addAuthors(TestUtil.AUTHOR_1)
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        booksDao.addBooks(TestUtil.BOOK_1)
+
+        assertThat(
+                booksDao.getBookJavaOptional(TestUtil.BOOK_1.bookId),
+                `is`<java.util.Optional<Book>>(java.util.Optional.of(TestUtil.BOOK_1)))
+    }
+
+    @Test
+    fun bookByIdJavaOptionalEmpty() {
+        assertThat(
+                booksDao.getBookJavaOptional(TestUtil.BOOK_1.bookId),
+                `is`<java.util.Optional<Book>>(java.util.Optional.empty()))
+    }
+
+    @Test
     fun bookByIdOptional() {
         booksDao.addAuthors(TestUtil.AUTHOR_1)
         booksDao.addPublishers(TestUtil.PUBLISHER)
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/DependencyDaoTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/DependencyDaoTest.kt
new file mode 100644
index 0000000..2008fca
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/DependencyDaoTest.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 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 android.arch.persistence.room.integration.kotlintestapp.test
+
+import android.arch.persistence.room.integration.kotlintestapp.vo.DataClassFromDependency
+import android.support.test.runner.AndroidJUnit4
+import org.hamcrest.CoreMatchers.`is`
+import org.hamcrest.MatcherAssert.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class DependencyDaoTest : TestDatabaseTest() {
+    @Test
+    fun insertAndGet() {
+        val dao = database.dependencyDao()
+        val data = DataClassFromDependency(
+                id = 3,
+                name = "foo"
+        )
+        dao.insert(data)
+        assertThat(dao.selectAll(), `is`(listOf(data)))
+    }
+}
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/src/main/java/android/arch/persistence/room/integration/kotlintestapp/dao/DependencyDao.kt b/room/integration-tests/kotlintestapp/src/main/java/android/arch/persistence/room/integration/kotlintestapp/dao/DependencyDao.kt
new file mode 100644
index 0000000..efe3c5b
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/main/java/android/arch/persistence/room/integration/kotlintestapp/dao/DependencyDao.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 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 android.arch.persistence.room.integration.kotlintestapp.dao
+
+import android.arch.persistence.room.Dao
+import android.arch.persistence.room.Insert
+import android.arch.persistence.room.OnConflictStrategy
+import android.arch.persistence.room.Query
+import android.arch.persistence.room.integration.kotlintestapp.vo.DataClassFromDependency
+
+@Dao
+interface DependencyDao {
+    @Query("select * from DataClassFromDependency")
+    fun selectAll(): List<DataClassFromDependency>
+
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    fun insert(vararg input: DataClassFromDependency)
+}
diff --git a/room/integration-tests/kotlintestapp/src/main/java/android/arch/persistence/room/integration/kotlintestapp/vo/DataClassFromDependency.kt b/room/integration-tests/kotlintestapp/src/main/java/android/arch/persistence/room/integration/kotlintestapp/vo/DataClassFromDependency.kt
new file mode 100644
index 0000000..258ada6
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/main/java/android/arch/persistence/room/integration/kotlintestapp/vo/DataClassFromDependency.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 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 android.arch.persistence.room.integration.kotlintestapp.vo
+
+import android.arch.persistence.room.Entity
+import android.arch.persistence.room.PrimaryKey
+
+/**
+ * used to test the case where kotlin classes from dependencies cannot be read properly.
+ * Since the main db in this app is in the test module, the original classes serve as a dependency.
+ */
+@Entity
+data class DataClassFromDependency(
+        @PrimaryKey(autoGenerate = true)
+        val id: Int,
+        val name: String)
\ No newline at end of file
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java
index dff2940..ba78fe8 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java
@@ -18,6 +18,7 @@
 
 import android.graphics.Color;
 import android.os.Parcelable;
+import android.support.annotation.NonNull;
 import android.support.v7.widget.DividerItemDecoration;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
@@ -135,7 +136,7 @@
         }
 
         @Override
-        public void onViewRecycled(ViewHolder holder) {
+        public void onViewRecycled(@NonNull ViewHolder holder) {
             mSavedStates.set(holder.getAdapterPosition(),
                     holder.mRecyclerView.getLayoutManager().onSaveInstanceState());
         }
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java
index 679af89..e2b5643 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java
@@ -16,14 +16,11 @@
 
 package com.example.android.supportv7.widget.touch;
 
-import com.example.android.supportv7.Cheeses;
-import com.example.android.supportv7.R;
-import com.example.android.supportv7.widget.util.ConfigToggle;
-import com.example.android.supportv7.widget.util.ConfigViewHolder;
-
 import android.app.Activity;
 import android.graphics.Canvas;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v7.widget.CardView;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
@@ -34,6 +31,11 @@
 import android.widget.Button;
 import android.widget.TextView;
 
+import com.example.android.supportv7.Cheeses;
+import com.example.android.supportv7.R;
+import com.example.android.supportv7.widget.util.ConfigToggle;
+import com.example.android.supportv7.widget.util.ConfigViewHolder;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -103,32 +105,34 @@
     public ItemTouchHelper.Callback createCallback() {
         return new ItemTouchHelper.Callback() {
             @Override
-            public int getMovementFlags(RecyclerView recyclerView,
-                    RecyclerView.ViewHolder viewHolder) {
+            public int getMovementFlags(@NonNull RecyclerView recyclerView,
+                    @NonNull RecyclerView.ViewHolder viewHolder) {
                 return ItemTouchHelperActivity.this.getMovementFlags(recyclerView, viewHolder);
             }
 
             @Override
-            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
-                    RecyclerView.ViewHolder target) {
+            public boolean onMove(@NonNull RecyclerView recyclerView,
+                    @NonNull RecyclerView.ViewHolder viewHolder,
+                    @NonNull RecyclerView.ViewHolder target) {
                 mAdapter.move(viewHolder.getAdapterPosition(), target.getAdapterPosition());
                 return true;
             }
 
             @Override
-            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
+            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                 mAdapter.delete(viewHolder.getAdapterPosition());
             }
 
             @Override
-            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
+            public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder,
+                    int actionState) {
                 super.onSelectedChanged(viewHolder, actionState);
                 ItemTouchHelperActivity.this.onSelectedChanged(viewHolder, actionState);
             }
 
             @Override
-            public void onChildDraw(Canvas c, RecyclerView recyclerView,
-                    RecyclerView.ViewHolder viewHolder,
+            public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
+                    @NonNull RecyclerView.ViewHolder viewHolder,
                     float dX, float dY, int actionState, boolean isCurrentlyActive) {
                 if (ItemTouchHelperActivity.this.onChildDraw(c, recyclerView, viewHolder,
                         dX, dY, actionState, isCurrentlyActive)) {
@@ -139,7 +143,7 @@
             }
 
             @Override
-            public void onChildDrawOver(Canvas c, RecyclerView recyclerView,
+            public void onChildDrawOver(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
                     RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
                     boolean isCurrentlyActive) {
                 if (ItemTouchHelperActivity.this.onChildDrawOver(c, recyclerView, viewHolder,
@@ -161,7 +165,8 @@
             }
 
             @Override
-            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+            public void clearView(@NonNull RecyclerView recyclerView,
+                    @NonNull RecyclerView.ViewHolder viewHolder) {
                 super.clearView(recyclerView, viewHolder);
                 ItemTouchHelperActivity.this.clearView(viewHolder);
             }
@@ -203,10 +208,9 @@
     }
 
     public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {
-        ItemTouchViewHolder itemTouchViewHolder = new ItemTouchViewHolder(
+        return new ItemTouchViewHolder(
                 LayoutInflater.from(parent.getContext())
                         .inflate(R.layout.touch_item, parent, false));
-        return itemTouchViewHolder;
     }
 
     abstract public int getMovementFlags(RecyclerView recyclerView,
diff --git a/samples/SupportCarDemos/src/main/res/layout/activity_paged_list_view.xml b/samples/SupportCarDemos/src/main/res/layout/activity_paged_list_view.xml
index 5b9a1a5..bafa40c 100644
--- a/samples/SupportCarDemos/src/main/res/layout/activity_paged_list_view.xml
+++ b/samples/SupportCarDemos/src/main/res/layout/activity_paged_list_view.xml
@@ -24,6 +24,6 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         app:showPagedListViewDivider="true"
-        app:offsetScrollBar="true"/>
+        app:gutter="start"/>
 </FrameLayout>
 
diff --git a/samples/SupportContentDemos/build.gradle b/samples/SupportContentDemos/build.gradle
index ad52f77..d2b55f9 100644
--- a/samples/SupportContentDemos/build.gradle
+++ b/samples/SupportContentDemos/build.gradle
@@ -19,7 +19,9 @@
 }
 
 dependencies {
-    implementation(project(":design"))
+    implementation("com.android.support:design:28.0.0-SNAPSHOT", { transitive = false })
+    implementation(project(":transition"))
+    implementation(project(":recyclerview-v7"))
     implementation(project(":appcompat-v7"))
     implementation(project(":support-content"))
 }
diff --git a/samples/SupportDesignDemos/build.gradle b/samples/SupportDesignDemos/build.gradle
index 89dc8b0..51d6884 100644
--- a/samples/SupportDesignDemos/build.gradle
+++ b/samples/SupportDesignDemos/build.gradle
@@ -3,7 +3,10 @@
 }
 
 dependencies {
-    implementation(project(":design"))
+    implementation("com.android.support:design:28.0.0-SNAPSHOT", { transitive = false })
+    implementation(project(":transition"))
+    implementation(project(":recyclerview-v7"))
+    implementation(project(":appcompat-v7"))
 }
 
 android {
diff --git a/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml b/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml
index f469af2..4d1dca7 100644
--- a/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml
+++ b/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml
@@ -31,6 +31,12 @@
         android:title="@string/title_stylish_preference"
         android:summary="@string/summary_stylish_preference" />
 
+    <Preference
+        android:key="preference_with_icon"
+        android:title="Preference with icon"
+        android:summary="This preference has an icon"
+        android:icon="@android:drawable/ic_menu_camera" />
+
     <PreferenceCategory
         android:title="@string/inline_preferences">
 
@@ -39,6 +45,11 @@
             android:title="@string/title_checkbox_preference"
             android:summary="@string/summary_checkbox_preference" />
 
+        <SwitchPreference
+            android:key="switch_preference"
+            android:title="Switch preference"
+            android:summary="This is a switch" />
+
         <DropDownPreference
             android:key="dropdown_preference"
             android:title="@string/title_dropdown_preference"
diff --git a/samples/SupportSliceDemos/OWNERS b/samples/SupportSliceDemos/OWNERS
new file mode 100644
index 0000000..921a517
--- /dev/null
+++ b/samples/SupportSliceDemos/OWNERS
@@ -0,0 +1,2 @@
+jmonk@google.com
+madym@google.com
diff --git a/samples/SupportSliceDemos/build.gradle b/samples/SupportSliceDemos/build.gradle
new file mode 100644
index 0000000..a0b236d
--- /dev/null
+++ b/samples/SupportSliceDemos/build.gradle
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+import static android.support.dependencies.DependenciesKt.*
+
+plugins {
+    id("SupportAndroidTestAppPlugin")
+}
+
+dependencies {
+    implementation(project(":slices-view"))
+    implementation(project(":slices-builders"))
+    implementation(project(":slices-core"))
+    implementation("com.android.support:design:28.0.0-SNAPSHOT", { transitive = false })
+    implementation(project(":transition"))
+    implementation(project(":recyclerview-v7"))
+    implementation(project(":appcompat-v7"))
+    implementation(project(":cardview-v7"))
+    api(ARCH_LIFECYCLE_EXTENSIONS, libs.exclude_annotations_transitive)
+}
+
+android {
+    defaultConfig {
+        applicationId "com.example.androidx.slice.demos"
+    }
+}
+
+supportTestApp {
+    minSdkVersion = 26
+}
diff --git a/samples/SupportSliceDemos/src/main/AndroidManifest.xml b/samples/SupportSliceDemos/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..5285c34
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/AndroidManifest.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:tools="http://schemas.android.com/tools"
+          package="com.example.androidx.slice.demos">
+
+    <uses-sdk tools:overrideLibrary="androidx.app.slice.view, androidx.app.slice.builders, androidx.app.slice.core" />
+
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+    <uses-permission android:name="android.permission.BIND_SLICE" />
+
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:roundIcon="@mipmap/ic_launcher_round"
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme">
+        <activity
+            android:name=".SliceBrowser"
+            android:label="@string/app_name"
+            android:theme="@style/AppTheme.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+            <intent-filter>
+                <action android:name="androidx.intent.SLICE_ACTION"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+        </activity>
+
+        <provider android:authorities="com.example.androidx.slice.demos"
+                  android:name=".SampleSliceProvider"
+                  android:grantUriPermissions="true">
+            <intent-filter>
+                <action android:name="androidx.intent.SLICE_ACTION"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+        </provider>
+
+        <receiver
+            android:name=".SliceBroadcastReceiver"
+            android:exported="true" >
+            <intent-filter>
+                <action android:name="com.example.androidx.slice.action.*"/>
+            </intent-filter>
+        </receiver>
+    </application>
+
+</manifest>
diff --git a/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SampleSliceProvider.java b/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SampleSliceProvider.java
new file mode 100644
index 0000000..85af90f
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SampleSliceProvider.java
@@ -0,0 +1,480 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.slice.demos;
+
+import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
+
+import android.app.PendingIntent;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.provider.Settings;
+import android.support.annotation.NonNull;
+import android.text.SpannableString;
+import android.text.format.DateUtils;
+import android.text.style.ForegroundColorSpan;
+
+import java.util.Calendar;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceProvider;
+import androidx.app.slice.builders.GridBuilder;
+import androidx.app.slice.builders.ListBuilder;
+import androidx.app.slice.builders.MessagingSliceBuilder;
+
+/**
+ * Examples of using slice template builders.
+ */
+public class SampleSliceProvider extends SliceProvider {
+
+    public static final String ACTION_WIFI_CHANGED =
+            "com.example.androidx.slice.action.WIFI_CHANGED";
+    public static final String ACTION_TOAST =
+            "com.example.androidx.slice.action.TOAST";
+    public static final String EXTRA_TOAST_MESSAGE = "com.example.androidx.extra.TOAST_MESSAGE";
+    public static final String ACTION_TOAST_RANGE_VALUE =
+            "com.example.androidx.slice.action.TOAST_RANGE_VALUE";
+
+    public static final int LOADING_DELAY_MS = 4000;
+
+    public static final String[] URI_PATHS = {"message", "wifi", "note", "ride", "toggle",
+            "toggle2", "contact", "gallery", "weather", "reservation", "loadlist", "loadlist2",
+            "loadgrid", "loadgrid2", "inputrange", "range"};
+
+    /**
+     * @return Uri with the provided path
+     */
+    public static Uri getUri(String path, Context context) {
+        return new Uri.Builder()
+                .scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(context.getPackageName())
+                .appendPath(path)
+                .build();
+    }
+
+    @Override
+    public boolean onCreateSliceProvider() {
+        return true;
+    }
+
+    @NonNull
+    @Override
+    public Uri onMapIntentToUri(Intent intent) {
+        return getUri("wifi", getContext());
+    }
+
+    @Override
+    public Slice onBindSlice(Uri sliceUri) {
+        String path = sliceUri.getPath();
+        switch (path) {
+            // TODO: add list / grid slices with 'see more' options
+            case "/message":
+                return createMessagingSlice(sliceUri);
+            case "/wifi":
+                return createWifiSlice(sliceUri);
+            case "/note":
+                return createNoteSlice(sliceUri);
+            case "/ride":
+                return createRideSlice(sliceUri);
+            case "/toggle":
+                return createCustomToggleSlice(sliceUri);
+            case "/toggle2":
+                return createTwoCustomToggleSlices(sliceUri);
+            case "/contact":
+                return createContact(sliceUri);
+            case "/gallery":
+                return createGallery(sliceUri);
+            case "/weather":
+                return createWeather(sliceUri);
+            case "/reservation":
+                return createReservationSlice(sliceUri);
+            case "/loadlist":
+                return createLoadingSlice(sliceUri, false /* loadAll */, true /* isList */);
+            case "/loadlist2":
+                return createLoadingSlice(sliceUri, true /* loadAll */, true /* isList */);
+            case "/loadgrid":
+                return createLoadingSlice(sliceUri, false /* loadAll */, false /* isList */);
+            case "/loadgrid2":
+                return createLoadingSlice(sliceUri, true /* loadAll */, false /* isList */);
+            case "/inputrange":
+                return createStarRatingInputRange(sliceUri);
+            case "/range":
+                return createDownloadProgressRange(sliceUri);
+        }
+        throw new IllegalArgumentException("Unknown uri " + sliceUri);
+    }
+
+    private Slice createWeather(Uri sliceUri) {
+        return new GridBuilder(getContext(), sliceUri)
+                .addCell(cb -> cb
+                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_1))
+                        .addText("MON")
+                        .addTitleText("69\u00B0"))
+                .addCell(cb -> cb
+                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_2))
+                        .addText("TUE")
+                        .addTitleText("71\u00B0"))
+                .addCell(cb -> cb
+                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_3))
+                        .addText("WED")
+                        .addTitleText("76\u00B0"))
+                .addCell(cb -> cb
+                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_4))
+                        .addText("THU")
+                        .addTitleText("72\u00B0"))
+                .addCell(cb -> cb
+                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_1))
+                        .addText("FRI")
+                        .addTitleText("68\u00B0"))
+                .build();
+    }
+
+    private Slice createGallery(Uri sliceUri) {
+        return new ListBuilder(getContext(), sliceUri)
+                .setColor(0xff4285F4)
+                .addRow(b -> b
+                    .setTitle("Family trip to Hawaii")
+                    .setSubtitle("Sep 30, 2017 - Oct 2, 2017")
+                    .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_cast),
+                            getBroadcastIntent(ACTION_TOAST, "cast photo album"))
+                    .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_share),
+                            getBroadcastIntent(ACTION_TOAST, "share photo album")))
+                .addGrid(b -> b
+                    .addCell(cb -> cb
+                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_1)))
+                    .addCell(cb -> cb
+                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_2)))
+                    .addCell(cb -> cb
+                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_3)))
+                    .addCell(cb -> cb
+                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_4))))
+                .build();
+    }
+
+    private Slice createContact(Uri sliceUri) {
+        final long lastCalled = System.currentTimeMillis() - 20 * DateUtils.MINUTE_IN_MILLIS;
+        CharSequence lastCalledString = DateUtils.getRelativeTimeSpanString(lastCalled,
+                Calendar.getInstance().getTimeInMillis(),
+                DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE);
+        return new ListBuilder(getContext(), sliceUri)
+                .setColor(0xff3949ab)
+                .setHeader(b -> b
+                        .setTitle("Mady Pitza")
+                        .setSummarySubtitle("Called " + lastCalledString)
+                        .setContentIntent(getBroadcastIntent(ACTION_TOAST, "See contact info")))
+                .addRow(b -> b
+                        .setTitleItem(Icon.createWithResource(getContext(), R.drawable.ic_call))
+                        .setTitle("314-259-2653")
+                        .setSubtitle("Call lasted 1 hr 17 min")
+                        .addEndItem(lastCalled))
+                .addRow(b -> b
+                        .setTitleItem(Icon.createWithResource(getContext(), R.drawable.ic_text))
+                        .setTitle("You: Coooooool see you then")
+                        .addEndItem(System.currentTimeMillis() - 40 * DateUtils.MINUTE_IN_MILLIS))
+                .addGrid(b -> b
+                        .addCell(cb -> cb
+                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_call))
+                            .addText("Call")
+                            .setContentIntent(getBroadcastIntent(ACTION_TOAST, "call")))
+                        .addCell(cb -> cb
+                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_text))
+                            .addText("Text")
+                            .setContentIntent(getBroadcastIntent(ACTION_TOAST, "text")))
+                        .addCell(cb ->cb
+                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_video))
+                            .setContentIntent(getBroadcastIntent(ACTION_TOAST, "video"))
+                            .addText("Video"))
+                        .addCell(cb -> cb
+                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_email))
+                            .addText("Email")
+                            .setContentIntent(getBroadcastIntent(ACTION_TOAST, "email"))))
+                .build();
+    }
+
+    private Slice createMessagingSlice(Uri sliceUri) {
+        // TODO: Remote input.
+        return new MessagingSliceBuilder(getContext(), sliceUri)
+                .add(b -> b
+                        .addText("yo home \uD83C\uDF55, I emailed you the info")
+                        .addTimestamp(System.currentTimeMillis() - 20 * DateUtils.MINUTE_IN_MILLIS)
+                        .addSource(Icon.createWithResource(getContext(), R.drawable.mady)))
+                .add(b -> b
+                        .addText("just bought my tickets")
+                        .addTimestamp(System.currentTimeMillis() - 10 * DateUtils.MINUTE_IN_MILLIS))
+                .add(b -> b
+                        .addText("yay! can't wait for getContext() weekend!\n"
+                                + "\uD83D\uDE00")
+                        .addTimestamp(System.currentTimeMillis() - 5 * DateUtils.MINUTE_IN_MILLIS)
+                        .addSource(Icon.createWithResource(getContext(), R.drawable.mady)))
+                .build();
+
+    }
+
+    private Slice createNoteSlice(Uri sliceUri) {
+        // TODO: Remote input.
+        return new ListBuilder(getContext(), sliceUri)
+                .setColor(0xfff4b400)
+                .addRow(b -> b
+                    .setTitle("Create new note")
+                    .setSubtitle("with this note taking app")
+                    .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_create),
+                            getBroadcastIntent(ACTION_TOAST, "create note"))
+                    .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_voice),
+                            getBroadcastIntent(ACTION_TOAST, "voice note"))
+                    .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_camera),
+                            getIntent("android.media.action.IMAGE_CAPTURE")))
+                .build();
+    }
+
+    private Slice createReservationSlice(Uri sliceUri) {
+        return new ListBuilder(getContext(), sliceUri)
+                .setColor(0xffFF5252)
+                .addRow(b -> b
+                    .setTitle("Upcoming trip to Seattle")
+                    .setSubtitle("Feb 1 - 19 | 2 guests")
+                    .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_location),
+                            getBroadcastIntent(ACTION_TOAST, "show reservation location on map"))
+                    .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_text),
+                            getBroadcastIntent(ACTION_TOAST, "contact host")))
+                .addGrid(b -> b
+                    .addCell(cb -> cb
+                        .addLargeImage(
+                                Icon.createWithResource(getContext(), R.drawable.reservation))))
+                .addGrid(b -> b
+                    .addCell(cb -> cb
+                        .addTitleText("Check In")
+                        .addText("12:00 PM, Feb 1"))
+                    .addCell(cb -> cb
+                        .addTitleText("Check Out")
+                        .addText("11:00 AM, Feb 19")))
+                .build();
+    }
+
+    private Slice createRideSlice(Uri sliceUri) {
+        final ForegroundColorSpan colorSpan = new ForegroundColorSpan(0xff0F9D58);
+        SpannableString headerSubtitle = new SpannableString("Ride in 4 min");
+        headerSubtitle.setSpan(colorSpan, 8, headerSubtitle.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
+        SpannableString homeSubtitle = new SpannableString("12 miles | 12 min | $9.00");
+        homeSubtitle.setSpan(colorSpan, 20, homeSubtitle.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
+        SpannableString workSubtitle = new SpannableString("44 miles | 1 hour 45 min | $31.41");
+        workSubtitle.setSpan(colorSpan, 27, workSubtitle.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
+
+        return new ListBuilder(getContext(), sliceUri)
+                .setColor(0xff0F9D58)
+                .setHeader(b -> b
+                    .setTitle("Get ride")
+                    .setSubtitle(headerSubtitle)
+                    .setSummarySubtitle("Ride to work in 12 min | Ride home in 1 hour 45 min")
+                    .setContentIntent(getBroadcastIntent(ACTION_TOAST, "get ride")))
+                .addRow(b -> b
+                    .setTitle("Work")
+                    .setSubtitle(workSubtitle)
+                    .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_work),
+                            getBroadcastIntent(ACTION_TOAST, "work")))
+                .addRow(b -> b
+                    .setTitle("Home")
+                    .setSubtitle(homeSubtitle)
+                    .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_home),
+                            getBroadcastIntent(ACTION_TOAST, "home")))
+                .build();
+    }
+
+    private Slice createCustomToggleSlice(Uri sliceUri) {
+        return new ListBuilder(getContext(), sliceUri)
+                .setColor(0xffff4081)
+                .addRow(b -> b
+                    .setTitle("Custom toggle")
+                    .setSubtitle("It can support two states")
+                    .addToggle(getBroadcastIntent(ACTION_TOAST, "star toggled"),
+                            true /* isChecked */,
+                            Icon.createWithResource(getContext(), R.drawable.toggle_star)))
+                .build();
+    }
+
+    private Slice createTwoCustomToggleSlices(Uri sliceUri) {
+        return new ListBuilder(getContext(), sliceUri)
+                .setColor(0xffff4081)
+                .addRow(b -> b
+                        .setTitle("2 toggles")
+                        .setSubtitle("each supports two states")
+                        .addToggle(getBroadcastIntent(ACTION_TOAST, "first star toggled"),
+                                true /* isChecked */,
+                                Icon.createWithResource(getContext(), R.drawable.toggle_star))
+                        .addToggle(getBroadcastIntent(ACTION_TOAST, "second star toggled"),
+                                false /* isChecked */,
+                                Icon.createWithResource(getContext(), R.drawable.toggle_star)))
+                .build();
+    }
+
+    private Slice createWifiSlice(Uri sliceUri) {
+        // Get wifi state
+        WifiManager wifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
+        int wifiState = wifiManager.getWifiState();
+        boolean wifiEnabled = false;
+        String state;
+        switch (wifiState) {
+            case WifiManager.WIFI_STATE_DISABLED:
+            case WifiManager.WIFI_STATE_DISABLING:
+                state = "disconnected";
+                break;
+            case WifiManager.WIFI_STATE_ENABLED:
+            case WifiManager.WIFI_STATE_ENABLING:
+                state = wifiManager.getConnectionInfo().getSSID();
+                wifiEnabled = true;
+                break;
+            case WifiManager.WIFI_STATE_UNKNOWN:
+            default:
+                state = ""; // just don't show anything?
+                break;
+        }
+        boolean finalWifiEnabled = wifiEnabled;
+        return new ListBuilder(getContext(), sliceUri)
+                .setColor(0xff4285f4)
+                .addRow(b -> b
+                    .setTitle("Wi-fi")
+                    .setTitleItem(Icon.createWithResource(getContext(), R.drawable.ic_wifi))
+                    .setSubtitle(state)
+                    .addToggle(getBroadcastIntent(ACTION_WIFI_CHANGED, null), finalWifiEnabled)
+                    .setContentIntent(getIntent(Settings.ACTION_WIFI_SETTINGS)))
+                .build();
+    }
+
+    private Slice createStarRatingInputRange(Uri sliceUri) {
+        return new ListBuilder(getContext(), sliceUri)
+                .setColor(0xffff4081)
+                .addInputRange(c -> c
+                        .setTitle("Star rating")
+                        .setThumb(Icon.createWithResource(getContext(), R.drawable.ic_star_on))
+                        .setAction(getBroadcastIntent(ACTION_TOAST_RANGE_VALUE, null))
+                        .setMax(5)
+                        .setValue(3))
+                .build();
+    }
+
+    private Slice createDownloadProgressRange(Uri sliceUri) {
+        return new ListBuilder(getContext(), sliceUri)
+                .setColor(0xffff4081)
+                .addRange(c -> c
+                        .setTitle("Download progress")
+                        .setMax(100)
+                        .setValue(75))
+                .build();
+    }
+
+    private Handler mHandler = new Handler();
+    private Runnable mLoader;
+    private boolean mLoaded = false;
+
+    private Slice createLoadingSlice(Uri sliceUri, boolean loadAll, boolean isList) {
+        if (!mLoaded || mLoader != null) {
+            // Need to load content or we're still loading so just return partial
+            if (!mLoaded) {
+                mLoader = () -> {
+                    // Note that we've loaded things
+                    mLoader = null;
+                    mLoaded = true;
+                    // Notify to update the slice
+                    getContext().getContentResolver().notifyChange(sliceUri, null);
+                };
+                mHandler.postDelayed(mLoader, LOADING_DELAY_MS);
+            }
+            if (loadAll) {
+                return isList
+                        ? new ListBuilder(getContext(), sliceUri).build()
+                        : new GridBuilder(getContext(), sliceUri).build();
+            }
+            return createPartialSlice(sliceUri, true, isList);
+        } else {
+            mLoaded = false;
+            return createPartialSlice(sliceUri, false, isList);
+        }
+    }
+
+    private Slice createPartialSlice(Uri sliceUri, boolean isPartial, boolean isList) {
+        Icon icon = Icon.createWithResource(getContext(), R.drawable.ic_star_on);
+        PendingIntent intent = getBroadcastIntent(ACTION_TOAST, "star tapped");
+        PendingIntent intent2 = getBroadcastIntent(ACTION_TOAST, "toggle tapped");
+        if (isPartial) {
+            if (isList) {
+                return new ListBuilder(getContext(), sliceUri)
+                        .addRow(b -> createRow(b, "Slice that has content to load",
+                                "Temporary subtitle", icon, intent, true))
+                        .addRow(b -> createRow(b, null, null, null, intent, true))
+                        .addRow(b -> b.setTitle("My title").addToggle(intent2, false, true))
+                        .build();
+            } else {
+                return new GridBuilder(getContext(), sliceUri)
+                        .addCell(b -> createCell(b, null, null, null, true))
+                        .addCell(b -> createCell(b, "Two stars", null, icon, true))
+                        .addCell(b -> createCell(b, null, null, null, true))
+                        .build();
+            }
+        } else {
+            if (isList) {
+                return new ListBuilder(getContext(), sliceUri)
+                        .addRow(b -> createRow(b, "Slice that has content to load",
+                                "Subtitle loaded", icon, intent, false))
+                        .addRow(b -> createRow(b, "Loaded row", "Loaded subtitle",
+                                icon, intent, false))
+                        .addRow(b -> b.setTitle("My title").addToggle(intent2, false))
+                        .build();
+            } else {
+                return new GridBuilder(getContext(), sliceUri)
+                        .addCell(b -> createCell(b, "One star", "meh", icon, false))
+                        .addCell(b -> createCell(b, "Two stars", "good", icon, false))
+                        .addCell(b -> createCell(b, "Three stars", "best", icon, false))
+                        .build();
+            }
+        }
+    }
+
+    private ListBuilder.RowBuilder createRow(ListBuilder.RowBuilder rb, String title,
+            String subtitle, Icon icon, PendingIntent content, boolean isLoading) {
+        return rb.setTitle(title, isLoading)
+          .setSubtitle(subtitle, isLoading)
+          .addEndItem(icon, isLoading)
+          .setContentIntent(content);
+    }
+
+    private GridBuilder.CellBuilder createCell(GridBuilder.CellBuilder cb, String text1,
+            String text2, Icon icon, boolean isLoading) {
+        return cb.addText(text1, isLoading).addText(text2, isLoading).addImage(icon, isLoading);
+    }
+
+    private PendingIntent getIntent(String action) {
+        Intent intent = new Intent(action);
+        PendingIntent pi = PendingIntent.getActivity(getContext(), 0, intent, 0);
+        return pi;
+    }
+
+    private PendingIntent getBroadcastIntent(String action, String message) {
+        Intent intent = new Intent(action);
+        intent.setClass(getContext(), SliceBroadcastReceiver.class);
+        // Ensure a new PendingIntent is created for each message.
+        int requestCode = 0;
+        if (message != null) {
+            intent.putExtra(EXTRA_TOAST_MESSAGE, message);
+            requestCode = message.hashCode();
+        }
+        return PendingIntent.getBroadcast(getContext(), requestCode, intent,
+                PendingIntent.FLAG_UPDATE_CURRENT);
+    }
+}
diff --git a/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SliceBroadcastReceiver.java b/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SliceBroadcastReceiver.java
new file mode 100644
index 0000000..9e87dc0
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SliceBroadcastReceiver.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.slice.demos;
+
+import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
+import static androidx.app.slice.core.SliceHints.EXTRA_RANGE_VALUE;
+import static com.example.androidx.slice.demos.SampleSliceProvider.getUri;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.widget.Toast;
+
+/**
+ * Responds to actions performed on slices and notifies slices of updates in state changes.
+ */
+public class SliceBroadcastReceiver extends BroadcastReceiver {
+
+    @Override
+    public void onReceive(Context context, Intent i) {
+        String action = i.getAction();
+        switch (action) {
+            case SampleSliceProvider.ACTION_WIFI_CHANGED:
+                WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+                boolean newState = i.getBooleanExtra(EXTRA_TOGGLE_STATE, wm.isWifiEnabled());
+                wm.setWifiEnabled(newState);
+                // Wait a bit for wifi to update (TODO: is there a better way to do this?)
+                Handler h = new Handler();
+                h.postDelayed(() -> {
+                    context.getContentResolver().notifyChange(getUri("wifi", context), null);
+                }, 1000);
+                break;
+            case SampleSliceProvider.ACTION_TOAST:
+                String message = i.getExtras().getString(SampleSliceProvider.EXTRA_TOAST_MESSAGE,
+                        "no message");
+                Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
+                break;
+            case SampleSliceProvider.ACTION_TOAST_RANGE_VALUE:
+                int range = i.getExtras().getInt(EXTRA_RANGE_VALUE, 0);
+                Toast.makeText(context, "value: " + range, Toast.LENGTH_SHORT).show();
+                break;
+        }
+    }
+}
diff --git a/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SliceBrowser.java b/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SliceBrowser.java
new file mode 100644
index 0000000..7015743
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SliceBrowser.java
@@ -0,0 +1,295 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.slice.demos;
+
+import static com.example.androidx.slice.demos.SampleSliceProvider.URI_PATHS;
+import static com.example.androidx.slice.demos.SampleSliceProvider.getUri;
+
+import android.arch.lifecycle.LiveData;
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.BaseColumns;
+import android.support.annotation.NonNull;
+import android.support.annotation.RequiresApi;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.util.ArrayMap;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.SubMenu;
+import android.view.ViewGroup;
+import android.widget.CursorAdapter;
+import android.widget.SearchView;
+import android.widget.SimpleCursorAdapter;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceItem;
+import androidx.app.slice.widget.EventInfo;
+import androidx.app.slice.widget.SliceLiveData;
+import androidx.app.slice.widget.SliceView;
+
+/**
+ * Example use of SliceView. Uses a search bar to select/auto-complete a slice uri which is
+ * then displayed in the selected mode with SliceView.
+ */
+@RequiresApi(api = 28)
+public class SliceBrowser extends AppCompatActivity implements SliceView.OnSliceActionListener {
+
+    private static final String TAG = "SlicePresenter";
+
+    private static final String SLICE_METADATA_KEY = "android.metadata.SLICE_URI";
+    private static final boolean TEST_INTENT = false;
+    private static final boolean TEST_THEMES = false;
+
+    private ArrayList<Uri> mSliceUris = new ArrayList<Uri>();
+    private int mSelectedMode;
+    private ViewGroup mContainer;
+    private SearchView mSearchView;
+    private SimpleCursorAdapter mAdapter;
+    private SubMenu mTypeMenu;
+    private LiveData<Slice> mSliceLiveData;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_layout);
+
+        Toolbar toolbar = findViewById(R.id.search_toolbar);
+        setSupportActionBar(toolbar);
+
+        // Shows the slice
+        mContainer = findViewById(R.id.slice_preview);
+        mSearchView = findViewById(R.id.search_view);
+
+        final String[] from = new String[]{"uri"};
+        final int[] to = new int[]{android.R.id.text1};
+        mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1,
+                null, from, to, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
+        mSearchView.setSuggestionsAdapter(mAdapter);
+        mSearchView.setIconifiedByDefault(false);
+        mSearchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
+            @Override
+            public boolean onSuggestionClick(int position) {
+                mSearchView.setQuery(((Cursor) mAdapter.getItem(position)).getString(1), true);
+                return true;
+            }
+
+            @Override
+            public boolean onSuggestionSelect(int position) {
+                mSearchView.setQuery(((Cursor) mAdapter.getItem(position)).getString(1), true);
+                return true;
+            }
+        });
+        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
+            @Override
+            public boolean onQueryTextSubmit(String s) {
+                addSlice(Uri.parse(s));
+                mSearchView.clearFocus();
+                return false;
+            }
+
+            @Override
+            public boolean onQueryTextChange(String s) {
+                populateAdapter(s);
+                return false;
+            }
+        });
+
+        mSelectedMode = (savedInstanceState != null)
+                ? savedInstanceState.getInt("SELECTED_MODE", SliceView.MODE_LARGE)
+                : SliceView.MODE_LARGE;
+        if (savedInstanceState != null) {
+            mSearchView.setQuery(savedInstanceState.getString("SELECTED_QUERY"), true);
+        }
+
+        grantPackage(getPackageName());
+        // TODO: Listen for changes.
+        updateAvailableSlices();
+        if (TEST_INTENT) {
+            addSlice(new Intent("androidx.intent.SLICE_ACTION").setPackage(getPackageName()));
+        }
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        mTypeMenu = menu.addSubMenu("Type");
+        mTypeMenu.setIcon(R.drawable.ic_large);
+        mTypeMenu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+        mTypeMenu.add("Shortcut");
+        mTypeMenu.add("Small");
+        mTypeMenu.add("Large");
+        menu.add("Auth");
+        super.onCreateOptionsMenu(menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getTitle().toString()) {
+            case "Auth":
+                authAllSlices();
+                return true;
+            case "Shortcut":
+                mTypeMenu.setIcon(R.drawable.ic_shortcut);
+                mSelectedMode = SliceView.MODE_SHORTCUT;
+                updateSliceModes();
+                return true;
+            case "Small":
+                mTypeMenu.setIcon(R.drawable.ic_small);
+                mSelectedMode = SliceView.MODE_SMALL;
+                updateSliceModes();
+                return true;
+            case "Large":
+                mTypeMenu.setIcon(R.drawable.ic_large);
+                mSelectedMode = SliceView.MODE_LARGE;
+                updateSliceModes();
+                return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putInt("SELECTED_MODE", mSelectedMode);
+        outState.putString("SELECTED_QUERY", mSearchView.getQuery().toString());
+    }
+
+    private void authAllSlices() {
+        List<ApplicationInfo> packages = getPackageManager().getInstalledApplications(0);
+        packages.forEach(info -> {
+            grantPackage(info.packageName);
+        });
+    }
+
+    private void grantPackage(String packageName) {
+        for (int i = 0; i < URI_PATHS.length; i++) {
+            grantUriPermission(packageName, getUri(URI_PATHS[i], getApplicationContext()),
+                    Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
+                            | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+        }
+    }
+
+    private void updateAvailableSlices() {
+        mSliceUris.clear();
+        List<PackageInfo> packageInfos = getPackageManager()
+                .getInstalledPackages(PackageManager.GET_ACTIVITIES | PackageManager.GET_META_DATA);
+        for (PackageInfo pi : packageInfos) {
+            ActivityInfo[] activityInfos = pi.activities;
+            if (activityInfos != null) {
+                for (ActivityInfo ai : activityInfos) {
+                    if (ai.metaData != null) {
+                        String sliceUri = ai.metaData.getString(SLICE_METADATA_KEY);
+                        if (sliceUri != null) {
+                            mSliceUris.add(Uri.parse(sliceUri));
+                        }
+                    }
+                }
+            }
+        }
+        for (int i = 0; i < URI_PATHS.length; i++) {
+            mSliceUris.add(getUri(URI_PATHS[i], getApplicationContext()));
+        }
+        populateAdapter(String.valueOf(mSearchView.getQuery()));
+    }
+
+    private void addSlice(Intent intent) {
+        SliceView v = TEST_THEMES
+                ? (SliceView) getLayoutInflater().inflate(R.layout.slice_view, mContainer, false)
+                : new SliceView(getApplicationContext());
+        v.setOnSliceActionListener(this);
+        v.setTag(intent);
+        if (mSliceLiveData != null) {
+            mSliceLiveData.removeObservers(this);
+        }
+        mContainer.removeAllViews();
+        mContainer.addView(v);
+        mSliceLiveData = SliceLiveData.fromIntent(this, intent);
+        v.setMode(mSelectedMode);
+        mSliceLiveData.observe(this, v);
+    }
+
+    private void addSlice(Uri uri) {
+        if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
+            SliceView v = TEST_THEMES
+                    ? (SliceView) getLayoutInflater().inflate(
+                            R.layout.slice_view, mContainer, false)
+                    : new SliceView(getApplicationContext());
+            v.setOnSliceActionListener(this);
+            v.setTag(uri);
+            if (mSliceLiveData != null) {
+                mSliceLiveData.removeObservers(this);
+            }
+            mContainer.removeAllViews();
+            mContainer.addView(v);
+            mSliceLiveData = SliceLiveData.fromUri(this, uri);
+            v.setMode(mSelectedMode);
+            mSliceLiveData.observe(this, v);
+        } else {
+            Log.w(TAG, "Invalid uri, skipping slice: " + uri);
+        }
+    }
+
+    private void updateSliceModes() {
+        final int count = mContainer.getChildCount();
+        for (int i = 0; i < count; i++) {
+            ((SliceView) mContainer.getChildAt(i)).setMode(mSelectedMode);
+        }
+    }
+
+    private void populateAdapter(String query) {
+        final MatrixCursor c = new MatrixCursor(new String[]{BaseColumns._ID, "uri"});
+        ArrayMap<String, Integer> ranking = new ArrayMap<>();
+        ArrayList<String> suggestions = new ArrayList();
+        mSliceUris.forEach(uri -> {
+            String uriString = uri.toString();
+            if (uriString.contains(query)) {
+                ranking.put(uriString, uriString.indexOf(query));
+                suggestions.add(uriString);
+            }
+        });
+        suggestions.sort(new Comparator<String>() {
+            @Override
+            public int compare(String o1, String o2) {
+                return Integer.compare(ranking.get(o1), ranking.get(o2));
+            }
+        });
+        for (int i = 0; i < suggestions.size(); i++) {
+            c.addRow(new Object[]{i, suggestions.get(i)});
+        }
+        mAdapter.changeCursor(c);
+    }
+
+    @Override
+    public void onSliceAction(@NonNull EventInfo info, @NonNull SliceItem item) {
+        Log.w(TAG, "onSliceAction, info: " + info);
+        Log.w(TAG, "onSliceAction, sliceItem: \n" + item);
+    }
+}
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/ic_call.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_call.xml
new file mode 100644
index 0000000..ebf9de6
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_call.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M6.62,10.79c1.44,2.83 3.76,5.14 6.59,6.59l2.2,-2.2c0.27,-0.27 0.67,-0.36 1.02,-0.24 1.12,0.37 2.33,0.57 3.57,0.57 0.55,0 1,0.45 1,1V20c0,0.55 -0.45,1 -1,1 -9.39,0 -17,-7.61 -17,-17 0,-0.55 0.45,-1 1,-1h3.5c0.55,0 1,0.45 1,1 0,1.25 0.2,2.45 0.57,3.57 0.11,0.35 0.03,0.74 -0.25,1.02l-2.2,2.2z"/>
+</vector>
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/ic_camera.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..74b6bf9
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,32 @@
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:fillColor="#000000"
+        android:pathData="M 12 8.8 C 13.7673111995 8.8 15.2 10.2326888005 15.2 12 C 15.2 13.7673111995 13.7673111995 15.2 12 15.2 C 10.2326888005 15.2 8.8 13.7673111995 8.8 12 C 8.8 10.2326888005 10.2326888005 8.8 12 8.8 Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1 .9 2 2 2h16c1.1 0 2-.9
+2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5
+5-2.24 5-5 5z" />
+    <path
+        android:pathData="M0 0h24v24H0z" />
+</vector>
\ No newline at end of file
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/ic_car.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_car.xml
new file mode 100644
index 0000000..6bab660
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_car.xml
@@ -0,0 +1,31 @@
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:fillColor="#000000"
+        android:pathData="M18.92 6.01C18.72 5.42 18.16 5 17.5 5h-11c-.66 0-1.21 .42 -1.42 1.01L3 12v8c0
+.55 .45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55 .45 1 1 1h1c.55 0 1-.45
+1-1v-8l-2.08-5.99zM6.5 16c-.83 0-1.5-.67-1.5-1.5S5.67 13 6.5 13s1.5 .67 1.5
+1.5S7.33 16 6.5 16zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5 .67 1.5
+1.5-.67 1.5-1.5 1.5zM5 11l1.5-4.5h11L19 11H5z" />
+    <path
+        android:pathData="M0 0h24v24H0z" />
+</vector>
\ No newline at end of file
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_cast.xml
similarity index 68%
copy from design/res/drawable-anydpi-v21/design_ic_visibility.xml
copy to samples/SupportSliceDemos/src/main/res/drawable/ic_cast.xml
index 123acd2..4f62c5e 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_cast.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ 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.
@@ -13,16 +12,14 @@
   ~ 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.
--->
+  -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v3h2L3,5h18v14h-7v2h7c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM1,18v3h3c0,-1.66 -1.34,-3 -3,-3zM1,14v2c2.76,0 5,2.24 5,5h2c0,-3.87 -3.13,-7 -7,-7zM1,10v2c4.97,0 9,4.03 9,9h2c0,-6.08 -4.93,-11 -11,-11z"/>
+</vector>
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_create.xml
similarity index 72%
copy from design/res/drawable-anydpi-v21/design_ic_visibility.xml
copy to samples/SupportSliceDemos/src/main/res/drawable/ic_create.xml
index 123acd2..d1666a8 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_create.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,16 +12,13 @@
   ~ 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.
--->
-
+  -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/>
+</vector>
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/ic_email.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_email.xml
new file mode 100644
index 0000000..ce97ab8
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_email.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z"/>
+</vector>
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_home.xml
similarity index 65%
copy from design/res/drawable-anydpi-v21/design_ic_visibility.xml
copy to samples/SupportSliceDemos/src/main/res/drawable/ic_home.xml
index 123acd2..b278230 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_home.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,16 +12,16 @@
   ~ 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.
--->
-
+  -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
 
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
+        android:fillColor="#000000"
+        android:pathData="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z" />
+    <path
+        android:pathData="M0 0h24v24H0z" />
 </vector>
\ No newline at end of file
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/ic_large.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_large.xml
new file mode 100644
index 0000000..79ac590
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_large.xml
@@ -0,0 +1,28 @@
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48.0dp"
+        android:height="48.0dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M34.0,2.02L14.0,2.0c-2.21,0.0 -4.0,1.79 -4.0,4.0l0.0,36.0c0.0,2.21 1.79,4.0 4.0,4.0l20.0,0.0c2.21,0.0 4.0,-1.79 4.0,-4.0L38.0,6.0c0.0,-2.21 -1.79,-3.98 -4.0,-3.98zM34.0,38.0L14.0,38.0L14.0,10.0l20.0,0.0l0.0,28.0z"/>
+    <path
+        android:strokeColor="#FF000000"
+        android:strokeWidth="2"
+        android:pathData="M16,18 l16,0 l0,10 l-16,0z"/>
+</vector>
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_location.xml
similarity index 72%
copy from design/res/drawable-anydpi-v21/design_ic_visibility.xml
copy to samples/SupportSliceDemos/src/main/res/drawable/ic_location.xml
index 123acd2..2f2db39 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_location.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ 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.
@@ -13,16 +12,14 @@
   ~ 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.
--->
+  -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M12,2C8.13,2 5,5.13 5,9c0,5.25 7,13 7,13s7,-7.75 7,-13c0,-3.87 -3.13,-7 -7,-7zM12,11.5c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5 2.5,1.12 2.5,2.5 -1.12,2.5 -2.5,2.5z"/>
+</vector>
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/ic_share.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_share.xml
new file mode 100644
index 0000000..4f68d87
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_share.xml
@@ -0,0 +1,25 @@
+<!--
+  ~ 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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"/>
+</vector>
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/ic_shortcut.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_shortcut.xml
new file mode 100644
index 0000000..bf9572a
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_shortcut.xml
@@ -0,0 +1,34 @@
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="48.0dp"
+    android:viewportHeight="48.0"
+    android:viewportWidth="48.0"
+    android:width="48.0dp">
+    <path
+        android:fillColor="#e2e2e2"
+        android:pathData="M24.0,24.0m-19.0,0.0a19.0,19.0 0.0,1.0 1.0,38.0 0.0a19.0,19.0 0.0,1.0 1.0,-38.0 0.0"/>
+    <group
+        android:scaleX=".7"
+        android:scaleY=".7"
+        android:translateX="7.2"
+        android:translateY="7.2">
+
+        <path
+            android:fillColor="#ff000000"
+            android:pathData="M12.0,36.0c0.0,1.0 0.9,2.0 2.0,2.0l2.0,0.0l0.0,7.0c0.0,1.66 1.34,3.0 3.0,3.0s3.0,-1.34 3.0,-3.0l0.0,-7.0l4.0,0.0l0.0,7.0c0.0,1.66 1.34,3.0 3.0,3.0s3.0,-1.34 3.0,-3.0l0.0,-7.0l2.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L36.0,16.0L12.0,16.0l0.0,20.0zM7.0,16.0c-1.66,0.0 -3.0,1.34 -3.0,3.0l0.0,14.0c0.0,1.66 1.34,3.0 3.0,3.0s3.0,-1.34 3.0,-3.0L10.0,19.0c0.0,-1.66 -1.34,-3.0 -3.0,-3.0zm34.0,0.0c-1.66,0.0 -3.0,1.34 -3.0,3.0l0.0,14.0c0.0,1.66 1.34,3.0 3.0,3.0s3.0,-1.34 3.0,-3.0L44.0,19.0c0.0,-1.66 -1.34,-3.0 -3.0,-3.0zM31.06,4.32l2.61,-2.61c0.39,-0.3 0.39,-1.02 0.0,-1.41 -0.39,-0.39 -1.02,-0.39 -1.41,0.0L29.3,3.25C27.7,2.46 25.91,2.0 24.0,2.0c-1.92,0.0 -3.7,0.46 -5.33,1.26L15.0,0.29c-0.39,-0.39 -1.02,-0.39 -1.41,0.0 -0.3,0.39 -0.39,1.02 0.0,1.41l2.62,2.62C13.94,6.51 12.0,10.03 12.0,14.0l24.0,0.0c0.0,-3.98 -1.95,-7.5 -4.94,-9.68zM20.0,10.0l-2.0,0.0L18.0,8.0l2.0,0.0l0.0,2.0zm10.0,0.0l-2.0,0.0L28.0,8.0l2.0,0.0l0.0,2.0z"/>
+    </group>
+</vector>
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/ic_small.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_small.xml
new file mode 100644
index 0000000..8fd43df
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_small.xml
@@ -0,0 +1,27 @@
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48.0dp"
+        android:height="48.0dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M34.0,2.02L14.0,2.0c-2.21,0.0 -4.0,1.79 -4.0,4.0l0.0,36.0c0.0,2.21 1.79,4.0 4.0,4.0l20.0,0.0c2.21,0.0 4.0,-1.79 4.0,-4.0L38.0,6.0c0.0,-2.21 -1.79,-3.98 -4.0,-3.98zM34.0,38.0L14.0,38.0L14.0,10.0l20.0,0.0l0.0,28.0z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M16,18 l16,0 l0,4 l-16,0z"/>
+</vector>
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_star_off.xml
similarity index 70%
copy from design/res/drawable-anydpi-v21/design_ic_visibility.xml
copy to samples/SupportSliceDemos/src/main/res/drawable/ic_star_off.xml
index 123acd2..7f023b3 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_star_off.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,16 +12,13 @@
   ~ 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.
--->
-
+  -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z"/>
+</vector>
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_star_on.xml
similarity index 77%
rename from design/res/drawable-anydpi-v21/design_ic_visibility.xml
rename to samples/SupportSliceDemos/src/main/res/drawable/ic_star_on.xml
index 123acd2..f3ca086 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_star_on.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,16 +12,13 @@
   ~ 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.
--->
-
+  -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z"/>
+</vector>
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/ic_text.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_text.xml
new file mode 100644
index 0000000..d2876bf
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_text.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM18,14L6,14v-2h12v2zM18,11L6,11L6,9h12v2zM18,8L6,8L6,6h12v2z"/>
+</vector>
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/ic_video.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_video.xml
new file mode 100644
index 0000000..e23eac8
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_video.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M17,10.5V7c0,-0.55 -0.45,-1 -1,-1H4c-0.55,0 -1,0.45 -1,1v10c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1v-3.5l4,4v-11l-4,4z"/>
+</vector>
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_voice.xml
similarity index 69%
copy from design/res/drawable-anydpi-v21/design_ic_visibility.xml
copy to samples/SupportSliceDemos/src/main/res/drawable/ic_voice.xml
index 123acd2..8f465bb 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_voice.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,16 +12,13 @@
   ~ 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.
--->
-
+  -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M12,15c1.66,0 2.99,-1.34 2.99,-3L15,6c0,-1.66 -1.34,-3 -3,-3S9,4.34 9,6v6c0,1.66 1.34,3 3,3zM17.3,12c0,3 -2.54,5.1 -5.3,5.1S6.7,15 6.7,12L5,12c0,3.42 2.72,6.23 6,6.72L11,22h2v-3.28c3.28,-0.48 6,-3.3 6,-6.72h-1.7z"/>
+</vector>
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_wifi.xml
similarity index 63%
copy from design/res/drawable-anydpi-v21/design_ic_visibility.xml
copy to samples/SupportSliceDemos/src/main/res/drawable/ic_wifi.xml
index 123acd2..4fbfd60 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_wifi.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,16 +12,17 @@
   ~ 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.
--->
-
+  -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M12.01,21.49L23.64,7c-0.45,-0.34 -4.93,-4 -11.64,-4C5.28,3 0.81,6.66 0.36,7l11.63,14.49 0.01,0.01 0.01,-0.01z"
+        android:fillAlpha=".3"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M3.53,10.95l8.46,10.54 0.01,0.01 0.01,-0.01 8.46,-10.54C20.04,10.62 16.81,8 12,8c-4.81,0 -8.04,2.62 -8.47,2.95z"/>
+</vector>
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/ic_work.xml b/samples/SupportSliceDemos/src/main/res/drawable/ic_work.xml
new file mode 100644
index 0000000..6806402
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/ic_work.xml
@@ -0,0 +1,28 @@
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M0 0h24v24H0z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M20 6h-4V4c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H4c-1.11 0-1.99 .89 -1.99 2L2
+19c0 1.11 .89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-6 0h-4V4h4v2z" />
+</vector>
\ No newline at end of file
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/mady.jpg b/samples/SupportSliceDemos/src/main/res/drawable/mady.jpg
new file mode 100644
index 0000000..8b61f1b
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/mady.jpg
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/reservation.png b/samples/SupportSliceDemos/src/main/res/drawable/reservation.png
new file mode 100644
index 0000000..16acc98
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/reservation.png
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/slices_1.jpg b/samples/SupportSliceDemos/src/main/res/drawable/slices_1.jpg
new file mode 100644
index 0000000..31cc065
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/slices_1.jpg
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/slices_2.jpg b/samples/SupportSliceDemos/src/main/res/drawable/slices_2.jpg
new file mode 100644
index 0000000..adbe1d3
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/slices_2.jpg
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/slices_3.jpg b/samples/SupportSliceDemos/src/main/res/drawable/slices_3.jpg
new file mode 100644
index 0000000..6617019
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/slices_3.jpg
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/slices_4.jpg b/samples/SupportSliceDemos/src/main/res/drawable/slices_4.jpg
new file mode 100644
index 0000000..d00a8b3
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/slices_4.jpg
Binary files differ
diff --git a/design/tests/res/drawable/test_drawable_state_list.xml b/samples/SupportSliceDemos/src/main/res/drawable/toggle_star.xml
similarity index 71%
rename from design/tests/res/drawable/test_drawable_state_list.xml
rename to samples/SupportSliceDemos/src/main/res/drawable/toggle_star.xml
index f125913..e964925 100644
--- a/design/tests/res/drawable/test_drawable_state_list.xml
+++ b/samples/SupportSliceDemos/src/main/res/drawable/toggle_star.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2014 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.
@@ -13,9 +13,12 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_checked="true" android:drawable="@drawable/test_background_blue" />
-    <item android:drawable="@drawable/test_background_green" />
-</selector>
-
+    <item
+        android:id="@+id/on"
+        android:state_checked="true"
+        android:drawable="@drawable/ic_star_on" />
+    <item
+        android:id="@+id/off"
+        android:drawable="@drawable/ic_star_off" />
+</selector>
\ No newline at end of file
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/weather_1.png b/samples/SupportSliceDemos/src/main/res/drawable/weather_1.png
new file mode 100644
index 0000000..7c4034e
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/weather_1.png
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/weather_2.png b/samples/SupportSliceDemos/src/main/res/drawable/weather_2.png
new file mode 100644
index 0000000..f1b6672
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/weather_2.png
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/weather_3.png b/samples/SupportSliceDemos/src/main/res/drawable/weather_3.png
new file mode 100644
index 0000000..a5db683
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/weather_3.png
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/drawable/weather_4.png b/samples/SupportSliceDemos/src/main/res/drawable/weather_4.png
new file mode 100644
index 0000000..0b7f3b0
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/drawable/weather_4.png
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/layout/activity_demo.xml b/samples/SupportSliceDemos/src/main/res/layout/activity_demo.xml
new file mode 100644
index 0000000..f557f40
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/layout/activity_demo.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.example.android.support.content.demos.ContentPagerDemoActivity">
+
+    <android.support.v7.widget.Toolbar
+        android:id="@+id/toolbar"
+        android:layout_width="match_parent"
+        android:layout_height="?attr/actionBarSize"
+        android:background="?attr/colorPrimary"
+        android:theme="@style/AppTheme.AppBarOverlay"
+        app:popupTheme="@style/AppTheme.PopupOverlay"/>
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+
+</LinearLayout>
diff --git a/samples/SupportSliceDemos/src/main/res/layout/activity_layout.xml b/samples/SupportSliceDemos/src/main/res/layout/activity_layout.xml
new file mode 100644
index 0000000..6a087a3
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/layout/activity_layout.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="top"
+    android:orientation="vertical" >
+
+    <FrameLayout
+        android:id="@+id/search_bar_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="#f2f2f2">
+        <android.support.v7.widget.CardView
+            android:id="@+id/search_bar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="8dp"
+            app:cardCornerRadius="2dp"
+            app:cardBackgroundColor="?android:attr/colorBackground"
+            app:cardElevation="2dp">
+            <android.support.v7.widget.Toolbar
+                android:id="@+id/search_toolbar"
+                android:layout_width="match_parent"
+                android:layout_height="48dp"
+                android:background="?android:attr/selectableItemBackground"
+                android:contentInsetStart="0dp"
+                android:contentInsetStartWithNavigation="0dp"
+                android:theme="?android:attr/actionBarTheme">
+                <SearchView
+                    android:id="@+id/search_view"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:iconifiedByDefault="false"
+                    android:imeOptions="actionSearch|flagNoExtractUi"
+                    android:queryHint="content://..."
+                    android:searchIcon="@null"/>
+            </android.support.v7.widget.Toolbar>
+        </android.support.v7.widget.CardView>
+    </FrameLayout>
+
+
+    <ScrollView
+        android:id="@+id/container"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1" >
+
+        <FrameLayout
+            android:id="@+id/slice_preview"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="8dp"
+            android:orientation="vertical"
+            android:background="?android:attr/colorBackground"
+            android:elevation="10dp" />
+    </ScrollView>
+
+</LinearLayout>
diff --git a/design/tests/res/layout/design_appbar_with_scrollbars.xml b/samples/SupportSliceDemos/src/main/res/layout/slice_view.xml
similarity index 79%
rename from design/tests/res/layout/design_appbar_with_scrollbars.xml
rename to samples/SupportSliceDemos/src/main/res/layout/slice_view.xml
index 6c89a2a..8d5eb61 100644
--- a/design/tests/res/layout/design_appbar_with_scrollbars.xml
+++ b/samples/SupportSliceDemos/src/main/res/layout/slice_view.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 The Android Open Source Project
+  ~ 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.
@@ -15,8 +15,8 @@
   ~ limitations under the License.
   -->
 
-<android.support.design.widget.AppBarLayout
+<androidx.app.slice.widget.SliceView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="200dp"
-    android:theme="@style/AppBarWithScrollbars"/>
\ No newline at end of file
+    android:layout_height="wrap_content"
+    style="@style/CustomSliceView"/>
\ No newline at end of file
diff --git a/samples/SupportSliceDemos/src/main/res/mipmap-hdpi/ic_launcher.png b/samples/SupportSliceDemos/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/mipmap-hdpi/ic_launcher_round.png b/samples/SupportSliceDemos/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..9a078e3
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/mipmap-mdpi/ic_launcher.png b/samples/SupportSliceDemos/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/mipmap-mdpi/ic_launcher_round.png b/samples/SupportSliceDemos/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..efc028a
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/mipmap-xhdpi/ic_launcher.png b/samples/SupportSliceDemos/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/samples/SupportSliceDemos/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..3af2608
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/mipmap-xxhdpi/ic_launcher.png b/samples/SupportSliceDemos/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/samples/SupportSliceDemos/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..9bec2e6
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/samples/SupportSliceDemos/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..aee44e1
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportSliceDemos/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/samples/SupportSliceDemos/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..34947cd
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/design/res/values/integers.xml b/samples/SupportSliceDemos/src/main/res/values/colors.xml
similarity index 75%
rename from design/res/values/integers.xml
rename to samples/SupportSliceDemos/src/main/res/values/colors.xml
index a0d6fc7..86b4304 100644
--- a/design/res/values/integers.xml
+++ b/samples/SupportSliceDemos/src/main/res/values/colors.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2015 The Android Open Source Project
+  ~ 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.
@@ -13,8 +13,10 @@
   ~ 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.
--->
+  -->
+
 <resources>
-    <integer name="bottom_sheet_slide_duration">150</integer>
-    <integer name="app_bar_elevation_anim_duration">150</integer>
+    <color name="colorPrimary">#3F51B5</color>
+    <color name="colorPrimaryDark">#303F9F</color>
+    <color name="colorAccent">#FF4081</color>
 </resources>
diff --git a/design/tests/res/values-sw600dp/dimens.xml b/samples/SupportSliceDemos/src/main/res/values/strings.xml
similarity index 77%
rename from design/tests/res/values-sw600dp/dimens.xml
rename to samples/SupportSliceDemos/src/main/res/values/strings.xml
index 67765c5..89583bd 100644
--- a/design/tests/res/values-sw600dp/dimens.xml
+++ b/samples/SupportSliceDemos/src/main/res/values/strings.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- 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.
@@ -13,6 +13,6 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<resources>
-    <dimen name="custom_snackbar_max_width">540dp</dimen>
-</resources>
\ No newline at end of file
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">Slice Browser</string>
+</resources>
diff --git a/samples/SupportSliceDemos/src/main/res/values/styles.xml b/samples/SupportSliceDemos/src/main/res/values/styles.xml
new file mode 100644
index 0000000..a01e0aa
--- /dev/null
+++ b/samples/SupportSliceDemos/src/main/res/values/styles.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+    </style>
+
+    <style name="AppTheme.NoActionBar">
+        <item name="windowActionBar">false</item>
+        <item name="windowNoTitle">true</item>
+    </style>
+    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
+    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>
+
+    <style name="CustomSliceView" parent="Widget.SliceView">
+        <item name="titleColor">@color/colorAccent</item>
+        <item name="tintColor">@color/colorAccent</item>
+        <item name="headerTitleSize">20sp</item>
+        <item name="headerSubtitleSize">16sp</item>
+        <item name="android:paddingLeft">14dp</item>
+        <item name="android:paddingTop">8dp</item>
+        <item name="android:paddingRight">20dp</item>
+        <item name="android:paddingBottom">8dp</item>
+    </style>
+</resources>
diff --git a/settings.gradle b/settings.gradle
index 059f57a..a5704cc 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,122 +1,85 @@
 /////////////////////////////
 //
+// Buildscript utils
+//
+/////////////////////////////
+
+
+// Calling includeProject(name, filePath) is shorthand for:
+//
+//   include(name)
+//   project(name).projectDir = new File(filePath)
+//
+// Note that <name> directly controls the Gradle project name, and also indirectly sets:
+//   the project name in the IDE
+//   the Maven artifactId
+//
+def includeProject(name, filePath) {
+  settings.include(name)
+
+  def file
+  if (filePath instanceof String) {
+    file = new File(filePath)
+  } else {
+    file = filePath
+  }
+  project(name).projectDir = file
+}
+
+
+
+
+/////////////////////////////
+//
 // Libraries
 //
 /////////////////////////////
 
-include ':support-annotations'
-project(':support-annotations').projectDir = new File(rootDir, 'annotations')
-
-include ':support-compat'
-project(':support-compat').projectDir = new File(rootDir, 'compat')
-
-include ':support-media-compat'
-project(':support-media-compat').projectDir = new File(rootDir, 'media-compat')
-
-include ':support-core-ui'
-project(':support-core-ui').projectDir = new File(rootDir, 'core-ui')
-
-include ':support-fragment'
-project(':support-fragment').projectDir = new File(rootDir, 'fragment')
-
-include ':support-core-utils'
-project(':support-core-utils').projectDir = new File(rootDir, 'core-utils')
-
-include ':support-v4'
-project(':support-v4').projectDir = new File(rootDir, 'v4')
-
-include ':appcompat-v7'
-project(':appcompat-v7').projectDir = new File(rootDir, 'v7/appcompat')
-
-include ':gridlayout-v7'
-project(':gridlayout-v7').projectDir = new File(rootDir, 'v7/gridlayout')
-
-include ':mediarouter-v7'
-project(':mediarouter-v7').projectDir = new File(rootDir, 'v7/mediarouter')
-
-include ':palette-v7'
-project(':palette-v7').projectDir = new File(rootDir, 'v7/palette')
-
-include ':recyclerview-v7'
-project(':recyclerview-v7').projectDir = new File(rootDir, 'v7/recyclerview')
-
-include ':recyclerview-selection'
-project(':recyclerview-selection').projectDir = new File(rootDir, 'recyclerview-selection')
-
-include ':cardview-v7'
-project(':cardview-v7').projectDir = new File(rootDir, 'v7/cardview')
-
-include ':preference-v7'
-project(':preference-v7').projectDir = new File(rootDir, 'v7/preference')
-
-include ':preference-v14'
-project(':preference-v14').projectDir = new File(rootDir, 'v14/preference')
-
-include ':preference-leanback-v17'
-project(':preference-leanback-v17').projectDir = new File(rootDir, 'preference-leanback')
-
-include ':support-v13'
-project(':support-v13').projectDir = new File(rootDir, 'v13')
-
-include ':leanback-v17'
-project(':leanback-v17').projectDir = new File(rootDir, 'leanback')
-
-include ':design'
-project(':design').projectDir = new File(rootDir, 'design')
-
-include ':percent'
-project(':percent').projectDir = new File(rootDir, 'percent')
-
-include ':customtabs'
-project(':customtabs').projectDir = new File(rootDir, 'customtabs')
-
-include ':recommendation'
-project(':recommendation').projectDir = new File(rootDir, 'recommendation')
-
-include ':support-vector-drawable'
-project(':support-vector-drawable').projectDir = new File(rootDir, 'graphics/drawable/static')
-
-include ':animated-vector-drawable'
-project(':animated-vector-drawable').projectDir = new File(rootDir, 'graphics/drawable/animated')
-
-include ':transition'
-project(':transition').projectDir = new File(rootDir, 'transition')
-
-include ':support-dynamic-animation'
-project(':support-dynamic-animation').projectDir = new File(rootDir, 'dynamic-animation')
-
-include ':viewpager2'
-project(':viewpager2').projectDir = new File(rootDir, 'viewpager2')
-
-include ':exifinterface'
-project(':exifinterface').projectDir = new File(rootDir, 'exifinterface')
-
-include ':wear'
-project(':wear').projectDir = new File(rootDir, 'wear')
-
-include ':support-tv-provider'
-project(':support-tv-provider').projectDir = new File(rootDir, 'tv-provider')
-
-include ':support-emoji'
-project(':support-emoji').projectDir = new File(rootDir, 'emoji/core')
-
-include ':support-emoji-bundled'
-project(':support-emoji-bundled').projectDir = new File(rootDir, 'emoji/bundled')
-
-include ':support-emoji-appcompat'
-project(':support-emoji-appcompat').projectDir = new File(rootDir, 'emoji/appcompat')
-
-include ':support-content'
-project(':support-content').projectDir = new File(rootDir, 'content')
-
-include ':car'
-project(':car').projectDir = new File(rootDir, 'car')
-
-include ':webkit'
-project(':webkit').projectDir = new File(rootDir, 'webkit')
-
-include ':webkit-codegen'
-project(':webkit-codegen').projectDir = new File(rootDir, 'webkit-codegen')
+includeProject(":support-annotations", "annotations")
+includeProject(":support-compat", "compat")
+includeProject(":support-media-compat", "media-compat")
+includeProject(":support-core-ui", "core-ui")
+includeProject(":support-fragment", "fragment")
+includeProject(":support-core-utils", "core-utils")
+includeProject(":support-v4", "v4")
+includeProject(":appcompat-v7", "v7/appcompat")
+includeProject(":gridlayout-v7", "v7/gridlayout")
+includeProject(":mediarouter-v7", "v7/mediarouter")
+includeProject(":palette-v7", "v7/palette")
+includeProject(":recyclerview-v7", "v7/recyclerview")
+includeProject(":recyclerview-selection", "recyclerview-selection")
+includeProject(":cardview-v7", "v7/cardview")
+includeProject(":preference-v7", "v7/preference")
+includeProject(":preference-v14", "v14/preference")
+includeProject(":preference-leanback-v17", "preference-leanback")
+includeProject(":support-v13", "v13")
+includeProject(":leanback-v17", "leanback")
+includeProject(":percent", "percent")
+includeProject(":customtabs", "customtabs")
+includeProject(":recommendation", "recommendation")
+includeProject(":support-vector-drawable", "graphics/drawable/static")
+includeProject(":animated-vector-drawable", "graphics/drawable/animated")
+includeProject(":transition", "transition")
+includeProject(":support-dynamic-animation", "dynamic-animation")
+includeProject(":viewpager2", "viewpager2")
+includeProject(":exifinterface", "exifinterface")
+includeProject(":wear", "wear")
+includeProject(":support-tv-provider", "tv-provider")
+includeProject(":support-emoji", "emoji/core")
+includeProject(":support-emoji-bundled", "emoji/bundled")
+includeProject(":support-emoji-appcompat", "emoji/appcompat")
+includeProject(":support-content", "content")
+includeProject(":car", "car")
+includeProject(":webkit", "webkit")
+includeProject(":slices-core", "slices/core")
+includeProject(":slices-view", "slices/view")
+includeProject(":slices-builders", "slices/builders")
+includeProject(":textclassifier", "textclassifier")
+includeProject(":webkit-codegen", "webkit-codegen")
+includeProject(":jetifier-core", "jetifier/jetifier/core")
+includeProject(":jetifier-gradle-plugin", "jetifier/jetifier/gradle-plugin")
+includeProject(":jetifier-standalone", "jetifier/jetifier/standalone")
+includeProject(":jetifier-preprocessor", "jetifier/jetifier/preprocessor")
 
 /////////////////////////////
 //
@@ -124,66 +87,34 @@
 //
 /////////////////////////////
 
-File samplesRoot = new File(rootDir, 'samples')
+File samplesRoot = new File(rootDir, "samples")
 
-include ':support-content-demos'
-project(':support-content-demos').projectDir = new File(samplesRoot, 'SupportContentDemos')
+includeProject(":support-content-demos", new File(samplesRoot, "SupportContentDemos"))
+includeProject(":support-design-demos", new File(samplesRoot, "SupportDesignDemos"))
+includeProject(":support-leanback-demos", new File(samplesRoot, "SupportLeanbackDemos"))
+includeProject(":support-leanback-jank", new File(samplesRoot, "SupportLeanbackJank"))
+includeProject(":support-percent-demos", new File(samplesRoot, "SupportPercentDemos"))
+includeProject(":support-preference-demos", new File(samplesRoot, "SupportPreferenceDemos"))
+includeProject(":support-transition-demos", new File(samplesRoot, "SupportTransitionDemos"))
+includeProject(":support-v4-demos", new File(samplesRoot, "Support4Demos"))
+includeProject(":support-v7-demos", new File(samplesRoot, "Support7Demos"))
+includeProject(":support-v13-demos", new File(samplesRoot, "Support13Demos"))
+includeProject(":support-vector-drawable-demos", new File(samplesRoot, "SupportVectorDrawableDemos"))
+includeProject(":support-animation-demos", new File(samplesRoot, "SupportAnimationDemos"))
+includeProject(":viewpager2-demos", new File(samplesRoot, "ViewPager2Demos"))
+includeProject(":support-wear-demos", new File(samplesRoot, "SupportWearDemos"))
+includeProject(":support-app-navigation", new File(samplesRoot, "SupportAppNavigation"))
+includeProject(":support-emoji-demos", new File(samplesRoot, "SupportEmojiDemos"))
+includeProject(":support-car-demos", new File(samplesRoot, "SupportCarDemos"))
+includeProject(":support-slices-demos", new File(samplesRoot, "SupportSliceDemos"))
 
-include ':support-design-demos'
-project(':support-design-demos').projectDir = new File(samplesRoot, 'SupportDesignDemos')
-
-include ':support-leanback-demos'
-project(':support-leanback-demos').projectDir = new File(samplesRoot, 'SupportLeanbackDemos')
-
-include ':support-leanback-jank'
-project(':support-leanback-jank').projectDir = new File(samplesRoot, 'SupportLeanbackJank')
-
-include ':support-percent-demos'
-project(':support-percent-demos').projectDir = new File(samplesRoot, 'SupportPercentDemos')
-
-include ':support-preference-demos'
-project(':support-preference-demos').projectDir = new File(samplesRoot, 'SupportPreferenceDemos')
-
-include ':support-transition-demos'
-project(':support-transition-demos').projectDir = new File(samplesRoot, 'SupportTransitionDemos')
-
-include ':support-v4-demos'
-project(':support-v4-demos').projectDir = new File(samplesRoot, 'Support4Demos')
-
-include ':support-v7-demos'
-project(':support-v7-demos').projectDir = new File(samplesRoot, 'Support7Demos')
-
-include ':support-v13-demos'
-project(':support-v13-demos').projectDir = new File(samplesRoot, 'Support13Demos')
-
-include ':support-vector-drawable-demos'
-project(':support-vector-drawable-demos').projectDir = new File(samplesRoot, 'SupportVectorDrawableDemos')
-
-include ':support-animation-demos'
-project(':support-animation-demos').projectDir = new File(samplesRoot, 'SupportAnimationDemos')
-
-include ':viewpager2-demos'
-project(':viewpager2-demos').projectDir = new File(samplesRoot, 'ViewPager2Demos')
-
-include ':support-wear-demos'
-project(':support-wear-demos').projectDir = new File(samplesRoot, 'SupportWearDemos')
-
-include ':support-app-navigation'
-project(':support-app-navigation').projectDir = new File(samplesRoot, 'SupportAppNavigation')
-
-include ':support-emoji-demos'
-project(':support-emoji-demos').projectDir = new File(samplesRoot, 'SupportEmojiDemos')
-
-include ':support-car-demos'
-project(':support-car-demos').projectDir = new File(samplesRoot, 'SupportCarDemos')
 /////////////////////////////
 //
 // Testing libraries
 //
 /////////////////////////////
 
-include ':support-testutils'
-project(':support-testutils').projectDir = new File(rootDir, 'testutils')
+includeProject(":support-testutils", "testutils")
 
 /////////////////////////////
 //
@@ -191,20 +122,11 @@
 //
 /////////////////////////////
 
-include ':support-media-compat-test-client'
-project(':support-media-compat-test-client').projectDir = new File(rootDir, 'media-compat/version-compat-tests/current/client')
-
-include ':support-media-compat-test-client-previous'
-project(':support-media-compat-test-client-previous').projectDir = new File(rootDir, 'media-compat/version-compat-tests/previous/client')
-
-include ':support-media-compat-test-service'
-project(':support-media-compat-test-service').projectDir = new File(rootDir, 'media-compat/version-compat-tests/current/service')
-
-include ':support-media-compat-test-service-previous'
-project(':support-media-compat-test-service-previous').projectDir = new File(rootDir, 'media-compat/version-compat-tests/previous/service')
-
-include ':support-media-compat-test-lib'
-project(':support-media-compat-test-lib').projectDir = new File(rootDir, 'media-compat/version-compat-tests/lib')
+includeProject(":support-media-compat-test-client", "media-compat/version-compat-tests/current/client")
+includeProject(":support-media-compat-test-client-previous", "media-compat/version-compat-tests/previous/client")
+includeProject(":support-media-compat-test-service", "media-compat/version-compat-tests/current/service")
+includeProject(":support-media-compat-test-service-previous", "media-compat/version-compat-tests/previous/service")
+includeProject(":support-media-compat-test-lib", "media-compat/version-compat-tests/lib")
 
 /////////////////////////////
 //
@@ -212,14 +134,10 @@
 //
 /////////////////////////////
 
-File externalRoot = new File(rootDir, '../../external')
+apply(from: "include-composite-deps.gradle")
+File externalRoot = new File(rootDir, "../../external")
 
-includeBuild new File(externalRoot, 'doclava')
-
-includeBuild new File(externalRoot, 'jdiff')
-
-include ':noto-emoji-compat'
-project(':noto-emoji-compat').projectDir = new File(externalRoot, 'noto-fonts/emoji-compat')
+includeProject(":noto-emoji-compat", new File(externalRoot, "noto-fonts/emoji-compat"))
 
 ///// FLATFOOT START
 
diff --git a/slices/OWNERS b/slices/OWNERS
new file mode 100644
index 0000000..921a517
--- /dev/null
+++ b/slices/OWNERS
@@ -0,0 +1,2 @@
+jmonk@google.com
+madym@google.com
diff --git a/slices/builders/api/current.txt b/slices/builders/api/current.txt
new file mode 100644
index 0000000..8a953cb
--- /dev/null
+++ b/slices/builders/api/current.txt
@@ -0,0 +1,106 @@
+package androidx.app.slice.builders {
+
+  public class GridBuilder extends androidx.app.slice.builders.TemplateSliceBuilder {
+    ctor public GridBuilder(android.content.Context, android.net.Uri);
+    ctor public GridBuilder(androidx.app.slice.builders.ListBuilder);
+    method public androidx.app.slice.builders.GridBuilder addCell(androidx.app.slice.builders.GridBuilder.CellBuilder);
+    method public androidx.app.slice.builders.GridBuilder addCell(java.util.function.Consumer<androidx.app.slice.builders.GridBuilder.CellBuilder>);
+    method public androidx.app.slice.builders.GridBuilder addSeeMoreAction(android.app.PendingIntent);
+    method public androidx.app.slice.builders.GridBuilder addSeeMoreCell(androidx.app.slice.builders.GridBuilder.CellBuilder);
+    method public androidx.app.slice.builders.GridBuilder addSeeMoreCell(java.util.function.Consumer<androidx.app.slice.builders.GridBuilder.CellBuilder>);
+  }
+
+  public static final class GridBuilder.CellBuilder extends androidx.app.slice.builders.TemplateSliceBuilder {
+    ctor public GridBuilder.CellBuilder(androidx.app.slice.builders.GridBuilder);
+    ctor public GridBuilder.CellBuilder(androidx.app.slice.builders.GridBuilder, android.net.Uri);
+    method public androidx.app.slice.builders.GridBuilder.CellBuilder addImage(android.graphics.drawable.Icon);
+    method public androidx.app.slice.builders.GridBuilder.CellBuilder addImage(android.graphics.drawable.Icon, boolean);
+    method public androidx.app.slice.builders.GridBuilder.CellBuilder addLargeImage(android.graphics.drawable.Icon);
+    method public androidx.app.slice.builders.GridBuilder.CellBuilder addLargeImage(android.graphics.drawable.Icon, boolean);
+    method public androidx.app.slice.builders.GridBuilder.CellBuilder addText(java.lang.CharSequence);
+    method public androidx.app.slice.builders.GridBuilder.CellBuilder addText(java.lang.CharSequence, boolean);
+    method public androidx.app.slice.builders.GridBuilder.CellBuilder addTitleText(java.lang.CharSequence);
+    method public androidx.app.slice.builders.GridBuilder.CellBuilder addTitleText(java.lang.CharSequence, boolean);
+    method public androidx.app.slice.builders.GridBuilder.CellBuilder setContentIntent(android.app.PendingIntent);
+  }
+
+  public class ListBuilder extends androidx.app.slice.builders.TemplateSliceBuilder {
+    ctor public ListBuilder(android.content.Context, android.net.Uri);
+    method public androidx.app.slice.builders.ListBuilder addGrid(androidx.app.slice.builders.GridBuilder);
+    method public androidx.app.slice.builders.ListBuilder addGrid(java.util.function.Consumer<androidx.app.slice.builders.GridBuilder>);
+    method public androidx.app.slice.builders.ListBuilder addInputRange(androidx.app.slice.builders.ListBuilder.InputRangeBuilder);
+    method public androidx.app.slice.builders.ListBuilder addInputRange(java.util.function.Consumer<androidx.app.slice.builders.ListBuilder.InputRangeBuilder>);
+    method public androidx.app.slice.builders.ListBuilder addRange(androidx.app.slice.builders.ListBuilder.RangeBuilder);
+    method public androidx.app.slice.builders.ListBuilder addRange(java.util.function.Consumer<androidx.app.slice.builders.ListBuilder.RangeBuilder>);
+    method public androidx.app.slice.builders.ListBuilder addRow(androidx.app.slice.builders.ListBuilder.RowBuilder);
+    method public androidx.app.slice.builders.ListBuilder addRow(java.util.function.Consumer<androidx.app.slice.builders.ListBuilder.RowBuilder>);
+    method public androidx.app.slice.builders.ListBuilder addSeeMoreAction(android.app.PendingIntent);
+    method public androidx.app.slice.builders.ListBuilder addSeeMoreRow(androidx.app.slice.builders.ListBuilder.RowBuilder);
+    method public androidx.app.slice.builders.ListBuilder addSeeMoreRow(java.util.function.Consumer<androidx.app.slice.builders.ListBuilder.RowBuilder>);
+    method public androidx.app.slice.builders.ListBuilder setActions(androidx.app.slice.builders.ListBuilder.ActionBuilder);
+    method public androidx.app.slice.builders.ListBuilder setActions(java.util.function.Consumer<androidx.app.slice.builders.ListBuilder.ActionBuilder>);
+    method public androidx.app.slice.builders.ListBuilder setHeader(androidx.app.slice.builders.ListBuilder.HeaderBuilder);
+    method public androidx.app.slice.builders.ListBuilder setHeader(java.util.function.Consumer<androidx.app.slice.builders.ListBuilder.HeaderBuilder>);
+  }
+
+  public static class ListBuilder.ActionBuilder extends androidx.app.slice.builders.TemplateSliceBuilder {
+    ctor public ListBuilder.ActionBuilder(androidx.app.slice.builders.ListBuilder);
+    method public androidx.app.slice.builders.ListBuilder.ActionBuilder addAction(android.app.PendingIntent, android.graphics.drawable.Icon, java.lang.CharSequence, int);
+    method public androidx.app.slice.builders.ListBuilder.ActionBuilder addAction(android.app.PendingIntent, android.graphics.drawable.Icon, java.lang.CharSequence);
+  }
+
+  public static class ListBuilder.HeaderBuilder extends androidx.app.slice.builders.TemplateSliceBuilder {
+    ctor public ListBuilder.HeaderBuilder(androidx.app.slice.builders.ListBuilder);
+    method public androidx.app.slice.builders.ListBuilder.HeaderBuilder setContentIntent(android.app.PendingIntent);
+    method public androidx.app.slice.builders.ListBuilder.HeaderBuilder setSubtitle(java.lang.CharSequence);
+    method public androidx.app.slice.builders.ListBuilder.HeaderBuilder setSummarySubtitle(java.lang.CharSequence);
+    method public androidx.app.slice.builders.ListBuilder.HeaderBuilder setTitle(java.lang.CharSequence);
+  }
+
+  public static class ListBuilder.InputRangeBuilder extends androidx.app.slice.builders.TemplateSliceBuilder {
+    ctor public ListBuilder.InputRangeBuilder(androidx.app.slice.builders.ListBuilder);
+    method public androidx.app.slice.builders.ListBuilder.InputRangeBuilder setAction(android.app.PendingIntent);
+    method public androidx.app.slice.builders.ListBuilder.InputRangeBuilder setMax(int);
+    method public androidx.app.slice.builders.ListBuilder.InputRangeBuilder setThumb(android.graphics.drawable.Icon);
+    method public androidx.app.slice.builders.ListBuilder.InputRangeBuilder setTitle(java.lang.CharSequence);
+    method public androidx.app.slice.builders.ListBuilder.InputRangeBuilder setValue(int);
+  }
+
+  public static class ListBuilder.RangeBuilder extends androidx.app.slice.builders.TemplateSliceBuilder {
+    ctor public ListBuilder.RangeBuilder(androidx.app.slice.builders.ListBuilder);
+    method public androidx.app.slice.builders.ListBuilder.RangeBuilder setMax(int);
+    method public androidx.app.slice.builders.ListBuilder.RangeBuilder setTitle(java.lang.CharSequence);
+    method public androidx.app.slice.builders.ListBuilder.RangeBuilder setValue(int);
+  }
+
+  public static class ListBuilder.RowBuilder extends androidx.app.slice.builders.TemplateSliceBuilder {
+    ctor public ListBuilder.RowBuilder(androidx.app.slice.builders.ListBuilder);
+    ctor public ListBuilder.RowBuilder(androidx.app.slice.builders.ListBuilder, android.net.Uri);
+    ctor public ListBuilder.RowBuilder(android.content.Context, android.net.Uri);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder addEndItem(long);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder addEndItem(android.graphics.drawable.Icon);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder addEndItem(android.graphics.drawable.Icon, boolean);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder addEndItem(android.graphics.drawable.Icon, android.app.PendingIntent);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder addEndItem(android.graphics.drawable.Icon, android.app.PendingIntent, boolean);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder addToggle(android.app.PendingIntent, boolean);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder addToggle(android.app.PendingIntent, boolean, boolean);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder addToggle(android.app.PendingIntent, boolean, android.graphics.drawable.Icon);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder addToggle(android.app.PendingIntent, boolean, android.graphics.drawable.Icon, boolean);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder setContentIntent(android.app.PendingIntent);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder setSubtitle(java.lang.CharSequence);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder setSubtitle(java.lang.CharSequence, boolean);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder setTitle(java.lang.CharSequence);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder setTitle(java.lang.CharSequence, boolean);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder setTitleItem(long);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder setTitleItem(android.graphics.drawable.Icon);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder setTitleItem(android.graphics.drawable.Icon, boolean);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder setTitleItem(android.graphics.drawable.Icon, android.app.PendingIntent);
+    method public androidx.app.slice.builders.ListBuilder.RowBuilder setTitleItem(android.graphics.drawable.Icon, android.app.PendingIntent, boolean);
+  }
+
+  public abstract class TemplateSliceBuilder {
+    method public androidx.app.slice.Slice build();
+  }
+
+}
+
diff --git a/slices/builders/build.gradle b/slices/builders/build.gradle
new file mode 100644
index 0000000..ae7407b
--- /dev/null
+++ b/slices/builders/build.gradle
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryVersions
+import android.support.LibraryGroups
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    implementation(project(":slices-core"))
+    implementation project(":support-annotations")
+}
+
+supportLibrary {
+    name = "Slice builders"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SLICES
+    inceptionYear = "2017"
+    description = "A set of builders to create templates using SliceProvider APIs"
+    minSdkVersion = 24
+}
diff --git a/slices/builders/lint-baseline.xml b/slices/builders/lint-baseline.xml
new file mode 100644
index 0000000..2cadde1
--- /dev/null
+++ b/slices/builders/lint-baseline.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="4" by="lint 3.0.0">
+
+</issues>
diff --git a/design/AndroidManifest.xml b/slices/builders/src/main/AndroidManifest.xml
similarity index 82%
copy from design/AndroidManifest.xml
copy to slices/builders/src/main/AndroidManifest.xml
index 0eb8b85..75e31f1 100644
--- a/design/AndroidManifest.xml
+++ b/slices/builders/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source Project
+<!-- 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.
@@ -14,6 +14,6 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="android.support.design">
-    <uses-sdk android:minSdkVersion="14" />
+          package="androidx.app.slice.builders">
+    <uses-sdk android:minSdkVersion="28"/>
 </manifest>
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/GridBuilder.java b/slices/builders/src/main/java/androidx/app/slice/builders/GridBuilder.java
new file mode 100644
index 0000000..0dff405
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/GridBuilder.java
@@ -0,0 +1,347 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.builders;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
+
+import java.util.function.Consumer;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceSpecs;
+import androidx.app.slice.builders.impl.GridBuilderBasicImpl;
+import androidx.app.slice.builders.impl.GridBuilderListV1Impl;
+import androidx.app.slice.builders.impl.TemplateBuilderImpl;
+
+
+/**
+ * Builder to construct a row of slice content in a grid format.
+ * <p>
+ * A grid row is composed of cells, each cell can have a combination of text and images. For more
+ * details see {@link CellBuilder}.
+ * </p>
+ */
+public class GridBuilder extends TemplateSliceBuilder {
+
+    private androidx.app.slice.builders.impl.GridBuilder mImpl;
+    private boolean mHasSeeMore;
+
+    /**
+     * Create a builder which will construct a slice displayed in a grid format.
+     * @param uri Uri to tag for this slice.
+     */
+    public GridBuilder(@NonNull Context context, @NonNull Uri uri) {
+        super(new Slice.Builder(uri), context);
+    }
+
+    /**
+     * Create a builder which will construct a slice displayed in a grid format.
+     * @param parent The builder constructing the parent slice.
+     */
+    public GridBuilder(@NonNull ListBuilder parent) {
+        super(parent.getImpl().createGridBuilder());
+    }
+
+    @Override
+    @NonNull
+    public Slice build() {
+        return mImpl.buildIndividual();
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    @Override
+    protected TemplateBuilderImpl selectImpl() {
+        if (checkCompatible(SliceSpecs.GRID)) {
+            return new GridBuilderListV1Impl(getBuilder(), SliceSpecs.GRID);
+        } else if (checkCompatible(SliceSpecs.BASIC)) {
+            return new GridBuilderBasicImpl(getBuilder(), SliceSpecs.GRID);
+        }
+        return null;
+    }
+
+    @Override
+    void setImpl(TemplateBuilderImpl impl) {
+        mImpl = (androidx.app.slice.builders.impl.GridBuilder) impl;
+    }
+
+    /**
+     * Add a cell to the grid builder.
+     */
+    @NonNull
+    public GridBuilder addCell(@NonNull CellBuilder builder) {
+        mImpl.addCell((TemplateBuilderImpl) builder.mImpl);
+        return this;
+    }
+
+    /**
+     * Add a cell to the grid builder.
+     */
+    @RequiresApi(Build.VERSION_CODES.N)
+    @NonNull
+    public GridBuilder addCell(@NonNull Consumer<CellBuilder> c) {
+        CellBuilder b = new CellBuilder(this);
+        c.accept(b);
+        return addCell(b);
+    }
+
+    /**
+     * If all content in a slice cannot be shown, the cell added here may be displayed where the
+     * content is cut off.
+     * <p>
+     * This method should only be used if you want to display a custom cell to indicate more
+     * content, consider using {@link #addSeeMoreAction(PendingIntent)} otherwise. If you do
+     * choose to specify a custom cell, the cell should have
+     * {@link CellBuilder#setContentIntent(PendingIntent)} specified to take the user to an
+     * activity to see all of the content.
+     * </p>
+     * <p>
+     * Only one see more affordance can be added, this throws {@link IllegalStateException} if
+     * a row or action has been previously added.
+     * </p>
+     */
+    @NonNull
+    public GridBuilder addSeeMoreCell(@NonNull CellBuilder builder) {
+        if (mHasSeeMore) {
+            throw new IllegalStateException("Trying to add see more cell when one has "
+                    + "already been added");
+        }
+        mImpl.addSeeMoreCell((TemplateBuilderImpl) builder.mImpl);
+        mHasSeeMore = true;
+        return this;
+    }
+
+    /**
+     * If all content in a slice cannot be shown, the cell added here may be displayed where the
+     * content is cut off.
+     * <p>
+     * This method should only be used if you want to display a custom cell to indicate more
+     * content, consider using {@link #addSeeMoreAction(PendingIntent)} otherwise. If you do
+     * choose to specify a custom cell, the cell should have
+     * {@link CellBuilder#setContentIntent(PendingIntent)} specified to take the user to an
+     * activity to see all of the content.
+     * </p>
+     * <p>
+     * Only one see more affordance can be added, this throws {@link IllegalStateException} if
+     * a row or action has been previously added.
+     * </p>
+     */
+    @RequiresApi(Build.VERSION_CODES.N)
+    @NonNull
+    public GridBuilder addSeeMoreCell(@NonNull Consumer<CellBuilder> c) {
+        CellBuilder b = new CellBuilder(this);
+        c.accept(b);
+        return addSeeMoreCell(b);
+    }
+
+    /**
+     * If all content in a slice cannot be shown, a "see more" affordance may be displayed where
+     * the content is cut off. The action added here should take the user to an activity to see
+     * all of the content, and will be invoked when the "see more" affordance is tapped.
+     * <p>
+     * Only one see more affordance can be added, this throws {@link IllegalStateException} if
+     * a row or action has been previously added.
+     * </p>
+     */
+    @NonNull
+    public GridBuilder addSeeMoreAction(@NonNull PendingIntent intent) {
+        if (mHasSeeMore) {
+            throw new IllegalStateException("Trying to add see more action when one has "
+                    + "already been added");
+        }
+        mImpl.addSeeMoreAction(intent);
+        mHasSeeMore = true;
+        return this;
+    }
+
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    public androidx.app.slice.builders.impl.GridBuilder getImpl() {
+        return mImpl;
+    }
+
+    /**
+     * Sub-builder to construct a cell to be displayed in a grid.
+     * <p>
+     * Content added to a cell will be displayed in order vertically, for example the below code
+     * would construct a cell with "First text", and image below it, and then "Second text" below
+     * the image.
+     *
+     * <pre class="prettyprint">
+     * CellBuilder cb = new CellBuilder(parent, sliceUri);
+     * cb.addText("First text")
+     *   .addImage(middleIcon)
+     *   .addText("Second text");
+     * </pre>
+     *
+     * A cell can have at most two text items and one image.
+     * </p>
+     */
+    public static final class CellBuilder extends TemplateSliceBuilder {
+        private androidx.app.slice.builders.impl.GridBuilder.CellBuilder mImpl;
+
+        /**
+         * Create a builder which will construct a slice displayed as a cell in a grid.
+         * @param parent The builder constructing the parent slice.
+         */
+        public CellBuilder(@NonNull GridBuilder parent) {
+            super(parent.mImpl.createGridBuilder());
+        }
+
+        /**
+         * Create a builder which will construct a slice displayed as a cell in a grid.
+         * @param uri Uri to tag for this slice.
+         */
+        public CellBuilder(@NonNull GridBuilder parent, @NonNull Uri uri) {
+            super(parent.mImpl.createGridBuilder(uri));
+        }
+
+        @Override
+        void setImpl(TemplateBuilderImpl impl) {
+            mImpl = (androidx.app.slice.builders.impl.GridBuilder.CellBuilder) impl;
+        }
+
+        /**
+         * Adds text to the cell. There can be at most two text items, the first two added
+         * will be used, others will be ignored.
+         */
+        @NonNull
+        public CellBuilder addText(@NonNull CharSequence text) {
+            return addText(text, false /* isLoading */);
+        }
+
+        /**
+         * Adds text to the cell. There can be at most two text items, the first two added
+         * will be used, others will be ignored.
+         * <p>
+         * Use this method to specify content that will appear in the template once it's been
+         * loaded.
+         * </p>
+         * @param isLoading indicates whether the app is doing work to load the added content in the
+         *                  background or not.
+         */
+        @NonNull
+        public CellBuilder addText(@Nullable CharSequence text, boolean isLoading) {
+            mImpl.addText(text, isLoading);
+            return this;
+        }
+
+        /**
+         * Adds text to the cell. Text added with this method will be styled as a title.
+         * There can be at most two text items, the first two added will be used, others
+         * will be ignored.
+         */
+        @NonNull
+        public CellBuilder addTitleText(@NonNull CharSequence text) {
+            return addTitleText(text, false /* isLoading */);
+        }
+
+        /**
+         * Adds text to the cell. Text added with this method will be styled as a title.
+         * There can be at most two text items, the first two added will be used, others
+         * will be ignored.
+         * <p>
+         * Use this method to specify content that will appear in the template once it's been
+         * loaded.
+         * </p>
+         * @param isLoading indicates whether the app is doing work to load the added content in the
+         *                  background or not.
+         */
+        @NonNull
+        public CellBuilder addTitleText(@Nullable CharSequence text, boolean isLoading) {
+            mImpl.addTitleText(text, isLoading);
+            return this;
+        }
+
+        /**
+         * Adds an image to the cell that should be displayed as large as the cell allows.
+         * There can be at most one image, the first one added will be used, others will be ignored.
+         *
+         * @param image the image to display in the cell.
+         */
+        @NonNull
+        public CellBuilder addLargeImage(@NonNull Icon image) {
+            return addLargeImage(image, false /* isLoading */);
+        }
+
+        /**
+         * Adds an image to the cell that should be displayed as large as the cell allows.
+         * There can be at most one image, the first one added will be used, others will be ignored.
+         * <p>
+         * Use this method to specify content that will appear in the template once it's been
+         * loaded.
+         * </p>
+         * @param isLoading indicates whether the app is doing work to load the added content in the
+         *                  background or not.
+         */
+        @NonNull
+        public CellBuilder addLargeImage(@Nullable Icon image, boolean isLoading) {
+            mImpl.addLargeImage(image, isLoading);
+            return this;
+        }
+
+        /**
+         * Adds an image to the cell. There can be at most one image, the first one added
+         * will be used, others will be ignored.
+         *
+         * @param image the image to display in the cell.
+         */
+        @NonNull
+        public CellBuilder addImage(@NonNull Icon image) {
+            return addImage(image, false /* isLoading */);
+        }
+
+        /**
+         * Adds an image to the cell. There can be at most one image, the first one added
+         * will be used, others will be ignored.
+         * <p>
+         * Use this method to specify content that will appear in the template once it's been
+         * loaded.
+         * </p>
+         * @param isLoading indicates whether the app is doing work to load the added content in the
+         *                  background or not.
+         */
+        @NonNull
+        public CellBuilder addImage(@Nullable Icon image, boolean isLoading) {
+            mImpl.addImage(image, isLoading);
+            return this;
+        }
+
+        /**
+         * Sets the action to be invoked if the user taps on this cell in the row.
+         */
+        @NonNull
+        public CellBuilder setContentIntent(@NonNull PendingIntent intent) {
+            mImpl.setContentIntent(intent);
+            return this;
+        }
+    }
+}
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/ListBuilder.java b/slices/builders/src/main/java/androidx/app/slice/builders/ListBuilder.java
new file mode 100644
index 0000000..dbd3a98
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/ListBuilder.java
@@ -0,0 +1,879 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.builders;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
+
+import java.util.function.Consumer;
+
+import androidx.app.slice.SliceSpecs;
+import androidx.app.slice.builders.impl.ListBuilderBasicImpl;
+import androidx.app.slice.builders.impl.ListBuilderV1Impl;
+import androidx.app.slice.builders.impl.TemplateBuilderImpl;
+
+/**
+ * Builder to construct slice content in a list format.
+ * <p>
+ * Use this builder for showing rows of content which is composed of text, images, and actions. For
+ * more details see {@link RowBuilder}.
+ * </p>
+ * <p>
+ * Slices can be displayed in different formats:
+ * <ul>
+ *     <li>Shortcut - The slice is displayed as an icon with a text label.</li>
+ *     <li>Small - Only a single row of content is displayed in small format, to specify which
+ *         row to display in small format see {@link #setHeader(HeaderBuilder)}.</li>
+ *     <li>Large - As many rows of content are shown as possible. If the presenter of the slice
+ *         allows scrolling then all rows of content will be displayed in a scrollable view.</li>
+ * </ul>
+ * </p>
+ *
+ * @see RowBuilder
+ */
+public class ListBuilder extends TemplateSliceBuilder {
+
+    private boolean mHasSeeMore;
+    private androidx.app.slice.builders.impl.ListBuilder mImpl;
+
+    /**
+     * Create a builder which will construct a slice that will display rows of content.
+     * @param uri Uri to tag for this slice.
+     */
+    public ListBuilder(@NonNull Context context, @NonNull Uri uri) {
+        super(context, uri);
+    }
+
+    @Override
+    void setImpl(TemplateBuilderImpl impl) {
+        mImpl = (androidx.app.slice.builders.impl.ListBuilder) impl;
+    }
+
+    /**
+     * Add a row to list builder.
+     */
+    @NonNull
+    public ListBuilder addRow(@NonNull RowBuilder builder) {
+        mImpl.addRow((TemplateBuilderImpl) builder.mImpl);
+        return this;
+    }
+
+    /**
+     * Add a row the list builder.
+     */
+    @RequiresApi(api = Build.VERSION_CODES.N)
+    @NonNull
+    public ListBuilder addRow(@NonNull Consumer<RowBuilder> c) {
+        RowBuilder b = new RowBuilder(this);
+        c.accept(b);
+        return addRow(b);
+    }
+
+    /**
+     * Add a grid row to the list builder.
+     */
+    @NonNull
+    public ListBuilder addGrid(@NonNull GridBuilder builder) {
+        mImpl.addGrid((TemplateBuilderImpl) builder.getImpl());
+        return this;
+    }
+
+    /**
+     * Add a grid row to the list builder.
+     */
+    @RequiresApi(api = Build.VERSION_CODES.N)
+    @NonNull
+    public ListBuilder addGrid(@NonNull Consumer<GridBuilder> c) {
+        GridBuilder b = new GridBuilder(this);
+        c.accept(b);
+        return addGrid(b);
+    }
+
+    /**
+     * Adds a header to this template.
+     * <p>
+     * The header should contain a title that is representative of the content in this slice along
+     * with an intent that links to the app activity associated with this content.
+     */
+    @NonNull
+    public ListBuilder setHeader(@NonNull HeaderBuilder builder) {
+        mImpl.setHeader((TemplateBuilderImpl) builder.mImpl);
+        return this;
+    }
+
+    /**
+     * Adds a header to this template.
+     * <p>
+     * The header should contain a title that is representative of the content in this slice along
+     * with an intent that links to the app activity associated with this content.
+     */
+    @RequiresApi(api = Build.VERSION_CODES.N)
+    @NonNull
+    public ListBuilder setHeader(@NonNull Consumer<HeaderBuilder> c) {
+        HeaderBuilder b = new HeaderBuilder(this);
+        c.accept(b);
+        return setHeader(b);
+    }
+
+    /**
+     * Sets the group of actions for this template. These actions may be shown on the template in
+     * large or small formats. Generally these actions will be displayed in the order they were
+     * added to the {@link ActionBuilder}, however, if not all actions can be displayed then
+     * actions with a higher priority may be shown first.
+     *
+     * @see ActionBuilder#addAction(PendingIntent, Icon, CharSequence, int)
+     */
+    @NonNull
+    public ListBuilder setActions(@NonNull ActionBuilder builder) {
+        mImpl.setActions((TemplateBuilderImpl) builder.mImpl);
+        return this;
+    }
+
+    /**
+     * Sets the group of actions for this template. These actions may be shown on the template in
+     * large or small formats. Generally these actions will be displayed in the order they were
+     * added to the {@link ActionBuilder}, however, if not all actions can be displayed then
+     * actions with a higher priority may be shown first.
+     *
+     * @see ActionBuilder#addAction(PendingIntent, Icon, CharSequence, int)
+     */
+    @RequiresApi(api = Build.VERSION_CODES.N)
+    @NonNull
+    public ListBuilder setActions(@NonNull Consumer<ActionBuilder> c) {
+        ActionBuilder b = new ActionBuilder(this);
+        c.accept(b);
+        return setActions(b);
+    }
+
+    /**
+     * Sets the color to tint items displayed by this template (e.g. icons).
+     * @hide
+     */
+    @RestrictTo(LIBRARY_GROUP)
+    @NonNull
+    public ListBuilder setColor(int color) {
+        mImpl.setColor(color);
+        return this;
+    }
+
+    /**
+     * If all content in a slice cannot be shown, the row added here may be displayed where the
+     * content is cut off. This row should have an affordance to take the user to an activity to
+     * see all of the content.
+     * <p>
+     * This method should only be used if you want to display a custom row to indicate more
+     * content, consider using {@link #addSeeMoreAction(PendingIntent)} otherwise. If you do
+     * choose to specify a custom row, the row should have a content intent or action end item
+     * specified to take the user to an activity to see all of the content.
+     * </p>
+     * <p>
+     * Only one see more affordance can be added, this throws {@link IllegalStateException} if
+     * a row or action has been previously added.
+     * </p>
+     */
+    @NonNull
+    public ListBuilder addSeeMoreRow(@NonNull RowBuilder builder) {
+        if (mHasSeeMore) {
+            throw new IllegalArgumentException("Trying to add see more row when one has "
+                    + "already been added");
+        }
+        mImpl.addSeeMoreRow((TemplateBuilderImpl) builder.mImpl);
+        mHasSeeMore = true;
+        return this;
+    }
+
+    /**
+     * If all content in a slice cannot be shown, the row added here may be displayed where the
+     * content is cut off. This row should have an affordance to take the user to an activity to
+     * see all of the content.
+     * <p>
+     * This method should only be used if you want to display a custom row to indicate more
+     * content, consider using {@link #addSeeMoreAction(PendingIntent)} otherwise. If you do
+     * choose to specify a custom row, the row should have a content intent or action end item
+     * specified to take the user to an activity to see all of the content.
+     * </p>
+     * Only one see more affordance can be added, this throws {@link IllegalStateException} if
+     * a row or action has been previously added.
+     * </p>
+     */
+    @RequiresApi(api = Build.VERSION_CODES.N)
+    @NonNull
+    public ListBuilder addSeeMoreRow(@NonNull Consumer<RowBuilder> c) {
+        RowBuilder b = new RowBuilder(this);
+        c.accept(b);
+        return addSeeMoreRow(b);
+    }
+
+    /**
+     * If all content in a slice cannot be shown, a "see more" affordance may be displayed where
+     * the content is cut off. The action added here should take the user to an activity to see
+     * all of the content, and will be invoked when the "see more" affordance is tapped.
+     * <p>
+     * Only one see more affordance can be added, this throws {@link IllegalStateException} if
+     * a row or action has been previously added.
+     * </p>
+     */
+    @NonNull
+    public ListBuilder addSeeMoreAction(@NonNull PendingIntent intent) {
+        if (mHasSeeMore) {
+            throw new IllegalArgumentException("Trying to add see more action when one has "
+                    + "already been added");
+        }
+        mImpl.addSeeMoreAction(intent);
+        mHasSeeMore = true;
+        return this;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    @Override
+    protected TemplateBuilderImpl selectImpl() {
+        if (checkCompatible(SliceSpecs.LIST)) {
+            return new ListBuilderV1Impl(getBuilder(), SliceSpecs.LIST);
+        } else if (checkCompatible(SliceSpecs.BASIC)) {
+            return new ListBuilderBasicImpl(getBuilder(), SliceSpecs.BASIC);
+        }
+        return null;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    public androidx.app.slice.builders.impl.ListBuilder getImpl() {
+        return mImpl;
+    }
+
+    /**
+     * Add an input range row to the list builder.
+     */
+    @NonNull
+    public ListBuilder addInputRange(@NonNull InputRangeBuilder b) {
+        mImpl.addInputRange((TemplateBuilderImpl) b.mImpl);
+        return this;
+    }
+
+    /**
+     * Add an input range row to the list builder.
+     */
+    @NonNull
+    public ListBuilder addInputRange(@NonNull Consumer<InputRangeBuilder> c) {
+        InputRangeBuilder inputRangeBuilder = new InputRangeBuilder(this);
+        c.accept(inputRangeBuilder);
+        return addInputRange(inputRangeBuilder);
+    }
+
+    /**
+     * Add a range row to the list builder.
+     */
+    @NonNull
+    public ListBuilder addRange(@NonNull RangeBuilder rangeBuilder) {
+        mImpl.addRange((TemplateBuilderImpl) rangeBuilder.mImpl);
+        return this;
+    }
+
+    /**
+     * Add a range row to the list builder.
+     */
+    @NonNull
+    public ListBuilder addRange(@NonNull Consumer<RangeBuilder> c) {
+        RangeBuilder rangeBuilder = new RangeBuilder(this);
+        c.accept(rangeBuilder);
+        return addRange(rangeBuilder);
+    }
+
+    /**
+     * Builder to construct a range row.
+     */
+    public static class RangeBuilder extends TemplateSliceBuilder {
+        private androidx.app.slice.builders.impl.ListBuilder.RangeBuilder mImpl;
+
+        public RangeBuilder(@NonNull ListBuilder parent) {
+            super(parent.mImpl.createRangeBuilder());
+        }
+
+        /**
+         * Set the upper limit of the range. The default is 100.
+         */
+        @NonNull
+        public RangeBuilder setMax(int max) {
+            mImpl.setMax(max);
+            return this;
+        }
+
+        /**
+         * Set the current value of the range.
+         */
+        @NonNull
+        public RangeBuilder setValue(int value) {
+            mImpl.setValue(value);
+            return this;
+        }
+
+        /**
+         * Set the title.
+         */
+        @NonNull
+        public RangeBuilder setTitle(@NonNull CharSequence title) {
+            mImpl.setTitle(title);
+            return this;
+        }
+
+        @Override
+        void setImpl(TemplateBuilderImpl impl) {
+            mImpl = (androidx.app.slice.builders.impl.ListBuilder.RangeBuilder) impl;
+        }
+    }
+
+    /**
+     * Builder to construct a input range row.
+     */
+    public static class InputRangeBuilder extends TemplateSliceBuilder {
+        private androidx.app.slice.builders.impl.ListBuilder.InputRangeBuilder mImpl;
+
+        public InputRangeBuilder(@NonNull ListBuilder parent) {
+            super(parent.mImpl.createInputRangeBuilder());
+        }
+
+        /**
+         * Set the upper limit of the range. The default is 100.
+         */
+        @NonNull
+        public InputRangeBuilder setMax(int max) {
+            mImpl.setMax(max);
+            return this;
+        }
+
+        /**
+         * Set the current value of the range.
+         */
+        @NonNull
+        public InputRangeBuilder setValue(int value) {
+            mImpl.setValue(value);
+            return this;
+        }
+
+        /**
+         * Set the title.
+         */
+        @NonNull
+        public InputRangeBuilder setTitle(@NonNull CharSequence title) {
+            mImpl.setTitle(title);
+            return this;
+        }
+
+
+        /**
+         * Set the {@link PendingIntent} to send when the current value is updated.
+         */
+        @NonNull
+        public InputRangeBuilder setAction(@NonNull PendingIntent action) {
+            mImpl.setAction(action);
+            return this;
+        }
+
+        /**
+         * Set the {@link Icon} to be displayed as the thumb on the input range.
+         */
+        @NonNull
+        public InputRangeBuilder setThumb(@NonNull Icon thumb) {
+            mImpl.setThumb(thumb);
+            return this;
+        }
+
+        @Override
+        void setImpl(TemplateBuilderImpl impl) {
+            mImpl = (androidx.app.slice.builders.impl.ListBuilder.InputRangeBuilder) impl;
+        }
+    }
+
+    /**
+     * Sub-builder to construct a row of slice content.
+     * <p>
+     * Row content can have:
+     * <ul>
+     *     <li>Title item - This is only displayed if this is a list item in a large template, it
+     *     will not be shown if this template is being used for small format. The item appears at
+     *     the start of the template. There can only be one title item displayed, and it could be a
+     *     timestamp, image, or a tappable icon.</li>
+     *     <li>Title - Formatted as a title.</li>
+     *     <li>Subtitle - Appears below the title (if one exists) and is formatted as normal text.
+     *     </li>
+     *     <li>End item -  Appears at the end of the template, there can be multiple end items but
+     *     they are only shown if there's enough space. End items can be a timestamp, image, or a
+     *     tappable icon.</li>
+     * </ul>
+     * </p>
+     *
+     * @see ListBuilder
+     */
+    public static class RowBuilder extends TemplateSliceBuilder {
+
+        private androidx.app.slice.builders.impl.ListBuilder.RowBuilder mImpl;
+
+        private boolean mHasEndActionOrToggle;
+        private boolean mHasEndImage;
+        private boolean mHasDefaultToggle;
+        private boolean mHasTimestamp;
+
+        /**
+         * Create a builder which will construct a slice displayed in a row format.
+         * @param parent The builder constructing the parent slice.
+         */
+        public RowBuilder(@NonNull ListBuilder parent) {
+            super(parent.mImpl.createRowBuilder());
+        }
+
+        /**
+         * Create a builder which will construct a slice displayed in a row format.
+         * @param uri Uri to tag for this slice.
+         */
+        public RowBuilder(@NonNull ListBuilder parent, @NonNull Uri uri) {
+            super(parent.mImpl.createRowBuilder(uri));
+        }
+
+        /**
+         * Create a builder which will construct a slice displayed in a row format.
+         * @param uri Uri to tag for this slice.
+         */
+        public RowBuilder(@NonNull Context context, @NonNull Uri uri) {
+            super(new ListBuilder(context, uri).mImpl.createRowBuilder(uri));
+        }
+
+        /**
+         * Sets the title item to be the provided timestamp. Only one timestamp can be added, if
+         * one is already added this will throw {@link IllegalArgumentException}.
+         * <p>
+         * There can only be one title item, this will replace any other title
+         * items that may have been set.
+         */
+        @NonNull
+        public RowBuilder setTitleItem(long timeStamp) {
+            if (mHasTimestamp) {
+                throw new IllegalArgumentException("Trying to add a timestamp when one has "
+                        + "already been added");
+            }
+            mImpl.setTitleItem(timeStamp);
+            mHasTimestamp = true;
+            return this;
+        }
+
+        /**
+         * Sets the title item to be the provided icon. There can only be one title item, this
+         * will replace any other title items that may have been set.
+         */
+        @NonNull
+        public RowBuilder setTitleItem(@NonNull Icon icon) {
+            mImpl.setTitleItem(icon);
+            return this;
+        }
+
+        /**
+         * Sets the title item to be the provided icon. There can only be one title item, this
+         * will replace any other title items that may have been set.
+         * <p>
+         * Use this method to specify content that will appear in the template once it's been
+         * loaded.
+         * </p>
+         * @param isLoading indicates whether the app is doing work to load the added content in the
+         *                  background or not.
+         */
+        @NonNull
+        public RowBuilder setTitleItem(@Nullable Icon icon, boolean isLoading) {
+            mImpl.setTitleItem(icon, isLoading);
+            return this;
+        }
+
+        /**
+         * Sets the title item to be a tappable icon. There can only be one title item, this will
+         * replace any other title items that may have been set.
+         */
+        @NonNull
+        public RowBuilder setTitleItem(@NonNull Icon icon, @NonNull PendingIntent action) {
+            return setTitleItem(icon, action, false /* isLoading */);
+        }
+
+        /**
+         * Sets the title item to be a tappable icon. There can only be one title item, this will
+         * replace any other title items that may have been set.
+         * <p>
+         * Use this method to specify content that will appear in the template once it's been
+         * loaded.
+         * </p>
+         * @param isLoading indicates whether the app is doing work to load the added content in the
+         *                  background or not.
+         */
+        @NonNull
+        public RowBuilder setTitleItem(@NonNull Icon icon, @NonNull PendingIntent action,
+                boolean isLoading) {
+            mImpl.setTitleItem(icon, action, isLoading);
+            return this;
+        }
+
+        /**
+         * Sets the action to be invoked if the user taps on the main content of the template.
+         */
+        @NonNull
+        public RowBuilder setContentIntent(@NonNull PendingIntent action) {
+            mImpl.setContentIntent(action);
+            return this;
+        }
+
+        /**
+         * Sets the title text.
+         */
+        @NonNull
+        public RowBuilder setTitle(@NonNull CharSequence title) {
+            mImpl.setTitle(title);
+            return this;
+        }
+
+        /**
+         * Sets the title text.
+         * <p>
+         * Use this method to specify content that will appear in the template once it's been
+         * loaded.
+         * </p>
+         * @param isLoading indicates whether the app is doing work to load the added content in the
+         *                  background or not.
+         */
+        @NonNull
+        public RowBuilder setTitle(@Nullable CharSequence title, boolean isLoading) {
+            mImpl.setTitle(title, isLoading);
+            return this;
+        }
+
+        /**
+         * Sets the subtitle text.
+         */
+        @NonNull
+        public RowBuilder setSubtitle(@NonNull CharSequence subtitle) {
+            return setSubtitle(subtitle, false /* isLoading */);
+        }
+
+        /**
+         * Sets the subtitle text.
+         * <p>
+         * Use this method to specify content that will appear in the template once it's been
+         * loaded.
+         * </p>
+         * @param isLoading indicates whether the app is doing work to load the added content in the
+         *                  background or not.
+         */
+        @NonNull
+        public RowBuilder setSubtitle(@Nullable CharSequence subtitle, boolean isLoading) {
+            mImpl.setSubtitle(subtitle, isLoading);
+            return this;
+        }
+
+        /**
+         * Adds a timestamp to be displayed at the end of the row. Only one timestamp can be added,
+         * if one is already added this will throw {@link IllegalArgumentException}.
+         */
+        @NonNull
+        public RowBuilder addEndItem(long timeStamp) {
+            if (mHasTimestamp) {
+                throw new IllegalArgumentException("Trying to add a timestamp when one has "
+                        + "already been added");
+            }
+            mImpl.addEndItem(timeStamp);
+            mHasTimestamp = true;
+            return this;
+        }
+
+        /**
+         * Adds an icon to be displayed at the end of the row. A mixture of icons and tappable
+         * icons is not permitted. If an action has already been added this will throw
+         * {@link IllegalArgumentException}.
+         */
+        @NonNull
+        public RowBuilder addEndItem(@NonNull Icon icon) {
+            return addEndItem(icon, false /* isLoading */);
+        }
+
+        /**
+         * Adds an icon to be displayed at the end of the row. A mixture of icons and tappable
+         * icons is not permitted. If an action has already been added this will throw
+         * {@link IllegalArgumentException}.
+         * <p>
+         * Use this method to specify content that will appear in the template once it's been
+         * loaded.
+         * </p>
+         * @param isLoading indicates whether the app is doing work to load the added content in the
+         *                  background or not.
+         */
+        @NonNull
+        public RowBuilder addEndItem(@NonNull Icon icon, boolean isLoading) {
+            if (mHasEndActionOrToggle) {
+                throw new IllegalArgumentException("Trying to add an icon to end items when an"
+                        + "action has already been added. End items cannot have a mixture of "
+                        + "tappable icons and icons.");
+            }
+            mImpl.addEndItem(icon, isLoading);
+            mHasEndImage = true;
+            return this;
+        }
+
+        /**
+         * Adds a tappable icon to be displayed at the end of the row. A mixture of icons and
+         * tappable icons is not permitted. If an icon has already been added, this will throw
+         * {@link IllegalArgumentException}.
+         */
+        @NonNull
+        public RowBuilder addEndItem(@NonNull Icon icon, @NonNull PendingIntent action) {
+            return addEndItem(icon, action, false /* isLoading */);
+        }
+
+        /**
+         * Adds a tappable icon to be displayed at the end of the row. A mixture of icons and
+         * tappable icons is not permitted. If an icon has already been added, this will throw
+         * {@link IllegalArgumentException}.
+         * <p>
+         * Use this method to specify content that will appear in the template once it's been
+         * loaded.
+         * </p>
+         * @param isLoading indicates whether the app is doing work to load the added content in the
+         *                  background or not.
+         */
+        @NonNull
+        public RowBuilder addEndItem(@Nullable Icon icon, @Nullable PendingIntent action,
+                boolean isLoading) {
+            mImpl.addEndItem(icon, action, isLoading);
+            return this;
+        }
+
+        /**
+         * Adds a toggle action to be displayed at the end of the row. A mixture of icons and
+         * tappable icons is not permitted. If an icon has already been added, this will throw an
+         * {@link IllegalArgumentException}.
+         */
+        @NonNull
+        public RowBuilder addToggle(@NonNull PendingIntent action, boolean isChecked) {
+            return addToggle(action, isChecked, null, false /* isLoading */);
+        }
+
+        /**
+         * Adds a toggle action to be displayed at the end of the row. A mixture of icons and
+         * tappable icons is not permitted. If an icon has already been added, this will throw an
+         * {@link IllegalArgumentException}.
+         * <p>
+         * Use this method to specify content that will appear in the template once it's been
+         * loaded.
+         * </p>
+         * @param isLoading indicates whether the app is doing work to load the added content in the
+         *                  background or not.
+         */
+        @NonNull
+        public RowBuilder addToggle(@NonNull PendingIntent action, boolean isChecked,
+                boolean isLoading) {
+            return addToggleInternal(action, isChecked, null, isLoading);
+        }
+
+        /**
+         * Adds a toggle action to be displayed with custom icons to represent checked and
+         * unchecked state at the end of the row. A mixture of icons and tappable icons is not
+         * permitted. If an icon has already been added, this will throw an
+         * {@link IllegalArgumentException}.
+         */
+        @NonNull
+        public RowBuilder addToggle(@NonNull PendingIntent action, boolean isChecked,
+                @NonNull Icon icon) {
+            return addToggle(action, isChecked, icon, false /* isLoading */);
+        }
+
+        /**
+         * Adds a toggle action to be displayed with custom icons to represent checked and
+         * unchecked state at the end of the row. A mixture of icons and tappable icons is not
+         * permitted. If an icon has already been added, this will throw an
+         * {@link IllegalArgumentException}.
+         * <p>
+         * Use this method to specify content that will appear in the template once it's been
+         * loaded.
+         * </p>
+         * @param isLoading indicates whether the app is doing work to load the added content in the
+         *                  background or not.
+         */
+        @NonNull
+        public RowBuilder addToggle(@NonNull PendingIntent action, boolean isChecked,
+                @NonNull Icon icon, boolean isLoading) {
+            return addToggleInternal(action, isChecked, icon, isLoading);
+        }
+
+        private RowBuilder addToggleInternal(@NonNull PendingIntent action, boolean isChecked,
+                @Nullable Icon icon, boolean isLoading) {
+            if (mHasEndImage) {
+                throw new IllegalStateException("Trying to add a toggle to end items when an "
+                        + "icon has already been added. End items cannot have a mixture of "
+                        + "tappable icons and icons.");
+            }
+            if (mHasDefaultToggle) {
+                throw new IllegalStateException("Only one non-custom toggle can be added "
+                        + "in a single row. If you would like to include multiple toggles "
+                        + "in a row, set a custom icon for each toggle.");
+            }
+            mImpl.addToggle(action, isChecked, icon, isLoading);
+            mHasDefaultToggle = icon == null;
+            mHasEndActionOrToggle = true;
+            return this;
+        }
+
+        @Override
+        void setImpl(TemplateBuilderImpl impl) {
+            mImpl = (androidx.app.slice.builders.impl.ListBuilder.RowBuilder) impl;
+        }
+    }
+
+    /**
+     * Builder to construct a header. A header is displayed at the top of a list and can have
+     * a title, subtitle, and an action.
+     *
+     * @see ListBuilder#setHeader(HeaderBuilder)
+     */
+    public static class HeaderBuilder extends TemplateSliceBuilder {
+        private androidx.app.slice.builders.impl.ListBuilder.HeaderBuilder mImpl;
+
+        /**
+         * Create builder for header templates.
+         */
+        public HeaderBuilder(@NonNull ListBuilder parent) {
+            super(parent.mImpl.createHeaderBuilder());
+        }
+
+        /**
+         * Create builder for header templates.
+         * @hide
+         */
+        @RestrictTo(LIBRARY_GROUP)
+        public HeaderBuilder(@NonNull ListBuilder parent, @NonNull Uri uri) {
+            super(parent.mImpl.createHeaderBuilder(uri));
+        }
+
+        /**
+         * Sets the title to be shown in this header.
+         */
+        @NonNull
+        public HeaderBuilder setTitle(@NonNull CharSequence title) {
+            mImpl.setTitle(title);
+            return this;
+        }
+
+        /**
+         * Sets the subtitle to be shown in this header.
+         */
+        @NonNull
+        public HeaderBuilder setSubtitle(@NonNull CharSequence subtitle) {
+            mImpl.setSubtitle(subtitle);
+            return this;
+        }
+
+        /**
+         * Sets the summary subtitle to be shown in this header. If unset, the normal subtitle
+         * will be used. The summary is used when the parent template is presented in a
+         * small format.
+         */
+        @NonNull
+        public HeaderBuilder setSummarySubtitle(@NonNull CharSequence summarySubtitle) {
+            mImpl.setSummarySubtitle(summarySubtitle);
+            return this;
+        }
+
+        /**
+         * Sets the pending intent to activate when the header is activated.
+         */
+        @NonNull
+        public HeaderBuilder setContentIntent(@NonNull PendingIntent intent) {
+            mImpl.setContentIntent(intent);
+            return this;
+        }
+
+        @Override
+        void setImpl(TemplateBuilderImpl impl) {
+            mImpl = (androidx.app.slice.builders.impl.ListBuilder.HeaderBuilder) impl;
+        }
+    }
+
+    /**
+     * Builder to construct a group of actions.
+     *
+     * @see ListBuilder#setActions(ActionBuilder)
+     */
+    public static class ActionBuilder extends TemplateSliceBuilder  {
+        private androidx.app.slice.builders.impl.ListBuilder.ActionBuilder mImpl;
+
+        /**
+         * Create a builder to construct a group of actions
+         */
+        public ActionBuilder(@NonNull ListBuilder parent) {
+            super(parent.mImpl.createActionBuilder());
+        }
+
+        /**
+         * Create a builder to construct a group of actions
+         * @hide
+         */
+        @RestrictTo(LIBRARY_GROUP)
+        public ActionBuilder(@NonNull ListBuilder parent, @NonNull Uri uri) {
+            super(parent.mImpl.createHeaderBuilder(uri));
+        }
+
+        /**
+         * Adds an action to this builder.
+         *
+         * @param action the pending intent to send when the action is activated.
+         * @param actionIcon the icon to display for this action.
+         * @param contentDescription the content description to use for accessibility.
+         * @param priority what priority to display this action in, with the lowest priority having
+         *                 the highest ranking.
+         */
+        @NonNull
+        public ActionBuilder addAction(@NonNull PendingIntent action, @NonNull Icon actionIcon,
+                @NonNull CharSequence contentDescription, int priority) {
+            mImpl.addAction(action, actionIcon, contentDescription, priority);
+            return this;
+        }
+
+        /**
+         * Adds an action to this builder.
+         *
+         * @param action the pending intent to send when the action is activated.
+         * @param actionIcon the icon to display for this action.
+         * @param contentDescription the content description to use for accessibility.
+         */
+        @NonNull
+        public ActionBuilder addAction(@NonNull PendingIntent action, @NonNull Icon actionIcon,
+                @NonNull CharSequence contentDescription) {
+            return addAction(action, actionIcon, contentDescription, -1);
+        }
+
+        @Override
+        void setImpl(TemplateBuilderImpl impl) {
+            mImpl = (androidx.app.slice.builders.impl.ListBuilder.ActionBuilder) impl;
+        }
+    }
+}
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/MessagingSliceBuilder.java b/slices/builders/src/main/java/androidx/app/slice/builders/MessagingSliceBuilder.java
new file mode 100644
index 0000000..e51fd0b
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/MessagingSliceBuilder.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.builders;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
+import android.content.Context;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
+
+import java.util.function.Consumer;
+
+import androidx.app.slice.SliceSpecs;
+import androidx.app.slice.builders.impl.MessagingBasicImpl;
+import androidx.app.slice.builders.impl.MessagingBuilder;
+import androidx.app.slice.builders.impl.MessagingListV1Impl;
+import androidx.app.slice.builders.impl.MessagingV1Impl;
+import androidx.app.slice.builders.impl.TemplateBuilderImpl;
+
+/**
+ * Builder to construct slice content in a messaging format.
+ * @hide
+ */
+@RestrictTo(LIBRARY_GROUP)
+public class MessagingSliceBuilder extends TemplateSliceBuilder {
+
+    /**
+     * The maximum number of messages that will be retained in the Slice itself (the
+     * number displayed is up to the platform).
+     */
+    public static final int MAXIMUM_RETAINED_MESSAGES = 50;
+
+    private MessagingBuilder mBuilder;
+
+    /**
+     * Create a MessagingSliceBuilder with the specified uri.
+     */
+    public MessagingSliceBuilder(@NonNull Context context, @NonNull Uri uri) {
+        super(context, uri);
+    }
+
+    /**
+     * Add a subslice to this builder.
+     */
+    public MessagingSliceBuilder add(MessageBuilder builder) {
+        mBuilder.add((TemplateBuilderImpl) builder.mImpl);
+        return this;
+    }
+
+    /**
+     * Add a subslice to this builder.
+     */
+    @RequiresApi(api = Build.VERSION_CODES.N)
+    public MessagingSliceBuilder add(Consumer<MessageBuilder> c) {
+        MessageBuilder b = new MessageBuilder(this);
+        c.accept(b);
+        return add(b);
+    }
+
+    @Override
+    void setImpl(TemplateBuilderImpl impl) {
+        mBuilder = (MessagingBuilder) impl;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    @Override
+    protected TemplateBuilderImpl selectImpl() {
+        if (checkCompatible(SliceSpecs.MESSAGING)) {
+            return new MessagingV1Impl(getBuilder(), SliceSpecs.MESSAGING);
+        } else if (checkCompatible(SliceSpecs.LIST)) {
+            return new MessagingListV1Impl(getBuilder(), SliceSpecs.LIST);
+        } else if (checkCompatible(SliceSpecs.BASIC)) {
+            return new MessagingBasicImpl(getBuilder(), SliceSpecs.BASIC);
+        }
+        return null;
+    }
+
+    /**
+     * Builder for adding a message to {@link MessagingSliceBuilder}.
+     */
+    public static final class MessageBuilder extends TemplateSliceBuilder {
+
+        private MessagingBuilder.MessageBuilder mImpl;
+
+        /**
+         * Creates a MessageBuilder with the specified parent.
+         */
+        public MessageBuilder(MessagingSliceBuilder parent) {
+            super(parent.mBuilder.createMessageBuilder());
+        }
+
+        /**
+         * Add the icon used to display contact in the messaging experience
+         */
+        public MessageBuilder addSource(Icon source) {
+            mImpl.addSource(source);
+            return this;
+        }
+
+        /**
+         * Add the text to be used for this message.
+         */
+        public MessageBuilder addText(CharSequence text) {
+            mImpl.addText(text);
+            return this;
+        }
+
+        /**
+         * Add the time at which this message arrived in ms since Unix epoch
+         */
+        public MessageBuilder addTimestamp(long timestamp) {
+            mImpl.addTimestamp(timestamp);
+            return this;
+        }
+
+        @Override
+        void setImpl(TemplateBuilderImpl impl) {
+            mImpl = (MessagingBuilder.MessageBuilder) impl;
+        }
+    }
+}
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/TemplateSliceBuilder.java b/slices/builders/src/main/java/androidx/app/slice/builders/TemplateSliceBuilder.java
new file mode 100644
index 0000000..f0a495c
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/TemplateSliceBuilder.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.builders;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.content.Context;
+import android.net.Uri;
+import android.support.annotation.RestrictTo;
+import android.util.Log;
+import android.util.Pair;
+
+import java.util.Arrays;
+import java.util.List;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceProvider;
+import androidx.app.slice.SliceSpec;
+import androidx.app.slice.SliceSpecs;
+import androidx.app.slice.builders.impl.TemplateBuilderImpl;
+
+/**
+ * Base class of builders of various template types.
+ */
+public abstract class TemplateSliceBuilder {
+
+    private static final String TAG = "TemplateSliceBuilder";
+
+    private final Slice.Builder mBuilder;
+    private final Context mContext;
+    private final TemplateBuilderImpl mImpl;
+    private List<SliceSpec> mSpecs;
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    protected TemplateSliceBuilder(TemplateBuilderImpl impl) {
+        mContext = null;
+        mBuilder = null;
+        mImpl = impl;
+        setImpl(impl);
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    protected TemplateSliceBuilder(Slice.Builder b, Context context) {
+        mBuilder = b;
+        mContext = context;
+        mSpecs = getSpecs();
+        mImpl = selectImpl();
+        if (mImpl == null) {
+            throw new IllegalArgumentException("No valid specs found");
+        }
+        setImpl(mImpl);
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    public TemplateSliceBuilder(Context context, Uri uri) {
+        mBuilder = new Slice.Builder(uri);
+        mContext = context;
+        mSpecs = getSpecs();
+        mImpl = selectImpl();
+        if (mImpl == null) {
+            throw new IllegalArgumentException("No valid specs found");
+        }
+        setImpl(mImpl);
+    }
+
+    /**
+     * Construct the slice.
+     */
+    public Slice build() {
+        return mImpl.build();
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    protected Slice.Builder getBuilder() {
+        return mBuilder;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    abstract void setImpl(TemplateBuilderImpl impl);
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    protected TemplateBuilderImpl selectImpl() {
+        return null;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    protected boolean checkCompatible(SliceSpec candidate) {
+        final int size = mSpecs.size();
+        for (int i = 0; i < size; i++) {
+            if (mSpecs.get(i).canRender(candidate)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private List<SliceSpec> getSpecs() {
+        if (SliceProvider.getCurrentSpecs() != null) {
+            return SliceProvider.getCurrentSpecs();
+        }
+        // TODO: Support getting specs from pinned info.
+        Log.w(TAG, "Not currently bunding a slice");
+        return Arrays.asList(SliceSpecs.BASIC);
+    }
+
+    /**
+     * This is for typing, to clean up the code.
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    static <T> Pair<SliceSpec, Class<? extends TemplateBuilderImpl>> pair(SliceSpec spec,
+            Class<T> cls) {
+        return new Pair(spec, cls);
+    }
+}
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilder.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilder.java
new file mode 100644
index 0000000..302e1b3
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilder.java
@@ -0,0 +1,164 @@
+/*
+ * 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.app.slice.builders.impl;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.app.PendingIntent;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+
+import androidx.app.slice.Slice;
+
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public interface GridBuilder {
+    /**
+     * Create an TemplateBuilderImpl that implements {@link CellBuilder}.
+     */
+    TemplateBuilderImpl createGridBuilder();
+
+    /**
+     * Create an TemplateBuilderImpl that implements {@link CellBuilder} with the specified Uri.
+     */
+    TemplateBuilderImpl createGridBuilder(Uri uri);
+
+    /**
+     * Add a cell to this builder. Expected to be a builder from {@link #createGridBuilder}.
+     */
+    void addCell(TemplateBuilderImpl impl);
+
+    /**
+     * If all content in a slice cannot be shown, the cell added here will be displayed where the
+     * content is cut off. This cell should have an affordance to take the user to an activity to
+     * see all of the content. Expected to be a builder from {@link #createGridBuilder}.
+     * <p>
+     * Only one see more affordance can be added, this throws {@link IllegalStateException} if
+     * a row or action has been previously added.
+     * </p>
+     */
+    void addSeeMoreCell(TemplateBuilderImpl impl);
+
+    /**
+     * If all content in a slice cannot be shown, a "see more" affordance will be displayed where
+     * the content is cut off. The action added here should take the user to an activity to see
+     * all of the content, and will be invoked when the "see more" affordance is tapped.
+     * <p>
+     * Only one see more affordance can be added, this throws {@link IllegalStateException} if
+     * a row or action has been previously added.
+     * </p>
+     */
+    void addSeeMoreAction(PendingIntent intent);
+
+    /**
+     * Builds a standalone slice of this grid builder (i.e. not contained within a List).
+     */
+    Slice buildIndividual();
+
+    /**
+     */
+    interface CellBuilder {
+        /**
+         * Adds text to the cell. There can be at most two text items, the first two added
+         * will be used, others will be ignored.
+         */
+        @NonNull
+        void addText(@NonNull CharSequence text);
+
+        /**
+         * Adds text to the cell. There can be at most two text items, the first two added
+         * will be used, others will be ignored.
+         * <p>
+         * When set to true, the parameter {@code isLoading} indicates that the app is doing work
+         * to load this content in the background, in this case the template displays a placeholder
+         * until updated.
+         */
+        @NonNull
+        void addText(@Nullable CharSequence text, boolean isLoading);
+
+        /**
+         * Adds text to the cell. Text added with this method will be styled as a title.
+         * There can be at most two text items, the first two added will be used, others
+         * will be ignored.
+         */
+        @NonNull
+        void addTitleText(@NonNull CharSequence text);
+
+        /**
+         * Adds text to the cell. Text added with this method will be styled as a title.
+         * There can be at most two text items, the first two added will be used, others
+         * will be ignored.
+         * <p>
+         * When set to true, the parameter {@code isLoading} indicates that the app is doing work
+         * to load this content in the background, in this case the template displays a placeholder
+         * until updated.
+         */
+        @NonNull
+        void addTitleText(@Nullable CharSequence text, boolean isLoading);
+
+        /**
+         * Adds an image to the cell that should be displayed as large as the cell allows.
+         * There can be at most one image, the first one added will be used, others will be ignored.
+         *
+         * @param image the image to display in the cell.
+         */
+        @NonNull
+        void addLargeImage(@NonNull Icon image);
+
+        /**
+         * Adds an image to the cell that should be displayed as large as the cell allows.
+         * There can be at most one image, the first one added will be used, others will be ignored.
+         * <p>
+         * When set to true, the parameter {@code isLoading} indicates that the app is doing work
+         * to load this content in the background, in this case the template displays a placeholder
+         * until updated.
+         */
+        @NonNull
+        void addLargeImage(@Nullable Icon image, boolean isLoading);
+
+        /**
+         * Adds an image to the cell. There can be at most one image, the first one added
+         * will be used, others will be ignored.
+         *
+         * @param image the image to display in the cell.
+         */
+        @NonNull
+        void addImage(@NonNull Icon image);
+
+        /**
+         * Adds an image to the cell. There can be at most one image, the first one added
+         * will be used, others will be ignored.
+         * <p>
+         * When set to true, the parameter {@code isLoading} indicates that the app is doing work
+         * to load this content in the background, in this case the template displays a placeholder
+         * until updated.l.
+         */
+        @NonNull
+        void addImage(@NonNull Icon image, boolean isLoading);
+
+        /**
+         * Sets the action to be invoked if the user taps on this cell in the row.
+         */
+        @NonNull
+        void setContentIntent(@NonNull PendingIntent intent);
+    }
+}
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilderBasicImpl.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilderBasicImpl.java
new file mode 100644
index 0000000..67bbfa1
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilderBasicImpl.java
@@ -0,0 +1,178 @@
+/*
+ * 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.app.slice.builders.impl;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.app.PendingIntent;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceSpec;
+
+
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public class GridBuilderBasicImpl extends TemplateBuilderImpl implements GridBuilder {
+
+    /**
+     */
+    public GridBuilderBasicImpl(Slice.Builder b, SliceSpec spec) {
+        super(b, spec);
+    }
+
+    /**
+     */
+    @Override
+    public TemplateBuilderImpl createGridBuilder() {
+        return new CellBuilder(this);
+    }
+
+    /**
+     */
+    @Override
+    public TemplateBuilderImpl createGridBuilder(Uri uri) {
+        return new CellBuilder(uri);
+    }
+
+    /**
+     */
+    @Override
+    public void addCell(TemplateBuilderImpl impl) {
+        // TODO: Consider extracting some grid content for the basic version.
+    }
+
+    /**
+     */
+    @Override
+    public void addSeeMoreCell(TemplateBuilderImpl impl) {
+    }
+
+    /**
+     */
+    @Override
+    public void addSeeMoreAction(PendingIntent intent) {
+    }
+
+    /**
+     */
+    @Override
+    public Slice buildIndividual() {
+        // Empty slice, nothing useful from a grid to basic.
+        return getBuilder().build();
+    }
+
+    /**
+     */
+    @Override
+    public void apply(Slice.Builder builder) {
+
+    }
+
+    /**
+     */
+    public static final class CellBuilder extends TemplateBuilderImpl implements
+            GridBuilder.CellBuilder {
+
+        /**
+         */
+        public CellBuilder(@NonNull GridBuilderBasicImpl parent) {
+            super(parent.createChildBuilder(), null);
+        }
+
+        /**
+         */
+        public CellBuilder(@NonNull Uri uri) {
+            super(new Slice.Builder(uri), null);
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addText(@NonNull CharSequence text) {
+        }
+
+        /**
+         */
+        @Override
+        public void addText(@Nullable CharSequence text, boolean isLoading) {
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addTitleText(@NonNull CharSequence text) {
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addTitleText(@Nullable CharSequence text, boolean isLoading) {
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addLargeImage(@NonNull Icon image) {
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addLargeImage(@Nullable Icon image, boolean isLoading) {
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addImage(@NonNull Icon image) {
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addImage(@Nullable Icon image, boolean isLoading) {
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void setContentIntent(@NonNull PendingIntent intent) {
+        }
+
+        /**
+         */
+        @Override
+        public void apply(Slice.Builder builder) {
+
+        }
+    }
+}
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilderListV1Impl.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilderListV1Impl.java
new file mode 100644
index 0000000..fe755bd
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilderListV1Impl.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.builders.impl;
+
+import static android.app.slice.Slice.HINT_HORIZONTAL;
+import static android.app.slice.Slice.HINT_LARGE;
+import static android.app.slice.Slice.HINT_LIST_ITEM;
+import static android.app.slice.Slice.HINT_PARTIAL;
+import static android.app.slice.Slice.HINT_SEE_MORE;
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.app.PendingIntent;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceSpec;
+
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public class GridBuilderListV1Impl extends TemplateBuilderImpl implements GridBuilder {
+
+    /**
+     */
+    public GridBuilderListV1Impl(@NonNull Slice.Builder builder, SliceSpec spec) {
+        super(builder, spec);
+    }
+
+    /**
+     */
+    @Override
+    public void apply(Slice.Builder builder) {
+        builder.addHints(HINT_HORIZONTAL, HINT_LIST_ITEM);
+    }
+
+    /**
+     */
+    @Override
+    public TemplateBuilderImpl createGridBuilder() {
+        return new CellBuilder(this);
+    }
+
+    /**
+     */
+    @Override
+    public TemplateBuilderImpl createGridBuilder(Uri uri) {
+        return new CellBuilder(uri);
+    }
+
+    /**
+     */
+    @Override
+    public void addCell(TemplateBuilderImpl builder) {
+        getBuilder().addSubSlice(builder.build());
+    }
+
+
+    /**
+     */
+    @Override
+    public void addSeeMoreCell(@NonNull TemplateBuilderImpl builder) {
+        builder.getBuilder().addHints(HINT_SEE_MORE);
+        getBuilder().addSubSlice(builder.build());
+    }
+
+    /**
+     */
+    @Override
+    public void addSeeMoreAction(PendingIntent intent) {
+        getBuilder().addSubSlice(
+                new Slice.Builder(getBuilder())
+                        .addHints(HINT_SEE_MORE)
+                        .addAction(intent, new Slice.Builder(getBuilder()).build(), null)
+                        .build());
+    }
+
+    /**
+     */
+    @Override
+    public Slice buildIndividual() {
+        return new Slice.Builder(getBuilder()).addHints(HINT_HORIZONTAL, HINT_LIST_ITEM)
+                .addSubSlice(getBuilder()
+                        .addHints(HINT_HORIZONTAL, HINT_LIST_ITEM).build()).build();
+    }
+
+    /**
+     */
+    public static final class CellBuilder extends TemplateBuilderImpl implements
+            GridBuilder.CellBuilder {
+
+        private PendingIntent mContentIntent;
+
+        /**
+         */
+        public CellBuilder(@NonNull GridBuilderListV1Impl parent) {
+            super(parent.createChildBuilder(), null);
+        }
+
+        /**
+         */
+        public CellBuilder(@NonNull Uri uri) {
+            super(new Slice.Builder(uri), null);
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addText(@NonNull CharSequence text) {
+            addText(text, false /* isLoading */);
+        }
+
+        /**
+         */
+        @Override
+        public void addText(@Nullable CharSequence text, boolean isLoading) {
+            @Slice.SliceHint String[] hints = isLoading
+                    ? new String[] {HINT_PARTIAL}
+                    : new String[0];
+            getBuilder().addText(text, null, hints);
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addTitleText(@NonNull CharSequence text) {
+            addTitleText(text, false /* isLoading */);
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addTitleText(@Nullable CharSequence text, boolean isLoading) {
+            @Slice.SliceHint String[] hints = isLoading
+                    ? new String[] {HINT_PARTIAL, HINT_LARGE}
+                    : new String[] {HINT_LARGE};
+            getBuilder().addText(text, null, hints);
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addLargeImage(@NonNull Icon image) {
+            addLargeImage(image, false /* isLoading */);
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addLargeImage(@Nullable Icon image, boolean isLoading) {
+            @Slice.SliceHint String[] hints = isLoading
+                    ? new String[] {HINT_PARTIAL, HINT_LARGE}
+                    : new String[] {HINT_LARGE};
+            getBuilder().addIcon(image, null, hints);
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addImage(@NonNull Icon image) {
+            addImage(image, false /* isLoading */);
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addImage(@Nullable Icon image, boolean isLoading) {
+            @Slice.SliceHint String[] hints = isLoading
+                    ? new String[] {HINT_PARTIAL}
+                    : new String[0];
+            getBuilder().addIcon(image, null, hints);
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void setContentIntent(@NonNull PendingIntent intent) {
+            mContentIntent = intent;
+        }
+
+        /**
+         * @hide
+         */
+        @RestrictTo(LIBRARY)
+        @Override
+        public void apply(Slice.Builder b) {
+        }
+
+        /**
+         */
+        @Override
+        @NonNull
+        public Slice build() {
+            if (mContentIntent != null) {
+                return new Slice.Builder(getBuilder())
+                        .addHints(HINT_HORIZONTAL, HINT_LIST_ITEM)
+                        .addAction(mContentIntent, getBuilder().build(), null)
+                        .build();
+            }
+            return getBuilder().addHints(HINT_HORIZONTAL, HINT_LIST_ITEM).build();
+        }
+    }
+}
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilder.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilder.java
new file mode 100644
index 0000000..d92083e
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilder.java
@@ -0,0 +1,342 @@
+/*
+ * 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.app.slice.builders.impl;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.app.PendingIntent;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.RestrictTo;
+
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public interface ListBuilder {
+
+    /**
+     * Add a row to list builder.
+     */
+    void addRow(TemplateBuilderImpl impl);
+    /**
+     * Add a grid row to the list builder.
+     */
+    void addGrid(TemplateBuilderImpl impl);
+
+    /**
+     * Adds a header to this template.
+     * <p>
+     * The header should contain a title that is representative of the content in this slice along
+     * with an intent that links to the app activity associated with this content.
+     */
+    void setHeader(TemplateBuilderImpl impl);
+
+    /**
+     * Sets the group of actions for this template. These actions may be shown on the template in
+     * large or small formats.
+     */
+    void setActions(TemplateBuilderImpl impl);
+
+    /**
+     * Add an input range row to the list builder.
+     */
+    void addInputRange(TemplateBuilderImpl builder);
+
+    /**
+     * Add a range row to the list builder.
+     */
+    void addRange(TemplateBuilderImpl builder);
+
+    /**
+     * If all content in a slice cannot be shown, the row added here will be displayed where the
+     * content is cut off. This row should have an affordance to take the user to an activity to
+     * see all of the content.
+     * <p>
+     * Only one see more affordance can be added, this throws {@link IllegalStateException} if
+     * a row or action has been previously added.
+     * </p>
+     */
+    void addSeeMoreRow(TemplateBuilderImpl builder);
+    /**
+     * If all content in a slice cannot be shown, a "see more" affordance will be displayed where
+     * the content is cut off. The action added here should take the user to an activity to see
+     * all of the content, and will be invoked when the "see more" affordance is tapped.
+     * <p>
+     * Only one see more affordance can be added, this throws {@link IllegalStateException} if
+     * a row or action has been previously added.
+     * </p>
+     */
+    void addSeeMoreAction(PendingIntent intent);
+
+    /**
+     * Sets the color to tint items displayed by this template (e.g. icons).
+     */
+    void setColor(int color);
+
+    /**
+     * Create a builder that implements {@link RowBuilder}.
+     */
+    TemplateBuilderImpl createRowBuilder();
+    /**
+     * Create a builder that implements {@link RowBuilder}.
+     */
+    TemplateBuilderImpl createRowBuilder(Uri uri);
+    /**
+     * Create a builder that implements {@link GridBuilder}.
+     */
+    TemplateBuilderImpl createGridBuilder();
+    /**
+     * Create a builder that implements {@link HeaderBuilder}.
+     */
+    TemplateBuilderImpl createHeaderBuilder();
+    /**
+     * Create a builder that implements {@link HeaderBuilder}.
+     */
+    TemplateBuilderImpl createHeaderBuilder(Uri uri);
+    /**
+     * Create a builder that implements {@link ActionBuilder}.
+     */
+    TemplateBuilderImpl createActionBuilder();
+    /**
+     * Create a builder that implements {@link ActionBuilder}.
+     */
+    TemplateBuilderImpl createActionBuilder(Uri uri);
+
+    /**
+     * Create a builder that implements {@link InputRangeBuilder}.
+     */
+    TemplateBuilderImpl createInputRangeBuilder();
+
+    /**
+     * Create a builder that implements {@link RangeBuilder}.
+     */
+    TemplateBuilderImpl createRangeBuilder();
+
+    /**
+     * Builder to construct a range.
+     */
+    interface RangeBuilder {
+        /**
+         * Set the upper limit.
+         */
+        void setMax(int max);
+
+        /**
+         * Set the current value.
+         */
+        void setValue(int value);
+
+        /**
+         * Set the title.
+         */
+        void setTitle(@NonNull CharSequence title);
+    }
+
+    /**
+     * Builder to construct an input range.
+     */
+    interface InputRangeBuilder extends RangeBuilder {
+        /**
+         * Set the {@link PendingIntent} to send when the value changes.
+         */
+        void setAction(@NonNull PendingIntent action);
+
+        /**
+         * Set the {@link Icon} to be displayed as the thumb on the input range.
+         */
+        void setThumb(@NonNull Icon thumb);
+    }
+
+    /**
+     */
+    interface RowBuilder {
+
+        /**
+         * Sets the title item to be the provided timestamp. Only one timestamp can be added, if
+         * one is already added this will throw {@link IllegalArgumentException}.
+         * <p>
+         * There can only be one title item, this will replace any other title
+         * items that may have been set.
+         */
+        void setTitleItem(long timeStamp);
+
+        /**
+         * Sets the title item to be the provided icon. There can only be one title item, this
+         * will replace any other title items that may have been set.
+         */
+        void setTitleItem(Icon icon);
+
+        /**
+         * Sets the title item to be the provided icon. There can only be one title item, this
+         * will replace any other title items that may have been set.
+         * <p>
+         * When set to true, the parameter {@code isLoading} indicates that the app is doing work
+         * to load this content in the background, in this case the template displays a placeholder
+         * until updated.
+         */
+        void setTitleItem(Icon icon, boolean isLoading);
+
+        /**
+         * Sets the title item to be a tappable icon. There can only be one title item, this will
+         * replace any other title items that may have been set.
+         */
+        void setTitleItem(Icon icon, PendingIntent action);
+
+        /**
+         * Sets the title item to be a tappable icon. There can only be one title item, this will
+         * replace any other title items that may have been set.
+         * <p>
+         * When set to true, the parameter {@code isLoading} indicates that the app is doing work
+         * to load this content in the background, in this case the template displays a placeholder
+         * until updated.
+         */
+        void setTitleItem(Icon icon, PendingIntent action, boolean isLoading);
+
+        /**
+         * Sets the action to be invoked if the user taps on the main content of the template.
+         */
+        void setContentIntent(PendingIntent action);
+
+        /**
+         * Sets the title text.
+         */
+        void setTitle(CharSequence title);
+
+        /**
+         * Sets the title text.
+         * <p>
+         * When set to true, the parameter {@code isLoading} indicates that the app is doing work
+         * to load this content in the background, in this case the template displays a placeholder
+         * until updated.
+         */
+        void setTitle(CharSequence title, boolean isLoading);
+
+        /**
+         * Sets the subtitle text.
+         */
+        void setSubtitle(CharSequence subtitle);
+
+        /**
+         * Sets the subtitle text.
+         * <p>
+         * When set to true, the parameter {@code isLoading} indicates that the app is doing work
+         * to load this content in the background, in this case the template displays a placeholder
+         * until updated.
+         */
+        void setSubtitle(CharSequence subtitle, boolean isLoading);
+
+        /**
+         * Adds a timestamp to be displayed at the end of the row.
+         */
+        void addEndItem(long timeStamp);
+
+        /**
+         * Adds an icon to be displayed at the end of the row.
+         */
+        void addEndItem(Icon icon);
+
+        /**
+         * Adds an icon to be displayed at the end of the row.
+         * <p>
+         * When set to true, the parameter {@code isLoading} indicates that the app is doing work
+         * to load this content in the background, in this case the template displays a placeholder
+         * until updated.
+         */
+        void addEndItem(Icon icon, boolean isLoading);
+
+        /**
+         * Adds a tappable icon to be displayed at the end of the row.
+         */
+        void addEndItem(Icon icon, PendingIntent action);
+
+        /**
+         * Adds a tappable icon to be displayed at the end of the row.
+         * <p>
+         * When set to true, the parameter {@code isLoading} indicates that the app is doing work
+         * to load this content in the background, in this case the template displays a placeholder
+         * until updated.
+         */
+        void addEndItem(Icon icon, PendingIntent action, boolean isLoading);
+
+        /**
+         * Adds a toggle action to the template with custom icons to represent checked and unchecked
+         * state.
+         */
+        void addToggle(PendingIntent action, boolean isChecked, Icon icon);
+
+        /**
+         * Adds a toggle action to the template with custom icons to represent checked and unchecked
+         * state.
+         * <p>
+         * When set to true, the parameter {@code isLoading} indicates that the app is doing work
+         * to load this content in the background, in this case the template displays a placeholder
+         * until updated.
+         */
+        void addToggle(PendingIntent action, boolean isChecked, Icon icon, boolean isLoading);
+    }
+
+
+    /**
+     * Builder to construct a header. A header is displayed at the top of a list and can have
+     * a title, subtitle, and an action.
+     */
+    public interface HeaderBuilder {
+
+        /**
+         * Sets the title to be shown in this header.
+         */
+        void setTitle(CharSequence title);
+
+        /**
+         * Sets the subtitle to be shown in this header.
+         */
+        void setSubtitle(CharSequence subtitle);
+
+        /**
+         * Sets the summary subtitle to be shown in this header. If unset, the normal subtitle
+         * will be used. The summary is used when the parent template is presented in a
+         * small format.
+         */
+        void setSummarySubtitle(CharSequence summarySubtitle);
+
+        /**
+         * Sets the pending intent to activate when the header is activated.
+         */
+        void setContentIntent(PendingIntent intent);
+    }
+
+    /**
+     * Builder to construct a group of actions.
+     */
+    public interface ActionBuilder {
+
+        /**
+         * Adds an action to this builder.
+         *
+         * @param action the pending intent to send when the action is activated.
+         * @param actionIcon the icon to display for this action.
+         * @param contentDescription the content description to use for accessibility.
+         * @param priority what priority to display this action in, with the lowest priority having
+         *                 the highest ranking.
+         */
+        void addAction(PendingIntent action, Icon actionIcon, CharSequence contentDescription,
+                int priority);
+    }
+}
+
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderBasicImpl.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderBasicImpl.java
new file mode 100644
index 0000000..8657c90
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderBasicImpl.java
@@ -0,0 +1,389 @@
+/*
+ * 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.app.slice.builders.impl;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.app.PendingIntent;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.RestrictTo;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceSpec;
+
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public class ListBuilderBasicImpl extends TemplateBuilderImpl implements ListBuilder {
+
+    /**
+     */
+    public ListBuilderBasicImpl(Slice.Builder b, SliceSpec spec) {
+        super(b, spec);
+    }
+
+    /**
+     */
+    @Override
+    public void addRow(TemplateBuilderImpl impl) {
+        // Do nothing.
+    }
+
+    /**
+     */
+    @Override
+    public void addGrid(TemplateBuilderImpl impl) {
+        // Do nothing.
+    }
+
+    /**
+     */
+    @Override
+    public void setActions(TemplateBuilderImpl impl) {
+        // Do nothing.
+    }
+
+    /**
+     */
+    @Override
+    public void setHeader(TemplateBuilderImpl impl) {
+        // Do nothing.
+    }
+
+    @Override
+    public void addInputRange(TemplateBuilderImpl builder) {
+        // Do nothing.
+    }
+
+    @Override
+    public void addRange(TemplateBuilderImpl builder) {
+        // Do nothing.
+    }
+
+    /**
+     */
+    @Override
+    public void addSeeMoreRow(TemplateBuilderImpl builder) {
+    }
+
+    /**
+     */
+    @Override
+    public void addSeeMoreAction(PendingIntent intent) {
+    }
+
+    /**
+     */
+    @Override
+    public void setColor(int color) {
+    }
+
+    /**
+     */
+    @Override
+    public TemplateBuilderImpl createRowBuilder() {
+        return new RowBuilderImpl(this);
+    }
+
+    /**
+     */
+    @Override
+    public TemplateBuilderImpl createRowBuilder(Uri uri) {
+        return new RowBuilderImpl(uri);
+    }
+
+    /**
+     */
+    @Override
+    public TemplateBuilderImpl createGridBuilder() {
+        return new GridBuilderBasicImpl(createChildBuilder(), null);
+    }
+
+    @Override
+    public TemplateBuilderImpl createHeaderBuilder() {
+        return new HeaderBuilderImpl(this);
+    }
+
+    @Override
+    public TemplateBuilderImpl createHeaderBuilder(Uri uri) {
+        return new HeaderBuilderImpl(uri);
+    }
+
+    @Override
+    public TemplateBuilderImpl createActionBuilder() {
+        return new ActionBuilderImpl(this);
+    }
+
+    @Override
+    public TemplateBuilderImpl createActionBuilder(Uri uri) {
+        return new ActionBuilderImpl(uri);
+    }
+
+    @Override
+    public TemplateBuilderImpl createInputRangeBuilder() {
+        return new ListBuilderV1Impl.InputRangeBuilderImpl(getBuilder());
+    }
+
+    @Override
+    public TemplateBuilderImpl createRangeBuilder() {
+        return new ListBuilderV1Impl.RangeBuilderImpl(getBuilder());
+    }
+
+    /**
+     */
+    @Override
+    public void apply(Slice.Builder builder) {
+
+    }
+
+    /**
+     */
+    public static class RowBuilderImpl extends TemplateBuilderImpl
+            implements ListBuilder.RowBuilder {
+        private Icon mIcon;
+        private CharSequence mTitle;
+        private CharSequence mSubtitle;
+
+        /**
+         */
+        public RowBuilderImpl(@NonNull ListBuilderBasicImpl parent) {
+            super(parent.createChildBuilder(), null);
+        }
+
+        /**
+         */
+        public RowBuilderImpl(@NonNull Uri uri) {
+            super(new Slice.Builder(uri), null);
+        }
+
+        /**
+         */
+        @Override
+        public void addEndItem(Icon icon) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void addEndItem(Icon icon, boolean isLoading) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void addEndItem(Icon icon, PendingIntent action) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void addEndItem(Icon icon, PendingIntent action, boolean isLoading) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void addToggle(PendingIntent action, boolean isChecked, Icon icon) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void addToggle(PendingIntent action, boolean isChecked, Icon icon,
+                boolean isLoading) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void setTitleItem(long timeStamp) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void setTitleItem(Icon icon) {
+            mIcon = icon;
+        }
+
+        /**
+         */
+        @Override
+        public void setTitleItem(Icon icon, boolean isLoading) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void setTitleItem(Icon icon, PendingIntent action) {
+            mIcon = icon;
+        }
+
+        /**
+         */
+        @Override
+        public void setTitleItem(Icon icon, PendingIntent action, boolean isLoading) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void setContentIntent(PendingIntent action) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void setTitle(CharSequence title) {
+            mTitle = title;
+        }
+
+        /**
+         */
+        @Override
+        public void setTitle(CharSequence title, boolean isLoading) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void setSubtitle(CharSequence subtitle) {
+            mSubtitle = subtitle;
+        }
+
+        /**
+         */
+        @Override
+        public void setSubtitle(CharSequence subtitle, boolean isLoading) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void addEndItem(long timeStamp) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void apply(Slice.Builder builder) {
+
+        }
+    }
+
+    /**
+     */
+    public static class HeaderBuilderImpl extends TemplateBuilderImpl
+            implements ListBuilder.HeaderBuilder {
+
+        /**
+         */
+        public HeaderBuilderImpl(@NonNull ListBuilderBasicImpl parent) {
+            super(parent.createChildBuilder(), null);
+        }
+
+        /**
+         */
+        public HeaderBuilderImpl(@NonNull Uri uri) {
+            super(new Slice.Builder(uri), null);
+        }
+
+        /**
+         */
+        @Override
+        public void apply(Slice.Builder builder) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void setTitle(CharSequence title) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void setSubtitle(CharSequence subtitle) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void setSummarySubtitle(CharSequence summarySubtitle) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void setContentIntent(PendingIntent intent) {
+
+        }
+    }
+
+    /**
+     */
+    public static class ActionBuilderImpl extends TemplateBuilderImpl
+            implements ListBuilder.ActionBuilder {
+
+        /**
+         */
+        public ActionBuilderImpl(@NonNull ListBuilderBasicImpl parent) {
+            super(parent.createChildBuilder(), null);
+        }
+
+        /**
+         */
+        public ActionBuilderImpl(@NonNull Uri uri) {
+            super(new Slice.Builder(uri), null);
+        }
+
+        /**
+         */
+        @Override
+        public void apply(Slice.Builder builder) {
+
+        }
+
+        /**
+         */
+        @Override
+        public void addAction(PendingIntent action, Icon actionIcon,
+                CharSequence contentDescription, int priority) {
+
+        }
+    }
+}
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderV1Impl.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderV1Impl.java
new file mode 100644
index 0000000..4ec4ac0
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderV1Impl.java
@@ -0,0 +1,611 @@
+/*
+ * 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.app.slice.builders.impl;
+
+import static android.app.slice.Slice.HINT_ACTIONS;
+import static android.app.slice.Slice.HINT_LARGE;
+import static android.app.slice.Slice.HINT_LIST_ITEM;
+import static android.app.slice.Slice.HINT_NO_TINT;
+import static android.app.slice.Slice.HINT_PARTIAL;
+import static android.app.slice.Slice.HINT_SEE_MORE;
+import static android.app.slice.Slice.HINT_SELECTED;
+import static android.app.slice.Slice.HINT_SUMMARY;
+import static android.app.slice.Slice.HINT_TITLE;
+import static android.app.slice.Slice.SUBTYPE_COLOR;
+import static android.app.slice.Slice.SUBTYPE_CONTENT_DESCRIPTION;
+import static android.app.slice.Slice.SUBTYPE_PRIORITY;
+import static android.app.slice.Slice.SUBTYPE_TOGGLE;
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+import static android.app.slice.SliceItem.FORMAT_TIMESTAMP;
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.app.slice.core.SliceHints.SUBTYPE_MAX;
+import static androidx.app.slice.core.SliceHints.SUBTYPE_RANGE;
+import static androidx.app.slice.core.SliceHints.SUBTYPE_VALUE;
+
+import android.app.PendingIntent;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+
+import java.util.ArrayList;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceItem;
+import androidx.app.slice.SliceSpec;
+
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public class ListBuilderV1Impl extends TemplateBuilderImpl implements ListBuilder {
+
+    private Slice mSliceActions;
+    private Slice mSliceHeader;
+
+    /**
+     */
+    public ListBuilderV1Impl(Slice.Builder b, SliceSpec spec) {
+        super(b, spec);
+    }
+
+    /**
+     */
+    @Override
+    public void apply(Slice.Builder builder) {
+        if (mSliceHeader != null) {
+            builder.addSubSlice(mSliceHeader);
+        }
+        if (mSliceActions != null) {
+            builder.addSubSlice(mSliceActions);
+        }
+    }
+
+    /**
+     * Add a row to list builder.
+     */
+    @NonNull
+    @Override
+    public void addRow(@NonNull TemplateBuilderImpl builder) {
+        getBuilder().addSubSlice(builder.build());
+    }
+
+    /**
+     */
+    @NonNull
+    @Override
+    public void addGrid(@NonNull TemplateBuilderImpl builder) {
+        getBuilder().addSubSlice(builder.build());
+    }
+
+    /**
+     */
+    @Override
+    public void setHeader(@NonNull TemplateBuilderImpl builder) {
+        mSliceHeader = builder.build();
+    }
+
+    /**
+     */
+    @Override
+    public void setActions(@NonNull TemplateBuilderImpl builder) {
+        mSliceActions = builder.build();
+    }
+
+    @Override
+    public void addInputRange(TemplateBuilderImpl builder) {
+        getBuilder().addSubSlice(builder.build(), SUBTYPE_RANGE);
+    }
+
+    @Override
+    public void addRange(TemplateBuilderImpl builder) {
+        getBuilder().addSubSlice(builder.build(), SUBTYPE_RANGE);
+    }
+
+    /**
+     */
+    @Override
+    public void addSeeMoreRow(TemplateBuilderImpl builder) {
+        builder.getBuilder().addHints(HINT_SEE_MORE);
+        getBuilder().addSubSlice(builder.build());
+    }
+
+    /**
+     */
+    @Override
+    public void addSeeMoreAction(PendingIntent intent) {
+        getBuilder().addSubSlice(
+                new Slice.Builder(getBuilder())
+                        .addHints(HINT_SEE_MORE)
+                        .addAction(intent, new Slice.Builder(getBuilder()).build(), null)
+                        .build());
+    }
+
+
+    /**
+     * Builder to construct an input row.
+     */
+    public static class RangeBuilderImpl extends TemplateBuilderImpl implements RangeBuilder {
+        private int mMax = 100;
+        private int mValue = 0;
+        private CharSequence mTitle;
+
+        public RangeBuilderImpl(Slice.Builder sb) {
+            super(sb, null);
+        }
+
+        @Override
+        public void setMax(int max) {
+            mMax = max;
+        }
+
+        @Override
+        public void setValue(int value) {
+            mValue = value;
+        }
+
+        @Override
+        public void setTitle(@NonNull CharSequence title) {
+            mTitle = title;
+        }
+
+        @Override
+        public void apply(Slice.Builder builder) {
+            if (mTitle != null) {
+                builder.addText(mTitle, null, HINT_TITLE);
+            }
+            builder.addHints(HINT_LIST_ITEM)
+                    .addInt(mMax, SUBTYPE_MAX)
+                    .addInt(mValue, SUBTYPE_VALUE);
+        }
+    }
+
+    /**
+     * Builder to construct an input range row.
+     */
+    public static class InputRangeBuilderImpl
+            extends RangeBuilderImpl implements InputRangeBuilder {
+        private PendingIntent mAction;
+        private Icon mThumb;
+
+        public InputRangeBuilderImpl(Slice.Builder sb) {
+            super(sb);
+        }
+
+        @Override
+        public void setAction(@NonNull PendingIntent action) {
+            mAction = action;
+        }
+
+        @Override
+        public void setThumb(@NonNull Icon thumb) {
+            mThumb = thumb;
+        }
+
+        @Override
+        public void apply(Slice.Builder builder) {
+            if (mAction == null) {
+                throw new IllegalStateException("Input ranges must have an associated action.");
+            }
+            Slice.Builder sb = new Slice.Builder(builder);
+            super.apply(sb);
+            if (mThumb != null) {
+                sb.addIcon(mThumb, null);
+            }
+            builder.addAction(mAction, sb.build(), SUBTYPE_RANGE).addHints(HINT_LIST_ITEM);
+        }
+    }
+
+    /**
+     */
+    @NonNull
+    @Override
+    public void setColor(int color) {
+        getBuilder().addInt(color, SUBTYPE_COLOR);
+    }
+
+    /**
+     */
+    @Override
+    public TemplateBuilderImpl createRowBuilder() {
+        return new RowBuilderImpl(this);
+    }
+
+    /**
+     */
+    @Override
+    public TemplateBuilderImpl createRowBuilder(Uri uri) {
+        return new RowBuilderImpl(uri);
+    }
+
+
+    @Override
+    public TemplateBuilderImpl createInputRangeBuilder() {
+        return new InputRangeBuilderImpl(createChildBuilder());
+    }
+
+    @Override
+    public TemplateBuilderImpl createRangeBuilder() {
+        return new RangeBuilderImpl(createChildBuilder());
+    }
+
+    /**
+     */
+    @Override
+    public TemplateBuilderImpl createGridBuilder() {
+        return new GridBuilderListV1Impl(createChildBuilder(), null);
+    }
+
+    /**
+     */
+    @Override
+    public TemplateBuilderImpl createHeaderBuilder() {
+        return new HeaderBuilderImpl(this);
+    }
+
+    @Override
+    public TemplateBuilderImpl createHeaderBuilder(Uri uri) {
+        return new HeaderBuilderImpl(uri);
+    }
+
+    @Override
+    public TemplateBuilderImpl createActionBuilder() {
+        return new ActionBuilderImpl(this);
+    }
+
+    @Override
+    public TemplateBuilderImpl createActionBuilder(Uri uri) {
+        return new ActionBuilderImpl(uri);
+    }
+
+    /**
+     */
+    public static class RowBuilderImpl extends TemplateBuilderImpl
+            implements ListBuilder.RowBuilder {
+
+        private PendingIntent mContentIntent;
+        private SliceItem mTitleItem;
+        private SliceItem mSubtitleItem;
+        private SliceItem mStartItem;
+        private ArrayList<SliceItem> mEndItems = new ArrayList<>();
+
+        /**
+         */
+        public RowBuilderImpl(@NonNull ListBuilderV1Impl parent) {
+            super(parent.createChildBuilder(), null);
+        }
+
+        /**
+         */
+        public RowBuilderImpl(@NonNull Uri uri) {
+            super(new Slice.Builder(uri), null);
+        }
+
+        /**
+         */
+        public RowBuilderImpl(Slice.Builder builder) {
+            super(builder, null);
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void setTitleItem(long timeStamp) {
+            mStartItem = new SliceItem(timeStamp, FORMAT_TIMESTAMP, null, new String[]{HINT_TITLE});
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void setTitleItem(@NonNull Icon icon) {
+            setTitleItem(icon, false /* isLoading */);
+        }
+
+        /**
+         */
+        @Override
+        public void setTitleItem(@Nullable Icon icon, boolean isLoading) {
+            mStartItem = new SliceItem(icon, FORMAT_IMAGE, null, new String[]{HINT_TITLE});
+            if (isLoading) {
+                mStartItem.addHint(HINT_PARTIAL);
+            }
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void setTitleItem(@NonNull Icon icon, @NonNull PendingIntent action) {
+            setTitleItem(icon, action, false /* isLoading */);
+        }
+
+        /**
+         */
+        @Override
+        public void setTitleItem(Icon icon, PendingIntent action, boolean isLoading) {
+            Slice actionSlice = new Slice.Builder(getBuilder()).addIcon(icon, null).build();
+            mStartItem = new SliceItem(action, actionSlice, FORMAT_ACTION, null,
+                    new String[]{HINT_TITLE});
+            if (isLoading) {
+                mStartItem.addHint(HINT_PARTIAL);
+            }
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void setContentIntent(@NonNull PendingIntent action) {
+            mContentIntent = action;
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void setTitle(CharSequence title) {
+            setTitle(title, false /* isLoading */);
+        }
+
+        /**
+         */
+        @Override
+        public void setTitle(CharSequence title, boolean isLoading) {
+            mTitleItem = new SliceItem(title, FORMAT_TEXT, null, new String[] {HINT_TITLE});
+            if (isLoading) {
+                mTitleItem.addHint(HINT_PARTIAL);
+            }
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void setSubtitle(CharSequence subtitle) {
+            setSubtitle(subtitle, false /* isLoading */);
+        }
+
+        /**
+         */
+        @Override
+        public void setSubtitle(CharSequence subtitle, boolean isLoading) {
+            mSubtitleItem = new SliceItem(subtitle, FORMAT_TEXT, null, new String[0]);
+            if (isLoading) {
+                mSubtitleItem.addHint(HINT_PARTIAL);
+            }
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addEndItem(long timeStamp) {
+            mEndItems.add(new SliceItem(timeStamp, FORMAT_TIMESTAMP, null, new String[0]));
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addEndItem(@NonNull Icon icon) {
+            addEndItem(icon, false /* isLoading */);
+        }
+
+        /**
+         */
+        @Override
+        public void addEndItem(Icon icon, boolean isLoading) {
+            SliceItem item = new SliceItem(icon, FORMAT_IMAGE, null,
+                    new String[] {HINT_NO_TINT, HINT_LARGE});
+            if (isLoading) {
+                item.addHint(HINT_PARTIAL);
+            }
+            mEndItems.add(item);
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addEndItem(@NonNull Icon icon, @NonNull PendingIntent action) {
+            addEndItem(icon, action, false /* isLoading */);
+        }
+
+        /**
+         */
+        @Override
+        public void addEndItem(Icon icon, PendingIntent action, boolean isLoading) {
+            Slice actionSlice = new Slice.Builder(getBuilder()).addIcon(icon, null).build();
+            SliceItem item = new SliceItem(action, actionSlice, FORMAT_ACTION, null,
+                    new String[0]);
+            if (isLoading) {
+                item.addHint(HINT_PARTIAL);
+            }
+            mEndItems.add(item);
+        }
+
+        /**
+         */
+        @NonNull
+        @Override
+        public void addToggle(@NonNull PendingIntent action, boolean isChecked,
+                @NonNull Icon icon) {
+            addToggle(action, isChecked, icon, false /* isLoading */);
+        }
+
+        @Override
+        public void addToggle(PendingIntent action, boolean isChecked, Icon icon,
+                boolean isLoading) {
+            @Slice.SliceHint String[] hints = isChecked
+                    ? new String[] {HINT_SELECTED}
+                    : new String[0];
+            Slice.Builder actionSliceBuilder = new Slice.Builder(getBuilder()).addHints(hints);
+            if (icon != null) {
+                actionSliceBuilder.addIcon(icon, null);
+            }
+            Slice actionSlice = actionSliceBuilder.build();
+            SliceItem item = new SliceItem(action, actionSlice, FORMAT_ACTION, SUBTYPE_TOGGLE,
+                    hints);
+            if (isLoading) {
+                item.addHint(HINT_PARTIAL);
+            }
+            mEndItems.add(item);
+        }
+
+        /**
+         */
+        @Override
+        public void apply(Slice.Builder b) {
+            Slice.Builder wrapped = b;
+            if (mContentIntent != null) {
+                b = new Slice.Builder(wrapped);
+            }
+            if (mStartItem != null) {
+                b.addItem(mStartItem);
+            }
+            if (mTitleItem != null) {
+                b.addItem(mTitleItem);
+            }
+            if (mSubtitleItem != null) {
+                b.addItem(mSubtitleItem);
+            }
+            for (int i = 0; i < mEndItems.size(); i++) {
+                SliceItem item = mEndItems.get(i);
+                b.addItem(item);
+            }
+            if (mContentIntent != null) {
+                wrapped.addAction(mContentIntent, b.build(), null);
+            }
+            wrapped.addHints(HINT_LIST_ITEM);
+        }
+    }
+
+    /**
+     */
+    public static class HeaderBuilderImpl extends TemplateBuilderImpl
+            implements ListBuilder.HeaderBuilder {
+
+        private CharSequence mTitle;
+        private CharSequence mSubtitle;
+        private CharSequence mSummarySubtitle;
+        private PendingIntent mContentIntent;
+
+        /**
+         */
+        public HeaderBuilderImpl(@NonNull ListBuilderV1Impl parent) {
+            super(parent.createChildBuilder(), null);
+        }
+
+        /**
+         */
+        public HeaderBuilderImpl(@NonNull Uri uri) {
+            super(new Slice.Builder(uri), null);
+        }
+
+        /**
+         */
+        @Override
+        public void apply(Slice.Builder b) {
+            Slice.Builder wrapped = b;
+            if (mContentIntent != null) {
+                b = new Slice.Builder(wrapped);
+            }
+            if (mTitle != null) {
+                b.addText(mTitle, null /* subtype */, HINT_TITLE);
+            }
+            if (mSubtitle != null) {
+                b.addText(mSubtitle, null /* subtype */);
+            }
+            if (mSummarySubtitle != null) {
+                b.addText(mSummarySubtitle, null /* subtype */, HINT_SUMMARY);
+            }
+            if (mContentIntent != null) {
+                wrapped.addAction(mContentIntent, b.build(), null /* subtype */);
+            }
+        }
+
+        /**
+         */
+        @Override
+        public void setTitle(CharSequence title) {
+            mTitle = title;
+        }
+
+        /**
+         */
+        @Override
+        public void setSubtitle(CharSequence subtitle) {
+            mSubtitle = subtitle;
+        }
+
+        /**
+         */
+        @Override
+        public void setSummarySubtitle(CharSequence summarySubtitle) {
+            mSummarySubtitle = summarySubtitle;
+        }
+
+        /**
+         */
+        @Override
+        public void setContentIntent(PendingIntent intent) {
+            mContentIntent = intent;
+        }
+    }
+
+    /**
+     */
+    public static class ActionBuilderImpl extends TemplateBuilderImpl
+            implements ListBuilder.ActionBuilder {
+
+        /**
+         */
+        public ActionBuilderImpl(@NonNull ListBuilderV1Impl parent) {
+            super(parent.createChildBuilder(), null);
+        }
+
+        /**
+         */
+        public ActionBuilderImpl(@NonNull Uri uri) {
+            super(new Slice.Builder(uri), null);
+        }
+
+        /**
+         */
+        @Override
+        public void apply(Slice.Builder builder) {
+            builder.addHints(HINT_ACTIONS);
+        }
+
+        /**
+         */
+        @Override
+        public void addAction(PendingIntent action, Icon actionIcon,
+                CharSequence contentDescription, int priority) {
+            getBuilder().addAction(action, new Slice.Builder(getBuilder())
+                    .addIcon(actionIcon, null /* subtype */)
+                    .addInt(priority, SUBTYPE_PRIORITY /* subtype */)
+                    .addText(contentDescription, SUBTYPE_CONTENT_DESCRIPTION)
+                    .addHints(HINT_ACTIONS).build(), null /* subtype */);
+        }
+    }
+}
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/MessagingBasicImpl.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/MessagingBasicImpl.java
new file mode 100644
index 0000000..843302c
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/MessagingBasicImpl.java
@@ -0,0 +1,120 @@
+/*
+ * 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.app.slice.builders.impl;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.graphics.drawable.Icon;
+import android.support.annotation.RestrictTo;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceSpec;
+
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public class MessagingBasicImpl extends TemplateBuilderImpl implements
+        MessagingBuilder {
+    private MessageBuilder mLastMessage;
+
+    /**
+     */
+    public MessagingBasicImpl(Slice.Builder builder, SliceSpec spec) {
+        super(builder, spec);
+    }
+
+    /**
+     */
+    @Override
+    public void apply(Slice.Builder builder) {
+        if (mLastMessage != null) {
+            if (mLastMessage.mIcon != null) {
+                builder.addIcon(mLastMessage.mIcon, null);
+            }
+            if (mLastMessage.mText != null) {
+                builder.addText(mLastMessage.mText, null);
+            }
+        }
+    }
+
+    /**
+     */
+    @Override
+    public void add(TemplateBuilderImpl builder) {
+        MessageBuilder b = (MessageBuilder) builder;
+        if (mLastMessage == null || mLastMessage.mTimestamp < b.mTimestamp) {
+            mLastMessage = b;
+        }
+    }
+
+    /**
+     */
+    @Override
+    public TemplateBuilderImpl createMessageBuilder() {
+        return new MessageBuilder(this);
+    }
+
+    /**
+     */
+    public static final class MessageBuilder extends TemplateBuilderImpl
+            implements MessagingBuilder.MessageBuilder {
+
+        private Icon mIcon;
+        private CharSequence mText;
+        private long mTimestamp;
+
+        /**
+         */
+        public MessageBuilder(MessagingBasicImpl parent) {
+            this(parent.createChildBuilder());
+        }
+
+        /**
+         */
+        private MessageBuilder(Slice.Builder builder) {
+            super(builder, null);
+        }
+
+        /**
+         */
+        @Override
+        public void addSource(Icon source) {
+            mIcon = source;
+        }
+
+        /**
+         */
+        @Override
+        public void addText(CharSequence text) {
+            mText = text;
+        }
+
+        /**
+         */
+        @Override
+        public void addTimestamp(long timestamp) {
+            mTimestamp = timestamp;
+        }
+
+        /**
+         */
+        @Override
+        public void apply(Slice.Builder builder) {
+        }
+    }
+}
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/MessagingBuilder.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/MessagingBuilder.java
new file mode 100644
index 0000000..635f160
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/MessagingBuilder.java
@@ -0,0 +1,58 @@
+/*
+ * 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.app.slice.builders.impl;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.graphics.drawable.Icon;
+import android.support.annotation.RestrictTo;
+
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public interface MessagingBuilder {
+    /**
+     * Add a subslice to this builder.
+     */
+    void add(TemplateBuilderImpl builder);
+
+    /**
+     * Create a builder that implements {@link MessageBuilder}
+     */
+    TemplateBuilderImpl createMessageBuilder();
+
+    /**
+     */
+    public interface MessageBuilder {
+
+        /**
+         * Add the icon used to display contact in the messaging experience
+         */
+        void addSource(Icon source);
+
+        /**
+         * Add the text to be used for this message.
+         */
+        void addText(CharSequence text);
+
+        /**
+         * Add the time at which this message arrived in ms since Unix epoch
+         */
+        void addTimestamp(long timestamp);
+    }
+}
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/MessagingListV1Impl.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/MessagingListV1Impl.java
new file mode 100644
index 0000000..408ad0b
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/MessagingListV1Impl.java
@@ -0,0 +1,109 @@
+/*
+ * 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.app.slice.builders.impl;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.graphics.drawable.Icon;
+import android.support.annotation.RestrictTo;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceSpec;
+
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public class MessagingListV1Impl extends TemplateBuilderImpl implements MessagingBuilder{
+
+    private final ListBuilderV1Impl mListBuilder;
+
+    /**
+     */
+    public MessagingListV1Impl(Slice.Builder b, SliceSpec spec) {
+        super(b, spec);
+        mListBuilder = new ListBuilderV1Impl(b, spec);
+    }
+
+    /**
+     */
+    @Override
+    public void add(TemplateBuilderImpl builder) {
+        MessageBuilder b = (MessageBuilder) builder;
+        mListBuilder.addRow(b.mListBuilder);
+    }
+
+    /**
+     */
+    @Override
+    public TemplateBuilderImpl createMessageBuilder() {
+        return new MessageBuilder(this);
+    }
+
+    /**
+     */
+    @Override
+    public void apply(Slice.Builder builder) {
+        mListBuilder.apply(builder);
+    }
+
+    /**
+     */
+    public static final class MessageBuilder extends TemplateBuilderImpl
+            implements MessagingBuilder.MessageBuilder {
+        private final ListBuilderV1Impl.RowBuilderImpl mListBuilder;
+
+        /**
+         */
+        public MessageBuilder(MessagingListV1Impl parent) {
+            this(parent.createChildBuilder());
+        }
+
+        private MessageBuilder(Slice.Builder builder) {
+            super(builder, null);
+            mListBuilder = new ListBuilderV1Impl.RowBuilderImpl(builder);
+        }
+
+        /**
+         */
+        @Override
+        public void addSource(Icon source) {
+            mListBuilder.setTitleItem(source);
+        }
+
+        /**
+         */
+        @Override
+        public void addText(CharSequence text) {
+            mListBuilder.setSubtitle(text);
+        }
+
+        /**
+         */
+        @Override
+        public void addTimestamp(long timestamp) {
+            mListBuilder.addEndItem(timestamp);
+        }
+
+        /**
+         */
+        @Override
+        public void apply(Slice.Builder builder) {
+            mListBuilder.apply(builder);
+        }
+    }
+}
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/MessagingV1Impl.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/MessagingV1Impl.java
new file mode 100644
index 0000000..4e07139
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/MessagingV1Impl.java
@@ -0,0 +1,97 @@
+/*
+ * 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.app.slice.builders.impl;
+
+import static android.app.slice.Slice.SUBTYPE_MESSAGE;
+
+import android.graphics.drawable.Icon;
+import android.support.annotation.RestrictTo;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceSpec;
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+public class MessagingV1Impl extends TemplateBuilderImpl implements MessagingBuilder {
+
+    /**
+     */
+    public MessagingV1Impl(Slice.Builder b, SliceSpec spec) {
+        super(b, spec);
+    }
+
+    /**
+     */
+    @Override
+    public void add(TemplateBuilderImpl builder) {
+        getBuilder().addSubSlice(builder.build(), SUBTYPE_MESSAGE);
+    }
+
+    /**
+     */
+    @Override
+    public void apply(Slice.Builder builder) {
+
+    }
+
+    /**
+     */
+    @Override
+    public TemplateBuilderImpl createMessageBuilder() {
+        return new MessageBuilder(this);
+    }
+
+    /**
+     */
+    public static final class MessageBuilder extends TemplateBuilderImpl
+            implements MessagingBuilder.MessageBuilder {
+        /**
+         */
+        public MessageBuilder(MessagingV1Impl parent) {
+            super(parent.createChildBuilder(), null);
+        }
+
+        /**
+         */
+        @Override
+        public void addSource(Icon source) {
+            getBuilder().addIcon(source, android.app.slice.Slice.SUBTYPE_SOURCE);
+        }
+
+        /**
+         */
+        @Override
+        public void addText(CharSequence text) {
+            getBuilder().addText(text, null);
+        }
+
+        /**
+         */
+        @Override
+        public void addTimestamp(long timestamp) {
+            getBuilder().addTimestamp(timestamp, null);
+        }
+
+        /**
+         */
+        @Override
+        public void apply(Slice.Builder builder) {
+        }
+    }
+}
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/TemplateBuilderImpl.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/TemplateBuilderImpl.java
new file mode 100644
index 0000000..294677e
--- /dev/null
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/TemplateBuilderImpl.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.builders.impl;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.support.annotation.RestrictTo;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceSpec;
+
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public abstract class TemplateBuilderImpl {
+
+    private final Slice.Builder mSliceBuilder;
+    private final SliceSpec mSpec;
+
+    protected TemplateBuilderImpl(Slice.Builder b, SliceSpec spec) {
+        mSliceBuilder = b;
+        mSpec = spec;
+    }
+
+    /**
+     * Construct the slice.
+     */
+    public Slice build() {
+        mSliceBuilder.setSpec(mSpec);
+        apply(mSliceBuilder);
+        return mSliceBuilder.build();
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    public Slice.Builder getBuilder() {
+        return mSliceBuilder;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    public Slice.Builder createChildBuilder() {
+        return new Slice.Builder(mSliceBuilder);
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    public abstract void apply(Slice.Builder builder);
+}
diff --git a/slices/core/api/current.txt b/slices/core/api/current.txt
new file mode 100644
index 0000000..77936d6
--- /dev/null
+++ b/slices/core/api/current.txt
@@ -0,0 +1,38 @@
+package androidx.app.slice {
+
+  public final class Slice {
+    method public java.util.List<java.lang.String> getHints();
+    method public java.util.List<androidx.app.slice.SliceItem> getItems();
+    method public android.net.Uri getUri();
+  }
+
+  public class SliceConvert {
+    ctor public SliceConvert();
+    method public static android.app.slice.Slice unwrap(androidx.app.slice.Slice);
+    method public static androidx.app.slice.Slice wrap(android.app.slice.Slice);
+  }
+
+  public class SliceItem {
+    method public android.app.PendingIntent getAction();
+    method public java.lang.String getFormat();
+    method public java.util.List<java.lang.String> getHints();
+    method public android.graphics.drawable.Icon getIcon();
+    method public int getInt();
+    method public androidx.app.slice.Slice getSlice();
+    method public java.lang.String getSubType();
+    method public java.lang.CharSequence getText();
+    method public long getTimestamp();
+    method public boolean hasHint(java.lang.String);
+  }
+
+  public abstract class SliceProvider extends android.content.ContentProvider {
+    ctor public SliceProvider();
+    method public abstract androidx.app.slice.Slice onBindSlice(android.net.Uri);
+    method public abstract boolean onCreateSliceProvider();
+    method public android.net.Uri onMapIntentToUri(android.content.Intent);
+    method public void onSlicePinned(android.net.Uri);
+    method public void onSliceUnpinned(android.net.Uri);
+  }
+
+}
+
diff --git a/slices/core/build.gradle b/slices/core/build.gradle
new file mode 100644
index 0000000..879b409
--- /dev/null
+++ b/slices/core/build.gradle
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+import static android.support.dependencies.DependenciesKt.*
+
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    implementation project(":support-annotations")
+    implementation project(":appcompat-v7")
+
+    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+}
+
+supportLibrary {
+    name = "Common utilities for slices"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SLICES
+    inceptionYear = "2017"
+    description = "The slices core library provides utilities for the slices view and provider libraries"
+    minSdkVersion = 24
+}
diff --git a/slices/core/lint-baseline.xml b/slices/core/lint-baseline.xml
new file mode 100644
index 0000000..2cadde1
--- /dev/null
+++ b/slices/core/lint-baseline.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="4" by="lint 3.0.0">
+
+</issues>
diff --git a/slices/core/src/androidTest/AndroidManifest.xml b/slices/core/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..90dbbcc
--- /dev/null
+++ b/slices/core/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="androidx.app.slice.core.test">
+    <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
+
+    <application>
+        <provider android:name="androidx.app.slice.SliceTestProvider"
+            android:authorities="androidx.app.slice.core.test"
+            android:process=":provider"
+            android:exported="true" />
+    </application>
+
+</manifest>
diff --git a/design/tests/NO_DOCS b/slices/core/src/androidTest/NO_DOCS
similarity index 92%
copy from design/tests/NO_DOCS
copy to slices/core/src/androidTest/NO_DOCS
index 0c81e4a..092a39c 100644
--- a/design/tests/NO_DOCS
+++ b/slices/core/src/androidTest/NO_DOCS
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 The Android Open Source Project
+# 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.
diff --git a/slices/core/src/androidTest/java/androidx/app/slice/SliceTest.java b/slices/core/src/androidTest/java/androidx/app/slice/SliceTest.java
new file mode 100644
index 0000000..0ede29d
--- /dev/null
+++ b/slices/core/src/androidTest/java/androidx/app/slice/SliceTest.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice;
+
+import static android.app.slice.Slice.HINT_LARGE;
+import static android.app.slice.Slice.HINT_LIST;
+import static android.app.slice.Slice.HINT_NO_TINT;
+import static android.app.slice.Slice.HINT_TITLE;
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_INT;
+import static android.app.slice.SliceItem.FORMAT_SLICE;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+import static android.app.slice.SliceItem.FORMAT_TIMESTAMP;
+import static android.app.slice.SliceProvider.SLICE_TYPE;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.app.PendingIntent.CanceledException;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import androidx.app.slice.core.test.R;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SliceTest {
+
+    public static boolean sFlag = false;
+
+    private static final Uri BASE_URI = Uri.parse("content://androidx.app.slice.core.test/");
+    private final Context mContext = InstrumentationRegistry.getContext();
+
+    @Test
+    public void testProcess() {
+        sFlag = false;
+        Slice.bindSlice(mContext,
+                BASE_URI.buildUpon().appendPath("set_flag").build(),
+                Collections.<SliceSpec>emptyList());
+        assertFalse(sFlag);
+    }
+
+    @Test
+    public void testType() {
+        assertEquals(SLICE_TYPE, mContext.getContentResolver().getType(BASE_URI));
+    }
+
+    @Test
+    public void testSliceUri() {
+        Slice s = Slice.bindSlice(mContext, BASE_URI, Collections.<SliceSpec>emptyList());
+        assertEquals(BASE_URI, s.getUri());
+    }
+
+    @Test
+    public void testSubSlice() {
+        Uri uri = BASE_URI.buildUpon().appendPath("subslice").build();
+        Slice s = Slice.bindSlice(mContext, uri, Collections.<SliceSpec>emptyList());
+        assertEquals(uri, s.getUri());
+        assertEquals(1, s.getItems().size());
+
+        SliceItem item = s.getItems().get(0);
+        assertEquals(FORMAT_SLICE, item.getFormat());
+        assertEquals("subslice", item.getSubType());
+        // The item should start with the same Uri as the parent, but be different.
+        assertTrue(item.getSlice().getUri().toString().startsWith(uri.toString()));
+        assertNotEquals(uri, item.getSlice().getUri());
+    }
+
+    @Test
+    public void testText() {
+        Uri uri = BASE_URI.buildUpon().appendPath("text").build();
+        Slice s = Slice.bindSlice(mContext, uri, Collections.<SliceSpec>emptyList());
+        assertEquals(uri, s.getUri());
+        assertEquals(1, s.getItems().size());
+
+        SliceItem item = s.getItems().get(0);
+        assertEquals(FORMAT_TEXT, item.getFormat());
+        // TODO: Test spannables here.
+        assertEquals("Expected text", item.getText());
+    }
+
+    @Test
+    public void testIcon() {
+        Uri uri = BASE_URI.buildUpon().appendPath("icon").build();
+        Slice s = Slice.bindSlice(mContext, uri, Collections.<SliceSpec>emptyList());
+        assertEquals(uri, s.getUri());
+        assertEquals(1, s.getItems().size());
+
+        SliceItem item = s.getItems().get(0);
+        assertEquals(FORMAT_IMAGE, item.getFormat());
+        assertEquals(Icon.createWithResource(mContext, R.drawable.size_48x48).toString(),
+                item.getIcon().toString());
+    }
+
+    @Test
+    public void testAction() {
+        sFlag = false;
+        final CountDownLatch latch = new CountDownLatch(1);
+        BroadcastReceiver receiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                sFlag = true;
+                latch.countDown();
+            }
+        };
+        mContext.registerReceiver(receiver,
+                new IntentFilter(mContext.getPackageName() + ".action"));
+        Uri uri = BASE_URI.buildUpon().appendPath("action").build();
+        Slice s = Slice.bindSlice(mContext, uri, Collections.<SliceSpec>emptyList());
+        assertEquals(uri, s.getUri());
+        assertEquals(1, s.getItems().size());
+
+        SliceItem item = s.getItems().get(0);
+        assertEquals(FORMAT_ACTION, item.getFormat());
+        try {
+            item.getAction().send();
+        } catch (CanceledException e) {
+        }
+
+        try {
+            latch.await(100, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        assertTrue(sFlag);
+        mContext.unregisterReceiver(receiver);
+    }
+
+    @Test
+    public void testInt() {
+        Uri uri = BASE_URI.buildUpon().appendPath("int").build();
+        Slice s = Slice.bindSlice(mContext, uri, Collections.<SliceSpec>emptyList());
+        assertEquals(uri, s.getUri());
+        assertEquals(1, s.getItems().size());
+
+        SliceItem item = s.getItems().get(0);
+        assertEquals(FORMAT_INT, item.getFormat());
+        assertEquals(0xff121212, item.getInt());
+    }
+
+    @Test
+    public void testTimestamp() {
+        Uri uri = BASE_URI.buildUpon().appendPath("timestamp").build();
+        Slice s = Slice.bindSlice(mContext, uri, Collections.<SliceSpec>emptyList());
+        assertEquals(uri, s.getUri());
+        assertEquals(1, s.getItems().size());
+
+        SliceItem item = s.getItems().get(0);
+        assertEquals(FORMAT_TIMESTAMP, item.getFormat());
+        assertEquals(43, item.getTimestamp());
+    }
+
+    @Test
+    public void testHints() {
+        // Note this tests that hints are propagated through to the client but not that any specific
+        // hints have any effects.
+        Uri uri = BASE_URI.buildUpon().appendPath("hints").build();
+        Slice s = Slice.bindSlice(mContext, uri, Collections.<SliceSpec>emptyList());
+        assertEquals(uri, s.getUri());
+
+        assertEquals(Arrays.asList(HINT_LIST), s.getHints());
+        assertEquals(Arrays.asList(HINT_TITLE), s.getItems().get(0).getHints());
+        assertEquals(Arrays.asList(HINT_NO_TINT, HINT_LARGE),
+                s.getItems().get(1).getHints());
+    }
+}
diff --git a/slices/core/src/androidTest/java/androidx/app/slice/SliceTestProvider.java b/slices/core/src/androidTest/java/androidx/app/slice/SliceTestProvider.java
new file mode 100644
index 0000000..9320bc9
--- /dev/null
+++ b/slices/core/src/androidTest/java/androidx/app/slice/SliceTestProvider.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice;
+
+import static android.app.slice.Slice.HINT_LARGE;
+import static android.app.slice.Slice.HINT_LIST;
+import static android.app.slice.Slice.HINT_NO_TINT;
+import static android.app.slice.Slice.HINT_TITLE;
+
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+
+import androidx.app.slice.Slice.Builder;
+import androidx.app.slice.core.test.R;
+
+public class SliceTestProvider extends androidx.app.slice.SliceProvider {
+
+    @Override
+    public boolean onCreateSliceProvider() {
+        return true;
+    }
+
+    @Override
+    public Slice onBindSlice(Uri sliceUri) {
+        switch (sliceUri.getPath()) {
+            case "/set_flag":
+                SliceTest.sFlag = true;
+                break;
+            case "/subslice":
+                Builder b = new Builder(sliceUri);
+                return b.addSubSlice(new Slice.Builder(b).build(), "subslice").build();
+            case "/text":
+                return new Slice.Builder(sliceUri).addText("Expected text", "text").build();
+            case "/icon":
+                return new Slice.Builder(sliceUri).addIcon(
+                        Icon.createWithResource(getContext(), R.drawable.size_48x48),
+                        "icon").build();
+            case "/action":
+                Builder builder = new Builder(sliceUri);
+                Slice subSlice = new Slice.Builder(builder).build();
+                PendingIntent broadcast = PendingIntent.getBroadcast(getContext(), 0,
+                        new Intent(getContext().getPackageName() + ".action"), 0);
+                return builder.addAction(broadcast, subSlice, "action").build();
+            case "/int":
+                return new Slice.Builder(sliceUri).addInt(0xff121212, "int").build();
+            case "/timestamp":
+                return new Slice.Builder(sliceUri).addTimestamp(43, "timestamp").build();
+            case "/hints":
+                return new Slice.Builder(sliceUri)
+                        .addHints(HINT_LIST)
+                        .addText("Text", null, HINT_TITLE)
+                        .addIcon(Icon.createWithResource(getContext(), R.drawable.size_48x48),
+                                null, HINT_NO_TINT, HINT_LARGE)
+                        .build();
+        }
+        return new Slice.Builder(sliceUri).build();
+    }
+
+}
diff --git a/slices/core/src/androidTest/java/androidx/app/slice/compat/CompatPinnedListTest.java b/slices/core/src/androidTest/java/androidx/app/slice/compat/CompatPinnedListTest.java
new file mode 100644
index 0000000..18bb606
--- /dev/null
+++ b/slices/core/src/androidTest/java/androidx/app/slice/compat/CompatPinnedListTest.java
@@ -0,0 +1,128 @@
+/*
+ * 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.app.slice.compat;
+
+import static android.content.Context.MODE_PRIVATE;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.junit.Assert.assertArrayEquals;
+
+import android.content.Context;
+import android.net.Uri;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import androidx.app.slice.SliceSpec;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class CompatPinnedListTest {
+
+    private final Context mContext = InstrumentationRegistry.getContext();
+    private CompatPinnedList mCompatPinnedList;
+    private List<SliceSpec> mSpecs;
+
+    private static final SliceSpec[] FIRST_SPECS = new SliceSpec[]{
+            new SliceSpec("spec1", 3),
+            new SliceSpec("spec2", 3),
+            new SliceSpec("spec3", 2),
+            new SliceSpec("spec4", 1),
+    };
+
+    private static final SliceSpec[] SECOND_SPECS = new SliceSpec[]{
+            new SliceSpec("spec2", 1),
+            new SliceSpec("spec3", 2),
+            new SliceSpec("spec4", 3),
+            new SliceSpec("spec5", 4),
+    };
+
+    @Before
+    public void setup() {
+        mCompatPinnedList = new CompatPinnedList(mContext, "test_file");
+        mSpecs = Collections.emptyList();
+    }
+
+    @After
+    public void tearDown() {
+        mContext.getSharedPreferences("test_file", MODE_PRIVATE).edit().clear().commit();
+    }
+
+    @Test
+    public void testAddFirstPin() {
+        assertTrue(mCompatPinnedList.addPin(Uri.parse("content://something/something"), "my_pkg",
+                mSpecs));
+    }
+
+    @Test
+    public void testAddSecondPin() {
+        assertTrue(mCompatPinnedList.addPin(Uri.parse("content://something/something"), "my_pkg",
+                mSpecs));
+        assertFalse(mCompatPinnedList.addPin(Uri.parse("content://something/something"), "my_pkg2",
+                mSpecs));
+    }
+
+    @Test
+    public void testAddMultipleUris() {
+        assertTrue(mCompatPinnedList.addPin(Uri.parse("content://something/something"), "my_pkg",
+                mSpecs));
+        assertTrue(mCompatPinnedList.addPin(Uri.parse("content://something/something2"), "my_pkg",
+                mSpecs));
+    }
+
+    @Test
+    public void testRemovePin() {
+        mCompatPinnedList.addPin(Uri.parse("content://something/something"), "my_pkg", mSpecs);
+        mCompatPinnedList.addPin(Uri.parse("content://something/something"), "my_pkg2", mSpecs);
+        assertFalse(mCompatPinnedList.removePin(Uri.parse("content://something/something"),
+                    "my_pkg"));
+        assertTrue(mCompatPinnedList.removePin(Uri.parse("content://something/something"),
+                    "my_pkg2"));
+    }
+
+    @Test
+    public void testMergeSpecs() {
+        Uri uri = Uri.parse("content://something/something");
+
+        assertEquals(Collections.emptyList(), mCompatPinnedList.getSpecs(uri));
+
+        mCompatPinnedList.addPin(uri, "my_pkg", Arrays.asList(FIRST_SPECS));
+        assertArrayEquals(FIRST_SPECS, mCompatPinnedList.getSpecs(uri).toArray(new SliceSpec[0]));
+
+        mCompatPinnedList.addPin(uri, "my_pkg2", Arrays.asList(SECOND_SPECS));
+        assertArrayEquals(new SliceSpec[]{
+                // spec1 is gone because it's not in the second set.
+                new SliceSpec("spec2", 1), // spec2 is 1 because it's smaller in the second set.
+                new SliceSpec("spec3", 2), // spec3 is the same in both sets
+                new SliceSpec("spec4", 1), // spec4 is 1 because it's smaller in the first set.
+                // spec5 is gone because it's not in the first set.
+        }, mCompatPinnedList.getSpecs(uri).toArray(new SliceSpec[0]));
+
+    }
+}
diff --git a/slices/core/src/androidTest/res/drawable/size_48x48.jpg b/slices/core/src/androidTest/res/drawable/size_48x48.jpg
new file mode 100644
index 0000000..5c2291e
--- /dev/null
+++ b/slices/core/src/androidTest/res/drawable/size_48x48.jpg
Binary files differ
diff --git a/design/AndroidManifest.xml b/slices/core/src/main/AndroidManifest.xml
similarity index 70%
copy from design/AndroidManifest.xml
copy to slices/core/src/main/AndroidManifest.xml
index 0eb8b85..ac37d3c 100644
--- a/design/AndroidManifest.xml
+++ b/slices/core/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source Project
+<!-- Copyright (C) 2014 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.
@@ -14,6 +14,11 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="android.support.design">
-    <uses-sdk android:minSdkVersion="14" />
+          package="androidx.app.slice.core">
+    <uses-sdk android:minSdkVersion="28"/>
+
+    <application>
+        <activity android:name="androidx.app.slice.compat.SlicePermissionActivity">
+        </activity>
+    </application>
 </manifest>
diff --git a/slices/core/src/main/java/androidx/app/slice/ArrayUtils.java b/slices/core/src/main/java/androidx/app/slice/ArrayUtils.java
new file mode 100644
index 0000000..669f66a
--- /dev/null
+++ b/slices/core/src/main/java/androidx/app/slice/ArrayUtils.java
@@ -0,0 +1,75 @@
+/*
+ * 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.app.slice;
+
+
+import android.support.annotation.RestrictTo;
+import android.support.annotation.RestrictTo.Scope;
+
+import java.lang.reflect.Array;
+import java.util.Objects;
+
+/**
+ * @hide
+ */
+@RestrictTo(Scope.LIBRARY)
+class ArrayUtils {
+
+    public static <T> boolean contains(T[] array, T item) {
+        for (T t : array) {
+            if (Objects.equals(t, item)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static <T> T[] appendElement(Class<T> kind, T[] array, T element) {
+        final T[] result;
+        final int end;
+        if (array != null) {
+            end = array.length;
+            result = (T[]) Array.newInstance(kind, end + 1);
+            System.arraycopy(array, 0, result, 0, end);
+        } else {
+            end = 0;
+            result = (T[]) Array.newInstance(kind, 1);
+        }
+        result[end] = element;
+        return result;
+    }
+
+    public static <T> T[] removeElement(Class<T> kind, T[] array, T element) {
+        if (array != null) {
+            if (!contains(array, element)) {
+                return array;
+            }
+            final int length = array.length;
+            for (int i = 0; i < length; i++) {
+                if (Objects.equals(array[i], element)) {
+                    if (length == 1) {
+                        return null;
+                    }
+                    T[] result = (T[]) Array.newInstance(kind, length - 1);
+                    System.arraycopy(array, 0, result, 0, i);
+                    System.arraycopy(array, i + 1, result, i, length - i - 1);
+                    return result;
+                }
+            }
+        }
+        return array;
+    }
+}
diff --git a/slices/core/src/main/java/androidx/app/slice/Slice.java b/slices/core/src/main/java/androidx/app/slice/Slice.java
new file mode 100644
index 0000000..779460e
--- /dev/null
+++ b/slices/core/src/main/java/androidx/app/slice/Slice.java
@@ -0,0 +1,486 @@
+/*
+ * 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.app.slice;
+
+import static android.app.slice.Slice.HINT_ACTIONS;
+import static android.app.slice.Slice.HINT_HORIZONTAL;
+import static android.app.slice.Slice.HINT_LARGE;
+import static android.app.slice.Slice.HINT_LIST;
+import static android.app.slice.Slice.HINT_LIST_ITEM;
+import static android.app.slice.Slice.HINT_NO_TINT;
+import static android.app.slice.Slice.HINT_PARTIAL;
+import static android.app.slice.Slice.HINT_SEE_MORE;
+import static android.app.slice.Slice.HINT_SELECTED;
+import static android.app.slice.Slice.HINT_SUMMARY;
+import static android.app.slice.Slice.HINT_TITLE;
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_INT;
+import static android.app.slice.SliceItem.FORMAT_REMOTE_INPUT;
+import static android.app.slice.SliceItem.FORMAT_SLICE;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+import static android.app.slice.SliceItem.FORMAT_TIMESTAMP;
+import static androidx.app.slice.SliceConvert.unwrap;
+
+import android.annotation.TargetApi;
+import android.app.PendingIntent;
+import android.app.RemoteInput;
+import android.content.ContentProvider;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.RestrictTo.Scope;
+import android.support.annotation.StringDef;
+import android.support.v4.os.BuildCompat;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import androidx.app.slice.compat.SliceProviderCompat;
+
+/**
+ * A slice is a piece of app content and actions that can be surfaced outside of the app.
+ *
+ * <p>They are constructed using {@link androidx.app.slice.builders.TemplateSliceBuilder}s
+ * in a tree structure that provides the OS some information about how the content should be
+ * displayed.
+ */
+public final class Slice {
+
+    private static final String HINTS = "hints";
+    private static final String ITEMS = "items";
+    private static final String URI = "uri";
+    private static final String SPEC_TYPE = "type";
+    private static final String SPEC_REVISION = "revision";
+    private final SliceSpec mSpec;
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    @StringDef({HINT_TITLE, HINT_LIST, HINT_LIST_ITEM, HINT_LARGE, HINT_ACTIONS, HINT_SELECTED,
+            HINT_HORIZONTAL, HINT_NO_TINT, HINT_PARTIAL, HINT_SUMMARY, HINT_SEE_MORE})
+    public @interface SliceHint{ }
+
+    private final SliceItem[] mItems;
+    private final @SliceHint String[] mHints;
+    private Uri mUri;
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    Slice(ArrayList<SliceItem> items, @SliceHint String[] hints, Uri uri,
+            SliceSpec spec) {
+        mHints = hints;
+        mItems = items.toArray(new SliceItem[items.size()]);
+        mUri = uri;
+        mSpec = spec;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    public Slice(Bundle in) {
+        mHints = in.getStringArray(HINTS);
+        Parcelable[] items = in.getParcelableArray(ITEMS);
+        mItems = new SliceItem[items.length];
+        for (int i = 0; i < mItems.length; i++) {
+            if (items[i] instanceof Bundle) {
+                mItems[i] = new SliceItem((Bundle) items[i]);
+            }
+        }
+        mUri = in.getParcelable(URI);
+        mSpec = in.containsKey(SPEC_TYPE)
+                ? new SliceSpec(in.getString(SPEC_TYPE), in.getInt(SPEC_REVISION))
+                : null;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    public Bundle toBundle() {
+        Bundle b = new Bundle();
+        b.putStringArray(HINTS, mHints);
+        Parcelable[] p = new Parcelable[mItems.length];
+        for (int i = 0; i < mItems.length; i++) {
+            p[i] = mItems[i].toBundle();
+        }
+        b.putParcelableArray(ITEMS, p);
+        b.putParcelable(URI, mUri);
+        if (mSpec != null) {
+            b.putString(SPEC_TYPE, mSpec.getType());
+            b.putInt(SPEC_REVISION, mSpec.getRevision());
+        }
+        return b;
+    }
+
+    /**
+     * @return The spec for this slice
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public @Nullable SliceSpec getSpec() {
+        return mSpec;
+    }
+
+    /**
+     * @return The Uri that this Slice represents.
+     */
+    public Uri getUri() {
+        return mUri;
+    }
+
+    /**
+     * @return All child {@link SliceItem}s that this Slice contains.
+     */
+    public List<SliceItem> getItems() {
+        return Arrays.asList(mItems);
+    }
+
+    /**
+     * @return All hints associated with this Slice.
+     */
+    public @SliceHint List<String> getHints() {
+        return Arrays.asList(mHints);
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public boolean hasHint(@SliceHint String hint) {
+        return ArrayUtils.contains(mHints, hint);
+    }
+
+    /**
+     * A Builder used to construct {@link Slice}s
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public static class Builder {
+
+        private final Uri mUri;
+        private ArrayList<SliceItem> mItems = new ArrayList<>();
+        private @SliceHint ArrayList<String> mHints = new ArrayList<>();
+        private SliceSpec mSpec;
+
+        /**
+         * Create a builder which will construct a {@link Slice} for the Given Uri.
+         * @param uri Uri to tag for this slice.
+         */
+        public Builder(@NonNull Uri uri) {
+            mUri = uri;
+        }
+
+        /**
+         * Create a builder for a {@link Slice} that is a sub-slice of the slice
+         * being constructed by the provided builder.
+         * @param parent The builder constructing the parent slice
+         */
+        public Builder(@NonNull Slice.Builder parent) {
+            mUri = parent.mUri.buildUpon().appendPath("_gen")
+                    .appendPath(String.valueOf(mItems.size())).build();
+        }
+
+        /**
+         * Add the spec for this slice.
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        public Builder setSpec(SliceSpec spec) {
+            mSpec = spec;
+            return this;
+        }
+
+        /**
+         * Add hints to the Slice being constructed
+         */
+        public Builder addHints(@SliceHint String... hints) {
+            mHints.addAll(Arrays.asList(hints));
+            return this;
+        }
+
+        /**
+         * Add hints to the Slice being constructed
+         */
+        public Builder addHints(@SliceHint List<String> hints) {
+            return addHints(hints.toArray(new String[hints.size()]));
+        }
+
+        /**
+         * Add a sub-slice to the slice being constructed
+         */
+        public Builder addSubSlice(@NonNull Slice slice) {
+            return addSubSlice(slice, null);
+        }
+
+        /**
+         * Add a sub-slice to the slice being constructed
+         * @param subType Optional template-specific type information
+         * @see {@link SliceItem#getSubType()}
+         */
+        public Builder addSubSlice(@NonNull Slice slice, String subType) {
+            mItems.add(new SliceItem(slice, FORMAT_SLICE, subType, slice.getHints().toArray(
+                    new String[slice.getHints().size()])));
+            return this;
+        }
+
+        /**
+         * Add an action to the slice being constructed
+         * @param subType Optional template-specific type information
+         * @see {@link SliceItem#getSubType()}
+         */
+        public Slice.Builder addAction(@NonNull PendingIntent action,
+                @NonNull Slice s, @Nullable String subType) {
+            @SliceHint String[] hints = s != null
+                    ? s.getHints().toArray(new String[s.getHints().size()]) : new String[0];
+            mItems.add(new SliceItem(action, s, FORMAT_ACTION, subType, hints));
+            return this;
+        }
+
+        /**
+         * Add text to the slice being constructed
+         * @param subType Optional template-specific type information
+         * @see {@link SliceItem#getSubType()}
+         */
+        public Builder addText(CharSequence text, @Nullable String subType,
+                @SliceHint String... hints) {
+            mItems.add(new SliceItem(text, FORMAT_TEXT, subType, hints));
+            return this;
+        }
+
+        /**
+         * Add text to the slice being constructed
+         * @param subType Optional template-specific type information
+         * @see {@link SliceItem#getSubType()}
+         */
+        public Builder addText(CharSequence text, @Nullable String subType,
+                @SliceHint List<String> hints) {
+            return addText(text, subType, hints.toArray(new String[hints.size()]));
+        }
+
+        /**
+         * Add an image to the slice being constructed
+         * @param subType Optional template-specific type information
+         * @see {@link SliceItem#getSubType()}
+         */
+        public Builder addIcon(Icon icon, @Nullable String subType,
+                @SliceHint String... hints) {
+            mItems.add(new SliceItem(icon, FORMAT_IMAGE, subType, hints));
+            return this;
+        }
+
+        /**
+         * Add an image to the slice being constructed
+         * @param subType Optional template-specific type information
+         * @see {@link SliceItem#getSubType()}
+         */
+        public Builder addIcon(Icon icon, @Nullable String subType,
+                @SliceHint List<String> hints) {
+            return addIcon(icon, subType, hints.toArray(new String[hints.size()]));
+        }
+
+        /**
+         * Add remote input to the slice being constructed
+         * @param subType Optional template-specific type information
+         * @see {@link SliceItem#getSubType()}
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        public Slice.Builder addRemoteInput(RemoteInput remoteInput, @Nullable String subType,
+                @SliceHint List<String> hints) {
+            return addRemoteInput(remoteInput, subType, hints.toArray(new String[hints.size()]));
+        }
+
+        /**
+         * Add remote input to the slice being constructed
+         * @param subType Optional template-specific type information
+         * @see {@link SliceItem#getSubType()}
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        public Slice.Builder addRemoteInput(RemoteInput remoteInput, @Nullable String subType,
+                @SliceHint String... hints) {
+            mItems.add(new SliceItem(remoteInput, FORMAT_REMOTE_INPUT, subType, hints));
+            return this;
+        }
+
+        /**
+         * Add a int to the slice being constructed
+         * @param subType Optional template-specific type information
+         * @see {@link SliceItem#getSubType()}
+         */
+        public Builder addInt(int value, @Nullable String subType,
+                @SliceHint String... hints) {
+            mItems.add(new SliceItem(value, FORMAT_INT, subType, hints));
+            return this;
+        }
+
+        /**
+         * Add a int to the slice being constructed
+         * @param subType Optional template-specific type information
+         * @see {@link SliceItem#getSubType()}
+         */
+        public Builder addInt(int value, @Nullable String subType,
+                @SliceHint List<String> hints) {
+            return addInt(value, subType, hints.toArray(new String[hints.size()]));
+        }
+
+        /**
+         * Add a timestamp to the slice being constructed
+         * @param subType Optional template-specific type information
+         * @see {@link SliceItem#getSubType()}
+         */
+        public Slice.Builder addTimestamp(long time, @Nullable String subType,
+                @SliceHint String... hints) {
+            mItems.add(new SliceItem(time, FORMAT_TIMESTAMP, subType, hints));
+            return this;
+        }
+
+        /**
+         * Add a timestamp to the slice being constructed
+         * @param subType Optional template-specific type information
+         * @see {@link SliceItem#getSubType()}
+         */
+        public Slice.Builder addTimestamp(long time, @Nullable String subType,
+                @SliceHint List<String> hints) {
+            return addTimestamp(time, subType, hints.toArray(new String[hints.size()]));
+        }
+
+        /**
+         * Add a SliceItem to the slice being constructed.
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY)
+        public Slice.Builder addItem(SliceItem item) {
+            mItems.add(item);
+            return this;
+        }
+
+        /**
+         * Construct the slice.
+         */
+        public Slice build() {
+            return new Slice(mItems, mHints.toArray(new String[mHints.size()]), mUri, mSpec);
+        }
+    }
+
+    /**
+     * @hide
+     * @return A string representation of this slice.
+     */
+    @RestrictTo(Scope.LIBRARY)
+    @Override
+    public String toString() {
+        return toString("");
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    public String toString(String indent) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < mItems.length; i++) {
+            sb.append(indent);
+            if (FORMAT_SLICE.equals(mItems[i].getFormat())) {
+                sb.append("slice:\n");
+                sb.append(mItems[i].getSlice().toString(indent + "   "));
+            } else if (FORMAT_ACTION.equals(mItems[i].getFormat())) {
+                sb.append("action:\n");
+                sb.append(mItems[i].getSlice().toString(indent + "   "));
+            } else if (FORMAT_TEXT.equals(mItems[i].getFormat())) {
+                sb.append("text: ");
+                sb.append(mItems[i].getText());
+                sb.append("\n");
+            } else {
+                sb.append(SliceItem.typeToString(mItems[i].getFormat()));
+                sb.append("\n");
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Turns a slice Uri into slice content.
+     *
+     * @hide
+     * @param context Context to be used.
+     * @param uri The URI to a slice provider
+     * @return The Slice provided by the app or null if none is given.
+     * @see Slice
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @SuppressWarnings("NewApi")
+    public static @Nullable Slice bindSlice(Context context, @NonNull Uri uri,
+                List<SliceSpec> supportedSpecs) {
+        if (BuildCompat.isAtLeastP()) {
+            return callBindSlice(context, uri, supportedSpecs);
+        } else {
+            return SliceProviderCompat.bindSlice(context, uri, supportedSpecs);
+        }
+    }
+
+    @TargetApi(28)
+    private static Slice callBindSlice(Context context, Uri uri,
+            List<SliceSpec> supportedSpecs) {
+        return SliceConvert.wrap(android.app.slice.Slice.bindSlice(
+                context.getContentResolver(), uri, unwrap(supportedSpecs)));
+    }
+
+
+    /**
+     * Turns a slice intent into slice content. Expects an explicit intent. If there is no
+     * {@link ContentProvider} associated with the given intent this will throw
+     * {@link IllegalArgumentException}.
+     *
+     * @hide
+     * @param context The context to use.
+     * @param intent The intent associated with a slice.
+     * @return The Slice provided by the app or null if none is given.
+     * @see Slice
+     * @see SliceProvider#onMapIntentToUri(Intent)
+     * @see Intent
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @SuppressWarnings("NewApi")
+    public static @Nullable Slice bindSlice(Context context, @NonNull Intent intent,
+                List<SliceSpec> supportedSpecs) {
+        if (BuildCompat.isAtLeastP()) {
+            return callBindSlice(context, intent, supportedSpecs);
+        } else {
+            return SliceProviderCompat.bindSlice(context, intent, supportedSpecs);
+        }
+    }
+
+    @TargetApi(28)
+    private static Slice callBindSlice(Context context, Intent intent,
+            List<SliceSpec> supportedSpecs) {
+        return SliceConvert.wrap(android.app.slice.Slice.bindSlice(
+                context, intent, unwrap(supportedSpecs)));
+    }
+}
diff --git a/slices/core/src/main/java/androidx/app/slice/SliceConvert.java b/slices/core/src/main/java/androidx/app/slice/SliceConvert.java
new file mode 100644
index 0000000..0bacae7
--- /dev/null
+++ b/slices/core/src/main/java/androidx/app/slice/SliceConvert.java
@@ -0,0 +1,144 @@
+/*
+ * 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.app.slice;
+
+
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_INT;
+import static android.app.slice.SliceItem.FORMAT_REMOTE_INPUT;
+import static android.app.slice.SliceItem.FORMAT_SLICE;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+import static android.app.slice.SliceItem.FORMAT_TIMESTAMP;
+
+import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Convert between {@link androidx.app.slice.Slice} and {@link android.app.slice.Slice}
+ */
+@RequiresApi(28)
+public class SliceConvert {
+
+    /**
+     * Convert {@link androidx.app.slice.Slice} to {@link android.app.slice.Slice}
+     */
+    public static android.app.slice.Slice unwrap(androidx.app.slice.Slice slice) {
+        android.app.slice.Slice.Builder builder = new android.app.slice.Slice.Builder(
+                slice.getUri());
+        builder.addHints(slice.getHints());
+        builder.setSpec(unwrap(slice.getSpec()));
+        for (androidx.app.slice.SliceItem item : slice.getItems()) {
+            switch (item.getFormat()) {
+                case FORMAT_SLICE:
+                    builder.addSubSlice(unwrap(item.getSlice()), item.getSubType());
+                    break;
+                case FORMAT_IMAGE:
+                    builder.addIcon(item.getIcon(), item.getSubType(), item.getHints());
+                    break;
+                case FORMAT_REMOTE_INPUT:
+                    builder.addRemoteInput(item.getRemoteInput(), item.getSubType(),
+                            item.getHints());
+                    break;
+                case FORMAT_ACTION:
+                    builder.addAction(item.getAction(), unwrap(item.getSlice()), item.getSubType());
+                    break;
+                case FORMAT_TEXT:
+                    builder.addText(item.getText(), item.getSubType(), item.getHints());
+                    break;
+                case FORMAT_INT:
+                    builder.addInt(item.getInt(), item.getSubType(), item.getHints());
+                    break;
+                case FORMAT_TIMESTAMP:
+                    builder.addTimestamp(item.getTimestamp(), item.getSubType(), item.getHints());
+                    break;
+            }
+        }
+        return builder.build();
+    }
+
+    private static android.app.slice.SliceSpec unwrap(androidx.app.slice.SliceSpec spec) {
+        if (spec == null) return null;
+        return new android.app.slice.SliceSpec(spec.getType(), spec.getRevision());
+    }
+
+    static List<android.app.slice.SliceSpec> unwrap(
+            List<androidx.app.slice.SliceSpec> supportedSpecs) {
+        List<android.app.slice.SliceSpec> ret = new ArrayList<>();
+        for (androidx.app.slice.SliceSpec spec : supportedSpecs) {
+            ret.add(unwrap(spec));
+        }
+        return ret;
+    }
+
+    /**
+     * Convert {@link android.app.slice.Slice} to {@link androidx.app.slice.Slice}
+     */
+    public static androidx.app.slice.Slice wrap(android.app.slice.Slice slice) {
+        androidx.app.slice.Slice.Builder builder = new androidx.app.slice.Slice.Builder(
+                slice.getUri());
+        builder.addHints(slice.getHints());
+        builder.setSpec(wrap(slice.getSpec()));
+        for (android.app.slice.SliceItem item : slice.getItems()) {
+            switch (item.getFormat()) {
+                case FORMAT_SLICE:
+                    builder.addSubSlice(wrap(item.getSlice()), item.getSubType());
+                    break;
+                case FORMAT_IMAGE:
+                    builder.addIcon(item.getIcon(), item.getSubType(), item.getHints());
+                    break;
+                case FORMAT_REMOTE_INPUT:
+                    builder.addRemoteInput(item.getRemoteInput(), item.getSubType(),
+                            item.getHints());
+                    break;
+                case FORMAT_ACTION:
+                    builder.addAction(item.getAction(), wrap(item.getSlice()), item.getSubType());
+                    break;
+                case FORMAT_TEXT:
+                    builder.addText(item.getText(), item.getSubType(), item.getHints());
+                    break;
+                case FORMAT_INT:
+                    builder.addInt(item.getInt(), item.getSubType(), item.getHints());
+                    break;
+                case FORMAT_TIMESTAMP:
+                    builder.addTimestamp(item.getTimestamp(), item.getSubType(), item.getHints());
+                    break;
+            }
+        }
+        return builder.build();
+    }
+
+    private static androidx.app.slice.SliceSpec wrap(android.app.slice.SliceSpec spec) {
+        if (spec == null) return null;
+        return new androidx.app.slice.SliceSpec(spec.getType(), spec.getRevision());
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public static List<androidx.app.slice.SliceSpec> wrap(
+            List<android.app.slice.SliceSpec> supportedSpecs) {
+        List<androidx.app.slice.SliceSpec> ret = new ArrayList<>();
+        for (android.app.slice.SliceSpec spec : supportedSpecs) {
+            ret.add(wrap(spec));
+        }
+        return ret;
+    }
+}
diff --git a/slices/core/src/main/java/androidx/app/slice/SliceItem.java b/slices/core/src/main/java/androidx/app/slice/SliceItem.java
new file mode 100644
index 0000000..e7d2729
--- /dev/null
+++ b/slices/core/src/main/java/androidx/app/slice/SliceItem.java
@@ -0,0 +1,391 @@
+/*
+ * 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.app.slice;
+
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_INT;
+import static android.app.slice.SliceItem.FORMAT_REMOTE_INPUT;
+import static android.app.slice.SliceItem.FORMAT_SLICE;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+import static android.app.slice.SliceItem.FORMAT_TIMESTAMP;
+
+import android.app.PendingIntent;
+import android.app.RemoteInput;
+import android.graphics.drawable.Icon;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.support.annotation.NonNull;
+import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.RestrictTo.Scope;
+import android.support.annotation.StringDef;
+import android.text.TextUtils;
+import android.util.Pair;
+
+import java.util.Arrays;
+import java.util.List;
+
+
+/**
+ * A SliceItem is a single unit in the tree structure of a {@link Slice}.
+ * <p>
+ * A SliceItem a piece of content and some hints about what that content
+ * means or how it should be displayed. The types of content can be:
+ * <li>{@link android.app.slice.SliceItem#FORMAT_SLICE}</li>
+ * <li>{@link android.app.slice.SliceItem#FORMAT_TEXT}</li>
+ * <li>{@link android.app.slice.SliceItem#FORMAT_IMAGE}</li>
+ * <li>{@link android.app.slice.SliceItem#FORMAT_ACTION}</li>
+ * <li>{@link android.app.slice.SliceItem#FORMAT_INT}</li>
+ * <li>{@link android.app.slice.SliceItem#FORMAT_TIMESTAMP}</li>
+ * <p>
+ * The hints that a {@link SliceItem} are a set of strings which annotate
+ * the content. The hints that are guaranteed to be understood by the system
+ * are defined on {@link Slice}.
+ */
+public class SliceItem {
+
+    private static final String HINTS = "hints";
+    private static final String FORMAT = "format";
+    private static final String SUBTYPE = "subtype";
+    private static final String OBJ = "obj";
+    private static final String OBJ_2 = "obj_2";
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    @StringDef({FORMAT_SLICE, FORMAT_TEXT, FORMAT_IMAGE, FORMAT_ACTION, FORMAT_INT,
+            FORMAT_TIMESTAMP, FORMAT_REMOTE_INPUT})
+    public @interface SliceType {
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    protected @Slice.SliceHint String[] mHints;
+    private final String mFormat;
+    private final String mSubType;
+    private final Object mObj;
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    public SliceItem(Object obj, @SliceType String format, String subType,
+            @Slice.SliceHint String[] hints) {
+        mHints = hints;
+        mFormat = format;
+        mSubType = subType;
+        mObj = obj;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    public SliceItem(Object obj, @SliceType String format, String subType,
+            @Slice.SliceHint List<String> hints) {
+        this (obj, format, subType, hints.toArray(new String[hints.size()]));
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    public SliceItem(PendingIntent intent, Slice slice, String format, String subType,
+            @Slice.SliceHint String[] hints) {
+        this(new Pair<>(intent, slice), format, subType, hints);
+    }
+
+    /**
+     * Gets all hints associated with this SliceItem.
+     *
+     * @return Array of hints.
+     */
+    public @NonNull @Slice.SliceHint List<String> getHints() {
+        return Arrays.asList(mHints);
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    public void addHint(@Slice.SliceHint String hint) {
+        mHints = ArrayUtils.appendElement(String.class, mHints, hint);
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    public void removeHint(String hint) {
+        ArrayUtils.removeElement(String.class, mHints, hint);
+    }
+
+    /**
+     * Get the format of this SliceItem.
+     * <p>
+     * The format will be one of the following types supported by the platform:
+     * <li>{@link android.app.slice.SliceItem#FORMAT_SLICE}</li>
+     * <li>{@link android.app.slice.SliceItem#FORMAT_TEXT}</li>
+     * <li>{@link android.app.slice.SliceItem#FORMAT_IMAGE}</li>
+     * <li>{@link android.app.slice.SliceItem#FORMAT_ACTION}</li>
+     * <li>{@link android.app.slice.SliceItem#FORMAT_INT}</li>
+     * <li>{@link android.app.slice.SliceItem#FORMAT_TIMESTAMP}</li>
+     * <li>{@link android.app.slice.SliceItem#FORMAT_REMOTE_INPUT}</li>
+     * @see #getSubType() ()
+     */
+    public @SliceType String getFormat() {
+        return mFormat;
+    }
+
+    /**
+     * Get the sub-type of this SliceItem.
+     * <p>
+     * Subtypes provide additional information about the type of this information beyond basic
+     * interpretations inferred by {@link #getFormat()}. For example a slice may contain
+     * many {@link android.app.slice.SliceItem#FORMAT_TEXT} items, but only some of them may be
+     * {@link android.app.slice.Slice#SUBTYPE_MESSAGE}.
+     * @see #getFormat()
+     */
+    public String getSubType() {
+        return mSubType;
+    }
+
+    /**
+     * @return The text held by this {@link android.app.slice.SliceItem#FORMAT_TEXT} SliceItem
+     */
+    public CharSequence getText() {
+        return (CharSequence) mObj;
+    }
+
+    /**
+     * @return The icon held by this {@link android.app.slice.SliceItem#FORMAT_IMAGE} SliceItem
+     */
+    @RequiresApi(23)
+    public Icon getIcon() {
+        return (Icon) mObj;
+    }
+
+    /**
+     * @return The pending intent held by this {@link android.app.slice.SliceItem#FORMAT_ACTION}
+     * SliceItem
+     */
+    public PendingIntent getAction() {
+        return ((Pair<PendingIntent, Slice>) mObj).first;
+    }
+
+    /**
+     * @return The remote input held by this {@link android.app.slice.SliceItem#FORMAT_REMOTE_INPUT}
+     * SliceItem
+     * @hide
+     */
+    @RequiresApi(20)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public RemoteInput getRemoteInput() {
+        return (RemoteInput) mObj;
+    }
+
+    /**
+     * @return The color held by this {@link android.app.slice.SliceItem#FORMAT_INT} SliceItem
+     */
+    public int getInt() {
+        return (Integer) mObj;
+    }
+
+    /**
+     * @return The slice held by this {@link android.app.slice.SliceItem#FORMAT_ACTION} or
+     * {@link android.app.slice.SliceItem#FORMAT_SLICE} SliceItem
+     */
+    public Slice getSlice() {
+        if (FORMAT_ACTION.equals(getFormat())) {
+            return ((Pair<PendingIntent, Slice>) mObj).second;
+        }
+        return (Slice) mObj;
+    }
+
+    /**
+     * @return The timestamp held by this {@link android.app.slice.SliceItem#FORMAT_TIMESTAMP}
+     * SliceItem
+     */
+    public long getTimestamp() {
+        return (Long) mObj;
+    }
+
+    /**
+     * @param hint The hint to check for
+     * @return true if this item contains the given hint
+     */
+    public boolean hasHint(@Slice.SliceHint String hint) {
+        return ArrayUtils.contains(mHints, hint);
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    public SliceItem(Bundle in) {
+        mHints = in.getStringArray(HINTS);
+        mFormat = in.getString(FORMAT);
+        mSubType = in.getString(SUBTYPE);
+        mObj = readObj(mFormat, in);
+    }
+
+    /**
+     * @hide
+     * @return
+     */
+    @RestrictTo(Scope.LIBRARY)
+    public Bundle toBundle() {
+        Bundle b = new Bundle();
+        b.putStringArray(HINTS, mHints);
+        b.putString(FORMAT, mFormat);
+        b.putString(SUBTYPE, mSubType);
+        writeObj(b, mObj, mFormat);
+        return b;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    public boolean hasHints(@Slice.SliceHint String[] hints) {
+        if (hints == null) return true;
+        for (String hint : hints) {
+            if (!TextUtils.isEmpty(hint) && !ArrayUtils.contains(mHints, hint)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    public boolean hasAnyHints(@Slice.SliceHint String... hints) {
+        if (hints == null) return false;
+        for (String hint : hints) {
+            if (ArrayUtils.contains(mHints, hint)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void writeObj(Bundle dest, Object obj, String type) {
+        switch (type) {
+            case FORMAT_IMAGE:
+            case FORMAT_REMOTE_INPUT:
+                dest.putParcelable(OBJ, (Parcelable) obj);
+                break;
+            case FORMAT_SLICE:
+                dest.putParcelable(OBJ, ((Slice) obj).toBundle());
+                break;
+            case FORMAT_ACTION:
+                dest.putParcelable(OBJ, ((Pair<PendingIntent, Slice>) obj).first);
+                dest.putBundle(OBJ_2, ((Pair<PendingIntent, Slice>) obj).second.toBundle());
+                break;
+            case FORMAT_TEXT:
+                dest.putCharSequence(OBJ, (CharSequence) obj);
+                break;
+            case FORMAT_INT:
+                dest.putInt(OBJ, (Integer) mObj);
+                break;
+            case FORMAT_TIMESTAMP:
+                dest.putLong(OBJ, (Long) mObj);
+                break;
+        }
+    }
+
+    private static Object readObj(String type, Bundle in) {
+        switch (type) {
+            case FORMAT_IMAGE:
+            case FORMAT_REMOTE_INPUT:
+                return in.getParcelable(OBJ);
+            case FORMAT_SLICE:
+                return new Slice(in.getBundle(OBJ));
+            case FORMAT_TEXT:
+                return in.getCharSequence(OBJ);
+            case FORMAT_ACTION:
+                return new Pair<>(
+                        (PendingIntent) in.getParcelable(OBJ),
+                        new Slice(in.getBundle(OBJ_2)));
+            case FORMAT_INT:
+                return in.getInt(OBJ);
+            case FORMAT_TIMESTAMP:
+                return in.getLong(OBJ);
+        }
+        throw new RuntimeException("Unsupported type " + type);
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    public static String typeToString(String format) {
+        switch (format) {
+            case FORMAT_SLICE:
+                return "Slice";
+            case FORMAT_TEXT:
+                return "Text";
+            case FORMAT_IMAGE:
+                return "Image";
+            case FORMAT_ACTION:
+                return "Action";
+            case FORMAT_INT:
+                return "Int";
+            case FORMAT_TIMESTAMP:
+                return "Timestamp";
+            case FORMAT_REMOTE_INPUT:
+                return "RemoteInput";
+        }
+        return "Unrecognized format: " + format;
+    }
+
+    /**
+     * @hide
+     * @return A string representation of this slice item.
+     */
+    @RestrictTo(Scope.LIBRARY)
+    @Override
+    public String toString() {
+        return toString("");
+    }
+
+    private String toString(String indent) {
+        StringBuilder sb = new StringBuilder();
+        sb.append(indent);
+        if (FORMAT_SLICE.equals(mFormat)) {
+            sb.append("slice:\n");
+            sb.append(getSlice().toString(indent + "   "));
+        } else if (FORMAT_ACTION.equals(mFormat)) {
+            sb.append("action:\n");
+            sb.append(getSlice().toString(indent + "   "));
+        } else if (FORMAT_TEXT.equals(mFormat)) {
+            sb.append("text: ");
+            sb.append(getText());
+            sb.append("\n");
+        } else {
+            sb.append(SliceItem.typeToString(getFormat()));
+            sb.append("\n");
+        }
+        return sb.toString();
+    }
+}
diff --git a/slices/core/src/main/java/androidx/app/slice/SliceProvider.java b/slices/core/src/main/java/androidx/app/slice/SliceProvider.java
new file mode 100644
index 0000000..80b9879
--- /dev/null
+++ b/slices/core/src/main/java/androidx/app/slice/SliceProvider.java
@@ -0,0 +1,183 @@
+/*
+ * 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.app.slice;
+
+import android.content.ContentProvider;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ProviderInfo;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.RestrictTo;
+import android.support.v4.os.BuildCompat;
+
+import java.util.List;
+
+import androidx.app.slice.compat.ContentProviderWrapper;
+import androidx.app.slice.compat.SliceProviderCompat;
+import androidx.app.slice.compat.SliceProviderWrapperContainer;
+
+/**
+ * A SliceProvider allows an app to provide content to be displayed in system spaces. This content
+ * is templated and can contain actions, and the behavior of how it is surfaced is specific to the
+ * system surface.
+ * <p>
+ * Slices are not currently live content. They are bound once and shown to the user. If the content
+ * changes due to a callback from user interaction, then
+ * {@link ContentResolver#notifyChange(Uri, ContentObserver)} should be used to notify the system.
+ * </p>
+ * <p>
+ * The provider needs to be declared in the manifest to provide the authority for the app. The
+ * authority for most slices is expected to match the package of the application.
+ * </p>
+ *
+ * <pre class="prettyprint">
+ * {@literal
+ * <provider
+ *     android:name="com.android.mypkg.MySliceProvider"
+ *     android:authorities="com.android.mypkg" />}
+ * </pre>
+ * <p>
+ * Slices can be identified by a Uri or by an Intent. To link an Intent with a slice, the provider
+ * must have an {@link IntentFilter} matching the slice intent. When a slice is being requested via
+ * an intent, {@link #onMapIntentToUri(Intent)} can be called and is expected to return an
+ * appropriate Uri representing the slice.
+ *
+ * <pre class="prettyprint">
+ * {@literal
+ * <provider
+ *     android:name="com.android.mypkg.MySliceProvider"
+ *     android:authorities="com.android.mypkg">
+ *     <intent-filter>
+ *         <action android:name="android.intent.action.MY_SLICE_INTENT" />
+ *     </intent-filter>
+ * </provider>}
+ * </pre>
+ *
+ * @see android.app.slice.Slice
+ */
+public abstract class SliceProvider extends ContentProviderWrapper {
+
+    private static List<SliceSpec> sSpecs;
+
+    @Override
+    public void attachInfo(Context context, ProviderInfo info) {
+        ContentProvider impl;
+        if (BuildCompat.isAtLeastP()) {
+            impl = new SliceProviderWrapperContainer.SliceProviderWrapper(this);
+        } else {
+            impl = new SliceProviderCompat(this);
+        }
+        super.attachInfo(context, info, impl);
+    }
+
+    /**
+     * Implement this to initialize your slice provider on startup.
+     * This method is called for all registered slice providers on the
+     * application main thread at application launch time.  It must not perform
+     * lengthy operations, or application startup will be delayed.
+     *
+     * <p>You should defer nontrivial initialization (such as opening,
+     * upgrading, and scanning databases) until the slice provider is used
+     * (via #onBindSlice, etc).  Deferred initialization
+     * keeps application startup fast, avoids unnecessary work if the provider
+     * turns out not to be needed, and stops database errors (such as a full
+     * disk) from halting application launch.
+     *
+     * @return true if the provider was successfully loaded, false otherwise
+     */
+    public abstract boolean onCreateSliceProvider();
+
+    /**
+     * Implemented to create a slice. Will be called on the main thread.
+     * <p>
+     * onBindSlice should return as quickly as possible so that the UI tied
+     * to this slice can be responsive. No network or other IO will be allowed
+     * during onBindSlice. Any loading that needs to be done should happen
+     * off the main thread with a call to {@link ContentResolver#notifyChange(Uri, ContentObserver)}
+     * when the app is ready to provide the complete data in onBindSlice.
+     * <p>
+     *
+     * @see {@link Slice}.
+     * @see {@link android.app.slice.Slice#HINT_PARTIAL}
+     */
+    // TODO: Provide alternate notifyChange that takes in the slice (i.e. notifyChange(Uri, Slice)).
+    public abstract Slice onBindSlice(Uri sliceUri);
+
+    /**
+     * Called to inform an app that a slice has been pinned.
+     * <p>
+     * Pinning is a way that slice hosts use to notify apps of which slices
+     * they care about updates for. When a slice is pinned the content is
+     * expected to be relatively fresh and kept up to date.
+     * <p>
+     * Being pinned does not provide any escalated privileges for the slice
+     * provider. So apps should do things such as turn on syncing or schedule
+     * a job in response to a onSlicePinned.
+     * <p>
+     * Pinned state is not persisted through a reboot, and apps can expect a
+     * new call to onSlicePinned for any slices that should remain pinned
+     * after a reboot occurs.
+     *
+     * @param sliceUri The uri of the slice being unpinned.
+     * @see #onSliceUnpinned(Uri)
+     */
+    public void onSlicePinned(Uri sliceUri) {
+    }
+
+    /**
+     * Called to inform an app that a slices is no longer pinned.
+     * <p>
+     * This means that no other apps on the device care about updates to this
+     * slice anymore and therefore it is not important to be updated. Any syncs
+     * or jobs related to this slice should be cancelled.
+     * @see #onSlicePinned(Uri)
+     */
+    public void onSliceUnpinned(Uri sliceUri) {
+    }
+
+    /**
+     * This method must be overridden if an {@link IntentFilter} is specified on the SliceProvider.
+     * In that case, this method can be called and is expected to return a non-null Uri representing
+     * a slice. Otherwise this will throw {@link UnsupportedOperationException}.
+     *
+     * @return Uri representing the slice associated with the provided intent.
+     * @see {@link android.app.slice.Slice}
+     */
+    public @NonNull Uri onMapIntentToUri(Intent intent) {
+        throw new UnsupportedOperationException(
+                "This provider has not implemented intent to uri mapping");
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public static void setSpecs(List<SliceSpec> specs) {
+        sSpecs = specs;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public static List<SliceSpec> getCurrentSpecs() {
+        return sSpecs;
+    }
+}
diff --git a/slices/core/src/main/java/androidx/app/slice/SliceSpec.java b/slices/core/src/main/java/androidx/app/slice/SliceSpec.java
new file mode 100644
index 0000000..0d7a157
--- /dev/null
+++ b/slices/core/src/main/java/androidx/app/slice/SliceSpec.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice;
+
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.RestrictTo;
+
+/**
+ * Class describing the structure of the data contained within a slice.
+ * <p>
+ * A data version contains a string which describes the type of structure
+ * and a revision which denotes this specific implementation. Revisions are expected
+ * to be backwards compatible and monotonically increasing. Meaning if a
+ * SliceSpec has the same type and an equal or lesser revision,
+ * it is expected to be compatible.
+ * <p>
+ * Apps rendering slices will provide a list of supported versions to the OS which
+ * will also be given to the app. Apps should only return a {@link Slice} with a
+ * {@link SliceSpec} that one of the supported {@link SliceSpec}s provided
+ * {@link #canRender}.
+ *
+ * @hide
+ * @see Slice
+ * @see SliceProvider#onBindSlice(Uri)
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class SliceSpec {
+
+    private final String mType;
+    private final int mRevision;
+
+    public SliceSpec(@NonNull String type, int revision) {
+        mType = type;
+        mRevision = revision;
+    }
+
+    /**
+     * Gets the type of the version.
+     */
+    public String getType() {
+        return mType;
+    }
+
+    /**
+     * Gets the revision of the version.
+     */
+    public int getRevision() {
+        return mRevision;
+    }
+
+    /**
+     * Indicates that this spec can be used to render the specified spec.
+     * <p>
+     * Rendering support is not bi-directional (e.g. Spec v3 can render
+     * Spec v2, but Spec v2 cannot render Spec v3).
+     *
+     * @param candidate candidate format of data.
+     * @return true if versions are compatible.
+     * @see androidx.app.slice.widget.SliceView
+     */
+    public boolean canRender(@NonNull SliceSpec candidate) {
+        if (!mType.equals(candidate.mType)) return false;
+        return mRevision >= candidate.mRevision;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof SliceSpec)) return false;
+        SliceSpec other = (SliceSpec) obj;
+        return mType.equals(other.mType) && mRevision == other.mRevision;
+    }
+}
diff --git a/slices/core/src/main/java/androidx/app/slice/SliceSpecs.java b/slices/core/src/main/java/androidx/app/slice/SliceSpecs.java
new file mode 100644
index 0000000..ed4658d
--- /dev/null
+++ b/slices/core/src/main/java/androidx/app/slice/SliceSpecs.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice;
+
+import android.support.annotation.RestrictTo;
+
+/**
+ * Constants for each of the slice specs
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class SliceSpecs {
+
+    /**
+     * Most basic slice, only has icon, title, and summary.
+     */
+    public static final SliceSpec BASIC = new SliceSpec("androidx.app.slice.BASIC", 1);
+
+    /**
+     * List of rows, each row has start/end items, title, summary.
+     * Also supports grid rows.
+     */
+    public static final SliceSpec LIST = new SliceSpec("androidx.app.slice.LIST", 1);
+
+    /**
+     * Messaging template. Each message contains a timestamp and a message, it optionally contains
+     * a source of where the message came from.
+     */
+    public static final SliceSpec MESSAGING = new SliceSpec("androidx.app.slice.MESSAGING", 1);
+
+    /**
+     * Grid template.
+     * Lists can contain grids, so use the same spec for both. Grid needs a spec to use because
+     * it can be a top level builder.
+     */
+    public static final SliceSpec GRID = LIST;
+}
diff --git a/slices/core/src/main/java/androidx/app/slice/compat/CompatPinnedList.java b/slices/core/src/main/java/androidx/app/slice/compat/CompatPinnedList.java
new file mode 100644
index 0000000..7a3b900
--- /dev/null
+++ b/slices/core/src/main/java/androidx/app/slice/compat/CompatPinnedList.java
@@ -0,0 +1,179 @@
+/*
+ * 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.app.slice.compat;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.os.SystemClock;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.VisibleForTesting;
+import android.support.v4.util.ArraySet;
+import android.text.TextUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+import androidx.app.slice.SliceSpec;
+
+/**
+ * Tracks the current packages requesting pinning of any given slice. It will clear the
+ * list after a reboot since the packages are no longer requesting pinning.
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+public class CompatPinnedList {
+
+    private static final String LAST_BOOT = "last_boot";
+    private static final String PIN_PREFIX = "pinned_";
+    private static final String SPEC_NAME_PREFIX = "spec_names_";
+    private static final String SPEC_REV_PREFIX = "spec_revs_";
+
+    // Max skew between bootup times that we think its probably rebooted.
+    // There could be some difference in our calculated boot up time if the thread
+    // sleeps between currentTimeMillis and elapsedRealtime.
+    // Its probably safe to assume the device can't boot twice within 2 secs.
+    private static final long BOOT_THRESHOLD = 2000;
+
+    private final Context mContext;
+    private final String mPrefsName;
+
+    public CompatPinnedList(Context context, String prefsName) {
+        mContext = context;
+        mPrefsName = prefsName;
+    }
+
+    private SharedPreferences getPrefs() {
+        SharedPreferences prefs = mContext.getSharedPreferences(mPrefsName, Context.MODE_PRIVATE);
+        long lastBootTime = prefs.getLong(LAST_BOOT, 0);
+        long currentBootTime = getBootTime();
+        if (Math.abs(lastBootTime - currentBootTime) > BOOT_THRESHOLD) {
+            prefs.edit()
+                    .clear()
+                    .putLong(LAST_BOOT, currentBootTime)
+                    .commit();
+        }
+        return prefs;
+    }
+
+    private Set<String> getPins(Uri uri) {
+        return getPrefs().getStringSet(PIN_PREFIX + uri.toString(), new ArraySet<String>());
+    }
+
+    /**
+     * Get the list of specs for a pinned Uri.
+     */
+    public synchronized List<SliceSpec> getSpecs(Uri uri) {
+        List<SliceSpec> specs = new ArrayList<>();
+        SharedPreferences prefs = getPrefs();
+        String specNamesStr = prefs.getString(SPEC_NAME_PREFIX + uri.toString(), null);
+        String specRevsStr = prefs.getString(SPEC_REV_PREFIX + uri.toString(), null);
+        if (TextUtils.isEmpty(specNamesStr) || TextUtils.isEmpty(specRevsStr)) {
+            return Collections.emptyList();
+        }
+        String[] specNames = specNamesStr.split(",");
+        String[] specRevs = specRevsStr.split(",");
+        if (specNames.length != specRevs.length) {
+            return Collections.emptyList();
+        }
+        for (int i = 0; i < specNames.length; i++) {
+            specs.add(new SliceSpec(specNames[i], Integer.parseInt(specRevs[i])));
+        }
+        return specs;
+    }
+
+    private void setPins(Uri uri, Set<String> pins) {
+        getPrefs().edit()
+                .putStringSet(PIN_PREFIX + uri.toString(), pins)
+                .commit();
+    }
+
+    private void setSpecs(Uri uri, List<SliceSpec> specs) {
+        String[] specNames = new String[specs.size()];
+        String[] specRevs = new String[specs.size()];
+        for (int i = 0; i < specs.size(); i++) {
+            specNames[i] = specs.get(i).getType();
+            specRevs[i] = String.valueOf(specs.get(i).getRevision());
+        }
+        getPrefs().edit()
+                .putString(SPEC_NAME_PREFIX + uri.toString(), TextUtils.join(",", specNames))
+                .putString(SPEC_REV_PREFIX + uri.toString(), TextUtils.join(",", specRevs))
+                .commit();
+    }
+
+    @VisibleForTesting
+    protected long getBootTime() {
+        return System.currentTimeMillis() - SystemClock.elapsedRealtime();
+    }
+
+    /**
+     * Adds a pin for a specific uri/pkg pair and returns true if the
+     * uri was not previously pinned.
+     */
+    public synchronized boolean addPin(Uri uri, String pkg, List<SliceSpec> specs) {
+        Set<String> pins = getPins(uri);
+        boolean wasNotPinned = pins.isEmpty();
+        pins.add(pkg);
+        setPins(uri, pins);
+        if (wasNotPinned) {
+            setSpecs(uri, specs);
+        } else {
+            setSpecs(uri, mergeSpecs(getSpecs(uri), specs));
+        }
+        return wasNotPinned;
+    }
+
+    /**
+     * Removes a pin for a specific uri/pkg pair and returns true if the
+     * uri is no longer pinned (but was).
+     */
+    public synchronized boolean removePin(Uri uri, String pkg) {
+        Set<String> pins = getPins(uri);
+        if (pins.isEmpty() || !pins.contains(pkg)) {
+            return false;
+        }
+        pins.remove(pkg);
+        setPins(uri, pins);
+        return pins.size() == 0;
+    }
+
+    private static List<SliceSpec> mergeSpecs(List<SliceSpec> specs,
+            List<SliceSpec> supportedSpecs) {
+        for (int i = 0; i < specs.size(); i++) {
+            SliceSpec s = specs.get(i);
+            SliceSpec other = findSpec(supportedSpecs, s.getType());
+            if (other == null) {
+                specs.remove(i--);
+            } else if (other.getRevision() < s.getRevision()) {
+                specs.set(i, other);
+            }
+        }
+        return specs;
+    }
+
+    private static SliceSpec findSpec(List<SliceSpec> specs, String type) {
+        for (SliceSpec spec : specs) {
+            if (Objects.equals(spec.getType(), type)) {
+                return spec;
+            }
+        }
+        return null;
+    }
+}
diff --git a/slices/core/src/main/java/androidx/app/slice/compat/ContentProviderWrapper.java b/slices/core/src/main/java/androidx/app/slice/compat/ContentProviderWrapper.java
new file mode 100644
index 0000000..9e02b3a
--- /dev/null
+++ b/slices/core/src/main/java/androidx/app/slice/compat/ContentProviderWrapper.java
@@ -0,0 +1,121 @@
+/*
+ * 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.app.slice.compat;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.pm.ProviderInfo;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.RestrictTo.Scope;
+
+/**
+ * @hide
+ */
+// TODO: Remove as soon as we have better systems in place for this.
+@RestrictTo(Scope.LIBRARY)
+public class ContentProviderWrapper extends ContentProvider {
+
+    private ContentProvider mImpl;
+
+    /**
+     * Triggers an attach with the object to wrap.
+     */
+    public void attachInfo(Context context, ProviderInfo info, ContentProvider impl) {
+        mImpl = impl;
+        super.attachInfo(context, info);
+        mImpl.attachInfo(context, info);
+    }
+
+    @Override
+    public final boolean onCreate() {
+        return mImpl.onCreate();
+    }
+
+    @Nullable
+    @Override
+    public final Cursor query(@NonNull Uri uri, @Nullable String[] projection,
+            @Nullable String selection, @Nullable String[] selectionArgs,
+            @Nullable String sortOrder) {
+        return mImpl.query(uri, projection, selection, selectionArgs, sortOrder);
+    }
+
+    @Nullable
+    @Override
+    @RequiresApi(28)
+    public final Cursor query(@NonNull Uri uri, @Nullable String[] projection,
+            @Nullable Bundle queryArgs, @Nullable CancellationSignal cancellationSignal) {
+        return mImpl.query(uri, projection, queryArgs, cancellationSignal);
+    }
+
+    @Nullable
+    @Override
+    public final Cursor query(@NonNull Uri uri, @Nullable String[] projection,
+            @Nullable String selection, @Nullable String[] selectionArgs,
+            @Nullable String sortOrder, @Nullable CancellationSignal cancellationSignal) {
+        return mImpl.query(uri, projection, selection, selectionArgs, sortOrder,
+                cancellationSignal);
+    }
+
+    @Nullable
+    @Override
+    public final String getType(@NonNull Uri uri) {
+        return mImpl.getType(uri);
+    }
+
+    @Nullable
+    @Override
+    public final Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
+        return mImpl.insert(uri, values);
+    }
+
+    @Override
+    public final int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) {
+        return mImpl.bulkInsert(uri, values);
+    }
+
+    @Override
+    public final int delete(@NonNull Uri uri, @Nullable String selection,
+            @Nullable String[] selectionArgs) {
+        return mImpl.delete(uri, selection, selectionArgs);
+    }
+
+    @Override
+    public final int update(@NonNull Uri uri, @Nullable ContentValues values,
+            @Nullable String selection, @Nullable String[] selectionArgs) {
+        return mImpl.update(uri, values, selection, selectionArgs);
+    }
+
+    @Nullable
+    @Override
+    public final Bundle call(@NonNull String method, @Nullable String arg,
+            @Nullable Bundle extras) {
+        return mImpl.call(method, arg, extras);
+    }
+
+    @Nullable
+    @Override
+    public final Uri canonicalize(@NonNull Uri url) {
+        return mImpl.canonicalize(url);
+    }
+}
diff --git a/slices/core/src/main/java/androidx/app/slice/compat/SlicePermissionActivity.java b/slices/core/src/main/java/androidx/app/slice/compat/SlicePermissionActivity.java
new file mode 100644
index 0000000..78170ab
--- /dev/null
+++ b/slices/core/src/main/java/androidx/app/slice/compat/SlicePermissionActivity.java
@@ -0,0 +1,94 @@
+/*
+ * 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.app.slice.compat;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.DialogInterface.OnDismissListener;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.annotation.RestrictTo;
+import android.util.Log;
+import android.widget.TextView;
+
+import androidx.app.slice.core.R;
+
+/**
+ * Dialog that grants slice permissions for an app.
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+public class SlicePermissionActivity extends Activity implements OnClickListener,
+        OnDismissListener {
+
+    private static final String TAG = "SlicePermissionActivity";
+
+    private Uri mUri;
+    private String mCallingPkg;
+    private String mProviderPkg;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mUri = getIntent().getParcelableExtra(SliceProviderCompat.EXTRA_BIND_URI);
+        mCallingPkg = getIntent().getStringExtra(SliceProviderCompat.EXTRA_PKG);
+        mProviderPkg = getIntent().getStringExtra(SliceProviderCompat.EXTRA_PROVIDER_PKG);
+
+        try {
+            PackageManager pm = getPackageManager();
+            CharSequence app1 = pm.getApplicationInfo(mCallingPkg, 0).loadLabel(pm);
+            CharSequence app2 = pm.getApplicationInfo(mProviderPkg, 0).loadLabel(pm);
+            AlertDialog dialog = new AlertDialog.Builder(this)
+                    .setTitle(getString(R.string.abc_slice_permission_title, app1, app2))
+                    .setView(R.layout.abc_slice_permission_request)
+                    .setNegativeButton(R.string.abc_slice_permission_deny, this)
+                    .setPositiveButton(R.string.abc_slice_permission_allow, this)
+                    .setOnDismissListener(this)
+                    .show();
+            TextView t1 = dialog.getWindow().getDecorView().findViewById(R.id.text1);
+            t1.setText(getString(R.string.abc_slice_permission_text_1, app2));
+            TextView t2 = dialog.getWindow().getDecorView().findViewById(R.id.text2);
+            t2.setText(getString(R.string.abc_slice_permission_text_2, app2));
+        } catch (NameNotFoundException e) {
+            Log.e(TAG, "Couldn't find package", e);
+            finish();
+        }
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        if (which == DialogInterface.BUTTON_POSITIVE) {
+            grantUriPermission(mCallingPkg, mUri.buildUpon().path("").build(),
+                    Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
+                            | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+                            | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
+            getContentResolver().notifyChange(mUri, null);
+        }
+        finish();
+    }
+
+    @Override
+    public void onDismiss(DialogInterface dialog) {
+        finish();
+    }
+}
diff --git a/slices/core/src/main/java/androidx/app/slice/compat/SliceProviderCompat.java b/slices/core/src/main/java/androidx/app/slice/compat/SliceProviderCompat.java
new file mode 100644
index 0000000..d1a8e65
--- /dev/null
+++ b/slices/core/src/main/java/androidx/app/slice/compat/SliceProviderCompat.java
@@ -0,0 +1,527 @@
+/*
+ * 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.app.slice.compat;
+
+import static android.app.slice.Slice.HINT_LIST_ITEM;
+import static android.app.slice.SliceProvider.SLICE_TYPE;
+
+import android.Manifest.permission;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.ContentProvider;
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Parcelable;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.StrictMode;
+import android.os.StrictMode.ThreadPolicy;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.RestrictTo.Scope;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceProvider;
+import androidx.app.slice.SliceSpec;
+import androidx.app.slice.core.R;
+
+/**
+ * @hide
+ */
+@RestrictTo(Scope.LIBRARY)
+public class SliceProviderCompat extends ContentProvider {
+
+    private static final String TAG = "SliceProvider";
+
+    public static final String EXTRA_BIND_URI = "slice_uri";
+    public static final String METHOD_SLICE = "bind_slice";
+    public static final String METHOD_MAP_INTENT = "map_slice";
+    public static final String METHOD_PIN = "pin_slice";
+    public static final String METHOD_UNPIN = "unpin_slice";
+    public static final String METHOD_GET_PINNED_SPECS = "get_specs";
+
+    public static final String EXTRA_INTENT = "slice_intent";
+    public static final String EXTRA_SLICE = "slice";
+    public static final String EXTRA_SUPPORTED_SPECS = "specs";
+    public static final String EXTRA_SUPPORTED_SPECS_REVS = "revs";
+    public static final String EXTRA_PKG = "pkg";
+    public static final String EXTRA_PROVIDER_PKG = "provider_pkg";
+    private static final String DATA_PREFIX = "slice_data_";
+
+    private static final boolean DEBUG = false;
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
+    private SliceProvider mSliceProvider;
+    private CompatPinnedList mPinnedList;
+    private String mBindingPkg;
+
+    public SliceProviderCompat(SliceProvider provider) {
+        mSliceProvider = provider;
+    }
+
+    /**
+     * Return the package name of the caller that initiated the binding request
+     * currently happening. The returned package will have been
+     * verified to belong to the calling UID. Returns {@code null} if not
+     * currently performing an {@link SliceProvider#onBindSlice(Uri)}.
+     */
+    public final @Nullable String getBindingPackage() {
+        return mBindingPkg;
+    }
+
+    @Override
+    public boolean onCreate() {
+        mPinnedList = new CompatPinnedList(getContext(),
+                DATA_PREFIX + mSliceProvider.getClass().getName());
+        return mSliceProvider.onCreateSliceProvider();
+    }
+
+    @Override
+    public final int update(Uri uri, ContentValues values, String selection,
+            String[] selectionArgs) {
+        if (DEBUG) Log.d(TAG, "update " + uri);
+        return 0;
+    }
+
+    @Override
+    public final int delete(Uri uri, String selection, String[] selectionArgs) {
+        if (DEBUG) Log.d(TAG, "delete " + uri);
+        return 0;
+    }
+
+    @Override
+    public final Cursor query(Uri uri, String[] projection, String selection,
+            String[] selectionArgs, String sortOrder) {
+        if (DEBUG) Log.d(TAG, "query " + uri);
+        return null;
+    }
+
+    @Override
+    public final Cursor query(Uri uri, String[] projection, String selection, String[]
+            selectionArgs, String sortOrder, CancellationSignal cancellationSignal) {
+        if (DEBUG) Log.d(TAG, "query " + uri);
+        return null;
+    }
+
+    @Override
+    public final Cursor query(Uri uri, String[] projection, Bundle queryArgs,
+            CancellationSignal cancellationSignal) {
+        if (DEBUG) Log.d(TAG, "query " + uri);
+        return null;
+    }
+
+    @Override
+    public final Uri insert(Uri uri, ContentValues values) {
+        if (DEBUG) Log.d(TAG, "insert " + uri);
+        return null;
+    }
+
+    @Override
+    public final String getType(Uri uri) {
+        if (DEBUG) Log.d(TAG, "getFormat " + uri);
+        return SLICE_TYPE;
+    }
+
+    @Override
+    public Bundle call(String method, String arg, Bundle extras) {
+        if (method.equals(METHOD_SLICE)) {
+            Uri uri = extras.getParcelable(EXTRA_BIND_URI);
+            if (Binder.getCallingUid() != Process.myUid()) {
+                getContext().enforceUriPermission(uri, permission.BIND_SLICE,
+                        permission.BIND_SLICE, Binder.getCallingPid(), Binder.getCallingUid(),
+                        Intent.FLAG_GRANT_WRITE_URI_PERMISSION,
+                        "Slice binding requires the permission BIND_SLICE");
+            }
+            List<SliceSpec> specs = getSpecs(extras);
+
+            Slice s = handleBindSlice(uri, specs, getCallingPackage());
+            Bundle b = new Bundle();
+            b.putParcelable(EXTRA_SLICE, s.toBundle());
+            return b;
+        } else if (method.equals(METHOD_MAP_INTENT)) {
+            if (Binder.getCallingUid() != Process.myUid()) {
+                getContext().enforceCallingPermission(permission.BIND_SLICE,
+                        "Slice binding requires the permission BIND_SLICE");
+            }
+            Intent intent = extras.getParcelable(EXTRA_INTENT);
+            Uri uri = mSliceProvider.onMapIntentToUri(intent);
+            Bundle b = new Bundle();
+            if (uri != null) {
+                List<SliceSpec> specs = getSpecs(extras);
+                Slice s = handleBindSlice(uri, specs, getCallingPackage());
+                b.putParcelable(EXTRA_SLICE, s.toBundle());
+            } else {
+                b.putParcelable(EXTRA_SLICE, null);
+            }
+            return b;
+        } else if (method.equals(METHOD_PIN)) {
+            Uri uri = extras.getParcelable(EXTRA_BIND_URI);
+            List<SliceSpec> specs = getSpecs(extras);
+            String pkg = extras.getString(EXTRA_PKG);
+            if (mPinnedList.addPin(uri, pkg, specs)) {
+                handleSlicePinned(uri);
+            }
+            return null;
+        } else if (method.equals(METHOD_UNPIN)) {
+            Uri uri = extras.getParcelable(EXTRA_BIND_URI);
+            String pkg = extras.getString(EXTRA_PKG);
+            if (mPinnedList.removePin(uri, pkg)) {
+                handleSliceUnpinned(uri);
+            }
+            return null;
+        } else if (method.equals(METHOD_GET_PINNED_SPECS)) {
+            Uri uri = extras.getParcelable(EXTRA_BIND_URI);
+            Bundle b = new Bundle();
+            addSpecs(b, mPinnedList.getSpecs(uri));
+            return b;
+        }
+        return super.call(method, arg, extras);
+    }
+
+    private void handleSlicePinned(final Uri sliceUri) {
+        if (Looper.myLooper() == Looper.getMainLooper()) {
+            mSliceProvider.onSlicePinned(sliceUri);
+        } else {
+            final CountDownLatch latch = new CountDownLatch(1);
+            mHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    mSliceProvider.onSlicePinned(sliceUri);
+                    latch.countDown();
+                }
+            });
+            try {
+                latch.await();
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    private void handleSliceUnpinned(final Uri sliceUri) {
+        if (Looper.myLooper() == Looper.getMainLooper()) {
+            mSliceProvider.onSliceUnpinned(sliceUri);
+        } else {
+            final CountDownLatch latch = new CountDownLatch(1);
+            mHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    mSliceProvider.onSliceUnpinned(sliceUri);
+                    latch.countDown();
+                }
+            });
+            try {
+                latch.await();
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    private Slice handleBindSlice(final Uri sliceUri, final List<SliceSpec> specs,
+            final String callingPkg) {
+        // This can be removed once Slice#bindSlice is removed and everyone is using
+        // SliceManager#bindSlice.
+        String pkg = callingPkg != null ? callingPkg
+                : getContext().getPackageManager().getNameForUid(Binder.getCallingUid());
+        if (Binder.getCallingUid() != Process.myUid()) {
+            try {
+                getContext().enforceUriPermission(sliceUri,
+                        Binder.getCallingPid(), Binder.getCallingUid(),
+                        Intent.FLAG_GRANT_WRITE_URI_PERMISSION,
+                        "Slice binding requires write access to Uri");
+            } catch (SecurityException e) {
+                return createPermissionSlice(getContext(), sliceUri, pkg);
+            }
+        }
+        if (Looper.myLooper() == Looper.getMainLooper()) {
+            return onBindSliceStrict(sliceUri, specs, callingPkg);
+        } else {
+            final CountDownLatch latch = new CountDownLatch(1);
+            final Slice[] output = new Slice[1];
+            mHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    output[0] = onBindSliceStrict(sliceUri, specs, callingPkg);
+                    latch.countDown();
+                }
+            });
+            try {
+                latch.await();
+                return output[0];
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    /**
+     * Generate a slice that contains a permission request.
+     */
+    public static Slice createPermissionSlice(Context context, Uri sliceUri,
+            String callingPackage) {
+        return new Slice.Builder(sliceUri)
+                .addAction(createPermissionIntent(context, sliceUri, callingPackage),
+                        new Slice.Builder(sliceUri.buildUpon().appendPath("permission").build())
+                                .addText(getPermissionString(context, callingPackage), null)
+                                .build(), null)
+                .addHints(HINT_LIST_ITEM)
+                .build();
+    }
+
+    /**
+     * Create a PendingIntent pointing at the permission dialog.
+     */
+    public static PendingIntent createPermissionIntent(Context context, Uri sliceUri,
+            String callingPackage) {
+        Intent intent = new Intent();
+        intent.setComponent(new ComponentName(context.getPackageName(),
+                "androidx.app.slice.compat.SlicePermissionActivity"));
+        intent.putExtra(EXTRA_BIND_URI, sliceUri);
+        intent.putExtra(EXTRA_PKG, callingPackage);
+        intent.putExtra(EXTRA_PROVIDER_PKG, context.getPackageName());
+        // Unique pending intent.
+        intent.setData(sliceUri.buildUpon().appendQueryParameter("package", callingPackage)
+                .build());
+
+        return PendingIntent.getActivity(context, 0, intent, 0);
+    }
+
+    /**
+     * Get string describing permission request.
+     */
+    public static CharSequence getPermissionString(Context context, String callingPackage) {
+        PackageManager pm = context.getPackageManager();
+        try {
+            return context.getString(R.string.abc_slices_permission_request,
+                    pm.getApplicationInfo(callingPackage, 0).loadLabel(pm),
+                    context.getApplicationInfo().loadLabel(pm));
+        } catch (PackageManager.NameNotFoundException e) {
+            // This shouldn't be possible since the caller is verified.
+            throw new RuntimeException("Unknown calling app", e);
+        }
+    }
+
+    private Slice onBindSliceStrict(Uri sliceUri, List<SliceSpec> specs, String callingPackage) {
+        ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
+        try {
+            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
+                    .detectAll()
+                    .penaltyDeath()
+                    .build());
+            SliceProvider.setSpecs(specs);
+            try {
+                mBindingPkg = callingPackage;
+                return mSliceProvider.onBindSlice(sliceUri);
+            } finally {
+                mBindingPkg = null;
+                SliceProvider.setSpecs(null);
+            }
+        } finally {
+            StrictMode.setThreadPolicy(oldPolicy);
+        }
+    }
+
+    /**
+     * Compat version of {@link Slice#bindSlice}.
+     */
+    public static Slice bindSlice(Context context, Uri uri,
+            List<SliceSpec> supportedSpecs) {
+        ContentProviderClient provider = context.getContentResolver()
+                .acquireContentProviderClient(uri);
+        if (provider == null) {
+            throw new IllegalArgumentException("Unknown URI " + uri);
+        }
+        try {
+            Bundle extras = new Bundle();
+            extras.putParcelable(EXTRA_BIND_URI, uri);
+            addSpecs(extras, supportedSpecs);
+            final Bundle res = provider.call(METHOD_SLICE, null, extras);
+            if (res == null) {
+                return null;
+            }
+            Parcelable bundle = res.getParcelable(EXTRA_SLICE);
+            if (!(bundle instanceof Bundle)) {
+                return null;
+            }
+            return new Slice((Bundle) bundle);
+        } catch (RemoteException e) {
+            // Arbitrary and not worth documenting, as Activity
+            // Manager will kill this process shortly anyway.
+            return null;
+        } finally {
+            provider.close();
+        }
+    }
+
+    private static void addSpecs(Bundle extras, List<SliceSpec> supportedSpecs) {
+        ArrayList<String> types = new ArrayList<>();
+        ArrayList<Integer> revs = new ArrayList<>();
+        for (SliceSpec spec : supportedSpecs) {
+            types.add(spec.getType());
+            revs.add(spec.getRevision());
+        }
+        extras.putStringArrayList(EXTRA_SUPPORTED_SPECS, types);
+        extras.putIntegerArrayList(EXTRA_SUPPORTED_SPECS_REVS, revs);
+    }
+
+    private static List<SliceSpec> getSpecs(Bundle extras) {
+        ArrayList<SliceSpec> specs = new ArrayList<>();
+        ArrayList<String> types = extras.getStringArrayList(EXTRA_SUPPORTED_SPECS);
+        ArrayList<Integer> revs = extras.getIntegerArrayList(EXTRA_SUPPORTED_SPECS_REVS);
+        for (int i = 0; i < types.size(); i++) {
+            specs.add(new SliceSpec(types.get(i), revs.get(i)));
+        }
+        return specs;
+    }
+
+    /**
+     * Compat version of {@link Slice#bindSlice}.
+     */
+    public static Slice bindSlice(Context context, Intent intent,
+            List<SliceSpec> supportedSpecs) {
+        ContentResolver resolver = context.getContentResolver();
+
+        // Check if the intent has data for the slice uri on it and use that
+        final Uri intentData = intent.getData();
+        if (intentData != null && SLICE_TYPE.equals(resolver.getType(intentData))) {
+            return bindSlice(context, intentData, supportedSpecs);
+        }
+        // Otherwise ask the app
+        List<ResolveInfo> providers =
+                context.getPackageManager().queryIntentContentProviders(intent, 0);
+        if (providers == null) {
+            throw new IllegalArgumentException("Unable to resolve intent " + intent);
+        }
+        String authority = providers.get(0).providerInfo.authority;
+        Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(authority).build();
+        ContentProviderClient provider = resolver.acquireContentProviderClient(uri);
+        if (provider == null) {
+            throw new IllegalArgumentException("Unknown URI " + uri);
+        }
+        try {
+            Bundle extras = new Bundle();
+            extras.putParcelable(EXTRA_INTENT, intent);
+            addSpecs(extras, supportedSpecs);
+            final Bundle res = provider.call(METHOD_MAP_INTENT, null, extras);
+            if (res == null) {
+                return null;
+            }
+            Parcelable bundle = res.getParcelable(EXTRA_SLICE);
+            if (!(bundle instanceof Bundle)) {
+                return null;
+            }
+            return new Slice((Bundle) bundle);
+        } catch (RemoteException e) {
+            // Arbitrary and not worth documenting, as Activity
+            // Manager will kill this process shortly anyway.
+            return null;
+        } finally {
+            provider.close();
+        }
+    }
+
+    /**
+     * Compat version of {@link android.app.slice.SliceManager#pinSlice}.
+     */
+    public static void pinSlice(Context context, Uri uri,
+            List<SliceSpec> supportedSpecs) {
+        ContentProviderClient provider = context.getContentResolver()
+                .acquireContentProviderClient(uri);
+        if (provider == null) {
+            throw new IllegalArgumentException("Unknown URI " + uri);
+        }
+        try {
+            Bundle extras = new Bundle();
+            extras.putParcelable(EXTRA_BIND_URI, uri);
+            extras.putString(EXTRA_PKG, context.getPackageName());
+            addSpecs(extras, supportedSpecs);
+            provider.call(METHOD_PIN, null, extras);
+        } catch (RemoteException e) {
+            // Arbitrary and not worth documenting, as Activity
+            // Manager will kill this process shortly anyway.
+        } finally {
+            provider.close();
+        }
+    }
+
+    /**
+     * Compat version of {@link android.app.slice.SliceManager#unpinSlice}.
+     */
+    public static void unpinSlice(Context context, Uri uri,
+            List<SliceSpec> supportedSpecs) {
+        ContentProviderClient provider = context.getContentResolver()
+                .acquireContentProviderClient(uri);
+        if (provider == null) {
+            throw new IllegalArgumentException("Unknown URI " + uri);
+        }
+        try {
+            Bundle extras = new Bundle();
+            extras.putParcelable(EXTRA_BIND_URI, uri);
+            extras.putString(EXTRA_PKG, context.getPackageName());
+            addSpecs(extras, supportedSpecs);
+            provider.call(METHOD_UNPIN, null, extras);
+        } catch (RemoteException e) {
+            // Arbitrary and not worth documenting, as Activity
+            // Manager will kill this process shortly anyway.
+        } finally {
+            provider.close();
+        }
+    }
+
+    /**
+     * Compat version of {@link android.app.slice.SliceManager#getPinnedSpecs(Uri)}.
+     */
+    public static List<SliceSpec> getPinnedSpecs(Context context, Uri uri) {
+        ContentProviderClient provider = context.getContentResolver()
+                .acquireContentProviderClient(uri);
+        if (provider == null) {
+            throw new IllegalArgumentException("Unknown URI " + uri);
+        }
+        try {
+            Bundle extras = new Bundle();
+            extras.putParcelable(EXTRA_BIND_URI, uri);
+            final Bundle res = provider.call(METHOD_GET_PINNED_SPECS, null, extras);
+            if (res == null) {
+                return null;
+            }
+            return getSpecs(res);
+        } catch (RemoteException e) {
+            // Arbitrary and not worth documenting, as Activity
+            // Manager will kill this process shortly anyway.
+            return null;
+        } finally {
+            provider.close();
+        }
+    }
+}
diff --git a/slices/core/src/main/java/androidx/app/slice/compat/SliceProviderWrapperContainer.java b/slices/core/src/main/java/androidx/app/slice/compat/SliceProviderWrapperContainer.java
new file mode 100644
index 0000000..ebc2ad1
--- /dev/null
+++ b/slices/core/src/main/java/androidx/app/slice/compat/SliceProviderWrapperContainer.java
@@ -0,0 +1,84 @@
+/*
+ * 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.app.slice.compat;
+
+import static androidx.app.slice.SliceConvert.wrap;
+
+import android.annotation.TargetApi;
+import android.app.slice.Slice;
+import android.app.slice.SliceProvider;
+import android.app.slice.SliceSpec;
+import android.content.Intent;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.RestrictTo;
+
+import java.util.List;
+
+import androidx.app.slice.SliceConvert;
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@TargetApi(28)
+public class SliceProviderWrapperContainer {
+
+    /**
+     */
+    public static class SliceProviderWrapper extends SliceProvider {
+
+        private androidx.app.slice.SliceProvider mSliceProvider;
+
+        public SliceProviderWrapper(androidx.app.slice.SliceProvider provider) {
+            mSliceProvider = provider;
+        }
+
+        @Override
+        public boolean onCreate() {
+            return mSliceProvider.onCreateSliceProvider();
+        }
+
+        @Override
+        public Slice onBindSlice(Uri sliceUri, List<SliceSpec> supportedVersions) {
+            androidx.app.slice.SliceProvider.setSpecs(wrap(supportedVersions));
+            try {
+                return SliceConvert.unwrap(mSliceProvider.onBindSlice(sliceUri));
+            } finally {
+                androidx.app.slice.SliceProvider.setSpecs(null);
+            }
+        }
+
+        @Override
+        public void onSlicePinned(Uri sliceUri) {
+            mSliceProvider.onSlicePinned(sliceUri);
+        }
+
+        @Override
+        public void onSliceUnpinned(Uri sliceUri) {
+            mSliceProvider.onSliceUnpinned(sliceUri);
+        }
+
+        /**
+         * Maps intents to uris.
+         */
+        @Override
+        public @NonNull Uri onMapIntentToUri(Intent intent) {
+            return mSliceProvider.onMapIntentToUri(intent);
+        }
+    }
+}
diff --git a/slices/core/src/main/java/androidx/app/slice/core/SliceHints.java b/slices/core/src/main/java/androidx/app/slice/core/SliceHints.java
new file mode 100644
index 0000000..e566825
--- /dev/null
+++ b/slices/core/src/main/java/androidx/app/slice/core/SliceHints.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.core;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
+import android.support.annotation.RestrictTo;
+
+/**
+ * Temporary class to contain hint constants for slices to be used.
+ * @hide
+ */
+@RestrictTo(LIBRARY_GROUP)
+public class SliceHints {
+    /**
+     * Subtype to range an item representing a range.
+     */
+    public static final String SUBTYPE_RANGE = "range";
+
+    /**
+     * Subtype indicating that this content is the maximum value for a range.
+     */
+    public static final String SUBTYPE_MAX = "max";
+
+    /**
+     * Subtype indicating that this content is the current value for a range.
+     */
+    public static final String SUBTYPE_VALUE = "value";
+
+    /**
+     * Key to retrieve an extra added to an intent when the value of an input range has changed.
+     */
+    public static final String EXTRA_RANGE_VALUE = "android.app.slice.extra.RANGE_VALUE";
+}
diff --git a/slices/core/src/main/java/androidx/app/slice/core/SliceQuery.java b/slices/core/src/main/java/androidx/app/slice/core/SliceQuery.java
new file mode 100644
index 0000000..f0f2371
--- /dev/null
+++ b/slices/core/src/main/java/androidx/app/slice/core/SliceQuery.java
@@ -0,0 +1,274 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.core;
+
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_SLICE;
+
+import android.annotation.TargetApi;
+import android.support.annotation.RestrictTo;
+import android.text.TextUtils;
+
+import java.util.ArrayDeque;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Queue;
+import java.util.Spliterators;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceItem;
+
+/**
+ * Utilities for finding content within a Slice.
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+// TODO: Not expect 24.
+@TargetApi(24)
+public class SliceQuery {
+
+    /**
+     */
+    public static boolean hasAnyHints(SliceItem item, String... hints) {
+        if (hints == null) return false;
+        List<String> itemHints = item.getHints();
+        for (String hint : hints) {
+            if (itemHints.contains(hint)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     */
+    public static boolean hasHints(SliceItem item, String... hints) {
+        if (hints == null) return true;
+        List<String> itemHints = item.getHints();
+        for (String hint : hints) {
+            if (!TextUtils.isEmpty(hint) && !itemHints.contains(hint)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     */
+    public static boolean hasHints(Slice item, String... hints) {
+        if (hints == null) return true;
+        List<String> itemHints = item.getHints();
+        for (String hint : hints) {
+            if (!TextUtils.isEmpty(hint) && !itemHints.contains(hint)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     */
+    public static SliceItem findNotContaining(SliceItem container, List<SliceItem> list) {
+        SliceItem ret = null;
+        while (ret == null && list.size() != 0) {
+            SliceItem remove = list.remove(0);
+            if (!contains(container, remove)) {
+                ret = remove;
+            }
+        }
+        return ret;
+    }
+
+    /**
+     */
+    private static boolean contains(SliceItem container, final SliceItem item) {
+        if (container == null || item == null) return false;
+        return stream(container).filter(new Predicate<SliceItem>() {
+            @Override
+            public boolean test(SliceItem s) {
+                return s == item;
+            }
+        }).findAny().isPresent();
+    }
+
+    /**
+     */
+    public static List<SliceItem> findAll(SliceItem s, String format) {
+        return findAll(s, format, (String[]) null, null);
+    }
+
+    /**
+     */
+    public static List<SliceItem> findAll(Slice s, String format, String hints, String nonHints) {
+        return findAll(s, format, new String[]{ hints }, new String[]{ nonHints });
+    }
+
+    /**
+     */
+    public static List<SliceItem> findAll(SliceItem s, String format, String hints,
+            String nonHints) {
+        return findAll(s, format, new String[]{ hints }, new String[]{ nonHints });
+    }
+
+    /**
+     */
+    public static List<SliceItem> findAll(Slice s, final String format, final String[] hints,
+            final String[] nonHints) {
+        return stream(s).filter(new Predicate<SliceItem>() {
+            @Override
+            public boolean test(SliceItem item) {
+                return checkFormat(item, format)
+                        && (hasHints(item, hints) && !hasAnyHints(item, nonHints));
+            }
+        }).collect(Collectors.<SliceItem>toList());
+    }
+
+    /**
+     */
+    public static List<SliceItem> findAll(SliceItem s, final String format, final String[] hints,
+            final String[] nonHints) {
+        return stream(s).filter(new Predicate<SliceItem>() {
+            @Override
+            public boolean test(SliceItem item) {
+                return checkFormat(item, format)
+                        && (hasHints(item, hints) && !hasAnyHints(item, nonHints));
+            }
+        }).collect(Collectors.<SliceItem>toList());
+    }
+
+    /**
+     */
+    public static SliceItem find(Slice s, String format, String hints, String nonHints) {
+        return find(s, format, new String[]{ hints }, new String[]{ nonHints });
+    }
+
+    /**
+     */
+    public static SliceItem find(Slice s, String format) {
+        return find(s, format, (String[]) null, null);
+    }
+
+    /**
+     */
+    public static SliceItem find(SliceItem s, String format) {
+        return find(s, format, (String[]) null, null);
+    }
+
+    /**
+     */
+    public static SliceItem find(SliceItem s, String format, String hints, String nonHints) {
+        return find(s, format, new String[]{ hints }, new String[]{ nonHints });
+    }
+
+    /**
+     */
+    public static SliceItem find(Slice s, final String format, final String[] hints,
+            final String[] nonHints) {
+        return stream(s).filter(new Predicate<SliceItem>() {
+            @Override
+            public boolean test(SliceItem item) {
+                return checkFormat(item, format)
+                        && (hasHints(item, hints) && !hasAnyHints(item, nonHints));
+            }
+        }).findFirst().orElse(null);
+    }
+
+    /**
+     */
+    public static SliceItem findSubtype(Slice s, final String format, final String subtype) {
+        return stream(s).filter(new Predicate<SliceItem>() {
+            @Override
+            public boolean test(SliceItem item) {
+                return checkFormat(item, format) && checkSubtype(item, subtype);
+            }
+        }).findFirst().orElse(null);
+    }
+
+    /**
+     */
+    public static SliceItem findSubtype(SliceItem s, final String format, final String subtype) {
+        return stream(s).filter(new Predicate<SliceItem>() {
+            @Override
+            public boolean test(SliceItem item) {
+                return checkFormat(item, format) && checkSubtype(item, subtype);
+            }
+        }).findFirst().orElse(null);
+    }
+
+    /**
+     */
+    public static SliceItem find(SliceItem s, final String format, final String[] hints,
+            final String[] nonHints) {
+        return stream(s).filter(new Predicate<SliceItem>() {
+            @Override
+            public boolean test(SliceItem item) {
+                return checkFormat(item, format)
+                        && (hasHints(item, hints) && !hasAnyHints(item, nonHints));
+            }
+        }).findFirst().orElse(null);
+    }
+
+    private static boolean checkFormat(SliceItem item, String format) {
+        return format == null || format.equals(item.getFormat());
+    }
+
+    private static boolean checkSubtype(SliceItem item, String subtype) {
+        return subtype == null || subtype.equals(item.getSubType());
+    }
+
+    /**
+     */
+    public static Stream<SliceItem> stream(SliceItem slice) {
+        Queue<SliceItem> items = new ArrayDeque<>();
+        items.add(slice);
+        return getSliceItemStream(items);
+    }
+
+    /**
+     */
+    public static Stream<SliceItem> stream(Slice slice) {
+        Queue<SliceItem> items = new ArrayDeque<>();
+        items.addAll(slice.getItems());
+        return getSliceItemStream(items);
+    }
+
+    /**
+     */
+    private static Stream<SliceItem> getSliceItemStream(final Queue<SliceItem> items) {
+        Iterator<SliceItem> iterator = new Iterator<SliceItem>() {
+            @Override
+            public boolean hasNext() {
+                return items.size() != 0;
+            }
+
+            @Override
+            public SliceItem next() {
+                SliceItem item = items.poll();
+                if (FORMAT_SLICE.equals(item.getFormat())
+                        || FORMAT_ACTION.equals(item.getFormat())) {
+                    items.addAll(item.getSlice().getItems());
+                }
+                return item;
+            }
+        };
+        return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false);
+    }
+}
diff --git a/slices/core/src/main/res-public/values-v28/strings.xml b/slices/core/src/main/res-public/values-v28/strings.xml
new file mode 100644
index 0000000..cb2a320
--- /dev/null
+++ b/slices/core/src/main/res-public/values-v28/strings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="slice_provider">androidx.app.slice.compat.SliceProviderWrapperContainer.SliceProviderWrapper</string>
+</resources>
\ No newline at end of file
diff --git a/slices/core/src/main/res-public/values/strings.xml b/slices/core/src/main/res-public/values/strings.xml
new file mode 100644
index 0000000..d492a38
--- /dev/null
+++ b/slices/core/src/main/res-public/values/strings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="slice_provider">androidx.app.slice.compat.SliceProviderCompat</string>
+</resources>
diff --git a/slices/core/src/main/res/layout/abc_slice_permission_request.xml b/slices/core/src/main/res/layout/abc_slice_permission_request.xml
new file mode 100644
index 0000000..43f895b
--- /dev/null
+++ b/slices/core/src/main/res/layout/abc_slice_permission_request.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 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.
+-->
+<!-- Extends LinearLayout -->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingStart="16dp"
+    android:paddingEnd="16dp"
+    android:orientation="vertical">
+
+    <TextView
+        android:id="@+id/text2"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingTop="8dp"
+        android:paddingStart="8dp"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:text="@string/abc_slice_permission_text_1" />
+
+    <TextView
+        android:id="@+id/text1"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingStart="8dp"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:paddingBottom="16dp"
+        android:text="@string/abc_slice_permission_text_2" />
+
+</LinearLayout>
diff --git a/slices/core/src/main/res/values/strings.xml b/slices/core/src/main/res/values/strings.xml
new file mode 100644
index 0000000..2959af8
--- /dev/null
+++ b/slices/core/src/main/res/values/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+~ 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+    <!-- Text describing a permission request for one app to show another app's
+         slices [CHAR LIMIT=NONE] -->
+    <string name="abc_slices_permission_request"><xliff:g id="app" example="Example App">%1$s</xliff:g> wants to show <xliff:g id="app_2" example="Other Example App">%2$s</xliff:g> slices</string>
+
+    <!-- Title of prompt requesting access to display slices [CHAR LIMIT=NONE] -->
+    <string name="abc_slice_permission_title">Allow <xliff:g id="app" example="Example App">%1$s</xliff:g> to show <xliff:g id="app_2" example="Other Example App">%2$s</xliff:g> slices?</string>
+
+    <!-- Description of what kind of access is given to a slice host [CHAR LIMIT=NONE] -->
+    <string name="abc_slice_permission_text_1"> - It can read information from <xliff:g id="app" example="Example App">%1$s</xliff:g></string>
+    <!-- Description of what kind of access is given to a slice host [CHAR LIMIT=NONE] -->
+    <string name="abc_slice_permission_text_2"> - It can take actions inside <xliff:g id="app" example="Example App">%1$s</xliff:g></string>
+
+    <!-- Text on checkbox allowing the app to show slices from all apps [CHAR LIMIT=NONE] -->
+    <string name="abc_slice_permission_checkbox">Allow <xliff:g id="app" example="Example App">%1$s</xliff:g> to show slices from any app</string>
+
+    <!-- Option to grant the slice permission request on the screen [CHAR LIMIT=15] -->
+    <string name="abc_slice_permission_allow">Allow</string>
+
+    <!-- Option to grant the slice permission request on the screen [CHAR LIMIT=15] -->
+    <string name="abc_slice_permission_deny">Deny</string>
+
+</resources>
diff --git a/slices/view/api/current.txt b/slices/view/api/current.txt
new file mode 100644
index 0000000..d158818
--- /dev/null
+++ b/slices/view/api/current.txt
@@ -0,0 +1,94 @@
+package androidx.app.slice {
+
+  public abstract class SliceManager {
+    method public abstract androidx.app.slice.Slice bindSlice(android.net.Uri);
+    method public abstract androidx.app.slice.Slice bindSlice(android.content.Intent);
+    method public static androidx.app.slice.SliceManager getInstance(android.content.Context);
+    method public abstract void pinSlice(android.net.Uri);
+    method public abstract void registerSliceCallback(android.net.Uri, androidx.app.slice.SliceManager.SliceCallback);
+    method public abstract void registerSliceCallback(android.net.Uri, java.util.concurrent.Executor, androidx.app.slice.SliceManager.SliceCallback);
+    method public abstract void unpinSlice(android.net.Uri);
+    method public abstract void unregisterSliceCallback(android.net.Uri, androidx.app.slice.SliceManager.SliceCallback);
+  }
+
+  public static abstract interface SliceManager.SliceCallback {
+    method public abstract void onSliceUpdated(androidx.app.slice.Slice);
+  }
+
+  public class SliceUtils {
+    method public static int getLoadingState(androidx.app.slice.Slice);
+    method public static androidx.app.slice.Slice parseSlice(java.io.InputStream, java.lang.String) throws java.io.IOException;
+    method public static void serializeSlice(androidx.app.slice.Slice, android.content.Context, java.io.OutputStream, java.lang.String, androidx.app.slice.SliceUtils.SerializeOptions) throws java.io.IOException;
+    field public static final int LOADING_ALL = 0; // 0x0
+    field public static final int LOADING_COMPLETE = 2; // 0x2
+    field public static final int LOADING_PARTIAL = 1; // 0x1
+  }
+
+  public static class SliceUtils.SerializeOptions {
+    ctor public SliceUtils.SerializeOptions();
+    method public androidx.app.slice.SliceUtils.SerializeOptions setActionMode(int);
+    method public androidx.app.slice.SliceUtils.SerializeOptions setImageMode(int);
+    field public static final int MODE_DISABLE = 2; // 0x2
+    field public static final int MODE_REMOVE = 1; // 0x1
+    field public static final int MODE_THROW = 0; // 0x0
+  }
+
+}
+
+package androidx.app.slice.widget {
+
+  public class EventInfo {
+    ctor public EventInfo(int, int, int, int);
+    method public void setPosition(int, int, int);
+    field public static final int ACTION_TYPE_BUTTON = 1; // 0x1
+    field public static final int ACTION_TYPE_CONTENT = 3; // 0x3
+    field public static final int ACTION_TYPE_SLIDER = 2; // 0x2
+    field public static final int ACTION_TYPE_TOGGLE = 0; // 0x0
+    field public static final int POSITION_CELL = 2; // 0x2
+    field public static final int POSITION_END = 1; // 0x1
+    field public static final int POSITION_START = 0; // 0x0
+    field public static final int ROW_TYPE_GRID = 1; // 0x1
+    field public static final int ROW_TYPE_LIST = 0; // 0x0
+    field public static final int ROW_TYPE_MESSAGING = 2; // 0x2
+    field public static final int ROW_TYPE_SHORTCUT = -1; // 0xffffffff
+    field public static final int STATE_OFF = 0; // 0x0
+    field public static final int STATE_ON = 1; // 0x1
+    field public int actionCount;
+    field public int actionIndex;
+    field public int actionPosition;
+    field public int actionType;
+    field public int rowIndex;
+    field public int rowTemplateType;
+    field public int sliceMode;
+    field public int state;
+  }
+
+  public final class SliceLiveData {
+    ctor public SliceLiveData();
+    method public static android.arch.lifecycle.LiveData<androidx.app.slice.Slice> fromIntent(android.content.Context, android.content.Intent);
+    method public static android.arch.lifecycle.LiveData<androidx.app.slice.Slice> fromUri(android.content.Context, android.net.Uri);
+  }
+
+  public class SliceView extends android.view.ViewGroup implements android.arch.lifecycle.Observer {
+    ctor public SliceView(android.content.Context);
+    ctor public SliceView(android.content.Context, android.util.AttributeSet);
+    ctor public SliceView(android.content.Context, android.util.AttributeSet, int);
+    ctor public SliceView(android.content.Context, android.util.AttributeSet, int, int);
+    method public int getMode();
+    method public void onChanged(androidx.app.slice.Slice);
+    method public void setMode(int);
+    method public void setOnSliceActionListener(androidx.app.slice.widget.SliceView.OnSliceActionListener);
+    method public void setScrollable(boolean);
+    method public void setSlice(androidx.app.slice.Slice);
+    method public void setTint(int);
+    field public static final int MODE_LARGE = 2; // 0x2
+    field public static final int MODE_SHORTCUT = 3; // 0x3
+    field public static final int MODE_SMALL = 1; // 0x1
+  }
+
+  public static abstract interface SliceView.OnSliceActionListener {
+    method public abstract void onSliceAction(androidx.app.slice.widget.EventInfo, androidx.app.slice.SliceItem);
+  }
+
+}
+
diff --git a/slices/view/build.gradle b/slices/view/build.gradle
new file mode 100644
index 0000000..93e9fc5
--- /dev/null
+++ b/slices/view/build.gradle
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ */
+
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryVersions
+import android.support.LibraryGroups
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    implementation(project(":slices-core"))
+    implementation(project(":slices-builders"))
+    implementation(project(":recyclerview-v7"))
+    api(ARCH_LIFECYCLE_EXTENSIONS, libs.exclude_annotations_transitive)
+
+    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+}
+
+android {
+}
+
+supportLibrary {
+    name = "Slice views"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SLICES
+    inceptionYear = "2017"
+    description = "A library that handles rendering of slice content into supported templates"
+    minSdkVersion = 24
+}
diff --git a/slices/view/lint-baseline.xml b/slices/view/lint-baseline.xml
new file mode 100644
index 0000000..49d372e
--- /dev/null
+++ b/slices/view/lint-baseline.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="4" by="lint 3.0.0">
+
+    <issue
+        id="WrongConstant"
+        message="Must be one of: SliceView.MODE_SMALL, SliceView.MODE_LARGE, SliceView.MODE_SHORTCUT"
+        errorLine1="        return mMode;"
+        errorLine2="               ~~~~~">
+        <location
+            file="src/main/java/androidx/app/slice/widget/SliceView.java"
+            line="290"
+            column="16"/>
+    </issue>
+
+</issues>
diff --git a/slices/view/src/androidTest/AndroidManifest.xml b/slices/view/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..ec64cc1
--- /dev/null
+++ b/slices/view/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="androidx.app.slice.view.test">
+    <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
+
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
+    <application>
+        <provider android:name="androidx.app.slice.SliceManagerTest$TestSliceProvider"
+                  android:authorities="androidx.app.slice.view.test"
+                  android:exported="true"/>
+
+        <activity android:name="androidx.app.slice.render.SliceRenderActivity"
+            android:theme="@style/AppTheme.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/design/tests/NO_DOCS b/slices/view/src/androidTest/NO_DOCS
similarity index 92%
copy from design/tests/NO_DOCS
copy to slices/view/src/androidTest/NO_DOCS
index 0c81e4a..4dad694 100644
--- a/design/tests/NO_DOCS
+++ b/slices/view/src/androidTest/NO_DOCS
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 The Android Open Source Project
+# 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.
diff --git a/slices/view/src/androidTest/java/androidx/app/slice/SliceManagerTest.java b/slices/view/src/androidTest/java/androidx/app/slice/SliceManagerTest.java
new file mode 100644
index 0000000..a20a5cc
--- /dev/null
+++ b/slices/view/src/androidTest/java/androidx/app/slice/SliceManagerTest.java
@@ -0,0 +1,194 @@
+/*
+ * 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.app.slice;
+
+import static junit.framework.Assert.assertEquals;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.os.BuildCompat;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import java.util.List;
+import java.util.concurrent.Executor;
+
+import androidx.app.slice.widget.SliceLiveData;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SliceManagerTest {
+
+    private final Context mContext = InstrumentationRegistry.getContext();
+    private SliceProvider mSliceProvider;
+    private SliceManager mManager;
+
+    @Before
+    public void setup() {
+        TestSliceProvider.sSliceProviderReceiver = mSliceProvider = mock(SliceProvider.class);
+        mManager = createSliceManager(mContext);
+    }
+
+    private SliceManager createSliceManager(Context context) {
+        if (BuildCompat.isAtLeastP()) {
+            android.app.slice.SliceManager manager = mock(android.app.slice.SliceManager.class);
+            doAnswer(new Answer<Void>() {
+                @Override
+                public Void answer(InvocationOnMock invocation) throws Throwable {
+                    TestSliceProvider.sSliceProviderReceiver.onSlicePinned(
+                            (Uri) invocation.getArguments()[0]);
+                    return null;
+                }
+            }).when(manager).pinSlice(any(Uri.class), any(List.class));
+            doAnswer(new Answer<Void>() {
+                @Override
+                public Void answer(InvocationOnMock invocation) throws Throwable {
+                    TestSliceProvider.sSliceProviderReceiver.onSliceUnpinned(
+                            (Uri) invocation.getArguments()[0]);
+                    return null;
+                }
+            }).when(manager).unpinSlice(any(Uri.class));
+            return new SliceManagerWrapper(context, manager);
+        } else {
+            return SliceManager.getInstance(context);
+        }
+    }
+
+    @Test
+    public void testPin() {
+        Uri uri = new Uri.Builder()
+                .scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(mContext.getPackageName())
+                .build();
+        mManager.pinSlice(uri);
+        verify(mSliceProvider).onSlicePinned(eq(uri));
+    }
+
+    @Test
+    public void testUnpin() {
+        Uri uri = new Uri.Builder()
+                .scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(mContext.getPackageName())
+                .build();
+        mManager.pinSlice(uri);
+        clearInvocations(mSliceProvider);
+        mManager.unpinSlice(uri);
+        verify(mSliceProvider).onSliceUnpinned(eq(uri));
+    }
+
+    @Test
+    public void testCallback() {
+        if (BuildCompat.isAtLeastP()) {
+            return;
+        }
+        Uri uri = new Uri.Builder()
+                .scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(mContext.getPackageName())
+                .build();
+        Slice s = new Slice.Builder(uri).build();
+        SliceManager.SliceCallback callback = mock(SliceManager.SliceCallback.class);
+        when(mSliceProvider.onBindSlice(eq(uri))).thenReturn(s);
+        mManager.registerSliceCallback(uri, new Executor() {
+            @Override
+            public void execute(@NonNull Runnable command) {
+                command.run();
+            }
+        }, callback);
+
+        mContext.getContentResolver().notifyChange(uri, null);
+
+        verify(callback, timeout(2000)).onSliceUpdated(any(Slice.class));
+    }
+
+    @Test
+    public void testPinnedSpecs() {
+        if (BuildCompat.isAtLeastP()) {
+            return;
+        }
+        Uri uri = new Uri.Builder()
+                .scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(mContext.getPackageName())
+                .build();
+        mManager.pinSlice(uri);
+        verify(mSliceProvider).onSlicePinned(eq(uri));
+
+        assertEquals(SliceLiveData.SUPPORTED_SPECS, mManager.getPinnedSpecs(uri));
+    }
+
+    public static class TestSliceProvider extends SliceProvider {
+
+        public static SliceProvider sSliceProviderReceiver;
+
+        @Override
+        public boolean onCreateSliceProvider() {
+            if (sSliceProviderReceiver != null) {
+                sSliceProviderReceiver.onCreateSliceProvider();
+            }
+            return true;
+        }
+
+        @Override
+        public Slice onBindSlice(Uri sliceUri) {
+            if (sSliceProviderReceiver != null) {
+                return sSliceProviderReceiver.onBindSlice(sliceUri);
+            }
+            return null;
+        }
+
+        @NonNull
+        @Override
+        public Uri onMapIntentToUri(Intent intent) {
+            if (sSliceProviderReceiver != null) {
+                return sSliceProviderReceiver.onMapIntentToUri(intent);
+            }
+            return null;
+        }
+
+        @Override
+        public void onSlicePinned(Uri sliceUri) {
+            if (sSliceProviderReceiver != null) {
+                sSliceProviderReceiver.onSlicePinned(sliceUri);
+            }
+        }
+
+        @Override
+        public void onSliceUnpinned(Uri sliceUri) {
+            if (sSliceProviderReceiver != null) {
+                sSliceProviderReceiver.onSliceUnpinned(sliceUri);
+            }
+        }
+    }
+}
diff --git a/slices/view/src/androidTest/java/androidx/app/slice/SliceXmlTest.java b/slices/view/src/androidTest/java/androidx/app/slice/SliceXmlTest.java
new file mode 100644
index 0000000..5e4444d
--- /dev/null
+++ b/slices/view/src/androidTest/java/androidx/app/slice/SliceXmlTest.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice;
+
+
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_SLICE;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SliceXmlTest {
+
+    private final Context mContext = InstrumentationRegistry.getContext();
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testThrowForAction() throws IOException {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        Slice s = new Slice.Builder(Uri.parse("content://pkg/slice"))
+                .addAction(null, null, null)
+                .build();
+        SliceUtils.serializeSlice(s, mContext, outputStream, "UTF-8", new SliceUtils
+                .SerializeOptions());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testThrowForRemoteInput() throws IOException {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        Slice s = new Slice.Builder(Uri.parse("content://pkg/slice"))
+                .addRemoteInput(null, null)
+                .build();
+        SliceUtils.serializeSlice(s, mContext, outputStream, "UTF-8", new SliceUtils
+                .SerializeOptions());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testThrowForImage() throws IOException {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        Slice s = new Slice.Builder(Uri.parse("content://pkg/slice"))
+                .addIcon(null, null)
+                .build();
+        SliceUtils.serializeSlice(s, mContext, outputStream, "UTF-8", new SliceUtils
+                .SerializeOptions());
+    }
+
+    @Test
+    public void testNoThrowForAction() throws IOException {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        Slice s = new Slice.Builder(Uri.parse("content://pkg/slice"))
+                .addAction(null, null, null)
+                .build();
+        SliceUtils.serializeSlice(s, mContext, outputStream, "UTF-8", new SliceUtils
+                .SerializeOptions().setActionMode(SliceUtils.SerializeOptions.MODE_REMOVE));
+    }
+
+    @Test
+    public void testNoThrowForRemoteInput() throws IOException {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        Slice s = new Slice.Builder(Uri.parse("content://pkg/slice"))
+                .addRemoteInput(null, null)
+                .build();
+        SliceUtils.serializeSlice(s, mContext, outputStream, "UTF-8", new SliceUtils
+                .SerializeOptions().setActionMode(SliceUtils.SerializeOptions.MODE_REMOVE));
+    }
+
+    @Test
+    public void testNoThrowForImage() throws IOException {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        Slice s = new Slice.Builder(Uri.parse("content://pkg/slice"))
+                .addIcon(null, null)
+                .build();
+        SliceUtils.serializeSlice(s, mContext, outputStream, "UTF-8", new SliceUtils
+                .SerializeOptions().setImageMode(SliceUtils.SerializeOptions.MODE_REMOVE));
+    }
+
+    @Test
+    public void testSerialization() throws IOException {
+        Bitmap b = Bitmap.createBitmap(50, 25, Bitmap.Config.ARGB_8888);
+        new Canvas(b).drawColor(0xffff0000);
+        // Create a slice containing all the types in a hierarchy.
+        Slice before = new Slice.Builder(Uri.parse("content://pkg/slice"))
+                .addSubSlice(new Slice.Builder(Uri.parse("content://pkg/slice/sub"))
+                        .addTimestamp(System.currentTimeMillis(), null, "Hint")
+                        .build())
+                .addIcon(Icon.createWithBitmap(b), null)
+                .addText("Some text", null)
+                .addAction(null, new Slice.Builder(Uri.parse("content://pkg/slice/sub"))
+                        .addText("Action text", null)
+                        .build(), null)
+                .addInt(0xff00ff00, "subtype")
+                .addHints("Hint 1", "Hint 2")
+                .build();
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+        SliceUtils.serializeSlice(before, mContext, outputStream, "UTF-8",
+                new SliceUtils.SerializeOptions()
+                        .setImageMode(SliceUtils.SerializeOptions.MODE_DISABLE)
+                        .setActionMode(SliceUtils.SerializeOptions.MODE_DISABLE));
+
+        byte[] bytes = outputStream.toByteArray();
+        ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
+        Slice after = SliceUtils.parseSlice(inputStream, "UTF-8");
+
+        assertEquivalent(before, after);
+    }
+
+    private void assertEquivalent(Slice desired, Slice actual) {
+        assertEquals(desired.getUri(), actual.getUri());
+        assertEquals(desired.getHints(), actual.getHints());
+        assertEquals(desired.getItems().size(), actual.getItems().size());
+
+        for (int i = 0; i < desired.getItems().size(); i++) {
+            assertEquivalent(desired.getItems().get(i), actual.getItems().get(i));
+        }
+    }
+
+    private void assertEquivalent(SliceItem desired, SliceItem actual) {
+        boolean isSliceType = FORMAT_SLICE.equals(desired.getFormat())
+                || FORMAT_ACTION.equals(desired.getFormat());
+        if (isSliceType) {
+            assertTrue(FORMAT_SLICE.equals(actual.getFormat())
+                    || FORMAT_ACTION.equals(actual.getFormat()));
+        } else {
+            assertEquals(desired.getFormat(), actual.getFormat());
+            if (FORMAT_TEXT.equals(desired.getFormat())) {
+                assertEquals(String.valueOf(desired.getText()), String.valueOf(actual.getText()));
+            }
+        }
+    }
+}
diff --git a/slices/view/src/androidTest/java/androidx/app/slice/render/RenderTest.java b/slices/view/src/androidTest/java/androidx/app/slice/render/RenderTest.java
new file mode 100644
index 0000000..6cf6182
--- /dev/null
+++ b/slices/view/src/androidTest/java/androidx/app/slice/render/RenderTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.app.slice.render;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class RenderTest {
+
+    private final Context mContext = InstrumentationRegistry.getContext();
+
+    @Test
+    public void testRender() throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(1);
+        BroadcastReceiver receiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                latch.countDown();
+            }
+        };
+        mContext.registerReceiver(receiver,
+                new IntentFilter(SliceRenderActivity.ACTION_RENDER_DONE));
+        mContext.startActivity(new Intent(mContext, SliceRenderActivity.class)
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+
+        latch.await(30000, TimeUnit.MILLISECONDS);
+    }
+}
diff --git a/slices/view/src/androidTest/java/androidx/app/slice/render/SliceCreator.java b/slices/view/src/androidTest/java/androidx/app/slice/render/SliceCreator.java
new file mode 100644
index 0000000..114d0e1
--- /dev/null
+++ b/slices/view/src/androidTest/java/androidx/app/slice/render/SliceCreator.java
@@ -0,0 +1,307 @@
+/*
+ * 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.app.slice.render;
+
+import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
+
+import android.app.PendingIntent;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+import android.provider.Settings;
+import android.text.SpannableString;
+import android.text.format.DateUtils;
+import android.text.style.ForegroundColorSpan;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.builders.GridBuilder;
+import androidx.app.slice.builders.ListBuilder;
+import androidx.app.slice.builders.MessagingSliceBuilder;
+import androidx.app.slice.view.test.R;
+
+/**
+ * Examples of using slice template builders.
+ */
+public class SliceCreator {
+
+    public static final String ACTION_WIFI_CHANGED =
+            "com.example.androidx.slice.action.WIFI_CHANGED";
+    public static final String ACTION_TOAST =
+            "com.example.androidx.slice.action.TOAST";
+    public static final String EXTRA_TOAST_MESSAGE = "com.example.androidx.extra.TOAST_MESSAGE";
+
+    public static final String[] URI_PATHS = {"message", "wifi", "note", "ride", "toggle",
+            "toggle2", "contact", "gallery", "weather"};
+
+    private final Context mContext;
+
+    public SliceCreator(Context context) {
+        mContext = context;
+    }
+
+    private Context getContext() {
+        return mContext;
+    }
+
+    /**
+     * @return Uri with the provided path
+     */
+    public static Uri getUri(String path, Context context) {
+        return new Uri.Builder()
+                .scheme(ContentResolver.SCHEME_CONTENT)
+                .authority("androidx.app.slice.view.test")
+                .appendPath(path)
+                .build();
+    }
+
+    public Slice onBindSlice(Uri sliceUri) {
+        String path = sliceUri.getPath();
+        switch (path) {
+            case "/message":
+                return createMessagingSlice(sliceUri);
+            case "/wifi":
+                return createWifiSlice(sliceUri);
+            case "/note":
+                return createNoteSlice(sliceUri);
+            case "/ride":
+                return createRideSlice(sliceUri);
+            case "/toggle":
+                return createCustomToggleSlice(sliceUri);
+            case "/toggle2":
+                return createTwoCustomToggleSlices(sliceUri);
+            case "/contact":
+                return createContact(sliceUri);
+            case "/gallery":
+                return createGallery(sliceUri);
+            case "/weather":
+                return createWeather(sliceUri);
+        }
+        throw new IllegalArgumentException("Unknown uri " + sliceUri);
+    }
+
+    private Slice createWeather(Uri sliceUri) {
+        GridBuilder b = new GridBuilder(getContext(), sliceUri);
+        return b.addCell(new GridBuilder.CellBuilder(b)
+                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_1))
+                        .addText("MON")
+                        .addTitleText("69\u00B0"))
+                .addCell(new GridBuilder.CellBuilder(b)
+                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_2))
+                        .addText("TUE")
+                        .addTitleText("71\u00B0"))
+                .addCell(new GridBuilder.CellBuilder(b)
+                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_3))
+                        .addText("WED")
+                        .addTitleText("76\u00B0"))
+                .addCell(new GridBuilder.CellBuilder(b)
+                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_4))
+                        .addText("THU")
+                        .addTitleText("72\u00B0"))
+                .addCell(new GridBuilder.CellBuilder(b)
+                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_1))
+                        .addText("FRI")
+                        .addTitleText("68\u00B0"))
+                .build();
+    }
+
+    private Slice createGallery(Uri sliceUri) {
+        GridBuilder b = new GridBuilder(getContext(), sliceUri);
+        return b.addCell(new GridBuilder.CellBuilder(b)
+                    .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_1)))
+                .addCell(new GridBuilder.CellBuilder(b)
+                    .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_2)))
+                .addCell(new GridBuilder.CellBuilder(b)
+                    .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_3)))
+                .addCell(new GridBuilder.CellBuilder(b)
+                    .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_4)))
+                .build();
+    }
+
+    private Slice createContact(Uri sliceUri) {
+        ListBuilder b = new ListBuilder(getContext(), sliceUri);
+        ListBuilder.RowBuilder rb = new ListBuilder.RowBuilder(b);
+        GridBuilder gb = new GridBuilder(b);
+        return b.setColor(0xff3949ab)
+                .addRow(rb
+                        .setTitle("Mady Pitza")
+                        .setSubtitle("Frequently contacted contact")
+                        .addEndItem(Icon.createWithResource(getContext(), R.drawable.mady)))
+                .addGrid(gb
+                        .addCell(new GridBuilder.CellBuilder(gb)
+                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_call))
+                            .addText("Call")
+                            .setContentIntent(getBroadcastIntent(ACTION_TOAST, "call")))
+                        .addCell(new GridBuilder.CellBuilder(gb)
+                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_text))
+                            .addText("Text")
+                            .setContentIntent(getBroadcastIntent(ACTION_TOAST, "text")))
+                        .addCell(new GridBuilder.CellBuilder(gb)
+                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_video))
+                            .setContentIntent(getBroadcastIntent(ACTION_TOAST, "video"))
+                            .addText("Video"))
+                        .addCell(new GridBuilder.CellBuilder(gb)
+                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_email))
+                            .addText("Email")
+                            .setContentIntent(getBroadcastIntent(ACTION_TOAST, "email"))))
+                .build();
+    }
+
+    private Slice createMessagingSlice(Uri sliceUri) {
+        // TODO: Remote input.
+        MessagingSliceBuilder mb = new MessagingSliceBuilder(getContext(), sliceUri);
+        return mb
+                .add(new MessagingSliceBuilder.MessageBuilder(mb)
+                        .addText("yo home \uD83C\uDF55, I emailed you the info")
+                        .addTimestamp(System.currentTimeMillis() - 20 * DateUtils.MINUTE_IN_MILLIS)
+                        .addSource(Icon.createWithResource(getContext(), R.drawable.mady)))
+                .add(new MessagingSliceBuilder.MessageBuilder(mb)
+                        .addText("just bought my tickets")
+                        .addTimestamp(System.currentTimeMillis() - 10 * DateUtils.MINUTE_IN_MILLIS))
+                .add(new MessagingSliceBuilder.MessageBuilder(mb)
+                        .addText("yay! can't wait for getContext() weekend!\n"
+                                + "\uD83D\uDE00")
+                        .addTimestamp(System.currentTimeMillis() - 5 * DateUtils.MINUTE_IN_MILLIS)
+                        .addSource(Icon.createWithResource(getContext(), R.drawable.mady)))
+                .build();
+
+    }
+
+    private Slice createNoteSlice(Uri sliceUri) {
+        // TODO: Remote input.
+        ListBuilder lb = new ListBuilder(getContext(), sliceUri);
+        return lb.setColor(0xfff4b400)
+                .addRow(new ListBuilder.RowBuilder(lb)
+                    .setTitle("Create new note")
+                    .setSubtitle("with this note taking app")
+                    .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_create),
+                            getBroadcastIntent(ACTION_TOAST, "create note"))
+                    .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_voice),
+                            getBroadcastIntent(ACTION_TOAST, "voice note"))
+                    .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_camera),
+                            getIntent("android.media.action.IMAGE_CAPTURE")))
+                .build();
+    }
+
+    private Slice createRideSlice(Uri sliceUri) {
+        final ForegroundColorSpan colorSpan = new ForegroundColorSpan(0xff0F9D58);
+        SpannableString headerSubtitle = new SpannableString("Ride in 4 min");
+        headerSubtitle.setSpan(colorSpan, 8, headerSubtitle.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
+        SpannableString homeSubtitle = new SpannableString("12 miles | 12 min | $9.00");
+        homeSubtitle.setSpan(colorSpan, 20, homeSubtitle.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
+        SpannableString workSubtitle = new SpannableString("44 miles | 1 hour 45 min | $31.41");
+        workSubtitle.setSpan(colorSpan, 27, workSubtitle.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
+
+        ListBuilder b = new ListBuilder(getContext(), sliceUri);
+        return b.setColor(0xff0F9D58)
+            .addRow(new ListBuilder.RowBuilder(b)
+                    .setContentIntent(getBroadcastIntent(ACTION_TOAST, "work"))
+                    .setTitle("Work")
+                    .setSubtitle(workSubtitle)
+                    .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_work),
+                        getBroadcastIntent(ACTION_TOAST, "work")))
+            .addRow(new ListBuilder.RowBuilder(b)
+                    .setContentIntent(getBroadcastIntent(ACTION_TOAST, "home"))
+                    .setTitle("Home")
+                    .setSubtitle(homeSubtitle)
+                    .addEndItem(Icon.createWithResource(getContext(), R.drawable.ic_home),
+                        getBroadcastIntent(ACTION_TOAST, "home")))
+            .build();
+    }
+
+    private Slice createCustomToggleSlice(Uri sliceUri) {
+        ListBuilder b = new ListBuilder(getContext(), sliceUri);
+        return b.setColor(0xffff4081)
+                .addRow(new ListBuilder.RowBuilder(b)
+                    .setTitle("Custom toggle")
+                    .setSubtitle("It can support two states")
+                    .addToggle(getBroadcastIntent(ACTION_TOAST, "star toggled"),
+                            true /* isChecked */,
+                            Icon.createWithResource(getContext(), R.drawable.toggle_star)))
+                .build();
+    }
+
+    private Slice createTwoCustomToggleSlices(Uri sliceUri) {
+        ListBuilder lb = new ListBuilder(getContext(), sliceUri);
+        return lb.setColor(0xffff4081)
+                .addRow(new ListBuilder.RowBuilder(lb)
+                        .setTitle("2 toggles")
+                        .setSubtitle("each supports two states")
+                        .addToggle(getBroadcastIntent(ACTION_TOAST, "first star toggled"),
+                                true /* isChecked */,
+                                Icon.createWithResource(getContext(), R.drawable.toggle_star))
+                        .addToggle(getBroadcastIntent(ACTION_TOAST, "second star toggled"),
+                                false /* isChecked */,
+                                Icon.createWithResource(getContext(), R.drawable.toggle_star)))
+                .build();
+    }
+
+    private Slice createWifiSlice(Uri sliceUri) {
+        // Get wifi state
+        WifiManager wifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
+        int wifiState = wifiManager.getWifiState();
+        boolean wifiEnabled = false;
+        String state;
+        switch (wifiState) {
+            case WifiManager.WIFI_STATE_DISABLED:
+            case WifiManager.WIFI_STATE_DISABLING:
+                state = "disconnected";
+                break;
+            case WifiManager.WIFI_STATE_ENABLED:
+            case WifiManager.WIFI_STATE_ENABLING:
+                state = wifiManager.getConnectionInfo().getSSID();
+                wifiEnabled = true;
+                break;
+            case WifiManager.WIFI_STATE_UNKNOWN:
+            default:
+                state = ""; // just don't show anything?
+                break;
+        }
+        boolean finalWifiEnabled = wifiEnabled;
+        ListBuilder b = new ListBuilder(getContext(), sliceUri);
+        return b.setColor(0xff4285f4)
+                .addRow(new ListBuilder.RowBuilder(b)
+                    .setTitle("Wi-fi")
+                    .setTitleItem(Icon.createWithResource(getContext(), R.drawable.ic_wifi))
+                    .setSubtitle(state)
+                    .addToggle(getBroadcastIntent(ACTION_WIFI_CHANGED, null), finalWifiEnabled)
+                    .setContentIntent(getIntent(Settings.ACTION_WIFI_SETTINGS)))
+            .build();
+    }
+
+    private PendingIntent getIntent(String action) {
+        Intent intent = new Intent(action);
+        intent.setClassName(getContext().getPackageName(), SliceRenderActivity.class.getName());
+        PendingIntent pi = PendingIntent.getActivity(getContext(), 0, intent, 0);
+        return pi;
+    }
+
+    private PendingIntent getBroadcastIntent(String action, String message) {
+        Intent intent = new Intent(action);
+        intent.setClassName(getContext().getPackageName(), SliceRenderActivity.class.getName());
+        // Ensure a new PendingIntent is created for each message.
+        int requestCode = 0;
+        if (message != null) {
+            intent.putExtra(EXTRA_TOAST_MESSAGE, message);
+            requestCode = message.hashCode();
+        }
+        return PendingIntent.getBroadcast(getContext(), requestCode, intent,
+                PendingIntent.FLAG_UPDATE_CURRENT);
+    }
+}
diff --git a/slices/view/src/androidTest/java/androidx/app/slice/render/SliceRenderActivity.java b/slices/view/src/androidTest/java/androidx/app/slice/render/SliceRenderActivity.java
new file mode 100644
index 0000000..debb280
--- /dev/null
+++ b/slices/view/src/androidTest/java/androidx/app/slice/render/SliceRenderActivity.java
@@ -0,0 +1,40 @@
+/*
+ * 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.app.slice.render;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+
+public class SliceRenderActivity extends Activity {
+    public static final String ACTION_RENDER_DONE = "androidx.app.slice.render.RENDER_DONE";
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        new SliceRenderer(this).renderAll(new Runnable() {
+
+            @Override
+            public void run() {
+                sendBroadcast(new Intent(ACTION_RENDER_DONE));
+                finish();
+            }
+        });
+    }
+}
diff --git a/slices/view/src/androidTest/java/androidx/app/slice/render/SliceRenderer.java b/slices/view/src/androidTest/java/androidx/app/slice/render/SliceRenderer.java
new file mode 100644
index 0000000..d2b8619
--- /dev/null
+++ b/slices/view/src/androidTest/java/androidx/app/slice/render/SliceRenderer.java
@@ -0,0 +1,222 @@
+/*
+ * 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.app.slice.render;
+
+import static android.view.View.MeasureSpec.makeMeasureSpec;
+
+import android.app.Activity;
+import android.app.ProgressDialog;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.os.AsyncTask;
+import android.os.Environment;
+import android.os.Handler;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.util.concurrent.CountDownLatch;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceProvider;
+import androidx.app.slice.view.test.R;
+import androidx.app.slice.widget.SliceLiveData;
+import androidx.app.slice.widget.SliceView;
+
+public class SliceRenderer {
+
+    private static final String TAG = "SliceRenderer";
+    private static final String SCREENSHOT_DIR = "slice-screenshots";
+    private static File sScreenshotDirectory;
+
+    private final Activity mContext;
+    private final View mLayout;
+    private final SliceView mSV1;
+    private final SliceView mSV2;
+    private final SliceView mSV3;
+    private final ViewGroup mParent;
+    private final Handler mHandler;
+    private final SliceCreator mSliceCreator;
+    private CountDownLatch mDoneLatch;
+
+    public SliceRenderer(Activity context) {
+        mContext = context;
+        mParent = new ViewGroup(mContext) {
+            @Override
+            protected void onLayout(boolean changed, int l, int t, int r, int b) {
+                int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 900,
+                        mContext.getResources().getDisplayMetrics());
+                int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200,
+                        mContext.getResources().getDisplayMetrics());
+                mLayout.measure(makeMeasureSpec(width, View.MeasureSpec.EXACTLY),
+                        makeMeasureSpec(height, View.MeasureSpec.EXACTLY));
+                mLayout.layout(0, 0, width, height);
+            }
+
+            @Override
+            protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
+                return false;
+            }
+        };
+        mLayout = LayoutInflater.from(context).inflate(R.layout.render_layout, null);
+        mSV1 = mLayout.findViewById(R.id.sv1);
+        mSV1.setMode(SliceView.MODE_SHORTCUT);
+        mSV2 = mLayout.findViewById(R.id.sv2);
+        mSV2.setMode(SliceView.MODE_SMALL);
+        mSV3 = mLayout.findViewById(R.id.sv3);
+        mSV3.setMode(SliceView.MODE_LARGE);
+        disableAnims(mLayout);
+        mHandler = new Handler();
+        ((ViewGroup) mContext.getWindow().getDecorView()).addView(mParent);
+        mParent.addView(mLayout);
+        SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
+        mSliceCreator = new SliceCreator(mContext);
+    }
+
+    private void disableAnims(View view) {
+        if (view instanceof RecyclerView) {
+            ((RecyclerView) view).setItemAnimator(null);
+        }
+        if (view instanceof ViewGroup) {
+            ViewGroup viewGroup = (ViewGroup) view;
+            for (int i = 0; i < viewGroup.getChildCount(); i++) {
+                disableAnims(viewGroup.getChildAt(i));
+            }
+        }
+    }
+
+
+    private static File getScreenshotDirectory() {
+        if (sScreenshotDirectory == null) {
+            File storage = Environment.getExternalStorageDirectory();
+            sScreenshotDirectory = new File(storage, SCREENSHOT_DIR);
+            if (!sScreenshotDirectory.exists()) {
+                if (!sScreenshotDirectory.mkdirs()) {
+                    throw new RuntimeException(
+                            "Failed to create a screenshot directory.");
+                }
+            }
+        }
+        return sScreenshotDirectory;
+    }
+
+
+    private void doRender() {
+        File output = getScreenshotDirectory();
+        if (!output.exists()) {
+            output.mkdir();
+        }
+        mDoneLatch = new CountDownLatch(SliceCreator.URI_PATHS.length);
+        for (String slice : SliceCreator.URI_PATHS) {
+            doRender(slice, new File(output, String.format("%s.png", slice)));
+        }
+        Log.d(TAG, "Wrote render to " + output.getAbsolutePath());
+        mContext.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                ((ViewGroup) mParent.getParent()).removeView(mParent);
+            }
+        });
+        try {
+            mDoneLatch.await();
+        } catch (InterruptedException e) {
+        }
+    }
+
+    private void doRender(final String slice, final File file) {
+        Log.d(TAG, "Rendering " + slice + " to " + file.getAbsolutePath());
+
+        final Slice s = mSliceCreator.onBindSlice(SliceCreator.getUri(slice, mContext));
+
+        final CountDownLatch l = new CountDownLatch(1);
+        mContext.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mSV1.setSlice(s);
+                mSV2.setSlice(s);
+                mSV3.setSlice(s);
+                mSV1.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
+                    @Override
+                    public void onLayoutChange(View v, int left, int top, int right, int bottom,
+                            int oldLeft, int oldTop, int oldRight, int oldBottom) {
+                        mSV1.removeOnLayoutChangeListener(this);
+                        mSV1.postDelayed(new Runnable() {
+                            @Override
+                            public void run() {
+                                Log.d(TAG, "Drawing " + slice);
+                                Bitmap b = Bitmap.createBitmap(mLayout.getMeasuredWidth(),
+                                        mLayout.getMeasuredHeight(),
+                                        Bitmap.Config.ARGB_8888);
+
+                                mLayout.draw(new Canvas(b));
+                                try {
+                                    doCompress(slice, b, new FileOutputStream(file));
+                                } catch (FileNotFoundException e) {
+                                    throw new RuntimeException(e);
+                                }
+                                l.countDown();
+                            }
+                        }, 10);
+                    }
+                });
+            }
+        });
+        try {
+            l.await();
+        } catch (InterruptedException e) {
+        }
+    }
+
+    private void doCompress(final String slice, final Bitmap b, final FileOutputStream s) {
+        AsyncTask.execute(new Runnable() {
+            @Override
+            public void run() {
+                Log.d(TAG, "Compressing " + slice);
+                if (!b.compress(Bitmap.CompressFormat.PNG, 100, s)) {
+                    throw new RuntimeException("Unable to compress");
+                }
+
+                b.recycle();
+                Log.d(TAG, "Done " + slice);
+                mDoneLatch.countDown();
+            }
+        });
+    }
+
+    public void renderAll(final Runnable runnable) {
+        final ProgressDialog dialog = ProgressDialog.show(mContext, null, "Rendering...");
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                doRender();
+                mContext.runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        dialog.dismiss();
+                        runnable.run();
+                    }
+                });
+            }
+        }).start();
+    }
+}
diff --git a/slices/view/src/androidTest/res/drawable/ic_call.xml b/slices/view/src/androidTest/res/drawable/ic_call.xml
new file mode 100644
index 0000000..ebf9de6
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/ic_call.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M6.62,10.79c1.44,2.83 3.76,5.14 6.59,6.59l2.2,-2.2c0.27,-0.27 0.67,-0.36 1.02,-0.24 1.12,0.37 2.33,0.57 3.57,0.57 0.55,0 1,0.45 1,1V20c0,0.55 -0.45,1 -1,1 -9.39,0 -17,-7.61 -17,-17 0,-0.55 0.45,-1 1,-1h3.5c0.55,0 1,0.45 1,1 0,1.25 0.2,2.45 0.57,3.57 0.11,0.35 0.03,0.74 -0.25,1.02l-2.2,2.2z"/>
+</vector>
diff --git a/slices/view/src/androidTest/res/drawable/ic_camera.xml b/slices/view/src/androidTest/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..74b6bf9
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/ic_camera.xml
@@ -0,0 +1,32 @@
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:fillColor="#000000"
+        android:pathData="M 12 8.8 C 13.7673111995 8.8 15.2 10.2326888005 15.2 12 C 15.2 13.7673111995 13.7673111995 15.2 12 15.2 C 10.2326888005 15.2 8.8 13.7673111995 8.8 12 C 8.8 10.2326888005 10.2326888005 8.8 12 8.8 Z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1 .9 2 2 2h16c1.1 0 2-.9
+2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5
+5-2.24 5-5 5z" />
+    <path
+        android:pathData="M0 0h24v24H0z" />
+</vector>
\ No newline at end of file
diff --git a/slices/view/src/androidTest/res/drawable/ic_car.xml b/slices/view/src/androidTest/res/drawable/ic_car.xml
new file mode 100644
index 0000000..6bab660
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/ic_car.xml
@@ -0,0 +1,31 @@
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:fillColor="#000000"
+        android:pathData="M18.92 6.01C18.72 5.42 18.16 5 17.5 5h-11c-.66 0-1.21 .42 -1.42 1.01L3 12v8c0
+.55 .45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55 .45 1 1 1h1c.55 0 1-.45
+1-1v-8l-2.08-5.99zM6.5 16c-.83 0-1.5-.67-1.5-1.5S5.67 13 6.5 13s1.5 .67 1.5
+1.5S7.33 16 6.5 16zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5 .67 1.5
+1.5-.67 1.5-1.5 1.5zM5 11l1.5-4.5h11L19 11H5z" />
+    <path
+        android:pathData="M0 0h24v24H0z" />
+</vector>
\ No newline at end of file
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/slices/view/src/androidTest/res/drawable/ic_create.xml
similarity index 72%
copy from design/res/drawable-anydpi-v21/design_ic_visibility.xml
copy to slices/view/src/androidTest/res/drawable/ic_create.xml
index 123acd2..d1666a8 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/slices/view/src/androidTest/res/drawable/ic_create.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,16 +12,13 @@
   ~ 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.
--->
-
+  -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/>
+</vector>
diff --git a/slices/view/src/androidTest/res/drawable/ic_email.xml b/slices/view/src/androidTest/res/drawable/ic_email.xml
new file mode 100644
index 0000000..ce97ab8
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/ic_email.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z"/>
+</vector>
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/slices/view/src/androidTest/res/drawable/ic_home.xml
similarity index 65%
copy from design/res/drawable-anydpi-v21/design_ic_visibility.xml
copy to slices/view/src/androidTest/res/drawable/ic_home.xml
index 123acd2..b278230 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/slices/view/src/androidTest/res/drawable/ic_home.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,16 +12,16 @@
   ~ 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.
--->
-
+  -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
 
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
+        android:fillColor="#000000"
+        android:pathData="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z" />
+    <path
+        android:pathData="M0 0h24v24H0z" />
 </vector>
\ No newline at end of file
diff --git a/slices/view/src/androidTest/res/drawable/ic_large.xml b/slices/view/src/androidTest/res/drawable/ic_large.xml
new file mode 100644
index 0000000..79ac590
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/ic_large.xml
@@ -0,0 +1,28 @@
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48.0dp"
+        android:height="48.0dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M34.0,2.02L14.0,2.0c-2.21,0.0 -4.0,1.79 -4.0,4.0l0.0,36.0c0.0,2.21 1.79,4.0 4.0,4.0l20.0,0.0c2.21,0.0 4.0,-1.79 4.0,-4.0L38.0,6.0c0.0,-2.21 -1.79,-3.98 -4.0,-3.98zM34.0,38.0L14.0,38.0L14.0,10.0l20.0,0.0l0.0,28.0z"/>
+    <path
+        android:strokeColor="#FF000000"
+        android:strokeWidth="2"
+        android:pathData="M16,18 l16,0 l0,10 l-16,0z"/>
+</vector>
diff --git a/slices/view/src/androidTest/res/drawable/ic_shortcut.xml b/slices/view/src/androidTest/res/drawable/ic_shortcut.xml
new file mode 100644
index 0000000..bf9572a
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/ic_shortcut.xml
@@ -0,0 +1,34 @@
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="48.0dp"
+    android:viewportHeight="48.0"
+    android:viewportWidth="48.0"
+    android:width="48.0dp">
+    <path
+        android:fillColor="#e2e2e2"
+        android:pathData="M24.0,24.0m-19.0,0.0a19.0,19.0 0.0,1.0 1.0,38.0 0.0a19.0,19.0 0.0,1.0 1.0,-38.0 0.0"/>
+    <group
+        android:scaleX=".7"
+        android:scaleY=".7"
+        android:translateX="7.2"
+        android:translateY="7.2">
+
+        <path
+            android:fillColor="#ff000000"
+            android:pathData="M12.0,36.0c0.0,1.0 0.9,2.0 2.0,2.0l2.0,0.0l0.0,7.0c0.0,1.66 1.34,3.0 3.0,3.0s3.0,-1.34 3.0,-3.0l0.0,-7.0l4.0,0.0l0.0,7.0c0.0,1.66 1.34,3.0 3.0,3.0s3.0,-1.34 3.0,-3.0l0.0,-7.0l2.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L36.0,16.0L12.0,16.0l0.0,20.0zM7.0,16.0c-1.66,0.0 -3.0,1.34 -3.0,3.0l0.0,14.0c0.0,1.66 1.34,3.0 3.0,3.0s3.0,-1.34 3.0,-3.0L10.0,19.0c0.0,-1.66 -1.34,-3.0 -3.0,-3.0zm34.0,0.0c-1.66,0.0 -3.0,1.34 -3.0,3.0l0.0,14.0c0.0,1.66 1.34,3.0 3.0,3.0s3.0,-1.34 3.0,-3.0L44.0,19.0c0.0,-1.66 -1.34,-3.0 -3.0,-3.0zM31.06,4.32l2.61,-2.61c0.39,-0.3 0.39,-1.02 0.0,-1.41 -0.39,-0.39 -1.02,-0.39 -1.41,0.0L29.3,3.25C27.7,2.46 25.91,2.0 24.0,2.0c-1.92,0.0 -3.7,0.46 -5.33,1.26L15.0,0.29c-0.39,-0.39 -1.02,-0.39 -1.41,0.0 -0.3,0.39 -0.39,1.02 0.0,1.41l2.62,2.62C13.94,6.51 12.0,10.03 12.0,14.0l24.0,0.0c0.0,-3.98 -1.95,-7.5 -4.94,-9.68zM20.0,10.0l-2.0,0.0L18.0,8.0l2.0,0.0l0.0,2.0zm10.0,0.0l-2.0,0.0L28.0,8.0l2.0,0.0l0.0,2.0z"/>
+    </group>
+</vector>
diff --git a/slices/view/src/androidTest/res/drawable/ic_small.xml b/slices/view/src/androidTest/res/drawable/ic_small.xml
new file mode 100644
index 0000000..8fd43df
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/ic_small.xml
@@ -0,0 +1,27 @@
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48.0dp"
+        android:height="48.0dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M34.0,2.02L14.0,2.0c-2.21,0.0 -4.0,1.79 -4.0,4.0l0.0,36.0c0.0,2.21 1.79,4.0 4.0,4.0l20.0,0.0c2.21,0.0 4.0,-1.79 4.0,-4.0L38.0,6.0c0.0,-2.21 -1.79,-3.98 -4.0,-3.98zM34.0,38.0L14.0,38.0L14.0,10.0l20.0,0.0l0.0,28.0z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M16,18 l16,0 l0,4 l-16,0z"/>
+</vector>
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/slices/view/src/androidTest/res/drawable/ic_star_off.xml
similarity index 70%
copy from design/res/drawable-anydpi-v21/design_ic_visibility.xml
copy to slices/view/src/androidTest/res/drawable/ic_star_off.xml
index 123acd2..7f023b3 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/slices/view/src/androidTest/res/drawable/ic_star_off.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,16 +12,13 @@
   ~ 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.
--->
-
+  -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z"/>
+</vector>
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/slices/view/src/androidTest/res/drawable/ic_star_on.xml
similarity index 77%
copy from design/res/drawable-anydpi-v21/design_ic_visibility.xml
copy to slices/view/src/androidTest/res/drawable/ic_star_on.xml
index 123acd2..f3ca086 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/slices/view/src/androidTest/res/drawable/ic_star_on.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,16 +12,13 @@
   ~ 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.
--->
-
+  -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z"/>
+</vector>
diff --git a/slices/view/src/androidTest/res/drawable/ic_text.xml b/slices/view/src/androidTest/res/drawable/ic_text.xml
new file mode 100644
index 0000000..d2876bf
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/ic_text.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM18,14L6,14v-2h12v2zM18,11L6,11L6,9h12v2zM18,8L6,8L6,6h12v2z"/>
+</vector>
diff --git a/slices/view/src/androidTest/res/drawable/ic_video.xml b/slices/view/src/androidTest/res/drawable/ic_video.xml
new file mode 100644
index 0000000..e23eac8
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/ic_video.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M17,10.5V7c0,-0.55 -0.45,-1 -1,-1H4c-0.55,0 -1,0.45 -1,1v10c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1v-3.5l4,4v-11l-4,4z"/>
+</vector>
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/slices/view/src/androidTest/res/drawable/ic_voice.xml
similarity index 69%
copy from design/res/drawable-anydpi-v21/design_ic_visibility.xml
copy to slices/view/src/androidTest/res/drawable/ic_voice.xml
index 123acd2..8f465bb 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/slices/view/src/androidTest/res/drawable/ic_voice.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,16 +12,13 @@
   ~ 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.
--->
-
+  -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M12,15c1.66,0 2.99,-1.34 2.99,-3L15,6c0,-1.66 -1.34,-3 -3,-3S9,4.34 9,6v6c0,1.66 1.34,3 3,3zM17.3,12c0,3 -2.54,5.1 -5.3,5.1S6.7,15 6.7,12L5,12c0,3.42 2.72,6.23 6,6.72L11,22h2v-3.28c3.28,-0.48 6,-3.3 6,-6.72h-1.7z"/>
+</vector>
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/slices/view/src/androidTest/res/drawable/ic_wifi.xml
similarity index 63%
copy from design/res/drawable-anydpi-v21/design_ic_visibility.xml
copy to slices/view/src/androidTest/res/drawable/ic_wifi.xml
index 123acd2..4fbfd60 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/slices/view/src/androidTest/res/drawable/ic_wifi.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,16 +12,17 @@
   ~ 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.
--->
-
+  -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
-
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
-</vector>
\ No newline at end of file
+        android:fillColor="#FF000000"
+        android:pathData="M12.01,21.49L23.64,7c-0.45,-0.34 -4.93,-4 -11.64,-4C5.28,3 0.81,6.66 0.36,7l11.63,14.49 0.01,0.01 0.01,-0.01z"
+        android:fillAlpha=".3"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M3.53,10.95l8.46,10.54 0.01,0.01 0.01,-0.01 8.46,-10.54C20.04,10.62 16.81,8 12,8c-4.81,0 -8.04,2.62 -8.47,2.95z"/>
+</vector>
diff --git a/slices/view/src/androidTest/res/drawable/ic_work.xml b/slices/view/src/androidTest/res/drawable/ic_work.xml
new file mode 100644
index 0000000..6806402
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/ic_work.xml
@@ -0,0 +1,28 @@
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M0 0h24v24H0z" />
+    <path
+        android:fillColor="#000000"
+        android:pathData="M20 6h-4V4c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H4c-1.11 0-1.99 .89 -1.99 2L2
+19c0 1.11 .89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-6 0h-4V4h4v2z" />
+</vector>
\ No newline at end of file
diff --git a/slices/view/src/androidTest/res/drawable/mady.jpg b/slices/view/src/androidTest/res/drawable/mady.jpg
new file mode 100644
index 0000000..8b61f1b
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/mady.jpg
Binary files differ
diff --git a/slices/view/src/androidTest/res/drawable/slices_1.jpg b/slices/view/src/androidTest/res/drawable/slices_1.jpg
new file mode 100644
index 0000000..31cc065
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/slices_1.jpg
Binary files differ
diff --git a/slices/view/src/androidTest/res/drawable/slices_2.jpg b/slices/view/src/androidTest/res/drawable/slices_2.jpg
new file mode 100644
index 0000000..adbe1d3
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/slices_2.jpg
Binary files differ
diff --git a/slices/view/src/androidTest/res/drawable/slices_3.jpg b/slices/view/src/androidTest/res/drawable/slices_3.jpg
new file mode 100644
index 0000000..6617019
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/slices_3.jpg
Binary files differ
diff --git a/slices/view/src/androidTest/res/drawable/slices_4.jpg b/slices/view/src/androidTest/res/drawable/slices_4.jpg
new file mode 100644
index 0000000..d00a8b3
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/slices_4.jpg
Binary files differ
diff --git a/design/tests/res/drawable/test_drawable_state_list.xml b/slices/view/src/androidTest/res/drawable/toggle_star.xml
similarity index 71%
copy from design/tests/res/drawable/test_drawable_state_list.xml
copy to slices/view/src/androidTest/res/drawable/toggle_star.xml
index f125913..e964925 100644
--- a/design/tests/res/drawable/test_drawable_state_list.xml
+++ b/slices/view/src/androidTest/res/drawable/toggle_star.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2014 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.
@@ -13,9 +13,12 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_checked="true" android:drawable="@drawable/test_background_blue" />
-    <item android:drawable="@drawable/test_background_green" />
-</selector>
-
+    <item
+        android:id="@+id/on"
+        android:state_checked="true"
+        android:drawable="@drawable/ic_star_on" />
+    <item
+        android:id="@+id/off"
+        android:drawable="@drawable/ic_star_off" />
+</selector>
\ No newline at end of file
diff --git a/slices/view/src/androidTest/res/drawable/weather_1.png b/slices/view/src/androidTest/res/drawable/weather_1.png
new file mode 100644
index 0000000..7c4034e
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/weather_1.png
Binary files differ
diff --git a/slices/view/src/androidTest/res/drawable/weather_2.png b/slices/view/src/androidTest/res/drawable/weather_2.png
new file mode 100644
index 0000000..f1b6672
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/weather_2.png
Binary files differ
diff --git a/slices/view/src/androidTest/res/drawable/weather_3.png b/slices/view/src/androidTest/res/drawable/weather_3.png
new file mode 100644
index 0000000..a5db683
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/weather_3.png
Binary files differ
diff --git a/slices/view/src/androidTest/res/drawable/weather_4.png b/slices/view/src/androidTest/res/drawable/weather_4.png
new file mode 100644
index 0000000..0b7f3b0
--- /dev/null
+++ b/slices/view/src/androidTest/res/drawable/weather_4.png
Binary files differ
diff --git a/slices/view/src/androidTest/res/layout/activity_demo.xml b/slices/view/src/androidTest/res/layout/activity_demo.xml
new file mode 100644
index 0000000..f557f40
--- /dev/null
+++ b/slices/view/src/androidTest/res/layout/activity_demo.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.example.android.support.content.demos.ContentPagerDemoActivity">
+
+    <android.support.v7.widget.Toolbar
+        android:id="@+id/toolbar"
+        android:layout_width="match_parent"
+        android:layout_height="?attr/actionBarSize"
+        android:background="?attr/colorPrimary"
+        android:theme="@style/AppTheme.AppBarOverlay"
+        app:popupTheme="@style/AppTheme.PopupOverlay"/>
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+
+</LinearLayout>
diff --git a/slices/view/src/androidTest/res/layout/render_layout.xml b/slices/view/src/androidTest/res/layout/render_layout.xml
new file mode 100644
index 0000000..a8ed779
--- /dev/null
+++ b/slices/view/src/androidTest/res/layout/render_layout.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="1200dp"
+              android:layout_height="400dp"
+              android:background="@android:color/black"
+              android:orientation="horizontal"
+              android:padding="20dp">
+
+
+    <FrameLayout android:layout_width="wrap_content"
+                 android:layout_height="wrap_content">
+        <androidx.app.slice.widget.SliceView
+            android:id="@+id/sv1"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+    </FrameLayout>
+
+    <FrameLayout android:layout_width="400dp"
+                 android:layout_height="wrap_content"
+                 android:layout_marginStart="20dp">
+        <androidx.app.slice.widget.SliceView
+            android:id="@+id/sv2"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@android:color/white"
+            android:paddingEnd="16dp"
+            android:paddingStart="16dp"/>
+    </FrameLayout>
+
+    <FrameLayout android:layout_width="400dp"
+                 android:layout_height="wrap_content"
+                 android:layout_marginStart="20dp">
+        <androidx.app.slice.widget.SliceView
+            android:id="@+id/sv3"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@android:color/white"
+            android:paddingEnd="16dp"
+            android:paddingStart="16dp"/>
+    </FrameLayout>
+
+
+</LinearLayout>
\ No newline at end of file
diff --git a/slices/view/src/androidTest/res/mipmap-hdpi/ic_launcher.png b/slices/view/src/androidTest/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
--- /dev/null
+++ b/slices/view/src/androidTest/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/slices/view/src/androidTest/res/mipmap-hdpi/ic_launcher_round.png b/slices/view/src/androidTest/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..9a078e3
--- /dev/null
+++ b/slices/view/src/androidTest/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
diff --git a/slices/view/src/androidTest/res/mipmap-mdpi/ic_launcher.png b/slices/view/src/androidTest/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
--- /dev/null
+++ b/slices/view/src/androidTest/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/slices/view/src/androidTest/res/mipmap-mdpi/ic_launcher_round.png b/slices/view/src/androidTest/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..efc028a
--- /dev/null
+++ b/slices/view/src/androidTest/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
diff --git a/slices/view/src/androidTest/res/mipmap-xhdpi/ic_launcher.png b/slices/view/src/androidTest/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
--- /dev/null
+++ b/slices/view/src/androidTest/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/slices/view/src/androidTest/res/mipmap-xhdpi/ic_launcher_round.png b/slices/view/src/androidTest/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..3af2608
--- /dev/null
+++ b/slices/view/src/androidTest/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
diff --git a/slices/view/src/androidTest/res/mipmap-xxhdpi/ic_launcher.png b/slices/view/src/androidTest/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
--- /dev/null
+++ b/slices/view/src/androidTest/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/slices/view/src/androidTest/res/mipmap-xxhdpi/ic_launcher_round.png b/slices/view/src/androidTest/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..9bec2e6
--- /dev/null
+++ b/slices/view/src/androidTest/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/slices/view/src/androidTest/res/mipmap-xxxhdpi/ic_launcher.png b/slices/view/src/androidTest/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..aee44e1
--- /dev/null
+++ b/slices/view/src/androidTest/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/slices/view/src/androidTest/res/mipmap-xxxhdpi/ic_launcher_round.png b/slices/view/src/androidTest/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..34947cd
--- /dev/null
+++ b/slices/view/src/androidTest/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/design/res/values/integers.xml b/slices/view/src/androidTest/res/values/colors.xml
similarity index 75%
copy from design/res/values/integers.xml
copy to slices/view/src/androidTest/res/values/colors.xml
index a0d6fc7..86b4304 100644
--- a/design/res/values/integers.xml
+++ b/slices/view/src/androidTest/res/values/colors.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2015 The Android Open Source Project
+  ~ 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.
@@ -13,8 +13,10 @@
   ~ 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.
--->
+  -->
+
 <resources>
-    <integer name="bottom_sheet_slide_duration">150</integer>
-    <integer name="app_bar_elevation_anim_duration">150</integer>
+    <color name="colorPrimary">#3F51B5</color>
+    <color name="colorPrimaryDark">#303F9F</color>
+    <color name="colorAccent">#FF4081</color>
 </resources>
diff --git a/design/tests/res/values-sw600dp/dimens.xml b/slices/view/src/androidTest/res/values/strings.xml
similarity index 77%
copy from design/tests/res/values-sw600dp/dimens.xml
copy to slices/view/src/androidTest/res/values/strings.xml
index 67765c5..89583bd 100644
--- a/design/tests/res/values-sw600dp/dimens.xml
+++ b/slices/view/src/androidTest/res/values/strings.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- 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.
@@ -13,6 +13,6 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<resources>
-    <dimen name="custom_snackbar_max_width">540dp</dimen>
-</resources>
\ No newline at end of file
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_name">Slice Browser</string>
+</resources>
diff --git a/slices/view/src/androidTest/res/values/styles.xml b/slices/view/src/androidTest/res/values/styles.xml
new file mode 100644
index 0000000..afb6bad
--- /dev/null
+++ b/slices/view/src/androidTest/res/values/styles.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+    </style>
+    <style name="AppTheme.NoActionBar">
+        <item name="windowActionBar">false</item>
+        <item name="windowNoTitle">true</item>
+    </style>
+    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
+    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>
+
+</resources>
diff --git a/design/AndroidManifest.xml b/slices/view/src/main/AndroidManifest.xml
similarity index 82%
copy from design/AndroidManifest.xml
copy to slices/view/src/main/AndroidManifest.xml
index 0eb8b85..5e9dd17 100644
--- a/design/AndroidManifest.xml
+++ b/slices/view/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source Project
+<!-- Copyright (C) 2014 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.
@@ -14,6 +14,6 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="android.support.design">
-    <uses-sdk android:minSdkVersion="14" />
+          package="androidx.app.slice.view">
+    <uses-sdk android:minSdkVersion="28"/>
 </manifest>
diff --git a/slices/view/src/main/java/androidx/app/slice/SliceManager.java b/slices/view/src/main/java/androidx/app/slice/SliceManager.java
new file mode 100644
index 0000000..ba8c376
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/SliceManager.java
@@ -0,0 +1,165 @@
+/*
+ * 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.app.slice;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.support.v4.os.BuildCompat;
+
+import java.util.List;
+import java.util.concurrent.Executor;
+
+/**
+ * Class to handle interactions with {@link Slice}s.
+ * <p>
+ * The SliceManager manages permissions and pinned state for slices.
+ */
+public abstract class SliceManager {
+
+    /**
+     * Get a {@link SliceManager}.
+     */
+    @SuppressWarnings("NewApi")
+    public static @NonNull SliceManager getInstance(@NonNull Context context) {
+        if (BuildCompat.isAtLeastP()) {
+            return new SliceManagerWrapper(context);
+        } else {
+            return new SliceManagerCompat(context);
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    SliceManager() {
+    }
+
+    /**
+     * Adds a callback to a specific slice uri.
+     * <p>
+     * This is a convenience that performs a few slice actions at once. It will put
+     * the slice in a pinned state since there is a callback attached. It will also
+     * listen for content changes, when a content change observes, the android system
+     * will bind the new slice and provide it to all registered {@link SliceCallback}s.
+     *
+     * @param uri The uri of the slice being listened to.
+     * @param callback The listener that should receive the callbacks.
+     * @see SliceProvider#onSlicePinned(Uri)
+     */
+    public abstract void registerSliceCallback(@NonNull Uri uri, @NonNull SliceCallback callback);
+
+    /**
+     * Adds a callback to a specific slice uri.
+     * <p>
+     * This is a convenience that performs a few slice actions at once. It will put
+     * the slice in a pinned state since there is a callback attached. It will also
+     * listen for content changes, when a content change observes, the android system
+     * will bind the new slice and provide it to all registered {@link SliceCallback}s.
+     *
+     * @param uri The uri of the slice being listened to.
+     * @param callback The listener that should receive the callbacks.
+     * @see SliceProvider#onSlicePinned(Uri)
+     */
+    public abstract void registerSliceCallback(@NonNull Uri uri, @NonNull Executor executor,
+            @NonNull SliceCallback callback);
+
+    /**
+     * Removes a callback for a specific slice uri.
+     * <p>
+     * Removes the app from the pinned state (if there are no other apps/callbacks pinning it)
+     * in addition to removing the callback.
+     *
+     * @param uri The uri of the slice being listened to
+     * @param callback The listener that should no longer receive callbacks.
+     * @see #registerSliceCallback
+     */
+    public abstract void unregisterSliceCallback(@NonNull Uri uri, @NonNull SliceCallback callback);
+
+    /**
+     * Ensures that a slice is in a pinned state.
+     * <p>
+     * Pinned state is not persisted across reboots, so apps are expected to re-pin any slices
+     * they still care about after a reboot.
+     *
+     * @param uri The uri of the slice being pinned.
+     * @see SliceProvider#onSlicePinned(Uri)
+     */
+    public abstract void pinSlice(@NonNull Uri uri);
+
+    /**
+     * Remove a pin for a slice.
+     * <p>
+     * If the slice has no other pins/callbacks then the slice will be unpinned.
+     *
+     * @param uri The uri of the slice being unpinned.
+     * @see #pinSlice
+     * @see SliceProvider#onSliceUnpinned(Uri)
+     */
+    public abstract void unpinSlice(@NonNull Uri uri);
+
+    /**
+     * Get the current set of specs for a pinned slice.
+     * <p>
+     * This is the set of specs supported for a specific pinned slice. It will take
+     * into account all clients and returns only specs supported by all.
+     * @hide
+     * @see SliceSpec
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public abstract @NonNull List<SliceSpec> getPinnedSpecs(@NonNull Uri uri);
+
+    /**
+     * Turns a slice Uri into slice content.
+     *
+     * @param uri The URI to a slice provider
+     * @return The Slice provided by the app or null if none is given.
+     * @see Slice
+     */
+    public abstract @Nullable Slice bindSlice(@NonNull Uri uri);
+
+    /**
+     * Turns a slice intent into slice content. Expects an explicit intent. If there is no
+     * {@link android.content.ContentProvider} associated with the given intent this will throw
+     * {@link IllegalArgumentException}.
+     *
+     * @param intent The intent associated with a slice.
+     * @return The Slice provided by the app or null if none is given.
+     * @see Slice
+     * @see androidx.app.slice.SliceProvider#onMapIntentToUri(Intent)
+     * @see Intent
+     */
+    public abstract @Nullable Slice bindSlice(@NonNull Intent intent);
+
+    /**
+     * Class that listens to changes in {@link Slice}s.
+     */
+    public interface SliceCallback {
+
+        /**
+         * Called when slice is updated.
+         *
+         * @param s The updated slice.
+         * @see #registerSliceCallback
+         */
+        void onSliceUpdated(@NonNull Slice s);
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/SliceManagerCompat.java b/slices/view/src/main/java/androidx/app/slice/SliceManagerCompat.java
new file mode 100644
index 0000000..67613a5
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/SliceManagerCompat.java
@@ -0,0 +1,157 @@
+/*
+ * 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.app.slice;
+
+import static androidx.app.slice.widget.SliceLiveData.SUPPORTED_SPECS;
+
+import android.content.Context;
+import android.content.Intent;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.os.Looper;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.util.ArrayMap;
+import android.util.Pair;
+
+import java.util.List;
+import java.util.concurrent.Executor;
+
+import androidx.app.slice.compat.SliceProviderCompat;
+import androidx.app.slice.widget.SliceLiveData;
+
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+class SliceManagerCompat extends SliceManager {
+    private final ArrayMap<Pair<Uri, SliceCallback>, SliceListenerImpl> mListenerLookup =
+            new ArrayMap<>();
+    private final Context mContext;
+
+    SliceManagerCompat(Context context) {
+        mContext = context;
+    }
+
+    @Override
+    public void registerSliceCallback(@NonNull Uri uri, @NonNull SliceCallback callback) {
+        final Handler h = new Handler(Looper.getMainLooper());
+        registerSliceCallback(uri, new Executor() {
+            @Override
+            public void execute(@NonNull Runnable command) {
+                h.post(command);
+            }
+        }, callback);
+    }
+
+    @Override
+    public void registerSliceCallback(@NonNull Uri uri, @NonNull Executor executor,
+            @NonNull SliceCallback callback) {
+        pinSlice(uri);
+        getListener(uri, callback, new SliceListenerImpl(uri, executor, callback)).startListening();
+    }
+
+    @Override
+    public void unregisterSliceCallback(@NonNull Uri uri, @NonNull SliceCallback callback) {
+        unpinSlice(uri);
+        SliceListenerImpl impl = mListenerLookup.remove(new Pair<>(uri, callback));
+        if (impl != null) impl.stopListening();
+    }
+
+    @Override
+    public void pinSlice(@NonNull Uri uri) {
+        SliceProviderCompat.pinSlice(mContext, uri, SliceLiveData.SUPPORTED_SPECS);
+    }
+
+    @Override
+    public void unpinSlice(@NonNull Uri uri) {
+        SliceProviderCompat.unpinSlice(mContext, uri, SliceLiveData.SUPPORTED_SPECS);
+    }
+
+    @Override
+    public @NonNull List<SliceSpec> getPinnedSpecs(@NonNull Uri uri) {
+        return SliceProviderCompat.getPinnedSpecs(mContext, uri);
+    }
+
+    @Nullable
+    @Override
+    public Slice bindSlice(@NonNull Uri uri) {
+        return SliceProviderCompat.bindSlice(mContext, uri, SUPPORTED_SPECS);
+    }
+
+    @Nullable
+    @Override
+    public Slice bindSlice(@NonNull Intent intent) {
+        return SliceProviderCompat.bindSlice(mContext, intent, SUPPORTED_SPECS);
+    }
+
+    private SliceListenerImpl getListener(Uri uri, SliceCallback callback,
+            SliceListenerImpl listener) {
+        Pair<Uri, SliceCallback> key = new Pair<>(uri, callback);
+        if (mListenerLookup.containsKey(key)) {
+            mListenerLookup.get(key).stopListening();
+        }
+        mListenerLookup.put(key, listener);
+        return listener;
+    }
+
+    private class SliceListenerImpl {
+
+        private Uri mUri;
+        private final Executor mExecutor;
+        private final SliceCallback mCallback;
+
+        SliceListenerImpl(Uri uri, Executor executor, SliceCallback callback) {
+            mUri = uri;
+            mExecutor = executor;
+            mCallback = callback;
+        }
+
+        void startListening() {
+            mContext.getContentResolver().registerContentObserver(mUri, true, mObserver);
+        }
+
+        void stopListening() {
+            mContext.getContentResolver().unregisterContentObserver(mObserver);
+        }
+
+        private final Runnable mUpdateSlice = new Runnable() {
+            @Override
+            public void run() {
+                final Slice s = Slice.bindSlice(mContext, mUri, SUPPORTED_SPECS);
+                mExecutor.execute(new Runnable() {
+                    @Override
+                    public void run() {
+                        mCallback.onSliceUpdated(s);
+                    }
+                });
+            }
+        };
+
+        private final ContentObserver mObserver = new ContentObserver(
+                new Handler(Looper.getMainLooper())) {
+            @Override
+            public void onChange(boolean selfChange) {
+                AsyncTask.execute(mUpdateSlice);
+            }
+        };
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/SliceManagerWrapper.java b/slices/view/src/main/java/androidx/app/slice/SliceManagerWrapper.java
new file mode 100644
index 0000000..8b2265c
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/SliceManagerWrapper.java
@@ -0,0 +1,118 @@
+/*
+ * 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.app.slice;
+
+import static androidx.app.slice.SliceConvert.unwrap;
+import static androidx.app.slice.widget.SliceLiveData.SUPPORTED_SPECS;
+
+import android.app.slice.Slice;
+import android.app.slice.SliceSpec;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
+
+import java.util.List;
+import java.util.WeakHashMap;
+import java.util.concurrent.Executor;
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@RequiresApi(api = 28)
+class SliceManagerWrapper extends SliceManager {
+    private final android.app.slice.SliceManager mManager;
+    private final WeakHashMap<SliceCallback, android.app.slice.SliceManager.SliceCallback>
+            mCallbacks = new WeakHashMap<>();
+    private final List<SliceSpec> mSpecs;
+    private final Context mContext;
+
+    SliceManagerWrapper(Context context) {
+        this(context, context.getSystemService(android.app.slice.SliceManager.class));
+    }
+
+    SliceManagerWrapper(Context context, android.app.slice.SliceManager manager) {
+        mContext = context;
+        mManager = manager;
+        mSpecs = unwrap(SUPPORTED_SPECS);
+    }
+
+    @Override
+    public void registerSliceCallback(@NonNull Uri uri,
+            @NonNull SliceCallback callback) {
+        mManager.registerSliceCallback(uri, addCallback(callback), mSpecs);
+    }
+
+    @Override
+    public void registerSliceCallback(@NonNull Uri uri, @NonNull Executor executor,
+            @NonNull SliceCallback callback) {
+        mManager.registerSliceCallback(uri, addCallback(callback), mSpecs, executor);
+    }
+
+    @Override
+    public void unregisterSliceCallback(@NonNull Uri uri,
+            @NonNull SliceCallback callback) {
+        mManager.unregisterSliceCallback(uri, mCallbacks.get(callback));
+    }
+
+    @Override
+    public void pinSlice(@NonNull Uri uri) {
+        mManager.pinSlice(uri, mSpecs);
+    }
+
+    @Override
+    public void unpinSlice(@NonNull Uri uri) {
+        mManager.unpinSlice(uri);
+    }
+
+    @Override
+    public @NonNull List<androidx.app.slice.SliceSpec> getPinnedSpecs(@NonNull Uri uri) {
+        return SliceConvert.wrap(mManager.getPinnedSpecs(uri));
+    }
+
+    @Nullable
+    @Override
+    public androidx.app.slice.Slice bindSlice(@NonNull Uri uri) {
+        return SliceConvert.wrap(android.app.slice.Slice.bindSlice(
+                mContext.getContentResolver(), uri, unwrap(SUPPORTED_SPECS)));
+    }
+
+    @Nullable
+    @Override
+    public androidx.app.slice.Slice bindSlice(@NonNull Intent intent) {
+        return SliceConvert.wrap(android.app.slice.Slice.bindSlice(
+                mContext, intent, unwrap(SUPPORTED_SPECS)));
+    }
+
+    private android.app.slice.SliceManager.SliceCallback addCallback(final SliceCallback callback) {
+        android.app.slice.SliceManager.SliceCallback ret = mCallbacks.get(callback);
+        if (ret == null) {
+            ret = new android.app.slice.SliceManager.SliceCallback() {
+                @Override
+                public void onSliceUpdated(Slice s) {
+                    callback.onSliceUpdated(SliceConvert.wrap(s));
+                }
+            };
+            mCallbacks.put(callback, ret);
+        }
+        return ret;
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/SliceUtils.java b/slices/view/src/main/java/androidx/app/slice/SliceUtils.java
new file mode 100644
index 0000000..6a6ab14
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/SliceUtils.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice;
+
+import static android.app.slice.Slice.HINT_PARTIAL;
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_REMOTE_INPUT;
+
+import android.content.Context;
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.annotation.RestrictTo;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import androidx.app.slice.core.SliceQuery;
+
+/**
+ * Utilities for dealing with slices.
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class SliceUtils {
+
+    private SliceUtils() {
+    }
+
+    /**
+     * Serialize a slice to an OutputStream.
+     * <p>
+     * The slice can later be read into slice form again with {@link #parseSlice}.
+     * Some slice types cannot be serialized, their handling is controlled by
+     * {@link SerializeOptions}.
+     *
+     * @param s The slice to serialize.
+     * @param context Context used to load any resources in the slice.
+     * @param output The output of the serialization.
+     * @param encoding The encoding to use for serialization.
+     * @param options Options defining how to handle non-serializable items.
+     */
+    public static void serializeSlice(@NonNull Slice s, @NonNull Context context,
+            @NonNull OutputStream output, @NonNull String encoding,
+            @NonNull SerializeOptions options) throws IOException {
+        SliceXml.serializeSlice(s, context, output, encoding, options);
+    }
+
+    /**
+     * Parse a slice that has been previously serialized.
+     * <p>
+     * Parses a slice that was serialized with {@link #serializeSlice}.
+     *
+     * @param input The input stream to read from.
+     * @param encoding The encoding to read as.
+     */
+    public static @NonNull Slice parseSlice(@NonNull InputStream input, @NonNull String encoding)
+            throws IOException {
+        return SliceXml.parseSlice(input, encoding);
+    }
+
+    /**
+     * Holds options for how to handle SliceItems that cannot be serialized.
+     */
+    public static class SerializeOptions {
+        /**
+         * Constant indicating that the an {@link IllegalArgumentException} should be thrown
+         * when this format is encountered.
+         */
+        public static final int MODE_THROW = 0;
+        /**
+         * Constant indicating that the SliceItem should be removed when this format is encountered.
+         */
+        public static final int MODE_REMOVE = 1;
+        /**
+         * Constant indicating that the SliceItem should be serialized as much as possible.
+         * <p>
+         * For images this means it will be replaced with an empty image. For actions, the
+         * action will be removed but the content of the action will be serialized.
+         */
+        public static final int MODE_DISABLE = 2;
+
+        @IntDef({MODE_THROW, MODE_REMOVE, MODE_DISABLE})
+        @interface FormatMode {
+        }
+
+        private int mActionMode = MODE_THROW;
+        private int mImageMode = MODE_THROW;
+
+        /**
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        public void checkThrow(String format) {
+            switch (format) {
+                case FORMAT_ACTION:
+                case FORMAT_REMOTE_INPUT:
+                    if (mActionMode != MODE_THROW) return;
+                    break;
+                case FORMAT_IMAGE:
+                    if (mImageMode != MODE_THROW) return;
+                    break;
+                default:
+                    return;
+            }
+            throw new IllegalArgumentException(format + " cannot be serialized");
+        }
+
+        /**
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        public @FormatMode int getActionMode() {
+            return mActionMode;
+        }
+
+        /**
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        public @FormatMode int getImageMode() {
+            return mImageMode;
+        }
+
+        /**
+         * Sets how {@link android.app.slice.SliceItem#FORMAT_ACTION} items should be handled.
+         *
+         * The default mode is {@link #MODE_THROW}.
+         * @param mode The desired mode.
+         */
+        public SerializeOptions setActionMode(@FormatMode int mode) {
+            mActionMode = mode;
+            return this;
+        }
+
+        /**
+         * Sets how {@link android.app.slice.SliceItem#FORMAT_IMAGE} items should be handled.
+         *
+         * The default mode is {@link #MODE_THROW}.
+         * @param mode The desired mode.
+         */
+        public SerializeOptions setImageMode(@FormatMode int mode) {
+            mImageMode = mode;
+            return this;
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @IntDef({
+            LOADING_ALL, LOADING_PARTIAL, LOADING_COMPLETE
+    })
+    public @interface SliceLoadingState{}
+
+    /**
+     * Indicates this slice is empty and waiting for content to be loaded.
+     */
+    public static final int LOADING_ALL = 0;
+    /**
+     * Indicates this slice has some content but is waiting for other content to be loaded.
+     */
+    public static final int LOADING_PARTIAL = 1;
+    /**
+     * Indicates this slice has fully loaded and is not waiting for other content.
+     */
+    public static final int LOADING_COMPLETE = 2;
+
+    /**
+     * @return the current loading state of the provided {@link Slice}.
+     *
+     * @see #LOADING_ALL
+     * @see #LOADING_PARTIAL
+     * @see #LOADING_COMPLETE
+     */
+    public static int getLoadingState(Slice slice) {
+        // Check loading state
+        boolean hasHintPartial =
+                SliceQuery.find(slice, null, HINT_PARTIAL, null) != null;
+        if (hasHintPartial && slice.getItems().size() == 0) {
+            // Empty slice
+            return LOADING_ALL;
+        } else if (hasHintPartial) {
+            // Slice with specific content to load
+            return LOADING_PARTIAL;
+        } else {
+            // Full slice
+            return LOADING_COMPLETE;
+        }
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/SliceXml.java b/slices/view/src/main/java/androidx/app/slice/SliceXml.java
new file mode 100644
index 0000000..2500ef6
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/SliceXml.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice;
+
+import static org.xmlpull.v1.XmlPullParser.START_TAG;
+import static org.xmlpull.v1.XmlPullParser.TEXT;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.support.annotation.RestrictTo;
+import android.text.Html;
+import android.text.Spanned;
+import android.text.TextUtils;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlPullParserFactory;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+class SliceXml {
+
+    private static final String NAMESPACE = null;
+
+    private static final String TAG_SLICE = "slice";
+    private static final String TAG_ITEM = "item";
+
+    private static final String ATTR_URI = "uri";
+    private static final String ATTR_FORMAT = "format";
+    private static final String ATTR_SUBTYPE = "subtype";
+    private static final String ATTR_HINTS = "hints";
+
+    public static Slice parseSlice(InputStream input, String encoding) throws IOException {
+        try {
+            XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
+            parser.setInput(input, encoding);
+
+            int outerDepth = parser.getDepth();
+            int type;
+            Slice s = null;
+            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+                if (type != START_TAG) {
+                    continue;
+                }
+                s = parseSlice(parser);
+            }
+            return s;
+        } catch (XmlPullParserException e) {
+            throw new IOException("Unable to init XML Serialization", e);
+        }
+    }
+
+    @SuppressLint("WrongConstant")
+    private static Slice parseSlice(XmlPullParser parser)
+            throws IOException, XmlPullParserException {
+        if (!TAG_SLICE.equals(parser.getName())) {
+            throw new IOException("Unexpected tag " + parser.getName());
+        }
+        int outerDepth = parser.getDepth();
+        int type;
+        String uri = parser.getAttributeValue(NAMESPACE, ATTR_URI);
+        Slice.Builder b = new Slice.Builder(Uri.parse(uri));
+        String[] hints = hints(parser.getAttributeValue(NAMESPACE, ATTR_HINTS));
+        b.addHints(hints);
+
+        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+            if (type == START_TAG && TAG_ITEM.equals(parser.getName())) {
+                parseItem(b, parser);
+            }
+        }
+        return b.build();
+    }
+
+    @SuppressLint("WrongConstant")
+    private static void parseItem(Slice.Builder b, XmlPullParser parser)
+            throws IOException, XmlPullParserException {
+        int type;
+        int outerDepth = parser.getDepth();
+        String format = parser.getAttributeValue(NAMESPACE, ATTR_FORMAT);
+        String subtype = parser.getAttributeValue(NAMESPACE, ATTR_SUBTYPE);
+        String hintStr = parser.getAttributeValue(NAMESPACE, ATTR_HINTS);
+        String[] hints = hints(hintStr);
+        String v;
+        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+            if (type == TEXT) {
+                switch (format) {
+                    case android.app.slice.SliceItem.FORMAT_REMOTE_INPUT:
+                        // Nothing for now.
+                        break;
+                    case android.app.slice.SliceItem.FORMAT_IMAGE:
+                        v = parser.getText();
+                        if (!TextUtils.isEmpty(v)) {
+                            if (android.os.Build.VERSION.SDK_INT
+                                    >= android.os.Build.VERSION_CODES.M) {
+                                String[] split = v.split(",");
+                                int w = Integer.parseInt(split[0]);
+                                int h = Integer.parseInt(split[1]);
+                                Bitmap image = Bitmap.createBitmap(w, h, Bitmap.Config.ALPHA_8);
+                                b.addIcon(Icon.createWithBitmap(image), subtype, hints);
+                            }
+                        }
+                        break;
+                    case android.app.slice.SliceItem.FORMAT_INT:
+                        v = parser.getText();
+                        b.addInt(Integer.parseInt(v), subtype, hints);
+                        break;
+                    case android.app.slice.SliceItem.FORMAT_TEXT:
+                        v = parser.getText();
+                        b.addText(Html.fromHtml(v), subtype, hints);
+                        break;
+                    case android.app.slice.SliceItem.FORMAT_TIMESTAMP:
+                        v = parser.getText();
+                        b.addTimestamp(Long.parseLong(v), subtype, hints);
+                        break;
+                    default:
+                        throw new IllegalArgumentException("Unrecognized format " + format);
+                }
+            } else if (type == START_TAG && TAG_SLICE.equals(parser.getName())) {
+                b.addSubSlice(parseSlice(parser), subtype);
+            }
+        }
+    }
+
+    private static String[] hints(String hintStr) {
+        return TextUtils.isEmpty(hintStr) ? new String[0] : hintStr.split(",");
+    }
+
+    public static void serializeSlice(Slice s, Context context, OutputStream output,
+            String encoding, SliceUtils.SerializeOptions options) throws IOException {
+        try {
+            XmlSerializer serializer = XmlPullParserFactory.newInstance().newSerializer();
+            serializer.setOutput(output, encoding);
+            serializer.startDocument(encoding, null);
+
+            serialize(s, context, options, serializer);
+
+            serializer.endDocument();
+            serializer.flush();
+        } catch (XmlPullParserException e) {
+            throw new IOException("Unable to init XML Serialization", e);
+        }
+    }
+
+    private static void serialize(Slice s, Context context, SliceUtils.SerializeOptions options,
+            XmlSerializer serializer) throws IOException {
+        serializer.startTag(NAMESPACE, TAG_SLICE);
+        serializer.attribute(NAMESPACE, ATTR_URI, s.getUri().toString());
+        if (!s.getHints().isEmpty()) {
+            serializer.attribute(NAMESPACE, ATTR_HINTS, hintStr(s.getHints()));
+        }
+        for (SliceItem item : s.getItems()) {
+            serialize(item, context, options, serializer);
+        }
+
+        serializer.endTag(NAMESPACE, TAG_SLICE);
+    }
+
+    private static void serialize(SliceItem item, Context context,
+            SliceUtils.SerializeOptions options, XmlSerializer serializer) throws IOException {
+        String format = item.getFormat();
+        options.checkThrow(format);
+
+        serializer.startTag(NAMESPACE, TAG_ITEM);
+        serializer.attribute(NAMESPACE, ATTR_FORMAT, format);
+        if (item.getSubType() != null) {
+            serializer.attribute(NAMESPACE, ATTR_SUBTYPE, item.getSubType());
+        }
+        if (!item.getHints().isEmpty()) {
+            serializer.attribute(NAMESPACE, ATTR_HINTS, hintStr(item.getHints()));
+        }
+
+        switch (format) {
+            case android.app.slice.SliceItem.FORMAT_ACTION:
+                if (options.getActionMode() == SliceUtils.SerializeOptions.MODE_DISABLE) {
+                    serialize(item.getSlice(), context, options, serializer);
+                }
+                break;
+            case android.app.slice.SliceItem.FORMAT_REMOTE_INPUT:
+                // Nothing for now.
+                break;
+            case android.app.slice.SliceItem.FORMAT_IMAGE:
+                if (options.getImageMode() == SliceUtils.SerializeOptions.MODE_DISABLE) {
+                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
+                        Drawable d = item.getIcon().loadDrawable(context);
+                        serializer.text(String.format("%d,%d",
+                                d.getIntrinsicWidth(), d.getIntrinsicHeight()));
+                    }
+                }
+                break;
+            case android.app.slice.SliceItem.FORMAT_INT:
+                serializer.text(String.valueOf(item.getInt()));
+                break;
+            case android.app.slice.SliceItem.FORMAT_SLICE:
+                serialize(item.getSlice(), context, options, serializer);
+                break;
+            case android.app.slice.SliceItem.FORMAT_TEXT:
+                if (item.getText() instanceof Spanned) {
+                    serializer.text(Html.toHtml((Spanned) item.getText()));
+                } else {
+                    serializer.text(String.valueOf(item.getText()));
+                }
+                break;
+            case android.app.slice.SliceItem.FORMAT_TIMESTAMP:
+                serializer.text(String.valueOf(item.getTimestamp()));
+                break;
+            default:
+                throw new IllegalArgumentException("Unrecognized format " + format);
+        }
+        serializer.endTag(NAMESPACE, TAG_ITEM);
+    }
+
+    private static String hintStr(List<String> hints) {
+        return TextUtils.join(",", hints);
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/ActionRow.java b/slices/view/src/main/java/androidx/app/slice/widget/ActionRow.java
new file mode 100644
index 0000000..2eaa059
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/ActionRow.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.widget;
+
+import static android.app.slice.Slice.HINT_NO_TINT;
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_REMOTE_INPUT;
+
+import android.annotation.TargetApi;
+import android.app.PendingIntent;
+import android.app.PendingIntent.CanceledException;
+import android.app.RemoteInput;
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.graphics.Color;
+import android.graphics.drawable.Icon;
+import android.os.AsyncTask;
+import android.support.annotation.RestrictTo;
+import android.util.TypedValue;
+import android.view.View;
+import android.view.ViewParent;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.ImageView.ScaleType;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import java.util.function.Consumer;
+
+import androidx.app.slice.SliceItem;
+import androidx.app.slice.core.SliceQuery;
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@TargetApi(24)
+public class ActionRow extends FrameLayout {
+
+    private static final int MAX_ACTIONS = 5;
+    private final int mSize;
+    private final int mIconPadding;
+    private final LinearLayout mActionsGroup;
+    private final boolean mFullActions;
+    private int mColor = Color.BLACK;
+
+    public ActionRow(Context context, boolean fullActions) {
+        super(context);
+        mFullActions = fullActions;
+        mSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 48,
+                context.getResources().getDisplayMetrics());
+        mIconPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 12,
+                context.getResources().getDisplayMetrics());
+        mActionsGroup = new LinearLayout(context);
+        mActionsGroup.setOrientation(LinearLayout.HORIZONTAL);
+        mActionsGroup.setLayoutParams(
+                new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+        addView(mActionsGroup);
+    }
+
+    private void setColor(int color) {
+        mColor = color;
+        for (int i = 0; i < mActionsGroup.getChildCount(); i++) {
+            View view = mActionsGroup.getChildAt(i);
+            SliceItem item = (SliceItem) view.getTag();
+            boolean tint = !item.hasHint(HINT_NO_TINT);
+            if (tint) {
+                ((ImageView) view).setImageTintList(ColorStateList.valueOf(mColor));
+            }
+        }
+    }
+
+    private ImageView addAction(Icon icon, boolean allowTint, SliceItem image) {
+        ImageView imageView = new ImageView(getContext());
+        imageView.setPadding(mIconPadding, mIconPadding, mIconPadding, mIconPadding);
+        imageView.setScaleType(ScaleType.FIT_CENTER);
+        imageView.setImageIcon(icon);
+        if (allowTint) {
+            imageView.setImageTintList(ColorStateList.valueOf(mColor));
+        }
+        imageView.setBackground(SliceViewUtil.getDrawable(getContext(),
+                android.R.attr.selectableItemBackground));
+        imageView.setTag(image);
+        addAction(imageView);
+        return imageView;
+    }
+
+    /**
+     * Set the actions and color for this action row.
+     */
+    public void setActions(SliceItem actionRow, int color) {
+        removeAllViews();
+        mActionsGroup.removeAllViews();
+        addView(mActionsGroup);
+        if (color != -1) {
+            setColor(color);
+        }
+        SliceQuery.findAll(actionRow, FORMAT_ACTION).forEach(new Consumer<SliceItem>() {
+            @Override
+            public void accept(final SliceItem action) {
+                if (mActionsGroup.getChildCount() >= MAX_ACTIONS) {
+                    return;
+                }
+                SliceItem image = SliceQuery.find(action, FORMAT_IMAGE);
+                if (image == null) {
+                    return;
+                }
+                boolean tint = !image.hasHint(HINT_NO_TINT);
+                final SliceItem input = SliceQuery.find(action, FORMAT_REMOTE_INPUT);
+                if (input != null && input.getRemoteInput().getAllowFreeFormInput()) {
+                    addAction(image.getIcon(), tint, image).setOnClickListener(
+                            new OnClickListener() {
+                                @Override
+                                public void onClick(View v) {
+                                    handleRemoteInputClick(v, action.getAction(),
+                                            input.getRemoteInput());
+                                }
+                            });
+                    createRemoteInputView(mColor, getContext());
+                } else {
+                    addAction(image.getIcon(), tint, image).setOnClickListener(
+                            new OnClickListener() {
+                                @Override
+                                public void onClick(View v) {
+                                    AsyncTask.execute(new Runnable() {
+                                        @Override
+                                        public void run() {
+
+                                            try {
+                                                action.getAction().send();
+                                            } catch (CanceledException e) {
+                                                e.printStackTrace();
+                                            }
+                                        }
+                                    });
+                                }
+                            });
+                }
+            }
+        });
+        setVisibility(getChildCount() != 0 ? View.VISIBLE : View.GONE);
+    }
+
+    private void addAction(View child) {
+        mActionsGroup.addView(child, new LinearLayout.LayoutParams(mSize, mSize, 1));
+    }
+
+    private void createRemoteInputView(int color, Context context) {
+        View riv = RemoteInputView.inflate(context, this);
+        riv.setVisibility(View.INVISIBLE);
+        addView(riv, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
+        riv.setBackgroundColor(color);
+    }
+
+    private boolean handleRemoteInputClick(View view, PendingIntent pendingIntent,
+            RemoteInput input) {
+        if (input == null) {
+            return false;
+        }
+
+        ViewParent p = view.getParent().getParent();
+        RemoteInputView riv = null;
+        while (p != null) {
+            if (p instanceof View) {
+                View pv = (View) p;
+                riv = findRemoteInputView(pv);
+                if (riv != null) {
+                    break;
+                }
+            }
+            p = p.getParent();
+        }
+        if (riv == null) {
+            return false;
+        }
+
+        int width = view.getWidth();
+        if (view instanceof TextView) {
+            // Center the reveal on the text which might be off-center from the TextView
+            TextView tv = (TextView) view;
+            if (tv.getLayout() != null) {
+                int innerWidth = (int) tv.getLayout().getLineWidth(0);
+                innerWidth += tv.getCompoundPaddingLeft() + tv.getCompoundPaddingRight();
+                width = Math.min(width, innerWidth);
+            }
+        }
+        int cx = view.getLeft() + width / 2;
+        int cy = view.getTop() + view.getHeight() / 2;
+        int w = riv.getWidth();
+        int h = riv.getHeight();
+        int r = Math.max(
+                Math.max(cx + cy, cx + (h - cy)),
+                Math.max((w - cx) + cy, (w - cx) + (h - cy)));
+
+        riv.setRevealParameters(cx, cy, r);
+        riv.setPendingIntent(pendingIntent);
+        riv.setRemoteInput(new RemoteInput[] {
+                input
+        }, input);
+        riv.focusAnimated();
+        return true;
+    }
+
+    private RemoteInputView findRemoteInputView(View v) {
+        if (v == null) {
+            return null;
+        }
+        return (RemoteInputView) v.findViewWithTag(RemoteInputView.VIEW_TAG);
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/EventInfo.java b/slices/view/src/main/java/androidx/app/slice/widget/EventInfo.java
new file mode 100644
index 0000000..d45a34d
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/EventInfo.java
@@ -0,0 +1,268 @@
+/*
+ * 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.app.slice.widget;
+
+import android.support.annotation.IntDef;
+import android.support.annotation.RestrictTo;
+
+/**
+ * Represents information associated with a logged event on {@link SliceView}.
+ */
+public class EventInfo {
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @IntDef({
+            ROW_TYPE_SHORTCUT, ROW_TYPE_LIST, ROW_TYPE_GRID, ROW_TYPE_MESSAGING
+    })
+    public @interface SliceRowType {}
+
+    /**
+     * Indicates the slice is represented as a shortcut.
+     */
+    public static final int ROW_TYPE_SHORTCUT = -1;
+    /**
+     * Indicates the row is represented in a list template.
+     */
+    public static final int ROW_TYPE_LIST = 0;
+    /**
+     * Indicates the row is represented in a grid template.
+     */
+    public static final int ROW_TYPE_GRID = 1;
+    /**
+     * Indicates the row is represented as a messaging template.
+     */
+    public static final int ROW_TYPE_MESSAGING = 2;
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @IntDef({
+            ACTION_TYPE_TOGGLE, ACTION_TYPE_BUTTON, ACTION_TYPE_SLIDER, ACTION_TYPE_CONTENT
+    })
+    public @interface SliceActionType{}
+
+    /**
+     * Indicates the event was an interaction with a toggle. Check {@link EventInfo#state} to
+     * see the new state of the toggle.
+     */
+    public static final int ACTION_TYPE_TOGGLE = 0;
+    /**
+     * Indicates the event was an interaction with a button. Check {@link EventInfo#actionPosition}
+     * to see where on the card the button is placed.
+     */
+    public static final int ACTION_TYPE_BUTTON = 1;
+    /**
+     * Indicates the event was an interaction with a slider. Check {@link EventInfo#state} to
+     * see the new state of the slider.
+     */
+    public static final int ACTION_TYPE_SLIDER = 2;
+    /**
+     * Indicates the event was a tap on the entire row.
+     */
+    public static final int ACTION_TYPE_CONTENT = 3;
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @IntDef({
+            POSITION_START, POSITION_END, POSITION_CELL
+    })
+    public @interface SliceButtonPosition{}
+
+    /**
+     * Indicates the event was an interaction with a button positioned at the start of the row.
+     */
+    public static final int POSITION_START = 0;
+    /**
+     * Indicates the event was an interaction with a button positioned at the end of the row,
+     * potentially grouped with other buttons.
+     */
+    public static final int POSITION_END = 1;
+    /**
+     * Indicates the event was an interaction with a button positioned in a grid cell.
+     */
+    public static final int POSITION_CELL = 2;
+
+    /**
+     * Indicates the state of a toggle is off.
+     */
+    public static final int STATE_OFF = 0;
+    /**
+     * Indicates the state of a toggle is on.
+     */
+    public static final int STATE_ON = 1;
+
+    /**
+     * The display mode of the slice being interacted with.
+     */
+    public @SliceView.SliceMode int sliceMode;
+    /**
+     * The type of action that occurred.
+     */
+    public @SliceActionType int actionType;
+    /**
+     * The template type of the row that was interacted with in the slice.
+     */
+    public @SliceRowType int rowTemplateType;
+    /**
+     * Index of the row that was interacted with in the slice.
+     */
+    public int rowIndex;
+    /**
+     * If multiple buttons are presented in this {@link #actionPosition} on the row, then this is
+     * the index of that button that was interacted with. For total number of actions
+     * see {@link #actionCount}.
+     *
+     * <p>If the {@link #actionPosition} is {@link #POSITION_CELL} the button is a cell within
+     * a grid, and this index would represent the cell position.</p>
+     * <p>If the {@link #actionPosition} is {@link #POSITION_END} there might be other buttons
+     * in the end position, and this index would represent the position.</p>
+     */
+    public int actionIndex;
+    /**
+     * Total number of actions available in this row of the slice.
+     *
+     * <p>If the {@link #actionPosition} is {@link #POSITION_CELL} the button is a cell within
+     * a grid row, and this is the number of cells in the row.</p>
+     * <p>If the {@link #actionPosition} is {@link #POSITION_END} this is the number of buttons
+     * in the end position of this row.</p>
+     */
+    public int actionCount;
+    /**
+     * Position of the button on the template.
+     *
+     * {@link #POSITION_START}
+     * {@link #POSITION_END}
+     * {@link #POSITION_CELL}
+     */
+    public @SliceButtonPosition int actionPosition;
+    /**
+     * Represents the state after the event or -1 if not applicable for the event type.
+     *
+     * <p>For {@link #ACTION_TYPE_TOGGLE} events, the state will be either {@link #STATE_OFF}
+     * or {@link #STATE_ON}.</p>
+     * <p>For {@link #ACTION_TYPE_SLIDER} events, the state will be a number representing
+     * the new position of the slider.</p>
+     */
+    public int state;
+
+    /**
+     * Constructs an event info object with the required information for an event.
+     *
+     * @param sliceMode The display mode of the slice interacted with.
+     * @param actionType The type of action this event represents.
+     * @param rowTemplateType The template type of the row interacted with.
+     * @param rowIndex The index of the row that was interacted with in the slice.
+     */
+    public EventInfo(@SliceView.SliceMode int sliceMode, @SliceActionType int actionType,
+            @SliceRowType int rowTemplateType, int rowIndex) {
+        this.sliceMode = sliceMode;
+        this.actionType = actionType;
+        this.rowTemplateType = rowTemplateType;
+        this.rowIndex = rowIndex;
+
+        this.actionPosition = -1;
+        this.actionIndex = -1;
+        this.actionCount = -1;
+        this.state = -1;
+    }
+
+    /**
+     * Sets positional information for the event.
+     *
+     * @param actionPosition The position of the button on the template.
+     * @param actionIndex The index of that button that was interacted with.
+     * @param actionCount The number of actions available in this group of buttons on the slice.
+     */
+    public void setPosition(@SliceButtonPosition int actionPosition, int actionIndex,
+            int actionCount) {
+        this.actionPosition = actionPosition;
+        this.actionIndex = actionIndex;
+        this.actionCount = actionCount;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("mode=").append(SliceView.modeToString(sliceMode));
+        sb.append(", actionType=").append(actionToString(actionType));
+        sb.append(", rowTemplateType=").append(rowTypeToString(rowTemplateType));
+        sb.append(", rowIndex=").append(rowIndex);
+        sb.append(", actionPosition=").append(positionToString(actionPosition));
+        sb.append(", actionIndex=").append(actionIndex);
+        sb.append(", actionCount=").append(actionCount);
+        sb.append(", state=").append(state);
+        return sb.toString();
+    }
+
+    /**
+     * @return String representation of the provided position.
+     */
+    private static String positionToString(@SliceButtonPosition int position) {
+        switch (position) {
+            case POSITION_START:
+                return "START";
+            case POSITION_END:
+                return "END";
+            case POSITION_CELL:
+                return "CELL";
+            default:
+                return "unknown position: " + position;
+        }
+    }
+
+    /**
+     * @return String representation of the provided action.
+     */
+    private static String actionToString(@SliceActionType int action) {
+        switch (action) {
+            case ACTION_TYPE_TOGGLE:
+                return "TOGGLE";
+            case ACTION_TYPE_BUTTON:
+                return "BUTTON";
+            case ACTION_TYPE_SLIDER:
+                return "SLIDER";
+            case ACTION_TYPE_CONTENT:
+                return "CONTENT";
+            default:
+                return "unknown action: " + action;
+        }
+    }
+
+    /**
+     * @return String representation of the provided row template type.
+     */
+    private static String rowTypeToString(@SliceRowType int type) {
+        switch (type) {
+            case ROW_TYPE_LIST:
+                return "LIST";
+            case ROW_TYPE_GRID:
+                return "GRID";
+            case ROW_TYPE_MESSAGING:
+                return "MESSAGING";
+            case ROW_TYPE_SHORTCUT:
+                return "SHORTCUT";
+            default:
+                return "unknown row type: " + type;
+        }
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/GridContent.java b/slices/view/src/main/java/androidx/app/slice/widget/GridContent.java
new file mode 100644
index 0000000..9569dc0
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/GridContent.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.widget;
+
+import static android.app.slice.Slice.SUBTYPE_COLOR;
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_INT;
+import static android.app.slice.SliceItem.FORMAT_SLICE;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+import static android.app.slice.SliceItem.FORMAT_TIMESTAMP;
+
+import android.support.annotation.RestrictTo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.app.slice.SliceItem;
+import androidx.app.slice.core.SliceQuery;
+
+/**
+ * Extracts information required to present content in a grid format from a slice.
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class GridContent {
+
+    private boolean mAllImages;
+    public SliceItem mColorItem;
+    public ArrayList<CellContent> mGridContent = new ArrayList<>();
+
+    public GridContent(SliceItem gridItem) {
+        populate(gridItem);
+    }
+
+    private void reset() {
+        mColorItem = null;
+        mGridContent.clear();
+    }
+
+    /**
+     * @return whether this grid has content that is valid to display.
+     */
+    public boolean populate(SliceItem gridItem) {
+        reset();
+        mColorItem = SliceQuery.findSubtype(gridItem, FORMAT_INT, SUBTYPE_COLOR);
+        mAllImages = true;
+        if (FORMAT_SLICE.equals(gridItem.getFormat())) {
+            List<SliceItem> items = gridItem.getSlice().getItems();
+            // Check if it it's only one item that is a slice
+            if (items.size() == 1 && items.get(0).getFormat().equals(FORMAT_SLICE)) {
+                items = items.get(0).getSlice().getItems();
+            }
+            for (int i = 0; i < items.size(); i++) {
+                SliceItem item = items.get(i);
+                CellContent cc = new CellContent(item);
+                if (cc.isValid()) {
+                    mGridContent.add(cc);
+                    if (!cc.isImageOnly()) {
+                        mAllImages = false;
+                    }
+                }
+            }
+        } else {
+            CellContent cc = new CellContent(gridItem);
+            if (cc.isValid()) {
+                mGridContent.add(cc);
+            }
+        }
+        return isValid();
+    }
+
+    /**
+     * @return the list of cell content for this grid.
+     */
+    public ArrayList<CellContent> getGridContent() {
+        return mGridContent;
+    }
+
+    /**
+     * @return the color to tint content in this grid.
+     */
+    public SliceItem getColorItem() {
+        return mColorItem;
+    }
+
+    /**
+     * @return whether this grid has content that is valid to display.
+     */
+    public boolean isValid() {
+        return mGridContent.size() > 0;
+    }
+
+    /**
+     * @return whether the contents of this grid is just images.
+     */
+    public boolean isAllImages() {
+        return mAllImages;
+    }
+
+    /**
+     * Extracts information required to present content in a cell.
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public static class CellContent {
+        private SliceItem mContentIntent;
+        private ArrayList<SliceItem> mCellItems = new ArrayList<>();
+
+        public CellContent(SliceItem cellItem) {
+            populate(cellItem);
+        }
+
+        /**
+         * @return whether this row has content that is valid to display.
+         */
+        public boolean populate(SliceItem cellItem) {
+            final String format = cellItem.getFormat();
+            if (FORMAT_SLICE.equals(format) || FORMAT_ACTION.equals(format)) {
+                List<SliceItem> items = cellItem.getSlice().getItems();
+                // If we've only got one item that's a slice / action use those items instead
+                if (items.size() == 1 && (FORMAT_ACTION.equals(items.get(0).getFormat())
+                        || FORMAT_SLICE.equals(items.get(0).getFormat()))) {
+                    mContentIntent = items.get(0);
+                    items = items.get(0).getSlice().getItems();
+                }
+                if (FORMAT_ACTION.equals(format)) {
+                    mContentIntent = cellItem;
+                }
+                int textCount = 0;
+                int imageCount = 0;
+                for (int i = 0; i < items.size(); i++) {
+                    final SliceItem item = items.get(i);
+                    final String itemFormat = item.getFormat();
+                    if (textCount < 2 && (FORMAT_TEXT.equals(itemFormat)
+                            || FORMAT_TIMESTAMP.equals(itemFormat))) {
+                        textCount++;
+                        mCellItems.add(item);
+                    } else if (imageCount < 1 && FORMAT_IMAGE.equals(item.getFormat())) {
+                        imageCount++;
+                        mCellItems.add(item);
+                    }
+                }
+            } else if (isValidCellContent(cellItem)) {
+                mCellItems.add(cellItem);
+            }
+            return isValid();
+        }
+
+        /**
+         * @return the action to activate when this cell is tapped.
+         */
+        public SliceItem getContentIntent() {
+            return mContentIntent;
+        }
+
+        /**
+         * @return the slice items to display in this cell.
+         */
+        public ArrayList<SliceItem> getCellItems() {
+            return mCellItems;
+        }
+
+        /**
+         * @return whether this is content that is valid to show in a grid cell.
+         */
+        private boolean isValidCellContent(SliceItem cellItem) {
+            final String format = cellItem.getFormat();
+            return FORMAT_TEXT.equals(format)
+                    || FORMAT_TIMESTAMP.equals(format)
+                    || FORMAT_IMAGE.equals(format);
+        }
+
+        /**
+         * @return whether this grid has content that is valid to display.
+         */
+        public boolean isValid() {
+            return mCellItems.size() > 0 && mCellItems.size() <= 3;
+        }
+
+        /**
+         * @return whether this cell contains just an image.
+         */
+        public boolean isImageOnly() {
+            return mCellItems.size() == 1 && FORMAT_IMAGE.equals(mCellItems.get(0).getFormat());
+        }
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java b/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java
new file mode 100644
index 0000000..a5959d3
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java
@@ -0,0 +1,344 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.widget;
+
+import static android.app.slice.Slice.HINT_LARGE;
+import static android.app.slice.Slice.HINT_NO_TINT;
+import static android.app.slice.Slice.HINT_TITLE;
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+import static android.app.slice.SliceItem.FORMAT_TIMESTAMP;
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+
+import android.annotation.TargetApi;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.support.annotation.ColorInt;
+import android.support.annotation.RestrictTo;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.Pair;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.ImageView.ScaleType;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceItem;
+import androidx.app.slice.core.SliceQuery;
+import androidx.app.slice.view.R;
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@TargetApi(24)
+public class GridRowView extends SliceChildView implements View.OnClickListener {
+
+    private static final String TAG = "GridView";
+
+    // TODO -- Should add notion to the builder so that apps could define the "see more" intent
+    private static final boolean ALLOW_SEE_MORE = false;
+
+    private static final int TITLE_TEXT_LAYOUT = R.layout.abc_slice_title;
+    private static final int TEXT_LAYOUT = R.layout.abc_slice_secondary_text;
+    // Max number of *just* images that can be shown in a row
+    private static final int MAX_IMAGES = 3;
+    // Max number of normal cell items that can be shown in a row
+    private static final int MAX_ALL = 5;
+
+    // Max number of text items that can show in a cell
+    private static final int MAX_CELL_TEXT = 2;
+    // Max number of text items that can show in a cell if the mode is small
+    private static final int MAX_CELL_TEXT_SMALL = 1;
+    // Max number of images that can show in a cell
+    private static final int MAX_CELL_IMAGES = 1;
+
+    private int mRowIndex;
+    private boolean mIsAllImages;
+    private @SliceView.SliceMode int mSliceMode = 0;
+
+    private int mIconSize;
+    private int mLargeIconSize;
+    private int mBigPictureHeight;
+    private int mAllImagesHeight;
+    private GridContent mGridContent;
+    private LinearLayout mViewContainer;
+
+    public GridRowView(Context context) {
+        this(context, null);
+    }
+
+    public GridRowView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        final Resources res = getContext().getResources();
+        mIconSize = res.getDimensionPixelSize(R.dimen.abc_slice_icon_size);
+        mLargeIconSize = res.getDimensionPixelSize(R.dimen.abc_slice_large_icon_size);
+        mBigPictureHeight = res.getDimensionPixelSize(R.dimen.abc_slice_grid_big_picture_height);
+        mAllImagesHeight = res.getDimensionPixelSize(R.dimen.abc_slice_grid_image_only_height);
+        mViewContainer = new LinearLayout(getContext());
+        mViewContainer.setOrientation(LinearLayout.HORIZONTAL);
+        addView(mViewContainer, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        if (mIsAllImages) {
+            int count = getChildCount();
+            int height = (count == 1) ? mBigPictureHeight : mAllImagesHeight;
+            heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
+            getLayoutParams().height = height;
+            for (int i = 0; i < count; i++) {
+                getChildAt(i).getLayoutParams().height = height;
+            }
+        }
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    }
+
+    @Override
+    public int getMode() {
+        return mSliceMode;
+    }
+
+    @Override
+    public void setTint(@ColorInt int tintColor) {
+        super.setTint(tintColor);
+        if (mGridContent != null) {
+            // TODO -- could be smarter about this
+            resetView();
+            populateViews(mGridContent);
+        }
+    }
+
+    /**
+     * This is called when GridView is being used as a small template.
+     */
+    @Override
+    public void setSlice(Slice slice) {
+        resetView();
+        mRowIndex = 0;
+        mSliceMode = SliceView.MODE_SMALL;
+        Slice.Builder sb = new Slice.Builder(slice.getUri());
+        sb.addSubSlice(slice);
+        Slice parentSlice = sb.build();
+        mGridContent = new GridContent(parentSlice.getItems().get(0));
+        populateViews(mGridContent);
+    }
+
+    /**
+     * This is called when GridView is being used as a component in a large template.
+     */
+    @Override
+    public void setSliceItem(SliceItem slice, boolean isHeader, int index,
+            SliceView.OnSliceActionListener observer) {
+        resetView();
+        setSliceActionListener(observer);
+        mRowIndex = index;
+        mSliceMode = SliceView.MODE_LARGE;
+        mGridContent = new GridContent(slice);
+        populateViews(mGridContent);
+    }
+
+    private void populateViews(GridContent gc) {
+        mIsAllImages = gc.isAllImages();
+        ArrayList<GridContent.CellContent> cells = gc.getGridContent();
+        final int max = mIsAllImages ? MAX_IMAGES : MAX_ALL;
+        for (int i = 0; i < cells.size(); i++) {
+            if (isFull()) {
+                break;
+            }
+            addCell(cells.get(i), i, Math.min(cells.size(), max));
+        }
+        if (ALLOW_SEE_MORE && mIsAllImages && cells.size() > getChildCount()) {
+            addSeeMoreCount(cells.size() - getChildCount());
+        }
+    }
+
+    private void addSeeMoreCount(int numExtra) {
+        View last = getChildAt(getChildCount() - 1);
+        FrameLayout frame = new FrameLayout(getContext());
+        frame.setLayoutParams(last.getLayoutParams());
+
+        removeView(last);
+        frame.addView(last, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
+
+        TextView v = new TextView(getContext());
+        v.setTextColor(Color.WHITE);
+        v.setBackgroundColor(0x4d000000);
+        v.setText(getResources().getString(R.string.abc_slice_more_content, numExtra));
+        v.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);
+        v.setGravity(Gravity.CENTER);
+        frame.addView(v, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
+
+        mViewContainer.addView(frame);
+    }
+
+    private boolean isFull() {
+        return getChildCount() >= (mIsAllImages ? MAX_IMAGES : MAX_ALL);
+    }
+
+    /**
+     * Adds a cell to the grid view based on the provided {@link SliceItem}.
+     */
+    private void addCell(GridContent.CellContent cell, int index, int total) {
+        final int maxCellText = mSliceMode == SliceView.MODE_SMALL
+                ? MAX_CELL_TEXT_SMALL
+                : MAX_CELL_TEXT;
+        LinearLayout cellContainer = new LinearLayout(getContext());
+        cellContainer.setOrientation(LinearLayout.VERTICAL);
+        cellContainer.setGravity(Gravity.CENTER_HORIZONTAL);
+
+        ArrayList<SliceItem> cellItems = cell.getCellItems();
+        SliceItem contentIntentItem = cell.getContentIntent();
+
+        int textCount = 0;
+        int imageCount = 0;
+        boolean added = false;
+        boolean singleItem = cellItems.size() == 1;
+        List<SliceItem> textItems = null;
+        // In small format we display one text item and prefer titles
+        if (!singleItem && mSliceMode == SliceView.MODE_SMALL) {
+            // Get all our text items
+            textItems = cellItems.stream().filter(new Predicate<SliceItem>() {
+                @Override
+                public boolean test(SliceItem s) {
+                    return FORMAT_TEXT.equals(s.getFormat());
+                }
+            }).collect(Collectors.<SliceItem>toList());
+            // If we have more than 1 remove non-titles
+            Iterator<SliceItem> iterator = textItems.iterator();
+            while (textItems.size() > 1) {
+                SliceItem item = iterator.next();
+                if (!item.hasHint(HINT_TITLE)) {
+                    iterator.remove();
+                }
+            }
+        }
+        for (int i = 0; i < cellItems.size(); i++) {
+            SliceItem item = cellItems.get(i);
+            final String itemFormat = item.getFormat();
+            if (textCount < maxCellText && (FORMAT_TEXT.equals(itemFormat)
+                    || FORMAT_TIMESTAMP.equals(itemFormat))) {
+                if (textItems != null && !textItems.contains(item)) {
+                    continue;
+                }
+                if (addItem(item, mTintColor, cellContainer, singleItem)) {
+                    textCount++;
+                    added = true;
+                }
+            } else if (imageCount < MAX_CELL_IMAGES && FORMAT_IMAGE.equals(item.getFormat())) {
+                if (addItem(item, mTintColor, cellContainer, singleItem)) {
+                    imageCount++;
+                    added = true;
+                }
+            }
+        }
+        if (added) {
+            mViewContainer.addView(cellContainer,
+                    new LinearLayout.LayoutParams(0, WRAP_CONTENT, 1));
+            if (contentIntentItem != null) {
+                EventInfo info = new EventInfo(getMode(), EventInfo.ACTION_TYPE_BUTTON,
+                        EventInfo.ROW_TYPE_GRID, mRowIndex);
+                info.setPosition(EventInfo.POSITION_CELL, index, total);
+                Pair<SliceItem, EventInfo> tagItem = new Pair(contentIntentItem, info);
+                cellContainer.setTag(tagItem);
+                makeClickable(cellContainer);
+            }
+        }
+    }
+
+    /**
+     * Adds simple items to a container. Simple items include icons, text, and timestamps.
+     * @return Whether an item was added.
+     */
+    private boolean addItem(SliceItem item, int color, ViewGroup container, boolean singleItem) {
+        final String format = item.getFormat();
+        View addedView = null;
+        if (FORMAT_TEXT.equals(format) || FORMAT_TIMESTAMP.equals(format)) {
+            boolean title = SliceQuery.hasAnyHints(item, HINT_LARGE, HINT_TITLE);
+            TextView tv = (TextView) LayoutInflater.from(getContext()).inflate(title
+                    ? TITLE_TEXT_LAYOUT : TEXT_LAYOUT, null);
+            tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, title ? mTitleSize : mSubtitleSize);
+            tv.setTextColor(title ? mTitleColor : mSubtitleColor);
+            CharSequence text = FORMAT_TIMESTAMP.equals(format)
+                    ? SliceViewUtil.getRelativeTimeString(item.getTimestamp())
+                    : item.getText();
+            tv.setText(text);
+            container.addView(tv);
+            addedView = tv;
+        } else if (FORMAT_IMAGE.equals(format)) {
+            ImageView iv = new ImageView(getContext());
+            iv.setImageIcon(item.getIcon());
+            if (color != -1 && !item.hasHint(HINT_NO_TINT) && !item.hasHint(HINT_LARGE)) {
+                iv.setColorFilter(color);
+            }
+            int size = mIconSize;
+            if (item.hasHint(HINT_LARGE)) {
+                iv.setScaleType(ScaleType.CENTER_CROP);
+                size = singleItem ? MATCH_PARENT : mLargeIconSize;
+            }
+            container.addView(iv, new LayoutParams(size, size));
+            addedView = iv;
+        }
+        return addedView != null;
+    }
+
+    private void makeClickable(View layout) {
+        layout.setOnClickListener(this);
+        layout.setBackground(SliceViewUtil.getDrawable(getContext(),
+                android.R.attr.selectableItemBackground));
+    }
+
+    @Override
+    public void onClick(View view) {
+        Pair<SliceItem, EventInfo> tagItem = (Pair<SliceItem, EventInfo>) view.getTag();
+        final SliceItem actionItem = tagItem.first;
+        final EventInfo info = tagItem.second;
+        if (actionItem != null && FORMAT_ACTION.equals(actionItem.getFormat())) {
+            try {
+                actionItem.getAction().send();
+                if (mObserver != null) {
+                    mObserver.onSliceAction(info, actionItem);
+                }
+            } catch (PendingIntent.CanceledException e) {
+                Log.w(TAG, "PendingIntent for slice cannot be sent", e);
+            }
+        }
+    }
+
+    @Override
+    public void resetView() {
+        mIsAllImages = true;
+        mViewContainer.removeAllViews();
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/LargeSliceAdapter.java b/slices/view/src/main/java/androidx/app/slice/widget/LargeSliceAdapter.java
new file mode 100644
index 0000000..45f659d
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/LargeSliceAdapter.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.widget;
+
+import static android.app.slice.Slice.HINT_HORIZONTAL;
+import static android.app.slice.Slice.SUBTYPE_MESSAGE;
+import static android.app.slice.Slice.SUBTYPE_SOURCE;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_INT;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+
+import android.annotation.TargetApi;
+import android.app.slice.Slice;
+import android.content.Context;
+import android.support.annotation.RestrictTo;
+import android.support.v7.widget.RecyclerView;
+import android.util.ArrayMap;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import androidx.app.slice.SliceItem;
+import androidx.app.slice.core.SliceQuery;
+import androidx.app.slice.view.R;
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@TargetApi(24)
+public class LargeSliceAdapter extends RecyclerView.Adapter<LargeSliceAdapter.SliceViewHolder> {
+
+    static final int TYPE_DEFAULT       = 1;
+    static final int TYPE_HEADER        = 2; // TODO: headers shouldn't scroll off
+    static final int TYPE_GRID          = 3;
+    static final int TYPE_MESSAGE       = 4;
+    static final int TYPE_MESSAGE_LOCAL = 5;
+
+    private final IdGenerator mIdGen = new IdGenerator();
+    private final Context mContext;
+    private List<SliceWrapper> mSlices = new ArrayList<>();
+
+    private SliceView.OnSliceActionListener mSliceObserver;
+    private int mColor;
+    private AttributeSet mAttrs;
+
+    public LargeSliceAdapter(Context context) {
+        mContext = context;
+        setHasStableIds(true);
+    }
+
+    public void setSliceObserver(SliceView.OnSliceActionListener observer) {
+        mSliceObserver = observer;
+    }
+
+    /**
+     * Set the {@link SliceItem}'s to be displayed in the adapter and the accent color.
+     */
+    public void setSliceItems(List<SliceItem> slices, int color) {
+        if (slices == null) {
+            mSlices.clear();
+        } else {
+            mIdGen.resetUsage();
+            mSlices = slices.stream().map(new Function<SliceItem, SliceWrapper>() {
+                @Override
+                public SliceWrapper apply(SliceItem s) {
+                    return new SliceWrapper(s, mIdGen);
+                }
+            }).collect(Collectors.<SliceWrapper>toList());
+        }
+        mColor = color;
+        notifyDataSetChanged();
+    }
+
+    /**
+     * Sets the attribute set to use for views in the list.
+     */
+    public void setStyle(AttributeSet attrs) {
+        mAttrs = attrs;
+        notifyDataSetChanged();
+    }
+
+    @Override
+    public SliceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        View v = inflateForType(viewType);
+        v.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+        return new SliceViewHolder(v);
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        return mSlices.get(position).mType;
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return mSlices.get(position).mId;
+    }
+
+    @Override
+    public int getItemCount() {
+        return mSlices.size();
+    }
+
+    @Override
+    public void onBindViewHolder(SliceViewHolder holder, int position) {
+        SliceWrapper slice = mSlices.get(position);
+        if (holder.mSliceView != null) {
+            holder.mSliceView.setTint(mColor);
+            holder.mSliceView.setStyle(mAttrs);
+            holder.mSliceView.setSliceItem(slice.mItem, position == 0 /* isHeader */,
+                    position, mSliceObserver);
+        }
+    }
+
+    private View inflateForType(int viewType) {
+        switch (viewType) {
+            case TYPE_GRID:
+                return LayoutInflater.from(mContext).inflate(R.layout.abc_slice_grid, null);
+            case TYPE_MESSAGE:
+                return LayoutInflater.from(mContext).inflate(R.layout.abc_slice_message, null);
+            case TYPE_MESSAGE_LOCAL:
+                return LayoutInflater.from(mContext).inflate(R.layout.abc_slice_message_local,
+                        null);
+        }
+        return new RowView(mContext);
+    }
+
+    protected static class SliceWrapper {
+        private final SliceItem mItem;
+        private final int mType;
+        private final long mId;
+
+        public SliceWrapper(SliceItem item, IdGenerator idGen) {
+            mItem = item;
+            mType = getFormat(item);
+            mId = idGen.getId(item);
+        }
+
+        public static int getFormat(SliceItem item) {
+            if (SUBTYPE_MESSAGE.equals(item.getSubType())) {
+                // TODO: Better way to determine me or not? Something more like Messaging style.
+                if (SliceQuery.findSubtype(item, null, SUBTYPE_SOURCE) != null) {
+                    return TYPE_MESSAGE;
+                } else {
+                    return TYPE_MESSAGE_LOCAL;
+                }
+            }
+            if (item.hasHint(HINT_HORIZONTAL)) {
+                return TYPE_GRID;
+            }
+            if (!item.hasHint(Slice.HINT_LIST_ITEM)) {
+                return TYPE_HEADER;
+            }
+            return TYPE_DEFAULT;
+        }
+    }
+
+    /**
+     * A {@link RecyclerView.ViewHolder} for presenting slices in {@link LargeSliceAdapter}.
+     */
+    public static class SliceViewHolder extends RecyclerView.ViewHolder {
+        public final SliceChildView mSliceView;
+
+        public SliceViewHolder(View itemView) {
+            super(itemView);
+            mSliceView = itemView instanceof SliceChildView ? (SliceChildView) itemView : null;
+        }
+    }
+
+    private static class IdGenerator {
+        private long mNextLong = 0;
+        private final ArrayMap<String, Long> mCurrentIds = new ArrayMap<>();
+        private final ArrayMap<String, Integer> mUsedIds = new ArrayMap<>();
+
+        public long getId(SliceItem item) {
+            String str = genString(item);
+            if (!mCurrentIds.containsKey(str)) {
+                mCurrentIds.put(str, mNextLong++);
+            }
+            long id = mCurrentIds.get(str);
+            int index = mUsedIds.getOrDefault(str, 0);
+            mUsedIds.put(str, index + 1);
+            return id + index * 10000;
+        }
+
+        private String genString(SliceItem item) {
+            final StringBuilder builder = new StringBuilder();
+            SliceQuery.stream(item).forEach(new Consumer<SliceItem>() {
+                @Override
+                public void accept(SliceItem i) {
+                    builder.append(i.getFormat());
+                    //i.removeHint(Slice.HINT_SELECTED);
+                    builder.append(i.getHints());
+                    switch (i.getFormat()) {
+                        case FORMAT_IMAGE:
+                            builder.append(i.getIcon());
+                            break;
+                        case FORMAT_TEXT:
+                            builder.append(i.getText());
+                            break;
+                        case FORMAT_INT:
+                            builder.append(i.getInt());
+                            break;
+                    }
+                }
+            });
+            return builder.toString();
+        }
+
+        public void resetUsage() {
+            mUsedIds.clear();
+        }
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/LargeTemplateView.java b/slices/view/src/main/java/androidx/app/slice/widget/LargeTemplateView.java
new file mode 100644
index 0000000..d015893
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/LargeTemplateView.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.widget;
+
+import static android.app.slice.Slice.HINT_PARTIAL;
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.support.annotation.RestrictTo;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.AttributeSet;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.core.SliceQuery;
+import androidx.app.slice.view.R;
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@TargetApi(24)
+public class LargeTemplateView extends SliceChildView {
+
+    private final LargeSliceAdapter mAdapter;
+    private final RecyclerView mRecyclerView;
+    private final int mDefaultHeight;
+    private Slice mSlice;
+    private boolean mIsScrollable;
+
+    public LargeTemplateView(Context context) {
+        super(context);
+        mRecyclerView = new RecyclerView(getContext());
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+        mAdapter = new LargeSliceAdapter(context);
+        mRecyclerView.setAdapter(mAdapter);
+        addView(mRecyclerView);
+        mDefaultHeight = getResources().getDimensionPixelSize(R.dimen.abc_slice_large_height);
+    }
+
+    @Override
+    public void setTint(int tint) {
+        super.setTint(tint);
+        populate();
+    }
+
+    @Override
+    public @SliceView.SliceMode int getMode() {
+        return SliceView.MODE_LARGE;
+    }
+
+    @Override
+    public void setSliceActionListener(SliceView.OnSliceActionListener observer) {
+        mObserver = observer;
+        if (mAdapter != null) {
+            mAdapter.setSliceObserver(mObserver);
+        }
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        mRecyclerView.getLayoutParams().height = WRAP_CONTENT;
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        int width = MeasureSpec.getSize(widthMeasureSpec);
+        if (mRecyclerView.getMeasuredHeight() > width
+                || (mSlice != null && SliceQuery.hasHints(mSlice, HINT_PARTIAL))) {
+            mRecyclerView.getLayoutParams().height = width;
+        } else {
+            mRecyclerView.getLayoutParams().height = mRecyclerView.getMeasuredHeight();
+        }
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    }
+
+    @Override
+    public void setSlice(Slice slice) {
+        mSlice = slice;
+        populate();
+    }
+
+    @Override
+    public void setStyle(AttributeSet attrs) {
+        super.setStyle(attrs);
+        mAdapter.setStyle(attrs);
+    }
+
+    private void populate() {
+        if (mSlice == null) {
+            return;
+        }
+        ListContent lc = new ListContent(mSlice);
+        mAdapter.setSliceItems(lc.getRowItems(), mTintColor);
+    }
+
+    /**
+     * Whether or not the content in this template should be scrollable.
+     */
+    public void setScrollable(boolean isScrollable) {
+        // TODO -- restrict / enable how much this view can show
+        mIsScrollable = isScrollable;
+    }
+
+    @Override
+    public void resetView() {
+        mSlice = null;
+        mAdapter.setSliceItems(null, -1);
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/ListContent.java b/slices/view/src/main/java/androidx/app/slice/widget/ListContent.java
new file mode 100644
index 0000000..d74230c
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/ListContent.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.widget;
+
+import static android.app.slice.Slice.HINT_ACTIONS;
+import static android.app.slice.Slice.HINT_LIST_ITEM;
+import static android.app.slice.Slice.SUBTYPE_COLOR;
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_INT;
+import static android.app.slice.SliceItem.FORMAT_SLICE;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceItem;
+import androidx.app.slice.core.SliceQuery;
+
+/**
+ * Extracts information required to present content in a list format from a slice.
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class ListContent {
+
+    private SliceItem mHeaderItem;
+    private SliceItem mColorItem;
+    private ArrayList<SliceItem> mRowItems = new ArrayList<>();
+    private List<SliceItem> mSliceActions;
+
+    public ListContent(Slice slice) {
+        populate(slice);
+    }
+
+    /**
+     * Resets the content.
+     */
+    public void reset() {
+        mColorItem = null;
+        mHeaderItem = null;
+        mRowItems.clear();
+    }
+
+    /**
+     * @return whether this row has content that is valid to display.
+     */
+    public boolean populate(Slice slice) {
+        reset();
+        mColorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
+        // Find slice actions
+        SliceItem actionGroup = SliceQuery.find(slice, FORMAT_SLICE, HINT_ACTIONS, null);
+        if (actionGroup != null) {
+            // TODO: actually use the actions
+            mSliceActions = SliceQuery.findAll(actionGroup, FORMAT_ACTION, HINT_ACTIONS, null);
+        }
+        // Find header
+        mHeaderItem = findHeaderItem(slice);
+        if (mHeaderItem != null) {
+            mRowItems.add(mHeaderItem);
+        }
+        // Filter + create row items
+        List<SliceItem> children = slice.getItems();
+        for (int i = 0; i < children.size(); i++) {
+            final SliceItem child = children.get(i);
+            final String format = child.getFormat();
+            if (!child.hasAnyHints(HINT_ACTIONS)
+                    && (FORMAT_ACTION.equals(format) || FORMAT_SLICE.equals(format))) {
+                if (mHeaderItem == null && !child.hasHint(HINT_LIST_ITEM)) {
+                    mHeaderItem = child;
+                    mRowItems.add(0, child);
+                } else if (child.hasHint(HINT_LIST_ITEM)) {
+                    mRowItems.add(child);
+                }
+            }
+        }
+        // Ensure we have something for the header -- use first row
+        if (mHeaderItem == null && mRowItems.size() >= 1) {
+            mHeaderItem = mRowItems.get(0);
+        }
+        return isValid();
+    }
+
+    /**
+     * @return whether this list has content that is valid to display.
+     */
+    public boolean isValid() {
+        return mRowItems.size() > 0;
+    }
+
+    @Nullable
+    public SliceItem getColorItem() {
+        return mColorItem;
+    }
+
+    @Nullable
+    public SliceItem getHeaderItem() {
+        return mHeaderItem;
+    }
+
+    @Nullable
+    public List<SliceItem> getSliceActions() {
+        return mSliceActions;
+    }
+
+    public ArrayList<SliceItem> getRowItems() {
+        return mRowItems;
+    }
+
+    /**
+     * @return whether this list has an explicit header (i.e. row item without HINT_LIST_ITEM)
+     */
+    public boolean hasHeader() {
+        return mHeaderItem != null && isValidHeader(mHeaderItem);
+    }
+
+    @Nullable
+    private static SliceItem findHeaderItem(@NonNull Slice slice) {
+        // See if header is specified
+        SliceItem header = SliceQuery.find(slice, FORMAT_SLICE, null, HINT_LIST_ITEM);
+        if (header != null && isValidHeader(header)) {
+            return header;
+        }
+        return null;
+    }
+
+    private static boolean isValidHeader(SliceItem sliceItem) {
+        if (FORMAT_SLICE.equals(sliceItem.getFormat()) && !sliceItem.hasHint(HINT_LIST_ITEM)) {
+             // Minimum valid header is a slice with text
+            SliceItem item = SliceQuery.find(sliceItem, FORMAT_TEXT, (String) null, null);
+            return item != null;
+        }
+        return false;
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/MessageView.java b/slices/view/src/main/java/androidx/app/slice/widget/MessageView.java
new file mode 100644
index 0000000..9c4a705
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/MessageView.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.widget;
+
+import static android.app.slice.Slice.SUBTYPE_SOURCE;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.RestrictTo;
+import android.text.SpannableStringBuilder;
+import android.util.TypedValue;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.function.Consumer;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceItem;
+import androidx.app.slice.core.SliceQuery;
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@TargetApi(24)
+public class MessageView extends SliceChildView {
+
+    private TextView mDetails;
+    private ImageView mIcon;
+
+    private int mRowIndex;
+
+    public MessageView(Context context) {
+        super(context);
+    }
+
+    @Override
+    public int getMode() {
+        return SliceView.MODE_LARGE;
+    }
+
+    @Override
+    public void setSlice(Slice slice) {
+        // Do nothing it's always a list item
+    }
+
+    @Override
+    public void resetView() {
+        // TODO
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        mDetails = findViewById(android.R.id.summary);
+        mIcon = findViewById(android.R.id.icon);
+    }
+
+    @Override
+    public void setSliceItem(SliceItem slice, boolean isHeader, int index,
+            SliceView.OnSliceActionListener observer) {
+        setSliceActionListener(observer);
+        mRowIndex = index;
+        SliceItem source = SliceQuery.findSubtype(slice, FORMAT_IMAGE, SUBTYPE_SOURCE);
+        if (source != null) {
+            final int iconSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+                    24, getContext().getResources().getDisplayMetrics());
+            // TODO: try and turn this into a drawable
+            Bitmap iconBm = Bitmap.createBitmap(iconSize, iconSize, Bitmap.Config.ARGB_8888);
+            Canvas iconCanvas = new Canvas(iconBm);
+            Drawable d = source.getIcon().loadDrawable(getContext());
+            d.setBounds(0, 0, iconSize, iconSize);
+            d.draw(iconCanvas);
+            mIcon.setImageBitmap(SliceViewUtil.getCircularBitmap(iconBm));
+        }
+        final SpannableStringBuilder builder = new SpannableStringBuilder();
+        SliceQuery.findAll(slice, FORMAT_TEXT).forEach(new Consumer<SliceItem>() {
+            @Override
+            public void accept(SliceItem text) {
+                if (builder.length() != 0) {
+                    builder.append('\n');
+                }
+                builder.append(text.getText());
+            }
+        });
+        mDetails.setText(builder.toString());
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/RemoteInputView.java b/slices/view/src/main/java/androidx/app/slice/widget/RemoteInputView.java
new file mode 100644
index 0000000..da35018
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/RemoteInputView.java
@@ -0,0 +1,425 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.widget;
+
+import android.animation.Animator;
+import android.annotation.TargetApi;
+import android.app.PendingIntent;
+import android.app.RemoteInput;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.annotation.RestrictTo;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewAnimationUtils;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.inputmethod.CompletionInfo;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.app.slice.view.R;
+
+/**
+ * Host for the remote input.
+ *
+ * @hide
+ */
+// TODO this should be unified with SystemUI RemoteInputView (b/67527720)
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@TargetApi(23)
+public class RemoteInputView extends LinearLayout implements View.OnClickListener, TextWatcher {
+
+    private static final String TAG = "RemoteInput";
+
+    /**
+     * A marker object that let's us easily find views of this class.
+     */
+    public static final Object VIEW_TAG = new Object();
+
+    private RemoteEditText mEditText;
+    private ImageButton mSendButton;
+    private ProgressBar mProgressBar;
+    private PendingIntent mPendingIntent;
+    private RemoteInput[] mRemoteInputs;
+    private RemoteInput mRemoteInput;
+
+    private int mRevealCx;
+    private int mRevealCy;
+    private int mRevealR;
+    private boolean mResetting;
+
+    public RemoteInputView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+
+        mProgressBar = findViewById(R.id.remote_input_progress);
+        mSendButton = findViewById(R.id.remote_input_send);
+        mSendButton.setOnClickListener(this);
+
+        mEditText = (RemoteEditText) getChildAt(0);
+        mEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+            @Override
+            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+                final boolean isSoftImeEvent = event == null
+                        && (actionId == EditorInfo.IME_ACTION_DONE
+                                || actionId == EditorInfo.IME_ACTION_NEXT
+                                || actionId == EditorInfo.IME_ACTION_SEND);
+                final boolean isKeyboardEnterKey = event != null
+                        && isConfirmKey(event.getKeyCode())
+                        && event.getAction() == KeyEvent.ACTION_DOWN;
+
+                if (isSoftImeEvent || isKeyboardEnterKey) {
+                    if (mEditText.length() > 0) {
+                        sendRemoteInput();
+                    }
+                    // Consume action to prevent IME from closing.
+                    return true;
+                }
+                return false;
+            }
+        });
+        mEditText.addTextChangedListener(this);
+        mEditText.setInnerFocusable(false);
+        mEditText.mRemoteInputView = this;
+    }
+
+    private void sendRemoteInput() {
+        Bundle results = new Bundle();
+        results.putString(mRemoteInput.getResultKey(), mEditText.getText().toString());
+        Intent fillInIntent = new Intent().addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+        RemoteInput.addResultsToIntent(mRemoteInputs, fillInIntent,
+                results);
+
+        mEditText.setEnabled(false);
+        mSendButton.setVisibility(INVISIBLE);
+        mProgressBar.setVisibility(VISIBLE);
+        mEditText.mShowImeOnInputConnection = false;
+
+        // TODO: Figure out API for telling the system about slice interaction.
+        // Tell ShortcutManager that this package has been "activated".  ShortcutManager
+        // will reset the throttling for this package.
+        // Strictly speaking, the intent receiver may be different from the intent creator,
+        // but that's an edge case, and also because we can't always know which package will receive
+        // an intent, so we just reset for the creator.
+        //getContext().getSystemService(ShortcutManager.class).onApplicationActive(
+        //        mPendingIntent.getCreatorPackage(),
+        //        getContext().getUserId());
+
+        try {
+            mPendingIntent.send(getContext(), 0, fillInIntent);
+            reset();
+        } catch (PendingIntent.CanceledException e) {
+            Log.i(TAG, "Unable to send remote input result", e);
+            Toast.makeText(getContext(), "Failure sending pending intent for inline reply :(",
+                    Toast.LENGTH_SHORT).show();
+            reset();
+        }
+    }
+
+    /**
+     * Creates a remote input view.
+     */
+    public static RemoteInputView inflate(Context context, ViewGroup root) {
+        RemoteInputView v = (RemoteInputView) LayoutInflater.from(context).inflate(
+                R.layout.abc_slice_remote_input, root, false);
+        v.setTag(VIEW_TAG);
+        return v;
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v == mSendButton) {
+            sendRemoteInput();
+        }
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        super.onTouchEvent(event);
+
+        // We never want for a touch to escape to an outer view or one we covered.
+        return true;
+    }
+
+    private void onDefocus() {
+        setVisibility(INVISIBLE);
+    }
+
+    /**
+     * Set the pending intent for remote input.
+     */
+    public void setPendingIntent(PendingIntent pendingIntent) {
+        mPendingIntent = pendingIntent;
+    }
+
+    /**
+     * Set the remote inputs for this view.
+     */
+    public void setRemoteInput(RemoteInput[] remoteInputs, RemoteInput remoteInput) {
+        mRemoteInputs = remoteInputs;
+        mRemoteInput = remoteInput;
+        mEditText.setHint(mRemoteInput.getLabel());
+    }
+
+    /**
+     * Focuses the remote input view.
+     */
+    public void focusAnimated() {
+        if (getVisibility() != VISIBLE) {
+            Animator animator = ViewAnimationUtils.createCircularReveal(
+                    this, mRevealCx, mRevealCy, 0, mRevealR);
+            animator.setDuration(200);
+            animator.start();
+        }
+        focus();
+    }
+
+    private void focus() {
+        setVisibility(VISIBLE);
+        mEditText.setInnerFocusable(true);
+        mEditText.mShowImeOnInputConnection = true;
+        mEditText.setSelection(mEditText.getText().length());
+        mEditText.requestFocus();
+        updateSendButton();
+    }
+
+    private void reset() {
+        mResetting = true;
+
+        mEditText.getText().clear();
+        mEditText.setEnabled(true);
+        mSendButton.setVisibility(VISIBLE);
+        mProgressBar.setVisibility(INVISIBLE);
+        updateSendButton();
+        onDefocus();
+
+        mResetting = false;
+    }
+
+    @Override
+    public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
+        if (mResetting && child == mEditText) {
+            // Suppress text events if it happens during resetting. Ideally this would be
+            // suppressed by the text view not being shown, but that doesn't work here because it
+            // needs to stay visible for the animation.
+            return false;
+        }
+        return super.onRequestSendAccessibilityEvent(child, event);
+    }
+
+    private void updateSendButton() {
+        mSendButton.setEnabled(mEditText.getText().length() != 0);
+    }
+
+    @Override
+    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+    }
+
+    @Override
+    public void onTextChanged(CharSequence s, int start, int before, int count) {
+    }
+
+    @Override
+    public void afterTextChanged(Editable s) {
+        updateSendButton();
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public void setRevealParameters(int cx, int cy, int r) {
+        mRevealCx = cx;
+        mRevealCy = cy;
+        mRevealR = r;
+    }
+
+    @Override
+    public void dispatchStartTemporaryDetach() {
+        super.dispatchStartTemporaryDetach();
+        // Detach the EditText temporarily such that it doesn't get onDetachedFromWindow and
+        // won't lose IME focus.
+        detachViewFromParent(mEditText);
+    }
+
+    @Override
+    public void dispatchFinishTemporaryDetach() {
+        if (isAttachedToWindow()) {
+            attachViewToParent(mEditText, 0, mEditText.getLayoutParams());
+        } else {
+            removeDetachedView(mEditText, false /* animate */);
+        }
+        super.dispatchFinishTemporaryDetach();
+    }
+
+    /**
+     * An EditText that changes appearance based on whether it's focusable and becomes un-focusable
+     * whenever the user navigates away from it or it becomes invisible.
+     */
+    public static class RemoteEditText extends EditText {
+
+        private final Drawable mBackground;
+        private RemoteInputView mRemoteInputView;
+        boolean mShowImeOnInputConnection;
+
+        public RemoteEditText(Context context, AttributeSet attrs) {
+            super(context, attrs);
+            mBackground = getBackground();
+        }
+
+        private void defocusIfNeeded(boolean animate) {
+            if (mRemoteInputView != null || isTemporarilyDetached()) {
+                if (isTemporarilyDetached()) {
+                    // We might get reattached but then the other one of HUN / expanded might steal
+                    // our focus, so we'll need to save our text here.
+                }
+                return;
+            }
+            if (isFocusable() && isEnabled()) {
+                setInnerFocusable(false);
+                if (mRemoteInputView != null) {
+                    mRemoteInputView.onDefocus();
+                }
+                mShowImeOnInputConnection = false;
+            }
+        }
+
+        @Override
+        protected void onVisibilityChanged(View changedView, int visibility) {
+            super.onVisibilityChanged(changedView, visibility);
+
+            if (!isShown()) {
+                defocusIfNeeded(false /* animate */);
+            }
+        }
+
+        @Override
+        protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
+            super.onFocusChanged(focused, direction, previouslyFocusedRect);
+            if (!focused) {
+                defocusIfNeeded(true /* animate */);
+            }
+        }
+
+        @Override
+        public void getFocusedRect(Rect r) {
+            super.getFocusedRect(r);
+            r.top = getScrollY();
+            r.bottom = getScrollY() + (getBottom() - getTop());
+        }
+
+        @Override
+        public boolean onKeyDown(int keyCode, KeyEvent event) {
+            if (keyCode == KeyEvent.KEYCODE_BACK) {
+                // Eat the DOWN event here to prevent any default behavior.
+                return true;
+            }
+            return super.onKeyDown(keyCode, event);
+        }
+
+        @Override
+        public boolean onKeyUp(int keyCode, KeyEvent event) {
+            if (keyCode == KeyEvent.KEYCODE_BACK) {
+                defocusIfNeeded(true /* animate */);
+                return true;
+            }
+            return super.onKeyUp(keyCode, event);
+        }
+
+        @Override
+        public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
+            final InputConnection inputConnection = super.onCreateInputConnection(outAttrs);
+
+            if (mShowImeOnInputConnection && inputConnection != null) {
+                final InputMethodManager imm = getContext().getSystemService(
+                        InputMethodManager.class);
+                if (imm != null) {
+                    // onCreateInputConnection is called by InputMethodManager in the middle of
+                    // setting up the connection to the IME; wait with requesting the IME until that
+                    // work has completed.
+                    post(new Runnable() {
+                        @Override
+                        public void run() {
+                            imm.viewClicked(RemoteEditText.this);
+                            imm.showSoftInput(RemoteEditText.this, 0);
+                        }
+                    });
+                }
+            }
+
+            return inputConnection;
+        }
+
+        @Override
+        public void onCommitCompletion(CompletionInfo text) {
+            clearComposingText();
+            setText(text.getText());
+            setSelection(getText().length());
+        }
+
+        void setInnerFocusable(boolean focusable) {
+            setFocusableInTouchMode(focusable);
+            setFocusable(focusable);
+            setCursorVisible(focusable);
+
+            if (focusable) {
+                requestFocus();
+                setBackground(mBackground);
+            } else {
+                setBackground(null);
+            }
+
+        }
+    }
+
+    /** Whether key will, by default, trigger a click on the focused view.
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public static final boolean isConfirmKey(int keyCode) {
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_DPAD_CENTER:
+            case KeyEvent.KEYCODE_ENTER:
+            case KeyEvent.KEYCODE_SPACE:
+            case KeyEvent.KEYCODE_NUMPAD_ENTER:
+                return true;
+            default:
+                return false;
+        }
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/RowContent.java b/slices/view/src/main/java/androidx/app/slice/widget/RowContent.java
new file mode 100644
index 0000000..52c1f02
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/RowContent.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.widget;
+
+import static android.app.slice.Slice.HINT_SUMMARY;
+import static android.app.slice.Slice.HINT_TITLE;
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_INT;
+import static android.app.slice.SliceItem.FORMAT_REMOTE_INPUT;
+import static android.app.slice.SliceItem.FORMAT_SLICE;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+import static android.app.slice.SliceItem.FORMAT_TIMESTAMP;
+
+import static androidx.app.slice.core.SliceHints.SUBTYPE_RANGE;
+
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.app.slice.SliceItem;
+import androidx.app.slice.core.SliceQuery;
+
+/**
+ * Extracts information required to present content in a row format from a slice.
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class RowContent {
+    private static final String TAG = "RowContent";
+
+    private SliceItem mContentIntent;
+    private SliceItem mStartItem;
+    private SliceItem mTitleItem;
+    private SliceItem mSubtitleItem;
+    private SliceItem mSummaryItem;
+    private ArrayList<SliceItem> mEndItems = new ArrayList<>();
+    private boolean mEndItemsContainAction;
+    private SliceItem mRange;
+    private boolean mIsHeader;
+
+    public RowContent(SliceItem rowSlice, boolean isHeader) {
+        populate(rowSlice, isHeader);
+    }
+
+    /**
+     * Resets the content.
+     */
+    public void reset() {
+        mContentIntent = null;
+        mStartItem = null;
+        mTitleItem = null;
+        mSubtitleItem = null;
+        mEndItems.clear();
+        mIsHeader = false;
+    }
+
+    /**
+     * @return whether this row has content that is valid to display.
+     */
+    public boolean populate(SliceItem rowSlice, boolean isHeader) {
+        reset();
+        mIsHeader = isHeader;
+        if (!isValidRow(rowSlice)) {
+            Log.w(TAG, "Provided SliceItem is invalid for RowContent");
+            return false;
+        }
+        // Filter anything not viable for displaying in a row
+        ArrayList<SliceItem> rowItems = filterInvalidItems(rowSlice);
+        // If we've only got one item that's a slice / action use those items instead
+        if (rowItems.size() == 1 && (FORMAT_ACTION.equals(rowItems.get(0).getFormat())
+                || FORMAT_SLICE.equals(rowItems.get(0).getFormat()))) {
+            if (isValidRow(rowItems.get(0))) {
+                rowSlice = rowItems.get(0);
+                rowItems = filterInvalidItems(rowSlice);
+            }
+        }
+        // Content intent
+        if (FORMAT_ACTION.equals(rowSlice.getFormat())) {
+            mContentIntent = rowSlice;
+        }
+        if (SUBTYPE_RANGE.equals(rowSlice.getSubType())) {
+            mRange = rowSlice;
+        }
+        if (rowItems.size() > 0) {
+            // Start item
+            if (isStartType(rowItems.get(0))) {
+                mStartItem = rowItems.get(0);
+                rowItems.remove(0);
+            }
+            // Text + end items
+            ArrayList<SliceItem> endItems = new ArrayList<>();
+            for (int i = 0; i < rowItems.size(); i++) {
+                final SliceItem item = rowItems.get(i);
+                if (FORMAT_TEXT.equals(item.getFormat())) {
+                    if ((mTitleItem == null || !mTitleItem.hasHint(HINT_TITLE))
+                            && item.hasHint(HINT_TITLE) && !item.hasHint(HINT_SUMMARY)) {
+                        mTitleItem = item;
+                    } else if (mSubtitleItem == null && !item.hasHint(HINT_SUMMARY)) {
+                        mSubtitleItem = item;
+                    } else if (mSummaryItem == null && item.hasHint(HINT_SUMMARY)) {
+                        mSummaryItem = item;
+                    }
+                } else {
+                    endItems.add(item);
+                }
+            }
+            // Special rules for end items: only one timestamp, can't be mixture of icons / actions
+            boolean hasTimestamp = mStartItem != null
+                    && FORMAT_TIMESTAMP.equals(mStartItem.getFormat());
+            String desiredFormat = null;
+            for (int i = 0; i < endItems.size(); i++) {
+                final SliceItem item = endItems.get(i);
+                if (FORMAT_TIMESTAMP.equals(item.getFormat())) {
+                    if (!hasTimestamp) {
+                        hasTimestamp = true;
+                        mEndItems.add(item);
+                    }
+                } else if (desiredFormat == null) {
+                    desiredFormat = item.getFormat();
+                    mEndItems.add(item);
+                    mEndItemsContainAction |= FORMAT_ACTION.equals(item.getFormat());
+                } else if (desiredFormat.equals(item.getFormat())) {
+                    mEndItems.add(item);
+                    mEndItemsContainAction |= FORMAT_ACTION.equals(item.getFormat());
+                }
+            }
+        }
+        return isValid();
+    }
+
+    /**
+     * @return the {@link SliceItem} representing the range in the row; can be null.
+     */
+    @Nullable
+    public SliceItem getRange() {
+        return mRange;
+    }
+
+    /**
+     * @return whether this row has content that is valid to display.
+     */
+    public boolean isValid() {
+        return mStartItem != null
+                || mTitleItem != null
+                || mSubtitleItem != null
+                || mEndItems.size() > 0;
+    }
+
+    @Nullable
+    public SliceItem getContentIntent() {
+        return mContentIntent;
+    }
+
+    @Nullable
+    public SliceItem getStartItem() {
+        return mIsHeader ? null : mStartItem;
+    }
+
+    @Nullable
+    public SliceItem getTitleItem() {
+        return mTitleItem;
+    }
+
+    @Nullable
+    public SliceItem getSubtitleItem() {
+        return mSubtitleItem;
+    }
+
+    @Nullable
+    public SliceItem getSummaryItem() {
+        return mSummaryItem == null ? mSubtitleItem : mSummaryItem;
+    }
+
+    public ArrayList<SliceItem> getEndItems() {
+        return mEndItems;
+    }
+
+    /**
+     * @return whether {@link #getEndItems()} contains a SliceItem with FORMAT_ACTION
+     */
+    public boolean endItemsContainAction() {
+        return mEndItemsContainAction;
+    }
+
+    /**
+     * @return whether this is a valid item to use to populate a row of content.
+     */
+    private static boolean isValidRow(SliceItem rowSlice) {
+        if (rowSlice == null) {
+            return false;
+        }
+        // Must be slice or action
+        if (FORMAT_SLICE.equals(rowSlice.getFormat())
+                || FORMAT_ACTION.equals(rowSlice.getFormat())) {
+            // Must have at least one legitimate child
+            List<SliceItem> rowItems = rowSlice.getSlice().getItems();
+            for (int i = 0; i < rowItems.size(); i++) {
+                if (isValidRowContent(rowSlice, rowItems.get(i))) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private static ArrayList<SliceItem> filterInvalidItems(SliceItem rowSlice) {
+        ArrayList<SliceItem> filteredList = new ArrayList<>();
+        for (SliceItem i : rowSlice.getSlice().getItems()) {
+            if (isValidRowContent(rowSlice, i)) {
+                filteredList.add(i);
+            }
+        }
+        return filteredList;
+    }
+
+    /**
+     * @return whether this item has valid content to display in a row.
+     */
+    private static boolean isValidRowContent(SliceItem slice, SliceItem item) {
+        // TODO -- filter for shortcut once that's in
+        final String itemFormat = item.getFormat();
+        // Must be a format that is presentable
+        return FORMAT_TEXT.equals(itemFormat)
+                || FORMAT_IMAGE.equals(itemFormat)
+                || FORMAT_TIMESTAMP.equals(itemFormat)
+                || FORMAT_REMOTE_INPUT.equals(itemFormat)
+                || FORMAT_ACTION.equals(itemFormat)
+                || (FORMAT_INT.equals(itemFormat) && SUBTYPE_RANGE.equals(slice.getSubType()));
+    }
+
+    /**
+     * @return Whether this item is appropriate to be considered a "start" item, i.e. go in the
+     *         front slot of a row.
+     */
+    private static boolean isStartType(SliceItem item) {
+        final String type = item.getFormat();
+        return item.hasHint(HINT_TITLE)
+                && ((FORMAT_ACTION.equals(type) && (SliceQuery.find(item, FORMAT_IMAGE) != null))
+                    || FORMAT_IMAGE.equals(type)
+                    || FORMAT_TIMESTAMP.equals(type));
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/RowView.java b/slices/view/src/main/java/androidx/app/slice/widget/RowView.java
new file mode 100644
index 0000000..3a472ad
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/RowView.java
@@ -0,0 +1,455 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.widget;
+
+import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
+import static android.app.slice.Slice.HINT_NO_TINT;
+import static android.app.slice.Slice.HINT_SELECTED;
+import static android.app.slice.Slice.SUBTYPE_TOGGLE;
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_INT;
+import static android.app.slice.SliceItem.FORMAT_TIMESTAMP;
+
+import static androidx.app.slice.core.SliceHints.EXTRA_RANGE_VALUE;
+import static androidx.app.slice.core.SliceHints.SUBTYPE_MAX;
+import static androidx.app.slice.core.SliceHints.SUBTYPE_VALUE;
+import static androidx.app.slice.widget.SliceView.MODE_LARGE;
+import static androidx.app.slice.widget.SliceView.MODE_SMALL;
+
+import android.annotation.TargetApi;
+import android.app.PendingIntent;
+import android.app.PendingIntent.CanceledException;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
+import android.support.annotation.ColorInt;
+import android.support.annotation.RestrictTo;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CompoundButton;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.SeekBar;
+import android.widget.Switch;
+import android.widget.TextView;
+import android.widget.ToggleButton;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceItem;
+import androidx.app.slice.core.SliceQuery;
+import androidx.app.slice.view.R;
+
+/**
+ * Row item is in small template format and can be used to construct list items for use
+ * with {@link LargeTemplateView}.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@TargetApi(23)
+public class RowView extends SliceChildView implements View.OnClickListener {
+
+    private static final String TAG = "RowView";
+
+    // The number of items that fit on the right hand side of a small slice
+    private static final int MAX_END_ITEMS = 3;
+
+    private LinearLayout mStartContainer;
+    private LinearLayout mContent;
+    private TextView mPrimaryText;
+    private TextView mSecondaryText;
+    private View mDivider;
+    private ArrayList<CompoundButton> mToggles = new ArrayList<>();
+    private LinearLayout mEndContainer;
+    private SeekBar mSeekBar;
+    private ProgressBar mProgressBar;
+
+    private boolean mInSmallMode;
+    private int mRowIndex;
+    private RowContent mRowContent;
+    private SliceItem mRowAction;
+    private boolean mIsHeader;
+
+    private int mIconSize;
+    private int mPadding;
+
+    public RowView(Context context) {
+        super(context);
+        mIconSize = getContext().getResources().getDimensionPixelSize(R.dimen.abc_slice_icon_size);
+        mPadding = getContext().getResources().getDimensionPixelSize(R.dimen.abc_slice_padding);
+        inflate(context, R.layout.abc_slice_small_template, this);
+
+        mStartContainer = (LinearLayout) findViewById(R.id.icon_frame);
+        mContent = (LinearLayout) findViewById(android.R.id.content);
+        mPrimaryText = (TextView) findViewById(android.R.id.title);
+        mSecondaryText = (TextView) findViewById(android.R.id.summary);
+        mDivider = findViewById(R.id.divider);
+        mEndContainer = (LinearLayout) findViewById(android.R.id.widget_frame);
+        mSeekBar = (SeekBar) findViewById(R.id.seek_bar);
+        mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
+    }
+
+    @Override
+    public @SliceView.SliceMode int getMode() {
+        return mInSmallMode ? MODE_SMALL : MODE_LARGE;
+    }
+
+    @Override
+    public void setTint(@ColorInt int tintColor) {
+        super.setTint(tintColor);
+        if (mRowContent != null) {
+            // TODO -- can be smarter about this
+            resetView();
+            populateViews();
+        }
+    }
+
+    /**
+     * This is called when RowView is being used as a component in a large template.
+     */
+    @Override
+    public void setSliceItem(SliceItem slice, boolean isHeader, int index,
+            SliceView.OnSliceActionListener observer) {
+        setSliceActionListener(observer);
+        mInSmallMode = false;
+        mRowIndex = index;
+        mIsHeader = isHeader;
+        mRowContent = new RowContent(slice, mIsHeader);
+        populateViews();
+    }
+
+    /**
+     * This is called when RowView is being used as a small template.
+     */
+    @Override
+    public void setSlice(Slice slice) {
+        mInSmallMode = true;
+        mRowIndex = 0;
+        mIsHeader = true;
+        ListContent lc = new ListContent(slice);
+        mRowContent = new RowContent(lc.getHeaderItem(), true /* isHeader */);
+        populateViews();
+    }
+
+    private void populateViews() {
+        resetView();
+        boolean showStart = false;
+        final SliceItem startItem = mRowContent.getStartItem();
+        if (startItem != null) {
+            final EventInfo info = new EventInfo(getMode(),
+                    EventInfo.ACTION_TYPE_BUTTON,
+                    EventInfo.ROW_TYPE_LIST, mRowIndex);
+            info.setPosition(EventInfo.POSITION_START, 0, 1);
+            showStart = addItem(startItem, mTintColor, true /* isStart */, 0 /* padding */, info);
+        }
+        mStartContainer.setVisibility(showStart ? View.VISIBLE : View.GONE);
+
+        final SliceItem titleItem = mRowContent.getTitleItem();
+        if (titleItem != null) {
+            mPrimaryText.setText(titleItem.getText());
+        }
+        mPrimaryText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mIsHeader
+                ? mHeaderTitleSize
+                : mTitleSize);
+        mPrimaryText.setTextColor(mTitleColor);
+        mPrimaryText.setVisibility(titleItem != null ? View.VISIBLE : View.GONE);
+
+        final SliceItem subTitle = mInSmallMode
+                ? mRowContent.getSummaryItem()
+                : mRowContent.getSubtitleItem();
+        if (subTitle != null) {
+            mSecondaryText.setText(subTitle.getText());
+        }
+        mSecondaryText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mIsHeader
+                ? mHeaderSubtitleSize
+                : mSubtitleSize);
+        mSecondaryText.setTextColor(mSubtitleColor);
+        mSecondaryText.setVisibility(subTitle != null ? View.VISIBLE : View.GONE);
+
+        final SliceItem range = mRowContent.getRange();
+        if (range != null) {
+            addRange(range);
+            return;
+        }
+
+        mRowAction = mRowContent.getContentIntent();
+        ArrayList<SliceItem> endItems = mRowContent.getEndItems();
+        boolean hasRowAction = mRowAction != null;
+        if (endItems.isEmpty()) {
+            if (hasRowAction) setViewClickable(this, true);
+            return;
+        }
+
+        // If we're here we might be able to show end items
+        int itemCount = 0;
+        // Prefer to show actions as end items if possible; fall back to the first format type.
+        String desiredFormat = mRowContent.endItemsContainAction()
+                ? FORMAT_ACTION : endItems.get(0).getFormat();
+        boolean firstItemIsADefaultToggle = false;
+        for (int i = 0; i < endItems.size(); i++) {
+            final SliceItem endItem = endItems.get(i);
+            final String endFormat = endItem.getFormat();
+            // Only show one type of format at the end of the slice, use whatever is first
+            if (itemCount <= MAX_END_ITEMS
+                    && (desiredFormat.equals(endFormat)
+                    || FORMAT_TIMESTAMP.equals(endFormat))) {
+                final EventInfo info = new EventInfo(getMode(),
+                        EventInfo.ACTION_TYPE_BUTTON,
+                        EventInfo.ROW_TYPE_LIST, mRowIndex);
+                info.setPosition(EventInfo.POSITION_END, i,
+                        Math.min(endItems.size(), MAX_END_ITEMS));
+                if (addItem(endItem, mTintColor, false /* isStart */, mPadding, info)) {
+                    itemCount++;
+                    if (itemCount == 1) {
+                        firstItemIsADefaultToggle = !mToggles.isEmpty()
+                                && SliceQuery.find(endItem.getSlice(), FORMAT_IMAGE) == null;
+                    }
+                }
+            }
+        }
+
+        boolean hasEndItemAction = FORMAT_ACTION.contentEquals(desiredFormat);
+        // If there is a row action and the first end item is a default toggle, show the divider.
+        mDivider.setVisibility(hasRowAction && firstItemIsADefaultToggle
+                ? View.VISIBLE : View.GONE);
+        if (hasRowAction) {
+            if (itemCount > 0 && hasEndItemAction) {
+                setViewClickable(mContent, true);
+            } else {
+                setViewClickable(this, true);
+            }
+        } else {
+            // If the only end item is an action, make the whole row clickable.
+            if (mRowContent.endItemsContainAction() && itemCount == 1) {
+                if (!SUBTYPE_TOGGLE.equals(endItems.get(0).getSubType())) {
+                    mRowAction = endItems.get(0);
+                }
+                setViewClickable(this, true);
+            }
+        }
+    }
+
+    private void addRange(final SliceItem range) {
+        final ProgressBar progressBar;
+        if (FORMAT_ACTION.equals(range.getFormat())) {
+            // An input range is displayed as a seek bar
+            progressBar = mSeekBar;
+            mSeekBar.setVisibility(View.VISIBLE);
+            SliceItem thumb = SliceQuery.find(range, FORMAT_IMAGE);
+            if (thumb != null) {
+                mSeekBar.setThumb(thumb.getIcon().loadDrawable(getContext()));
+            }
+            mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+                @Override
+                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+                    try {
+                        PendingIntent pi = range.getAction();
+                        Intent i = new Intent().putExtra(EXTRA_RANGE_VALUE, progress);
+                        // TODO: sending this PendingIntent should be rate limited.
+                        pi.send(getContext(), 0, i, null, null);
+                    } catch (CanceledException e) { }
+                }
+
+                @Override
+                public void onStartTrackingTouch(SeekBar seekBar) { }
+
+                @Override
+                public void onStopTrackingTouch(SeekBar seekBar) { }
+            });
+        } else {
+            // A range is displayed as a progress bar.
+            progressBar = mProgressBar;
+            mProgressBar.setVisibility(View.VISIBLE);
+        }
+        SliceItem max = SliceQuery.findSubtype(range, FORMAT_INT, SUBTYPE_MAX);
+        if (max != null) {
+            progressBar.setMax(max.getInt());
+        }
+        SliceItem progress = SliceQuery.findSubtype(range, FORMAT_INT, SUBTYPE_VALUE);
+        if (progress != null) {
+            progressBar.setProgress(progress.getInt());
+        }
+    }
+
+    /**
+     * Add a toggle view to container.
+     */
+    private void addToggle(final SliceItem toggleItem, int color, ViewGroup container) {
+        // Check if this is a custom toggle
+        Icon checkedIcon = null;
+        List<SliceItem> sliceItems = toggleItem.getSlice().getItems();
+        if (sliceItems.size() > 0) {
+            checkedIcon = FORMAT_IMAGE.equals(sliceItems.get(0).getFormat())
+                    ? sliceItems.get(0).getIcon()
+                    : null;
+        }
+        final CompoundButton toggle;
+        if (checkedIcon != null) {
+            if (color != -1) {
+                // TODO - Should custom toggle buttons be tinted? What if the app wants diff
+                // colors per state?
+                checkedIcon.setTint(color);
+            }
+            toggle = new ToggleButton(getContext());
+            ((ToggleButton) toggle).setTextOff("");
+            ((ToggleButton) toggle).setTextOn("");
+            toggle.setBackground(checkedIcon.loadDrawable(getContext()));
+            container.addView(toggle);
+            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) toggle.getLayoutParams();
+            lp.width = mIconSize;
+            lp.height = mIconSize;
+        } else {
+            toggle = new Switch(getContext());
+            container.addView(toggle);
+        }
+        toggle.setChecked(SliceQuery.hasHints(toggleItem.getSlice(), HINT_SELECTED));
+        toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                try {
+                    PendingIntent pi = toggleItem.getAction();
+                    Intent i = new Intent().putExtra(EXTRA_TOGGLE_STATE, isChecked);
+                    pi.send(getContext(), 0, i, null, null);
+                    if (mObserver != null) {
+                        final EventInfo info = new EventInfo(getMode(),
+                                EventInfo.ACTION_TYPE_TOGGLE,
+                                EventInfo.ROW_TYPE_LIST, mRowIndex);
+                        info.state = isChecked ? EventInfo.STATE_ON : EventInfo.STATE_OFF;
+                        mObserver.onSliceAction(info, toggleItem);
+                    }
+                } catch (CanceledException e) {
+                    toggle.setSelected(!isChecked);
+                }
+            }
+        });
+        mToggles.add(toggle);
+    }
+
+    /**
+     * Adds simple items to a container. Simple items include actions with icons, images, or
+     * timestamps.
+     */
+    private boolean addItem(SliceItem sliceItem, int color, boolean isStart, int padding,
+            final EventInfo info) {
+        SliceItem image = null;
+        SliceItem action = null;
+        SliceItem timeStamp = null;
+        ViewGroup container = isStart ? mStartContainer : mEndContainer;
+        if (FORMAT_ACTION.equals(sliceItem.getFormat())) {
+            if (SUBTYPE_TOGGLE.equals(sliceItem.getSubType())) {
+                addToggle(sliceItem, color, container);
+                return true;
+            }
+            image = SliceQuery.find(sliceItem.getSlice(), FORMAT_IMAGE);
+            timeStamp = SliceQuery.find(sliceItem.getSlice(), FORMAT_TIMESTAMP);
+            action = sliceItem;
+        } else if (FORMAT_IMAGE.equals(sliceItem.getFormat())) {
+            image = sliceItem;
+        } else if (FORMAT_TIMESTAMP.equals(sliceItem.getFormat())) {
+            timeStamp = sliceItem;
+        }
+        View addedView = null;
+        if (image != null) {
+            ImageView iv = new ImageView(getContext());
+            iv.setImageIcon(image.getIcon());
+            if (color != -1 && !sliceItem.hasHint(HINT_NO_TINT)) {
+                iv.setColorFilter(color);
+            }
+            container.addView(iv);
+            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) iv.getLayoutParams();
+            lp.width = mIconSize;
+            lp.height = mIconSize;
+            lp.setMarginStart(padding);
+            addedView = iv;
+        } else if (timeStamp != null) {
+            TextView tv = new TextView(getContext());
+            tv.setText(SliceViewUtil.getRelativeTimeString(sliceItem.getTimestamp()));
+            tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, mSubtitleSize);
+            tv.setTextColor(mSubtitleColor);
+            container.addView(tv);
+            addedView = tv;
+        }
+        if (action != null && addedView != null) {
+            final SliceItem sliceAction = action;
+            addedView.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    try {
+                        sliceAction.getAction().send();
+                        if (mObserver != null) {
+                            mObserver.onSliceAction(info, sliceAction);
+                        }
+                    } catch (CanceledException e) {
+                        e.printStackTrace();
+                    }
+                }
+            });
+            addedView.setBackground(SliceViewUtil.getDrawable(getContext(),
+                    android.R.attr.selectableItemBackground));
+        }
+        return addedView != null;
+    }
+
+    @Override
+    public void onClick(View view) {
+        if (mRowAction != null && FORMAT_ACTION.equals(mRowAction.getFormat())) {
+            // Check for a row action
+            try {
+                mRowAction.getAction().send();
+                if (mObserver != null) {
+                    EventInfo info = new EventInfo(getMode(), EventInfo.ACTION_TYPE_CONTENT,
+                            EventInfo.ROW_TYPE_LIST, mRowIndex);
+                    mObserver.onSliceAction(info, mRowAction);
+                }
+            } catch (CanceledException e) {
+                Log.w(TAG, "PendingIntent for slice cannot be sent", e);
+            }
+        } else if (mToggles.size() == 1) {
+            // If there is only one toggle and no row action, just toggle it.
+            mToggles.get(0).toggle();
+        }
+    }
+
+    private void setViewClickable(View layout, boolean isClickable) {
+        layout.setOnClickListener(isClickable ? this : null);
+        layout.setBackground(isClickable ? SliceViewUtil.getDrawable(getContext(),
+                android.R.attr.selectableItemBackground) : null);
+        layout.setClickable(isClickable);
+    }
+
+    @Override
+    public void resetView() {
+        setViewClickable(this, false);
+        setViewClickable(mContent, false);
+        mStartContainer.removeAllViews();
+        mEndContainer.removeAllViews();
+        mPrimaryText.setText(null);
+        mSecondaryText.setText(null);
+        mToggles.clear();
+        mRowAction = null;
+        mDivider.setVisibility(View.GONE);
+        mSeekBar.setVisibility(View.GONE);
+        mProgressBar.setVisibility(View.GONE);
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/ShortcutView.java b/slices/view/src/main/java/androidx/app/slice/widget/ShortcutView.java
new file mode 100644
index 0000000..75e97b1
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/ShortcutView.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.widget;
+
+import static android.app.slice.Slice.HINT_LARGE;
+import static android.app.slice.Slice.HINT_TITLE;
+import static android.app.slice.Slice.SUBTYPE_COLOR;
+import static android.app.slice.Slice.SUBTYPE_SOURCE;
+import static android.app.slice.SliceItem.FORMAT_ACTION;
+import static android.app.slice.SliceItem.FORMAT_IMAGE;
+import static android.app.slice.SliceItem.FORMAT_INT;
+import static android.app.slice.SliceItem.FORMAT_SLICE;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+
+import android.annotation.TargetApi;
+import android.app.PendingIntent;
+import android.app.PendingIntent.CanceledException;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.OvalShape;
+import android.net.Uri;
+import android.support.annotation.RestrictTo;
+import android.widget.ImageView;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceItem;
+import androidx.app.slice.core.SliceQuery;
+import androidx.app.slice.view.R;
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@TargetApi(23)
+public class ShortcutView extends SliceChildView {
+
+    private static final String TAG = "ShortcutView";
+
+    private Slice mSlice;
+    private Uri mUri;
+    private SliceItem mActionItem;
+    private SliceItem mLabel;
+    private SliceItem mIcon;
+
+    private int mLargeIconSize;
+    private int mSmallIconSize;
+
+    public ShortcutView(Context context) {
+        super(context);
+        final Resources res = getResources();
+        mSmallIconSize = res.getDimensionPixelSize(R.dimen.abc_slice_icon_size);
+        mLargeIconSize = res.getDimensionPixelSize(R.dimen.abc_slice_shortcut_size);
+    }
+
+    @Override
+    public void setSlice(Slice slice) {
+        resetView();
+        mSlice = slice;
+        determineShortcutItems(getContext(), slice);
+        SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
+        if (colorItem == null) {
+            colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
+        }
+        final int color = colorItem != null
+                ? colorItem.getInt()
+                : SliceViewUtil.getColorAccent(getContext());
+        ShapeDrawable circle = new ShapeDrawable(new OvalShape());
+        circle.setTint(color);
+        ImageView iv = new ImageView(getContext());
+        iv.setBackground(circle);
+        addView(iv);
+        if (mIcon != null) {
+            final boolean isLarge = mIcon.hasHint(HINT_LARGE)
+                    || SUBTYPE_SOURCE.equals(mIcon.getSubType());
+            final int iconSize = isLarge ? mLargeIconSize : mSmallIconSize;
+            SliceViewUtil.createCircledIcon(getContext(), iconSize, mIcon.getIcon(),
+                    isLarge, this /* parent */);
+            mUri = slice.getUri();
+            setClickable(true);
+        } else {
+            setClickable(false);
+        }
+    }
+
+    @Override
+    public @SliceView.SliceMode int getMode() {
+        return SliceView.MODE_SHORTCUT;
+    }
+
+    @Override
+    public boolean performClick() {
+        if (!callOnClick()) {
+            try {
+                if (mActionItem != null) {
+                    mActionItem.getAction().send();
+                } else {
+                    Intent intent = new Intent(Intent.ACTION_VIEW).setData(mUri);
+                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                    getContext().startActivity(intent);
+                }
+                if (mObserver != null) {
+                    EventInfo ei = new EventInfo(SliceView.MODE_SHORTCUT,
+                            EventInfo.ACTION_TYPE_BUTTON,
+                            EventInfo.ROW_TYPE_SHORTCUT, 0 /* rowIndex */);
+                    SliceItem interactedItem = mActionItem != null
+                            ? mActionItem
+                            : new SliceItem(mSlice, FORMAT_SLICE, null /* subtype */,
+                                    mSlice.getHints());
+                    mObserver.onSliceAction(ei, interactedItem);
+                }
+            } catch (CanceledException e) {
+                e.printStackTrace();
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Looks at the slice and determines which items are best to use to compose the shortcut.
+     */
+    private void determineShortcutItems(Context context, Slice slice) {
+        SliceItem titleItem = SliceQuery.find(slice, FORMAT_ACTION,
+                HINT_TITLE, null);
+
+        if (titleItem != null) {
+            // Preferred case: hinted action containing hinted image and text
+            mActionItem = titleItem;
+            mIcon = SliceQuery.find(titleItem.getSlice(), FORMAT_IMAGE, HINT_TITLE,
+                    null);
+            mLabel = SliceQuery.find(titleItem.getSlice(), FORMAT_TEXT, HINT_TITLE,
+                    null);
+        } else {
+            // No hinted action; just use the first one
+            mActionItem = SliceQuery.find(slice, FORMAT_ACTION, (String) null, null);
+        }
+        // First fallback: any hinted image and text
+        if (mIcon == null) {
+            mIcon = SliceQuery.find(slice, FORMAT_IMAGE, HINT_TITLE,
+                    null);
+        }
+        if (mLabel == null) {
+            mLabel = SliceQuery.find(slice, FORMAT_TEXT, HINT_TITLE,
+                    null);
+        }
+        // Second fallback: first image and text
+        if (mIcon == null) {
+            mIcon = SliceQuery.find(slice, FORMAT_IMAGE, (String) null,
+                    null);
+        }
+        if (mLabel == null) {
+            mLabel = SliceQuery.find(slice, FORMAT_TEXT, (String) null,
+                    null);
+        }
+        // Final fallback: use app info
+        if (mIcon == null || mLabel == null || mActionItem == null) {
+            PackageManager pm = context.getPackageManager();
+            ProviderInfo providerInfo = pm.resolveContentProvider(
+                    slice.getUri().getAuthority(), 0);
+            ApplicationInfo appInfo = providerInfo.applicationInfo;
+            if (appInfo != null) {
+                if (mIcon == null) {
+                    Slice.Builder sb = new Slice.Builder(slice.getUri());
+                    Drawable icon = pm.getApplicationIcon(appInfo);
+                    sb.addIcon(SliceViewUtil.createIconFromDrawable(icon), HINT_LARGE);
+                    mIcon = sb.build().getItems().get(0);
+                }
+                if (mLabel == null) {
+                    Slice.Builder sb = new Slice.Builder(slice.getUri());
+                    sb.addText(pm.getApplicationLabel(appInfo), null);
+                    mLabel = sb.build().getItems().get(0);
+                }
+                if (mActionItem == null) {
+                    mActionItem = new SliceItem(PendingIntent.getActivity(context, 0,
+                            pm.getLaunchIntentForPackage(appInfo.packageName), 0),
+                            new Slice.Builder(slice.getUri()).build(), FORMAT_SLICE,
+                            null /* subtype */, null);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void resetView() {
+        mSlice = null;
+        mUri = null;
+        mActionItem = null;
+        mLabel = null;
+        mIcon = null;
+        setBackground(null);
+        removeAllViews();
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java b/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java
new file mode 100644
index 0000000..a9faf86
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java
@@ -0,0 +1,127 @@
+/*
+ * 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.app.slice.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
+import android.support.annotation.RestrictTo;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceItem;
+import androidx.app.slice.view.R;
+
+/**
+ * Base class for children views of {@link SliceView}.
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+public abstract class SliceChildView extends FrameLayout {
+
+    protected SliceView.OnSliceActionListener mObserver;
+    protected int mTintColor = -1;
+    protected int mTitleColor;
+    protected int mSubtitleColor;
+    protected int mHeaderTitleSize;
+    protected int mHeaderSubtitleSize;
+    protected int mTitleSize;
+    protected int mSubtitleSize;
+    protected int mGridTitleSize;
+    protected int mGridSubtitleSize;
+
+    public SliceChildView(@NonNull Context context) {
+        super(context);
+    }
+
+    public SliceChildView(Context context, AttributeSet attributeSet) {
+        this(context);
+    }
+
+    /**
+     * @return the mode of the slice being presented.
+     */
+    public abstract int getMode();
+
+    /**
+     * @param slice the slice to show in this view.
+     */
+    public abstract void setSlice(Slice slice);
+
+    /**
+     * Called when the view should be reset.
+     */
+    public abstract void resetView();
+
+    /**
+     * @return the view.
+     */
+    public View getView() {
+        return this;
+    }
+
+    /**
+     * Sets a custom color to use for tinting elements like icons for this view.
+     */
+    public void setTint(@ColorInt int tintColor) {
+        mTintColor = tintColor;
+    }
+
+    /**
+     * Sets the observer to notify when an interaction events occur on the view.
+     */
+    public void setSliceActionListener(SliceView.OnSliceActionListener observer) {
+        mObserver = observer;
+    }
+
+    /**
+     * Populates style information for this view.
+     */
+    public void setStyle(AttributeSet attrs) {
+        TypedArray a = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.SliceView,
+                R.attr.sliceViewStyle, R.style.Widget_SliceView);
+        try {
+            int themeColor = a.getColor(R.styleable.SliceView_tintColor, -1);
+            mTintColor = themeColor != -1 ? themeColor : mTintColor;
+            mTitleColor = a.getColor(R.styleable.SliceView_titleColor, 0);
+            mSubtitleColor = a.getColor(R.styleable.SliceView_subtitleColor, 0);
+            mHeaderTitleSize = (int) a.getDimension(
+                    R.styleable.SliceView_headerTitleSize, 0);
+            mHeaderSubtitleSize = (int) a.getDimension(
+                    R.styleable.SliceView_headerSubtitleSize, 0);
+            mTitleSize = (int) a.getDimension(R.styleable.SliceView_titleSize, 0);
+            mSubtitleSize = (int) a.getDimension(
+                    R.styleable.SliceView_subtitleSize, 0);
+            mGridTitleSize = (int) a.getDimension(R.styleable.SliceView_gridTitleSize, 0);
+            mGridSubtitleSize = (int) a.getDimension(
+                    R.styleable.SliceView_gridSubtitleSize, 0);
+        } finally {
+            a.recycle();
+        }
+    }
+
+    /**
+     * Called when the slice being displayed in this view is an element of a larger list.
+     */
+    public void setSliceItem(SliceItem slice, boolean isHeader, int rowIndex,
+            SliceView.OnSliceActionListener observer) {
+        // Do nothing
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/SliceLiveData.java b/slices/view/src/main/java/androidx/app/slice/widget/SliceLiveData.java
new file mode 100644
index 0000000..5da98d2
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/SliceLiveData.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.app.slice.widget;
+
+import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.arch.lifecycle.LiveData;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.support.annotation.NonNull;
+import android.support.annotation.RestrictTo;
+
+import java.util.Arrays;
+import java.util.List;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceManager;
+import androidx.app.slice.SliceSpec;
+import androidx.app.slice.SliceSpecs;
+
+/**
+ * Class with factory methods for creating LiveData that observes slices.
+ *
+ * @see #fromUri(Context, Uri)
+ * @see LiveData
+ */
+public final class SliceLiveData {
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    public static final List<SliceSpec> SUPPORTED_SPECS = Arrays.asList(SliceSpecs.BASIC,
+            SliceSpecs.LIST);
+
+    /**
+     * Produces an {@link LiveData} that tracks a Slice for a given Uri. To use
+     * this method your app must have the permission to the slice Uri or hold
+     * {@link android.Manifest.permission#BIND_SLICE}).
+     */
+    public static LiveData<Slice> fromUri(Context context, Uri uri) {
+        return new SliceLiveDataImpl(context.getApplicationContext(), uri);
+    }
+
+    /**
+     * Produces an {@link LiveData} that tracks a Slice for a given Intent. To use
+     * this method your app must have the permission to the slice Uri or hold
+     * {@link android.Manifest.permission#BIND_SLICE}).
+     */
+    public static LiveData<Slice> fromIntent(@NonNull Context context, @NonNull Intent intent) {
+        return new SliceLiveDataImpl(context.getApplicationContext(), intent);
+    }
+
+    private static class SliceLiveDataImpl extends LiveData<Slice> {
+        private final Intent mIntent;
+        private final SliceManager mSliceManager;
+        private Uri mUri;
+
+        private SliceLiveDataImpl(Context context, Uri uri) {
+            super();
+            mSliceManager = SliceManager.getInstance(context);
+            mUri = uri;
+            mIntent = null;
+            // TODO: Check if uri points at a Slice?
+        }
+
+        private SliceLiveDataImpl(Context context, Intent intent) {
+            super();
+            mSliceManager = SliceManager.getInstance(context);
+            mUri = null;
+            mIntent = intent;
+        }
+
+        @Override
+        protected void onActive() {
+            AsyncTask.execute(mUpdateSlice);
+            if (mUri != null) {
+                mSliceManager.registerSliceCallback(mUri, mSliceCallback);
+            }
+        }
+
+        @Override
+        protected void onInactive() {
+            if (mUri != null) {
+                mSliceManager.unregisterSliceCallback(mUri, mSliceCallback);
+            }
+        }
+
+        private final Runnable mUpdateSlice = new Runnable() {
+            @Override
+            public void run() {
+                Slice s = mUri != null ? mSliceManager.bindSlice(mUri)
+                        : mSliceManager.bindSlice(mIntent);
+                if (mUri == null && s != null) {
+                    mUri = s.getUri();
+                    mSliceManager.registerSliceCallback(mUri, mSliceCallback);
+                }
+                postValue(s);
+            }
+        };
+
+        private final SliceManager.SliceCallback mSliceCallback = new SliceManager.SliceCallback() {
+            @Override
+            public void onSliceUpdated(@NonNull Slice s) {
+                postValue(s);
+            }
+        };
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/SliceView.java b/slices/view/src/main/java/androidx/app/slice/widget/SliceView.java
new file mode 100644
index 0000000..3d8ceef
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/SliceView.java
@@ -0,0 +1,412 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.widget;
+
+import static android.app.slice.Slice.HINT_ACTIONS;
+import static android.app.slice.Slice.HINT_HORIZONTAL;
+import static android.app.slice.Slice.SUBTYPE_COLOR;
+import static android.app.slice.SliceItem.FORMAT_INT;
+import static android.app.slice.SliceItem.FORMAT_SLICE;
+
+import android.arch.lifecycle.Observer;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.drawable.ColorDrawable;
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.List;
+
+import androidx.app.slice.Slice;
+import androidx.app.slice.SliceItem;
+import androidx.app.slice.core.SliceQuery;
+import androidx.app.slice.view.R;
+
+/**
+ * A view for displaying a {@link Slice} which is a piece of app content and actions. SliceView is
+ * able to present slice content in a templated format outside of the associated app. The way this
+ * content is displayed depends on the structure of the slice, the hints associated with the
+ * content, and the mode that SliceView is configured for. The modes that SliceView supports are:
+ * <ul>
+ * <li><b>Shortcut</b>: A shortcut is presented as an icon and a text label representing the main
+ * content or action associated with the slice.</li>
+ * <li><b>Small</b>: The small format has a restricted height and can present a single
+ * {@link SliceItem} or a limited collection of items.</li>
+ * <li><b>Large</b>: The large format displays multiple small templates in a list, if scrolling is
+ * not enabled (see {@link #setScrollable(boolean)}) the view will show as many items as it can
+ * comfortably fit.</li>
+ * </ul>
+ * <p>
+ * When constructing a slice, the contents of it can be annotated with hints, these provide the OS
+ * with some information on how the content should be displayed. For example, text annotated with
+ * {@link android.app.slice.Slice#HINT_TITLE} would be placed in the title position of a template.
+ * A slice annotated with {@link android.app.slice.Slice#HINT_LIST} would present the child items
+ * of that slice in a list.
+ * <p>
+ * Example usage:
+ *
+ * <pre class="prettyprint">
+ * SliceView v = new SliceView(getContext());
+ * v.setMode(desiredMode);
+ * LiveData<Slice> liveData = SliceLiveData.fromUri(sliceUri);
+ * liveData.observe(lifecycleOwner, v);
+ * </pre>
+ * @see SliceLiveData
+ */
+public class SliceView extends ViewGroup implements Observer<Slice> {
+
+    private static final String TAG = "SliceView";
+
+    /**
+     * Implement this interface to be notified of interactions with the slice displayed
+     * in this view.
+     * @see EventInfo
+     */
+    public interface OnSliceActionListener {
+        /**
+         * Called when an interaction has occurred with an element in this view.
+         * @param info the type of event that occurred.
+         * @param item the specific item within the {@link Slice} that was interacted with.
+         */
+        void onSliceAction(@NonNull EventInfo info, @NonNull SliceItem item);
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @IntDef({
+            MODE_SMALL, MODE_LARGE, MODE_SHORTCUT
+    })
+    public @interface SliceMode {}
+
+    /**
+     * Mode indicating this slice should be presented in small template format.
+     */
+    public static final int MODE_SMALL       = 1;
+    /**
+     * Mode indicating this slice should be presented in large template format.
+     */
+    public static final int MODE_LARGE       = 2;
+    /**
+     * Mode indicating this slice should be presented as an icon. A shortcut requires an intent,
+     * icon, and label. This can be indicated by using {@link android.app.slice.Slice#HINT_TITLE}
+     * on an action in a slice.
+     */
+    public static final int MODE_SHORTCUT    = 3;
+
+    /**
+     * Will select the type of slice binding based on size of the View. TODO: Put in some info about
+     * that selection.
+     */
+    private static final int MODE_AUTO = 0;
+
+    private int mMode = MODE_AUTO;
+    private SliceChildView mCurrentView;
+    private Slice mCurrentSlice;
+    private final ActionRow mActions;
+    private final int mShortcutSize;
+    private OnSliceActionListener mSliceObserver;
+
+    private boolean mShowActions = true;
+    private boolean mIsScrollable = true;
+
+    private AttributeSet mAttrs;
+    private int mThemeTintColor;
+
+    public SliceView(Context context) {
+        this(context, null);
+    }
+
+    public SliceView(Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, R.attr.sliceViewStyle);
+    }
+
+    public SliceView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, R.style.Widget_SliceView);
+    }
+
+    public SliceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        mAttrs = attrs;
+        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SliceView,
+                defStyleAttr, defStyleRes);
+        try {
+            mThemeTintColor = a.getColor(R.styleable.SliceView_tintColor, -1);
+        } finally {
+            a.recycle();
+        }
+        mActions = new ActionRow(getContext(), true);
+        mActions.setBackground(new ColorDrawable(0xffeeeeee));
+        mCurrentView = new LargeTemplateView(getContext());
+        addView(mCurrentView.getView(), getChildLp(mCurrentView.getView()));
+        addView(mActions, getChildLp(mActions));
+        mShortcutSize = getContext().getResources()
+                .getDimensionPixelSize(R.dimen.abc_slice_shortcut_size);
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        int width = MeasureSpec.getSize(widthMeasureSpec);
+        int childWidth = MeasureSpec.getSize(widthMeasureSpec);
+        int childHeight = MeasureSpec.getSize(heightMeasureSpec);
+        if (MODE_SHORTCUT == mMode) {
+            // TODO: consider scaling the shortcut to fit
+            childWidth = mShortcutSize;
+            width = mShortcutSize;
+        }
+        final int left = getPaddingLeft();
+        final int top = getPaddingTop();
+        final int right = getPaddingRight();
+        final int bot = getPaddingBottom();
+
+        // Measure the children without the padding
+        childWidth -= left + right;
+        childHeight -= top + bot;
+        int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY);
+        int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY);
+        measureChildren(childWidthMeasureSpec, childHeightMeasureSpec);
+
+        // Figure out parent height
+        int actionHeight = mActions.getVisibility() != View.GONE
+                ? mActions.getMeasuredHeight()
+                : 0;
+        int currViewHeight = mCurrentView.getView().getMeasuredHeight() + top + bot;
+        int newHeightSpec = MeasureSpec.makeMeasureSpec(currViewHeight + actionHeight,
+                MeasureSpec.EXACTLY);
+        // Figure out parent width
+        width += left + right;
+        setMeasuredDimension(width, newHeightSpec);
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        View v = mCurrentView.getView();
+        final int left = getPaddingLeft();
+        final int top = getPaddingTop();
+        final int right = getPaddingRight();
+        final int bottom = getPaddingBottom();
+        v.layout(left, top, left + v.getMeasuredWidth(), top + v.getMeasuredHeight());
+        if (mActions.getVisibility() != View.GONE) {
+            mActions.layout(left,
+                    top + v.getMeasuredHeight() + bottom,
+                    left + mActions.getMeasuredWidth() + right,
+                    top + v.getMeasuredHeight() + bottom + mActions.getMeasuredHeight());
+        }
+    }
+
+    @Override
+    public void onChanged(@Nullable Slice slice) {
+        setSlice(slice);
+    }
+
+    /**
+     * Populates this view to the provided {@link Slice}.
+     *
+     * This will not update automatically if the slice content changes, for live
+     * content see {@link SliceLiveData}.
+     */
+    public void setSlice(@Nullable Slice slice) {
+        if (mCurrentSlice != null && slice != null
+                && !mCurrentSlice.getUri().equals(slice.getUri())) {
+            // New slice, reset view
+            mCurrentView.resetView();
+        }
+        mCurrentSlice = slice;
+        reinflate();
+    }
+
+    /**
+     * Set the mode this view should present in.
+     */
+    public void setMode(@SliceMode int mode) {
+        setMode(mode, false /* animate */);
+    }
+
+    /**
+     * Set whether this view should allow scrollable content when presenting in {@link #MODE_LARGE}.
+     */
+    public void setScrollable(boolean isScrollable) {
+        mIsScrollable = isScrollable;
+        reinflate();
+    }
+
+    /**
+     * Sets the listener to notify when an interaction events occur on the view.
+     * @see EventInfo
+     */
+    public void setOnSliceActionListener(@Nullable OnSliceActionListener observer) {
+        mSliceObserver = observer;
+        mCurrentView.setSliceActionListener(mSliceObserver);
+    }
+
+    /**
+     * Contents of a slice such as icons, text, and controls (e.g. toggle) can be tinted. Normally
+     * a color for tinting will be provided by the slice. Using this method will override
+     * this color information and instead tint elements with the provided color.
+     *
+     * @param tintColor the color to use for tinting contents of this view.
+     */
+    public void setTint(int tintColor) {
+        mThemeTintColor = tintColor;
+        mCurrentView.setTint(tintColor);
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public void setMode(@SliceMode int mode, boolean animate) {
+        if (animate) {
+            Log.e(TAG, "Animation not supported yet");
+        }
+        mMode = mode;
+        reinflate();
+    }
+
+    /**
+     * @return the mode this view is presenting in.
+     */
+    public @SliceMode int getMode() {
+        if (mMode == MODE_AUTO) {
+            return MODE_LARGE;
+        }
+        return mMode;
+    }
+
+    /**
+     * @hide
+     *
+     * Whether this view should show a row of actions with it.
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public void setShowActionRow(boolean show) {
+        mShowActions = show;
+        reinflate();
+    }
+
+    private SliceChildView createView(int mode) {
+        switch (mode) {
+            case MODE_SHORTCUT:
+                return new ShortcutView(getContext());
+            case MODE_SMALL:
+                // Check if it's horizontal and use a grid instead
+                if (SliceQuery.hasHints(mCurrentSlice, HINT_HORIZONTAL)) {
+                    return new GridRowView(getContext());
+                } else {
+                    return new RowView(getContext());
+                }
+        }
+        return new LargeTemplateView(getContext());
+    }
+
+    private void reinflate() {
+        if (mCurrentSlice == null) {
+            mCurrentView.resetView();
+            return;
+        }
+        // TODO: Smarter mapping here from one state to the next.
+        int mode = getMode();
+        boolean isSmallGridShowing = mCurrentView instanceof GridRowView;
+        boolean isGridSlice = SliceQuery.hasHints(mCurrentSlice, HINT_HORIZONTAL);
+        if (mMode == mCurrentView.getMode() && isGridSlice == isSmallGridShowing) {
+            mCurrentView.setSlice(mCurrentSlice);
+        } else {
+            removeAllViews();
+            mCurrentView = createView(mode);
+            if (mSliceObserver != null) {
+                mCurrentView.setSliceActionListener(mSliceObserver);
+            }
+            addView(mCurrentView.getView(), getChildLp(mCurrentView.getView()));
+            addView(mActions, getChildLp(mActions));
+        }
+        // Scrolling
+        if (mode == MODE_LARGE) {
+            ((LargeTemplateView) mCurrentView).setScrollable(mIsScrollable);
+        }
+        // Styles
+        mCurrentView.setStyle(mAttrs);
+        mCurrentView.setTint(getTintColor());
+        // Set the slice
+        SliceItem actionRow = SliceQuery.find(mCurrentSlice, FORMAT_SLICE,
+                HINT_ACTIONS,
+                null);
+        List<SliceItem> items = mCurrentSlice.getItems();
+        if (items.size() > 1 || (items.size() != 0 && items.get(0) != actionRow)) {
+            mCurrentView.getView().setVisibility(View.VISIBLE);
+            mCurrentView.setSlice(mCurrentSlice);
+        } else {
+            mCurrentView.getView().setVisibility(View.GONE);
+        }
+        // Deal with actions
+        boolean showActions = mShowActions && actionRow != null
+                && mode != MODE_SHORTCUT;
+        if (showActions) {
+            mActions.setActions(actionRow, getTintColor());
+            mActions.setVisibility(View.VISIBLE);
+        } else {
+            mActions.setVisibility(View.GONE);
+        }
+    }
+
+    private int getTintColor() {
+        if (mThemeTintColor != -1) {
+            // Theme has specified a color, use that
+            return mThemeTintColor;
+        } else {
+            final SliceItem colorItem = SliceQuery.findSubtype(
+                    mCurrentSlice, FORMAT_INT, SUBTYPE_COLOR);
+            return colorItem != null
+                    ? colorItem.getInt()
+                    : SliceViewUtil.getColorAccent(getContext());
+        }
+    }
+
+    private LayoutParams getChildLp(View child) {
+        if (child instanceof ShortcutView) {
+            return new LayoutParams(mShortcutSize, mShortcutSize);
+        } else {
+            return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
+        }
+    }
+
+    /**
+     * @return String representation of the provided mode.
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public static String modeToString(@SliceMode int mode) {
+        switch(mode) {
+            case MODE_AUTO:
+                return "MODE AUTO";
+            case MODE_SHORTCUT:
+                return "MODE SHORTCUT";
+            case MODE_SMALL:
+                return "MODE SMALL";
+            case MODE_LARGE:
+                return "MODE LARGE";
+            default:
+                return "unknown mode: " + mode;
+        }
+    }
+}
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/SliceViewUtil.java b/slices/view/src/main/java/androidx/app/slice/widget/SliceViewUtil.java
new file mode 100644
index 0000000..12fe7c4
--- /dev/null
+++ b/slices/view/src/main/java/androidx/app/slice/widget/SliceViewUtil.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.app.slice.widget;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.PorterDuff.Mode;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+import android.support.annotation.AttrRes;
+import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
+import android.support.annotation.RestrictTo;
+import android.text.format.DateUtils;
+import android.view.Gravity;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+
+import java.util.Calendar;
+
+/**
+ * A bunch of utilities for slice UI.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@TargetApi(23)
+public class SliceViewUtil {
+
+    /**
+     */
+    @ColorInt
+    public static int getColorAccent(@NonNull Context context) {
+        return getColorAttr(context, android.R.attr.colorAccent);
+    }
+
+    /**
+     */
+    @ColorInt
+    public static int getColorError(@NonNull Context context) {
+        return getColorAttr(context, android.R.attr.colorError);
+    }
+
+    /**
+     */
+    @ColorInt
+    public static int getDefaultColor(@NonNull Context context, int resId) {
+        final ColorStateList list = context.getResources().getColorStateList(resId,
+                context.getTheme());
+
+        return list.getDefaultColor();
+    }
+
+    /**
+     */
+    @ColorInt
+    public static int getDisabled(@NonNull Context context, int inputColor) {
+        return applyAlphaAttr(context, android.R.attr.disabledAlpha, inputColor);
+    }
+
+    /**
+     */
+    @ColorInt
+    public static int applyAlphaAttr(@NonNull Context context, @AttrRes int attr, int inputColor) {
+        TypedArray ta = context.obtainStyledAttributes(new int[] {
+                attr
+        });
+        float alpha = ta.getFloat(0, 0);
+        ta.recycle();
+        return applyAlpha(alpha, inputColor);
+    }
+
+    /**
+     */
+    @ColorInt
+    public static int applyAlpha(float alpha, int inputColor) {
+        alpha *= Color.alpha(inputColor);
+        return Color.argb((int) (alpha), Color.red(inputColor), Color.green(inputColor),
+                Color.blue(inputColor));
+    }
+
+    /**
+     */
+    @ColorInt
+    public static int getColorAttr(@NonNull Context context, @AttrRes int attr) {
+        TypedArray ta = context.obtainStyledAttributes(new int[] {
+                attr
+        });
+        @ColorInt int colorAccent = ta.getColor(0, 0);
+        ta.recycle();
+        return colorAccent;
+    }
+
+    /**
+     */
+    public static int getThemeAttr(@NonNull Context context, @AttrRes int attr) {
+        TypedArray ta = context.obtainStyledAttributes(new int[] {
+                attr
+        });
+        int theme = ta.getResourceId(0, 0);
+        ta.recycle();
+        return theme;
+    }
+
+    /**
+     */
+    public static Drawable getDrawable(@NonNull Context context, @AttrRes int attr) {
+        TypedArray ta = context.obtainStyledAttributes(new int[] {
+                attr
+        });
+        Drawable drawable = ta.getDrawable(0);
+        ta.recycle();
+        return drawable;
+    }
+
+    /**
+     */
+    public static Icon createIconFromDrawable(Drawable d) {
+        if (d instanceof BitmapDrawable) {
+            return Icon.createWithBitmap(((BitmapDrawable) d).getBitmap());
+        }
+        Bitmap b = Bitmap.createBitmap(d.getIntrinsicWidth(), d.getIntrinsicHeight(),
+                Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(b);
+        d.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+        d.draw(canvas);
+        return Icon.createWithBitmap(b);
+    }
+
+    /**
+     */
+    @TargetApi(28)
+    public static void createCircledIcon(@NonNull Context context, int iconSizePx,
+            Icon icon, boolean isLarge, ViewGroup parent) {
+        ImageView v = new ImageView(context);
+        v.setImageIcon(icon);
+        parent.addView(v);
+        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) v.getLayoutParams();
+        if (isLarge) {
+            // XXX better way to convert from icon -> bitmap or crop an icon (?)
+            Bitmap iconBm = Bitmap.createBitmap(iconSizePx, iconSizePx, Config.ARGB_8888);
+            Canvas iconCanvas = new Canvas(iconBm);
+            v.layout(0, 0, iconSizePx, iconSizePx);
+            v.draw(iconCanvas);
+            v.setImageBitmap(getCircularBitmap(iconBm));
+        } else {
+            v.setColorFilter(Color.WHITE);
+        }
+        lp.width = iconSizePx;
+        lp.height = iconSizePx;
+        lp.gravity = Gravity.CENTER;
+    }
+
+    /**
+     */
+    public static @NonNull Bitmap getCircularBitmap(Bitmap bitmap) {
+        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
+                bitmap.getHeight(), Config.ARGB_8888);
+        Canvas canvas = new Canvas(output);
+        final Paint paint = new Paint();
+        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
+        paint.setAntiAlias(true);
+        canvas.drawARGB(0, 0, 0, 0);
+        canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2,
+                bitmap.getWidth() / 2, paint);
+        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
+        canvas.drawBitmap(bitmap, rect, rect, paint);
+        return output;
+    }
+
+    /**
+     */
+    public static CharSequence getRelativeTimeString(long time) {
+        return DateUtils.getRelativeTimeSpanString(time, Calendar.getInstance().getTimeInMillis(),
+                DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE);
+    }
+}
diff --git a/slices/view/src/main/res-public/values/public_attrs.xml b/slices/view/src/main/res-public/values/public_attrs.xml
new file mode 100644
index 0000000..ad909ea
--- /dev/null
+++ b/slices/view/src/main/res-public/values/public_attrs.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<!-- Definitions of attributes to be exposed to the public -->
+<resources>
+    <public type="attr" name="titleColor" />
+    <public type="attr" name="subtitleColor" />
+    <public type="attr" name="tintColor" />
+    <public type="attr" name="headerTitleSize" />
+    <public type="attr" name="headerSubtitleSize" />
+    <public type="attr" name="titleSize" />
+    <public type="attr" name="subtitleSize" />
+    <public type="attr" name="gridTitleSize" />
+    <public type="attr" name="gridSubtitleSize" />
+    <public type="attr" name="sliceViewStyle" />
+</resources>
\ No newline at end of file
diff --git a/design/res/values-sw600dp/config.xml b/slices/view/src/main/res-public/values/public_styles.xml
similarity index 78%
rename from design/res/values-sw600dp/config.xml
rename to slices/view/src/main/res-public/values/public_styles.xml
index 58b6207..36f3e26 100644
--- a/design/res/values-sw600dp/config.xml
+++ b/slices/view/src/main/res-public/values/public_styles.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2015 The Android Open Source Project
+  ~ 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.
@@ -13,10 +13,9 @@
   ~ 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.
--->
+  -->
 
+<!-- Definitions of styles to be exposed to the public -->
 <resources>
-
-    <integer name="design_snackbar_text_max_lines">1</integer>
-
+    <public type="style" name="Widget.SliceView"/>
 </resources>
\ No newline at end of file
diff --git a/design/res/drawable-anydpi-v21/design_ic_visibility.xml b/slices/view/src/main/res/drawable/abc_ic_slice_send.xml
similarity index 64%
copy from design/res/drawable-anydpi-v21/design_ic_visibility.xml
copy to slices/view/src/main/res/drawable/abc_ic_slice_send.xml
index 123acd2..9c18ac8 100644
--- a/design/res/drawable-anydpi-v21/design_ic_visibility.xml
+++ b/slices/view/src/main/res/drawable/abc_ic_slice_send.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,16 +12,14 @@
   ~ 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.
--->
-
+  -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-
+        android:autoMirrored="true"
+        android:width="24.0dp"
+        android:height="24.0dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
     <path
-        android:fillColor="@android:color/white"
-        android:pathData="@string/path_password_eye"/>
-
+        android:fillColor="#FF000000"
+        android:pathData="M4.02,42.0L46.0,24.0 4.02,6.0 4.0,20.0l30.0,4.0 -30.0,4.0z"/>
 </vector>
\ No newline at end of file
diff --git a/design/res/drawable/design_fab_background.xml b/slices/view/src/main/res/drawable/abc_slice_remote_input_bg.xml
similarity index 77%
rename from design/res/drawable/design_fab_background.xml
rename to slices/view/src/main/res/drawable/abc_slice_remote_input_bg.xml
index 43afd5c..64ac7bf 100644
--- a/design/res/drawable/design_fab_background.xml
+++ b/slices/view/src/main/res/drawable/abc_slice_remote_input_bg.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2015 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,9 +13,10 @@
   ~ 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.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-        android:shape="oval">
-    <solid android:color="@android:color/white" />
-</shape>
\ No newline at end of file
+  -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#ff6c6c6c" />
+    <corners
+        android:bottomRightRadius="16dp"
+        android:bottomLeftRadius="16dp"/>
+</shape>
diff --git a/design/res/drawable-v21/design_bottom_navigation_item_background.xml b/slices/view/src/main/res/drawable/abc_slice_ripple_drawable.xml
similarity index 78%
rename from design/res/drawable-v21/design_bottom_navigation_item_background.xml
rename to slices/view/src/main/res/drawable/abc_slice_ripple_drawable.xml
index f30f08b..22239f3 100644
--- a/design/res/drawable-v21/design_bottom_navigation_item_background.xml
+++ b/slices/view/src/main/res/drawable/abc_slice_ripple_drawable.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -16,4 +16,6 @@
   -->
 
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
-        android:color="?attr/colorPrimary" />
\ No newline at end of file
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:targetApi="24"
+    android:color="?android:attr/colorControlHighlight" />
diff --git a/slices/view/src/main/res/layout-v21/abc_slice_small_template.xml b/slices/view/src/main/res/layout-v21/abc_slice_small_template.xml
new file mode 100644
index 0000000..7707dae
--- /dev/null
+++ b/slices/view/src/main/res/layout-v21/abc_slice_small_template.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="@dimen/abc_slice_row_min_height"
+    android:maxHeight="@dimen/abc_slice_row_max_height"
+    android:gravity="center_vertical"
+    android:background="?android:attr/activatedBackgroundIndicator"
+    android:clipToPadding="false">
+
+    <LinearLayout
+        android:id="@+id/icon_frame"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="start|center_vertical"
+        android:orientation="horizontal"
+        android:paddingEnd="12dp"
+        android:paddingTop="4dp"
+        android:paddingBottom="4dp"/>
+
+    <LinearLayout
+        android:id="@android:id/content"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:gravity="center_vertical"
+        android:orientation="vertical">
+
+        <TextView android:id="@android:id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:maxLines="2"
+            android:textAppearance="?android:attr/textAppearanceListItem" />
+
+        <TextView android:id="@android:id/summary"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignStart="@android:id/title"
+            android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+            android:textColor="?android:attr/textColorSecondary"
+            android:maxLines="10" />
+
+        <SeekBar
+            android:id="@+id/seek_bar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:visibility="gone" />
+
+        <ProgressBar
+            android:id="@+id/progress_bar"
+            style="?android:attr/progressBarStyleHorizontal"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:visibility="gone" />
+
+    </LinearLayout>
+
+    <View
+        android:id="@+id/divider"
+        android:layout_width="1dp"
+        android:layout_height="match_parent"
+        android:layout_marginTop="8dp"
+        android:layout_marginBottom="8dp"
+        android:background="?android:attr/listDivider"
+        android:visibility="gone"/>
+
+    <LinearLayout android:id="@android:id/widget_frame"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="end|center_vertical"
+        android:orientation="horizontal" />
+
+</LinearLayout>
diff --git a/design/tests/res/layout/design_appbar_with_scrollbars.xml b/slices/view/src/main/res/layout/abc_slice_grid.xml
similarity index 65%
copy from design/tests/res/layout/design_appbar_with_scrollbars.xml
copy to slices/view/src/main/res/layout/abc_slice_grid.xml
index 6c89a2a..890f77d 100644
--- a/design/tests/res/layout/design_appbar_with_scrollbars.xml
+++ b/slices/view/src/main/res/layout/abc_slice_grid.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -14,9 +14,12 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-
-<android.support.design.widget.AppBarLayout
+<androidx.app.slice.widget.GridRowView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="200dp"
-    android:theme="@style/AppBarWithScrollbars"/>
\ No newline at end of file
+    android:layout_height="wrap_content"
+    android:minHeight="@dimen/abc_slice_grid_image_only_height"
+    android:gravity="center_vertical"
+    android:background="?android:attr/activatedBackgroundIndicator"
+    android:clipToPadding="false">
+</androidx.app.slice.widget.GridRowView>
diff --git a/slices/view/src/main/res/layout/abc_slice_message.xml b/slices/view/src/main/res/layout/abc_slice_message.xml
new file mode 100644
index 0000000..9e1fa62
--- /dev/null
+++ b/slices/view/src/main/res/layout/abc_slice_message.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<androidx.app.slice.widget.MessageView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingTop="12dp"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:background="?android:attr/activatedBackgroundIndicator"
+    android:clipToPadding="false">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <LinearLayout
+            android:id="@+id/abc_icon_frame"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="-4dp"
+            android:gravity="start|center_vertical"
+            android:orientation="horizontal"
+            android:paddingEnd="12dp"
+            android:paddingTop="4dp"
+            android:paddingBottom="4dp">
+            <!-- TODO: Support text source -->
+            <ImageView
+                android:id="@android:id/icon"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:maxWidth="48dp"
+                android:maxHeight="48dp" />
+        </LinearLayout>
+
+        <TextView android:id="@android:id/summary"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignStart="@android:id/title"
+            android:textAppearance="?android:attr/textAppearanceListItem"
+            android:maxLines="10" />
+
+    </LinearLayout>
+</androidx.app.slice.widget.MessageView>
diff --git a/slices/view/src/main/res/layout/abc_slice_message_local.xml b/slices/view/src/main/res/layout/abc_slice_message_local.xml
new file mode 100644
index 0000000..d35bd60
--- /dev/null
+++ b/slices/view/src/main/res/layout/abc_slice_message_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<androidx.app.slice.widget.MessageView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:gravity="center_vertical|end"
+    android:paddingTop="12dp"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:background="?android:attr/activatedBackgroundIndicator"
+    android:clipToPadding="false">
+
+    <TextView android:id="@android:id/summary"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignStart="@android:id/title"
+        android:layout_gravity="end"
+        android:gravity="end"
+        android:padding="8dp"
+        android:textAppearance="?android:attr/textAppearanceListItem"
+        android:background="#ffeeeeee"
+        android:maxLines="10" />
+
+</androidx.app.slice.widget.MessageView>
diff --git a/slices/view/src/main/res/layout/abc_slice_remote_input.xml b/slices/view/src/main/res/layout/abc_slice_remote_input.xml
new file mode 100644
index 0000000..293c95a
--- /dev/null
+++ b/slices/view/src/main/res/layout/abc_slice_remote_input.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<!-- LinearLayout -->
+<androidx.app.slice.widget.RemoteInputView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/remote_input"
+        android:background="@drawable/abc_slice_remote_input_bg"
+        android:layout_height="match_parent"
+        android:layout_width="match_parent">
+
+    <view class="androidx.app.slice.widget.RemoteInputView$RemoteEditText"
+            android:id="@+id/remote_input_text"
+            android:layout_height="match_parent"
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:paddingTop="2dp"
+            android:paddingBottom="4dp"
+            android:paddingStart="16dp"
+            android:paddingEnd="12dp"
+            android:gravity="start|center_vertical"
+            android:textAppearance="?android:attr/textAppearance"
+            android:textColor="#FFFFFFFF"
+            android:textColorHint="#99ffffff"
+            android:textSize="16sp"
+            android:background="@null"
+            android:singleLine="true"
+            android:ellipsize="start"
+            android:inputType="textShortMessage|textAutoCorrect|textCapSentences"
+            android:imeOptions="actionSend|flagNoExtractUi|flagNoFullscreen" />
+
+    <FrameLayout
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_gravity="center_vertical">
+
+        <ImageButton
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:paddingStart="12dp"
+                android:paddingEnd="24dp"
+                android:paddingTop="16dp"
+                android:paddingBottom="16dp"
+                android:id="@+id/remote_input_send"
+                android:src="@drawable/abc_ic_slice_send"
+                android:tint="#FFFFFF"
+                android:tintMode="src_in"
+                android:background="@drawable/abc_slice_ripple_drawable" />
+
+        <ProgressBar
+                android:id="@+id/remote_input_progress"
+                android:layout_width="24dp"
+                android:layout_height="24dp"
+                android:layout_marginEnd="6dp"
+                android:layout_gravity="center"
+                android:visibility="invisible"
+                android:indeterminate="true"
+                style="?android:attr/progressBarStyleSmall" />
+
+    </FrameLayout>
+
+</androidx.app.slice.widget.RemoteInputView>
\ No newline at end of file
diff --git a/design/res/layout/design_navigation_menu.xml b/slices/view/src/main/res/layout/abc_slice_secondary_text.xml
similarity index 62%
copy from design/res/layout/design_navigation_menu.xml
copy to slices/view/src/main/res/layout/abc_slice_secondary_text.xml
index b6a0ad5..b446ddd 100644
--- a/design/res/layout/design_navigation_menu.xml
+++ b/slices/view/src/main/res/layout/abc_slice_secondary_text.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
+
 <!--
-  ~ Copyright (C) 2015 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,12 +14,13 @@
   ~ 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.
--->
-<android.support.design.internal.NavigationMenuView
+  -->
+<!-- LinearLayout -->
+<TextView
         xmlns:android="http://schemas.android.com/apk/res/android"
-        android:id="@+id/design_navigation_view"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:paddingBottom="@dimen/design_navigation_padding_bottom"
-        android:clipToPadding="false"
-        android:scrollbars="vertical"/>
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textColor="?android:attr/textColorSecondary"
+        android:gravity="center"
+        android:layout_height="wrap_content"
+        android:padding="4dp"
+        android:layout_width="match_parent" />
diff --git a/slices/view/src/main/res/layout/abc_slice_small_template.xml b/slices/view/src/main/res/layout/abc_slice_small_template.xml
new file mode 100644
index 0000000..2d5e913
--- /dev/null
+++ b/slices/view/src/main/res/layout/abc_slice_small_template.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="@dimen/abc_slice_row_min_height"
+    android:maxHeight="@dimen/abc_slice_row_max_height"
+    android:gravity="center_vertical"
+    android:background="?android:attr/activatedBackgroundIndicator"
+    android:clipToPadding="false">
+
+    <LinearLayout
+        android:id="@+id/icon_frame"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="start|center_vertical"
+        android:orientation="horizontal"
+        android:paddingEnd="8dp"/>
+
+    <LinearLayout
+        android:id="@android:id/content"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:gravity="center_vertical"
+        android:orientation="vertical">
+
+        <TextView android:id="@android:id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:maxLines="2"/>
+
+        <TextView android:id="@android:id/summary"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignStart="@android:id/title"
+            android:maxLines="10" />
+
+        <SeekBar
+            android:id="@+id/seek_bar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:visibility="gone" />
+
+        <ProgressBar
+            android:id="@+id/progress_bar"
+            style="?android:attr/progressBarStyleHorizontal"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:visibility="gone" />
+
+    </LinearLayout>
+
+    <View
+        android:id="@+id/divider"
+        android:layout_width="1dp"
+        android:layout_height="match_parent"
+        android:layout_marginTop="8dp"
+        android:layout_marginBottom="8dp"
+        android:background="?android:attr/listDivider"
+        android:visibility="gone"/>
+
+    <LinearLayout android:id="@android:id/widget_frame"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingStart="8dp"
+        android:gravity="end|center_vertical"
+        android:orientation="horizontal" />
+
+</LinearLayout>
diff --git a/design/res/layout/design_navigation_menu.xml b/slices/view/src/main/res/layout/abc_slice_title.xml
similarity index 62%
rename from design/res/layout/design_navigation_menu.xml
rename to slices/view/src/main/res/layout/abc_slice_title.xml
index b6a0ad5..e1bdf03 100644
--- a/design/res/layout/design_navigation_menu.xml
+++ b/slices/view/src/main/res/layout/abc_slice_title.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
+
 <!--
-  ~ Copyright (C) 2015 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,12 +14,13 @@
   ~ 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.
--->
-<android.support.design.internal.NavigationMenuView
+  -->
+
+<TextView
         xmlns:android="http://schemas.android.com/apk/res/android"
-        android:id="@+id/design_navigation_view"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:paddingBottom="@dimen/design_navigation_padding_bottom"
-        android:clipToPadding="false"
-        android:scrollbars="vertical"/>
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:textColor="?android:attr/textColorPrimary"
+        android:gravity="center"
+        android:layout_height="wrap_content"
+        android:padding="4dp"
+        android:layout_width="match_parent" />
diff --git a/slices/view/src/main/res/values/attrs.xml b/slices/view/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..5779d31
--- /dev/null
+++ b/slices/view/src/main/res/values/attrs.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+<resources>
+    <declare-styleable name="SliceView">
+        <!-- Colors -->
+        <attr name="titleColor" format="color" />
+        <attr name="subtitleColor" format="color" />
+        <attr name="tintColor" format="color" />
+
+        <!-- Text sizes -->
+        <attr name="headerTitleSize" format="dimension" />
+        <attr name="headerSubtitleSize" format="dimension"/>
+        <attr name="titleSize" format="dimension" />
+        <attr name="subtitleSize" format="dimension" />
+        <attr name="gridTitleSize" format="dimension" />
+        <attr name="gridSubtitleSize" format="dimension" />
+    </declare-styleable>
+
+    <attr name="sliceViewStyle" format="reference"/>
+</resources>
\ No newline at end of file
diff --git a/slices/view/src/main/res/values/dimens.xml b/slices/view/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..ff2fb97
--- /dev/null
+++ b/slices/view/src/main/res/values/dimens.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<resources>
+    <!-- General -->
+    <!-- Size of normal icons / images in a slice -->
+    <dimen name="abc_slice_icon_size">24dp</dimen>
+    <!-- Size of large icons / images in a slice -->
+    <dimen name="abc_slice_large_icon_size">48dp</dimen>
+    <!-- Standard padding used in a slice -->
+    <dimen name="abc_slice_padding">16dp</dimen>
+
+    <!-- Size of a slice shortcut view -->
+    <dimen name="abc_slice_shortcut_size">56dp</dimen>
+
+    <!-- Height of a large template -->
+    <dimen name="abc_slice_large_height">240dp</dimen>
+
+    <!-- Row view sizes-->
+    <!-- Min height of row view; default size if one line of text -->
+    <dimen name="abc_slice_row_min_height">48dp</dimen>
+    <!-- Max height of row view; default size if two lines of text -->
+    <dimen name="abc_slice_row_max_height">60dp</dimen>
+    <!-- Min height of a row showing an input field that is active -->
+    <dimen name="abc_slice_row_active_input_height">120dp</dimen>
+
+    <!-- Grid view sizes-->
+    <!-- Height of a grid row displaying only images -->
+    <dimen name="abc_slice_grid_image_only_height">86dp</dimen>
+    <!-- Height of a grid row showing text and images -->
+    <dimen name="abc_slice_grid_height">120dp</dimen>
+    <!-- Height of expanded grid row if showing a single large image -->
+    <dimen name="abc_slice_grid_big_picture_height">180dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/design/res/values-land/styles.xml b/slices/view/src/main/res/values/strings.xml
similarity index 67%
rename from design/res/values-land/styles.xml
rename to slices/view/src/main/res/values/strings.xml
index 622a5e3..b72c986 100644
--- a/design/res/values-land/styles.xml
+++ b/slices/view/src/main/res/values/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2015 The Android Open Source Project
+  ~ Copyright 2017 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,13 +13,9 @@
   ~ 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.
--->
-<resources>
+  -->
 
-    <style name="Widget.Design.TabLayout" parent="Base.Widget.Design.TabLayout">
-        <item name="tabGravity">center</item>
-        <item name="tabMode">fixed</item>
-    </style>
-
-</resources>
-
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Format string for indicating there is more content in a slice view -->
+    <string name="abc_slice_more_content">+ <xliff:g id="number" example="5">%1$d</xliff:g></string>
+</resources>
\ No newline at end of file
diff --git a/slices/view/src/main/res/values/styles.xml b/slices/view/src/main/res/values/styles.xml
new file mode 100644
index 0000000..4b27820
--- /dev/null
+++ b/slices/view/src/main/res/values/styles.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+<resources>
+    <style name="Widget.SliceView" parent="">
+        <item name="tintColor">@null</item>
+        <!-- Colors -->
+        <item name="titleColor">?android:attr/textColorPrimary</item>
+        <item name="subtitleColor">?android:attr/textColorSecondary</item>
+
+        <!-- Text sizes -->
+        <item name="headerTitleSize">16sp</item>
+        <item name="headerSubtitleSize">14sp</item>
+        <item name="titleSize">14sp</item>
+        <item name="subtitleSize">14sp</item>
+        <item name="gridTitleSize">12sp</item>
+        <item name="gridSubtitleSize">12sp</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/textclassifier/OWNERS b/textclassifier/OWNERS
new file mode 100644
index 0000000..6975b76
--- /dev/null
+++ b/textclassifier/OWNERS
@@ -0,0 +1,3 @@
+clarabayarri@google.com
+toki@google.com
+jalt@google.com
diff --git a/textclassifier/api/current.txt b/textclassifier/api/current.txt
new file mode 100644
index 0000000..6dad352
--- /dev/null
+++ b/textclassifier/api/current.txt
@@ -0,0 +1,138 @@
+package androidx.view.textclassifier {
+
+  public final class TextClassification implements android.os.Parcelable {
+    method public int describeContents();
+    method public float getConfidenceScore(java.lang.String);
+    method public java.lang.String getEntity(int);
+    method public int getEntityCount();
+    method public android.graphics.drawable.Drawable getIcon();
+    method public android.content.Intent getIntent();
+    method public java.lang.CharSequence getLabel();
+    method public int getSecondaryActionsCount();
+    method public android.graphics.drawable.Drawable getSecondaryIcon(int);
+    method public android.content.Intent getSecondaryIntent(int);
+    method public java.lang.CharSequence getSecondaryLabel(int);
+    method public java.lang.String getSignature();
+    method public java.lang.String getText();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.view.textclassifier.TextClassification> CREATOR;
+  }
+
+  public static final class TextClassification.Builder {
+    ctor public TextClassification.Builder();
+    method public androidx.view.textclassifier.TextClassification.Builder addSecondaryAction(android.content.Intent, java.lang.String, android.graphics.drawable.Drawable);
+    method public androidx.view.textclassifier.TextClassification build();
+    method public androidx.view.textclassifier.TextClassification.Builder clearSecondaryActions();
+    method public androidx.view.textclassifier.TextClassification.Builder setEntityType(java.lang.String, float);
+    method public androidx.view.textclassifier.TextClassification.Builder setIcon(android.graphics.drawable.Drawable);
+    method public androidx.view.textclassifier.TextClassification.Builder setIntent(android.content.Intent);
+    method public androidx.view.textclassifier.TextClassification.Builder setLabel(java.lang.String);
+    method public androidx.view.textclassifier.TextClassification.Builder setPrimaryAction(android.content.Intent, java.lang.String, android.graphics.drawable.Drawable);
+    method public androidx.view.textclassifier.TextClassification.Builder setSignature(java.lang.String);
+    method public androidx.view.textclassifier.TextClassification.Builder setText(java.lang.String);
+  }
+
+  public static final class TextClassification.Options implements android.os.Parcelable {
+    ctor public TextClassification.Options();
+    method public int describeContents();
+    method public android.support.v4.os.LocaleListCompat getDefaultLocales();
+    method public java.util.Calendar getReferenceTime();
+    method public androidx.view.textclassifier.TextClassification.Options setDefaultLocales(android.support.v4.os.LocaleListCompat);
+    method public androidx.view.textclassifier.TextClassification.Options setReferenceTime(java.util.Calendar);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.view.textclassifier.TextClassification.Options> CREATOR;
+  }
+
+  public class TextClassifier {
+    ctor public TextClassifier();
+    field public static final java.lang.String TYPE_ADDRESS = "address";
+    field public static final java.lang.String TYPE_EMAIL = "email";
+    field public static final java.lang.String TYPE_OTHER = "other";
+    field public static final java.lang.String TYPE_PHONE = "phone";
+    field public static final java.lang.String TYPE_UNKNOWN = "";
+    field public static final java.lang.String TYPE_URL = "url";
+  }
+
+  public final class TextLinks implements android.os.Parcelable {
+    method public int apply(android.text.Spannable, int, androidx.view.textclassifier.TextLinks.SpanFactory);
+    method public int describeContents();
+    method public java.util.Collection<androidx.view.textclassifier.TextLinks.TextLink> getLinks();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final int APPLY_STRATEGY_IGNORE = 0; // 0x0
+    field public static final int APPLY_STRATEGY_REPLACE = 1; // 0x1
+    field public static final android.os.Parcelable.Creator<androidx.view.textclassifier.TextLinks> CREATOR;
+    field public static final int STATUS_DIFFERENT_TEXT = 3; // 0x3
+    field public static final int STATUS_LINKS_APPLIED = 0; // 0x0
+    field public static final int STATUS_NO_LINKS_APPLIED = 2; // 0x2
+    field public static final int STATUS_NO_LINKS_FOUND = 1; // 0x1
+  }
+
+  public static final class TextLinks.Builder {
+    ctor public TextLinks.Builder(java.lang.String);
+    method public androidx.view.textclassifier.TextLinks.Builder addLink(int, int, java.util.Map<java.lang.String, java.lang.Float>);
+    method public androidx.view.textclassifier.TextLinks build();
+    method public androidx.view.textclassifier.TextLinks.Builder clearTextLinks();
+  }
+
+  public static final class TextLinks.Options implements android.os.Parcelable {
+    ctor public TextLinks.Options();
+    method public int describeContents();
+    method public int getApplyStrategy();
+    method public android.support.v4.os.LocaleListCompat getDefaultLocales();
+    method public androidx.view.textclassifier.TextClassifier.EntityConfig getEntityConfig();
+    method public androidx.view.textclassifier.TextLinks.SpanFactory getSpanFactory();
+    method public androidx.view.textclassifier.TextLinks.Options setApplyStrategy(int);
+    method public androidx.view.textclassifier.TextLinks.Options setDefaultLocales(android.support.v4.os.LocaleListCompat);
+    method public androidx.view.textclassifier.TextLinks.Options setEntityConfig(androidx.view.textclassifier.TextClassifier.EntityConfig);
+    method public androidx.view.textclassifier.TextLinks.Options setSpanFactory(androidx.view.textclassifier.TextLinks.SpanFactory);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.view.textclassifier.TextLinks.Options> CREATOR;
+  }
+
+  public static final class TextLinks.TextLink implements android.os.Parcelable {
+    method public int describeContents();
+    method public float getConfidenceScore(java.lang.String);
+    method public int getEnd();
+    method public java.lang.String getEntity(int);
+    method public int getEntityCount();
+    method public int getStart();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.view.textclassifier.TextLinks.TextLink> CREATOR;
+  }
+
+  public static class TextLinks.TextLinkSpan extends android.text.style.ClickableSpan {
+    ctor public TextLinks.TextLinkSpan(androidx.view.textclassifier.TextLinks.TextLink);
+    method public final androidx.view.textclassifier.TextLinks.TextLink getTextLink();
+    method public void onClick(android.view.View);
+  }
+
+  public final class TextSelection implements android.os.Parcelable {
+    method public int describeContents();
+    method public float getConfidenceScore(java.lang.String);
+    method public java.lang.String getEntity(int);
+    method public int getEntityCount();
+    method public int getSelectionEndIndex();
+    method public int getSelectionStartIndex();
+    method public java.lang.String getSignature();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.view.textclassifier.TextSelection> CREATOR;
+  }
+
+  public static final class TextSelection.Builder {
+    ctor public TextSelection.Builder(int, int);
+    method public androidx.view.textclassifier.TextSelection build();
+    method public androidx.view.textclassifier.TextSelection.Builder setEntityType(java.lang.String, float);
+    method public androidx.view.textclassifier.TextSelection.Builder setSignature(java.lang.String);
+  }
+
+  public static final class TextSelection.Options implements android.os.Parcelable {
+    ctor public TextSelection.Options();
+    method public int describeContents();
+    method public android.support.v4.os.LocaleListCompat getDefaultLocales();
+    method public androidx.view.textclassifier.TextSelection.Options setDefaultLocales(android.support.v4.os.LocaleListCompat);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.view.textclassifier.TextSelection.Options> CREATOR;
+  }
+
+}
+
diff --git a/textclassifier/build.gradle b/textclassifier/build.gradle
new file mode 100644
index 0000000..b01cbbf
--- /dev/null
+++ b/textclassifier/build.gradle
@@ -0,0 +1,26 @@
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    api(project(":appcompat-v7"))
+    api(project(":support-annotations"))
+    api(project(":support-v4"))
+
+    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(ESPRESSO_CORE)
+}
+
+supportLibrary {
+    name = "Android TextClassifier Support Library"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
+    inceptionYear = "2018"
+    description = "The TextClassifier Support Library can be added to an Android application in order to use the TextClassifier API introduced in Android O on all devices with API level 14 or later."
+    minSdkVersion = 14
+}
diff --git a/textclassifier/res/values/strings.xml b/textclassifier/res/values/strings.xml
new file mode 100644
index 0000000..321190e
--- /dev/null
+++ b/textclassifier/res/values/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 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.
+-->
+<resources>
+</resources>
diff --git a/design/res/drawable/design_fab_background.xml b/textclassifier/src/androidTest/AndroidManifest.xml
similarity index 70%
copy from design/res/drawable/design_fab_background.xml
copy to textclassifier/src/androidTest/AndroidManifest.xml
index 43afd5c..0a7045c 100644
--- a/design/res/drawable/design_fab_background.xml
+++ b/textclassifier/src/androidTest/AndroidManifest.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2015 The Android Open Source Project
+  ~ Copyright (C) 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.
@@ -13,9 +13,8 @@
   ~ 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.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-        android:shape="oval">
-    <solid android:color="@android:color/white" />
-</shape>
\ No newline at end of file
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="androidx.textclassifier.test">
+    <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
+</manifest>
diff --git a/design/tests/NO_DOCS b/textclassifier/src/androidTest/NO_DOCS
similarity index 92%
rename from design/tests/NO_DOCS
rename to textclassifier/src/androidTest/NO_DOCS
index 0c81e4a..ece084d 100644
--- a/design/tests/NO_DOCS
+++ b/textclassifier/src/androidTest/NO_DOCS
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 The Android Open Source Project
+# Copyright (C) 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.
diff --git a/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextClassificationTest.java b/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextClassificationTest.java
new file mode 100644
index 0000000..8ae65ac
--- /dev/null
+++ b/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextClassificationTest.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 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.view.textclassifier;
+
+import static org.junit.Assert.assertEquals;
+
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Color;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Parcel;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.os.LocaleListCompat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.TimeZone;
+
+/** Instrumentation unit tests for {@link TextClassification}. */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public final class TextClassificationTest {
+    public BitmapDrawable generateTestDrawable(int width, int height, int colorValue) {
+        final int numPixels = width * height;
+        final int[] colors = new int[numPixels];
+        for (int i = 0; i < numPixels; ++i) {
+            colors[i] = colorValue;
+        }
+        final Bitmap bitmap = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888);
+        final BitmapDrawable drawable = new BitmapDrawable(null, bitmap);
+        drawable.setTargetDensity(bitmap.getDensity());
+        return drawable;
+    }
+
+    @Test
+    public void testParcel() {
+        final String text = "text";
+        final BitmapDrawable primaryIcon = generateTestDrawable(16, 16, Color.RED);
+        final String primaryLabel = "primarylabel";
+        final Intent primaryIntent = new Intent("primaryintentaction");
+        final BitmapDrawable secondaryIcon0 = generateTestDrawable(32, 288, Color.GREEN);
+        final String secondaryLabel0 = "secondarylabel0";
+        final Intent secondaryIntent0 = new Intent("secondaryintentaction0");
+        final BitmapDrawable secondaryIcon1 = generateTestDrawable(576, 288, Color.BLUE);
+        final String secondaryLabel1 = "secondaryLabel1";
+        final Intent secondaryIntent1 = null;
+        final BitmapDrawable secondaryIcon2 = null;
+        final String secondaryLabel2 = null;
+        final Intent secondaryIntent2 = new Intent("secondaryintentaction2");
+        final ColorDrawable secondaryIcon3 = new ColorDrawable(Color.CYAN);
+        final String secondaryLabel3 = null;
+        final Intent secondaryIntent3 = null;
+        final String signature = "signature";
+        final TextClassification reference = new TextClassification.Builder()
+                .setText(text)
+                .setPrimaryAction(primaryIntent, primaryLabel, primaryIcon)
+                .addSecondaryAction(null, null, null)  // ignored
+                .addSecondaryAction(secondaryIntent0, secondaryLabel0, secondaryIcon0)
+                .addSecondaryAction(secondaryIntent1, secondaryLabel1, secondaryIcon1)
+                .addSecondaryAction(secondaryIntent2, secondaryLabel2, secondaryIcon2)
+                .addSecondaryAction(secondaryIntent3, secondaryLabel3, secondaryIcon3)
+                .setEntityType(TextClassifier.TYPE_ADDRESS, 0.3f)
+                .setEntityType(TextClassifier.TYPE_PHONE, 0.7f)
+                .setSignature(signature)
+                .build();
+
+        final Parcel parcel = Parcel.obtain();
+        reference.writeToParcel(parcel, reference.describeContents());
+        parcel.setDataPosition(0);
+        final TextClassification result = TextClassification.CREATOR.createFromParcel(
+                parcel);
+
+        assertEquals(text, result.getText());
+        assertEquals(signature, result.getSignature());
+        assertEquals(4, result.getSecondaryActionsCount());
+
+        // Primary action (re-use existing icon).
+        final Bitmap resPrimaryIcon = ((BitmapDrawable) result.getIcon()).getBitmap();
+        assertEquals(primaryIcon.getBitmap().getPixel(0, 0), resPrimaryIcon.getPixel(0, 0));
+        assertEquals(16, resPrimaryIcon.getWidth());
+        assertEquals(16, resPrimaryIcon.getHeight());
+        assertEquals(primaryLabel, result.getLabel());
+        assertEquals(primaryIntent.getAction(), result.getIntent().getAction());
+
+        // Secondary action 0 (scale with  height limit).
+        final Bitmap resSecondaryIcon0 = ((BitmapDrawable) result.getSecondaryIcon(0)).getBitmap();
+        assertEquals(secondaryIcon0.getBitmap().getPixel(0, 0), resSecondaryIcon0.getPixel(0, 0));
+        assertEquals(16, resSecondaryIcon0.getWidth());
+        assertEquals(144, resSecondaryIcon0.getHeight());
+        assertEquals(secondaryLabel0, result.getSecondaryLabel(0));
+        assertEquals(secondaryIntent0.getAction(), result.getSecondaryIntent(0).getAction());
+
+        // Secondary action 1 (scale with width limit).
+        final Bitmap resSecondaryIcon1 = ((BitmapDrawable) result.getSecondaryIcon(1)).getBitmap();
+        assertEquals(secondaryIcon1.getBitmap().getPixel(0, 0), resSecondaryIcon1.getPixel(0, 0));
+        assertEquals(144, resSecondaryIcon1.getWidth());
+        assertEquals(72, resSecondaryIcon1.getHeight());
+        assertEquals(secondaryLabel1, result.getSecondaryLabel(1));
+        assertEquals(null, result.getSecondaryIntent(1));
+
+        // Secondary action 2 (no icon).
+        assertEquals(null, result.getSecondaryIcon(2));
+        assertEquals(null, result.getSecondaryLabel(2));
+        assertEquals(secondaryIntent2.getAction(), result.getSecondaryIntent(2).getAction());
+
+        // Secondary action 3 (convert non-bitmap drawable with negative size).
+        final Bitmap resSecondaryIcon3 = ((BitmapDrawable) result.getSecondaryIcon(3)).getBitmap();
+        assertEquals(secondaryIcon3.getColor(), resSecondaryIcon3.getPixel(0, 0));
+        assertEquals(1, resSecondaryIcon3.getWidth());
+        assertEquals(1, resSecondaryIcon3.getHeight());
+        assertEquals(null, result.getSecondaryLabel(3));
+        assertEquals(null, result.getSecondaryIntent(3));
+
+        // Entities.
+        assertEquals(2, result.getEntityCount());
+        assertEquals(TextClassifier.TYPE_PHONE, result.getEntity(0));
+        assertEquals(TextClassifier.TYPE_ADDRESS, result.getEntity(1));
+        assertEquals(0.7f, result.getConfidenceScore(TextClassifier.TYPE_PHONE), 1e-7f);
+        assertEquals(0.3f, result.getConfidenceScore(TextClassifier.TYPE_ADDRESS), 1e-7f);
+    }
+
+    @Test
+    public void testParcelOptions() {
+        Calendar referenceTime = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US);
+        referenceTime.setTimeInMillis(946684800000L);  // 2000-01-01 00:00:00
+        TextClassification.Options reference = new TextClassification.Options();
+        reference.setDefaultLocales(LocaleListCompat.forLanguageTags("en-US,de-DE"));
+        reference.setReferenceTime(referenceTime);
+
+        // Parcel and unparcel.
+        final Parcel parcel = Parcel.obtain();
+        reference.writeToParcel(parcel, reference.describeContents());
+        parcel.setDataPosition(0);
+        TextClassification.Options result =
+                TextClassification.Options.CREATOR.createFromParcel(parcel);
+
+        assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags());
+        assertEquals(referenceTime, result.getReferenceTime());
+    }
+}
diff --git a/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextLinksTest.java b/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextLinksTest.java
new file mode 100644
index 0000000..dadc214
--- /dev/null
+++ b/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextLinksTest.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 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.view.textclassifier;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.os.Parcel;
+import android.support.annotation.Nullable;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.os.LocaleListCompat;
+import android.support.v4.util.ArrayMap;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.style.ClickableSpan;
+import android.view.View;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/** Instrumentation unit tests for {@link TextLinks}. */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public final class TextLinksTest {
+
+    private static class NoOpSpan extends ClickableSpan {
+        @Override
+        public void onClick(View v) {
+            // Do nothing.
+        }
+    }
+
+    private static class CustomTextLinkSpan extends TextLinks.TextLinkSpan {
+        CustomTextLinkSpan(@Nullable TextLinks.TextLink textLink) {
+            super(textLink);
+        }
+    }
+
+    private static class CustomSpanFactory implements TextLinks.SpanFactory {
+        @Override
+        public TextLinks.TextLinkSpan createSpan(TextLinks.TextLink textLink) {
+            return new CustomTextLinkSpan(textLink);
+        }
+    }
+
+    private TextClassifier mClassifier;
+    private Map<String, Float> mDummyEntityScores;
+
+    @Before
+    public void setup() {
+        mClassifier = new TextClassifier();
+        mDummyEntityScores = new ArrayMap<>();
+        mDummyEntityScores.put(TextClassifier.TYPE_ADDRESS, 0.2f);
+        mDummyEntityScores.put(TextClassifier.TYPE_PHONE, 0.7f);
+        mDummyEntityScores.put(TextClassifier.TYPE_OTHER, 0.3f);
+    }
+
+    private Map<String, Float> getEntityScores(float address, float phone, float other) {
+        final Map<String, Float> result = new ArrayMap<>();
+        if (address > 0.f) {
+            result.put(TextClassifier.TYPE_ADDRESS, address);
+        }
+        if (phone > 0.f) {
+            result.put(TextClassifier.TYPE_PHONE, phone);
+        }
+        if (other > 0.f) {
+            result.put(TextClassifier.TYPE_OTHER, other);
+        }
+        return result;
+    }
+
+    @Test
+    public void testParcel() {
+        final String fullText = "this is just a test";
+        final TextLinks reference = new TextLinks.Builder(fullText)
+                .addLink(0, 4, getEntityScores(0.f, 0.f, 1.f))
+                .addLink(5, 12, getEntityScores(.8f, .1f, .5f))
+                .build();
+
+        // Parcel and unparcel.
+        final Parcel parcel = Parcel.obtain();
+        reference.writeToParcel(parcel, reference.describeContents());
+        parcel.setDataPosition(0);
+        final TextLinks result = TextLinks.CREATOR.createFromParcel(parcel);
+        final List<TextLinks.TextLink> resultList = new ArrayList<>(result.getLinks());
+
+        assertEquals(2, resultList.size());
+        assertEquals(0, resultList.get(0).getStart());
+        assertEquals(4, resultList.get(0).getEnd());
+        assertEquals(1, resultList.get(0).getEntityCount());
+        assertEquals(TextClassifier.TYPE_OTHER, resultList.get(0).getEntity(0));
+        assertEquals(1.f, resultList.get(0).getConfidenceScore(TextClassifier.TYPE_OTHER),
+                1e-7f);
+        assertEquals(5, resultList.get(1).getStart());
+        assertEquals(12, resultList.get(1).getEnd());
+        assertEquals(3, resultList.get(1).getEntityCount());
+        assertEquals(TextClassifier.TYPE_ADDRESS, resultList.get(1).getEntity(0));
+        assertEquals(TextClassifier.TYPE_OTHER, resultList.get(1).getEntity(1));
+        assertEquals(TextClassifier.TYPE_PHONE, resultList.get(1).getEntity(2));
+        assertEquals(.8f, resultList.get(1).getConfidenceScore(TextClassifier.TYPE_ADDRESS), 1e-7f);
+        assertEquals(.5f, resultList.get(1).getConfidenceScore(TextClassifier.TYPE_OTHER), 1e-7f);
+        assertEquals(.1f, resultList.get(1).getConfidenceScore(TextClassifier.TYPE_PHONE), 1e-7f);
+    }
+
+    @Test
+    public void testParcelOptions() {
+        TextClassifier.EntityConfig entityConfig = new TextClassifier.EntityConfig(
+                TextClassifier.ENTITY_PRESET_NONE);
+        entityConfig.includeEntities("a", "b", "c");
+        entityConfig.excludeEntities("b");
+        TextLinks.Options reference = new TextLinks.Options();
+        reference.setDefaultLocales(LocaleListCompat.forLanguageTags("en-US,de-DE"));
+        reference.setEntityConfig(entityConfig);
+        reference.setApplyStrategy(TextLinks.APPLY_STRATEGY_REPLACE);
+        reference.setSpanFactory(new CustomSpanFactory());
+
+        final Parcel parcel = Parcel.obtain();
+        reference.writeToParcel(parcel, reference.describeContents());
+        parcel.setDataPosition(0);
+        TextLinks.Options result = TextLinks.Options.CREATOR.createFromParcel(parcel);
+
+        assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags());
+        assertEquals(Arrays.asList("a", "c"), result.getEntityConfig().getEntities(mClassifier));
+        assertEquals(TextLinks.APPLY_STRATEGY_REPLACE, result.getApplyStrategy());
+        assertEquals(null, result.getSpanFactory());
+    }
+
+    @Test
+    public void testApplyDifferentText() {
+        SpannableString text = new SpannableString("foo");
+        TextLinks links = new TextLinks.Builder("bar").build();
+        assertEquals(links.apply(text, TextLinks.APPLY_STRATEGY_REPLACE, null),
+                TextLinks.STATUS_DIFFERENT_TEXT);
+    }
+
+    @Test
+    public void testApplyNoLinks() {
+        SpannableString text = new SpannableString("foo");
+        TextLinks links = new TextLinks.Builder(text.toString()).build();
+        assertEquals(links.apply(text, TextLinks.APPLY_STRATEGY_REPLACE, null),
+                TextLinks.STATUS_NO_LINKS_FOUND);
+    }
+
+    @Test
+    public void testApplyNoApplied() {
+        SpannableString text = new SpannableString("foo");
+        text.setSpan(new NoOpSpan(), 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+        TextLinks links = new TextLinks.Builder(text.toString()).addLink(
+                0, 3, mDummyEntityScores).build();
+        assertEquals(links.apply(text, TextLinks.APPLY_STRATEGY_IGNORE, null),
+                TextLinks.STATUS_NO_LINKS_APPLIED);
+    }
+
+    @Test
+    public void testApplyAppliedDefaultSpanFactory() {
+        SpannableString text = new SpannableString("foo");
+        TextLinks links = new TextLinks.Builder(text.toString()).addLink(
+                0, 3, mDummyEntityScores).build();
+        assertEquals(links.apply(text, TextLinks.APPLY_STRATEGY_IGNORE, null),
+                TextLinks.STATUS_LINKS_APPLIED);
+        TextLinks.TextLinkSpan[] spans = text.getSpans(0, 3, TextLinks.TextLinkSpan.class);
+        assertEquals(spans.length, 1);
+        assertTrue(links.getLinks().contains(spans[0].getTextLink()));
+    }
+
+    @Test
+    public void testApplyAppliedDefaultSpanFactoryReplace() {
+        SpannableString text = new SpannableString("foo");
+        text.setSpan(new NoOpSpan(), 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+        TextLinks links = new TextLinks.Builder(text.toString()).addLink(
+                0, 3, mDummyEntityScores).build();
+        assertEquals(links.apply(text, TextLinks.APPLY_STRATEGY_REPLACE, null),
+                TextLinks.STATUS_LINKS_APPLIED);
+        TextLinks.TextLinkSpan[] spans = text.getSpans(0, 3, TextLinks.TextLinkSpan.class);
+        assertEquals(spans.length, 1);
+        assertTrue(links.getLinks().contains(spans[0].getTextLink()));
+    }
+
+    @Test
+    public void testApplyAppliedCustomSpanFactory() {
+        SpannableString text = new SpannableString("foo");
+        TextLinks links = new TextLinks.Builder(text.toString()).addLink(
+                0, 3, mDummyEntityScores).build();
+        assertEquals(links.apply(text, TextLinks.APPLY_STRATEGY_IGNORE, new CustomSpanFactory()),
+                TextLinks.STATUS_LINKS_APPLIED);
+        CustomTextLinkSpan[] spans = text.getSpans(0, 3, CustomTextLinkSpan.class);
+        assertEquals(spans.length, 1);
+        assertTrue(links.getLinks().contains(spans[0].getTextLink()));
+    }
+}
diff --git a/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextSelectionTest.java b/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextSelectionTest.java
new file mode 100644
index 0000000..33a227b
--- /dev/null
+++ b/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextSelectionTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 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.view.textclassifier;
+
+import static org.junit.Assert.assertEquals;
+
+import android.os.Parcel;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.os.LocaleListCompat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/** Instrumentation unit tests for {@link TextSelection}. */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public final class TextSelectionTest {
+    @Test
+    public void testParcel() {
+        final int startIndex = 13;
+        final int endIndex = 37;
+        final String signature = "signature";
+        final TextSelection reference = new TextSelection.Builder(startIndex, endIndex)
+                .setEntityType(TextClassifier.TYPE_ADDRESS, 0.3f)
+                .setEntityType(TextClassifier.TYPE_PHONE, 0.7f)
+                .setEntityType(TextClassifier.TYPE_URL, 0.1f)
+                .setSignature(signature)
+                .build();
+
+        final Parcel parcel = Parcel.obtain();
+        reference.writeToParcel(parcel, reference.describeContents());
+        parcel.setDataPosition(0);
+        final TextSelection result = TextSelection.CREATOR.createFromParcel(parcel);
+
+        assertEquals(startIndex, result.getSelectionStartIndex());
+        assertEquals(endIndex, result.getSelectionEndIndex());
+        assertEquals(signature, result.getSignature());
+
+        assertEquals(3, result.getEntityCount());
+        assertEquals(TextClassifier.TYPE_PHONE, result.getEntity(0));
+        assertEquals(TextClassifier.TYPE_ADDRESS, result.getEntity(1));
+        assertEquals(TextClassifier.TYPE_URL, result.getEntity(2));
+        assertEquals(0.7f, result.getConfidenceScore(TextClassifier.TYPE_PHONE), 1e-7f);
+        assertEquals(0.3f, result.getConfidenceScore(TextClassifier.TYPE_ADDRESS), 1e-7f);
+        assertEquals(0.1f, result.getConfidenceScore(TextClassifier.TYPE_URL), 1e-7f);
+    }
+
+    @Test
+    public void testParcelOptions() {
+        TextSelection.Options reference = new TextSelection.Options();
+        reference.setDefaultLocales(LocaleListCompat.forLanguageTags("en-US,de-DE"));
+
+        // Parcel and unparcel.
+        final Parcel parcel = Parcel.obtain();
+        reference.writeToParcel(parcel, reference.describeContents());
+        parcel.setDataPosition(0);
+        TextSelection.Options result = TextSelection.Options.CREATOR.createFromParcel(
+                parcel);
+
+        assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags());
+    }
+}
diff --git a/design/AndroidManifest.xml b/textclassifier/src/main/AndroidManifest.xml
similarity index 87%
rename from design/AndroidManifest.xml
rename to textclassifier/src/main/AndroidManifest.xml
index 0eb8b85..8526cbb 100644
--- a/design/AndroidManifest.xml
+++ b/textclassifier/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source Project
+<!-- Copyright (C) 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.
@@ -14,6 +14,6 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="android.support.design">
+          package="androidx.view.textclassifier">
     <uses-sdk android:minSdkVersion="14" />
 </manifest>
diff --git a/textclassifier/src/main/java/androidx/view/textclassifier/EntityConfidence.java b/textclassifier/src/main/java/androidx/view/textclassifier/EntityConfidence.java
new file mode 100644
index 0000000..7434a20
--- /dev/null
+++ b/textclassifier/src/main/java/androidx/view/textclassifier/EntityConfidence.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 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.view.textclassifier;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.annotation.FloatRange;
+import android.support.annotation.NonNull;
+import android.support.annotation.RestrictTo;
+import android.support.v4.util.ArrayMap;
+import android.support.v4.util.Preconditions;
+import android.support.v4.util.SimpleArrayMap;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Helper object for setting and getting entity scores for classified text.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+final class EntityConfidence implements Parcelable {
+
+    private final ArrayMap<String, Float> mEntityConfidence = new ArrayMap<>();
+    private final ArrayList<String> mSortedEntities = new ArrayList<>();
+
+    EntityConfidence() {}
+
+    EntityConfidence(@NonNull EntityConfidence source) {
+        Preconditions.checkNotNull(source);
+        mEntityConfidence.putAll((SimpleArrayMap<String, Float>) source.mEntityConfidence);
+        mSortedEntities.addAll(source.mSortedEntities);
+    }
+
+    /**
+     * Constructs an EntityConfidence from a map of entity to confidence.
+     *
+     * Map entries that have 0 confidence are removed, and values greater than 1 are clamped to 1.
+     *
+     * @param source a map from entity to a confidence value in the range 0 (low confidence) to
+     *               1 (high confidence).
+     */
+    EntityConfidence(@NonNull Map<String, Float> source) {
+        Preconditions.checkNotNull(source);
+
+        // Prune non-existent entities and clamp to 1.
+        mEntityConfidence.ensureCapacity(source.size());
+        for (Map.Entry<String, Float> it : source.entrySet()) {
+            if (it.getValue() <= 0) continue;
+            mEntityConfidence.put(it.getKey(), Math.min(1, it.getValue()));
+        }
+        resetSortedEntitiesFromMap();
+    }
+
+    /**
+     * Returns an immutable list of entities found in the classified text ordered from
+     * high confidence to low confidence.
+     */
+    @NonNull
+    public List<String> getEntities() {
+        return Collections.unmodifiableList(mSortedEntities);
+    }
+
+    /**
+     * Returns the confidence score for the specified entity. The value ranges from
+     * 0 (low confidence) to 1 (high confidence). 0 indicates that the entity was not found for the
+     * classified text.
+     */
+    @FloatRange(from = 0.0, to = 1.0)
+    public float getConfidenceScore(String entity) {
+        if (mEntityConfidence.containsKey(entity)) {
+            return mEntityConfidence.get(entity);
+        }
+        return 0;
+    }
+
+    @Override
+    public String toString() {
+        return mEntityConfidence.toString();
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(mEntityConfidence.size());
+        for (Map.Entry<String, Float> entry : mEntityConfidence.entrySet()) {
+            dest.writeString(entry.getKey());
+            dest.writeFloat(entry.getValue());
+        }
+    }
+
+    public static final Parcelable.Creator<EntityConfidence> CREATOR =
+            new Parcelable.Creator<EntityConfidence>() {
+                @Override
+                public EntityConfidence createFromParcel(Parcel in) {
+                    return new EntityConfidence(in);
+                }
+
+                @Override
+                public EntityConfidence[] newArray(int size) {
+                    return new EntityConfidence[size];
+                }
+            };
+
+    private EntityConfidence(Parcel in) {
+        final int numEntities = in.readInt();
+        mEntityConfidence.ensureCapacity(numEntities);
+        for (int i = 0; i < numEntities; ++i) {
+            mEntityConfidence.put(in.readString(), in.readFloat());
+        }
+        resetSortedEntitiesFromMap();
+    }
+
+    private void resetSortedEntitiesFromMap() {
+        mSortedEntities.clear();
+        mSortedEntities.ensureCapacity(mEntityConfidence.size());
+        mSortedEntities.addAll(mEntityConfidence.keySet());
+        Collections.sort(mSortedEntities, new EntityConfidenceComparator());
+    }
+
+    /** Helper to sort entities according to their confidence. */
+    private class EntityConfidenceComparator implements Comparator<String> {
+        @Override
+        public int compare(String e1, String e2) {
+            float score1 = mEntityConfidence.get(e1);
+            float score2 = mEntityConfidence.get(e2);
+            return Float.compare(score2, score1);
+        }
+    }
+}
diff --git a/textclassifier/src/main/java/androidx/view/textclassifier/TextClassification.java b/textclassifier/src/main/java/androidx/view/textclassifier/TextClassification.java
new file mode 100644
index 0000000..799618a
--- /dev/null
+++ b/textclassifier/src/main/java/androidx/view/textclassifier/TextClassification.java
@@ -0,0 +1,619 @@
+/*
+ * Copyright (C) 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.view.textclassifier;
+
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.annotation.FloatRange;
+import android.support.annotation.IntRange;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.support.v4.os.LocaleListCompat;
+import android.support.v4.util.ArrayMap;
+import android.support.v4.util.Preconditions;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import androidx.view.textclassifier.TextClassifier.EntityType;
+
+/**
+ * Information for generating a widget to handle classified text.
+ *
+ * <p>A TextClassification object contains icons, labels, and intents that may be used to build a
+ * widget that can be used to act on classified text. There is the concept of a <i>primary
+ * action</i> and other <i>secondary actions</i>.
+ *
+ * <p>e.g. building a view that, when clicked, shares the classified text with the preferred app:
+ *
+ * <pre>{@code
+ *   // Called preferably outside the UiThread.
+ *   TextClassification classification = textClassifier.classifyText(allText, 10, 25);
+ *
+ *   // Called on the UiThread.
+ *   Button button = new Button(context);
+ *   button.setCompoundDrawablesWithIntrinsicBounds(classification.getIcon(), null, null, null);
+ *   button.setText(classification.getLabel());
+ *   button.setOnClickListener(v -> context.startActivity(classification.getIntent()));
+ * }</pre>
+ *
+ * TODO: describe how to start action mode for classified text.
+ */
+public final class TextClassification implements Parcelable {
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    static final TextClassification EMPTY = new TextClassification.Builder().build();
+
+    // TODO: investigate a way to derive this based on device properties.
+    private static final int MAX_PRIMARY_ICON_SIZE = 192;
+    private static final int MAX_SECONDARY_ICON_SIZE = 144;
+
+    @Nullable private final String mText;
+    @Nullable private final Drawable mPrimaryIcon;
+    @Nullable private final String mPrimaryLabel;
+    @Nullable private final Intent mPrimaryIntent;
+    @NonNull private final List<Drawable> mSecondaryIcons;
+    @NonNull private final List<String> mSecondaryLabels;
+    @NonNull private final List<Intent> mSecondaryIntents;
+    @NonNull private final EntityConfidence mEntityConfidence;
+    @NonNull private final String mSignature;
+
+    private TextClassification(
+            @Nullable String text,
+            @Nullable Drawable primaryIcon,
+            @Nullable String primaryLabel,
+            @Nullable Intent primaryIntent,
+            @NonNull List<Drawable> secondaryIcons,
+            @NonNull List<String> secondaryLabels,
+            @NonNull List<Intent> secondaryIntents,
+            @NonNull Map<String, Float> entityConfidence,
+            @NonNull String signature) {
+        Preconditions.checkArgument(secondaryLabels.size() == secondaryIntents.size());
+        Preconditions.checkArgument(secondaryIcons.size() == secondaryIntents.size());
+        mText = text;
+        mPrimaryIcon = primaryIcon;
+        mPrimaryLabel = primaryLabel;
+        mPrimaryIntent = primaryIntent;
+        mSecondaryIcons = secondaryIcons;
+        mSecondaryLabels = secondaryLabels;
+        mSecondaryIntents = secondaryIntents;
+        mEntityConfidence = new EntityConfidence(entityConfidence);
+        mSignature = signature;
+    }
+
+    /**
+     * Gets the classified text.
+     */
+    @Nullable
+    public String getText() {
+        return mText;
+    }
+
+    /**
+     * Returns the number of entities found in the classified text.
+     */
+    @IntRange(from = 0)
+    public int getEntityCount() {
+        return mEntityConfidence.getEntities().size();
+    }
+
+    /**
+     * Returns the entity at the specified index. Entities are ordered from high confidence
+     * to low confidence.
+     *
+     * @throws IndexOutOfBoundsException if the specified index is out of range.
+     * @see #getEntityCount() for the number of entities available.
+     */
+    @NonNull
+    public @EntityType String getEntity(int index) {
+        return mEntityConfidence.getEntities().get(index);
+    }
+
+    /**
+     * Returns the confidence score for the specified entity. The value ranges from
+     * 0 (low confidence) to 1 (high confidence). 0 indicates that the entity was not found for the
+     * classified text.
+     */
+    @FloatRange(from = 0.0, to = 1.0)
+    public float getConfidenceScore(@EntityType String entity) {
+        return mEntityConfidence.getConfidenceScore(entity);
+    }
+
+    /**
+     * Returns the number of <i>secondary</i> actions that are available to act on the classified
+     * text.
+     *
+     * <p><strong>Note: </strong> that there may or may not be a <i>primary</i> action.
+     *
+     * @see #getSecondaryIntent(int)
+     * @see #getSecondaryLabel(int)
+     * @see #getSecondaryIcon(int)
+     */
+    @IntRange(from = 0)
+    public int getSecondaryActionsCount() {
+        return mSecondaryIntents.size();
+    }
+
+    /**
+     * Returns one of the <i>secondary</i> icons that maybe rendered on a widget used to act on the
+     * classified text.
+     *
+     * @param index Index of the action to get the icon for.
+     * @throws IndexOutOfBoundsException if the specified index is out of range.
+     * @see #getSecondaryActionsCount() for the number of actions available.
+     * @see #getSecondaryIntent(int)
+     * @see #getSecondaryLabel(int)
+     * @see #getIcon()
+     */
+    @Nullable
+    public Drawable getSecondaryIcon(int index) {
+        return mSecondaryIcons.get(index);
+    }
+
+    /**
+     * Returns an icon for the <i>primary</i> intent that may be rendered on a widget used to act
+     * on the classified text.
+     *
+     * @see #getSecondaryIcon(int)
+     */
+    @Nullable
+    public Drawable getIcon() {
+        return mPrimaryIcon;
+    }
+
+    /**
+     * Returns one of the <i>secondary</i> labels that may be rendered on a widget used to act on
+     * the classified text.
+     *
+     * @param index Index of the action to get the label for.
+     * @throws IndexOutOfBoundsException if the specified index is out of range.
+     * @see #getSecondaryActionsCount()
+     * @see #getSecondaryIntent(int)
+     * @see #getSecondaryIcon(int)
+     * @see #getLabel()
+     */
+    @Nullable
+    public CharSequence getSecondaryLabel(int index) {
+        return mSecondaryLabels.get(index);
+    }
+
+    /**
+     * Returns a label for the <i>primary</i> intent that may be rendered on a widget used to act
+     * on the classified text.
+     *
+     * @see #getSecondaryLabel(int)
+     */
+    @Nullable
+    public CharSequence getLabel() {
+        return mPrimaryLabel;
+    }
+
+    /**
+     * Returns one of the <i>secondary</i> intents that may be fired to act on the classified text.
+     *
+     * @param index Index of the action to get the intent for.
+     * @throws IndexOutOfBoundsException if the specified index is out of range.
+     * @see #getSecondaryActionsCount()
+     * @see #getSecondaryLabel(int)
+     * @see #getSecondaryIcon(int)
+     * @see #getIntent()
+     */
+    @Nullable
+    public Intent getSecondaryIntent(int index) {
+        return mSecondaryIntents.get(index);
+    }
+
+    /**
+     * Returns the <i>primary</i> intent that may be fired to act on the classified text.
+     *
+     * @see #getSecondaryIntent(int)
+     */
+    @Nullable
+    public Intent getIntent() {
+        return mPrimaryIntent;
+    }
+
+    /**
+     * Returns the signature for this object.
+     * The TextClassifier that generates this object may use it as a way to internally identify
+     * this object.
+     */
+    @NonNull
+    public String getSignature() {
+        return mSignature;
+    }
+
+    @Override
+    public String toString() {
+        return String.format(Locale.US, "TextClassification {"
+                        + "text=%s, entities=%s, "
+                        + "primaryLabel=%s, secondaryLabels=%s, "
+                        + "primaryIntent=%s, secondaryIntents=%s, "
+                        + "signature=%s}",
+                mText, mEntityConfidence,
+                mPrimaryLabel, mSecondaryLabels,
+                mPrimaryIntent, mSecondaryIntents,
+                mSignature);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(mText);
+        final Bitmap primaryIconBitmap = drawableToBitmap(mPrimaryIcon, MAX_PRIMARY_ICON_SIZE);
+        dest.writeInt(primaryIconBitmap != null ? 1 : 0);
+        if (primaryIconBitmap != null) {
+            primaryIconBitmap.writeToParcel(dest, flags);
+        }
+        dest.writeString(mPrimaryLabel);
+        dest.writeInt(mPrimaryIntent != null ? 1 : 0);
+        if (mPrimaryIntent != null) {
+            mPrimaryIntent.writeToParcel(dest, flags);
+        }
+        dest.writeTypedList(drawablesToBitmaps(mSecondaryIcons, MAX_SECONDARY_ICON_SIZE));
+        dest.writeStringList(mSecondaryLabels);
+        dest.writeTypedList(mSecondaryIntents);
+        mEntityConfidence.writeToParcel(dest, flags);
+        dest.writeString(mSignature);
+    }
+
+    public static final Parcelable.Creator<TextClassification> CREATOR =
+            new Parcelable.Creator<TextClassification>() {
+                @Override
+                public TextClassification createFromParcel(Parcel in) {
+                    return new TextClassification(in);
+                }
+
+                @Override
+                public TextClassification[] newArray(int size) {
+                    return new TextClassification[size];
+                }
+            };
+
+    private TextClassification(Parcel in) {
+        mText = in.readString();
+        mPrimaryIcon = in.readInt() == 0
+                ? null : new BitmapDrawable(null, Bitmap.CREATOR.createFromParcel(in));
+        mPrimaryLabel = in.readString();
+        mPrimaryIntent = in.readInt() == 0 ? null : Intent.CREATOR.createFromParcel(in);
+        mSecondaryIcons = bitmapsToDrawables(in.createTypedArrayList(Bitmap.CREATOR));
+        mSecondaryLabels = in.createStringArrayList();
+        mSecondaryIntents = in.createTypedArrayList(Intent.CREATOR);
+        mEntityConfidence = EntityConfidence.CREATOR.createFromParcel(in);
+        mSignature = in.readString();
+    }
+
+    /**
+     * Returns a Bitmap representation of the Drawable
+     *
+     * @param drawable The drawable to convert.
+     * @param maxDims The maximum edge length of the resulting bitmap (in pixels).
+     */
+    @Nullable
+    private static Bitmap drawableToBitmap(@Nullable Drawable drawable, int maxDims) {
+        if (drawable == null) {
+            return null;
+        }
+        final int actualWidth = Math.max(1, drawable.getIntrinsicWidth());
+        final int actualHeight = Math.max(1, drawable.getIntrinsicHeight());
+        final double scaleWidth = ((double) maxDims) / actualWidth;
+        final double scaleHeight = ((double) maxDims) / actualHeight;
+        final double scale = Math.min(1.0, Math.min(scaleWidth, scaleHeight));
+        final int width = (int) (actualWidth * scale);
+        final int height = (int) (actualHeight * scale);
+        if (drawable instanceof BitmapDrawable) {
+            final BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
+            if (actualWidth != width || actualHeight != height) {
+                return Bitmap.createScaledBitmap(
+                        bitmapDrawable.getBitmap(), width, height, /*filter=*/false);
+            } else {
+                return bitmapDrawable.getBitmap();
+            }
+        } else {
+            final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+            final Canvas canvas = new Canvas(bitmap);
+            drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+            drawable.draw(canvas);
+            return bitmap;
+        }
+    }
+
+    /**
+     * Returns a list of drawables converted to Bitmaps
+     *
+     * @param drawables The drawables to convert.
+     * @param maxDims The maximum edge length of the resulting bitmaps (in pixels).
+     */
+    private static List<Bitmap> drawablesToBitmaps(List<Drawable> drawables, int maxDims) {
+        final List<Bitmap> bitmaps = new ArrayList<>(drawables.size());
+        for (Drawable drawable : drawables) {
+            bitmaps.add(drawableToBitmap(drawable, maxDims));
+        }
+        return bitmaps;
+    }
+
+    /** Returns a list of drawable wrappers for a list of bitmaps. */
+    private static List<Drawable> bitmapsToDrawables(List<Bitmap> bitmaps) {
+        final List<Drawable> drawables = new ArrayList<>(bitmaps.size());
+        for (Bitmap bitmap : bitmaps) {
+            if (bitmap != null) {
+                drawables.add(new BitmapDrawable(null, bitmap));
+            } else {
+                drawables.add(null);
+            }
+        }
+        return drawables;
+    }
+
+    /**
+     * Builder for building {@link TextClassification} objects.
+     *
+     * <p>e.g.
+     *
+     * <pre>{@code
+     *   TextClassification classification = new TextClassification.Builder()
+     *          .setText(classifiedText)
+     *          .setEntityType(TextClassifier.TYPE_EMAIL, 0.9)
+     *          .setEntityType(TextClassifier.TYPE_OTHER, 0.1)
+     *          .setPrimaryAction(intent, label, icon)
+     *          .addSecondaryAction(intent1, label1, icon1)
+     *          .addSecondaryAction(intent2, label2, icon2)
+     *          .build();
+     * }</pre>
+     */
+    public static final class Builder {
+
+        @NonNull private String mText;
+        @NonNull private final List<Drawable> mSecondaryIcons = new ArrayList<>();
+        @NonNull private final List<String> mSecondaryLabels = new ArrayList<>();
+        @NonNull private final List<Intent> mSecondaryIntents = new ArrayList<>();
+        @NonNull private final Map<String, Float> mEntityConfidence = new ArrayMap<>();
+        @Nullable Drawable mPrimaryIcon;
+        @Nullable String mPrimaryLabel;
+        @Nullable Intent mPrimaryIntent;
+        @NonNull private String mSignature = "";
+
+        /**
+         * Sets the classified text.
+         */
+        public Builder setText(@Nullable String text) {
+            mText = text;
+            return this;
+        }
+
+        /**
+         * Sets an entity type for the classification result and assigns a confidence score.
+         * If a confidence score had already been set for the specified entity type, this will
+         * override that score.
+         *
+         * @param confidenceScore a value from 0 (low confidence) to 1 (high confidence).
+         *      0 implies the entity does not exist for the classified text.
+         *      Values greater than 1 are clamped to 1.
+         */
+        public Builder setEntityType(
+                @NonNull @EntityType String type,
+                @FloatRange(from = 0.0, to = 1.0) float confidenceScore) {
+            mEntityConfidence.put(type, confidenceScore);
+            return this;
+        }
+
+        /**
+         * Adds an <i>secondary</i> action that may be performed on the classified text.
+         * Secondary actions are in addition to the <i>primary</i> action which may or may not
+         * exist.
+         *
+         * <p>The label and icon are used for rendering of widgets that offer the intent.
+         * Actions should be added in order of priority.
+         *
+         * <p><stong>Note: </stong> If all input parameters are set to null, this method will be a
+         * no-op.
+         *
+         * @see #setPrimaryAction(Intent, String, Drawable)
+         */
+        public Builder addSecondaryAction(
+                @Nullable Intent intent, @Nullable String label, @Nullable Drawable icon) {
+            if (intent != null || label != null || icon != null) {
+                mSecondaryIntents.add(intent);
+                mSecondaryLabels.add(label);
+                mSecondaryIcons.add(icon);
+            }
+            return this;
+        }
+
+        /**
+         * Removes all the <i>secondary</i> actions.
+         */
+        public Builder clearSecondaryActions() {
+            mSecondaryIntents.clear();
+            mSecondaryLabels.clear();
+            mSecondaryIcons.clear();
+            return this;
+        }
+
+        /**
+         * Sets the <i>primary</i> action that may be performed on the classified text. This is
+         * equivalent to calling {@code setIntent(intent).setLabel(label).setIcon(icon)}.
+         *
+         * <p><strong>Note: </strong>If all input parameters are null, there will be no
+         * <i>primary</i> action but there may still be <i>secondary</i> actions.
+         *
+         * @see #addSecondaryAction(Intent, String, Drawable)
+         */
+        public Builder setPrimaryAction(
+                @Nullable Intent intent, @Nullable String label, @Nullable Drawable icon) {
+            return setIntent(intent).setLabel(label).setIcon(icon);
+        }
+
+        /**
+         * Sets the icon for the <i>primary</i> action that may be rendered on a widget used to act
+         * on the classified text.
+         *
+         * @see #setPrimaryAction(Intent, String, Drawable)
+         */
+        public Builder setIcon(@Nullable Drawable icon) {
+            mPrimaryIcon = icon;
+            return this;
+        }
+
+        /**
+         * Sets the label for the <i>primary</i> action that may be rendered on a widget used to
+         * act on the classified text.
+         *
+         * @see #setPrimaryAction(Intent, String, Drawable)
+         */
+        public Builder setLabel(@Nullable String label) {
+            mPrimaryLabel = label;
+            return this;
+        }
+
+        /**
+         * Sets the intent for the <i>primary</i> action that may be fired to act on the classified
+         * text.
+         *
+         * @see #setPrimaryAction(Intent, String, Drawable)
+         */
+        public Builder setIntent(@Nullable Intent intent) {
+            mPrimaryIntent = intent;
+            return this;
+        }
+
+        /**
+         * Sets a signature for the TextClassification object.
+         * The TextClassifier that generates the TextClassification object may use it as a way to
+         * internally identify the TextClassification object.
+         */
+        public Builder setSignature(@NonNull String signature) {
+            mSignature = Preconditions.checkNotNull(signature);
+            return this;
+        }
+
+        /**
+         * Builds and returns a {@link TextClassification} object.
+         */
+        public TextClassification build() {
+            return new TextClassification(
+                    mText,
+                    mPrimaryIcon, mPrimaryLabel, mPrimaryIntent,
+                    mSecondaryIcons, mSecondaryLabels, mSecondaryIntents,
+                    mEntityConfidence, mSignature);
+        }
+    }
+
+    /**
+     * Optional input parameters for generating TextClassification.
+     */
+    public static final class Options implements Parcelable {
+
+        private @Nullable LocaleListCompat mDefaultLocales;
+        private @Nullable Calendar mReferenceTime;
+
+        public Options() {}
+
+        /**
+         * @param defaultLocales ordered list of locale preferences that may be used to disambiguate
+         *      the provided text. If no locale preferences exist, set this to null or an empty
+         *      locale list.
+         */
+        public Options setDefaultLocales(@Nullable LocaleListCompat defaultLocales) {
+            mDefaultLocales = defaultLocales;
+            return this;
+        }
+
+        /**
+         * @param referenceTime reference time based on which relative dates (e.g. "tomorrow" should
+         *      be interpreted. This should usually be the time when the text was originally
+         *      composed. If no reference time is set, now is used.
+         */
+        public Options setReferenceTime(Calendar referenceTime) {
+            mReferenceTime = referenceTime;
+            return this;
+        }
+
+        /**
+         * @return ordered list of locale preferences that can be used to disambiguate
+         *      the provided text.
+         */
+        @Nullable
+        public LocaleListCompat getDefaultLocales() {
+            return mDefaultLocales;
+        }
+
+        /**
+         * @return reference time based on which relative dates (e.g. "tomorrow") should be
+         *      interpreted.
+         */
+        @Nullable
+        public Calendar getReferenceTime() {
+            return mReferenceTime;
+        }
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            dest.writeInt(mDefaultLocales != null ? 1 : 0);
+            if (mDefaultLocales != null) {
+                dest.writeString(mDefaultLocales.toLanguageTags());
+            }
+            dest.writeInt(mReferenceTime != null ? 1 : 0);
+            if (mReferenceTime != null) {
+                dest.writeSerializable(mReferenceTime);
+            }
+        }
+
+        public static final Parcelable.Creator<Options> CREATOR =
+                new Parcelable.Creator<Options>() {
+                    @Override
+                    public Options createFromParcel(Parcel in) {
+                        return new Options(in);
+                    }
+
+                    @Override
+                    public Options[] newArray(int size) {
+                        return new Options[size];
+                    }
+                };
+
+        private Options(Parcel in) {
+            if (in.readInt() > 0) {
+                mDefaultLocales = LocaleListCompat.forLanguageTags(in.readString());
+            }
+            if (in.readInt() > 0) {
+                mReferenceTime = (Calendar) in.readSerializable();
+            }
+        }
+    }
+}
diff --git a/textclassifier/src/main/java/androidx/view/textclassifier/TextClassifier.java b/textclassifier/src/main/java/androidx/view/textclassifier/TextClassifier.java
new file mode 100644
index 0000000..4dc7236
--- /dev/null
+++ b/textclassifier/src/main/java/androidx/view/textclassifier/TextClassifier.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 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.view.textclassifier;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.annotation.IntDef;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.StringDef;
+import android.support.v4.util.ArraySet;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Interface for providing text classification related features.
+ *
+ * TextClassifier acts as a proxy to either the system provided TextClassifier, or an equivalent
+ * implementation provided by an app. Each instance of the class therefore represents one connection
+ * to the classifier implementation.
+ *
+ * <p>Unless otherwise stated, methods of this interface are blocking operations.
+ * Avoid calling them on the UI thread.
+ */
+public class TextClassifier {
+
+    // TODO: describe in the class documentation how a TC implementation in chosen/located.
+
+    /** Signifies that the TextClassifier did not identify an entity. */
+    public static final String TYPE_UNKNOWN = "";
+    /** Signifies that the classifier ran, but didn't recognize a know entity. */
+    public static final String TYPE_OTHER = "other";
+    /** Identifies an e-mail address. */
+    public static final String TYPE_EMAIL = "email";
+    /** Identifies a phone number. */
+    public static final String TYPE_PHONE = "phone";
+    /** Identifies a physical address. */
+    public static final String TYPE_ADDRESS = "address";
+    /** Identifies a URL. */
+    public static final String TYPE_URL = "url";
+
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @Retention(RetentionPolicy.SOURCE)
+    @StringDef(value = {
+            TYPE_UNKNOWN,
+            TYPE_OTHER,
+            TYPE_EMAIL,
+            TYPE_PHONE,
+            TYPE_ADDRESS,
+            TYPE_URL,
+    })
+    @interface EntityType {}
+
+    /** Designates that the TextClassifier should identify all entity types it can. **/
+    static final int ENTITY_PRESET_ALL = 0;
+    /** Designates that the TextClassifier should identify no entities. **/
+    static final int ENTITY_PRESET_NONE = 1;
+    /** Designates that the TextClassifier should identify a base set of entities determined by the
+     * TextClassifier. **/
+    static final int ENTITY_PRESET_BASE = 2;
+
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(value = {ENTITY_PRESET_ALL, ENTITY_PRESET_NONE, ENTITY_PRESET_BASE})
+    @interface EntityPreset {}
+
+    // TODO: add constructor, suggestSelection, classifyText, generateLinks, logEvent
+
+    /**
+     * Returns a {@link Collection} of the entity types in the specified preset.
+     *
+     * @see #ENTITY_PRESET_ALL
+     * @see #ENTITY_PRESET_NONE
+     */
+    /* package */ Collection<String> getEntitiesForPreset(@EntityPreset int entityPreset) {
+        // TODO: forward call to the classifier implementation.
+        return Collections.EMPTY_LIST;
+    }
+
+    /**
+     * Configuration object for specifying what entities to identify.
+     *
+     * Configs are initially based on a predefined preset, and can be modified from there.
+     */
+    static final class EntityConfig implements Parcelable {
+        private final @EntityPreset int mEntityPreset;
+        private final Collection<String> mExcludedEntityTypes;
+        private final Collection<String> mIncludedEntityTypes;
+
+        EntityConfig(@EntityPreset int mEntityPreset) {
+            this.mEntityPreset = mEntityPreset;
+            mExcludedEntityTypes = new ArraySet<>();
+            mIncludedEntityTypes = new ArraySet<>();
+        }
+
+        /**
+         * Specifies an entity to include in addition to any specified by the enity preset.
+         *
+         * Note that if an entity has been excluded, the exclusion will take precedence.
+         */
+        public EntityConfig includeEntities(String... entities) {
+            mIncludedEntityTypes.addAll(Arrays.asList(entities));
+            return this;
+        }
+
+        /**
+         * Specifies an entity to be excluded.
+         */
+        public EntityConfig excludeEntities(String... entities) {
+            mExcludedEntityTypes.addAll(Arrays.asList(entities));
+            return this;
+        }
+
+        /**
+         * Returns an unmodifiable list of the final set of entities to find.
+         */
+        public List<String> getEntities(TextClassifier textClassifier) {
+            ArrayList<String> entities = new ArrayList<>();
+            for (String entity : textClassifier.getEntitiesForPreset(mEntityPreset)) {
+                if (!mExcludedEntityTypes.contains(entity)) {
+                    entities.add(entity);
+                }
+            }
+            for (String entity : mIncludedEntityTypes) {
+                if (!mExcludedEntityTypes.contains(entity) && !entities.contains(entity)) {
+                    entities.add(entity);
+                }
+            }
+            return Collections.unmodifiableList(entities);
+        }
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            dest.writeInt(mEntityPreset);
+            dest.writeStringList(new ArrayList<>(mExcludedEntityTypes));
+            dest.writeStringList(new ArrayList<>(mIncludedEntityTypes));
+        }
+
+        public static final Parcelable.Creator<EntityConfig> CREATOR =
+                new Parcelable.Creator<EntityConfig>() {
+                    @Override
+                    public EntityConfig createFromParcel(Parcel in) {
+                        return new EntityConfig(in);
+                    }
+
+                    @Override
+                    public EntityConfig[] newArray(int size) {
+                        return new EntityConfig[size];
+                    }
+                };
+
+        private EntityConfig(Parcel in) {
+            mEntityPreset = in.readInt();
+            mExcludedEntityTypes = new ArraySet<>(in.createStringArrayList());
+            mIncludedEntityTypes = new ArraySet<>(in.createStringArrayList());
+        }
+    }
+}
diff --git a/textclassifier/src/main/java/androidx/view/textclassifier/TextLinks.java b/textclassifier/src/main/java/androidx/view/textclassifier/TextLinks.java
new file mode 100644
index 0000000..79810f5
--- /dev/null
+++ b/textclassifier/src/main/java/androidx/view/textclassifier/TextLinks.java
@@ -0,0 +1,520 @@
+/*
+ * 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.view.textclassifier;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.annotation.FloatRange;
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.support.v4.os.LocaleListCompat;
+import android.support.v4.util.Preconditions;
+import android.text.Spannable;
+import android.text.style.ClickableSpan;
+import android.view.View;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import androidx.view.textclassifier.TextClassifier.EntityType;
+
+/**
+ * A collection of links, representing subsequences of text and the entity types (phone number,
+ * address, url, etc) they may be.
+ */
+public final class TextLinks implements Parcelable {
+    private final String mFullText;
+    private final List<TextLink> mLinks;
+
+    /** Links were successfully applied to the text. */
+    public static final int STATUS_LINKS_APPLIED = 0;
+    /** No links exist to apply to text. Links count is zero. */
+    public static final int STATUS_NO_LINKS_FOUND = 1;
+    /** No links applied to text. The links were filtered out. */
+    public static final int STATUS_NO_LINKS_APPLIED = 2;
+    /** The specified text does not match the text used to generate the links. */
+    public static final int STATUS_DIFFERENT_TEXT = 3;
+
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(value = {
+            STATUS_LINKS_APPLIED,
+            STATUS_NO_LINKS_FOUND,
+            STATUS_NO_LINKS_APPLIED,
+            STATUS_DIFFERENT_TEXT
+    })
+    public @interface Status {}
+
+    /** Do not replace {@link ClickableSpan}s that exist where the {@link TextLinkSpan} needs to
+     * be applied to. Do not apply the TextLinkSpan. **/
+    public static final int APPLY_STRATEGY_IGNORE = 0;
+    /** Replace any {@link ClickableSpan}s that exist where the {@link TextLinkSpan} needs to be
+     * applied to. **/
+    public static final int APPLY_STRATEGY_REPLACE = 1;
+
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({APPLY_STRATEGY_IGNORE, APPLY_STRATEGY_REPLACE})
+    public @interface ApplyStrategy {}
+
+    private TextLinks(String fullText, ArrayList<TextLink> links) {
+        mFullText = fullText;
+        mLinks = Collections.unmodifiableList(links);
+    }
+
+    /**
+     * Returns an unmodifiable Collection of the links.
+     */
+    public Collection<TextLink> getLinks() {
+        return mLinks;
+    }
+
+    /**
+     * Annotates the given text with the generated links. It will fail if the provided text doesn't
+     * match the original text used to crete the TextLinks.
+     *
+     * @param text the text to apply the links to. Must match the original text.
+     * @param spanFactory a factory to generate spans from TextLinks. Will use a default if null.
+     *
+     * @return one of {@link #STATUS_LINKS_APPLIED}, {@link #STATUS_NO_LINKS_FOUND},
+     *      {@link #STATUS_NO_LINKS_APPLIED}, {@link #STATUS_DIFFERENT_TEXT}
+     */
+    @Status
+    public int apply(
+            @NonNull Spannable text,
+            @ApplyStrategy int applyStrategy,
+            @Nullable SpanFactory spanFactory) {
+        Preconditions.checkNotNull(text);
+        checkValidApplyStrategy(applyStrategy);
+        if (!mFullText.equals(text.toString())) {
+            return STATUS_DIFFERENT_TEXT;
+        }
+        if (mLinks.isEmpty()) {
+            return STATUS_NO_LINKS_FOUND;
+        }
+
+        if (spanFactory == null) {
+            spanFactory = DEFAULT_SPAN_FACTORY;
+        }
+        int applyCount = 0;
+        for (TextLink link : mLinks) {
+            final TextLinkSpan span = spanFactory.createSpan(link);
+            if (span != null) {
+                final ClickableSpan[] existingSpans = text.getSpans(
+                        link.getStart(), link.getEnd(), ClickableSpan.class);
+                if (existingSpans.length > 0) {
+                    if (applyStrategy == APPLY_STRATEGY_REPLACE) {
+                        for (ClickableSpan existingSpan : existingSpans) {
+                            text.removeSpan(existingSpan);
+                        }
+                        text.setSpan(span, link.getStart(), link.getEnd(),
+                                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+                        applyCount++;
+                    }
+                } else {
+                    text.setSpan(span, link.getStart(), link.getEnd(),
+                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+                    applyCount++;
+                }
+            }
+        }
+        if (applyCount == 0) {
+            return STATUS_NO_LINKS_APPLIED;
+        }
+        return STATUS_LINKS_APPLIED;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(mFullText);
+        dest.writeTypedList(mLinks);
+    }
+
+    public static final Parcelable.Creator<TextLinks> CREATOR =
+            new Parcelable.Creator<TextLinks>() {
+                @Override
+                public TextLinks createFromParcel(Parcel in) {
+                    return new TextLinks(in);
+                }
+
+                @Override
+                public TextLinks[] newArray(int size) {
+                    return new TextLinks[size];
+                }
+            };
+
+    private TextLinks(Parcel in) {
+        mFullText = in.readString();
+        mLinks = in.createTypedArrayList(TextLink.CREATOR);
+    }
+
+    /**
+     * A link, identifying a substring of text and possible entity types for it.
+     */
+    public static final class TextLink implements Parcelable {
+        private final EntityConfidence mEntityScores;
+        private final int mStart;
+        private final int mEnd;
+
+        /**
+         * Create a new TextLink.
+         *
+         * @throws IllegalArgumentException if entityScores is null or empty.
+         */
+        TextLink(int start, int end, @NonNull Map<String, Float> entityScores) {
+            Preconditions.checkNotNull(entityScores);
+            Preconditions.checkArgument(!entityScores.isEmpty());
+            Preconditions.checkArgument(start <= end);
+            mStart = start;
+            mEnd = end;
+            mEntityScores = new EntityConfidence(entityScores);
+        }
+
+        /**
+         * Returns the start index of this link in the original text.
+         *
+         * @return the start index.
+         */
+        public int getStart() {
+            return mStart;
+        }
+
+        /**
+         * Returns the end index of this link in the original text.
+         *
+         * @return the end index.
+         */
+        public int getEnd() {
+            return mEnd;
+        }
+
+        /**
+         * Returns the number of entity types that have confidence scores.
+         *
+         * @return the entity count.
+         */
+        public int getEntityCount() {
+            return mEntityScores.getEntities().size();
+        }
+
+        /**
+         * Returns the entity type at a given index. Entity types are sorted by confidence.
+         *
+         * @return the entity type at the provided index.
+         */
+        @NonNull public @EntityType String getEntity(int index) {
+            return mEntityScores.getEntities().get(index);
+        }
+
+        /**
+         * Returns the confidence score for a particular entity type.
+         *
+         * @param entityType the entity type.
+         */
+        public @FloatRange(from = 0.0, to = 1.0) float getConfidenceScore(
+                @EntityType String entityType) {
+            return mEntityScores.getConfidenceScore(entityType);
+        }
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            mEntityScores.writeToParcel(dest, flags);
+            dest.writeInt(mStart);
+            dest.writeInt(mEnd);
+        }
+
+        public static final Parcelable.Creator<TextLink> CREATOR =
+                new Parcelable.Creator<TextLink>() {
+                    @Override
+                    public TextLink createFromParcel(Parcel in) {
+                        return new TextLink(in);
+                    }
+
+                    @Override
+                    public TextLink[] newArray(int size) {
+                        return new TextLink[size];
+                    }
+                };
+
+        private TextLink(Parcel in) {
+            mEntityScores = EntityConfidence.CREATOR.createFromParcel(in);
+            mStart = in.readInt();
+            mEnd = in.readInt();
+        }
+    }
+
+    /**
+     * Optional input parameters for generating TextLinks.
+     */
+    public static final class Options implements Parcelable {
+
+        private @Nullable LocaleListCompat mDefaultLocales;
+        private TextClassifier.EntityConfig mEntityConfig;
+        private @ApplyStrategy int mApplyStrategy;
+        private @Nullable SpanFactory mSpanFactory;
+
+        public Options() {}
+
+        /**
+         * @param defaultLocales ordered list of locale preferences that may be used to
+         *                       disambiguate the provided text. If no locale preferences exist,
+         *                       set this to null or an empty locale list.
+         */
+        public Options setDefaultLocales(@Nullable LocaleListCompat defaultLocales) {
+            mDefaultLocales = defaultLocales;
+            return this;
+        }
+
+        /**
+         * Sets the entity configuration to use. This determines what types of entities the
+         * TextClassifier will look for.
+         *
+         * @param entityConfig EntityConfig to use
+         */
+        public Options setEntityConfig(@Nullable TextClassifier.EntityConfig entityConfig) {
+            mEntityConfig = entityConfig;
+            return this;
+        }
+
+        /**
+         * Sets a strategy for resolving conflicts when applying generated links to text that
+         * already have links.
+         *
+         * @throws IllegalArgumentException if applyStrategy is not valid.
+         * @see #APPLY_STRATEGY_IGNORE
+         * @see #APPLY_STRATEGY_REPLACE
+         */
+        public Options setApplyStrategy(@ApplyStrategy int applyStrategy) {
+            checkValidApplyStrategy(applyStrategy);
+            mApplyStrategy = applyStrategy;
+            return this;
+        }
+
+        /**
+         * Sets a factory for converting a TextLink to a TextLinkSpan.
+         *
+         * <p><strong>Note: </strong>This is not parceled over IPC.
+         */
+        public Options setSpanFactory(@Nullable SpanFactory spanFactory) {
+            mSpanFactory = spanFactory;
+            return this;
+        }
+
+        /**
+         * @return ordered list of locale preferences that can be used to disambiguate
+         *      the provided text.
+         */
+        @Nullable
+        public LocaleListCompat getDefaultLocales() {
+            return mDefaultLocales;
+        }
+
+        /**
+         * @return The config representing the set of entities to look for.
+         * @see #setEntityConfig(TextClassifier.EntityConfig)
+         */
+        @Nullable
+        public TextClassifier.EntityConfig getEntityConfig() {
+            return mEntityConfig;
+        }
+
+        /**
+         * Returns the strategy for resolving conflicts when applying generated links to text that
+         * already have links.
+         *
+         * @see #APPLY_STRATEGY_IGNORE
+         * @see #APPLY_STRATEGY_REPLACE
+         */
+        @ApplyStrategy
+        public int getApplyStrategy() {
+            return mApplyStrategy;
+        }
+
+        /**
+         * Returns a factory for converting a TextLink to a TextLinkSpan.
+         *
+         * <p><strong>Note: </strong>This is not parcelable and will always return null if read
+         *      from a parcel
+         */
+        @Nullable
+        public SpanFactory getSpanFactory() {
+            return mSpanFactory;
+        }
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            dest.writeInt(mDefaultLocales != null ? 1 : 0);
+            if (mDefaultLocales != null) {
+                dest.writeString(mDefaultLocales.toLanguageTags());
+            }
+            dest.writeInt(mEntityConfig != null ? 1 : 0);
+            if (mEntityConfig != null) {
+                mEntityConfig.writeToParcel(dest, flags);
+            }
+            dest.writeInt(mApplyStrategy);
+            // mSpanFactory is not parcelable
+        }
+
+        public static final Parcelable.Creator<Options> CREATOR =
+                new Parcelable.Creator<Options>() {
+                    @Override
+                    public Options createFromParcel(Parcel in) {
+                        return new Options(in);
+                    }
+
+                    @Override
+                    public Options[] newArray(int size) {
+                        return new Options[size];
+                    }
+                };
+
+        private Options(Parcel in) {
+            if (in.readInt() > 0) {
+                mDefaultLocales = LocaleListCompat.forLanguageTags(in.readString());
+            }
+            if (in.readInt() > 0) {
+                mEntityConfig = TextClassifier.EntityConfig.CREATOR.createFromParcel(in);
+            }
+            mApplyStrategy = in.readInt();
+            // mSpanFactory is not parcelable
+        }
+    }
+
+    /**
+     * A function to create spans from TextLinks.
+     *
+     * Hidden until we convinced we want it to be part of the public API.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public interface SpanFactory {
+
+        /** Creates a span from a text link. */
+        TextLinkSpan createSpan(TextLink textLink);
+    }
+
+    /**
+     * A ClickableSpan for a TextLink.
+     */
+    public static class TextLinkSpan extends ClickableSpan {
+
+        private final TextLink mTextLink;
+
+        public TextLinkSpan(@Nullable TextLink textLink) {
+            mTextLink = textLink;
+        }
+
+        @Override
+        public void onClick(View widget) {
+            // TODO(jalt): integrate with AppCompatTextView to show action mode.
+        }
+
+        public final TextLink getTextLink() {
+            return mTextLink;
+        }
+    }
+
+    /**
+     * A builder to construct a TextLinks instance.
+     */
+    public static final class Builder {
+        private final String mFullText;
+        private final ArrayList<TextLink> mLinks;
+
+        /**
+         * Create a new TextLinks.Builder.
+         *
+         * @param fullText The full text to annotate with links.
+         */
+        public Builder(@NonNull String fullText) {
+            mFullText = Preconditions.checkNotNull(fullText);
+            mLinks = new ArrayList<>();
+        }
+
+        /**
+         * Adds a TextLink.
+         *
+         * @return this instance.
+         *
+         * @throws IllegalArgumentException if entityScores is null or empty.
+         */
+        public Builder addLink(int start, int end, @NonNull Map<String, Float> entityScores) {
+            mLinks.add(new TextLink(start, end, Preconditions.checkNotNull(entityScores)));
+            return this;
+        }
+
+        /**
+         * Removes all {@link TextLink}s.
+         */
+        public Builder clearTextLinks() {
+            mLinks.clear();
+            return this;
+        }
+
+        /**
+         * Constructs a TextLinks instance.
+         *
+         * @return the constructed TextLinks.
+         */
+        public TextLinks build() {
+            return new TextLinks(mFullText, mLinks);
+        }
+    }
+
+    /** The default span factory for TextView and AppCompatTextView. */
+    private static final SpanFactory DEFAULT_SPAN_FACTORY = new SpanFactory() {
+        @Override
+        public TextLinkSpan createSpan(TextLink textLink) {
+            return new TextLinkSpan(textLink);
+        }
+    };
+
+    /**
+     * @throws IllegalArgumentException if the value is invalid
+     */
+    private static void checkValidApplyStrategy(int applyStrategy) {
+        if (applyStrategy != APPLY_STRATEGY_IGNORE && applyStrategy != APPLY_STRATEGY_REPLACE) {
+            throw new IllegalArgumentException(
+                    "Invalid apply strategy. See TextLinks.ApplyStrategy for options.");
+        }
+    }
+}
diff --git a/textclassifier/src/main/java/androidx/view/textclassifier/TextSelection.java b/textclassifier/src/main/java/androidx/view/textclassifier/TextSelection.java
new file mode 100644
index 0000000..dbc7ecf
--- /dev/null
+++ b/textclassifier/src/main/java/androidx/view/textclassifier/TextSelection.java
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 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.view.textclassifier;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.annotation.FloatRange;
+import android.support.annotation.IntRange;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.os.LocaleListCompat;
+import android.support.v4.util.ArrayMap;
+import android.support.v4.util.Preconditions;
+
+import java.util.Locale;
+import java.util.Map;
+
+import androidx.view.textclassifier.TextClassifier.EntityType;
+
+/**
+ * Information about where text selection should be.
+ */
+public final class TextSelection implements Parcelable {
+
+    private final int mStartIndex;
+    private final int mEndIndex;
+    @NonNull private final EntityConfidence mEntityConfidence;
+    @NonNull private final String mSignature;
+
+    private TextSelection(
+            int startIndex, int endIndex, @NonNull Map<String, Float> entityConfidence,
+            @NonNull String signature) {
+        mStartIndex = startIndex;
+        mEndIndex = endIndex;
+        mEntityConfidence = new EntityConfidence(entityConfidence);
+        mSignature = signature;
+    }
+
+    /**
+     * Returns the start index of the text selection.
+     */
+    public int getSelectionStartIndex() {
+        return mStartIndex;
+    }
+
+    /**
+     * Returns the end index of the text selection.
+     */
+    public int getSelectionEndIndex() {
+        return mEndIndex;
+    }
+
+    /**
+     * Returns the number of entities found in the classified text.
+     */
+    @IntRange(from = 0)
+    public int getEntityCount() {
+        return mEntityConfidence.getEntities().size();
+    }
+
+    /**
+     * Returns the entity at the specified index. Entities are ordered from high confidence
+     * to low confidence.
+     *
+     * @throws IndexOutOfBoundsException if the specified index is out of range.
+     * @see #getEntityCount() for the number of entities available.
+     */
+    @NonNull
+    public @EntityType String getEntity(int index) {
+        return mEntityConfidence.getEntities().get(index);
+    }
+
+    /**
+     * Returns the confidence score for the specified entity. The value ranges from
+     * 0 (low confidence) to 1 (high confidence). 0 indicates that the entity was not found for the
+     * classified text.
+     */
+    @FloatRange(from = 0.0, to = 1.0)
+    public float getConfidenceScore(@EntityType String entity) {
+        return mEntityConfidence.getConfidenceScore(entity);
+    }
+
+    /**
+     * Returns the signature for this object.
+     * The TextClassifier that generates this object may use it as a way to internally identify
+     * this object.
+     */
+    @NonNull
+    public String getSignature() {
+        return mSignature;
+    }
+
+    @Override
+    public String toString() {
+        return String.format(
+                Locale.US,
+                "TextSelection {startIndex=%d, endIndex=%d, entities=%s, signature=%s}",
+                mStartIndex, mEndIndex, mEntityConfidence, mSignature);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(mStartIndex);
+        dest.writeInt(mEndIndex);
+        mEntityConfidence.writeToParcel(dest, flags);
+        dest.writeString(mSignature);
+    }
+
+    public static final Parcelable.Creator<TextSelection> CREATOR =
+            new Parcelable.Creator<TextSelection>() {
+                @Override
+                public TextSelection createFromParcel(Parcel in) {
+                    return new TextSelection(in);
+                }
+
+                @Override
+                public TextSelection[] newArray(int size) {
+                    return new TextSelection[size];
+                }
+            };
+
+    private TextSelection(Parcel in) {
+        mStartIndex = in.readInt();
+        mEndIndex = in.readInt();
+        mEntityConfidence = EntityConfidence.CREATOR.createFromParcel(in);
+        mSignature = in.readString();
+    }
+
+    /**
+     * Builder used to build {@link TextSelection} objects.
+     */
+    public static final class Builder {
+
+        private final int mStartIndex;
+        private final int mEndIndex;
+        @NonNull private final Map<String, Float> mEntityConfidence = new ArrayMap<>();
+        @NonNull private String mSignature = "";
+
+        /**
+         * Creates a builder used to build {@link TextSelection} objects.
+         *
+         * @param startIndex the start index of the text selection.
+         * @param endIndex the end index of the text selection. Must be greater than startIndex
+         */
+        public Builder(@IntRange(from = 0) int startIndex, @IntRange(from = 0) int endIndex) {
+            Preconditions.checkArgument(startIndex >= 0);
+            Preconditions.checkArgument(endIndex > startIndex);
+            mStartIndex = startIndex;
+            mEndIndex = endIndex;
+        }
+
+        /**
+         * Sets an entity type for the classified text and assigns a confidence score.
+         *
+         * @param confidenceScore a value from 0 (low confidence) to 1 (high confidence).
+         *      0 implies the entity does not exist for the classified text.
+         *      Values greater than 1 are clamped to 1.
+         */
+        public Builder setEntityType(
+                @NonNull @EntityType String type,
+                @FloatRange(from = 0.0, to = 1.0) float confidenceScore) {
+            mEntityConfidence.put(type, confidenceScore);
+            return this;
+        }
+
+        /**
+         * Sets a signature for the TextSelection object.
+         *
+         * The TextClassifier that generates the TextSelection object may use it as a way to
+         * internally identify the TextSelection object.
+         */
+        public Builder setSignature(@NonNull String signature) {
+            mSignature = Preconditions.checkNotNull(signature);
+            return this;
+        }
+
+        /**
+         * Builds and returns {@link TextSelection} object.
+         */
+        public TextSelection build() {
+            return new TextSelection(
+                    mStartIndex, mEndIndex, mEntityConfidence, mSignature);
+        }
+    }
+
+    /**
+     * Optional input parameters for generating TextSelection.
+     */
+    public static final class Options implements Parcelable {
+
+        private @Nullable LocaleListCompat mDefaultLocales;
+
+        public Options() {}
+
+        /**
+         * @param defaultLocales ordered list of locale preferences that may be used to disambiguate
+         *      the provided text. If no locale preferences exist, set this to null or an empty
+         *      locale list.
+         */
+        public Options setDefaultLocales(@Nullable LocaleListCompat defaultLocales) {
+            mDefaultLocales = defaultLocales;
+            return this;
+        }
+
+        /**
+         * @return ordered list of locale preferences that can be used to disambiguate
+         *      the provided text.
+         */
+        @Nullable
+        public LocaleListCompat getDefaultLocales() {
+            return mDefaultLocales;
+        }
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            dest.writeInt(mDefaultLocales != null ? 1 : 0);
+            if (mDefaultLocales != null) {
+                dest.writeString(mDefaultLocales.toLanguageTags());
+            }
+        }
+
+        public static final Parcelable.Creator<Options> CREATOR =
+                new Parcelable.Creator<Options>() {
+                    @Override
+                    public Options createFromParcel(Parcel in) {
+                        return new Options(in);
+                    }
+
+                    @Override
+                    public Options[] newArray(int size) {
+                        return new Options[size];
+                    }
+                };
+
+        private Options(Parcel in) {
+            if (in.readInt() > 0) {
+                mDefaultLocales = LocaleListCompat.forLanguageTags(in.readString());
+            }
+        }
+    }
+}
diff --git a/transition/Android.mk b/transition/Android.mk
deleted file mode 100644
index 466cfa8..0000000
--- a/transition/Android.mk
+++ /dev/null
@@ -1,40 +0,0 @@
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-transition \
-#       android-support-v4
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-transition
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := \
-    $(call all-java-files-under,src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/src/main/res
-LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-v4
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --no-version-transitions --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/transition/api/27.1.0.txt b/transition/api/27.1.0.txt
new file mode 100644
index 0000000..b939299
--- /dev/null
+++ b/transition/api/27.1.0.txt
@@ -0,0 +1,280 @@
+package android.support.transition {
+
+  public class ArcMotion extends android.support.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 android.support.transition.TransitionSet {
+    ctor public AutoTransition();
+    ctor public AutoTransition(android.content.Context, android.util.AttributeSet);
+  }
+
+  public class ChangeBounds extends android.support.transition.Transition {
+    ctor public ChangeBounds();
+    ctor public ChangeBounds(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public boolean getResizeClip();
+    method public void setResizeClip(boolean);
+  }
+
+  public class ChangeClipBounds extends android.support.transition.Transition {
+    ctor public ChangeClipBounds();
+    ctor public ChangeClipBounds(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+  }
+
+  public class ChangeImageTransform extends android.support.transition.Transition {
+    ctor public ChangeImageTransform();
+    ctor public ChangeImageTransform(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+  }
+
+  public class ChangeScroll extends android.support.transition.Transition {
+    ctor public ChangeScroll();
+    ctor public ChangeScroll(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+  }
+
+  public class ChangeTransform extends android.support.transition.Transition {
+    ctor public ChangeTransform();
+    ctor public ChangeTransform(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public boolean getReparent();
+    method public boolean getReparentWithOverlay();
+    method public void setReparent(boolean);
+    method public void setReparentWithOverlay(boolean);
+  }
+
+  public class CircularPropagation extends android.support.transition.VisibilityPropagation {
+    ctor public CircularPropagation();
+    method public long getStartDelay(android.view.ViewGroup, android.support.transition.Transition, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public void setPropagationSpeed(float);
+  }
+
+  public class Explode extends android.support.transition.Visibility {
+    ctor public Explode();
+    ctor public Explode(android.content.Context, android.util.AttributeSet);
+  }
+
+  public class Fade extends android.support.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 android.support.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 android.support.transition.Scene getSceneForLayout(android.view.ViewGroup, int, android.content.Context);
+    method public android.view.ViewGroup getSceneRoot();
+    method public void setEnterAction(java.lang.Runnable);
+    method public void setExitAction(java.lang.Runnable);
+  }
+
+  public class SidePropagation extends android.support.transition.VisibilityPropagation {
+    ctor public SidePropagation();
+    method public long getStartDelay(android.view.ViewGroup, android.support.transition.Transition, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public void setPropagationSpeed(float);
+    method public void setSide(int);
+  }
+
+  public class Slide extends android.support.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 android.support.transition.Transition addListener(android.support.transition.Transition.TransitionListener);
+    method public android.support.transition.Transition addTarget(android.view.View);
+    method public android.support.transition.Transition addTarget(int);
+    method public android.support.transition.Transition addTarget(java.lang.String);
+    method public android.support.transition.Transition addTarget(java.lang.Class);
+    method public abstract void captureEndValues(android.support.transition.TransitionValues);
+    method public abstract void captureStartValues(android.support.transition.TransitionValues);
+    method public android.support.transition.Transition clone();
+    method public android.animation.Animator createAnimator(android.view.ViewGroup, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public android.support.transition.Transition excludeChildren(android.view.View, boolean);
+    method public android.support.transition.Transition excludeChildren(int, boolean);
+    method public android.support.transition.Transition excludeChildren(java.lang.Class, boolean);
+    method public android.support.transition.Transition excludeTarget(android.view.View, boolean);
+    method public android.support.transition.Transition excludeTarget(int, boolean);
+    method public android.support.transition.Transition excludeTarget(java.lang.String, boolean);
+    method public android.support.transition.Transition excludeTarget(java.lang.Class, boolean);
+    method public long getDuration();
+    method public android.graphics.Rect getEpicenter();
+    method public android.support.transition.Transition.EpicenterCallback getEpicenterCallback();
+    method public android.animation.TimeInterpolator getInterpolator();
+    method public java.lang.String getName();
+    method public android.support.transition.PathMotion getPathMotion();
+    method public android.support.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 java.lang.String[] getTransitionProperties();
+    method public android.support.transition.TransitionValues getTransitionValues(android.view.View, boolean);
+    method public boolean isTransitionRequired(android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public android.support.transition.Transition removeListener(android.support.transition.Transition.TransitionListener);
+    method public android.support.transition.Transition removeTarget(android.view.View);
+    method public android.support.transition.Transition removeTarget(int);
+    method public android.support.transition.Transition removeTarget(java.lang.String);
+    method public android.support.transition.Transition removeTarget(java.lang.Class);
+    method public android.support.transition.Transition setDuration(long);
+    method public void setEpicenterCallback(android.support.transition.Transition.EpicenterCallback);
+    method public android.support.transition.Transition setInterpolator(android.animation.TimeInterpolator);
+    method public void setMatchOrder(int...);
+    method public void setPathMotion(android.support.transition.PathMotion);
+    method public void setPropagation(android.support.transition.TransitionPropagation);
+    method public android.support.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 static abstract class Transition.EpicenterCallback {
+    ctor public Transition.EpicenterCallback();
+    method public abstract android.graphics.Rect onGetEpicenter(android.support.transition.Transition);
+  }
+
+  public static abstract interface Transition.TransitionListener {
+    method public abstract void onTransitionCancel(android.support.transition.Transition);
+    method public abstract void onTransitionEnd(android.support.transition.Transition);
+    method public abstract void onTransitionPause(android.support.transition.Transition);
+    method public abstract void onTransitionResume(android.support.transition.Transition);
+    method public abstract void onTransitionStart(android.support.transition.Transition);
+  }
+
+  public class TransitionInflater {
+    method public static android.support.transition.TransitionInflater from(android.content.Context);
+    method public android.support.transition.Transition inflateTransition(int);
+    method public android.support.transition.TransitionManager inflateTransitionManager(int, android.view.ViewGroup);
+  }
+
+  public class TransitionListenerAdapter implements android.support.transition.Transition.TransitionListener {
+    ctor public TransitionListenerAdapter();
+    method public void onTransitionCancel(android.support.transition.Transition);
+    method public void onTransitionEnd(android.support.transition.Transition);
+    method public void onTransitionPause(android.support.transition.Transition);
+    method public void onTransitionResume(android.support.transition.Transition);
+    method public void onTransitionStart(android.support.transition.Transition);
+  }
+
+  public class TransitionManager {
+    ctor public TransitionManager();
+    method public static void beginDelayedTransition(android.view.ViewGroup);
+    method public static void beginDelayedTransition(android.view.ViewGroup, android.support.transition.Transition);
+    method public static void endTransitions(android.view.ViewGroup);
+    method public static void go(android.support.transition.Scene);
+    method public static void go(android.support.transition.Scene, android.support.transition.Transition);
+    method public void setTransition(android.support.transition.Scene, android.support.transition.Transition);
+    method public void setTransition(android.support.transition.Scene, android.support.transition.Scene, android.support.transition.Transition);
+    method public void transitionTo(android.support.transition.Scene);
+  }
+
+  public abstract class TransitionPropagation {
+    ctor public TransitionPropagation();
+    method public abstract void captureValues(android.support.transition.TransitionValues);
+    method public abstract java.lang.String[] getPropagationProperties();
+    method public abstract long getStartDelay(android.view.ViewGroup, android.support.transition.Transition, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+  }
+
+  public class TransitionSet extends android.support.transition.Transition {
+    ctor public TransitionSet();
+    ctor public TransitionSet(android.content.Context, android.util.AttributeSet);
+    method public android.support.transition.TransitionSet addListener(android.support.transition.Transition.TransitionListener);
+    method public android.support.transition.TransitionSet addTarget(android.view.View);
+    method public android.support.transition.TransitionSet addTarget(int);
+    method public android.support.transition.TransitionSet addTarget(java.lang.String);
+    method public android.support.transition.TransitionSet addTarget(java.lang.Class);
+    method public android.support.transition.TransitionSet addTransition(android.support.transition.Transition);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public int getOrdering();
+    method public android.support.transition.Transition getTransitionAt(int);
+    method public int getTransitionCount();
+    method public android.support.transition.TransitionSet removeListener(android.support.transition.Transition.TransitionListener);
+    method public android.support.transition.TransitionSet removeTarget(int);
+    method public android.support.transition.TransitionSet removeTarget(android.view.View);
+    method public android.support.transition.TransitionSet removeTarget(java.lang.Class);
+    method public android.support.transition.TransitionSet removeTarget(java.lang.String);
+    method public android.support.transition.TransitionSet removeTransition(android.support.transition.Transition);
+    method public android.support.transition.TransitionSet setDuration(long);
+    method public android.support.transition.TransitionSet setInterpolator(android.animation.TimeInterpolator);
+    method public android.support.transition.TransitionSet setOrdering(int);
+    method public android.support.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 public TransitionValues();
+    field public final java.util.Map<java.lang.String, java.lang.Object> values;
+    field public android.view.View view;
+  }
+
+  public abstract class Visibility extends android.support.transition.Transition {
+    ctor public Visibility();
+    ctor public Visibility(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public int getMode();
+    method public boolean isVisible(android.support.transition.TransitionValues);
+    method public android.animation.Animator onAppear(android.view.ViewGroup, android.support.transition.TransitionValues, int, android.support.transition.TransitionValues, int);
+    method public android.animation.Animator onAppear(android.view.ViewGroup, android.view.View, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public android.animation.Animator onDisappear(android.view.ViewGroup, android.support.transition.TransitionValues, int, android.support.transition.TransitionValues, int);
+    method public android.animation.Animator onDisappear(android.view.ViewGroup, android.view.View, android.support.transition.TransitionValues, android.support.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 android.support.transition.TransitionPropagation {
+    ctor public VisibilityPropagation();
+    method public void captureValues(android.support.transition.TransitionValues);
+    method public java.lang.String[] getPropagationProperties();
+    method public int getViewVisibility(android.support.transition.TransitionValues);
+    method public int getViewX(android.support.transition.TransitionValues);
+    method public int getViewY(android.support.transition.TransitionValues);
+  }
+
+}
+
diff --git a/tv-provider/Android.mk b/tv-provider/Android.mk
deleted file mode 100644
index 2368ad3..0000000
--- a/tv-provider/Android.mk
+++ /dev/null
@@ -1,36 +0,0 @@
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must include it with
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := android-support-tv-provider
-#
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-tv-provider
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-compat
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/tv-provider/api/27.1.0.txt b/tv-provider/api/27.1.0.txt
new file mode 100644
index 0000000..c486190
--- /dev/null
+++ b/tv-provider/api/27.1.0.txt
@@ -0,0 +1,545 @@
+package android.support.media.tv {
+
+  public final class Channel {
+    method public static android.support.media.tv.Channel fromCursor(android.database.Cursor);
+    method public int getAppLinkColor();
+    method public android.net.Uri getAppLinkIconUri();
+    method public android.content.Intent getAppLinkIntent() throws java.net.URISyntaxException;
+    method public android.net.Uri getAppLinkIntentUri();
+    method public android.net.Uri getAppLinkPosterArtUri();
+    method public java.lang.String getAppLinkText();
+    method public int getConfigurationDisplayOrder();
+    method public java.lang.String getDescription();
+    method public java.lang.String getDisplayName();
+    method public java.lang.String getDisplayNumber();
+    method public long getId();
+    method public java.lang.String getInputId();
+    method public byte[] getInternalProviderDataByteArray();
+    method public java.lang.Long getInternalProviderFlag1();
+    method public java.lang.Long getInternalProviderFlag2();
+    method public java.lang.Long getInternalProviderFlag3();
+    method public java.lang.Long getInternalProviderFlag4();
+    method public java.lang.String getInternalProviderId();
+    method public java.lang.String getNetworkAffiliation();
+    method public int getOriginalNetworkId();
+    method public java.lang.String getPackageName();
+    method public int getServiceId();
+    method public java.lang.String getServiceType();
+    method public java.lang.String getSystemChannelKey();
+    method public int getTransportStreamId();
+    method public java.lang.String getType();
+    method public java.lang.String getVideoFormat();
+    method public boolean isBrowsable();
+    method public boolean isLocked();
+    method public boolean isSearchable();
+    method public boolean isTransient();
+    method public android.content.ContentValues toContentValues();
+  }
+
+  public static final class Channel.Builder {
+    ctor public Channel.Builder();
+    ctor public Channel.Builder(android.support.media.tv.Channel);
+    method public android.support.media.tv.Channel build();
+    method public android.support.media.tv.Channel.Builder setAppLinkColor(int);
+    method public android.support.media.tv.Channel.Builder setAppLinkIconUri(android.net.Uri);
+    method public android.support.media.tv.Channel.Builder setAppLinkIntent(android.content.Intent);
+    method public android.support.media.tv.Channel.Builder setAppLinkIntentUri(android.net.Uri);
+    method public android.support.media.tv.Channel.Builder setAppLinkPosterArtUri(android.net.Uri);
+    method public android.support.media.tv.Channel.Builder setAppLinkText(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setConfigurationDisplayOrder(int);
+    method public android.support.media.tv.Channel.Builder setDescription(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setDisplayName(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setDisplayNumber(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setInputId(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setInternalProviderData(byte[]);
+    method public android.support.media.tv.Channel.Builder setInternalProviderData(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setInternalProviderFlag1(long);
+    method public android.support.media.tv.Channel.Builder setInternalProviderFlag2(long);
+    method public android.support.media.tv.Channel.Builder setInternalProviderFlag3(long);
+    method public android.support.media.tv.Channel.Builder setInternalProviderFlag4(long);
+    method public android.support.media.tv.Channel.Builder setInternalProviderId(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setNetworkAffiliation(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setOriginalNetworkId(int);
+    method public android.support.media.tv.Channel.Builder setSearchable(boolean);
+    method public android.support.media.tv.Channel.Builder setServiceId(int);
+    method public android.support.media.tv.Channel.Builder setServiceType(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setSystemChannelKey(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setTransient(boolean);
+    method public android.support.media.tv.Channel.Builder setTransportStreamId(int);
+    method public android.support.media.tv.Channel.Builder setType(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setVideoFormat(java.lang.String);
+  }
+
+  public class ChannelLogoUtils {
+    ctor public ChannelLogoUtils();
+    method public static android.graphics.Bitmap loadChannelLogo(android.content.Context, long);
+    method public static boolean storeChannelLogo(android.content.Context, long, android.net.Uri);
+    method public static boolean storeChannelLogo(android.content.Context, long, android.graphics.Bitmap);
+  }
+
+  public final class PreviewProgram {
+    method public static android.support.media.tv.PreviewProgram fromCursor(android.database.Cursor);
+    method public long getChannelId();
+    method public int getWeight();
+    method public android.content.ContentValues toContentValues();
+  }
+
+  public static final class PreviewProgram.Builder {
+    ctor public PreviewProgram.Builder();
+    ctor public PreviewProgram.Builder(android.support.media.tv.PreviewProgram);
+    method public android.support.media.tv.PreviewProgram build();
+    method public android.support.media.tv.PreviewProgram.Builder setChannelId(long);
+    method public android.support.media.tv.PreviewProgram.Builder setWeight(int);
+  }
+
+  public final class Program implements java.lang.Comparable {
+    method public int compareTo(android.support.media.tv.Program);
+    method public static android.support.media.tv.Program fromCursor(android.database.Cursor);
+    method public java.lang.String[] getBroadcastGenres();
+    method public long getChannelId();
+    method public long getEndTimeUtcMillis();
+    method public long getStartTimeUtcMillis();
+    method public boolean isRecordingProhibited();
+    method public android.content.ContentValues toContentValues();
+  }
+
+  public static class Program.Builder {
+    ctor public Program.Builder();
+    ctor public Program.Builder(android.support.media.tv.Program);
+    method public android.support.media.tv.Program build();
+    method public android.support.media.tv.Program.Builder setBroadcastGenres(java.lang.String[]);
+    method public android.support.media.tv.Program.Builder setChannelId(long);
+    method public android.support.media.tv.Program.Builder setEndTimeUtcMillis(long);
+    method public android.support.media.tv.Program.Builder setRecordingProhibited(boolean);
+    method public android.support.media.tv.Program.Builder setStartTimeUtcMillis(long);
+  }
+
+  public final class TvContractCompat {
+    method public static android.net.Uri buildChannelLogoUri(long);
+    method public static android.net.Uri buildChannelLogoUri(android.net.Uri);
+    method public static android.net.Uri buildChannelUri(long);
+    method public static android.net.Uri buildChannelUriForPassthroughInput(java.lang.String);
+    method public static android.net.Uri buildChannelsUriForInput(java.lang.String);
+    method public static java.lang.String buildInputId(android.content.ComponentName);
+    method public static android.net.Uri buildPreviewProgramUri(long);
+    method public static android.net.Uri buildPreviewProgramsUriForChannel(long);
+    method public static android.net.Uri buildPreviewProgramsUriForChannel(android.net.Uri);
+    method public static android.net.Uri buildProgramUri(long);
+    method public static android.net.Uri buildProgramsUriForChannel(long);
+    method public static android.net.Uri buildProgramsUriForChannel(android.net.Uri);
+    method public static android.net.Uri buildProgramsUriForChannel(long, long, long);
+    method public static android.net.Uri buildProgramsUriForChannel(android.net.Uri, long, long);
+    method public static android.net.Uri buildRecordedProgramUri(long);
+    method public static android.net.Uri buildWatchNextProgramUri(long);
+    method public static boolean isChannelUri(android.net.Uri);
+    method public static boolean isChannelUriForPassthroughInput(android.net.Uri);
+    method public static boolean isChannelUriForTunerInput(android.net.Uri);
+    method public static boolean isProgramUri(android.net.Uri);
+    method public static boolean isRecordedProgramUri(android.net.Uri);
+    method public static void requestChannelBrowsable(android.content.Context, long);
+    field public static final java.lang.String ACTION_INITIALIZE_PROGRAMS = "android.media.tv.action.INITIALIZE_PROGRAMS";
+    field public static final java.lang.String ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT = "android.media.tv.action.PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT";
+    field public static final java.lang.String ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.PREVIEW_PROGRAM_BROWSABLE_DISABLED";
+    field public static final java.lang.String ACTION_REQUEST_CHANNEL_BROWSABLE = "android.media.tv.action.REQUEST_CHANNEL_BROWSABLE";
+    field public static final java.lang.String ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED";
+    field public static final java.lang.String AUTHORITY = "android.media.tv";
+    field public static final java.lang.String EXTRA_CHANNEL_ID = "android.media.tv.extra.CHANNEL_ID";
+    field public static final java.lang.String EXTRA_PREVIEW_PROGRAM_ID = "android.media.tv.extra.PREVIEW_PROGRAM_ID";
+    field public static final java.lang.String EXTRA_WATCH_NEXT_PROGRAM_ID = "android.media.tv.extra.WATCH_NEXT_PROGRAM_ID";
+  }
+
+  public static abstract interface TvContractCompat.BaseTvColumns implements android.provider.BaseColumns {
+    field public static final java.lang.String COLUMN_PACKAGE_NAME = "package_name";
+  }
+
+  public static final class TvContractCompat.Channels implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    method public static java.lang.String getVideoResolution(java.lang.String);
+    field public static final java.lang.String COLUMN_APP_LINK_COLOR = "app_link_color";
+    field public static final java.lang.String COLUMN_APP_LINK_ICON_URI = "app_link_icon_uri";
+    field public static final java.lang.String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri";
+    field public static final java.lang.String COLUMN_APP_LINK_POSTER_ART_URI = "app_link_poster_art_uri";
+    field public static final java.lang.String COLUMN_APP_LINK_TEXT = "app_link_text";
+    field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
+    field public static final java.lang.String COLUMN_CONFIGURATION_DISPLAY_ORDER = "configuration_display_order";
+    field public static final java.lang.String COLUMN_DESCRIPTION = "description";
+    field public static final java.lang.String COLUMN_DISPLAY_NAME = "display_name";
+    field public static final java.lang.String COLUMN_DISPLAY_NUMBER = "display_number";
+    field public static final java.lang.String COLUMN_INPUT_ID = "input_id";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+    field public static final java.lang.String COLUMN_LOCKED = "locked";
+    field public static final java.lang.String COLUMN_NETWORK_AFFILIATION = "network_affiliation";
+    field public static final java.lang.String COLUMN_ORIGINAL_NETWORK_ID = "original_network_id";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SERVICE_ID = "service_id";
+    field public static final java.lang.String COLUMN_SERVICE_TYPE = "service_type";
+    field public static final java.lang.String COLUMN_SYSTEM_CHANNEL_KEY = "system_channel_key";
+    field public static final java.lang.String COLUMN_TRANSIENT = "transient";
+    field public static final java.lang.String COLUMN_TRANSPORT_STREAM_ID = "transport_stream_id";
+    field public static final java.lang.String COLUMN_TYPE = "type";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_FORMAT = "video_format";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/channel";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/channel";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final java.lang.String SERVICE_TYPE_AUDIO = "SERVICE_TYPE_AUDIO";
+    field public static final java.lang.String SERVICE_TYPE_AUDIO_VIDEO = "SERVICE_TYPE_AUDIO_VIDEO";
+    field public static final java.lang.String SERVICE_TYPE_OTHER = "SERVICE_TYPE_OTHER";
+    field public static final java.lang.String TYPE_1SEG = "TYPE_1SEG";
+    field public static final java.lang.String TYPE_ATSC_C = "TYPE_ATSC_C";
+    field public static final java.lang.String TYPE_ATSC_M_H = "TYPE_ATSC_M_H";
+    field public static final java.lang.String TYPE_ATSC_T = "TYPE_ATSC_T";
+    field public static final java.lang.String TYPE_CMMB = "TYPE_CMMB";
+    field public static final java.lang.String TYPE_DTMB = "TYPE_DTMB";
+    field public static final java.lang.String TYPE_DVB_C = "TYPE_DVB_C";
+    field public static final java.lang.String TYPE_DVB_C2 = "TYPE_DVB_C2";
+    field public static final java.lang.String TYPE_DVB_H = "TYPE_DVB_H";
+    field public static final java.lang.String TYPE_DVB_S = "TYPE_DVB_S";
+    field public static final java.lang.String TYPE_DVB_S2 = "TYPE_DVB_S2";
+    field public static final java.lang.String TYPE_DVB_SH = "TYPE_DVB_SH";
+    field public static final java.lang.String TYPE_DVB_T = "TYPE_DVB_T";
+    field public static final java.lang.String TYPE_DVB_T2 = "TYPE_DVB_T2";
+    field public static final java.lang.String TYPE_ISDB_C = "TYPE_ISDB_C";
+    field public static final java.lang.String TYPE_ISDB_S = "TYPE_ISDB_S";
+    field public static final java.lang.String TYPE_ISDB_T = "TYPE_ISDB_T";
+    field public static final java.lang.String TYPE_ISDB_TB = "TYPE_ISDB_TB";
+    field public static final java.lang.String TYPE_NTSC = "TYPE_NTSC";
+    field public static final java.lang.String TYPE_OTHER = "TYPE_OTHER";
+    field public static final java.lang.String TYPE_PAL = "TYPE_PAL";
+    field public static final java.lang.String TYPE_PREVIEW = "TYPE_PREVIEW";
+    field public static final java.lang.String TYPE_SECAM = "TYPE_SECAM";
+    field public static final java.lang.String TYPE_S_DMB = "TYPE_S_DMB";
+    field public static final java.lang.String TYPE_T_DMB = "TYPE_T_DMB";
+    field public static final java.lang.String VIDEO_FORMAT_1080I = "VIDEO_FORMAT_1080I";
+    field public static final java.lang.String VIDEO_FORMAT_1080P = "VIDEO_FORMAT_1080P";
+    field public static final java.lang.String VIDEO_FORMAT_2160P = "VIDEO_FORMAT_2160P";
+    field public static final java.lang.String VIDEO_FORMAT_240P = "VIDEO_FORMAT_240P";
+    field public static final java.lang.String VIDEO_FORMAT_360P = "VIDEO_FORMAT_360P";
+    field public static final java.lang.String VIDEO_FORMAT_4320P = "VIDEO_FORMAT_4320P";
+    field public static final java.lang.String VIDEO_FORMAT_480I = "VIDEO_FORMAT_480I";
+    field public static final java.lang.String VIDEO_FORMAT_480P = "VIDEO_FORMAT_480P";
+    field public static final java.lang.String VIDEO_FORMAT_576I = "VIDEO_FORMAT_576I";
+    field public static final java.lang.String VIDEO_FORMAT_576P = "VIDEO_FORMAT_576P";
+    field public static final java.lang.String VIDEO_FORMAT_720P = "VIDEO_FORMAT_720P";
+    field public static final java.lang.String VIDEO_RESOLUTION_ED = "VIDEO_RESOLUTION_ED";
+    field public static final java.lang.String VIDEO_RESOLUTION_FHD = "VIDEO_RESOLUTION_FHD";
+    field public static final java.lang.String VIDEO_RESOLUTION_HD = "VIDEO_RESOLUTION_HD";
+    field public static final java.lang.String VIDEO_RESOLUTION_SD = "VIDEO_RESOLUTION_SD";
+    field public static final java.lang.String VIDEO_RESOLUTION_UHD = "VIDEO_RESOLUTION_UHD";
+  }
+
+  public static final class TvContractCompat.Channels.Logo {
+    field public static final java.lang.String CONTENT_DIRECTORY = "logo";
+  }
+
+  public static final class TvContractCompat.PreviewPrograms implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final int ASPECT_RATIO_16_9 = 0; // 0x0
+    field public static final int ASPECT_RATIO_1_1 = 3; // 0x3
+    field public static final int ASPECT_RATIO_2_3 = 4; // 0x4
+    field public static final int ASPECT_RATIO_3_2 = 1; // 0x1
+    field public static final int ASPECT_RATIO_4_3 = 2; // 0x2
+    field public static final int ASPECT_RATIO_MOVIE_POSTER = 5; // 0x5
+    field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0
+    field public static final int AVAILABILITY_FREE = 4; // 0x4
+    field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1
+    field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2
+    field public static final int AVAILABILITY_PURCHASED = 3; // 0x3
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+    field public static final java.lang.String COLUMN_AUTHOR = "author";
+    field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
+    field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+    field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+    field public static final java.lang.String COLUMN_CONTENT_ID = "content_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+    field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
+    field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_GENRE = "genre";
+    field public static final java.lang.String COLUMN_INTENT_URI = "intent_uri";
+    field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
+    field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+    field public static final java.lang.String COLUMN_ITEM_COUNT = "item_count";
+    field public static final java.lang.String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
+    field public static final java.lang.String COLUMN_LIVE = "live";
+    field public static final java.lang.String COLUMN_LOGO_CONTENT_DESCRIPTION = "logo_content_description";
+    field public static final java.lang.String COLUMN_LOGO_URI = "logo_uri";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
+    field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+    field public static final java.lang.String COLUMN_PREVIEW_AUDIO_URI = "preview_audio_uri";
+    field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
+    field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+    field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
+    field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+    field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_TRANSIENT = "transient";
+    field public static final java.lang.String COLUMN_TYPE = "type";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+    field public static final java.lang.String COLUMN_WEIGHT = "weight";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/preview_program";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/preview_program";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final int INTERACTION_TYPE_FANS = 3; // 0x3
+    field public static final int INTERACTION_TYPE_FOLLOWERS = 2; // 0x2
+    field public static final int INTERACTION_TYPE_LIKES = 4; // 0x4
+    field public static final int INTERACTION_TYPE_LISTENS = 1; // 0x1
+    field public static final int INTERACTION_TYPE_THUMBS = 5; // 0x5
+    field public static final int INTERACTION_TYPE_VIEWERS = 6; // 0x6
+    field public static final int INTERACTION_TYPE_VIEWS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+    field public static final int TYPE_ALBUM = 8; // 0x8
+    field public static final int TYPE_ARTIST = 9; // 0x9
+    field public static final int TYPE_CHANNEL = 6; // 0x6
+    field public static final int TYPE_CLIP = 4; // 0x4
+    field public static final int TYPE_EVENT = 5; // 0x5
+    field public static final int TYPE_GAME = 12; // 0xc
+    field public static final int TYPE_MOVIE = 0; // 0x0
+    field public static final int TYPE_PLAYLIST = 10; // 0xa
+    field public static final int TYPE_STATION = 11; // 0xb
+    field public static final int TYPE_TRACK = 7; // 0x7
+    field public static final int TYPE_TV_EPISODE = 3; // 0x3
+    field public static final int TYPE_TV_SEASON = 2; // 0x2
+    field public static final int TYPE_TV_SERIES = 1; // 0x1
+  }
+
+  public static final class TvContractCompat.Programs implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+    field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+    field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+    field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final deprecated java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+    field public static final java.lang.String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final deprecated java.lang.String COLUMN_SEASON_NUMBER = "season_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+    field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/program";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+  }
+
+  public static final class TvContractCompat.Programs.Genres {
+    method public static java.lang.String[] decode(java.lang.String);
+    method public static java.lang.String encode(java.lang.String...);
+    method public static boolean isCanonical(java.lang.String);
+    field public static final java.lang.String ANIMAL_WILDLIFE = "ANIMAL_WILDLIFE";
+    field public static final java.lang.String ARTS = "ARTS";
+    field public static final java.lang.String COMEDY = "COMEDY";
+    field public static final java.lang.String DRAMA = "DRAMA";
+    field public static final java.lang.String EDUCATION = "EDUCATION";
+    field public static final java.lang.String ENTERTAINMENT = "ENTERTAINMENT";
+    field public static final java.lang.String FAMILY_KIDS = "FAMILY_KIDS";
+    field public static final java.lang.String GAMING = "GAMING";
+    field public static final java.lang.String LIFE_STYLE = "LIFE_STYLE";
+    field public static final java.lang.String MOVIES = "MOVIES";
+    field public static final java.lang.String MUSIC = "MUSIC";
+    field public static final java.lang.String NEWS = "NEWS";
+    field public static final java.lang.String PREMIER = "PREMIER";
+    field public static final java.lang.String SHOPPING = "SHOPPING";
+    field public static final java.lang.String SPORTS = "SPORTS";
+    field public static final java.lang.String TECH_SCIENCE = "TECH_SCIENCE";
+    field public static final java.lang.String TRAVEL = "TRAVEL";
+  }
+
+  public static final class TvContractCompat.RecordedPrograms implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+    field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+    field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+    field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_INPUT_ID = "input_id";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+    field public static final java.lang.String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes";
+    field public static final java.lang.String COLUMN_RECORDING_DATA_URI = "recording_data_uri";
+    field public static final java.lang.String COLUMN_RECORDING_DURATION_MILLIS = "recording_duration_millis";
+    field public static final java.lang.String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS = "recording_expire_time_utc_millis";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+    field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/recorded_program";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/recorded_program";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+  }
+
+  public static final class TvContractCompat.WatchNextPrograms implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final int ASPECT_RATIO_16_9 = 0; // 0x0
+    field public static final int ASPECT_RATIO_1_1 = 3; // 0x3
+    field public static final int ASPECT_RATIO_2_3 = 4; // 0x4
+    field public static final int ASPECT_RATIO_3_2 = 1; // 0x1
+    field public static final int ASPECT_RATIO_4_3 = 2; // 0x2
+    field public static final int ASPECT_RATIO_MOVIE_POSTER = 5; // 0x5
+    field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0
+    field public static final int AVAILABILITY_FREE = 4; // 0x4
+    field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1
+    field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2
+    field public static final int AVAILABILITY_PURCHASED = 3; // 0x3
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+    field public static final java.lang.String COLUMN_AUTHOR = "author";
+    field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
+    field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+    field public static final java.lang.String COLUMN_CONTENT_ID = "content_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+    field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
+    field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_GENRE = "genre";
+    field public static final java.lang.String COLUMN_INTENT_URI = "intent_uri";
+    field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
+    field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+    field public static final java.lang.String COLUMN_ITEM_COUNT = "item_count";
+    field public static final java.lang.String COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS = "last_engagement_time_utc_millis";
+    field public static final java.lang.String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
+    field public static final java.lang.String COLUMN_LIVE = "live";
+    field public static final java.lang.String COLUMN_LOGO_CONTENT_DESCRIPTION = "logo_content_description";
+    field public static final java.lang.String COLUMN_LOGO_URI = "logo_uri";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
+    field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+    field public static final java.lang.String COLUMN_PREVIEW_AUDIO_URI = "preview_audio_uri";
+    field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
+    field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+    field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
+    field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+    field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_TRANSIENT = "transient";
+    field public static final java.lang.String COLUMN_TYPE = "type";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+    field public static final java.lang.String COLUMN_WATCH_NEXT_TYPE = "watch_next_type";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/watch_next_program";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/watch_next_program";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final int INTERACTION_TYPE_FANS = 3; // 0x3
+    field public static final int INTERACTION_TYPE_FOLLOWERS = 2; // 0x2
+    field public static final int INTERACTION_TYPE_LIKES = 4; // 0x4
+    field public static final int INTERACTION_TYPE_LISTENS = 1; // 0x1
+    field public static final int INTERACTION_TYPE_THUMBS = 5; // 0x5
+    field public static final int INTERACTION_TYPE_VIEWERS = 6; // 0x6
+    field public static final int INTERACTION_TYPE_VIEWS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+    field public static final int TYPE_ALBUM = 8; // 0x8
+    field public static final int TYPE_ARTIST = 9; // 0x9
+    field public static final int TYPE_CHANNEL = 6; // 0x6
+    field public static final int TYPE_CLIP = 4; // 0x4
+    field public static final int TYPE_EVENT = 5; // 0x5
+    field public static final int TYPE_GAME = 12; // 0xc
+    field public static final int TYPE_MOVIE = 0; // 0x0
+    field public static final int TYPE_PLAYLIST = 10; // 0xa
+    field public static final int TYPE_STATION = 11; // 0xb
+    field public static final int TYPE_TRACK = 7; // 0x7
+    field public static final int TYPE_TV_EPISODE = 3; // 0x3
+    field public static final int TYPE_TV_SEASON = 2; // 0x2
+    field public static final int TYPE_TV_SERIES = 1; // 0x1
+    field public static final int WATCH_NEXT_TYPE_CONTINUE = 0; // 0x0
+    field public static final int WATCH_NEXT_TYPE_NEW = 2; // 0x2
+    field public static final int WATCH_NEXT_TYPE_NEXT = 1; // 0x1
+    field public static final int WATCH_NEXT_TYPE_WATCHLIST = 3; // 0x3
+  }
+
+  public final class WatchNextProgram {
+    method public static android.support.media.tv.WatchNextProgram fromCursor(android.database.Cursor);
+    method public long getLastEngagementTimeUtcMillis();
+    method public int getWatchNextType();
+    method public android.content.ContentValues toContentValues();
+    field public static final int WATCH_NEXT_TYPE_UNKNOWN = -1; // 0xffffffff
+  }
+
+  public static final class WatchNextProgram.Builder {
+    ctor public WatchNextProgram.Builder();
+    ctor public WatchNextProgram.Builder(android.support.media.tv.WatchNextProgram);
+    method public android.support.media.tv.WatchNextProgram build();
+    method public android.support.media.tv.WatchNextProgram.Builder setLastEngagementTimeUtcMillis(long);
+    method public android.support.media.tv.WatchNextProgram.Builder setWatchNextType(int);
+  }
+
+}
+
diff --git a/v13/Android.mk b/v13/Android.mk
deleted file mode 100644
index d37a4d7..0000000
--- a/v13/Android.mk
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright (C) 2011 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-v13 \
-#       android-support-v4
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-v13
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := \
-        $(call all-java-files-under, src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
-# Some projects expect to inherit android-support-v4 from
-# android-support-v13, so we need to keep it static until they can be fixed.
-LOCAL_STATIC_ANDROID_LIBRARIES := \
-        android-support-v4
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-        android-support-v4
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-LOCAL_JAR_EXCLUDE_FILES := none
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
diff --git a/v13/api/27.1.0.txt b/v13/api/27.1.0.txt
new file mode 100644
index 0000000..fd72d5c
--- /dev/null
+++ b/v13/api/27.1.0.txt
@@ -0,0 +1,74 @@
+package android.support.v13.app {
+
+  public deprecated class ActivityCompat extends android.support.v4.app.ActivityCompat {
+    ctor protected deprecated ActivityCompat();
+  }
+
+  public deprecated class FragmentCompat {
+    ctor public deprecated FragmentCompat();
+    method public static deprecated void requestPermissions(android.app.Fragment, java.lang.String[], int);
+    method public static deprecated void setMenuVisibility(android.app.Fragment, boolean);
+    method public static deprecated void setPermissionCompatDelegate(android.support.v13.app.FragmentCompat.PermissionCompatDelegate);
+    method public static deprecated void setUserVisibleHint(android.app.Fragment, boolean);
+    method public static deprecated boolean shouldShowRequestPermissionRationale(android.app.Fragment, java.lang.String);
+  }
+
+  public static abstract deprecated interface FragmentCompat.OnRequestPermissionsResultCallback {
+    method public abstract deprecated void onRequestPermissionsResult(int, java.lang.String[], int[]);
+  }
+
+  public static abstract deprecated interface FragmentCompat.PermissionCompatDelegate {
+    method public abstract deprecated boolean requestPermissions(android.app.Fragment, java.lang.String[], int);
+  }
+
+  public abstract deprecated class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
+    ctor public deprecated FragmentPagerAdapter(android.app.FragmentManager);
+    method public deprecated void destroyItem(android.view.ViewGroup, int, java.lang.Object);
+    method public deprecated void finishUpdate(android.view.ViewGroup);
+    method public abstract deprecated android.app.Fragment getItem(int);
+    method public deprecated long getItemId(int);
+    method public deprecated java.lang.Object instantiateItem(android.view.ViewGroup, int);
+    method public deprecated boolean isViewFromObject(android.view.View, java.lang.Object);
+    method public deprecated void restoreState(android.os.Parcelable, java.lang.ClassLoader);
+    method public deprecated android.os.Parcelable saveState();
+    method public deprecated void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
+    method public deprecated void startUpdate(android.view.ViewGroup);
+  }
+
+  public abstract deprecated class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
+    ctor public deprecated FragmentStatePagerAdapter(android.app.FragmentManager);
+    method public deprecated void destroyItem(android.view.ViewGroup, int, java.lang.Object);
+    method public deprecated void finishUpdate(android.view.ViewGroup);
+    method public abstract deprecated android.app.Fragment getItem(int);
+    method public deprecated java.lang.Object instantiateItem(android.view.ViewGroup, int);
+    method public deprecated boolean isViewFromObject(android.view.View, java.lang.Object);
+    method public deprecated void restoreState(android.os.Parcelable, java.lang.ClassLoader);
+    method public deprecated android.os.Parcelable saveState();
+    method public deprecated void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
+    method public deprecated void startUpdate(android.view.ViewGroup);
+  }
+
+  public deprecated class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
+    ctor public deprecated FragmentTabHost(android.content.Context);
+    ctor public deprecated FragmentTabHost(android.content.Context, android.util.AttributeSet);
+    method public deprecated void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
+    method protected deprecated void onAttachedToWindow();
+    method protected deprecated void onDetachedFromWindow();
+    method protected deprecated void onRestoreInstanceState(android.os.Parcelable);
+    method protected deprecated android.os.Parcelable onSaveInstanceState();
+    method public deprecated void onTabChanged(java.lang.String);
+    method public deprecated void setOnTabChangedListener(android.widget.TabHost.OnTabChangeListener);
+    method public deprecated void setup();
+    method public deprecated void setup(android.content.Context, android.app.FragmentManager);
+    method public deprecated void setup(android.content.Context, android.app.FragmentManager, int);
+  }
+
+}
+
+package android.support.v13.view {
+
+  public deprecated class ViewCompat extends android.support.v4.view.ViewCompat {
+  }
+
+}
+
diff --git a/v14/Android.mk b/v14/Android.mk
deleted file mode 100644
index 365b3b1..0000000
--- a/v14/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2015 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.
-
-LOCAL_PATH:= $(call my-dir)
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/v14/preference/Android.mk b/v14/preference/Android.mk
deleted file mode 100644
index 47f1071..0000000
--- a/v14/preference/Android.mk
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright (C) 2015 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-v14-preference \
-#       android-support-v7-preference \
-#       android-support-v7-appcompat \
-#       android-support-v7-recyclerview \
-#       android-support-v4
-#
-# in their makefiles to include the resources in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-v14-preference
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-v7-appcompat \
-    android-support-v7-recyclerview \
-    android-support-v4
-LOCAL_STATIC_ANDROID_LIBRARIES := \
-    android-support-v7-preference
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/v4/Android.mk b/v4/Android.mk
deleted file mode 100644
index d2e4565..0000000
--- a/v4/Android.mk
+++ /dev/null
@@ -1,43 +0,0 @@
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-v4
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-v4
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-# Some projects expect to inherit android-support-annotations from
-# android-support-v4, so we need to keep it static until they can be fixed.
-LOCAL_STATIC_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_STATIC_ANDROID_LIBRARIES := \
-    android-support-compat \
-    android-support-media-compat \
-    android-support-core-utils \
-    android-support-core-ui \
-    android-support-fragment
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/v7/Android.mk b/v7/Android.mk
deleted file mode 100644
index 14ff0aa..0000000
--- a/v7/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2014 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.
-
-LOCAL_PATH:= $(call my-dir)
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/v7/appcompat/Android.mk b/v7/appcompat/Android.mk
deleted file mode 100644
index 500a2a2..0000000
--- a/v7/appcompat/Android.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright (C) 2012 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-v7-appcompat \
-#       android-support-v4
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-v7-appcompat
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_STATIC_JAVA_LIBRARIES := \
-    android-support-vectordrawable \
-    android-support-animatedvectordrawable
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-v4
-LOCAL_AAPT_FLAGS := --no-version-vectors
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/v7/appcompat/api/27.1.0.txt b/v7/appcompat/api/27.1.0.txt
new file mode 100644
index 0000000..5d4fa6e
--- /dev/null
+++ b/v7/appcompat/api/27.1.0.txt
@@ -0,0 +1,945 @@
+package android.support.v7.app {
+
+  public abstract class ActionBar {
+    ctor public ActionBar();
+    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
+    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab);
+    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, boolean);
+    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int);
+    method public abstract deprecated void addTab(android.support.v7.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 public abstract deprecated int getNavigationItemCount();
+    method public abstract deprecated int getNavigationMode();
+    method public abstract deprecated int getSelectedNavigationIndex();
+    method public abstract deprecated android.support.v7.app.ActionBar.Tab getSelectedTab();
+    method public abstract java.lang.CharSequence getSubtitle();
+    method public abstract deprecated android.support.v7.app.ActionBar.Tab getTabAt(int);
+    method public abstract deprecated int getTabCount();
+    method public android.content.Context getThemedContext();
+    method public abstract java.lang.CharSequence getTitle();
+    method public abstract void hide();
+    method public boolean isHideOnContentScrollEnabled();
+    method public abstract boolean isShowing();
+    method public abstract deprecated android.support.v7.app.ActionBar.Tab newTab();
+    method public abstract deprecated void removeAllTabs();
+    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
+    method public abstract deprecated void removeTab(android.support.v7.app.ActionBar.Tab);
+    method public abstract deprecated void removeTabAt(int);
+    method public abstract deprecated void selectTab(android.support.v7.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, android.support.v7.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(java.lang.CharSequence);
+    method public void setHomeActionContentDescription(int);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
+    method public void setHomeAsUpIndicator(int);
+    method public void setHomeButtonEnabled(boolean);
+    method public abstract void setIcon(int);
+    method public abstract void setIcon(android.graphics.drawable.Drawable);
+    method public abstract deprecated void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
+    method public abstract void setLogo(int);
+    method public abstract void setLogo(android.graphics.drawable.Drawable);
+    method public abstract deprecated void setNavigationMode(int);
+    method public abstract deprecated void setSelectedNavigationItem(int);
+    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public abstract void setSubtitle(java.lang.CharSequence);
+    method public abstract void setSubtitle(int);
+    method public abstract void setTitle(java.lang.CharSequence);
+    method public abstract void setTitle(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 public static final deprecated int NAVIGATION_MODE_LIST = 1; // 0x1
+    field public static final deprecated int NAVIGATION_MODE_STANDARD = 0; // 0x0
+    field public static final deprecated 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(android.support.v7.app.ActionBar.LayoutParams);
+    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
+    field public int gravity;
+  }
+
+  public static abstract interface ActionBar.OnMenuVisibilityListener {
+    method public abstract void onMenuVisibilityChanged(boolean);
+  }
+
+  public static abstract deprecated interface ActionBar.OnNavigationListener {
+    method public abstract boolean onNavigationItemSelected(int, long);
+  }
+
+  public static abstract deprecated class ActionBar.Tab {
+    ctor public ActionBar.Tab();
+    method public abstract java.lang.CharSequence getContentDescription();
+    method public abstract android.view.View getCustomView();
+    method public abstract android.graphics.drawable.Drawable getIcon();
+    method public abstract int getPosition();
+    method public abstract java.lang.Object getTag();
+    method public abstract java.lang.CharSequence getText();
+    method public abstract void select();
+    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
+    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
+    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
+    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
+    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
+    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
+    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
+    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
+    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
+    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  public static abstract deprecated interface ActionBar.TabListener {
+    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
+    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
+    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
+  }
+
+  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
+    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
+    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
+    method public android.support.v7.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(android.support.v7.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 abstract interface ActionBarDrawerToggle.Delegate {
+    method public abstract android.content.Context getActionBarThemedContext();
+    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
+    method public abstract boolean isNavigationVisible();
+    method public abstract void setActionBarDescription(int);
+    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
+  }
+
+  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
+    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+  }
+
+  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
+    ctor protected AlertDialog(android.content.Context);
+    ctor protected AlertDialog(android.content.Context, 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, java.lang.CharSequence, android.os.Message);
+    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+    method public void setButton(int, java.lang.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(java.lang.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, int);
+    method public android.support.v7.app.AlertDialog create();
+    method public android.content.Context getContext();
+    method public android.support.v7.app.AlertDialog.Builder setAdapter(android.widget.ListAdapter, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setCancelable(boolean);
+    method public android.support.v7.app.AlertDialog.Builder setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, java.lang.String);
+    method public android.support.v7.app.AlertDialog.Builder setCustomTitle(android.view.View);
+    method public android.support.v7.app.AlertDialog.Builder setIcon(int);
+    method public android.support.v7.app.AlertDialog.Builder setIcon(android.graphics.drawable.Drawable);
+    method public android.support.v7.app.AlertDialog.Builder setIconAttribute(int);
+    method public deprecated android.support.v7.app.AlertDialog.Builder setInverseBackgroundForced(boolean);
+    method public android.support.v7.app.AlertDialog.Builder setItems(int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setItems(java.lang.CharSequence[], android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setMessage(int);
+    method public android.support.v7.app.AlertDialog.Builder setMessage(java.lang.CharSequence);
+    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(int, boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(java.lang.CharSequence[], boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(android.database.Cursor, java.lang.String, java.lang.String, android.content.DialogInterface.OnMultiChoiceClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setNegativeButtonIcon(android.graphics.drawable.Drawable);
+    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setNeutralButtonIcon(android.graphics.drawable.Drawable);
+    method public android.support.v7.app.AlertDialog.Builder setOnCancelListener(android.content.DialogInterface.OnCancelListener);
+    method public android.support.v7.app.AlertDialog.Builder setOnDismissListener(android.content.DialogInterface.OnDismissListener);
+    method public android.support.v7.app.AlertDialog.Builder setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
+    method public android.support.v7.app.AlertDialog.Builder setOnKeyListener(android.content.DialogInterface.OnKeyListener);
+    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setPositiveButtonIcon(android.graphics.drawable.Drawable);
+    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(int, int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.database.Cursor, int, java.lang.String, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(java.lang.CharSequence[], int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.widget.ListAdapter, int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setTitle(int);
+    method public android.support.v7.app.AlertDialog.Builder setTitle(java.lang.CharSequence);
+    method public android.support.v7.app.AlertDialog.Builder setView(int);
+    method public android.support.v7.app.AlertDialog.Builder setView(android.view.View);
+    method public android.support.v7.app.AlertDialog show();
+  }
+
+  public class AppCompatActivity extends android.support.v4.app.FragmentActivity implements android.support.v7.app.ActionBarDrawerToggle.DelegateProvider android.support.v7.app.AppCompatCallback android.support.v4.app.TaskStackBuilder.SupportParentable {
+    ctor public AppCompatActivity();
+    method public android.support.v7.app.AppCompatDelegate getDelegate();
+    method public android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+    method public android.support.v7.app.ActionBar getSupportActionBar();
+    method public android.content.Intent getSupportParentActivityIntent();
+    method public void onCreateSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
+    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+    method public void onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
+    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
+    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
+    method public deprecated void onSupportContentChanged();
+    method public boolean onSupportNavigateUp();
+    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
+    method public void setSupportActionBar(android.support.v7.widget.Toolbar);
+    method public deprecated void setSupportProgress(int);
+    method public deprecated void setSupportProgressBarIndeterminate(boolean);
+    method public deprecated void setSupportProgressBarIndeterminateVisibility(boolean);
+    method public deprecated void setSupportProgressBarVisibility(boolean);
+    method public android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.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 abstract interface AppCompatCallback {
+    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
+    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
+    method public abstract android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.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 public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
+    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
+    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
+    method public abstract <T extends android.view.View> T findViewById(int);
+    method public static int getDefaultNightMode();
+    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+    method public abstract android.view.MenuInflater getMenuInflater();
+    method public abstract android.support.v7.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(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 public abstract void setLocalNightMode(int);
+    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
+    method public abstract void setTitle(java.lang.CharSequence);
+    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.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 public static final int MODE_NIGHT_AUTO = 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_YES = 2; // 0x2
+  }
+
+  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.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 android.support.v7.app.AppCompatDelegate getDelegate();
+    method public android.support.v7.app.ActionBar getSupportActionBar();
+    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
+    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
+    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
+    method public boolean supportRequestWindowFeature(int);
+  }
+
+  public class AppCompatDialogFragment extends android.support.v4.app.DialogFragment {
+    ctor public AppCompatDialogFragment();
+  }
+
+  public class AppCompatViewInflater {
+    ctor public AppCompatViewInflater();
+    method protected android.support.v7.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
+    method protected android.support.v7.widget.AppCompatButton createButton(android.content.Context, android.util.AttributeSet);
+    method protected android.support.v7.widget.AppCompatCheckBox createCheckBox(android.content.Context, android.util.AttributeSet);
+    method protected android.support.v7.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context, android.util.AttributeSet);
+    method protected android.support.v7.widget.AppCompatEditText createEditText(android.content.Context, android.util.AttributeSet);
+    method protected android.support.v7.widget.AppCompatImageButton createImageButton(android.content.Context, android.util.AttributeSet);
+    method protected android.support.v7.widget.AppCompatImageView createImageView(android.content.Context, android.util.AttributeSet);
+    method protected android.support.v7.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
+    method protected android.support.v7.widget.AppCompatRadioButton createRadioButton(android.content.Context, android.util.AttributeSet);
+    method protected android.support.v7.widget.AppCompatRatingBar createRatingBar(android.content.Context, android.util.AttributeSet);
+    method protected android.support.v7.widget.AppCompatSeekBar createSeekBar(android.content.Context, android.util.AttributeSet);
+    method protected android.support.v7.widget.AppCompatSpinner createSpinner(android.content.Context, android.util.AttributeSet);
+    method protected android.support.v7.widget.AppCompatTextView createTextView(android.content.Context, android.util.AttributeSet);
+    method protected android.view.View createView(android.content.Context, java.lang.String, android.util.AttributeSet);
+  }
+
+}
+
+package android.support.v7.content.res {
+
+  public final class AppCompatResources {
+    method public static android.content.res.ColorStateList getColorStateList(android.content.Context, int);
+    method public static android.graphics.drawable.Drawable getDrawable(android.content.Context, int);
+  }
+
+}
+
+package android.support.v7.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 public int getColor();
+    method public int getDirection();
+    method public float getGapSize();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method 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(int);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setDirection(int);
+    method public void setGapSize(float);
+    method public void setProgress(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 android.support.v7.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 java.lang.CharSequence getSubtitle();
+    method public java.lang.Object getTag();
+    method public abstract java.lang.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(java.lang.CharSequence);
+    method public abstract void setSubtitle(int);
+    method public void setTag(java.lang.Object);
+    method public abstract void setTitle(java.lang.CharSequence);
+    method public abstract void setTitle(int);
+    method public void setTitleOptionalHint(boolean);
+  }
+
+  public static abstract interface ActionMode.Callback {
+    method public abstract boolean onActionItemClicked(android.support.v7.view.ActionMode, android.view.MenuItem);
+    method public abstract boolean onCreateActionMode(android.support.v7.view.ActionMode, android.view.Menu);
+    method public abstract void onDestroyActionMode(android.support.v7.view.ActionMode);
+    method public abstract boolean onPrepareActionMode(android.support.v7.view.ActionMode, android.view.Menu);
+  }
+
+  public abstract interface CollapsibleActionView {
+    method public abstract void onActionViewCollapsed();
+    method public abstract void onActionViewExpanded();
+  }
+
+  public class ContextThemeWrapper extends android.content.ContextWrapper {
+    ctor public ContextThemeWrapper();
+    ctor public ContextThemeWrapper(android.content.Context, 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 android.support.v7.widget {
+
+  public class ActionMenuView extends android.support.v7.widget.LinearLayoutCompat {
+    ctor public ActionMenuView(android.content.Context);
+    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
+    method public void dismissPopupMenus();
+    method protected android.support.v7.widget.ActionMenuView.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.ActionMenuView.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v7.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(android.support.v7.widget.ActionMenuView.OnMenuItemClickListener);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable);
+    method public void setPopupTheme(int);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class ActionMenuView.LayoutParams extends android.support.v7.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(android.support.v7.widget.ActionMenuView.LayoutParams);
+    ctor public ActionMenuView.LayoutParams(int, int);
+    field public int cellsUsed;
+    field public boolean expandable;
+    field public int extraPixels;
+    field public boolean isOverflowButton;
+    field public boolean preventEdgeOffset;
+  }
+
+  public static abstract interface ActionMenuView.OnMenuItemClickListener {
+    method public abstract boolean onMenuItemClick(android.view.MenuItem);
+  }
+
+  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements android.support.v4.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 public android.content.res.ColorStateList getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode);
+    method public void setTextAppearance(android.content.Context, int);
+  }
+
+  public class AppCompatButton extends android.widget.Button implements android.support.v4.widget.AutoSizeableTextView android.support.v4.view.TintableBackgroundView {
+    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 public android.content.res.ColorStateList getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode getSupportBackgroundTintMode();
+    method public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setSupportAllCaps(boolean);
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode);
+    method public void setTextAppearance(android.content.Context, int);
+  }
+
+  public class AppCompatCheckBox extends android.widget.CheckBox implements android.support.v4.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 public android.content.res.ColorStateList getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList);
+    method 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 android.support.v4.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 public android.content.res.ColorStateList getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode);
+    method public void setTextAppearance(android.content.Context, int);
+  }
+
+  public class AppCompatImageButton extends android.widget.ImageButton implements android.support.v4.view.TintableBackgroundView android.support.v4.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 public android.content.res.ColorStateList getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode getSupportBackgroundTintMode();
+    method public android.content.res.ColorStateList getSupportImageTintList();
+    method public android.graphics.PorterDuff.Mode getSupportImageTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode);
+    method public void setSupportImageTintList(android.content.res.ColorStateList);
+    method public void setSupportImageTintMode(android.graphics.PorterDuff.Mode);
+  }
+
+  public class AppCompatImageView extends android.widget.ImageView implements android.support.v4.view.TintableBackgroundView android.support.v4.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 public android.content.res.ColorStateList getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode getSupportBackgroundTintMode();
+    method public android.content.res.ColorStateList getSupportImageTintList();
+    method public android.graphics.PorterDuff.Mode getSupportImageTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode);
+    method public void setSupportImageTintList(android.content.res.ColorStateList);
+    method public void setSupportImageTintMode(android.graphics.PorterDuff.Mode);
+  }
+
+  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements android.support.v4.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 public android.content.res.ColorStateList getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode);
+    method public void setTextAppearance(android.content.Context, int);
+  }
+
+  public class AppCompatRadioButton extends android.widget.RadioButton implements android.support.v4.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 public android.content.res.ColorStateList getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList);
+    method 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 android.support.v4.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 public android.content.res.ColorStateList getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode);
+  }
+
+  public class AppCompatTextView extends android.widget.TextView implements android.support.v4.widget.AutoSizeableTextView android.support.v4.view.TintableBackgroundView {
+    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 public android.content.res.ColorStateList getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode getSupportBackgroundTintMode();
+    method public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode);
+    method public void setTextAppearance(android.content.Context, 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 android.support.v7.widget.LinearLayoutCompat.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.LinearLayoutCompat.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v7.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(android.support.v7.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, int);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int, 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 public int getAnimationStyle();
+    method public android.graphics.drawable.Drawable getBackground();
+    method public int getHeight();
+    method public int getHorizontalOffset();
+    method public int getInputMethodMode();
+    method public android.widget.ListView getListView();
+    method public int getPromptPosition();
+    method public java.lang.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(int);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setContentWidth(int);
+    method public void setDropDownGravity(int);
+    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, int, 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(int);
+    method public void setGravity(int);
+    method public void setOnDismissListener(android.support.v7.widget.PopupMenu.OnDismissListener);
+    method public void setOnMenuItemClickListener(android.support.v7.widget.PopupMenu.OnMenuItemClickListener);
+    method public void show();
+  }
+
+  public static abstract interface PopupMenu.OnDismissListener {
+    method public abstract void onDismiss(android.support.v7.widget.PopupMenu);
+  }
+
+  public static abstract interface PopupMenu.OnMenuItemClickListener {
+    method public abstract boolean onMenuItemClick(android.view.MenuItem);
+  }
+
+  public class SearchView extends android.support.v7.widget.LinearLayoutCompat implements android.support.v7.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 java.lang.CharSequence getQuery();
+    method public java.lang.CharSequence getQueryHint();
+    method public android.support.v4.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(android.support.v7.widget.SearchView.OnCloseListener);
+    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener);
+    method public void setOnQueryTextListener(android.support.v7.widget.SearchView.OnQueryTextListener);
+    method public void setOnSearchClickListener(android.view.View.OnClickListener);
+    method public void setOnSuggestionListener(android.support.v7.widget.SearchView.OnSuggestionListener);
+    method public void setQuery(java.lang.CharSequence, boolean);
+    method public void setQueryHint(java.lang.CharSequence);
+    method public void setQueryRefinementEnabled(boolean);
+    method public void setSearchableInfo(android.app.SearchableInfo);
+    method public void setSubmitButtonEnabled(boolean);
+    method public void setSuggestionsAdapter(android.support.v4.widget.CursorAdapter);
+  }
+
+  public static abstract interface SearchView.OnCloseListener {
+    method public abstract boolean onClose();
+  }
+
+  public static abstract interface SearchView.OnQueryTextListener {
+    method public abstract boolean onQueryTextChange(java.lang.String);
+    method public abstract boolean onQueryTextSubmit(java.lang.String);
+  }
+
+  public static abstract interface SearchView.OnSuggestionListener {
+    method public abstract boolean onSuggestionClick(int);
+    method public abstract boolean onSuggestionSelect(int);
+  }
+
+  public class ShareActionProvider extends android.support.v4.view.ActionProvider {
+    ctor public ShareActionProvider(android.content.Context);
+    method public android.view.View onCreateActionView();
+    method public void setOnShareTargetSelectedListener(android.support.v7.widget.ShareActionProvider.OnShareTargetSelectedListener);
+    method public void setShareHistoryFileName(java.lang.String);
+    method public void setShareIntent(android.content.Intent);
+    field public static final java.lang.String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+  }
+
+  public static abstract interface ShareActionProvider.OnShareTargetSelectedListener {
+    method public abstract boolean onShareTargetSelected(android.support.v7.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 java.lang.CharSequence getTextOff();
+    method public java.lang.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(java.lang.CharSequence);
+    method public void setTextOn(java.lang.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 abstract interface ThemedSpinnerAdapter implements android.widget.SpinnerAdapter {
+    method public abstract android.content.res.Resources.Theme getDropDownViewTheme();
+    method public abstract 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 android.support.v7.widget.Toolbar.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.Toolbar.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v7.widget.Toolbar.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    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 java.lang.CharSequence getLogoDescription();
+    method public android.view.Menu getMenu();
+    method public java.lang.CharSequence getNavigationContentDescription();
+    method public android.graphics.drawable.Drawable getNavigationIcon();
+    method public android.graphics.drawable.Drawable getOverflowIcon();
+    method public int getPopupTheme();
+    method public java.lang.CharSequence getSubtitle();
+    method public java.lang.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(int);
+    method public boolean isOverflowMenuShowing();
+    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(int);
+    method public void setLogo(android.graphics.drawable.Drawable);
+    method public void setLogoDescription(int);
+    method public void setLogoDescription(java.lang.CharSequence);
+    method public void setNavigationContentDescription(int);
+    method public void setNavigationContentDescription(java.lang.CharSequence);
+    method public void setNavigationIcon(int);
+    method public void setNavigationIcon(android.graphics.drawable.Drawable);
+    method public void setNavigationOnClickListener(android.view.View.OnClickListener);
+    method public void setOnMenuItemClickListener(android.support.v7.widget.Toolbar.OnMenuItemClickListener);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable);
+    method public void setPopupTheme(int);
+    method public void setSubtitle(int);
+    method public void setSubtitle(java.lang.CharSequence);
+    method public void setSubtitleTextAppearance(android.content.Context, int);
+    method public void setSubtitleTextColor(int);
+    method public void setTitle(int);
+    method public void setTitle(java.lang.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, int);
+    method public void setTitleTextColor(int);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class Toolbar.LayoutParams extends android.support.v7.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(android.support.v7.widget.Toolbar.LayoutParams);
+    ctor public Toolbar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams);
+  }
+
+  public static abstract interface Toolbar.OnMenuItemClickListener {
+    method public abstract boolean onMenuItemClick(android.view.MenuItem);
+  }
+
+  public static class Toolbar.SavedState extends android.support.v4.view.AbsSavedState {
+    ctor public Toolbar.SavedState(android.os.Parcel);
+    ctor public Toolbar.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public Toolbar.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.v7.widget.Toolbar.SavedState> CREATOR;
+  }
+
+  public class TooltipCompat {
+    method public static void setTooltipText(android.view.View, java.lang.CharSequence);
+  }
+
+}
+
diff --git a/v7/appcompat/res-public/values/public_attrs.xml b/v7/appcompat/res-public/values/public_attrs.xml
index 8c9f9e9..3b811ec 100644
--- a/v7/appcompat/res-public/values/public_attrs.xml
+++ b/v7/appcompat/res-public/values/public_attrs.xml
@@ -102,6 +102,7 @@
      <public type="attr" name="customNavigationLayout"/>
      <public type="attr" name="dialogPreferredPadding"/>
      <public type="attr" name="dialogTheme"/>
+     <public type="attr" name="dialogCornerRadius"/>
      <public type="attr" name="displayOptions"/>
      <public type="attr" name="divider"/>
      <public type="attr" name="dividerHorizontal"/>
diff --git a/design/tests/res/drawable/test_drawable_state_list.xml b/v7/appcompat/res/drawable-v21/abc_dialog_material_background.xml
similarity index 63%
copy from design/tests/res/drawable/test_drawable_state_list.xml
copy to v7/appcompat/res/drawable-v21/abc_dialog_material_background.xml
index f125913..7ef438b 100644
--- a/design/tests/res/drawable/test_drawable_state_list.xml
+++ b/v7/appcompat/res/drawable-v21/abc_dialog_material_background.xml
@@ -14,8 +14,13 @@
      limitations under the License.
 -->
 
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_checked="true" android:drawable="@drawable/test_background_blue" />
-    <item android:drawable="@drawable/test_background_green" />
-</selector>
-
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
+       android:insetLeft="16dp"
+       android:insetTop="16dp"
+       android:insetRight="16dp"
+       android:insetBottom="16dp">
+    <shape android:shape="rectangle">
+        <corners android:radius="?attr/dialogCornerRadius" />
+        <solid android:color="@android:color/white" />
+    </shape>
+</inset>
\ No newline at end of file
diff --git a/v7/appcompat/res/drawable/abc_dialog_material_background.xml b/v7/appcompat/res/drawable/abc_dialog_material_background.xml
index 18560fc..978565b 100644
--- a/v7/appcompat/res/drawable/abc_dialog_material_background.xml
+++ b/v7/appcompat/res/drawable/abc_dialog_material_background.xml
@@ -20,7 +20,7 @@
        android:insetRight="16dp"
        android:insetBottom="16dp">
     <shape android:shape="rectangle">
-        <corners android:radius="2dp" />
+        <corners android:radius="@dimen/abc_dialog_corner_radius_material" />
         <solid android:color="@android:color/white" />
     </shape>
 </inset>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-bs/strings.xml b/v7/appcompat/res/values-bs/strings.xml
index 3687875..07d1411 100644
--- a/v7/appcompat/res/values-bs/strings.xml
+++ b/v7/appcompat/res/values-bs/strings.xml
@@ -29,8 +29,8 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Glasovno pretraživanje"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Odaberite aplikaciju"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Prikaži sve"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Podijeli koristeći aplikaciju <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
-    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Podijeli sa"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Dijeli koristeći aplikaciju <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
+    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Dijeli sa"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"UKLJUČI"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ISKLJUČI"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Pretraži"</string>
diff --git a/v7/appcompat/res/values-hi/strings.xml b/v7/appcompat/res/values-hi/strings.xml
index 3a393c7..a31ab90 100644
--- a/v7/appcompat/res/values-hi/strings.xml
+++ b/v7/appcompat/res/values-hi/strings.xml
@@ -29,8 +29,8 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"आवाज़ सर्च"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"कोई एप्‍लिकेशन चुनें"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"सभी देखें"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> के साथ साझा करें"</string>
-    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"इसके द्वारा साझा करें"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> के साथ शेयर करें"</string>
+    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"इसके साथ शेयर करें"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"चालू"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"बंद"</string>
     <string name="search_menu_title" msgid="146198913615257606">"सर्च"</string>
diff --git a/v7/appcompat/res/values-ne/strings.xml b/v7/appcompat/res/values-ne/strings.xml
index 0d23bd7..96b1042 100644
--- a/v7/appcompat/res/values-ne/strings.xml
+++ b/v7/appcompat/res/values-ne/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"भ्वाइस खोजी"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"एउटा अनुप्रयोग छान्नुहोस्"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"सबै हेर्नुहोस्"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सँग आदान-प्रदान गर्नुहोस्"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सँग आदान प्रदान गर्नुहोस्"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"साझेदारी गर्नुहोस्..."</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"सक्रिय गर्नुहोस्"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"निष्क्रिय पार्नुहोस्"</string>
diff --git a/v7/appcompat/res/values-ta/strings.xml b/v7/appcompat/res/values-ta/strings.xml
index 4a2ad2f..971a3db 100644
--- a/v7/appcompat/res/values-ta/strings.xml
+++ b/v7/appcompat/res/values-ta/strings.xml
@@ -18,7 +18,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_action_mode_done" msgid="4076576682505996667">"முடிந்தது"</string>
     <string name="abc_action_bar_home_description" msgid="4600421777120114993">"முகப்பிற்கு வழிசெலுத்து"</string>
-    <string name="abc_action_bar_up_description" msgid="1594238315039666878">"மேலே வழிசெலுத்து"</string>
+    <string name="abc_action_bar_up_description" msgid="1594238315039666878">"மேலே செல்"</string>
     <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"மேலும் விருப்பங்கள்"</string>
     <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"சுருக்கு"</string>
     <string name="abc_searchview_description_search" msgid="8264924765203268293">"தேடு"</string>
diff --git a/v7/appcompat/res/values-uz/strings.xml b/v7/appcompat/res/values-uz/strings.xml
index 632e0b9..0417cba 100644
--- a/v7/appcompat/res/values-uz/strings.xml
+++ b/v7/appcompat/res/values-uz/strings.xml
@@ -28,7 +28,7 @@
     <string name="abc_searchview_description_submit" msgid="8928215447528550784">"So‘rov yaratish"</string>
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Ovozli qidiruv"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Dastur tanlang"</string>
-    <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Barchasini ko‘rish"</string>
+    <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Hammasi"</string>
     <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> orqali ulashish"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Ruxsat berish"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"YONIQ"</string>
diff --git a/v7/appcompat/res/values-v28/themes_base.xml b/v7/appcompat/res/values-v28/themes_base.xml
new file mode 100644
index 0000000..7dea6d5
--- /dev/null
+++ b/v7/appcompat/res/values-v28/themes_base.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+<resources>
+
+    <style name="Base.Theme.AppCompat" parent="Base.V28.Theme.AppCompat" />
+    <style name="Base.Theme.AppCompat.Light" parent="Base.V28.Theme.AppCompat.Light" />
+
+    <style name="Base.V28.Theme.AppCompat" parent="Base.V26.Theme.AppCompat">
+        <!-- We can use the platform styles on API 28+ -->
+        <item name="dialogCornerRadius">?android:attr/dialogCornerRadius</item>
+    </style>
+
+    <style name="Base.V28.Theme.AppCompat.Light" parent="Base.V26.Theme.AppCompat.Light">
+        <!-- We can use the platform styles on API 28+ -->
+        <item name="dialogCornerRadius">?android:attr/dialogCornerRadius</item>
+    </style>
+
+</resources>
diff --git a/v7/appcompat/res/values-vi/strings.xml b/v7/appcompat/res/values-vi/strings.xml
index 9587bed..4560b4b 100644
--- a/v7/appcompat/res/values-vi/strings.xml
+++ b/v7/appcompat/res/values-vi/strings.xml
@@ -19,7 +19,7 @@
     <string name="abc_action_mode_done" msgid="4076576682505996667">"Xong"</string>
     <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Điều hướng về trang chủ"</string>
     <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Điều hướng lên trên"</string>
-    <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Thêm tùy chọn"</string>
+    <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Tùy chọn khác"</string>
     <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Thu gọn"</string>
     <string name="abc_searchview_description_search" msgid="8264924765203268293">"Tìm kiếm"</string>
     <string name="abc_search_hint" msgid="7723749260725869598">"Tìm kiếm…"</string>
diff --git a/v7/appcompat/res/values-watch-v21/themes_base.xml b/v7/appcompat/res/values-watch-v21/themes_base.xml
new file mode 100644
index 0000000..0a6cfe8
--- /dev/null
+++ b/v7/appcompat/res/values-watch-v21/themes_base.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+
+<resources>
+    <style name="Base.Theme.AppCompat.Dialog" parent="Base.V21.Theme.AppCompat.Dialog" >
+        <item name="android:windowIsFloating">false</item>
+        <item name="android:windowElevation">0dp</item>
+    </style>
+    <style name="Base.Theme.AppCompat.Light.Dialog" parent="Base.V21.Theme.AppCompat.Light.Dialog" >
+        <item name="android:windowIsFloating">false</item>
+        <item name="android:windowElevation">0dp</item>
+    </style>
+    <style name="Base.ThemeOverlay.AppCompat.Dialog" parent="Base.V21.ThemeOverlay.AppCompat.Dialog" >
+        <item name="android:windowIsFloating">false</item>
+        <item name="android:windowElevation">0dp</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values/attrs.xml b/v7/appcompat/res/values/attrs.xml
index c48b7ba..7d26a32 100644
--- a/v7/appcompat/res/values/attrs.xml
+++ b/v7/appcompat/res/values/attrs.xml
@@ -189,6 +189,8 @@
         <attr name="dialogPreferredPadding" format="dimension" />
         <!-- The list divider used in alert dialogs. -->
         <attr name="listDividerAlertDialog" format="reference" />
+        <!-- Preferred corner radius of dialogs. -->
+        <attr name="dialogCornerRadius" format="dimension" />
 
         <!-- =================== -->
         <!-- Other widget styles -->
diff --git a/v7/appcompat/res/values/dimens.xml b/v7/appcompat/res/values/dimens.xml
index 2623615..46b8343 100644
--- a/v7/appcompat/res/values/dimens.xml
+++ b/v7/appcompat/res/values/dimens.xml
@@ -73,6 +73,7 @@
     <dimen name="abc_dialog_title_divider_material">8dp</dimen>
     <dimen name="abc_dialog_list_padding_top_no_title">8dp</dimen>
     <dimen name="abc_dialog_list_padding_bottom_no_buttons">8dp</dimen>
+    <dimen name="abc_dialog_corner_radius_material">2dp</dimen>
 
     <!-- Dialog button bar height -->
     <dimen name="abc_alert_dialog_button_bar_height">48dp</dimen>
diff --git a/v7/appcompat/res/values/themes_base.xml b/v7/appcompat/res/values/themes_base.xml
index 313833b..d512e86 100644
--- a/v7/appcompat/res/values/themes_base.xml
+++ b/v7/appcompat/res/values/themes_base.xml
@@ -297,6 +297,7 @@
         <!-- Dialog attributes -->
         <item name="dialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>
         <item name="dialogPreferredPadding">@dimen/abc_dialog_padding_material</item>
+        <item name="dialogCornerRadius">@dimen/abc_dialog_corner_radius_material</item>
 
         <item name="alertDialogTheme">@style/ThemeOverlay.AppCompat.Dialog.Alert</item>
         <item name="alertDialogStyle">@style/AlertDialog.AppCompat</item>
@@ -467,6 +468,7 @@
         <!-- Dialog attributes -->
         <item name="dialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>
         <item name="dialogPreferredPadding">@dimen/abc_dialog_padding_material</item>
+        <item name="dialogCornerRadius">@dimen/abc_dialog_corner_radius_material</item>
 
         <item name="alertDialogTheme">@style/ThemeOverlay.AppCompat.Dialog.Alert</item>
         <item name="alertDialogStyle">@style/AlertDialog.AppCompat.Light</item>
diff --git a/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuPopupHelper.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuPopupHelper.java
index 35721b8..a6ee759 100644
--- a/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuPopupHelper.java
+++ b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuPopupHelper.java
@@ -269,7 +269,7 @@
             final int hgrav = GravityCompat.getAbsoluteGravity(mDropDownGravity,
                     ViewCompat.getLayoutDirection(mAnchorView)) & Gravity.HORIZONTAL_GRAVITY_MASK;
             if (hgrav == Gravity.RIGHT) {
-                xOffset += mAnchorView.getWidth();
+                xOffset -= mAnchorView.getWidth();
             }
 
             popup.setHorizontalOffset(xOffset);
diff --git a/v7/appcompat/src/main/java/android/support/v7/view/menu/StandardMenuPopup.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/StandardMenuPopup.java
index d94ff72..7026959 100644
--- a/v7/appcompat/src/main/java/android/support/v7/view/menu/StandardMenuPopup.java
+++ b/v7/appcompat/src/main/java/android/support/v7/view/menu/StandardMenuPopup.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.os.Parcelable;
+import android.support.v4.view.ViewCompat;
 import android.support.v7.appcompat.R;
 import android.support.v7.widget.MenuPopupWindow;
 import android.view.Gravity;
@@ -260,7 +261,6 @@
                     mShownAnchorView, mOverflowOnly, mPopupStyleAttr, mPopupStyleRes);
             subPopup.setPresenterCallback(mPresenterCallback);
             subPopup.setForceShowIcon(MenuPopup.shouldPreserveIconSpacing(subMenu));
-            subPopup.setGravity(mDropDownGravity);
 
             // Pass responsibility for handling onDismiss to the submenu.
             subPopup.setOnDismissListener(mOnDismissListener);
@@ -270,8 +270,17 @@
             mMenu.close(false /* closeAllMenus */);
 
             // Show the new sub-menu popup at the same location as this popup.
-            final int horizontalOffset = mPopup.getHorizontalOffset();
+            int horizontalOffset = mPopup.getHorizontalOffset();
             final int verticalOffset = mPopup.getVerticalOffset();
+
+            // As xOffset of parent menu popup is subtracted with Anchor width for Gravity.RIGHT,
+            // So, again to display sub-menu popup in same xOffset, add the Anchor width.
+            final int hgrav = Gravity.getAbsoluteGravity(mDropDownGravity,
+                    ViewCompat.getLayoutDirection(mAnchorView)) & Gravity.HORIZONTAL_GRAVITY_MASK;
+            if (hgrav == Gravity.RIGHT) {
+                horizontalOffset += mAnchorView.getWidth();
+            }
+
             if (subPopup.tryShow(horizontalOffset, verticalOffset)) {
                 if (mPresenterCallback != null) {
                     mPresenterCallback.onOpenSubMenu(subMenu);
diff --git a/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatEditText.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatEditText.java
index 6831fcb..fdda68e 100644
--- a/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatEditText.java
+++ b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatEditText.java
@@ -25,8 +25,10 @@
 import android.support.annotation.DrawableRes;
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
+import android.support.v4.os.BuildCompat;
 import android.support.v4.view.TintableBackgroundView;
 import android.support.v7.appcompat.R;
+import android.text.Editable;
 import android.util.AttributeSet;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputConnection;
@@ -71,6 +73,20 @@
         mTextHelper.applyCompoundDrawablesTints();
     }
 
+    /**
+     * Return the text that the view is displaying. If an editable text has not been set yet, this
+     * will return null.
+     */
+    @Override
+    @Nullable public Editable getText() {
+        if (BuildCompat.isAtLeastP()) {
+            return super.getText();
+        }
+        // A bug pre-P makes getText() crash if called before the first setText due to a cast, so
+        // retrieve the editable text.
+        return super.getEditableText();
+    }
+
     @Override
     public void setBackgroundResource(@DrawableRes int resId) {
         super.setBackgroundResource(resId);
diff --git a/v7/appcompat/src/main/java/android/support/v7/widget/TooltipCompatHandler.java b/v7/appcompat/src/main/java/android/support/v7/widget/TooltipCompatHandler.java
index 3d3c300..8de44e6 100644
--- a/v7/appcompat/src/main/java/android/support/v7/widget/TooltipCompatHandler.java
+++ b/v7/appcompat/src/main/java/android/support/v7/widget/TooltipCompatHandler.java
@@ -22,6 +22,7 @@
 import android.content.Context;
 import android.support.annotation.RestrictTo;
 import android.support.v4.view.ViewCompat;
+import android.support.v4.view.ViewConfigurationCompat;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.MotionEvent;
@@ -46,6 +47,7 @@
 
     private final View mAnchor;
     private final CharSequence mTooltipText;
+    private final int mHoverSlop;
 
     private final Runnable mShowRunnable = new Runnable() {
         @Override
@@ -82,10 +84,10 @@
     public static void setTooltipText(View view, CharSequence tooltipText) {
         // The code below is not attempting to update the tooltip text
         // for a pending or currently active tooltip, because it may lead
-        // to updating the wrong tooltipin in some rare cases (e.g. when
+        // to updating the wrong tooltip in in some rare cases (e.g. when
         // action menu item views are recycled). Instead, the tooltip is
         // canceled/hidden. This might still be the wrong tooltip,
-        // but hiding wrong tooltip is less disruptive UX.
+        // but hiding a wrong tooltip is less disruptive UX.
         if (sPendingHandler != null && sPendingHandler.mAnchor == view) {
             setPendingHandler(null);
         }
@@ -104,6 +106,9 @@
     private TooltipCompatHandler(View anchor, CharSequence tooltipText) {
         mAnchor = anchor;
         mTooltipText = tooltipText;
+        mHoverSlop = ViewConfigurationCompat.getScaledHoverSlop(
+                ViewConfiguration.get(mAnchor.getContext()));
+        clearAnchorPos();
 
         mAnchor.setOnLongClickListener(this);
         mAnchor.setOnHoverListener(this);
@@ -129,13 +134,12 @@
         }
         switch (event.getAction()) {
             case MotionEvent.ACTION_HOVER_MOVE:
-                if (mAnchor.isEnabled() && mPopup == null) {
-                    mAnchorX = (int) event.getX();
-                    mAnchorY = (int) event.getY();
+                if (mAnchor.isEnabled() && mPopup == null && updateAnchorPos(event)) {
                     setPendingHandler(this);
                 }
                 break;
             case MotionEvent.ACTION_HOVER_EXIT:
+                clearAnchorPos();
                 hide();
                 break;
         }
@@ -188,6 +192,7 @@
             if (mPopup != null) {
                 mPopup.hide();
                 mPopup = null;
+                clearAnchorPos();
                 mAnchor.removeOnAttachStateChangeListener(this);
             } else {
                 Log.e(TAG, "sActiveHandler.mPopup == null");
@@ -216,4 +221,31 @@
     private void cancelPendingShow() {
         mAnchor.removeCallbacks(mShowRunnable);
     }
+
+    /**
+     * Update the anchor position if it significantly (that is by at least mHoverSlope)
+     * different from the previously stored position. Ignoring insignificant changes
+     * filters out the jitter which is typical for such input sources as stylus.
+     *
+     * @return True if the position has been updated.
+     */
+    private boolean updateAnchorPos(MotionEvent event) {
+        final int newAnchorX = (int) event.getX();
+        final int newAnchorY = (int) event.getY();
+        if (Math.abs(newAnchorX - mAnchorX) <= mHoverSlop
+                && Math.abs(newAnchorY - mAnchorY) <= mHoverSlop) {
+            return false;
+        }
+        mAnchorX = newAnchorX;
+        mAnchorY = newAnchorY;
+        return true;
+    }
+
+    /**
+     *  Clear the anchor position to ensure that the next change is considered significant.
+     */
+    private void clearAnchorPos() {
+        mAnchorX = Integer.MAX_VALUE;
+        mAnchorY = Integer.MAX_VALUE;
+    }
 }
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatEditTextTest.java b/v7/appcompat/tests/src/android/support/v7/widget/AppCompatEditTextTest.java
new file mode 100644
index 0000000..397daf6
--- /dev/null
+++ b/v7/appcompat/tests/src/android/support/v7/widget/AppCompatEditTextTest.java
@@ -0,0 +1,83 @@
+/*
+ * 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 android.support.v7.widget;
+
+import android.content.Context;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v7.app.AppCompatActivity;
+import android.text.Editable;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for the {@link AppCompatEditText} class.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AppCompatEditTextTest {
+    @Rule
+    public final ActivityTestRule<AppCompatActivity> mActivityTestRule =
+            new ActivityTestRule<>(AppCompatActivity.class);
+
+    @Test
+    @UiThreadTest
+    public void testGetTextNonEditable() {
+        // This subclass calls getText before the object is fully constructed. This should not cause
+        // a null pointer exception.
+        GetTextEditText editText = new GetTextEditText(mActivityTestRule.getActivity());
+    }
+
+    private class GetTextEditText extends AppCompatEditText {
+
+        GetTextEditText(Context context) {
+            super(context);
+        }
+
+        @Override
+        public void setText(CharSequence text, BufferType type) {
+            Editable currentText = getText();
+            super.setText(text, type);
+        }
+    }
+
+    @Test
+    @UiThreadTest
+    public void testGetTextBeforeConstructor() {
+        // This subclass calls getText before the TextView constructor. This should not cause
+        // a null pointer exception.
+        GetTextEditText2 editText = new GetTextEditText2(mActivityTestRule.getActivity());
+    }
+
+    private class GetTextEditText2 extends AppCompatEditText {
+
+        GetTextEditText2(Context context) {
+            super(context);
+        }
+
+        @Override
+        public void setOverScrollMode(int overScrollMode) {
+            // This method is called by the View constructor before the TextView/EditText
+            // constructors.
+            Editable text = getText();
+        }
+    }
+}
diff --git a/v7/cardview/Android.mk b/v7/cardview/Android.mk
deleted file mode 100644
index ae4f121..0000000
--- a/v7/cardview/Android.mk
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright (C) 2014 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := android-support-v7-cardview
-#
-# in their makefiles to include the resources in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-v7-cardview
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := \
-    $(call all-java-files-under,src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/v7/cardview/api/27.1.0.txt b/v7/cardview/api/27.1.0.txt
new file mode 100644
index 0000000..6732501
--- /dev/null
+++ b/v7/cardview/api/27.1.0.txt
@@ -0,0 +1,28 @@
+package android.support.v7.widget {
+
+  public class CardView extends android.widget.FrameLayout {
+    ctor public CardView(android.content.Context);
+    ctor public CardView(android.content.Context, android.util.AttributeSet);
+    ctor public CardView(android.content.Context, android.util.AttributeSet, int);
+    method public android.content.res.ColorStateList getCardBackgroundColor();
+    method public float getCardElevation();
+    method public int getContentPaddingBottom();
+    method public int getContentPaddingLeft();
+    method public int getContentPaddingRight();
+    method public int getContentPaddingTop();
+    method public float getMaxCardElevation();
+    method public boolean getPreventCornerOverlap();
+    method public float getRadius();
+    method public boolean getUseCompatPadding();
+    method public void setCardBackgroundColor(int);
+    method public void setCardBackgroundColor(android.content.res.ColorStateList);
+    method public void setCardElevation(float);
+    method public void setContentPadding(int, int, int, int);
+    method public void setMaxCardElevation(float);
+    method public void setPreventCornerOverlap(boolean);
+    method public void setRadius(float);
+    method public void setUseCompatPadding(boolean);
+  }
+
+}
+
diff --git a/v7/gridlayout/Android.mk b/v7/gridlayout/Android.mk
deleted file mode 100644
index 81791da..0000000
--- a/v7/gridlayout/Android.mk
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (C) 2011 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-v7-gridlayout \
-#       android-support-compat \
-#       android-support-core-ui
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-v7-gridlayout
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-compat \
-    android-support-core-ui
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
diff --git a/v7/gridlayout/api/27.1.0.txt b/v7/gridlayout/api/27.1.0.txt
new file mode 100644
index 0000000..9f12b89
--- /dev/null
+++ b/v7/gridlayout/api/27.1.0.txt
@@ -0,0 +1,70 @@
+package android.support.v7.widget {
+
+  public class GridLayout extends android.view.ViewGroup {
+    ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public GridLayout(android.content.Context, android.util.AttributeSet);
+    ctor public GridLayout(android.content.Context);
+    method protected android.support.v7.widget.GridLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.GridLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v7.widget.GridLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getAlignmentMode();
+    method public int getColumnCount();
+    method public int getOrientation();
+    method public android.util.Printer getPrinter();
+    method public int getRowCount();
+    method public boolean getUseDefaultMargins();
+    method public boolean isColumnOrderPreserved();
+    method public boolean isRowOrderPreserved();
+    method public void setAlignmentMode(int);
+    method public void setColumnCount(int);
+    method public void setColumnOrderPreserved(boolean);
+    method public void setOrientation(int);
+    method public void setPrinter(android.util.Printer);
+    method public void setRowCount(int);
+    method public void setRowOrderPreserved(boolean);
+    method public void setUseDefaultMargins(boolean);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment, float);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment, float);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, float);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, float);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, int);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int);
+    field public static final int ALIGN_BOUNDS = 0; // 0x0
+    field public static final int ALIGN_MARGINS = 1; // 0x1
+    field public static final android.support.v7.widget.GridLayout.Alignment BASELINE;
+    field public static final android.support.v7.widget.GridLayout.Alignment BOTTOM;
+    field public static final android.support.v7.widget.GridLayout.Alignment CENTER;
+    field public static final android.support.v7.widget.GridLayout.Alignment END;
+    field public static final android.support.v7.widget.GridLayout.Alignment FILL;
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final android.support.v7.widget.GridLayout.Alignment LEFT;
+    field public static final android.support.v7.widget.GridLayout.Alignment RIGHT;
+    field public static final android.support.v7.widget.GridLayout.Alignment START;
+    field public static final android.support.v7.widget.GridLayout.Alignment TOP;
+    field public static final int UNDEFINED = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static abstract class GridLayout.Alignment {
+  }
+
+  public static class GridLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.Spec, android.support.v7.widget.GridLayout.Spec);
+    ctor public GridLayout.LayoutParams();
+    ctor public GridLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public GridLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.LayoutParams);
+    ctor public GridLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    method public void setGravity(int);
+    field public android.support.v7.widget.GridLayout.Spec columnSpec;
+    field public android.support.v7.widget.GridLayout.Spec rowSpec;
+  }
+
+  public static class GridLayout.Spec {
+    method public android.support.v7.widget.GridLayout.Alignment getAbsoluteAlignment(boolean);
+  }
+
+}
+
diff --git a/v7/mediarouter/Android.mk b/v7/mediarouter/Android.mk
deleted file mode 100644
index 21b4a62..0000000
--- a/v7/mediarouter/Android.mk
+++ /dev/null
@@ -1,45 +0,0 @@
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-v7-mediarouter \
-#       android-support-v7-appcompat \
-#       android-support-v7-palette \
-#       android-support-v4
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-v7-mediarouter
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := \
-    $(call all-java-files-under,jellybean) \
-    $(call all-java-files-under,jellybean-mr1) \
-    $(call all-java-files-under,jellybean-mr2) \
-    $(call all-java-files-under,api24) \
-    $(call all-java-files-under,src)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-v7-appcompat \
-    android-support-v7-palette \
-    android-support-v4
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/v7/mediarouter/api/27.1.0.txt b/v7/mediarouter/api/27.1.0.txt
new file mode 100644
index 0000000..7670978
--- /dev/null
+++ b/v7/mediarouter/api/27.1.0.txt
@@ -0,0 +1,476 @@
+package android.support.v7.app {
+
+  public class MediaRouteActionProvider extends android.support.v4.view.ActionProvider {
+    ctor public MediaRouteActionProvider(android.content.Context);
+    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
+    method public android.support.v7.app.MediaRouteButton getMediaRouteButton();
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public android.view.View onCreateActionView();
+    method public android.support.v7.app.MediaRouteButton onCreateMediaRouteButton();
+    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+  }
+
+  public class MediaRouteButton extends android.view.View {
+    ctor public MediaRouteButton(android.content.Context);
+    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet);
+    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int);
+    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
+    method public void setRemoteIndicatorDrawable(android.graphics.drawable.Drawable);
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+    method public boolean showDialog();
+  }
+
+  public class MediaRouteChooserDialog extends android.support.v7.app.AppCompatDialog {
+    ctor public MediaRouteChooserDialog(android.content.Context);
+    ctor public MediaRouteChooserDialog(android.content.Context, int);
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public boolean onFilterRoute(android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onFilterRoutes(java.util.List<android.support.v7.media.MediaRouter.RouteInfo>);
+    method public void refreshRoutes();
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+  }
+
+  public class MediaRouteChooserDialogFragment extends android.support.v4.app.DialogFragment {
+    ctor public MediaRouteChooserDialogFragment();
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public android.support.v7.app.MediaRouteChooserDialog onCreateChooserDialog(android.content.Context, android.os.Bundle);
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+  }
+
+  public class MediaRouteControllerDialog extends android.support.v7.app.AlertDialog {
+    ctor public MediaRouteControllerDialog(android.content.Context);
+    ctor public MediaRouteControllerDialog(android.content.Context, int);
+    method public android.view.View getMediaControlView();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSession();
+    method public android.support.v7.media.MediaRouter.RouteInfo getRoute();
+    method public boolean isVolumeControlEnabled();
+    method public android.view.View onCreateMediaControlView(android.os.Bundle);
+    method public void setVolumeControlEnabled(boolean);
+  }
+
+  public class MediaRouteControllerDialogFragment extends android.support.v4.app.DialogFragment {
+    ctor public MediaRouteControllerDialogFragment();
+    method public android.support.v7.app.MediaRouteControllerDialog onCreateControllerDialog(android.content.Context, android.os.Bundle);
+  }
+
+  public class MediaRouteDialogFactory {
+    ctor public MediaRouteDialogFactory();
+    method public static android.support.v7.app.MediaRouteDialogFactory getDefault();
+    method public android.support.v7.app.MediaRouteChooserDialogFragment onCreateChooserDialogFragment();
+    method public android.support.v7.app.MediaRouteControllerDialogFragment onCreateControllerDialogFragment();
+  }
+
+  public class MediaRouteDiscoveryFragment extends android.support.v4.app.Fragment {
+    ctor public MediaRouteDiscoveryFragment();
+    method public android.support.v7.media.MediaRouter getMediaRouter();
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public android.support.v7.media.MediaRouter.Callback onCreateCallback();
+    method public int onPrepareCallbackFlags();
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+  }
+
+}
+
+package android.support.v7.media {
+
+  public final class MediaControlIntent {
+    field public static final java.lang.String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
+    field public static final java.lang.String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
+    field public static final java.lang.String ACTION_GET_SESSION_STATUS = "android.media.intent.action.GET_SESSION_STATUS";
+    field public static final java.lang.String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
+    field public static final java.lang.String ACTION_PAUSE = "android.media.intent.action.PAUSE";
+    field public static final java.lang.String ACTION_PLAY = "android.media.intent.action.PLAY";
+    field public static final java.lang.String ACTION_REMOVE = "android.media.intent.action.REMOVE";
+    field public static final java.lang.String ACTION_RESUME = "android.media.intent.action.RESUME";
+    field public static final java.lang.String ACTION_SEEK = "android.media.intent.action.SEEK";
+    field public static final java.lang.String ACTION_SEND_MESSAGE = "android.media.intent.action.SEND_MESSAGE";
+    field public static final java.lang.String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
+    field public static final java.lang.String ACTION_STOP = "android.media.intent.action.STOP";
+    field public static final java.lang.String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
+    field public static final java.lang.String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
+    field public static final java.lang.String CATEGORY_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
+    field public static final int ERROR_INVALID_ITEM_ID = 3; // 0x3
+    field public static final int ERROR_INVALID_SESSION_ID = 2; // 0x2
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int ERROR_UNSUPPORTED_OPERATION = 1; // 0x1
+    field public static final java.lang.String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
+    field public static final java.lang.String EXTRA_ITEM_CONTENT_POSITION = "android.media.intent.extra.ITEM_POSITION";
+    field public static final java.lang.String EXTRA_ITEM_HTTP_HEADERS = "android.media.intent.extra.HTTP_HEADERS";
+    field public static final java.lang.String EXTRA_ITEM_ID = "android.media.intent.extra.ITEM_ID";
+    field public static final java.lang.String EXTRA_ITEM_METADATA = "android.media.intent.extra.ITEM_METADATA";
+    field public static final java.lang.String EXTRA_ITEM_STATUS = "android.media.intent.extra.ITEM_STATUS";
+    field public static final java.lang.String EXTRA_ITEM_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
+    field public static final java.lang.String EXTRA_MESSAGE = "android.media.intent.extra.MESSAGE";
+    field public static final java.lang.String EXTRA_MESSAGE_RECEIVER = "android.media.intent.extra.MESSAGE_RECEIVER";
+    field public static final java.lang.String EXTRA_SESSION_ID = "android.media.intent.extra.SESSION_ID";
+    field public static final java.lang.String EXTRA_SESSION_STATUS = "android.media.intent.extra.SESSION_STATUS";
+    field public static final java.lang.String EXTRA_SESSION_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
+  }
+
+  public final class MediaItemMetadata {
+    field public static final java.lang.String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
+    field public static final java.lang.String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
+    field public static final java.lang.String KEY_ARTIST = "android.media.metadata.ARTIST";
+    field public static final java.lang.String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
+    field public static final java.lang.String KEY_AUTHOR = "android.media.metadata.AUTHOR";
+    field public static final java.lang.String KEY_COMPOSER = "android.media.metadata.COMPOSER";
+    field public static final java.lang.String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
+    field public static final java.lang.String KEY_DURATION = "android.media.metadata.DURATION";
+    field public static final java.lang.String KEY_TITLE = "android.media.metadata.TITLE";
+    field public static final java.lang.String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
+    field public static final java.lang.String KEY_YEAR = "android.media.metadata.YEAR";
+  }
+
+  public final class MediaItemStatus {
+    method public android.os.Bundle asBundle();
+    method public static android.support.v7.media.MediaItemStatus fromBundle(android.os.Bundle);
+    method public long getContentDuration();
+    method public long getContentPosition();
+    method public android.os.Bundle getExtras();
+    method public int getPlaybackState();
+    method public long getTimestamp();
+    field public static final java.lang.String EXTRA_HTTP_RESPONSE_HEADERS = "android.media.status.extra.HTTP_RESPONSE_HEADERS";
+    field public static final java.lang.String EXTRA_HTTP_STATUS_CODE = "android.media.status.extra.HTTP_STATUS_CODE";
+    field public static final int PLAYBACK_STATE_BUFFERING = 3; // 0x3
+    field public static final int PLAYBACK_STATE_CANCELED = 5; // 0x5
+    field public static final int PLAYBACK_STATE_ERROR = 7; // 0x7
+    field public static final int PLAYBACK_STATE_FINISHED = 4; // 0x4
+    field public static final int PLAYBACK_STATE_INVALIDATED = 6; // 0x6
+    field public static final int PLAYBACK_STATE_PAUSED = 2; // 0x2
+    field public static final int PLAYBACK_STATE_PENDING = 0; // 0x0
+    field public static final int PLAYBACK_STATE_PLAYING = 1; // 0x1
+  }
+
+  public static final class MediaItemStatus.Builder {
+    ctor public MediaItemStatus.Builder(int);
+    ctor public MediaItemStatus.Builder(android.support.v7.media.MediaItemStatus);
+    method public android.support.v7.media.MediaItemStatus build();
+    method public android.support.v7.media.MediaItemStatus.Builder setContentDuration(long);
+    method public android.support.v7.media.MediaItemStatus.Builder setContentPosition(long);
+    method public android.support.v7.media.MediaItemStatus.Builder setExtras(android.os.Bundle);
+    method public android.support.v7.media.MediaItemStatus.Builder setPlaybackState(int);
+    method public android.support.v7.media.MediaItemStatus.Builder setTimestamp(long);
+  }
+
+  public final class MediaRouteDescriptor {
+    method public android.os.Bundle asBundle();
+    method public boolean canDisconnectAndKeepPlaying();
+    method public static android.support.v7.media.MediaRouteDescriptor fromBundle(android.os.Bundle);
+    method public int getConnectionState();
+    method public java.util.List<android.content.IntentFilter> getControlFilters();
+    method public java.lang.String getDescription();
+    method public int getDeviceType();
+    method public android.os.Bundle getExtras();
+    method public android.net.Uri getIconUri();
+    method public java.lang.String getId();
+    method public java.lang.String getName();
+    method public int getPlaybackStream();
+    method public int getPlaybackType();
+    method public int getPresentationDisplayId();
+    method public android.content.IntentSender getSettingsActivity();
+    method public int getVolume();
+    method public int getVolumeHandling();
+    method public int getVolumeMax();
+    method public deprecated boolean isConnecting();
+    method public boolean isEnabled();
+    method public boolean isValid();
+  }
+
+  public static final class MediaRouteDescriptor.Builder {
+    ctor public MediaRouteDescriptor.Builder(java.lang.String, java.lang.String);
+    ctor public MediaRouteDescriptor.Builder(android.support.v7.media.MediaRouteDescriptor);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilter(android.content.IntentFilter);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilters(java.util.Collection<android.content.IntentFilter>);
+    method public android.support.v7.media.MediaRouteDescriptor build();
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setCanDisconnect(boolean);
+    method public deprecated android.support.v7.media.MediaRouteDescriptor.Builder setConnecting(boolean);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setConnectionState(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setDescription(java.lang.String);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setDeviceType(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setEnabled(boolean);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setExtras(android.os.Bundle);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setIconUri(android.net.Uri);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setId(java.lang.String);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setName(java.lang.String);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackStream(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackType(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setPresentationDisplayId(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setSettingsActivity(android.content.IntentSender);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolume(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeHandling(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeMax(int);
+  }
+
+  public final class MediaRouteDiscoveryRequest {
+    ctor public MediaRouteDiscoveryRequest(android.support.v7.media.MediaRouteSelector, boolean);
+    method public android.os.Bundle asBundle();
+    method public static android.support.v7.media.MediaRouteDiscoveryRequest fromBundle(android.os.Bundle);
+    method public android.support.v7.media.MediaRouteSelector getSelector();
+    method public boolean isActiveScan();
+    method public boolean isValid();
+  }
+
+  public abstract class MediaRouteProvider {
+    ctor public MediaRouteProvider(android.content.Context);
+    method public final android.content.Context getContext();
+    method public final android.support.v7.media.MediaRouteProviderDescriptor getDescriptor();
+    method public final android.support.v7.media.MediaRouteDiscoveryRequest getDiscoveryRequest();
+    method public final android.os.Handler getHandler();
+    method public final android.support.v7.media.MediaRouteProvider.ProviderMetadata getMetadata();
+    method public android.support.v7.media.MediaRouteProvider.RouteController onCreateRouteController(java.lang.String);
+    method public void onDiscoveryRequestChanged(android.support.v7.media.MediaRouteDiscoveryRequest);
+    method public final void setCallback(android.support.v7.media.MediaRouteProvider.Callback);
+    method public final void setDescriptor(android.support.v7.media.MediaRouteProviderDescriptor);
+    method public final void setDiscoveryRequest(android.support.v7.media.MediaRouteDiscoveryRequest);
+  }
+
+  public static abstract class MediaRouteProvider.Callback {
+    ctor public MediaRouteProvider.Callback();
+    method public void onDescriptorChanged(android.support.v7.media.MediaRouteProvider, android.support.v7.media.MediaRouteProviderDescriptor);
+  }
+
+  public static final class MediaRouteProvider.ProviderMetadata {
+    method public android.content.ComponentName getComponentName();
+    method public java.lang.String getPackageName();
+  }
+
+  public static abstract class MediaRouteProvider.RouteController {
+    ctor public MediaRouteProvider.RouteController();
+    method public boolean onControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
+    method public void onRelease();
+    method public void onSelect();
+    method public void onSetVolume(int);
+    method public void onUnselect();
+    method public void onUnselect(int);
+    method public void onUpdateVolume(int);
+  }
+
+  public final class MediaRouteProviderDescriptor {
+    method public android.os.Bundle asBundle();
+    method public static android.support.v7.media.MediaRouteProviderDescriptor fromBundle(android.os.Bundle);
+    method public java.util.List<android.support.v7.media.MediaRouteDescriptor> getRoutes();
+    method public boolean isValid();
+  }
+
+  public static final class MediaRouteProviderDescriptor.Builder {
+    ctor public MediaRouteProviderDescriptor.Builder();
+    ctor public MediaRouteProviderDescriptor.Builder(android.support.v7.media.MediaRouteProviderDescriptor);
+    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoute(android.support.v7.media.MediaRouteDescriptor);
+    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoutes(java.util.Collection<android.support.v7.media.MediaRouteDescriptor>);
+    method public android.support.v7.media.MediaRouteProviderDescriptor build();
+  }
+
+  public abstract class MediaRouteProviderService extends android.app.Service {
+    ctor public MediaRouteProviderService();
+    method public android.support.v7.media.MediaRouteProvider getMediaRouteProvider();
+    method public android.os.IBinder onBind(android.content.Intent);
+    method public abstract android.support.v7.media.MediaRouteProvider onCreateMediaRouteProvider();
+    field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaRouteProviderService";
+  }
+
+  public final class MediaRouteSelector {
+    method public android.os.Bundle asBundle();
+    method public boolean contains(android.support.v7.media.MediaRouteSelector);
+    method public static android.support.v7.media.MediaRouteSelector fromBundle(android.os.Bundle);
+    method public java.util.List<java.lang.String> getControlCategories();
+    method public boolean hasControlCategory(java.lang.String);
+    method public boolean isEmpty();
+    method public boolean isValid();
+    method public boolean matchesControlFilters(java.util.List<android.content.IntentFilter>);
+    field public static final android.support.v7.media.MediaRouteSelector EMPTY;
+  }
+
+  public static final class MediaRouteSelector.Builder {
+    ctor public MediaRouteSelector.Builder();
+    ctor public MediaRouteSelector.Builder(android.support.v7.media.MediaRouteSelector);
+    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategories(java.util.Collection<java.lang.String>);
+    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategory(java.lang.String);
+    method public android.support.v7.media.MediaRouteSelector.Builder addSelector(android.support.v7.media.MediaRouteSelector);
+    method public android.support.v7.media.MediaRouteSelector build();
+  }
+
+  public final class MediaRouter {
+    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback);
+    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback, int);
+    method public void addProvider(android.support.v7.media.MediaRouteProvider);
+    method public void addRemoteControlClient(java.lang.Object);
+    method public android.support.v7.media.MediaRouter.RouteInfo getBluetoothRoute();
+    method public android.support.v7.media.MediaRouter.RouteInfo getDefaultRoute();
+    method public static android.support.v7.media.MediaRouter getInstance(android.content.Context);
+    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSessionToken();
+    method public java.util.List<android.support.v7.media.MediaRouter.ProviderInfo> getProviders();
+    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
+    method public android.support.v7.media.MediaRouter.RouteInfo getSelectedRoute();
+    method public boolean isRouteAvailable(android.support.v7.media.MediaRouteSelector, int);
+    method public void removeCallback(android.support.v7.media.MediaRouter.Callback);
+    method public void removeProvider(android.support.v7.media.MediaRouteProvider);
+    method public void removeRemoteControlClient(java.lang.Object);
+    method public void selectRoute(android.support.v7.media.MediaRouter.RouteInfo);
+    method public void setMediaSession(java.lang.Object);
+    method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat);
+    method public void unselect(int);
+    method public android.support.v7.media.MediaRouter.RouteInfo updateSelectedRoute(android.support.v7.media.MediaRouteSelector);
+    field public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1; // 0x1
+    field public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 2; // 0x2
+    field public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 8; // 0x8
+    field public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1; // 0x1
+    field public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 4; // 0x4
+    field public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 2; // 0x2
+    field public static final int UNSELECT_REASON_DISCONNECTED = 1; // 0x1
+    field public static final int UNSELECT_REASON_ROUTE_CHANGED = 3; // 0x3
+    field public static final int UNSELECT_REASON_STOPPED = 2; // 0x2
+    field public static final int UNSELECT_REASON_UNKNOWN = 0; // 0x0
+  }
+
+  public static abstract class MediaRouter.Callback {
+    ctor public MediaRouter.Callback();
+    method public void onProviderAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
+    method public void onProviderChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
+    method public void onProviderRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
+    method public void onRouteAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRoutePresentationDisplayChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteSelected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo, int);
+    method public void onRouteVolumeChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+  }
+
+  public static abstract class MediaRouter.ControlRequestCallback {
+    ctor public MediaRouter.ControlRequestCallback();
+    method public void onError(java.lang.String, android.os.Bundle);
+    method public void onResult(android.os.Bundle);
+  }
+
+  public static final class MediaRouter.ProviderInfo {
+    method public android.content.ComponentName getComponentName();
+    method public java.lang.String getPackageName();
+    method public android.support.v7.media.MediaRouteProvider getProviderInstance();
+    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
+  }
+
+  public static class MediaRouter.RouteInfo {
+    method public boolean canDisconnect();
+    method public int getConnectionState();
+    method public java.util.List<android.content.IntentFilter> getControlFilters();
+    method public java.lang.String getDescription();
+    method public int getDeviceType();
+    method public android.os.Bundle getExtras();
+    method public android.net.Uri getIconUri();
+    method public java.lang.String getId();
+    method public java.lang.String getName();
+    method public int getPlaybackStream();
+    method public int getPlaybackType();
+    method public android.view.Display getPresentationDisplay();
+    method public android.support.v7.media.MediaRouter.ProviderInfo getProvider();
+    method public android.content.IntentSender getSettingsIntent();
+    method public int getVolume();
+    method public int getVolumeHandling();
+    method public int getVolumeMax();
+    method public boolean isBluetooth();
+    method public boolean isConnecting();
+    method public boolean isDefault();
+    method public boolean isDeviceSpeaker();
+    method public boolean isEnabled();
+    method public boolean isSelected();
+    method public boolean matchesSelector(android.support.v7.media.MediaRouteSelector);
+    method public void requestSetVolume(int);
+    method public void requestUpdateVolume(int);
+    method public void select();
+    method public void sendControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
+    method public boolean supportsControlAction(java.lang.String, java.lang.String);
+    method public boolean supportsControlCategory(java.lang.String);
+    method public boolean supportsControlRequest(android.content.Intent);
+    field public static final int CONNECTION_STATE_CONNECTED = 2; // 0x2
+    field public static final int CONNECTION_STATE_CONNECTING = 1; // 0x1
+    field public static final int CONNECTION_STATE_DISCONNECTED = 0; // 0x0
+    field public static final int DEVICE_TYPE_SPEAKER = 2; // 0x2
+    field public static final int DEVICE_TYPE_TV = 1; // 0x1
+    field public static final int PLAYBACK_TYPE_LOCAL = 0; // 0x0
+    field public static final int PLAYBACK_TYPE_REMOTE = 1; // 0x1
+    field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
+    field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
+  }
+
+  public final class MediaSessionStatus {
+    method public android.os.Bundle asBundle();
+    method public static android.support.v7.media.MediaSessionStatus fromBundle(android.os.Bundle);
+    method public android.os.Bundle getExtras();
+    method public int getSessionState();
+    method public long getTimestamp();
+    method public boolean isQueuePaused();
+    field public static final int SESSION_STATE_ACTIVE = 0; // 0x0
+    field public static final int SESSION_STATE_ENDED = 1; // 0x1
+    field public static final int SESSION_STATE_INVALIDATED = 2; // 0x2
+  }
+
+  public static final class MediaSessionStatus.Builder {
+    ctor public MediaSessionStatus.Builder(int);
+    ctor public MediaSessionStatus.Builder(android.support.v7.media.MediaSessionStatus);
+    method public android.support.v7.media.MediaSessionStatus build();
+    method public android.support.v7.media.MediaSessionStatus.Builder setExtras(android.os.Bundle);
+    method public android.support.v7.media.MediaSessionStatus.Builder setQueuePaused(boolean);
+    method public android.support.v7.media.MediaSessionStatus.Builder setSessionState(int);
+    method public android.support.v7.media.MediaSessionStatus.Builder setTimestamp(long);
+  }
+
+  public class RemotePlaybackClient {
+    ctor public RemotePlaybackClient(android.content.Context, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void endSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void enqueue(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public java.lang.String getSessionId();
+    method public void getSessionStatus(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void getStatus(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public boolean hasSession();
+    method public boolean isMessagingSupported();
+    method public boolean isQueuingSupported();
+    method public boolean isRemotePlaybackSupported();
+    method public boolean isSessionManagementSupported();
+    method public void pause(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void play(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public void release();
+    method public void remove(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public void resume(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void seek(java.lang.String, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public void sendMessage(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void setOnMessageReceivedListener(android.support.v7.media.RemotePlaybackClient.OnMessageReceivedListener);
+    method public void setSessionId(java.lang.String);
+    method public void setStatusCallback(android.support.v7.media.RemotePlaybackClient.StatusCallback);
+    method public void startSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void stop(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+  }
+
+  public static abstract class RemotePlaybackClient.ActionCallback {
+    ctor public RemotePlaybackClient.ActionCallback();
+    method public void onError(java.lang.String, int, android.os.Bundle);
+  }
+
+  public static abstract class RemotePlaybackClient.ItemActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
+    ctor public RemotePlaybackClient.ItemActionCallback();
+    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
+  }
+
+  public static abstract interface RemotePlaybackClient.OnMessageReceivedListener {
+    method public abstract void onMessageReceived(java.lang.String, android.os.Bundle);
+  }
+
+  public static abstract class RemotePlaybackClient.SessionActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
+    ctor public RemotePlaybackClient.SessionActionCallback();
+    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
+  }
+
+  public static abstract class RemotePlaybackClient.StatusCallback {
+    ctor public RemotePlaybackClient.StatusCallback();
+    method public void onItemStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
+    method public void onSessionChanged(java.lang.String);
+    method public void onSessionStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
+  }
+
+}
+
diff --git a/v7/mediarouter/res/values-ar/strings.xml b/v7/mediarouter/res/values-ar/strings.xml
index 2cfe9e4..864fb91 100644
--- a/v7/mediarouter/res/values-ar/strings.xml
+++ b/v7/mediarouter/res/values-ar/strings.xml
@@ -34,7 +34,7 @@
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"تصغير"</string>
     <string name="mr_controller_album_art" msgid="6422801843540543585">"صورة الألبوم"</string>
     <string name="mr_controller_volume_slider" msgid="2361785992211841709">"شريط تمرير مستوى الصوت"</string>
-    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"لم يتم اختيار أية وسائط"</string>
-    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"لا تتوفر أية معلومات"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"لم يتم اختيار أي وسائط"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"لا تتوفر أي معلومات"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"جارٍ إرسال الشاشة"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ca/strings.xml b/v7/mediarouter/res/values-ca/strings.xml
index a5e5883..7e01048 100644
--- a/v7/mediarouter/res/values-ca/strings.xml
+++ b/v7/mediarouter/res/values-ca/strings.xml
@@ -34,7 +34,7 @@
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Replega"</string>
     <string name="mr_controller_album_art" msgid="6422801843540543585">"Imatge de l\'àlbum"</string>
     <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Control lliscant de volum"</string>
-    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No s\'ha seleccionat cap fitxer multimèdia"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No s\'han seleccionat fitxers multimèdia"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No hi ha informació disponible"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emissió de pantalla"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-da/strings.xml b/v7/mediarouter/res/values-da/strings.xml
index 44da892..d280d2c 100644
--- a/v7/mediarouter/res/values-da/strings.xml
+++ b/v7/mediarouter/res/values-da/strings.xml
@@ -34,7 +34,7 @@
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skjul"</string>
     <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumgrafik"</string>
     <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Lydstyrkeskyder"</string>
-    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Der er ikke valgt nogen medier"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ingen medier er markeret"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Der er ingen tilgængelige oplysninger"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skærmen castes"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-eu/strings.xml b/v7/mediarouter/res/values-eu/strings.xml
index f9b9f8d..11b1d00 100644
--- a/v7/mediarouter/res/values-eu/strings.xml
+++ b/v7/mediarouter/res/values-eu/strings.xml
@@ -22,7 +22,7 @@
     <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Igortzeko botoia. Deskonektatuta"</string>
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Igortzeko botoia. Konektatzen"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"Igortzeko botoia. Konektatuta"</string>
-    <string name="mr_chooser_title" msgid="414301941546135990">"Igorri hona"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Igorri hona:"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Gailuak bilatzen"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Deskonektatu"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Utzi igortzeari"</string>
diff --git a/v7/mediarouter/res/values-in/strings.xml b/v7/mediarouter/res/values-in/strings.xml
index 5e537af..becb41e 100644
--- a/v7/mediarouter/res/values-in/strings.xml
+++ b/v7/mediarouter/res/values-in/strings.xml
@@ -18,14 +18,14 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Perangkat"</string>
-    <string name="mr_button_content_description" msgid="3698378085901466129">"Tombol transmisi"</string>
-    <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Tombol transmisi. Terputus"</string>
-    <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tombol transmisi. Menghubungkan"</string>
-    <string name="mr_cast_button_connected" msgid="5088427771788648085">"Tombol transmisi. Terhubung"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Tombol Cast"</string>
+    <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Tombol Cast. Terputus"</string>
+    <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tombol Cast. Menghubungkan"</string>
+    <string name="mr_cast_button_connected" msgid="5088427771788648085">"Tombol Cast. Terhubung"</string>
     <string name="mr_chooser_title" msgid="414301941546135990">"Transmisikan ke"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Mencari perangkat"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Putuskan sambungan"</string>
-    <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Hentikan cast"</string>
+    <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Hentikan Transmisi"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Tutup"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Putar"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Jeda"</string>
diff --git a/v7/mediarouter/res/values-ml/strings.xml b/v7/mediarouter/res/values-ml/strings.xml
index c7b50be..62258fb 100644
--- a/v7/mediarouter/res/values-ml/strings.xml
+++ b/v7/mediarouter/res/values-ml/strings.xml
@@ -26,7 +26,7 @@
     <string name="mr_chooser_searching" msgid="6349900579507521956">"ഉപകരണങ്ങൾ കണ്ടെത്തുന്നു"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"വിച്ഛേദിക്കുക"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"കാസ്റ്റുചെയ്യൽ നിർത്തുക"</string>
-    <string name="mr_controller_close_description" msgid="7333862312480583260">"അടയ്‌ക്കുക"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"അവസാനിപ്പിക്കുക"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"പ്ലേ ചെയ്യുക"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"തൽക്കാലം നിർത്തൂ"</string>
     <string name="mr_controller_stop" msgid="735874641921425123">"നിര്‍ത്തുക"</string>
diff --git a/v7/mediarouter/res/values-mr/strings.xml b/v7/mediarouter/res/values-mr/strings.xml
index 27923d1..596b56a 100644
--- a/v7/mediarouter/res/values-mr/strings.xml
+++ b/v7/mediarouter/res/values-mr/strings.xml
@@ -20,7 +20,7 @@
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"डिव्हाइसेस"</string>
     <string name="mr_button_content_description" msgid="3698378085901466129">"कास्ट बटण"</string>
     <string name="mr_cast_button_disconnected" msgid="816305490427819240">"कास्ट बटण. डिस्कनेक्ट केले"</string>
-    <string name="mr_cast_button_connecting" msgid="2187642765091873834">"कास्ट बटण. कनेक्ट करीत आहे"</string>
+    <string name="mr_cast_button_connecting" msgid="2187642765091873834">"कास्ट बटण. कनेक्ट करत आहे"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"कास्ट बटण. कनेक्ट केले"</string>
     <string name="mr_chooser_title" msgid="414301941546135990">"यावर कास्ट करा"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"डिव्हाइसेस शोधत आहे"</string>
@@ -36,5 +36,5 @@
     <string name="mr_controller_volume_slider" msgid="2361785992211841709">"व्हॉल्यूम स्लायडर"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"मीडिया निवडला नाही"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"कोणतीही माहिती उपलब्ध नाही"</string>
-    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रीन कास्‍ट करीत आहे"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रीन कास्‍ट करत आहे"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ta/strings.xml b/v7/mediarouter/res/values-ta/strings.xml
index 99c6172..9888472 100644
--- a/v7/mediarouter/res/values-ta/strings.xml
+++ b/v7/mediarouter/res/values-ta/strings.xml
@@ -22,7 +22,7 @@
     <string name="mr_cast_button_disconnected" msgid="816305490427819240">"அனுப்புதல் பொத்தான். துண்டிக்கப்பட்டது"</string>
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"அனுப்புதல் பொத்தான். இணைக்கிறது"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"அனுப்புதல் பொத்தான். இணைக்கப்பட்டது"</string>
-    <string name="mr_chooser_title" msgid="414301941546135990">"இதில் திரையிடு"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"இதற்கு அனுப்பு"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"சாதனங்களைத் தேடுகிறது"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"தொடர்பைத் துண்டி"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"அனுப்புவதை நிறுத்து"</string>
diff --git a/v7/mediarouter/res/values-tr/strings.xml b/v7/mediarouter/res/values-tr/strings.xml
index a0eb2e4..8189092 100644
--- a/v7/mediarouter/res/values-tr/strings.xml
+++ b/v7/mediarouter/res/values-tr/strings.xml
@@ -18,7 +18,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Cihazlar"</string>
-    <string name="mr_button_content_description" msgid="3698378085901466129">"Yayın düğmesi"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Yayınla düğmesi"</string>
     <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Yayınla düğmesi. Bağlantı kesildi"</string>
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Yayınla düğmesi. Bağlanıyor"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"Yayınla düğmesi. Bağlandı"</string>
diff --git a/v7/palette/Android.mk b/v7/palette/Android.mk
deleted file mode 100644
index b7dafe9..0000000
--- a/v7/palette/Android.mk
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (C) 2014 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-v7-palette \
-#       android-support-compat \
-#       android-support-core-utils
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-v7-palette
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/src/main/res
-LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-compat \
-    android-support-core-utils
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/v7/palette/api/27.1.0.txt b/v7/palette/api/27.1.0.txt
new file mode 100644
index 0000000..2ff5fd3
--- /dev/null
+++ b/v7/palette/api/27.1.0.txt
@@ -0,0 +1,99 @@
+package android.support.v7.graphics {
+
+  public final class Palette {
+    method public static android.support.v7.graphics.Palette.Builder from(android.graphics.Bitmap);
+    method public static android.support.v7.graphics.Palette from(java.util.List<android.support.v7.graphics.Palette.Swatch>);
+    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap);
+    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap, int);
+    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, android.support.v7.graphics.Palette.PaletteAsyncListener);
+    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, int, android.support.v7.graphics.Palette.PaletteAsyncListener);
+    method public int getColorForTarget(android.support.v7.graphics.Target, int);
+    method public int getDarkMutedColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getDarkMutedSwatch();
+    method public int getDarkVibrantColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getDarkVibrantSwatch();
+    method public int getDominantColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getDominantSwatch();
+    method public int getLightMutedColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getLightMutedSwatch();
+    method public int getLightVibrantColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getLightVibrantSwatch();
+    method public int getMutedColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getMutedSwatch();
+    method public android.support.v7.graphics.Palette.Swatch getSwatchForTarget(android.support.v7.graphics.Target);
+    method public java.util.List<android.support.v7.graphics.Palette.Swatch> getSwatches();
+    method public java.util.List<android.support.v7.graphics.Target> getTargets();
+    method public int getVibrantColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getVibrantSwatch();
+  }
+
+  public static final class Palette.Builder {
+    ctor public Palette.Builder(android.graphics.Bitmap);
+    ctor public Palette.Builder(java.util.List<android.support.v7.graphics.Palette.Swatch>);
+    method public android.support.v7.graphics.Palette.Builder addFilter(android.support.v7.graphics.Palette.Filter);
+    method public android.support.v7.graphics.Palette.Builder addTarget(android.support.v7.graphics.Target);
+    method public android.support.v7.graphics.Palette.Builder clearFilters();
+    method public android.support.v7.graphics.Palette.Builder clearRegion();
+    method public android.support.v7.graphics.Palette.Builder clearTargets();
+    method public android.support.v7.graphics.Palette generate();
+    method public android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generate(android.support.v7.graphics.Palette.PaletteAsyncListener);
+    method public android.support.v7.graphics.Palette.Builder maximumColorCount(int);
+    method public android.support.v7.graphics.Palette.Builder resizeBitmapArea(int);
+    method public deprecated android.support.v7.graphics.Palette.Builder resizeBitmapSize(int);
+    method public android.support.v7.graphics.Palette.Builder setRegion(int, int, int, int);
+  }
+
+  public static abstract interface Palette.Filter {
+    method public abstract boolean isAllowed(int, float[]);
+  }
+
+  public static abstract interface Palette.PaletteAsyncListener {
+    method public abstract void onGenerated(android.support.v7.graphics.Palette);
+  }
+
+  public static final class Palette.Swatch {
+    ctor public Palette.Swatch(int, int);
+    method public int getBodyTextColor();
+    method public float[] getHsl();
+    method public int getPopulation();
+    method public int getRgb();
+    method public int getTitleTextColor();
+  }
+
+  public final class Target {
+    method public float getLightnessWeight();
+    method public float getMaximumLightness();
+    method public float getMaximumSaturation();
+    method public float getMinimumLightness();
+    method public float getMinimumSaturation();
+    method public float getPopulationWeight();
+    method public float getSaturationWeight();
+    method public float getTargetLightness();
+    method public float getTargetSaturation();
+    method public boolean isExclusive();
+    field public static final android.support.v7.graphics.Target DARK_MUTED;
+    field public static final android.support.v7.graphics.Target DARK_VIBRANT;
+    field public static final android.support.v7.graphics.Target LIGHT_MUTED;
+    field public static final android.support.v7.graphics.Target LIGHT_VIBRANT;
+    field public static final android.support.v7.graphics.Target MUTED;
+    field public static final android.support.v7.graphics.Target VIBRANT;
+  }
+
+  public static final class Target.Builder {
+    ctor public Target.Builder();
+    ctor public Target.Builder(android.support.v7.graphics.Target);
+    method public android.support.v7.graphics.Target build();
+    method public android.support.v7.graphics.Target.Builder setExclusive(boolean);
+    method public android.support.v7.graphics.Target.Builder setLightnessWeight(float);
+    method public android.support.v7.graphics.Target.Builder setMaximumLightness(float);
+    method public android.support.v7.graphics.Target.Builder setMaximumSaturation(float);
+    method public android.support.v7.graphics.Target.Builder setMinimumLightness(float);
+    method public android.support.v7.graphics.Target.Builder setMinimumSaturation(float);
+    method public android.support.v7.graphics.Target.Builder setPopulationWeight(float);
+    method public android.support.v7.graphics.Target.Builder setSaturationWeight(float);
+    method public android.support.v7.graphics.Target.Builder setTargetLightness(float);
+    method public android.support.v7.graphics.Target.Builder setTargetSaturation(float);
+  }
+
+}
+
diff --git a/v7/preference/Android.mk b/v7/preference/Android.mk
deleted file mode 100644
index 5a3f57a..0000000
--- a/v7/preference/Android.mk
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright (C) 2015 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-v7-preference \
-#       android-support-v7-appcompat \
-#       android-support-v7-recyclerview \
-#       android-support-v4
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-v7-preference
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := \
-    $(call all-java-files-under,src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-v7-appcompat \
-    android-support-v7-recyclerview \
-    android-support-v4
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-LOCAL_EXPORT_PROGUARD_FLAG_FILES := proguard-rules.pro
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/v7/preference/api/27.1.0.txt b/v7/preference/api/27.1.0.txt
new file mode 100644
index 0000000..ad64841
--- /dev/null
+++ b/v7/preference/api/27.1.0.txt
@@ -0,0 +1,512 @@
+package android.support.v14.preference {
+
+  public class EditTextPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
+    ctor public EditTextPreferenceDialogFragment();
+    method public static android.support.v14.preference.EditTextPreferenceDialogFragment newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class ListPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
+    ctor public ListPreferenceDialogFragment();
+    method public static android.support.v14.preference.ListPreferenceDialogFragment newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class MultiSelectListPreference extends android.support.v7.preference.DialogPreference {
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet);
+    ctor public MultiSelectListPreference(android.content.Context);
+    method public int findIndexOfValue(java.lang.String);
+    method public java.lang.CharSequence[] getEntries();
+    method public java.lang.CharSequence[] getEntryValues();
+    method protected boolean[] getSelectedItems();
+    method public java.util.Set<java.lang.String> getValues();
+    method public void setEntries(java.lang.CharSequence[]);
+    method public void setEntries(int);
+    method public void setEntryValues(java.lang.CharSequence[]);
+    method public void setEntryValues(int);
+    method public void setValues(java.util.Set<java.lang.String>);
+  }
+
+  public class MultiSelectListPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
+    ctor public MultiSelectListPreferenceDialogFragment();
+    method public static android.support.v14.preference.MultiSelectListPreferenceDialogFragment newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public abstract class PreferenceDialogFragment extends android.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
+    ctor public PreferenceDialogFragment();
+    method public android.support.v7.preference.DialogPreference getPreference();
+    method protected void onBindDialogView(android.view.View);
+    method public void onClick(android.content.DialogInterface, int);
+    method protected android.view.View onCreateDialogView(android.content.Context);
+    method public abstract void onDialogClosed(boolean);
+    method protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
+    field protected static final java.lang.String ARG_KEY = "key";
+  }
+
+  public abstract class PreferenceFragment extends android.app.Fragment implements android.support.v7.preference.DialogPreference.TargetFragment android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener {
+    ctor public PreferenceFragment();
+    method public void addPreferencesFromResource(int);
+    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+    method public final android.support.v7.widget.RecyclerView getListView();
+    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
+    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
+    method protected android.support.v7.widget.RecyclerView.Adapter onCreateAdapter(android.support.v7.preference.PreferenceScreen);
+    method public android.support.v7.widget.RecyclerView.LayoutManager onCreateLayoutManager();
+    method public abstract void onCreatePreferences(android.os.Bundle, java.lang.String);
+    method public android.support.v7.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
+    method public void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
+    method public boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
+    method public void scrollToPreference(java.lang.String);
+    method public void scrollToPreference(android.support.v7.preference.Preference);
+    method public void setDivider(android.graphics.drawable.Drawable);
+    method public void setDividerHeight(int);
+    method public void setPreferenceScreen(android.support.v7.preference.PreferenceScreen);
+    method public void setPreferencesFromResource(int, java.lang.String);
+    field public static final java.lang.String ARG_PREFERENCE_ROOT = "android.support.v7.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
+  }
+
+  public static abstract interface PreferenceFragment.OnPreferenceDisplayDialogCallback {
+    method public abstract boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceFragment.OnPreferenceStartFragmentCallback {
+    method public abstract boolean onPreferenceStartFragment(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceFragment.OnPreferenceStartScreenCallback {
+    method public abstract boolean onPreferenceStartScreen(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.PreferenceScreen);
+  }
+
+  public class SwitchPreference extends android.support.v7.preference.TwoStatePreference {
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet);
+    ctor public SwitchPreference(android.content.Context);
+    method public java.lang.CharSequence getSwitchTextOff();
+    method public java.lang.CharSequence getSwitchTextOn();
+    method public void setSwitchTextOff(java.lang.CharSequence);
+    method public void setSwitchTextOff(int);
+    method public void setSwitchTextOn(java.lang.CharSequence);
+    method public void setSwitchTextOn(int);
+  }
+
+}
+
+package android.support.v7.preference {
+
+  public class CheckBoxPreference extends android.support.v7.preference.TwoStatePreference {
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet);
+    ctor public CheckBoxPreference(android.content.Context);
+  }
+
+  public abstract class DialogPreference extends android.support.v7.preference.Preference {
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet);
+    ctor public DialogPreference(android.content.Context);
+    method public android.graphics.drawable.Drawable getDialogIcon();
+    method public int getDialogLayoutResource();
+    method public java.lang.CharSequence getDialogMessage();
+    method public java.lang.CharSequence getDialogTitle();
+    method public java.lang.CharSequence getNegativeButtonText();
+    method public java.lang.CharSequence getPositiveButtonText();
+    method public void setDialogIcon(android.graphics.drawable.Drawable);
+    method public void setDialogIcon(int);
+    method public void setDialogLayoutResource(int);
+    method public void setDialogMessage(java.lang.CharSequence);
+    method public void setDialogMessage(int);
+    method public void setDialogTitle(java.lang.CharSequence);
+    method public void setDialogTitle(int);
+    method public void setNegativeButtonText(java.lang.CharSequence);
+    method public void setNegativeButtonText(int);
+    method public void setPositiveButtonText(java.lang.CharSequence);
+    method public void setPositiveButtonText(int);
+  }
+
+  public static abstract interface DialogPreference.TargetFragment {
+    method public abstract android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+  }
+
+  public class DropDownPreference extends android.support.v7.preference.ListPreference {
+    ctor public DropDownPreference(android.content.Context);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet, int, int);
+    method protected android.widget.ArrayAdapter createAdapter();
+  }
+
+  public class EditTextPreference extends android.support.v7.preference.DialogPreference {
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet);
+    ctor public EditTextPreference(android.content.Context);
+    method public java.lang.String getText();
+    method public void setText(java.lang.String);
+  }
+
+  public class EditTextPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
+    ctor public EditTextPreferenceDialogFragmentCompat();
+    method public static android.support.v7.preference.EditTextPreferenceDialogFragmentCompat newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class ListPreference extends android.support.v7.preference.DialogPreference {
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet);
+    ctor public ListPreference(android.content.Context);
+    method public int findIndexOfValue(java.lang.String);
+    method public java.lang.CharSequence[] getEntries();
+    method public java.lang.CharSequence getEntry();
+    method public java.lang.CharSequence[] getEntryValues();
+    method public java.lang.String getValue();
+    method public void setEntries(java.lang.CharSequence[]);
+    method public void setEntries(int);
+    method public void setEntryValues(java.lang.CharSequence[]);
+    method public void setEntryValues(int);
+    method public void setValue(java.lang.String);
+    method public void setValueIndex(int);
+  }
+
+  public class ListPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
+    ctor public ListPreferenceDialogFragmentCompat();
+    method public static android.support.v7.preference.ListPreferenceDialogFragmentCompat newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class MultiSelectListPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
+    ctor public MultiSelectListPreferenceDialogFragmentCompat();
+    method public static android.support.v7.preference.MultiSelectListPreferenceDialogFragmentCompat newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class Preference implements java.lang.Comparable {
+    ctor public Preference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public Preference(android.content.Context, android.util.AttributeSet, int);
+    ctor public Preference(android.content.Context, android.util.AttributeSet);
+    ctor public Preference(android.content.Context);
+    method public boolean callChangeListener(java.lang.Object);
+    method public int compareTo(android.support.v7.preference.Preference);
+    method protected android.support.v7.preference.Preference findPreferenceInHierarchy(java.lang.String);
+    method public android.content.Context getContext();
+    method public java.lang.String getDependency();
+    method public android.os.Bundle getExtras();
+    method public java.lang.String getFragment();
+    method public android.graphics.drawable.Drawable getIcon();
+    method public android.content.Intent getIntent();
+    method public java.lang.String getKey();
+    method public final int getLayoutResource();
+    method public android.support.v7.preference.Preference.OnPreferenceChangeListener getOnPreferenceChangeListener();
+    method public android.support.v7.preference.Preference.OnPreferenceClickListener getOnPreferenceClickListener();
+    method public int getOrder();
+    method public android.support.v7.preference.PreferenceGroup getParent();
+    method protected boolean getPersistedBoolean(boolean);
+    method protected float getPersistedFloat(float);
+    method protected int getPersistedInt(int);
+    method protected long getPersistedLong(long);
+    method protected java.lang.String getPersistedString(java.lang.String);
+    method public java.util.Set<java.lang.String> getPersistedStringSet(java.util.Set<java.lang.String>);
+    method public android.support.v7.preference.PreferenceDataStore getPreferenceDataStore();
+    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
+    method public android.content.SharedPreferences getSharedPreferences();
+    method public boolean getShouldDisableView();
+    method public java.lang.CharSequence getSummary();
+    method public java.lang.CharSequence getTitle();
+    method public final int getWidgetLayoutResource();
+    method public boolean hasKey();
+    method public boolean isEnabled();
+    method public boolean isIconSpaceReserved();
+    method public boolean isPersistent();
+    method public boolean isSelectable();
+    method public boolean isSingleLineTitle();
+    method public final boolean isVisible();
+    method protected void notifyChanged();
+    method public void notifyDependencyChange(boolean);
+    method protected void notifyHierarchyChanged();
+    method public void onAttached();
+    method protected void onAttachedToHierarchy(android.support.v7.preference.PreferenceManager);
+    method public void onBindViewHolder(android.support.v7.preference.PreferenceViewHolder);
+    method protected void onClick();
+    method public void onDependencyChanged(android.support.v7.preference.Preference, boolean);
+    method public void onDetached();
+    method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int);
+    method public void onInitializeAccessibilityNodeInfo(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onParentChanged(android.support.v7.preference.Preference, boolean);
+    method protected void onPrepareForRemoval();
+    method protected void onRestoreInstanceState(android.os.Parcelable);
+    method protected android.os.Parcelable onSaveInstanceState();
+    method protected void onSetInitialValue(boolean, java.lang.Object);
+    method public android.os.Bundle peekExtras();
+    method protected boolean persistBoolean(boolean);
+    method protected boolean persistFloat(float);
+    method protected boolean persistInt(int);
+    method protected boolean persistLong(long);
+    method protected boolean persistString(java.lang.String);
+    method public boolean persistStringSet(java.util.Set<java.lang.String>);
+    method public void restoreHierarchyState(android.os.Bundle);
+    method public void saveHierarchyState(android.os.Bundle);
+    method public void setDefaultValue(java.lang.Object);
+    method public void setDependency(java.lang.String);
+    method public void setEnabled(boolean);
+    method public void setFragment(java.lang.String);
+    method public void setIcon(android.graphics.drawable.Drawable);
+    method public void setIcon(int);
+    method public void setIconSpaceReserved(boolean);
+    method public void setIntent(android.content.Intent);
+    method public void setKey(java.lang.String);
+    method public void setLayoutResource(int);
+    method public void setOnPreferenceChangeListener(android.support.v7.preference.Preference.OnPreferenceChangeListener);
+    method public void setOnPreferenceClickListener(android.support.v7.preference.Preference.OnPreferenceClickListener);
+    method public void setOrder(int);
+    method public void setPersistent(boolean);
+    method public void setPreferenceDataStore(android.support.v7.preference.PreferenceDataStore);
+    method public void setSelectable(boolean);
+    method public void setShouldDisableView(boolean);
+    method public void setSingleLineTitle(boolean);
+    method public void setSummary(java.lang.CharSequence);
+    method public void setSummary(int);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitle(int);
+    method public void setViewId(int);
+    method public final void setVisible(boolean);
+    method public void setWidgetLayoutResource(int);
+    method public boolean shouldDisableDependents();
+    method protected boolean shouldPersist();
+    field public static final int DEFAULT_ORDER = 2147483647; // 0x7fffffff
+  }
+
+  public static class Preference.BaseSavedState extends android.view.AbsSavedState {
+    ctor public Preference.BaseSavedState(android.os.Parcel);
+    ctor public Preference.BaseSavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.v7.preference.Preference.BaseSavedState> CREATOR;
+  }
+
+  public static abstract interface Preference.OnPreferenceChangeListener {
+    method public abstract boolean onPreferenceChange(android.support.v7.preference.Preference, java.lang.Object);
+  }
+
+  public static abstract interface Preference.OnPreferenceClickListener {
+    method public abstract boolean onPreferenceClick(android.support.v7.preference.Preference);
+  }
+
+  public class PreferenceCategory extends android.support.v7.preference.PreferenceGroup {
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet);
+    ctor public PreferenceCategory(android.content.Context);
+  }
+
+  public abstract class PreferenceDataStore {
+    ctor public PreferenceDataStore();
+    method public boolean getBoolean(java.lang.String, boolean);
+    method public float getFloat(java.lang.String, float);
+    method public int getInt(java.lang.String, int);
+    method public long getLong(java.lang.String, long);
+    method public java.lang.String getString(java.lang.String, java.lang.String);
+    method public java.util.Set<java.lang.String> getStringSet(java.lang.String, java.util.Set<java.lang.String>);
+    method public void putBoolean(java.lang.String, boolean);
+    method public void putFloat(java.lang.String, float);
+    method public void putInt(java.lang.String, int);
+    method public void putLong(java.lang.String, long);
+    method public void putString(java.lang.String, java.lang.String);
+    method public void putStringSet(java.lang.String, java.util.Set<java.lang.String>);
+  }
+
+  public abstract class PreferenceDialogFragmentCompat extends android.support.v4.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
+    ctor public PreferenceDialogFragmentCompat();
+    method public android.support.v7.preference.DialogPreference getPreference();
+    method protected void onBindDialogView(android.view.View);
+    method public void onClick(android.content.DialogInterface, int);
+    method protected android.view.View onCreateDialogView(android.content.Context);
+    method public abstract void onDialogClosed(boolean);
+    method protected void onPrepareDialogBuilder(android.support.v7.app.AlertDialog.Builder);
+    field protected static final java.lang.String ARG_KEY = "key";
+  }
+
+  public abstract class PreferenceFragmentCompat extends android.support.v4.app.Fragment implements android.support.v7.preference.DialogPreference.TargetFragment android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener {
+    ctor public PreferenceFragmentCompat();
+    method public void addPreferencesFromResource(int);
+    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+    method public final android.support.v7.widget.RecyclerView getListView();
+    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
+    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
+    method protected android.support.v7.widget.RecyclerView.Adapter onCreateAdapter(android.support.v7.preference.PreferenceScreen);
+    method public android.support.v7.widget.RecyclerView.LayoutManager onCreateLayoutManager();
+    method public abstract void onCreatePreferences(android.os.Bundle, java.lang.String);
+    method public android.support.v7.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
+    method public void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
+    method public boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
+    method public void scrollToPreference(java.lang.String);
+    method public void scrollToPreference(android.support.v7.preference.Preference);
+    method public void setDivider(android.graphics.drawable.Drawable);
+    method public void setDividerHeight(int);
+    method public void setPreferenceScreen(android.support.v7.preference.PreferenceScreen);
+    method public void setPreferencesFromResource(int, java.lang.String);
+    field public static final java.lang.String ARG_PREFERENCE_ROOT = "android.support.v7.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
+  }
+
+  public static abstract interface PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
+    method public abstract boolean onPreferenceDisplayDialog(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
+    method public abstract boolean onPreferenceStartFragment(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
+    method public abstract boolean onPreferenceStartScreen(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.PreferenceScreen);
+  }
+
+  public abstract class PreferenceGroup extends android.support.v7.preference.Preference {
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet);
+    method public void addItemFromInflater(android.support.v7.preference.Preference);
+    method public boolean addPreference(android.support.v7.preference.Preference);
+    method protected void dispatchRestoreInstanceState(android.os.Bundle);
+    method protected void dispatchSaveInstanceState(android.os.Bundle);
+    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+    method public int getInitialExpandedChildrenCount();
+    method public android.support.v7.preference.Preference getPreference(int);
+    method public int getPreferenceCount();
+    method protected boolean isOnSameScreenAsChildren();
+    method public boolean isOrderingAsAdded();
+    method protected boolean onPrepareAddPreference(android.support.v7.preference.Preference);
+    method public void removeAll();
+    method public boolean removePreference(android.support.v7.preference.Preference);
+    method public void setInitialExpandedChildrenCount(int);
+    method public void setOrderingAsAdded(boolean);
+  }
+
+  public static abstract interface PreferenceGroup.PreferencePositionCallback {
+    method public abstract int getPreferenceAdapterPosition(java.lang.String);
+    method public abstract int getPreferenceAdapterPosition(android.support.v7.preference.Preference);
+  }
+
+  public class PreferenceManager {
+    method public android.support.v7.preference.PreferenceScreen createPreferenceScreen(android.content.Context);
+    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+    method public android.content.Context getContext();
+    method public static android.content.SharedPreferences getDefaultSharedPreferences(android.content.Context);
+    method public android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener getOnDisplayPreferenceDialogListener();
+    method public android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener getOnNavigateToScreenListener();
+    method public android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener getOnPreferenceTreeClickListener();
+    method public android.support.v7.preference.PreferenceManager.PreferenceComparisonCallback getPreferenceComparisonCallback();
+    method public android.support.v7.preference.PreferenceDataStore getPreferenceDataStore();
+    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
+    method public android.content.SharedPreferences getSharedPreferences();
+    method public int getSharedPreferencesMode();
+    method public java.lang.String getSharedPreferencesName();
+    method public boolean isStorageDefault();
+    method public boolean isStorageDeviceProtected();
+    method public static void setDefaultValues(android.content.Context, int, boolean);
+    method public static void setDefaultValues(android.content.Context, java.lang.String, int, int, boolean);
+    method public void setOnDisplayPreferenceDialogListener(android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener);
+    method public void setOnNavigateToScreenListener(android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener);
+    method public void setOnPreferenceTreeClickListener(android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener);
+    method public void setPreferenceComparisonCallback(android.support.v7.preference.PreferenceManager.PreferenceComparisonCallback);
+    method public void setPreferenceDataStore(android.support.v7.preference.PreferenceDataStore);
+    method public boolean setPreferences(android.support.v7.preference.PreferenceScreen);
+    method public void setSharedPreferencesMode(int);
+    method public void setSharedPreferencesName(java.lang.String);
+    method public void setStorageDefault();
+    method public void setStorageDeviceProtected();
+    method public void showDialog(android.support.v7.preference.Preference);
+    field public static final java.lang.String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
+  }
+
+  public static abstract interface PreferenceManager.OnDisplayPreferenceDialogListener {
+    method public abstract void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceManager.OnNavigateToScreenListener {
+    method public abstract void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
+  }
+
+  public static abstract interface PreferenceManager.OnPreferenceTreeClickListener {
+    method public abstract boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
+  }
+
+  public static abstract class PreferenceManager.PreferenceComparisonCallback {
+    ctor public PreferenceManager.PreferenceComparisonCallback();
+    method public abstract boolean arePreferenceContentsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
+    method public abstract boolean arePreferenceItemsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
+  }
+
+  public static class PreferenceManager.SimplePreferenceComparisonCallback extends android.support.v7.preference.PreferenceManager.PreferenceComparisonCallback {
+    ctor public PreferenceManager.SimplePreferenceComparisonCallback();
+    method public boolean arePreferenceContentsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
+    method public boolean arePreferenceItemsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
+  }
+
+  public final class PreferenceScreen extends android.support.v7.preference.PreferenceGroup {
+    method public void setShouldUseGeneratedIds(boolean);
+    method public boolean shouldUseGeneratedIds();
+  }
+
+  public class PreferenceViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder {
+    method public android.view.View findViewById(int);
+    method public boolean isDividerAllowedAbove();
+    method public boolean isDividerAllowedBelow();
+    method public void setDividerAllowedAbove(boolean);
+    method public void setDividerAllowedBelow(boolean);
+  }
+
+  public class SeekBarPreference extends android.support.v7.preference.Preference {
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet);
+    ctor public SeekBarPreference(android.content.Context);
+    method public int getMax();
+    method public int getMin();
+    method public final int getSeekBarIncrement();
+    method public int getValue();
+    method public boolean isAdjustable();
+    method public void setAdjustable(boolean);
+    method public final void setMax(int);
+    method public void setMin(int);
+    method public final void setSeekBarIncrement(int);
+    method public void setValue(int);
+  }
+
+  public class SwitchPreferenceCompat extends android.support.v7.preference.TwoStatePreference {
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet);
+    ctor public SwitchPreferenceCompat(android.content.Context);
+    method public java.lang.CharSequence getSwitchTextOff();
+    method public java.lang.CharSequence getSwitchTextOn();
+    method public void setSwitchTextOff(java.lang.CharSequence);
+    method public void setSwitchTextOff(int);
+    method public void setSwitchTextOn(java.lang.CharSequence);
+    method public void setSwitchTextOn(int);
+  }
+
+  public abstract class TwoStatePreference extends android.support.v7.preference.Preference {
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet);
+    ctor public TwoStatePreference(android.content.Context);
+    method public boolean getDisableDependentsState();
+    method public java.lang.CharSequence getSummaryOff();
+    method public java.lang.CharSequence getSummaryOn();
+    method public boolean isChecked();
+    method public void setChecked(boolean);
+    method public void setDisableDependentsState(boolean);
+    method public void setSummaryOff(java.lang.CharSequence);
+    method public void setSummaryOff(int);
+    method public void setSummaryOn(java.lang.CharSequence);
+    method public void setSummaryOn(int);
+    method protected void syncSummaryView(android.support.v7.preference.PreferenceViewHolder);
+    field protected boolean mChecked;
+  }
+
+}
+
diff --git a/v7/recyclerview/Android.mk b/v7/recyclerview/Android.mk
deleted file mode 100644
index a62c3cd..0000000
--- a/v7/recyclerview/Android.mk
+++ /dev/null
@@ -1,41 +0,0 @@
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-v7-recyclerview \
-#       android-support-compat \
-#       android-support-core-ui
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-v7-recyclerview
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-compat \
-    android-support-core-ui
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-LOCAL_EXPORT_PROGUARD_FLAG_FILES := proguard-rules.pro
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/v7/recyclerview/api/27.1.0.txt b/v7/recyclerview/api/27.1.0.txt
new file mode 100644
index 0000000..cdff0f0
--- /dev/null
+++ b/v7/recyclerview/api/27.1.0.txt
@@ -0,0 +1,1026 @@
+package android.support.v7.recyclerview.extensions {
+
+  public final class AsyncDifferConfig<T> {
+    method public java.util.concurrent.Executor getBackgroundThreadExecutor();
+    method public android.support.v7.util.DiffUtil.ItemCallback<T> getDiffCallback();
+  }
+
+  public static final class AsyncDifferConfig.Builder<T> {
+    ctor public AsyncDifferConfig.Builder(android.support.v7.util.DiffUtil.ItemCallback<T>);
+    method public android.support.v7.recyclerview.extensions.AsyncDifferConfig<T> build();
+    method public android.support.v7.recyclerview.extensions.AsyncDifferConfig.Builder<T> setBackgroundThreadExecutor(java.util.concurrent.Executor);
+  }
+
+  public class AsyncListDiffer<T> {
+    ctor public AsyncListDiffer(android.support.v7.widget.RecyclerView.Adapter, android.support.v7.util.DiffUtil.ItemCallback<T>);
+    ctor public AsyncListDiffer(android.support.v7.util.ListUpdateCallback, android.support.v7.recyclerview.extensions.AsyncDifferConfig<T>);
+    method public java.util.List<T> getCurrentList();
+    method public void submitList(java.util.List<T>);
+  }
+
+  public abstract class ListAdapter<T, VH extends android.support.v7.widget.RecyclerView.ViewHolder> extends android.support.v7.widget.RecyclerView.Adapter {
+    ctor protected ListAdapter(android.support.v7.util.DiffUtil.ItemCallback<T>);
+    ctor protected ListAdapter(android.support.v7.recyclerview.extensions.AsyncDifferConfig<T>);
+    method protected T getItem(int);
+    method public int getItemCount();
+    method public void submitList(java.util.List<T>);
+  }
+
+}
+
+package android.support.v7.util {
+
+  public final class AdapterListUpdateCallback implements android.support.v7.util.ListUpdateCallback {
+    ctor public AdapterListUpdateCallback(android.support.v7.widget.RecyclerView.Adapter);
+    method public void onChanged(int, int, java.lang.Object);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public class AsyncListUtil<T> {
+    ctor public AsyncListUtil(java.lang.Class<T>, int, android.support.v7.util.AsyncListUtil.DataCallback<T>, android.support.v7.util.AsyncListUtil.ViewCallback);
+    method public T getItem(int);
+    method public int getItemCount();
+    method public void onRangeChanged();
+    method public void refresh();
+  }
+
+  public static abstract class AsyncListUtil.DataCallback<T> {
+    ctor public AsyncListUtil.DataCallback();
+    method public abstract void fillData(T[], int, int);
+    method public int getMaxCachedTiles();
+    method public void recycleData(T[], int);
+    method public abstract int refreshData();
+  }
+
+  public static abstract class AsyncListUtil.ViewCallback {
+    ctor public AsyncListUtil.ViewCallback();
+    method public void extendRangeInto(int[], int[], int);
+    method public abstract void getItemRangeInto(int[]);
+    method public abstract void onDataRefresh();
+    method public abstract void onItemLoaded(int);
+    field public static final int HINT_SCROLL_ASC = 2; // 0x2
+    field public static final int HINT_SCROLL_DESC = 1; // 0x1
+    field public static final int HINT_SCROLL_NONE = 0; // 0x0
+  }
+
+  public class BatchingListUpdateCallback implements android.support.v7.util.ListUpdateCallback {
+    ctor public BatchingListUpdateCallback(android.support.v7.util.ListUpdateCallback);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int, java.lang.Object);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public class DiffUtil {
+    method public static android.support.v7.util.DiffUtil.DiffResult calculateDiff(android.support.v7.util.DiffUtil.Callback);
+    method public static android.support.v7.util.DiffUtil.DiffResult calculateDiff(android.support.v7.util.DiffUtil.Callback, boolean);
+  }
+
+  public static abstract class DiffUtil.Callback {
+    ctor public DiffUtil.Callback();
+    method public abstract boolean areContentsTheSame(int, int);
+    method public abstract boolean areItemsTheSame(int, int);
+    method public java.lang.Object getChangePayload(int, int);
+    method public abstract int getNewListSize();
+    method public abstract int getOldListSize();
+  }
+
+  public static class DiffUtil.DiffResult {
+    method public void dispatchUpdatesTo(android.support.v7.widget.RecyclerView.Adapter);
+    method public void dispatchUpdatesTo(android.support.v7.util.ListUpdateCallback);
+  }
+
+  public static abstract class DiffUtil.ItemCallback<T> {
+    ctor public DiffUtil.ItemCallback();
+    method public abstract boolean areContentsTheSame(T, T);
+    method public abstract boolean areItemsTheSame(T, T);
+    method public java.lang.Object getChangePayload(T, T);
+  }
+
+  public abstract interface ListUpdateCallback {
+    method public abstract void onChanged(int, int, java.lang.Object);
+    method public abstract void onInserted(int, int);
+    method public abstract void onMoved(int, int);
+    method public abstract void onRemoved(int, int);
+  }
+
+  public class SortedList<T> {
+    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>);
+    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>, int);
+    method public int add(T);
+    method public void addAll(T[], boolean);
+    method public void addAll(T...);
+    method public void addAll(java.util.Collection<T>);
+    method public void beginBatchedUpdates();
+    method public void clear();
+    method public void endBatchedUpdates();
+    method public T get(int) throws java.lang.IndexOutOfBoundsException;
+    method public int indexOf(T);
+    method public void recalculatePositionOfItemAt(int);
+    method public boolean remove(T);
+    method public T removeItemAt(int);
+    method public void replaceAll(T[], boolean);
+    method public void replaceAll(T...);
+    method public void replaceAll(java.util.Collection<T>);
+    method public int size();
+    method public void updateItemAt(int, T);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  public static class SortedList.BatchedCallback<T2> extends android.support.v7.util.SortedList.Callback {
+    ctor public SortedList.BatchedCallback(android.support.v7.util.SortedList.Callback<T2>);
+    method public boolean areContentsTheSame(T2, T2);
+    method public boolean areItemsTheSame(T2, T2);
+    method public int compare(T2, T2);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public static abstract class SortedList.Callback<T2> implements java.util.Comparator android.support.v7.util.ListUpdateCallback {
+    ctor public SortedList.Callback();
+    method public abstract boolean areContentsTheSame(T2, T2);
+    method public abstract boolean areItemsTheSame(T2, T2);
+    method public abstract int compare(T2, T2);
+    method public java.lang.Object getChangePayload(T2, T2);
+    method public abstract void onChanged(int, int);
+    method public void onChanged(int, int, java.lang.Object);
+  }
+
+}
+
+package android.support.v7.widget {
+
+  public class DefaultItemAnimator extends android.support.v7.widget.SimpleItemAnimator {
+    ctor public DefaultItemAnimator();
+    method public boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void endAnimations();
+    method public boolean isRunning();
+    method public void runPendingAnimations();
+  }
+
+  public class DividerItemDecoration extends android.support.v7.widget.RecyclerView.ItemDecoration {
+    ctor public DividerItemDecoration(android.content.Context, int);
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setOrientation(int);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public class GridLayoutManager extends android.support.v7.widget.LinearLayoutManager {
+    ctor public GridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public GridLayoutManager(android.content.Context, int);
+    ctor public GridLayoutManager(android.content.Context, int, int, boolean);
+    method public int getSpanCount();
+    method public android.support.v7.widget.GridLayoutManager.SpanSizeLookup getSpanSizeLookup();
+    method public void setSpanCount(int);
+    method public void setSpanSizeLookup(android.support.v7.widget.GridLayoutManager.SpanSizeLookup);
+    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
+  }
+
+  public static final class GridLayoutManager.DefaultSpanSizeLookup extends android.support.v7.widget.GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.DefaultSpanSizeLookup();
+    method public int getSpanSize(int);
+  }
+
+  public static class GridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
+    ctor public GridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public GridLayoutManager.LayoutParams(int, int);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public GridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
+    method public int getSpanIndex();
+    method public int getSpanSize();
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+  public static abstract class GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.SpanSizeLookup();
+    method public int getSpanGroupIndex(int, int);
+    method public int getSpanIndex(int, int);
+    method public abstract int getSpanSize(int);
+    method public void invalidateSpanIndexCache();
+    method public boolean isSpanIndexCacheEnabled();
+    method public void setSpanIndexCacheEnabled(boolean);
+  }
+
+  public class LinearLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager implements android.support.v7.widget.helper.ItemTouchHelper.ViewDropHandler android.support.v7.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    ctor public LinearLayoutManager(android.content.Context);
+    ctor public LinearLayoutManager(android.content.Context, int, boolean);
+    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
+    method public android.graphics.PointF computeScrollVectorForPosition(int);
+    method public int findFirstCompletelyVisibleItemPosition();
+    method public int findFirstVisibleItemPosition();
+    method public int findLastCompletelyVisibleItemPosition();
+    method public int findLastVisibleItemPosition();
+    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method protected int getExtraLayoutSpace(android.support.v7.widget.RecyclerView.State);
+    method public int getInitialPrefetchItemCount();
+    method public int getOrientation();
+    method public boolean getRecycleChildrenOnDetach();
+    method public boolean getReverseLayout();
+    method public boolean getStackFromEnd();
+    method protected boolean isLayoutRTL();
+    method public boolean isSmoothScrollbarEnabled();
+    method public void prepareForDrop(android.view.View, android.view.View, int, int);
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setInitialPrefetchItemCount(int);
+    method public void setOrientation(int);
+    method public void setRecycleChildrenOnDetach(boolean);
+    method public void setReverseLayout(boolean);
+    method public void setSmoothScrollbarEnabled(boolean);
+    method public void setStackFromEnd(boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  protected static class LinearLayoutManager.LayoutChunkResult {
+    ctor protected LinearLayoutManager.LayoutChunkResult();
+    field public int mConsumed;
+    field public boolean mFinished;
+    field public boolean mFocusable;
+    field public boolean mIgnoreConsumed;
+  }
+
+  public class LinearSmoothScroller extends android.support.v7.widget.RecyclerView.SmoothScroller {
+    ctor public LinearSmoothScroller(android.content.Context);
+    method public int calculateDtToFit(int, int, int, int, int);
+    method public int calculateDxToMakeVisible(android.view.View, int);
+    method public int calculateDyToMakeVisible(android.view.View, int);
+    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
+    method protected int calculateTimeForDeceleration(int);
+    method protected int calculateTimeForScrolling(int);
+    method public android.graphics.PointF computeScrollVectorForPosition(int);
+    method protected int getHorizontalSnapPreference();
+    method protected int getVerticalSnapPreference();
+    method protected void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onStart();
+    method protected void onStop();
+    method protected void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    method protected void updateActionForInterimTarget(android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    field public static final int SNAP_TO_ANY = 0; // 0x0
+    field public static final int SNAP_TO_END = 1; // 0x1
+    field public static final int SNAP_TO_START = -1; // 0xffffffff
+    field protected final android.view.animation.DecelerateInterpolator mDecelerateInterpolator;
+    field protected int mInterimTargetDx;
+    field protected int mInterimTargetDy;
+    field protected final android.view.animation.LinearInterpolator mLinearInterpolator;
+    field protected android.graphics.PointF mTargetVector;
+  }
+
+  public class LinearSnapHelper extends android.support.v7.widget.SnapHelper {
+    ctor public LinearSnapHelper();
+    method public int[] calculateDistanceToFinalSnap(android.support.v7.widget.RecyclerView.LayoutManager, android.view.View);
+    method public android.view.View findSnapView(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public int findTargetSnapPosition(android.support.v7.widget.RecyclerView.LayoutManager, int, int);
+  }
+
+  public abstract class OrientationHelper {
+    method public static android.support.v7.widget.OrientationHelper createHorizontalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public static android.support.v7.widget.OrientationHelper createOrientationHelper(android.support.v7.widget.RecyclerView.LayoutManager, int);
+    method public static android.support.v7.widget.OrientationHelper createVerticalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public abstract int getDecoratedEnd(android.view.View);
+    method public abstract int getDecoratedMeasurement(android.view.View);
+    method public abstract int getDecoratedMeasurementInOther(android.view.View);
+    method public abstract int getDecoratedStart(android.view.View);
+    method public abstract int getEnd();
+    method public abstract int getEndAfterPadding();
+    method public abstract int getEndPadding();
+    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
+    method public abstract int getMode();
+    method public abstract int getModeInOther();
+    method public abstract int getStartAfterPadding();
+    method public abstract int getTotalSpace();
+    method public int getTotalSpaceChange();
+    method public abstract int getTransformedEndWithDecoration(android.view.View);
+    method public abstract int getTransformedStartWithDecoration(android.view.View);
+    method public abstract void offsetChild(android.view.View, int);
+    method public abstract void offsetChildren(int);
+    method public void onLayoutComplete();
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+    field protected final android.support.v7.widget.RecyclerView.LayoutManager mLayoutManager;
+  }
+
+  public class PagerSnapHelper extends android.support.v7.widget.SnapHelper {
+    ctor public PagerSnapHelper();
+    method public int[] calculateDistanceToFinalSnap(android.support.v7.widget.RecyclerView.LayoutManager, android.view.View);
+    method protected android.support.v7.widget.LinearSmoothScroller createSnapScroller(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public android.view.View findSnapView(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public int findTargetSnapPosition(android.support.v7.widget.RecyclerView.LayoutManager, int, int);
+  }
+
+  public class RecyclerView extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingChild2 android.support.v4.view.ScrollingView {
+    ctor public RecyclerView(android.content.Context);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet, int);
+    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration, int);
+    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
+    method public void addOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void addOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
+    method public void addOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
+    method public void clearOnChildAttachStateChangeListeners();
+    method public void clearOnScrollListeners();
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[], int[], int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
+    method public boolean drawChild(android.graphics.Canvas, android.view.View, long);
+    method public android.view.View findChildViewUnder(float, float);
+    method public android.view.View findContainingItemView(android.view.View);
+    method public android.support.v7.widget.RecyclerView.ViewHolder findContainingViewHolder(android.view.View);
+    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForAdapterPosition(int);
+    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForItemId(long);
+    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForLayoutPosition(int);
+    method public deprecated android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForPosition(int);
+    method public boolean fling(int, int);
+    method public android.support.v7.widget.RecyclerView.Adapter getAdapter();
+    method public int getChildAdapterPosition(android.view.View);
+    method public long getChildItemId(android.view.View);
+    method public int getChildLayoutPosition(android.view.View);
+    method public deprecated int getChildPosition(android.view.View);
+    method public android.support.v7.widget.RecyclerView.ViewHolder getChildViewHolder(android.view.View);
+    method public android.support.v7.widget.RecyclerViewAccessibilityDelegate getCompatAccessibilityDelegate();
+    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public android.support.v7.widget.RecyclerView.EdgeEffectFactory getEdgeEffectFactory();
+    method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
+    method public android.support.v7.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+    method public int getItemDecorationCount();
+    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
+    method public int getMaxFlingVelocity();
+    method public int getMinFlingVelocity();
+    method public android.support.v7.widget.RecyclerView.OnFlingListener getOnFlingListener();
+    method public boolean getPreserveFocusAfterLayout();
+    method public android.support.v7.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
+    method public int getScrollState();
+    method public boolean hasFixedSize();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean hasPendingAdapterUpdates();
+    method public void invalidateItemDecorations();
+    method public boolean isAnimating();
+    method public boolean isComputingLayout();
+    method public boolean isLayoutFrozen();
+    method public void offsetChildrenHorizontal(int);
+    method public void offsetChildrenVertical(int);
+    method public void onChildAttachedToWindow(android.view.View);
+    method public void onChildDetachedFromWindow(android.view.View);
+    method public void onDraw(android.graphics.Canvas);
+    method public void onScrollStateChanged(int);
+    method public void onScrolled(int, int);
+    method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
+    method public void removeItemDecorationAt(int);
+    method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
+    method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
+    method public void scrollToPosition(int);
+    method public void setAccessibilityDelegateCompat(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
+    method public void setAdapter(android.support.v7.widget.RecyclerView.Adapter);
+    method public void setChildDrawingOrderCallback(android.support.v7.widget.RecyclerView.ChildDrawingOrderCallback);
+    method public void setEdgeEffectFactory(android.support.v7.widget.RecyclerView.EdgeEffectFactory);
+    method public void setHasFixedSize(boolean);
+    method public void setItemAnimator(android.support.v7.widget.RecyclerView.ItemAnimator);
+    method public void setItemViewCacheSize(int);
+    method public void setLayoutFrozen(boolean);
+    method public void setLayoutManager(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public void setOnFlingListener(android.support.v7.widget.RecyclerView.OnFlingListener);
+    method public deprecated void setOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
+    method public void setPreserveFocusAfterLayout(boolean);
+    method public void setRecycledViewPool(android.support.v7.widget.RecyclerView.RecycledViewPool);
+    method public void setRecyclerListener(android.support.v7.widget.RecyclerView.RecyclerListener);
+    method public void setScrollingTouchSlop(int);
+    method public void setViewCacheExtension(android.support.v7.widget.RecyclerView.ViewCacheExtension);
+    method public void smoothScrollBy(int, int);
+    method public void smoothScrollBy(int, int, android.view.animation.Interpolator);
+    method public void smoothScrollToPosition(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+    method public void stopScroll();
+    method public void swapAdapter(android.support.v7.widget.RecyclerView.Adapter, boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_TYPE = -1; // 0xffffffff
+    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
+    field public static final int NO_POSITION = -1; // 0xffffffff
+    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
+    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
+    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
+    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
+    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static abstract class RecyclerView.Adapter<VH extends android.support.v7.widget.RecyclerView.ViewHolder> {
+    ctor public RecyclerView.Adapter();
+    method public final void bindViewHolder(VH, int);
+    method public final VH createViewHolder(android.view.ViewGroup, int);
+    method public abstract int getItemCount();
+    method public long getItemId(int);
+    method public int getItemViewType(int);
+    method public final boolean hasObservers();
+    method public final boolean hasStableIds();
+    method public final void notifyDataSetChanged();
+    method public final void notifyItemChanged(int);
+    method public final void notifyItemChanged(int, java.lang.Object);
+    method public final void notifyItemInserted(int);
+    method public final void notifyItemMoved(int, int);
+    method public final void notifyItemRangeChanged(int, int);
+    method public final void notifyItemRangeChanged(int, int, java.lang.Object);
+    method public final void notifyItemRangeInserted(int, int);
+    method public final void notifyItemRangeRemoved(int, int);
+    method public final void notifyItemRemoved(int);
+    method public void onAttachedToRecyclerView(android.support.v7.widget.RecyclerView);
+    method public abstract void onBindViewHolder(VH, int);
+    method public void onBindViewHolder(VH, int, java.util.List<java.lang.Object>);
+    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onDetachedFromRecyclerView(android.support.v7.widget.RecyclerView);
+    method public boolean onFailedToRecycleView(VH);
+    method public void onViewAttachedToWindow(VH);
+    method public void onViewDetachedFromWindow(VH);
+    method public void onViewRecycled(VH);
+    method public void registerAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
+    method public void setHasStableIds(boolean);
+    method public void unregisterAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
+  }
+
+  public static abstract class RecyclerView.AdapterDataObserver {
+    ctor public RecyclerView.AdapterDataObserver();
+    method public void onChanged();
+    method public void onItemRangeChanged(int, int);
+    method public void onItemRangeChanged(int, int, java.lang.Object);
+    method public void onItemRangeInserted(int, int);
+    method public void onItemRangeMoved(int, int, int);
+    method public void onItemRangeRemoved(int, int);
+  }
+
+  public static abstract interface RecyclerView.ChildDrawingOrderCallback {
+    method public abstract int onGetChildDrawingOrder(int, int);
+  }
+
+  public static class RecyclerView.EdgeEffectFactory {
+    ctor public RecyclerView.EdgeEffectFactory();
+    method protected android.widget.EdgeEffect createEdgeEffect(android.support.v7.widget.RecyclerView, int);
+    field public static final int DIRECTION_BOTTOM = 3; // 0x3
+    field public static final int DIRECTION_LEFT = 0; // 0x0
+    field public static final int DIRECTION_RIGHT = 2; // 0x2
+    field public static final int DIRECTION_TOP = 1; // 0x1
+  }
+
+  public static abstract class RecyclerView.EdgeEffectFactory.EdgeDirection implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract class RecyclerView.ItemAnimator {
+    ctor public RecyclerView.ItemAnimator();
+    method public abstract boolean animateAppearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateDisappearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animatePersistence(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean canReuseUpdatedViewHolder(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public boolean canReuseUpdatedViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, java.util.List<java.lang.Object>);
+    method public final void dispatchAnimationFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationStarted(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationsFinished();
+    method public abstract void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public abstract void endAnimations();
+    method public long getAddDuration();
+    method public long getChangeDuration();
+    method public long getMoveDuration();
+    method public long getRemoveDuration();
+    method public abstract boolean isRunning();
+    method public final boolean isRunning(android.support.v7.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener);
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo obtainHolderInfo();
+    method public void onAnimationFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onAnimationStarted(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPostLayoutInformation(android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPreLayoutInformation(android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.ViewHolder, int, java.util.List<java.lang.Object>);
+    method public abstract void runPendingAnimations();
+    method public void setAddDuration(long);
+    method public void setChangeDuration(long);
+    method public void setMoveDuration(long);
+    method public void setRemoveDuration(long);
+    field public static final int FLAG_APPEARED_IN_PRE_LAYOUT = 4096; // 0x1000
+    field public static final int FLAG_CHANGED = 2; // 0x2
+    field public static final int FLAG_INVALIDATED = 4; // 0x4
+    field public static final int FLAG_MOVED = 2048; // 0x800
+    field public static final int FLAG_REMOVED = 8; // 0x8
+  }
+
+  public static abstract class RecyclerView.ItemAnimator.AdapterChanges implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
+    method public abstract void onAnimationsFinished();
+  }
+
+  public static class RecyclerView.ItemAnimator.ItemHolderInfo {
+    ctor public RecyclerView.ItemAnimator.ItemHolderInfo();
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(android.support.v7.widget.RecyclerView.ViewHolder, int);
+    field public int bottom;
+    field public int changeFlags;
+    field public int left;
+    field public int right;
+    field public int top;
+  }
+
+  public static abstract class RecyclerView.ItemDecoration {
+    ctor public RecyclerView.ItemDecoration();
+    method public deprecated void getItemOffsets(android.graphics.Rect, int, android.support.v7.widget.RecyclerView);
+    method public void getItemOffsets(android.graphics.Rect, android.view.View, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
+    method public void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
+    method public deprecated void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
+    method public void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
+    method public deprecated void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
+  }
+
+  public static abstract class RecyclerView.LayoutManager {
+    ctor public RecyclerView.LayoutManager();
+    method public void addDisappearingView(android.view.View);
+    method public void addDisappearingView(android.view.View, int);
+    method public void addView(android.view.View);
+    method public void addView(android.view.View, int);
+    method public void assertInLayoutOrScroll(java.lang.String);
+    method public void assertNotInLayoutOrScroll(java.lang.String);
+    method public void attachView(android.view.View, int, android.support.v7.widget.RecyclerView.LayoutParams);
+    method public void attachView(android.view.View, int);
+    method public void attachView(android.view.View);
+    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
+    method public boolean canScrollHorizontally();
+    method public boolean canScrollVertically();
+    method public boolean checkLayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
+    method public static int chooseSize(int, int, int);
+    method public void collectAdjacentPrefetchPositions(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
+    method public void collectInitialPrefetchPositions(int, android.support.v7.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
+    method public int computeHorizontalScrollExtent(android.support.v7.widget.RecyclerView.State);
+    method public int computeHorizontalScrollOffset(android.support.v7.widget.RecyclerView.State);
+    method public int computeHorizontalScrollRange(android.support.v7.widget.RecyclerView.State);
+    method public int computeVerticalScrollExtent(android.support.v7.widget.RecyclerView.State);
+    method public int computeVerticalScrollOffset(android.support.v7.widget.RecyclerView.State);
+    method public int computeVerticalScrollRange(android.support.v7.widget.RecyclerView.State);
+    method public void detachAndScrapAttachedViews(android.support.v7.widget.RecyclerView.Recycler);
+    method public void detachAndScrapView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
+    method public void detachAndScrapViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
+    method public void detachView(android.view.View);
+    method public void detachViewAt(int);
+    method public void endAnimation(android.view.View);
+    method public android.view.View findContainingItemView(android.view.View);
+    method public android.view.View findViewByPosition(int);
+    method public abstract android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.content.Context, android.util.AttributeSet);
+    method public int getBaseline();
+    method public int getBottomDecorationHeight(android.view.View);
+    method public android.view.View getChildAt(int);
+    method public int getChildCount();
+    method public static deprecated int getChildMeasureSpec(int, int, int, boolean);
+    method public static int getChildMeasureSpec(int, int, int, int, boolean);
+    method public boolean getClipToPadding();
+    method public int getColumnCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public int getDecoratedBottom(android.view.View);
+    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public int getDecoratedLeft(android.view.View);
+    method public int getDecoratedMeasuredHeight(android.view.View);
+    method public int getDecoratedMeasuredWidth(android.view.View);
+    method public int getDecoratedRight(android.view.View);
+    method public int getDecoratedTop(android.view.View);
+    method public android.view.View getFocusedChild();
+    method public int getHeight();
+    method public int getHeightMode();
+    method public int getItemCount();
+    method public int getItemViewType(android.view.View);
+    method public int getLayoutDirection();
+    method public int getLeftDecorationWidth(android.view.View);
+    method public int getMinimumHeight();
+    method public int getMinimumWidth();
+    method public int getPaddingBottom();
+    method public int getPaddingEnd();
+    method public int getPaddingLeft();
+    method public int getPaddingRight();
+    method public int getPaddingStart();
+    method public int getPaddingTop();
+    method public int getPosition(android.view.View);
+    method public static android.support.v7.widget.RecyclerView.LayoutManager.Properties getProperties(android.content.Context, android.util.AttributeSet, int, int);
+    method public int getRightDecorationWidth(android.view.View);
+    method public int getRowCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public int getSelectionModeForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public int getTopDecorationHeight(android.view.View);
+    method public void getTransformedBoundingBox(android.view.View, boolean, android.graphics.Rect);
+    method public int getWidth();
+    method public int getWidthMode();
+    method public boolean hasFocus();
+    method public void ignoreView(android.view.View);
+    method public boolean isAttachedToWindow();
+    method public boolean isAutoMeasureEnabled();
+    method public boolean isFocused();
+    method public final boolean isItemPrefetchEnabled();
+    method public boolean isLayoutHierarchical(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public boolean isMeasurementCacheEnabled();
+    method public boolean isSmoothScrolling();
+    method public boolean isViewPartiallyVisible(android.view.View, boolean, boolean);
+    method public void layoutDecorated(android.view.View, int, int, int, int);
+    method public void layoutDecoratedWithMargins(android.view.View, int, int, int, int);
+    method public void measureChild(android.view.View, int, int);
+    method public void measureChildWithMargins(android.view.View, int, int);
+    method public void moveView(int, int);
+    method public void offsetChildrenHorizontal(int);
+    method public void offsetChildrenVertical(int);
+    method public void onAdapterChanged(android.support.v7.widget.RecyclerView.Adapter, android.support.v7.widget.RecyclerView.Adapter);
+    method public boolean onAddFocusables(android.support.v7.widget.RecyclerView, java.util.ArrayList<android.view.View>, int, int);
+    method public void onAttachedToWindow(android.support.v7.widget.RecyclerView);
+    method public deprecated void onDetachedFromWindow(android.support.v7.widget.RecyclerView);
+    method public void onDetachedFromWindow(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.Recycler);
+    method public android.view.View onFocusSearchFailed(android.view.View, int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityEvent(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityNodeInfo(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onInitializeAccessibilityNodeInfoForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public android.view.View onInterceptFocusSearch(android.view.View, int);
+    method public void onItemsAdded(android.support.v7.widget.RecyclerView, int, int);
+    method public void onItemsChanged(android.support.v7.widget.RecyclerView);
+    method public void onItemsMoved(android.support.v7.widget.RecyclerView, int, int, int);
+    method public void onItemsRemoved(android.support.v7.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int, java.lang.Object);
+    method public void onLayoutChildren(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public void onLayoutCompleted(android.support.v7.widget.RecyclerView.State);
+    method public void onMeasure(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, int);
+    method public deprecated boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.view.View, android.view.View);
+    method public boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, android.view.View, android.view.View);
+    method public void onRestoreInstanceState(android.os.Parcelable);
+    method public android.os.Parcelable onSaveInstanceState();
+    method public void onScrollStateChanged(int);
+    method public boolean performAccessibilityAction(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, android.os.Bundle);
+    method public boolean performAccessibilityActionForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, int, android.os.Bundle);
+    method public void postOnAnimation(java.lang.Runnable);
+    method public void removeAllViews();
+    method public void removeAndRecycleAllViews(android.support.v7.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
+    method public boolean removeCallbacks(java.lang.Runnable);
+    method public void removeDetachedView(android.view.View);
+    method public void removeView(android.view.View);
+    method public void removeViewAt(int);
+    method public boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
+    method public boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, boolean);
+    method public void requestLayout();
+    method public void requestSimpleAnimationsInNextLayout();
+    method public int scrollHorizontallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public void scrollToPosition(int);
+    method public int scrollVerticallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public deprecated void setAutoMeasureEnabled(boolean);
+    method public final void setItemPrefetchEnabled(boolean);
+    method public void setMeasuredDimension(android.graphics.Rect, int, int);
+    method public void setMeasuredDimension(int, int);
+    method public void setMeasurementCacheEnabled(boolean);
+    method public void smoothScrollToPosition(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, int);
+    method public void startSmoothScroll(android.support.v7.widget.RecyclerView.SmoothScroller);
+    method public void stopIgnoringView(android.view.View);
+    method public boolean supportsPredictiveItemAnimations();
+  }
+
+  public static abstract interface RecyclerView.LayoutManager.LayoutPrefetchRegistry {
+    method public abstract void addPosition(int, int);
+  }
+
+  public static class RecyclerView.LayoutManager.Properties {
+    ctor public RecyclerView.LayoutManager.Properties();
+    field public int orientation;
+    field public boolean reverseLayout;
+    field public int spanCount;
+    field public boolean stackFromEnd;
+  }
+
+  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public RecyclerView.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public RecyclerView.LayoutParams(int, int);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public RecyclerView.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
+    method public int getViewAdapterPosition();
+    method public int getViewLayoutPosition();
+    method public deprecated int getViewPosition();
+    method public boolean isItemChanged();
+    method public boolean isItemRemoved();
+    method public boolean isViewInvalid();
+    method public boolean viewNeedsUpdate();
+  }
+
+  public static abstract interface RecyclerView.OnChildAttachStateChangeListener {
+    method public abstract void onChildViewAttachedToWindow(android.view.View);
+    method public abstract void onChildViewDetachedFromWindow(android.view.View);
+  }
+
+  public static abstract class RecyclerView.OnFlingListener {
+    ctor public RecyclerView.OnFlingListener();
+    method public abstract boolean onFling(int, int);
+  }
+
+  public static abstract interface RecyclerView.OnItemTouchListener {
+    method public abstract boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
+    method public abstract void onRequestDisallowInterceptTouchEvent(boolean);
+    method public abstract void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public static abstract class RecyclerView.OnScrollListener {
+    ctor public RecyclerView.OnScrollListener();
+    method public void onScrollStateChanged(android.support.v7.widget.RecyclerView, int);
+    method public void onScrolled(android.support.v7.widget.RecyclerView, int, int);
+  }
+
+  public static class RecyclerView.RecycledViewPool {
+    ctor public RecyclerView.RecycledViewPool();
+    method public void clear();
+    method public android.support.v7.widget.RecyclerView.ViewHolder getRecycledView(int);
+    method public int getRecycledViewCount(int);
+    method public void putRecycledView(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void setMaxRecycledViews(int, int);
+  }
+
+  public final class RecyclerView.Recycler {
+    ctor public RecyclerView.Recycler();
+    method public void bindViewToPosition(android.view.View, int);
+    method public void clear();
+    method public int convertPreLayoutPositionToPostLayout(int);
+    method public java.util.List<android.support.v7.widget.RecyclerView.ViewHolder> getScrapList();
+    method public android.view.View getViewForPosition(int);
+    method public void recycleView(android.view.View);
+    method public void setViewCacheSize(int);
+  }
+
+  public static abstract interface RecyclerView.RecyclerListener {
+    method public abstract void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
+  }
+
+  public static class RecyclerView.SimpleOnItemTouchListener implements android.support.v7.widget.RecyclerView.OnItemTouchListener {
+    ctor public RecyclerView.SimpleOnItemTouchListener();
+    method public boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
+    method public void onRequestDisallowInterceptTouchEvent(boolean);
+    method public void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public static abstract class RecyclerView.SmoothScroller {
+    ctor public RecyclerView.SmoothScroller();
+    method public android.view.View findViewByPosition(int);
+    method public int getChildCount();
+    method public int getChildPosition(android.view.View);
+    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
+    method public int getTargetPosition();
+    method public deprecated void instantScrollToPosition(int);
+    method public boolean isPendingInitialRun();
+    method public boolean isRunning();
+    method protected void normalize(android.graphics.PointF);
+    method protected void onChildAttachedToWindow(android.view.View);
+    method protected abstract void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    method protected abstract void onStart();
+    method protected abstract void onStop();
+    method protected abstract void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    method public void setTargetPosition(int);
+    method protected final void stop();
+  }
+
+  public static class RecyclerView.SmoothScroller.Action {
+    ctor public RecyclerView.SmoothScroller.Action(int, int);
+    ctor public RecyclerView.SmoothScroller.Action(int, int, int);
+    ctor public RecyclerView.SmoothScroller.Action(int, int, int, android.view.animation.Interpolator);
+    method public int getDuration();
+    method public int getDx();
+    method public int getDy();
+    method public android.view.animation.Interpolator getInterpolator();
+    method public void jumpTo(int);
+    method public void setDuration(int);
+    method public void setDx(int);
+    method public void setDy(int);
+    method public void setInterpolator(android.view.animation.Interpolator);
+    method public void update(int, int, int, android.view.animation.Interpolator);
+    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
+  }
+
+  public static abstract interface RecyclerView.SmoothScroller.ScrollVectorProvider {
+    method public abstract android.graphics.PointF computeScrollVectorForPosition(int);
+  }
+
+  public static class RecyclerView.State {
+    ctor public RecyclerView.State();
+    method public boolean didStructureChange();
+    method public <T> T get(int);
+    method public int getItemCount();
+    method public int getRemainingScrollHorizontal();
+    method public int getRemainingScrollVertical();
+    method public int getTargetScrollPosition();
+    method public boolean hasTargetScrollPosition();
+    method public boolean isMeasuring();
+    method public boolean isPreLayout();
+    method public void put(int, java.lang.Object);
+    method public void remove(int);
+    method public boolean willRunPredictiveAnimations();
+    method public boolean willRunSimpleAnimations();
+  }
+
+  public static abstract class RecyclerView.ViewCacheExtension {
+    ctor public RecyclerView.ViewCacheExtension();
+    method public abstract android.view.View getViewForPositionAndType(android.support.v7.widget.RecyclerView.Recycler, int, int);
+  }
+
+  public static abstract class RecyclerView.ViewHolder {
+    ctor public RecyclerView.ViewHolder(android.view.View);
+    method public final int getAdapterPosition();
+    method public final long getItemId();
+    method public final int getItemViewType();
+    method public final int getLayoutPosition();
+    method public final int getOldPosition();
+    method public final deprecated int getPosition();
+    method public final boolean isRecyclable();
+    method public final void setIsRecyclable(boolean);
+    field public final android.view.View itemView;
+  }
+
+  public class RecyclerViewAccessibilityDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate(android.support.v7.widget.RecyclerView);
+    method public android.support.v4.view.AccessibilityDelegateCompat getItemDelegate();
+  }
+
+  public static class RecyclerViewAccessibilityDelegate.ItemDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate.ItemDelegate(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
+  }
+
+  public abstract class SimpleItemAnimator extends android.support.v7.widget.RecyclerView.ItemAnimator {
+    ctor public SimpleItemAnimator();
+    method public abstract boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public boolean animateAppearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public boolean animateDisappearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public boolean animatePersistence(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
+    method public final void dispatchChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
+    method public final void dispatchMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public boolean getSupportsChangeAnimations();
+    method public void onAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
+    method public void onChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
+    method public void onMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void setSupportsChangeAnimations(boolean);
+  }
+
+  public abstract class SnapHelper extends android.support.v7.widget.RecyclerView.OnFlingListener {
+    ctor public SnapHelper();
+    method public void attachToRecyclerView(android.support.v7.widget.RecyclerView) throws java.lang.IllegalStateException;
+    method public abstract int[] calculateDistanceToFinalSnap(android.support.v7.widget.RecyclerView.LayoutManager, android.view.View);
+    method public int[] calculateScrollDistance(int, int);
+    method protected android.support.v7.widget.RecyclerView.SmoothScroller createScroller(android.support.v7.widget.RecyclerView.LayoutManager);
+    method protected deprecated android.support.v7.widget.LinearSmoothScroller createSnapScroller(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public abstract android.view.View findSnapView(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public abstract int findTargetSnapPosition(android.support.v7.widget.RecyclerView.LayoutManager, int, int);
+    method public boolean onFling(int, int);
+  }
+
+  public class StaggeredGridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager implements android.support.v7.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    ctor public StaggeredGridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public StaggeredGridLayoutManager(int, int);
+    method public android.graphics.PointF computeScrollVectorForPosition(int);
+    method public int[] findFirstCompletelyVisibleItemPositions(int[]);
+    method public int[] findFirstVisibleItemPositions(int[]);
+    method public int[] findLastCompletelyVisibleItemPositions(int[]);
+    method public int[] findLastVisibleItemPositions(int[]);
+    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public int getGapStrategy();
+    method public int getOrientation();
+    method public boolean getReverseLayout();
+    method public int getSpanCount();
+    method public void invalidateSpanAssignments();
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setGapStrategy(int);
+    method public void setOrientation(int);
+    method public void setReverseLayout(boolean);
+    method public void setSpanCount(int);
+    field public static final deprecated int GAP_HANDLING_LAZY = 1; // 0x1
+    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
+    field public static final int GAP_HANDLING_NONE = 0; // 0x0
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static class StaggeredGridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
+    method public final int getSpanIndex();
+    method public boolean isFullSpan();
+    method public void setFullSpan(boolean);
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+}
+
+package android.support.v7.widget.helper {
+
+  public class ItemTouchHelper extends android.support.v7.widget.RecyclerView.ItemDecoration implements android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener {
+    ctor public ItemTouchHelper(android.support.v7.widget.helper.ItemTouchHelper.Callback);
+    method public void attachToRecyclerView(android.support.v7.widget.RecyclerView);
+    method public void onChildViewAttachedToWindow(android.view.View);
+    method public void onChildViewDetachedFromWindow(android.view.View);
+    method public void startDrag(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void startSwipe(android.support.v7.widget.RecyclerView.ViewHolder);
+    field public static final int ACTION_STATE_DRAG = 2; // 0x2
+    field public static final int ACTION_STATE_IDLE = 0; // 0x0
+    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
+    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
+    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
+    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
+    field public static final int DOWN = 2; // 0x2
+    field public static final int END = 32; // 0x20
+    field public static final int LEFT = 4; // 0x4
+    field public static final int RIGHT = 8; // 0x8
+    field public static final int START = 16; // 0x10
+    field public static final int UP = 1; // 0x1
+  }
+
+  public static abstract class ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.Callback();
+    method public boolean canDropOver(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public android.support.v7.widget.RecyclerView.ViewHolder chooseDropTarget(android.support.v7.widget.RecyclerView.ViewHolder, java.util.List<android.support.v7.widget.RecyclerView.ViewHolder>, int, int);
+    method public void clearView(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public int convertToAbsoluteDirection(int, int);
+    method public static int convertToRelativeDirection(int, int);
+    method public long getAnimationDuration(android.support.v7.widget.RecyclerView, int, float, float);
+    method public int getBoundingBoxMargin();
+    method public static android.support.v7.widget.helper.ItemTouchUIUtil getDefaultUIUtil();
+    method public float getMoveThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public abstract int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public float getSwipeEscapeVelocity(float);
+    method public float getSwipeThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public float getSwipeVelocityThreshold(float);
+    method public int interpolateOutOfBoundsScroll(android.support.v7.widget.RecyclerView, int, int, int, long);
+    method public boolean isItemViewSwipeEnabled();
+    method public boolean isLongPressDragEnabled();
+    method public static int makeFlag(int, int);
+    method public static int makeMovementFlags(int, int);
+    method public void onChildDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public void onChildDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public abstract boolean onMove(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onMoved(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int);
+    method public void onSelectedChanged(android.support.v7.widget.RecyclerView.ViewHolder, int);
+    method public abstract void onSwiped(android.support.v7.widget.RecyclerView.ViewHolder, int);
+    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
+    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
+  }
+
+  public static abstract class ItemTouchHelper.SimpleCallback extends android.support.v7.widget.helper.ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.SimpleCallback(int, int);
+    method public int getDragDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public int getSwipeDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void setDefaultDragDirs(int);
+    method public void setDefaultSwipeDirs(int);
+  }
+
+  public static abstract interface ItemTouchHelper.ViewDropHandler {
+    method public abstract void prepareForDrop(android.view.View, android.view.View, int, int);
+  }
+
+  public abstract interface ItemTouchUIUtil {
+    method public abstract void clearView(android.view.View);
+    method public abstract void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
+    method public abstract void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
+    method public abstract void onSelected(android.view.View);
+  }
+
+}
+
+package android.support.v7.widget.util {
+
+  public abstract class SortedListAdapterCallback<T2> extends android.support.v7.util.SortedList.Callback {
+    ctor public SortedListAdapterCallback(android.support.v7.widget.RecyclerView.Adapter);
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+}
+
diff --git a/v7/recyclerview/src/main/java/android/support/v7/widget/FastScroller.java b/v7/recyclerview/src/main/java/android/support/v7/widget/FastScroller.java
index fbe234b..b383c2a 100644
--- a/v7/recyclerview/src/main/java/android/support/v7/widget/FastScroller.java
+++ b/v7/recyclerview/src/main/java/android/support/v7/widget/FastScroller.java
@@ -24,6 +24,7 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.StateListDrawable;
 import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
 import android.support.v4.view.ViewCompat;
@@ -379,7 +380,8 @@
     }
 
     @Override
-    public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent ev) {
+    public boolean onInterceptTouchEvent(@NonNull RecyclerView recyclerView,
+            @NonNull MotionEvent ev) {
         final boolean handled;
         if (mState == STATE_VISIBLE) {
             boolean insideVerticalThumb = isPointInsideVerticalThumb(ev.getX(), ev.getY());
@@ -408,7 +410,7 @@
     }
 
     @Override
-    public void onTouchEvent(RecyclerView recyclerView, MotionEvent me) {
+    public void onTouchEvent(@NonNull RecyclerView recyclerView, @NonNull MotionEvent me) {
         if (mState == STATE_HIDDEN) {
             return;
         }
diff --git a/v7/recyclerview/src/main/java/android/support/v7/widget/LinearLayoutManager.java b/v7/recyclerview/src/main/java/android/support/v7/widget/LinearLayoutManager.java
index 359229a..70510f6 100644
--- a/v7/recyclerview/src/main/java/android/support/v7/widget/LinearLayoutManager.java
+++ b/v7/recyclerview/src/main/java/android/support/v7/widget/LinearLayoutManager.java
@@ -24,6 +24,7 @@
 import android.graphics.PointF;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.support.annotation.NonNull;
 import android.support.annotation.RestrictTo;
 import android.support.v4.os.TraceCompat;
 import android.support.v4.view.ViewCompat;
@@ -2092,7 +2093,7 @@
      */
     @RestrictTo(LIBRARY_GROUP)
     @Override
-    public void prepareForDrop(View view, View target, int x, int y) {
+    public void prepareForDrop(@NonNull View view, @NonNull View target, int x, int y) {
         assertNotInLayoutOrScroll("Cannot drop a view during a scroll or layout calculation");
         ensureLayoutState();
         resolveShouldLayoutReverse();
diff --git a/v7/recyclerview/src/main/java/android/support/v7/widget/RecyclerView.java b/v7/recyclerview/src/main/java/android/support/v7/widget/RecyclerView.java
index 991abb9..481444d 100644
--- a/v7/recyclerview/src/main/java/android/support/v7/widget/RecyclerView.java
+++ b/v7/recyclerview/src/main/java/android/support/v7/widget/RecyclerView.java
@@ -6140,7 +6140,7 @@
          * @param holder Holder to be added to the pool.
          * @param dispatchRecycled True to dispatch View recycled callbacks.
          */
-        void addViewHolderToRecycledViewPool(ViewHolder holder, boolean dispatchRecycled) {
+        void addViewHolderToRecycledViewPool(@NonNull ViewHolder holder, boolean dispatchRecycled) {
             clearNestedRecyclerViewIfNotNested(holder);
             if (holder.hasAnyOfTheFlags(ViewHolder.FLAG_SET_A11Y_ITEM_DELEGATE)) {
                 holder.setFlags(0, ViewHolder.FLAG_SET_A11Y_ITEM_DELEGATE);
@@ -6371,7 +6371,7 @@
             return null;
         }
 
-        void dispatchViewRecycled(ViewHolder holder) {
+        void dispatchViewRecycled(@NonNull ViewHolder holder) {
             if (mRecyclerListener != null) {
                 mRecyclerListener.onViewRecycled(holder);
             }
@@ -10188,7 +10188,7 @@
             if (vScroll == 0 && hScroll == 0) {
                 return false;
             }
-            mRecyclerView.scrollBy(hScroll, vScroll);
+            mRecyclerView.smoothScrollBy(hScroll, vScroll);
             return true;
         }
 
@@ -10406,7 +10406,7 @@
          *         to continue with the current behavior and continue observing future events in
          *         the gesture.
          */
-        boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e);
+        boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
 
         /**
          * Process a touch event as part of a gesture that was claimed by returning true from
@@ -10415,7 +10415,7 @@
          * @param e MotionEvent describing the touch event. All coordinates are in
          *          the RecyclerView's coordinate system.
          */
-        void onTouchEvent(RecyclerView rv, MotionEvent e);
+        void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
 
         /**
          * Called when a child of RecyclerView does not want RecyclerView and its ancestors to
@@ -10440,12 +10440,12 @@
      */
     public static class SimpleOnItemTouchListener implements RecyclerView.OnItemTouchListener {
         @Override
-        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
+        public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
             return false;
         }
 
         @Override
-        public void onTouchEvent(RecyclerView rv, MotionEvent e) {
+        public void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
         }
 
         @Override
@@ -10504,7 +10504,7 @@
          *
          * @param holder The ViewHolder containing the view that was recycled
          */
-        void onViewRecycled(ViewHolder holder);
+        void onViewRecycled(@NonNull ViewHolder holder);
     }
 
     /**
@@ -10518,14 +10518,14 @@
          *
          * @param view The View which is attached to the RecyclerView
          */
-        void onChildViewAttachedToWindow(View view);
+        void onChildViewAttachedToWindow(@NonNull View view);
 
         /**
          * Called when a view is detached from RecyclerView.
          *
          * @param view The View which is being detached from the RecyclerView
          */
-        void onChildViewDetachedFromWindow(View view);
+        void onChildViewDetachedFromWindow(@NonNull View view);
     }
 
     /**
@@ -10542,6 +10542,7 @@
      * strong references to extra off-screen item views for caching purposes</p>
      */
     public abstract static class ViewHolder {
+        @NonNull
         public final View itemView;
         WeakReference<RecyclerView> mNestedRecyclerView;
         int mPosition = NO_POSITION;
diff --git a/v7/recyclerview/src/main/java/android/support/v7/widget/helper/ItemTouchHelper.java b/v7/recyclerview/src/main/java/android/support/v7/widget/helper/ItemTouchHelper.java
index d2b6a20..578805d 100644
--- a/v7/recyclerview/src/main/java/android/support/v7/widget/helper/ItemTouchHelper.java
+++ b/v7/recyclerview/src/main/java/android/support/v7/widget/helper/ItemTouchHelper.java
@@ -22,6 +22,7 @@
 import android.graphics.Canvas;
 import android.graphics.Rect;
 import android.os.Build;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.view.GestureDetectorCompat;
 import android.support.v4.view.ViewCompat;
@@ -112,34 +113,39 @@
     /**
      * A View is currently being swiped.
      */
+    @SuppressWarnings("WeakerAccess")
     public static final int ACTION_STATE_SWIPE = 1;
 
     /**
      * A View is currently being dragged.
      */
+    @SuppressWarnings("WeakerAccess")
     public static final int ACTION_STATE_DRAG = 2;
 
     /**
      * Animation type for views which are swiped successfully.
      */
+    @SuppressWarnings("WeakerAccess")
     public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 1 << 1;
 
     /**
      * Animation type for views which are not completely swiped thus will animate back to their
      * original position.
      */
+    @SuppressWarnings("WeakerAccess")
     public static final int ANIMATION_TYPE_SWIPE_CANCEL = 1 << 2;
 
     /**
      * Animation type for views that were dragged and now will animate to their final position.
      */
+    @SuppressWarnings("WeakerAccess")
     public static final int ANIMATION_TYPE_DRAG = 1 << 3;
 
-    static final String TAG = "ItemTouchHelper";
+    private static final String TAG = "ItemTouchHelper";
 
-    static final boolean DEBUG = false;
+    private static final boolean DEBUG = false;
 
-    static final int ACTIVE_POINTER_ID_NONE = -1;
+    private static final int ACTIVE_POINTER_ID_NONE = -1;
 
     static final int DIRECTION_FLAG_COUNT = 8;
 
@@ -159,7 +165,7 @@
      * This is necessary after swipe dismissing an item. We wait until animator finishes its job
      * to clean these views.
      */
-    final List<View> mPendingCleanup = new ArrayList<View>();
+    final List<View> mPendingCleanup = new ArrayList<>();
 
     /**
      * Re-use array to calculate dx dy for a ViewHolder
@@ -169,63 +175,64 @@
     /**
      * Currently selected view holder
      */
-    ViewHolder mSelected = null;
+    private ViewHolder mSelected = null;
 
     /**
      * The reference coordinates for the action start. For drag & drop, this is the time long
      * press is completed vs for swipe, this is the initial touch point.
      */
-    float mInitialTouchX;
+    private float mInitialTouchX;
 
-    float mInitialTouchY;
+    private float mInitialTouchY;
 
     /**
      * Set when ItemTouchHelper is assigned to a RecyclerView.
      */
-    float mSwipeEscapeVelocity;
+    private float mSwipeEscapeVelocity;
 
     /**
      * Set when ItemTouchHelper is assigned to a RecyclerView.
      */
-    float mMaxSwipeVelocity;
+    private float mMaxSwipeVelocity;
 
     /**
      * The diff between the last event and initial touch.
      */
-    float mDx;
+    private float mDx;
 
-    float mDy;
+    private float mDy;
 
     /**
      * The coordinates of the selected view at the time it is selected. We record these values
      * when action starts so that we can consistently position it even if LayoutManager moves the
      * View.
      */
-    float mSelectedStartX;
+    private float mSelectedStartX;
 
-    float mSelectedStartY;
+    private float mSelectedStartY;
 
     /**
      * The pointer we are tracking.
      */
-    int mActivePointerId = ACTIVE_POINTER_ID_NONE;
+    private int mActivePointerId = ACTIVE_POINTER_ID_NONE;
 
     /**
      * Developer callback which controls the behavior of ItemTouchHelper.
      */
-    Callback mCallback;
+    @NonNull
+    private Callback mCallback;
 
     /**
      * Current mode.
      */
-    int mActionState = ACTION_STATE_IDLE;
+    private int mActionState = ACTION_STATE_IDLE;
 
     /**
      * The direction flags obtained from unmasking
      * {@link Callback#getAbsoluteMovementFlags(RecyclerView, ViewHolder)} for the current
      * action state.
      */
-    int mSelectedFlags;
+    private int mSelectedFlags;
 
     /**
      * When a View is dragged or swiped and needs to go back to where it was, we create a Recover
@@ -234,17 +241,17 @@
      * Using framework animators has the side effect of clashing with ItemAnimator, creating
      * jumpy UIs.
      */
-    List<RecoverAnimation> mRecoverAnimations = new ArrayList<RecoverAnimation>();
+    List<RecoverAnimation> mRecoverAnimations = new ArrayList<>();
 
     private int mSlop;
 
-    RecyclerView mRecyclerView;
+    private RecyclerView mRecyclerView;
 
     /**
      * When user drags a view to the edge, we start scrolling the LayoutManager as long as View
      * is partially out of bounds.
      */
-    final Runnable mScrollRunnable = new Runnable() {
+    private final Runnable mScrollRunnable = new Runnable() {
         @Override
         public void run() {
             if (mSelected != null && scrollIfNecessary()) {
@@ -260,7 +267,7 @@
     /**
      * Used for detecting fling swipe
      */
-    VelocityTracker mVelocityTracker;
+    private VelocityTracker mVelocityTracker;
 
     //re-used list for selecting a swap target
     private List<ViewHolder> mSwapTargets;
@@ -278,19 +285,19 @@
      * until view reaches its final position (end of recover animation), we keep a reference so
      * that it can be drawn above other children.
      */
-    View mOverdrawChild = null;
+    private View mOverdrawChild = null;
 
     /**
      * We cache the position of the overdraw child to avoid recalculating it each time child
      * position callback is called. This value is invalidated whenever a child is attached or
      * detached.
      */
-    int mOverdrawChildPosition = -1;
+    private int mOverdrawChildPosition = -1;
 
     /**
      * Used to detect long press.
      */
-    GestureDetectorCompat mGestureDetector;
+    private GestureDetectorCompat mGestureDetector;
 
     /**
      * Callback for when long press occurs.
@@ -299,7 +306,8 @@
 
     private final OnItemTouchListener mOnItemTouchListener = new OnItemTouchListener() {
         @Override
-        public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent event) {
+        public boolean onInterceptTouchEvent(@NonNull RecyclerView recyclerView,
+                @NonNull MotionEvent event) {
             mGestureDetector.onTouchEvent(event);
             if (DEBUG) {
                 Log.d(TAG, "intercept: x:" + event.getX() + ",y:" + event.getY() + ", " + event);
@@ -344,7 +352,7 @@
         }
 
         @Override
-        public void onTouchEvent(RecyclerView recyclerView, MotionEvent event) {
+        public void onTouchEvent(@NonNull RecyclerView recyclerView, @NonNull MotionEvent event) {
             mGestureDetector.onTouchEvent(event);
             if (DEBUG) {
                 Log.d(TAG,
@@ -429,7 +437,7 @@
      *
      * @param callback The Callback which controls the behavior of this touch helper.
      */
-    public ItemTouchHelper(Callback callback) {
+    public ItemTouchHelper(@NonNull Callback callback) {
         mCallback = callback;
     }
 
@@ -552,10 +560,10 @@
      * Starts dragging or swiping the given View. Call with null if you want to clear it.
      *
      * @param selected    The ViewHolder to drag or swipe. Can be null if you want to cancel the
-     *                    current action
+     *                    current action, but may not be null if actionState is ACTION_STATE_DRAG.
      * @param actionState The type of action
      */
-    void select(ViewHolder selected, int actionState) {
+    private void select(@Nullable ViewHolder selected, int actionState) {
         if (selected == mSelected && actionState == mActionState) {
             return;
         }
@@ -565,6 +573,10 @@
         endRecoverAnimation(selected, true);
         mActionState = actionState;
         if (actionState == ACTION_STATE_DRAG) {
+            if (selected == null) {
+                throw new IllegalArgumentException("Must pass a ViewHolder when dragging");
+            }
+
             // we remove after animation is complete. this means we only elevate the last drag
             // child but that should perform good enough as it is very hard to start dragging a
             // new child before the previous one settles.
@@ -675,7 +687,7 @@
         mRecyclerView.invalidate();
     }
 
-    void postDispatchSwipe(final RecoverAnimation anim, final int swipeDir) {
+    private void postDispatchSwipe(final RecoverAnimation anim, final int swipeDir) {
         // wait until animations are complete.
         mRecyclerView.post(new Runnable() {
             @Override
@@ -698,7 +710,7 @@
         });
     }
 
-    boolean hasRunningRecoverAnim() {
+    private boolean hasRunningRecoverAnim() {
         final int size = mRecoverAnimations.size();
         for (int i = 0; i < size; i++) {
             if (!mRecoverAnimations.get(i).mEnded) {
@@ -711,7 +723,7 @@
     /**
      * If user drags the view to the edge, trigger a scroll if necessary.
      */
-    boolean scrollIfNecessary() {
+    private boolean scrollIfNecessary() {
         if (mSelected == null) {
             mDragScrollStartTimeInMs = Long.MIN_VALUE;
             return false;
@@ -776,8 +788,8 @@
 
     private List<ViewHolder> findSwapTargets(ViewHolder viewHolder) {
         if (mSwapTargets == null) {
-            mSwapTargets = new ArrayList<ViewHolder>();
-            mDistances = new ArrayList<Integer>();
+            mSwapTargets = new ArrayList<>();
+            mDistances = new ArrayList<>();
         } else {
             mSwapTargets.clear();
             mDistances.clear();
@@ -826,7 +838,7 @@
     /**
      * Checks if we should swap w/ another view holder.
      */
-    void moveIfNecessary(ViewHolder viewHolder) {
+    private void moveIfNecessary(ViewHolder viewHolder) {
         if (mRecyclerView.isLayoutRequested()) {
             return;
         }
@@ -863,11 +875,11 @@
     }
 
     @Override
-    public void onChildViewAttachedToWindow(View view) {
+    public void onChildViewAttachedToWindow(@NonNull View view) {
     }
 
     @Override
-    public void onChildViewDetachedFromWindow(View view) {
+    public void onChildViewDetachedFromWindow(@NonNull View view) {
         removeChildDrawingOrderCallbackIfNecessary(view);
         final ViewHolder holder = mRecyclerView.getChildViewHolder(view);
         if (holder == null) {
@@ -886,7 +898,7 @@
     /**
      * Returns the animation type or 0 if cannot be found.
      */
-    int endRecoverAnimation(ViewHolder viewHolder, boolean override) {
+    private void endRecoverAnimation(ViewHolder viewHolder, boolean override) {
         final int recoverAnimSize = mRecoverAnimations.size();
         for (int i = recoverAnimSize - 1; i >= 0; i--) {
             final RecoverAnimation anim = mRecoverAnimations.get(i);
@@ -896,10 +908,9 @@
                     anim.cancel();
                 }
                 mRecoverAnimations.remove(i);
-                return anim.mAnimationType;
+                return;
             }
         }
-        return 0;
     }
 
     @Override
@@ -908,7 +919,7 @@
         outRect.setEmpty();
     }
 
-    void obtainVelocityTracker() {
+    private void obtainVelocityTracker() {
         if (mVelocityTracker != null) {
             mVelocityTracker.recycle();
         }
@@ -951,17 +962,17 @@
     /**
      * Checks whether we should select a View for swiping.
      */
-    boolean checkSelectForSwipe(int action, MotionEvent motionEvent, int pointerIndex) {
+    private void checkSelectForSwipe(int action, MotionEvent motionEvent, int pointerIndex) {
         if (mSelected != null || action != MotionEvent.ACTION_MOVE
                 || mActionState == ACTION_STATE_DRAG || !mCallback.isItemViewSwipeEnabled()) {
-            return false;
+            return;
         }
         if (mRecyclerView.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING) {
-            return false;
+            return;
         }
         final ViewHolder vh = findSwipedView(motionEvent);
         if (vh == null) {
-            return false;
+            return;
         }
         final int movementFlags = mCallback.getAbsoluteMovementFlags(mRecyclerView, vh);
 
@@ -969,7 +980,7 @@
                 >> (DIRECTION_FLAG_COUNT * ACTION_STATE_SWIPE);
 
         if (swipeFlags == 0) {
-            return false;
+            return;
         }
 
         // mDx and mDy are only set in allowed directions. We use custom x/y here instead of
@@ -986,30 +997,29 @@
         final float absDy = Math.abs(dy);
 
         if (absDx < mSlop && absDy < mSlop) {
-            return false;
+            return;
         }
         if (absDx > absDy) {
             if (dx < 0 && (swipeFlags & LEFT) == 0) {
-                return false;
+                return;
             }
             if (dx > 0 && (swipeFlags & RIGHT) == 0) {
-                return false;
+                return;
             }
         } else {
             if (dy < 0 && (swipeFlags & UP) == 0) {
-                return false;
+                return;
             }
             if (dy > 0 && (swipeFlags & DOWN) == 0) {
-                return false;
+                return;
             }
         }
         mDx = mDy = 0f;
         mActivePointerId = motionEvent.getPointerId(0);
         select(vh, ACTION_STATE_SWIPE);
-        return true;
     }
 
-    View findChildView(MotionEvent event) {
+    private View findChildView(MotionEvent event) {
         // first check elevated views, if none, then call RV
         final float x = event.getX();
         final float y = event.getY();
@@ -1063,7 +1073,7 @@
      *                   RecyclerView.
      * @see ItemTouchHelper.Callback#isItemViewSwipeEnabled()
      */
-    public void startDrag(ViewHolder viewHolder) {
+    public void startDrag(@NonNull ViewHolder viewHolder) {
         if (!mCallback.hasDragFlag(mRecyclerView, viewHolder)) {
             Log.e(TAG, "Start drag has been called but dragging is not enabled");
             return;
@@ -1110,7 +1120,7 @@
      * @param viewHolder The ViewHolder to start swiping. It must be a direct child of
      *                   RecyclerView.
      */
-    public void startSwipe(ViewHolder viewHolder) {
+    public void startSwipe(@NonNull ViewHolder viewHolder) {
         if (!mCallback.hasSwipeFlag(mRecyclerView, viewHolder)) {
             Log.e(TAG, "Start swipe has been called but swiping is not enabled");
             return;
@@ -1125,7 +1135,7 @@
         select(viewHolder, ACTION_STATE_SWIPE);
     }
 
-    RecoverAnimation findAnimation(MotionEvent event) {
+    private RecoverAnimation findAnimation(MotionEvent event) {
         if (mRecoverAnimations.isEmpty()) {
             return null;
         }
@@ -1139,7 +1149,7 @@
         return null;
     }
 
-    void updateDxDy(MotionEvent ev, int directionFlags, int pointerIndex) {
+    private void updateDxDy(MotionEvent ev, int directionFlags, int pointerIndex) {
         final float x = ev.getX(pointerIndex);
         final float y = ev.getY(pointerIndex);
 
@@ -1285,7 +1295,7 @@
         mRecyclerView.setChildDrawingOrderCallback(mChildDrawingOrderCallback);
     }
 
-    void removeChildDrawingOrderCallbackIfNecessary(View view) {
+    private void removeChildDrawingOrderCallbackIfNecessary(View view) {
         if (view == mOverdrawChild) {
             mOverdrawChild = null;
             // only remove if we've added
@@ -1312,15 +1322,15 @@
          * making layout stay consistent.
          *
          * @param view   The View which is being dragged. It is very likely that user is still
-         *               dragging this View so there might be other
-         *               {@link #prepareForDrop(View, View, int, int)} after this one.
+         *               dragging this View so there might be other calls to
+         *               {@code prepareForDrop()} after this one.
          * @param target The target view which is being dropped on.
          * @param x      The <code>left</code> offset of the View that is being dragged. This value
          *               includes the movement caused by the user.
          * @param y      The <code>top</code> offset of the View that is being dragged. This value
          *               includes the movement caused by the user.
          */
-        void prepareForDrop(View view, View target, int x, int y);
+        void prepareForDrop(@NonNull View view, @NonNull View target, int x, int y);
     }
 
     /**
@@ -1356,8 +1366,10 @@
     @SuppressWarnings("UnusedParameters")
     public abstract static class Callback {
 
+        @SuppressWarnings("WeakerAccess")
         public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200;
 
+        @SuppressWarnings("WeakerAccess")
         public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250;
 
         static final int RELATIVE_DIR_FLAGS = START | END
@@ -1440,6 +1452,8 @@
          *
          * @return The {@link ItemTouchUIUtil} instance that is used by the {@link Callback}
          */
+        @SuppressWarnings("WeakerAccess")
+        @NonNull
         public static ItemTouchUIUtil getDefaultUIUtil() {
             return sUICallback;
         }
@@ -1455,6 +1469,7 @@
          * of {@link #LEFT}, {@link #RIGHT}.
          * @see #convertToAbsoluteDirection(int, int)
          */
+        @SuppressWarnings("WeakerAccess")
         public static int convertToRelativeDirection(int flags, int layoutDirection) {
             int masked = flags & ABS_HORIZONTAL_DIR_FLAGS;
             if (masked == 0) {
@@ -1501,6 +1516,7 @@
          *                    {@link #RIGHT}, {@link #LEFT} {@link #START} and {@link #END}.
          * @return And integer that represents the given directions in the provided actionState.
          */
+        @SuppressWarnings("WeakerAccess")
         public static int makeFlag(int actionState, int directions) {
             return directions << (actionState * DIRECTION_FLAG_COUNT);
         }
@@ -1532,8 +1548,8 @@
          * @see #makeMovementFlags(int, int)
          * @see #makeFlag(int, int)
          */
-        public abstract int getMovementFlags(RecyclerView recyclerView,
-                ViewHolder viewHolder);
+        public abstract int getMovementFlags(@NonNull RecyclerView recyclerView,
+                @NonNull ViewHolder viewHolder);
 
         /**
          * Converts a given set of flags to absolution direction which means {@link #START} and
@@ -1544,6 +1560,7 @@
          * @param layoutDirection The layout direction of the RecyclerView.
          * @return Updated flags which includes only absolute direction values.
          */
+        @SuppressWarnings("WeakerAccess")
         public int convertToAbsoluteDirection(int flags, int layoutDirection) {
             int masked = flags & RELATIVE_DIR_FLAGS;
             if (masked == 0) {
@@ -1595,8 +1612,9 @@
          * @return True if the dragged ViewHolder can be replaced with the target ViewHolder, false
          * otherwise.
          */
-        public boolean canDropOver(RecyclerView recyclerView, ViewHolder current,
-                ViewHolder target) {
+        @SuppressWarnings("WeakerAccess")
+        public boolean canDropOver(@NonNull RecyclerView recyclerView, @NonNull ViewHolder current,
+                @NonNull ViewHolder target) {
             return true;
         }
 
@@ -1619,8 +1637,8 @@
          * {@code target}.
          * @see #onMoved(RecyclerView, ViewHolder, int, ViewHolder, int, int, int)
          */
-        public abstract boolean onMove(RecyclerView recyclerView,
-                ViewHolder viewHolder, ViewHolder target);
+        public abstract boolean onMove(@NonNull RecyclerView recyclerView,
+                @NonNull ViewHolder viewHolder, @NonNull ViewHolder target);
 
         /**
          * Returns whether ItemTouchHelper should start a drag and drop operation if an item is
@@ -1659,6 +1677,7 @@
          *
          * @return The extra margin to be added to the hit box of the dragged View.
          */
+        @SuppressWarnings("WeakerAccess")
         public int getBoundingBoxMargin() {
             return 0;
         }
@@ -1674,7 +1693,8 @@
          * @return A float value that denotes the fraction of the View size. Default value
          * is .5f .
          */
-        public float getSwipeThreshold(ViewHolder viewHolder) {
+        @SuppressWarnings("WeakerAccess")
+        public float getSwipeThreshold(@NonNull ViewHolder viewHolder) {
             return .5f;
         }
 
@@ -1687,7 +1707,8 @@
          * @return A float value that denotes the fraction of the View size. Default value is
          * .5f .
          */
-        public float getMoveThreshold(ViewHolder viewHolder) {
+        @SuppressWarnings("WeakerAccess")
+        public float getMoveThreshold(@NonNull ViewHolder viewHolder) {
             return .5f;
         }
 
@@ -1712,6 +1733,7 @@
          * @see #getSwipeVelocityThreshold(float)
          * @see #getSwipeThreshold(ViewHolder)
          */
+        @SuppressWarnings("WeakerAccess")
         public float getSwipeEscapeVelocity(float defaultValue) {
             return defaultValue;
         }
@@ -1735,6 +1757,7 @@
          * <code>defaultValue</code> parameter.
          * @see #getSwipeEscapeVelocity(float)
          */
+        @SuppressWarnings("WeakerAccess")
         public float getSwipeVelocityThreshold(float defaultValue) {
             return defaultValue;
         }
@@ -1765,8 +1788,9 @@
          * @return A ViewHolder to whose position the dragged ViewHolder should be
          * moved to.
          */
-        public ViewHolder chooseDropTarget(ViewHolder selected,
-                List<ViewHolder> dropTargets, int curX, int curY) {
+        @SuppressWarnings("WeakerAccess")
+        public ViewHolder chooseDropTarget(@NonNull ViewHolder selected,
+                @NonNull List<ViewHolder> dropTargets, int curX, int curY) {
             int right = curX + selected.itemView.getWidth();
             int bottom = curY + selected.itemView.getHeight();
             ViewHolder winner = null;
@@ -1845,7 +1869,7 @@
          *                   `direction` will be relative as well. ({@link #START} or {@link
          *                   #END}).
          */
-        public abstract void onSwiped(ViewHolder viewHolder, int direction);
+        public abstract void onSwiped(@NonNull ViewHolder viewHolder, int direction);
 
         /**
          * Called when the ViewHolder swiped or dragged by the ItemTouchHelper is changed.
@@ -1859,7 +1883,7 @@
          *                    {@link ItemTouchHelper#ACTION_STATE_DRAG}.
          * @see #clearView(RecyclerView, RecyclerView.ViewHolder)
          */
-        public void onSelectedChanged(ViewHolder viewHolder, int actionState) {
+        public void onSelectedChanged(@Nullable ViewHolder viewHolder, int actionState) {
             if (viewHolder != null) {
                 sUICallback.onSelected(viewHolder.itemView);
             }
@@ -1906,9 +1930,9 @@
          *                     are applied. This value does not include margins added by
          *                     {@link RecyclerView.ItemDecoration}s.
          */
-        public void onMoved(final RecyclerView recyclerView,
-                final ViewHolder viewHolder, int fromPos, final ViewHolder target, int toPos, int x,
-                int y) {
+        public void onMoved(@NonNull final RecyclerView recyclerView,
+                @NonNull final ViewHolder viewHolder, int fromPos, @NonNull final ViewHolder target,
+                int toPos, int x, int y) {
             final RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
             if (layoutManager instanceof ViewDropHandler) {
                 ((ViewDropHandler) layoutManager).prepareForDrop(viewHolder.itemView,
@@ -2002,7 +2026,7 @@
          * @param recyclerView The RecyclerView which is controlled by the ItemTouchHelper.
          * @param viewHolder   The View that was interacted by the user.
          */
-        public void clearView(RecyclerView recyclerView, ViewHolder viewHolder) {
+        public void clearView(@NonNull RecyclerView recyclerView, @NonNull ViewHolder viewHolder) {
             sUICallback.clearView(viewHolder.itemView);
         }
 
@@ -2033,8 +2057,8 @@
          * @see #onChildDrawOver(Canvas, RecyclerView, ViewHolder, float, float, int,
          * boolean)
          */
-        public void onChildDraw(Canvas c, RecyclerView recyclerView,
-                ViewHolder viewHolder,
+        public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
+                @NonNull ViewHolder viewHolder,
                 float dX, float dY, int actionState, boolean isCurrentlyActive) {
             sUICallback.onDraw(c, recyclerView, viewHolder.itemView, dX, dY, actionState,
                     isCurrentlyActive);
@@ -2067,7 +2091,7 @@
          * @see #onChildDrawOver(Canvas, RecyclerView, ViewHolder, float, float, int,
          * boolean)
          */
-        public void onChildDrawOver(Canvas c, RecyclerView recyclerView,
+        public void onChildDrawOver(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
                 ViewHolder viewHolder,
                 float dX, float dY, int actionState, boolean isCurrentlyActive) {
             sUICallback.onDrawOver(c, recyclerView, viewHolder.itemView, dX, dY, actionState,
@@ -2094,7 +2118,8 @@
          * @param animateDy     The vertical distance that the animation will offset
          * @return The duration for the animation
          */
-        public long getAnimationDuration(RecyclerView recyclerView, int animationType,
+        @SuppressWarnings("WeakerAccess")
+        public long getAnimationDuration(@NonNull RecyclerView recyclerView, int animationType,
                 float animateDx, float animateDy) {
             final RecyclerView.ItemAnimator itemAnimator = recyclerView.getItemAnimator();
             if (itemAnimator == null) {
@@ -2126,7 +2151,8 @@
          * @return The amount that RecyclerView should scroll. Keep in mind that this value will
          * be passed to {@link RecyclerView#scrollBy(int, int)} method.
          */
-        public int interpolateOutOfBoundsScroll(RecyclerView recyclerView,
+        @SuppressWarnings("WeakerAccess")
+        public int interpolateOutOfBoundsScroll(@NonNull RecyclerView recyclerView,
                 int viewSize, int viewSizeOutOfBounds,
                 int totalSize, long msSinceStartScroll) {
             final int maxScroll = getMaxDragScroll(recyclerView);
@@ -2207,7 +2233,8 @@
          *
          * @param defaultSwipeDirs Binary OR of directions in which the ViewHolders can be swiped.
          */
-        public void setDefaultSwipeDirs(int defaultSwipeDirs) {
+        @SuppressWarnings({"WeakerAccess", "unused"})
+        public void setDefaultSwipeDirs(@SuppressWarnings("unused") int defaultSwipeDirs) {
             mDefaultSwipeDirs = defaultSwipeDirs;
         }
 
@@ -2217,7 +2244,8 @@
          *
          * @param defaultDragDirs Binary OR of directions in which the ViewHolders can be dragged.
          */
-        public void setDefaultDragDirs(int defaultDragDirs) {
+        @SuppressWarnings({"WeakerAccess", "unused"})
+        public void setDefaultDragDirs(@SuppressWarnings("unused") int defaultDragDirs) {
             mDefaultDragDirs = defaultDragDirs;
         }
 
@@ -2227,10 +2255,12 @@
          * {@link #setDefaultSwipeDirs(int)}.
          *
          * @param recyclerView The RecyclerView to which the ItemTouchHelper is attached to.
-         * @param viewHolder   The RecyclerView for which the swipe direction is queried.
+         * @param viewHolder   The ViewHolder for which the swipe direction is queried.
          * @return A binary OR of direction flags.
          */
-        public int getSwipeDirs(RecyclerView recyclerView, ViewHolder viewHolder) {
+        @SuppressWarnings("WeakerAccess")
+        public int getSwipeDirs(@SuppressWarnings("unused") @NonNull RecyclerView recyclerView,
+                @NonNull @SuppressWarnings("unused") ViewHolder viewHolder) {
             return mDefaultSwipeDirs;
         }
 
@@ -2240,15 +2270,18 @@
          * {@link #setDefaultDragDirs(int)}.
          *
          * @param recyclerView The RecyclerView to which the ItemTouchHelper is attached to.
-         * @param viewHolder   The RecyclerView for which the swipe direction is queried.
+         * @param viewHolder   The ViewHolder for which the swipe direction is queried.
          * @return A binary OR of direction flags.
          */
-        public int getDragDirs(RecyclerView recyclerView, ViewHolder viewHolder) {
+        @SuppressWarnings("WeakerAccess")
+        public int getDragDirs(@SuppressWarnings("unused") @NonNull RecyclerView recyclerView,
+                @SuppressWarnings("unused") @NonNull ViewHolder viewHolder) {
             return mDefaultDragDirs;
         }
 
         @Override
-        public int getMovementFlags(RecyclerView recyclerView, ViewHolder viewHolder) {
+        public int getMovementFlags(@NonNull RecyclerView recyclerView,
+                @NonNull ViewHolder viewHolder) {
             return makeMovementFlags(getDragDirs(recyclerView, viewHolder),
                     getSwipeDirs(recyclerView, viewHolder));
         }
@@ -2342,7 +2375,7 @@
 
         final int mAnimationType;
 
-        public boolean mIsPendingCleanup;
+        boolean mIsPendingCleanup;
 
         float mX;
 
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/AsyncListUtilLayoutTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/AsyncListUtilLayoutTest.java
index 3ac53f4..3bfda56 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/AsyncListUtilLayoutTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/AsyncListUtilLayoutTest.java
@@ -22,6 +22,7 @@
 import static java.util.concurrent.TimeUnit.SECONDS;
 
 import android.content.Context;
+import android.support.annotation.NonNull;
 import android.support.test.filters.MediumTest;
 import android.support.test.filters.Suppress;
 import android.support.test.runner.AndroidJUnit4;
@@ -266,12 +267,12 @@
         }
 
         @Override
-        public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
             return new SimpleViewHolder(parent.getContext());
         }
 
         @Override
-        public void onBindViewHolder(SimpleViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position) {
             final String item = mAsyncListUtil == null ? null : mAsyncListUtil.getItem(position);
             ((TextView) (holder.itemView)).setText(item == null ? "" : item);
 
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/AttachDetachCollector.java b/v7/recyclerview/tests/src/android/support/v7/widget/AttachDetachCollector.java
index 12281ae..dbd157e 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/AttachDetachCollector.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/AttachDetachCollector.java
@@ -16,6 +16,7 @@
 package android.support.v7.widget;
 
 
+import android.support.annotation.NonNull;
 import android.view.View;
 
 import java.util.ArrayList;
@@ -33,12 +34,12 @@
     }
 
     @Override
-    public void onChildViewAttachedToWindow(View view) {
+    public void onChildViewAttachedToWindow(@NonNull View view) {
         mAttached.add(view);
     }
 
     @Override
-    public void onChildViewDetachedFromWindow(View view) {
+    public void onChildViewDetachedFromWindow(@NonNull View view) {
         mDetached.add(view);
     }
 
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
index eed7d20..e47a480 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
@@ -32,6 +32,7 @@
 import android.app.Instrumentation;
 import android.graphics.Rect;
 import android.os.Looper;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.rule.ActivityTestRule;
@@ -456,13 +457,13 @@
         final RecyclerView.OnChildAttachStateChangeListener listener =
                 new RecyclerView.OnChildAttachStateChangeListener() {
                     @Override
-                    public void onChildViewAttachedToWindow(View view) {
+                    public void onChildViewAttachedToWindow(@NonNull View view) {
                         if (position == mRecyclerView.getChildAdapterPosition(view)) {
                             viewAdded.countDown();
                         }
                     }
                     @Override
-                    public void onChildViewDetachedFromWindow(View view) {
+                    public void onChildViewDetachedFromWindow(@NonNull View view) {
                     }
                 };
         final AtomicBoolean addedListener = new AtomicBoolean(false);
@@ -803,7 +804,7 @@
         }
 
         @Override
-        public TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
             final TextView textView = new TextView(parent.getContext());
             textView.setLayoutParams(new ViewGroup.LayoutParams(
                     ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
@@ -813,7 +814,7 @@
         }
 
         @Override
-        public void onBindViewHolder(TestViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull TestViewHolder holder, int position) {
             ((TextView) holder.itemView).setText("Item " + position);
         }
 
@@ -878,7 +879,7 @@
         }
 
         @Override
-        public TestViewHolder onCreateViewHolder(ViewGroup parent,
+        public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                 int viewType) {
             TextView itemView = new TextView(parent.getContext());
             itemView.setFocusableInTouchMode(true);
@@ -887,7 +888,7 @@
         }
 
         @Override
-        public void onBindViewHolder(TestViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull TestViewHolder holder, int position) {
             assertNotNull(holder.mOwnerRecyclerView);
             assertEquals(position, holder.getAdapterPosition());
             final Item item = mItems.get(position);
@@ -903,7 +904,7 @@
         }
 
         @Override
-        public void onViewRecycled(TestViewHolder holder) {
+        public void onViewRecycled(@NonNull TestViewHolder holder) {
             super.onViewRecycled(holder);
             final int adapterPosition = holder.getAdapterPosition();
             final boolean shouldHavePosition = !holder.isRemoved() && holder.isBound() &&
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseStaggeredGridLayoutManagerTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/BaseStaggeredGridLayoutManagerTest.java
index 776b10d..2aa8b8b 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/BaseStaggeredGridLayoutManagerTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/BaseStaggeredGridLayoutManagerTest.java
@@ -18,6 +18,7 @@
 import android.graphics.Rect;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.StateListDrawable;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.util.Log;
 import android.util.StateSet;
@@ -835,8 +836,9 @@
             mOrientation = orientation;
         }
 
+        @NonNull
         @Override
-        public TestViewHolder onCreateViewHolder(ViewGroup parent,
+        public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                 int viewType) {
             mRecyclerViewWidth = parent.getWidth();
             mRecyclerViewHeight = parent.getHeight();
@@ -875,7 +877,7 @@
         }
 
         @Override
-        public void onBindViewHolder(TestViewHolder holder,
+        public void onBindViewHolder(@NonNull TestViewHolder holder,
                 int position) {
             if (mSizeReference == null) {
                 mSizeReference = mOrientation == OrientationHelper.HORIZONTAL ? mRecyclerViewWidth
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentTest.java
index e963235..3cbe96f 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentTest.java
@@ -24,6 +24,7 @@
 import android.app.Activity;
 import android.graphics.Color;
 import android.graphics.Rect;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.util.LongSparseArray;
 import android.support.v7.widget.TestedFrameLayout.FullControlLayoutParams;
@@ -72,7 +73,7 @@
         WrappedRecyclerView rv = createRecyclerView(getActivity());
         TestAdapter testAdapter = new TestAdapter(20) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 holder.itemView.setLayoutParams(new ViewGroup.LayoutParams(itemWidth, itemHeight));
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentWithAspectRatioTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentWithAspectRatioTest.java
index b91c37a..0f2fbad 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentWithAspectRatioTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentWithAspectRatioTest.java
@@ -15,24 +15,25 @@
  */
 package android.support.v7.widget;
 
-import org.hamcrest.BaseMatcher;
-import org.hamcrest.Description;
+import static android.support.v7.widget.LinearLayoutManager.HORIZONTAL;
+import static android.support.v7.widget.LinearLayoutManager.VERTICAL;
 
 import android.content.Context;
 import android.graphics.Color;
+import android.support.annotation.NonNull;
 import android.support.v4.util.Pair;
 import android.util.AttributeSet;
 import android.view.View;
 import android.view.ViewGroup;
 
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicLong;
 
-import static android.support.v7.widget.LinearLayoutManager.HORIZONTAL;
-import static android.support.v7.widget.LinearLayoutManager.VERTICAL;
-
 abstract public class BaseWrapContentWithAspectRatioTest extends BaseRecyclerViewInstrumentationTest {
     final BaseWrapContentTest.WrapContentConfig mWrapContentConfig;
 
@@ -202,12 +203,12 @@
         }
 
         @Override
-        public WrapContentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        public WrapContentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
             return new WrapContentViewHolder(parent);
         }
 
         @Override
-        public void onBindViewHolder(WrapContentViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull WrapContentViewHolder holder, int position) {
             holder.mView.setBehavior(behaviors.get(position));
             holder.mView.prepareLayoutParams();
         }
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/CustomEdgeEffectTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/CustomEdgeEffectTest.java
index 0644416..adc7125 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/CustomEdgeEffectTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/CustomEdgeEffectTest.java
@@ -62,7 +62,7 @@
         mRecyclerView.setAdapter(new TestAdapter(NUM_ITEMS) {
 
             @Override
-            public TestViewHolder onCreateViewHolder(ViewGroup parent,
+            public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                     int viewType) {
                 TestViewHolder holder = super.onCreateViewHolder(parent, viewType);
                 holder.itemView.setMinimumHeight(mRecyclerView.getMeasuredHeight() * 2 / NUM_ITEMS);
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/DefaultItemAnimatorTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/DefaultItemAnimatorTest.java
index c28623f..1ea1675 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/DefaultItemAnimatorTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/DefaultItemAnimatorTest.java
@@ -21,6 +21,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import android.support.annotation.NonNull;
 import android.support.test.filters.LargeTest;
 import android.support.test.runner.AndroidJUnit4;
 import android.util.Log;
@@ -408,12 +409,12 @@
         }
 
         @Override
-        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
             return new ViewHolder(new TextView(parent.getContext()));
         }
 
         @Override
-        public void onBindViewHolder(ViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
             holder.bind(mItems.get(position));
         }
 
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/DividerItemDecorationTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/DividerItemDecorationTest.java
index 6459522..5effd32 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/DividerItemDecorationTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/DividerItemDecorationTest.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.graphics.Canvas;
+import android.support.annotation.NonNull;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
@@ -67,12 +68,12 @@
         }
 
         @Override
-        public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        public MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
             return new ViewHolder(new TextView(parent.getContext()));
         }
 
         @Override
-        public void onBindViewHolder(ViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
             holder.mTextView.setText(mDataset[position]);
         }
 
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/FocusSearchNavigationTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/FocusSearchNavigationTest.java
index 3755018..c954811 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/FocusSearchNavigationTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/FocusSearchNavigationTest.java
@@ -29,6 +29,7 @@
 import android.app.Activity;
 import android.content.Context;
 import android.os.Build;
+import android.support.annotation.NonNull;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.LargeTest;
 import android.support.test.rule.ActivityTestRule;
@@ -244,7 +245,7 @@
         }
 
         @Override
-        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
+        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
         int viewType) {
             View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view,
                     parent, false);
@@ -259,7 +260,7 @@
         }
 
         @Override
-        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
             holder.itemView.setTag("pos " + position);
         }
 
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCustomSizeInScrollDirectionTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCustomSizeInScrollDirectionTest.java
index dec0d72..5c351eb 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCustomSizeInScrollDirectionTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCustomSizeInScrollDirectionTest.java
@@ -22,6 +22,7 @@
 import static org.junit.Assert.assertTrue;
 
 import android.graphics.Rect;
+import android.support.annotation.NonNull;
 import android.support.test.filters.MediumTest;
 import android.view.View;
 import android.view.ViewGroup;
@@ -71,7 +72,7 @@
 
         final GridTestAdapter testAdapter = new GridTestAdapter(10) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams)
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerRtlTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerRtlTest.java
index 3343ff5..430622f 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerRtlTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerRtlTest.java
@@ -23,6 +23,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import android.support.annotation.NonNull;
 import android.support.test.filters.MediumTest;
 import android.view.View;
 import android.view.ViewGroup;
@@ -90,7 +91,7 @@
 
         RecyclerView rv = setupBasic(mConfig, new GridTestAdapter(mConfig.mItemCount) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 if (mItemsWrapContent) {
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerTest.java
index 985fd93..5fdb656 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerTest.java
@@ -33,6 +33,7 @@
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.StateListDrawable;
 import android.os.Build;
+import android.support.annotation.NonNull;
 import android.support.test.annotation.UiThreadTest;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.SdkSuppress;
@@ -84,7 +85,7 @@
         RecyclerView recyclerView = setupBasic(new Config(2, 100).reverseLayout(reverseLayout),
                 new GridTestAdapter(100) {
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder,
+                    public void onBindViewHolder(@NonNull TestViewHolder holder,
                             int position) {
                         super.onBindViewHolder(holder, position);
                         ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
@@ -126,7 +127,7 @@
                     RecyclerView mAttachedRv;
 
                     @Override
-                    public TestViewHolder onCreateViewHolder(ViewGroup parent,
+                    public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                             int viewType) {
                         TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                         testViewHolder.itemView.setFocusable(true);
@@ -147,7 +148,7 @@
                     }
 
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder,
+                    public void onBindViewHolder(@NonNull TestViewHolder holder,
                             int position) {
                         super.onBindViewHolder(holder, position);
                         holder.itemView.setMinimumHeight(mAttachedRv.getHeight() / 3);
@@ -322,7 +323,7 @@
                     RecyclerView mAttachedRv;
 
                     @Override
-                    public TestViewHolder onCreateViewHolder(ViewGroup parent,
+                    public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                             int viewType) {
                         TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                         // Good to have colors for debugging
@@ -341,7 +342,7 @@
                     }
 
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder,
+                    public void onBindViewHolder(@NonNull TestViewHolder holder,
                             int position) {
                         super.onBindViewHolder(holder, position);
                         if (position < spanCount * consecutiveFocusableRowsCount) {
@@ -412,7 +413,7 @@
                     RecyclerView mAttachedRv;
 
                     @Override
-                    public TestViewHolder onCreateViewHolder(ViewGroup parent,
+                    public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                             int viewType) {
                         TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                         // Good to have colors for debugging
@@ -431,7 +432,7 @@
                     }
 
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder,
+                    public void onBindViewHolder(@NonNull TestViewHolder holder,
                             int position) {
                         super.onBindViewHolder(holder, position);
                         if (position < spanCount * consecutiveFocusableRowsCount) {
@@ -502,7 +503,7 @@
                     RecyclerView mAttachedRv;
 
                     @Override
-                    public TestViewHolder onCreateViewHolder(ViewGroup parent,
+                    public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                             int viewType) {
                         TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                         // Good to have colors for debugging
@@ -521,7 +522,7 @@
                     }
 
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder,
+                    public void onBindViewHolder(@NonNull TestViewHolder holder,
                             int position) {
                         super.onBindViewHolder(holder, position);
                         if (position < spanCount * consecutiveFocusableColsCount) {
@@ -592,7 +593,7 @@
                     RecyclerView mAttachedRv;
 
                     @Override
-                    public TestViewHolder onCreateViewHolder(ViewGroup parent,
+                    public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                             int viewType) {
                         TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                         // Good to have colors for debugging
@@ -611,7 +612,7 @@
                     }
 
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder,
+                    public void onBindViewHolder(@NonNull TestViewHolder holder,
                             int position) {
                         super.onBindViewHolder(holder, position);
                         if (position < spanCount * consecutiveFocusableColsCount) {
@@ -846,7 +847,7 @@
         final RecyclerView rv = setupBasic(new Config(3, 100).orientation(orientation),
                 new GridTestAdapter(100) {
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder,
+                    public void onBindViewHolder(@NonNull TestViewHolder holder,
                             int position) {
                         super.onBindViewHolder(holder, position);
                         GridLayoutManager.LayoutParams glp = ensureGridLp(holder.itemView);
@@ -1076,7 +1077,7 @@
             final int removePos) throws Throwable {
         GridTestAdapter adapter = new GridTestAdapter(adapterSize) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
@@ -1219,7 +1220,7 @@
                 new HashMap<Integer, RecyclerView.ViewHolder>();
         RecyclerView recyclerView = setupBasic(new Config(3, 3), new GridTestAdapter(3) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 final GridLayoutManager.LayoutParams glp = ensureGridLp(holder.itemView);
@@ -1246,7 +1247,7 @@
         RecyclerView recyclerView = setupBasic(new Config(3, HORIZONTAL, false),
                 new GridTestAdapter(3) {
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder,
+                    public void onBindViewHolder(@NonNull TestViewHolder holder,
                             int position) {
                         super.onBindViewHolder(holder, position);
                         final GridLayoutManager.LayoutParams glp = ensureGridLp(holder.itemView);
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/ItemAnimatorV2ApiTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/ItemAnimatorV2ApiTest.java
index 4c7161b..7769168 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/ItemAnimatorV2ApiTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/ItemAnimatorV2ApiTest.java
@@ -82,7 +82,7 @@
 
         setupBasic(10, 0, 10, new TestAdapter(10) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 if (position == 0) {
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerBaseConfigSetTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerBaseConfigSetTest.java
index 731cc67..0293646 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerBaseConfigSetTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerBaseConfigSetTest.java
@@ -29,6 +29,7 @@
 import static org.junit.Assert.assertThat;
 
 import android.graphics.Rect;
+import android.support.annotation.NonNull;
 import android.support.test.filters.LargeTest;
 import android.util.Log;
 import android.view.View;
@@ -205,7 +206,7 @@
         final int totalSpace = mLayoutManager.mOrientationHelper.getTotalSpace();
         final TestAdapter newAdapter = new TestAdapter(100) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 if (config.mOrientation == HORIZONTAL) {
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerPrepareForDropTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerPrepareForDropTest.java
index 2cdb2e7..6aa26b8 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerPrepareForDropTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerPrepareForDropTest.java
@@ -21,6 +21,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertSame;
 
+import android.support.annotation.NonNull;
 import android.support.test.filters.MediumTest;
 import android.view.View;
 
@@ -124,7 +125,8 @@
         final Config config = (Config) mConfig.clone();
         config.mTestAdapter = new BaseRecyclerViewInstrumentationTest.TestAdapter(100) {
             @Override
-            public void onBindViewHolder(BaseRecyclerViewInstrumentationTest.TestViewHolder holder,
+            public void onBindViewHolder(
+                    @NonNull BaseRecyclerViewInstrumentationTest.TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 if (config.mOrientation == HORIZONTAL) {
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerTest.java
index dd2c650..d04d8cc 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerTest.java
@@ -34,6 +34,7 @@
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.StateListDrawable;
 import android.os.Build;
+import android.support.annotation.NonNull;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.SdkSuppress;
 import android.support.v4.view.AccessibilityDelegateCompat;
@@ -206,7 +207,7 @@
             RecyclerView mAttachedRv;
 
             @Override
-            public TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                 TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                 // Good to have colors for debugging
                 StateListDrawable stl = new StateListDrawable();
@@ -224,7 +225,7 @@
             }
 
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 if (position < consecutiveFocusablesCount) {
@@ -292,7 +293,7 @@
             RecyclerView mAttachedRv;
 
             @Override
-            public TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                 TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                 // Good to have colors for debugging
                 StateListDrawable stl = new StateListDrawable();
@@ -310,7 +311,7 @@
             }
 
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 if (position < consecutiveFocusablesCount) {
@@ -377,7 +378,7 @@
             RecyclerView mAttachedRv;
 
             @Override
-            public TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                 TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                 // Good to have colors for debugging
                 StateListDrawable stl = new StateListDrawable();
@@ -395,7 +396,7 @@
             }
 
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 if (position < consecutiveFocusablesCount) {
@@ -463,7 +464,7 @@
             RecyclerView mAttachedRv;
 
             @Override
-            public TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                 TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                 // Good to have colors for debugging
                 StateListDrawable stl = new StateListDrawable();
@@ -481,7 +482,7 @@
             }
 
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 if (position < consecutiveFocusablesCount) {
@@ -554,7 +555,7 @@
             RecyclerView mAttachedRv;
 
             @Override
-            public TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                 TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                 // Good to have colors for debugging
                 StateListDrawable stl = new StateListDrawable();
@@ -572,7 +573,7 @@
             }
 
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 if (position < consecutiveFocusablesCount) {
@@ -710,7 +711,7 @@
             final int removePos) throws Throwable {
         config.adapter(new TestAdapter(adapterSize) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
@@ -808,7 +809,7 @@
         final boolean[] firstItemSpecialSize = new boolean[] {false};
         TestAdapter adapter = new TestAdapter(adapterSize) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
@@ -1123,7 +1124,7 @@
         final AtomicInteger childCount = new AtomicInteger(0);
         final TestAdapter adapter = new TestAdapter(300) {
             @Override
-            public TestViewHolder onCreateViewHolder(ViewGroup parent,
+            public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                     int viewType) {
                 final int cnt = childCount.incrementAndGet();
                 final TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/MultiRecyclerViewPrefetchTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/MultiRecyclerViewPrefetchTest.java
index 3eba432..ee08e98 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/MultiRecyclerViewPrefetchTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/MultiRecyclerViewPrefetchTest.java
@@ -21,6 +21,7 @@
 
 import android.content.Context;
 import android.os.Build;
+import android.support.annotation.NonNull;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SdkSuppress;
 import android.support.test.filters.SmallTest;
@@ -116,15 +117,17 @@
 
             // first view 50x100 pixels, rest are 100x100 so second column is offset
             rv.setAdapter(new RecyclerView.Adapter() {
+                @NonNull
                 @Override
-                public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
+                public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                         int viewType) {
                     registerTimePassingMs(5);
                     return new RecyclerView.ViewHolder(new View(parent.getContext())) {};
                 }
 
                 @Override
-                public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+                public void onBindViewHolder(
+                        @NonNull RecyclerView.ViewHolder holder, int position) {
                     registerTimePassingMs(5);
                     holder.itemView.setMinimumWidth(100);
                     holder.itemView.setMinimumHeight(position == 0 ? 50 : 100);
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAccessibilityLifecycleTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAccessibilityLifecycleTest.java
index 973b138..b746092 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAccessibilityLifecycleTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAccessibilityLifecycleTest.java
@@ -28,6 +28,7 @@
 import static org.mockito.Mockito.verify;
 
 import android.os.Build;
+import android.support.annotation.NonNull;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.MediumTest;
 import android.support.test.filters.SdkSuppress;
@@ -77,7 +78,7 @@
         };
         TestAdapter adapter = new TestAdapter(10) {
             @Override
-            public TestViewHolder onCreateViewHolder(ViewGroup parent,
+            public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                     int viewType) {
                 TestViewHolder vh = super.onCreateViewHolder(parent, viewType);
                 ViewCompat.setImportantForAccessibility(vh.itemView,
@@ -189,7 +190,7 @@
         };
         final TestAdapter adapter = new TestAdapter(100) {
             @Override
-            public TestViewHolder onCreateViewHolder(ViewGroup parent,
+            public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                     int viewType) {
                 TestViewHolder vh = super.onCreateViewHolder(parent, viewType);
                 ViewCompat.setAccessibilityDelegate(vh.itemView, delegateCompat);
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java
index da5be39..de31415 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java
@@ -63,7 +63,7 @@
     public void keepFocusAfterChangeAnimation() throws Throwable {
         setupBasic(10, 0, 5, new TestAdapter(10) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 holder.itemView.setFocusableInTouchMode(true);
@@ -111,7 +111,7 @@
         final List<RecyclerView.ViewHolder> mRecycled = new ArrayList<>();
         final TestAdapter adapter = new TestAdapter(1) {
             @Override
-            public void onViewRecycled(TestViewHolder holder) {
+            public void onViewRecycled(@NonNull TestViewHolder holder) {
                 super.onViewRecycled(holder);
                 mRecycled.add(holder);
             }
@@ -500,7 +500,7 @@
     public void reuseHiddenViewTest(ReuseTestCallback callback) throws Throwable {
         TestAdapter adapter = new TestAdapter(10) {
             @Override
-            public void onViewRecycled(TestViewHolder holder) {
+            public void onViewRecycled(@NonNull TestViewHolder holder) {
                 super.onViewRecycled(holder);
                 recycledVHs.add(holder);
             }
@@ -600,7 +600,7 @@
         // RecyclerView is expected to change it to 'expectedImportantForAccessibility'.
         TestAdapter adapter = new TestAdapter(1) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder, int position) {
+            public void onBindViewHolder(@NonNull TestViewHolder holder, int position) {
                 super.onBindViewHolder(holder, position);
                 ViewCompat.setImportantForAccessibility(
                         holder.itemView, boundImportantForAccessibility);
@@ -739,7 +739,7 @@
                 = new ArrayList<RecyclerView.ViewHolder>();
         TestAdapter adapter = new TestAdapter(50) {
             @Override
-            public void onViewRecycled(TestViewHolder holder) {
+            public void onViewRecycled(@NonNull TestViewHolder holder) {
                 super.onViewRecycled(holder);
                 mRecycledViews.add(holder);
             }
@@ -859,7 +859,7 @@
             }
 
             @Override
-            public TestViewHolder onCreateViewHolder(ViewGroup parent,
+            public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                     int viewType) {
                 TestViewHolder vh = super.onCreateViewHolder(parent, viewType);
                 if (DEBUG) {
@@ -869,7 +869,7 @@
             }
 
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 if (DEBUG) {
@@ -946,7 +946,7 @@
             }
 
             @Override
-            public TestViewHolder onCreateViewHolder(ViewGroup parent,
+            public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                     int viewType) {
                 TestViewHolder vh = super.onCreateViewHolder(parent, viewType);
                 if (DEBUG) {
@@ -1064,7 +1064,7 @@
         final AtomicInteger childCount = new AtomicInteger(0);
         final TestAdapter adapter = new TestAdapter(1000) {
             @Override
-            public TestViewHolder onCreateViewHolder(ViewGroup parent,
+            public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                     int viewType) {
                 childCount.incrementAndGet();
                 return super.onCreateViewHolder(parent, viewType);
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java
index 50e2d8b..4f29ad3 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java
@@ -222,7 +222,7 @@
         mRecyclerView.setLayoutManager(layoutManager);
         MockAdapter adapter = new MockAdapter(100) {
             @Override
-            public void onViewRecycled(RecyclerView.ViewHolder holder) {
+            public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
                 super.onViewRecycled(holder);
                 recycledVhs.add(holder);
             }
@@ -245,7 +245,7 @@
         mRecyclerView.setLayoutManager(layoutManager);
         MockAdapter adapter = new MockAdapter(100) {
             @Override
-            public void onViewRecycled(RecyclerView.ViewHolder holder) {
+            public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
                 super.onViewRecycled(holder);
                 recycledVhs.add(holder);
             }
@@ -338,8 +338,10 @@
         };
         mRecyclerView.setLayoutManager(mlm);
         mRecyclerView.setAdapter(new MockAdapter(3) {
+            @NonNull
             @Override
-            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            public RecyclerView.ViewHolder onCreateViewHolder(
+                    @NonNull ViewGroup parent, int viewType) {
                 final LoggingView itemView = new LoggingView(parent.getContext());
                 //noinspection ResourceType
                 itemView.setId(3);
@@ -716,13 +718,14 @@
             this.mCount = count;
         }
 
+        @NonNull
         @Override
-        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
             return new MockViewHolder(new TextView(parent.getContext()));
         }
 
         @Override
-        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
 
         }
 
@@ -797,14 +800,14 @@
         }
 
         @Override
-        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
             LinearLayout holder = new LinearLayout(parent.getContext());
             holder.setOrientation(LinearLayout.HORIZONTAL);
             return new MockViewHolder(holder);
         }
 
         @Override
-        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
             LinearLayout l = (LinearLayout) holder.itemView;
             l.removeAllViews();
             if (position == 0) {
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewCacheTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewCacheTest.java
index 1267fdb..b38c794 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewCacheTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewCacheTest.java
@@ -35,6 +35,7 @@
 import android.os.Build;
 import android.os.Parcelable;
 import android.os.SystemClock;
+import android.support.annotation.NonNull;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SdkSuppress;
 import android.support.test.filters.SmallTest;
@@ -305,8 +306,10 @@
 
         // 100x100 pixel views
         mRecyclerView.setAdapter(new RecyclerView.Adapter() {
+            @NonNull
             @Override
-            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            public RecyclerView.ViewHolder onCreateViewHolder(
+                    @NonNull ViewGroup parent, int viewType) {
                 View view = new View(getContext());
                 view.setMinimumWidth(100);
                 view.setMinimumHeight(100);
@@ -315,7 +318,7 @@
             }
 
             @Override
-            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {}
+            public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {}
 
             @Override
             public int getItemCount() {
@@ -345,7 +348,8 @@
         // 1000x1000 pixel views
         RecyclerView.Adapter adapter = new RecyclerView.Adapter() {
             @Override
-            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            public RecyclerView.ViewHolder onCreateViewHolder(
+                    @NonNull ViewGroup parent, int viewType) {
                 mRecyclerView.registerTimePassingMs(5);
                 View view = new View(getContext());
                 view.setMinimumWidth(1000);
@@ -354,7 +358,7 @@
             }
 
             @Override
-            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+            public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
                 mRecyclerView.registerTimePassingMs(5);
             }
 
@@ -404,7 +408,8 @@
         // 100x100 pixel views
         RecyclerView.Adapter adapter = new RecyclerView.Adapter() {
             @Override
-            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            public RecyclerView.ViewHolder onCreateViewHolder(
+                    @NonNull ViewGroup parent, int viewType) {
                 mRecyclerView.registerTimePassingMs(5);
                 View view = new View(getContext());
                 view.setMinimumWidth(100);
@@ -413,7 +418,8 @@
             }
 
             @Override
-            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+            public void onBindViewHolder(
+                    @NonNull RecyclerView.ViewHolder holder, int position) {
                 mRecyclerView.registerTimePassingMs(5);
             }
 
@@ -462,7 +468,8 @@
         // 100x100 pixel views
         RecyclerView.Adapter adapter = new RecyclerView.Adapter() {
             @Override
-            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            public RecyclerView.ViewHolder onCreateViewHolder(
+                    @NonNull ViewGroup parent, int viewType) {
                 mRecyclerView.registerTimePassingMs(5);
                 View view = new View(getContext());
                 view.setMinimumWidth(100);
@@ -471,7 +478,7 @@
             }
 
             @Override
-            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+            public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
                 mRecyclerView.registerTimePassingMs(5);
             }
 
@@ -481,7 +488,7 @@
             }
 
             @Override
-            public void onViewRecycled(RecyclerView.ViewHolder holder) {
+            public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
                 // verify unbound view doesn't get
                 assertNotEquals(RecyclerView.NO_POSITION, holder.getAdapterPosition());
             }
@@ -519,13 +526,15 @@
 
         // first view 50x100 pixels, rest are 100x100 so second column is offset
         mRecyclerView.setAdapter(new RecyclerView.Adapter() {
+            @NonNull
             @Override
-            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            public RecyclerView.ViewHolder onCreateViewHolder(
+                    @NonNull ViewGroup parent, int viewType) {
                 return new RecyclerView.ViewHolder(new View(getContext())) {};
             }
 
             @Override
-            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+            public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
                 holder.itemView.setMinimumWidth(100);
                 holder.itemView.setMinimumHeight(position == 0 ? 50 : 100);
             }
@@ -593,13 +602,15 @@
                 new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
         mRecyclerView.setLayoutManager(sglm);
         mRecyclerView.setAdapter(new RecyclerView.Adapter() {
+            @NonNull
             @Override
-            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            public RecyclerView.ViewHolder onCreateViewHolder(
+                    @NonNull ViewGroup parent, int viewType) {
                 return new RecyclerView.ViewHolder(new View(getContext())) {};
             }
 
             @Override
-            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+            public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
                 holder.itemView.setMinimumWidth(100);
                 holder.itemView.setMinimumHeight(position == 0 ? 100 : 200);
             }
@@ -639,12 +650,13 @@
 
         final RecyclerView.Adapter adapter = new RecyclerView.Adapter() {
             @Override
-            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            public RecyclerView.ViewHolder onCreateViewHolder(
+                    @NonNull ViewGroup parent, int viewType) {
                 return new RecyclerView.ViewHolder(new View(parent.getContext())) {};
             }
 
             @Override
-            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+            public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
                 int height = expandedPosition[0] == position ? 400 : 100;
                 holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(200, height));
             }
@@ -744,7 +756,7 @@
         InnerAdapter() {}
 
         @Override
-        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
             mRecyclerView.registerTimePassingMs(5);
             View view = new View(parent.getContext());
             view.setLayoutParams(new RecyclerView.LayoutParams(100, 100));
@@ -752,7 +764,7 @@
         }
 
         @Override
-        public void onBindViewHolder(ViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
             mRecyclerView.registerTimePassingMs(5);
             mItemsBound++;
         }
@@ -803,7 +815,7 @@
         }
 
         @Override
-        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
             mRecyclerView.registerTimePassingMs(5);
 
             RecyclerView rv = new RecyclerView(parent.getContext()) {
@@ -821,7 +833,7 @@
         }
 
         @Override
-        public void onBindViewHolder(ViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
             mRecyclerView.registerTimePassingMs(5);
 
             // Tests may rely on bound holders not being shared between inner adapters,
@@ -836,7 +848,7 @@
         }
 
         @Override
-        public void onViewRecycled(ViewHolder holder) {
+        public void onViewRecycled(@NonNull ViewHolder holder) {
             mSavedStates.set(holder.getAdapterPosition(),
                     holder.mRecyclerView.getLayoutManager().onSaveInstanceState());
         }
@@ -1153,8 +1165,9 @@
             }
         }
 
+        @NonNull
         @Override
-        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
             mRecyclerView.registerTimePassingMs(5);
             RecyclerView rv = new RecyclerView(parent.getContext());
             rv.setLayoutManager(new LinearLayoutManager(parent.getContext(),
@@ -1165,7 +1178,7 @@
         }
 
         @Override
-        public void onBindViewHolder(ViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
             mRecyclerView.registerTimePassingMs(5);
             // if we had actual data to put into our adapter, this is where we'd do it...
 
@@ -1180,7 +1193,7 @@
         }
 
         @Override
-        public void onViewRecycled(ViewHolder holder) {
+        public void onViewRecycled(@NonNull ViewHolder holder) {
             if (holder.getAdapterPosition() >= 0) {
                 mSavedStates.set(holder.getAdapterPosition(),
                         holder.mRecyclerView.getLayoutManager().onSaveInstanceState());
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java
index 584a116..d2a3b2a 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java
@@ -26,6 +26,7 @@
 import android.content.res.Resources;
 import android.graphics.Color;
 import android.graphics.drawable.StateListDrawable;
+import android.support.annotation.NonNull;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.annotation.UiThreadTest;
 import android.support.test.filters.LargeTest;
@@ -417,7 +418,7 @@
         }
 
         @Override
-        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
+        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                 int viewType) {
             final ViewHolder h = new ViewHolder(new TextView(parent.getContext()));
             h.mTextView.setMinimumHeight(128);
@@ -436,7 +437,7 @@
         }
 
         @Override
-        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
             holder.itemView.setTag("pos " + position);
         }
 
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFocusRecoveryTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFocusRecoveryTest.java
index 0354d53..0c7a54f 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFocusRecoveryTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFocusRecoveryTest.java
@@ -662,7 +662,7 @@
         final int TYPE_NO_FOCUS = 1001;
         TestAdapter adapter = new FocusTestAdapter(10) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 if (holder.getItemViewType() == TYPE_NO_FOCUS) {
@@ -706,7 +706,7 @@
 
         FocusTestAdapter adapter = new FocusTestAdapter(10) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 if (holder.getItemId() == toFocusId.get()) {
@@ -817,7 +817,7 @@
         }
 
         @Override
-        public FocusViewHolder onCreateViewHolder(ViewGroup parent,
+        public FocusViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                 int viewType) {
             final FocusViewHolder fvh;
             if (mFocusOnChild) {
@@ -832,7 +832,7 @@
         }
 
         @Override
-        public void onBindViewHolder(TestViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull TestViewHolder holder, int position) {
             cast(holder).bindTo(mItems.get(position));
         }
     }
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
index 3b7cac7..cffb24e 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
@@ -118,7 +118,7 @@
         final AtomicBoolean receivedOnRecycled = new AtomicBoolean(false);
         final TestAdapter adapter = new TestAdapter(20) {
             @Override
-            public void onViewRecycled(TestViewHolder holder) {
+            public void onViewRecycled(@NonNull TestViewHolder holder) {
                 super.onViewRecycled(holder);
                 if (receivedOnRecycled.getAndSet(true)) {
                     return;
@@ -505,7 +505,7 @@
 
         final TestAdapter adapter = new TestAdapter(2) {
             @Override
-            public void onViewRecycled(TestViewHolder holder) {
+            public void onViewRecycled(@NonNull TestViewHolder holder) {
                 // If the recycled holder is currently in the cache, then it's position in the
                 // adapter should be RecyclerView.NO_POSITION.
                 if (mRecyclerView.mRecycler.mCachedViews.contains(holder)) {
@@ -590,7 +590,7 @@
 
         final TestAdapter adapter = new TestAdapter(10) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder, int position) {
+            public void onBindViewHolder(@NonNull TestViewHolder holder, int position) {
                 // Only track the top 5 positions that are going to be cached and then reused.
                 if (position >= 5) {
                     // If we are in the first phase, put the items in the map, if we are in the
@@ -764,7 +764,7 @@
         final AtomicInteger detachCounter = new AtomicInteger(0);
         rv.setAdapter(new TestAdapter(10) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 holder.itemView.setFocusable(true);
@@ -779,7 +779,7 @@
             }
 
             @Override
-            public void onViewRecycled(TestViewHolder holder) {
+            public void onViewRecycled(@NonNull TestViewHolder holder) {
                 super.onViewRecycled(holder);
                 check.run();
             }
@@ -812,7 +812,7 @@
         mRecyclerView = rv;
         rv.setAdapter(new TestAdapter(10) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 holder.itemView.setFocusableInTouchMode(true);
@@ -1055,14 +1055,14 @@
         final int scrollY = 50;
         RecyclerView.Adapter adapter = new RecyclerView.Adapter() {
             @Override
-            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            public RecyclerView.ViewHolder onCreateViewHolder(
+                    @NonNull ViewGroup parent, int viewType) {
                 View view = new View(parent.getContext());
                 view.setScrollY(scrollY);
-                return new RecyclerView.ViewHolder(view) {
-                };
+                return new RecyclerView.ViewHolder(view) {};
             }
             @Override
-            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {}
+            public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {}
             @Override
             public int getItemCount() {
                 return 1;
@@ -1239,7 +1239,7 @@
         recyclerView.setLayoutManager(tlm);
         final TestAdapter adapter = new TestAdapter(10) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder, int position) {
+            public void onBindViewHolder(@NonNull TestViewHolder holder, int position) {
                 super.onBindViewHolder(holder, position);
                 holder.itemView.setFocusable(false);
                 holder.itemView.setFocusableInTouchMode(false);
@@ -1268,7 +1268,7 @@
         recyclerView.setLayoutManager(tlm);
         final TestAdapter adapter = new TestAdapter(10) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder, int position) {
+            public void onBindViewHolder(@NonNull TestViewHolder holder, int position) {
                 super.onBindViewHolder(holder, position);
                 holder.itemView.setFocusable(true);
                 holder.itemView.setFocusableInTouchMode(true);
@@ -2177,7 +2177,7 @@
         final List<View> recycled = new ArrayList<>();
         TestAdapter testAdapter = new TestAdapter(10) {
             @Override
-            public boolean onFailedToRecycleView(TestViewHolder holder) {
+            public boolean onFailedToRecycleView(@NonNull TestViewHolder holder) {
                 failedToRecycle.add(holder.itemView);
                 if (unsetTransientState) {
                     setHasTransientState(holder.itemView, false);
@@ -2186,7 +2186,7 @@
             }
 
             @Override
-            public void onViewRecycled(TestViewHolder holder) {
+            public void onViewRecycled(@NonNull TestViewHolder holder) {
                 recycled.add(holder.itemView);
                 super.onViewRecycled(holder);
             }
@@ -2343,13 +2343,13 @@
         TestAdapter adapter = new TestAdapter(10) {
             @Override
             public boolean onFailedToRecycleView(
-                    TestViewHolder holder) {
+                    @NonNull TestViewHolder holder) {
                 failedToRecycle.set(true);
                 return false;
             }
 
             @Override
-            public void onViewRecycled(TestViewHolder holder) {
+            public void onViewRecycled(@NonNull TestViewHolder holder) {
                 recycledViewCount.incrementAndGet();
                 super.onViewRecycled(holder);
             }
@@ -3191,7 +3191,7 @@
         recyclerView.setAdapter(testAdapter);
         recyclerView.setRecyclerListener(new RecyclerView.RecyclerListener() {
             @Override
-            public void onViewRecycled(RecyclerView.ViewHolder holder) {
+            public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
                 recycledViewCount.incrementAndGet();
             }
         });
@@ -4098,20 +4098,20 @@
     private TestAdapter2 createOwnerCheckingAdapter() {
         return new TestAdapter2(10) {
             @Override
-            public void onViewRecycled(TestViewHolder2 holder) {
+            public void onViewRecycled(@NonNull TestViewHolder2 holder) {
                 assertSame("on recycled should be called w/ the creator adapter", this,
                         holder.mData);
                 super.onViewRecycled(holder);
             }
 
             @Override
-            public void onBindViewHolder(TestViewHolder2 holder, int position) {
+            public void onBindViewHolder(@NonNull TestViewHolder2 holder, int position) {
                 super.onBindViewHolder(holder, position);
                 assertSame("on bind should be called w/ the creator adapter", this, holder.mData);
             }
 
             @Override
-            public TestViewHolder2 onCreateViewHolder(ViewGroup parent,
+            public TestViewHolder2 onCreateViewHolder(@NonNull ViewGroup parent,
                     int viewType) {
                 final TestViewHolder2 vh = super.onCreateViewHolder(parent, viewType);
                 vh.mData = this;
@@ -4123,7 +4123,7 @@
     private TestAdapter2 createBinderCheckingAdapter() {
         return new TestAdapter2(10) {
             @Override
-            public void onViewRecycled(TestViewHolder2 holder) {
+            public void onViewRecycled(@NonNull TestViewHolder2 holder) {
                 assertSame("on recycled should be called w/ the creator adapter", this,
                         holder.mData);
                 holder.mData = null;
@@ -4131,7 +4131,7 @@
             }
 
             @Override
-            public void onBindViewHolder(TestViewHolder2 holder, int position) {
+            public void onBindViewHolder(@NonNull TestViewHolder2 holder, int position) {
                 super.onBindViewHolder(holder, position);
                 holder.mData = this;
             }
@@ -4290,7 +4290,7 @@
             }
 
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 if (position >= layoutStart && position < invalidatedCount + layoutStart) {
@@ -4983,13 +4983,13 @@
         }
 
         @Override
-        public TestViewHolder2 onCreateViewHolder(ViewGroup parent,
+        public TestViewHolder2 onCreateViewHolder(@NonNull ViewGroup parent,
                 int viewType) {
             return new TestViewHolder2(new TextView(parent.getContext()));
         }
 
         @Override
-        public void onBindViewHolder(TestViewHolder2 holder, int position) {
+        public void onBindViewHolder(@NonNull TestViewHolder2 holder, int position) {
             final Item item = mItems.get(position);
             ((TextView) (holder.itemView)).setText(item.mText + "(" + item.mAdapterIndex + ")");
         }
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewOnGenericMotionEventTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewOnGenericMotionEventTest.java
index 2f80156..19e838e 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewOnGenericMotionEventTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewOnGenericMotionEventTest.java
@@ -20,6 +20,7 @@
 import static org.junit.Assert.assertNotEquals;
 
 import android.content.Context;
+import android.support.annotation.NonNull;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
@@ -186,12 +187,12 @@
         }
 
         @Override
-        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
             return new MockViewHolder(new TextView(parent.getContext()));
         }
 
         @Override
-        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
 
         }
 
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java
index 6a32572..4197df3 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java
@@ -33,6 +33,7 @@
 import android.os.Looper;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.support.annotation.NonNull;
 import android.support.test.filters.FlakyTest;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.Suppress;
@@ -95,7 +96,7 @@
         setupByConfig(mConfig.itemCount(5),
                 new GridTestAdapter(mConfig.mItemCount, mConfig.mOrientation) {
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder,
+                    public void onBindViewHolder(@NonNull TestViewHolder holder,
                             int position) {
                         super.onBindViewHolder(holder, position);
                         if (wrapContent) {
@@ -353,7 +354,7 @@
         final int totalSpace = mLayoutManager.mPrimaryOrientation.getTotalSpace();
         final TestAdapter newAdapter = new TestAdapter(100) {
             @Override
-            public void onBindViewHolder(TestViewHolder holder,
+            public void onBindViewHolder(@NonNull TestViewHolder holder,
                     int position) {
                 super.onBindViewHolder(holder, position);
                 if (mConfig.mOrientation == LinearLayoutManager.HORIZONTAL) {
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerTest.java
index cfc9c4e..8ed96e4 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerTest.java
@@ -38,6 +38,7 @@
 import android.graphics.drawable.StateListDrawable;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.support.annotation.NonNull;
 import android.support.test.filters.LargeTest;
 import android.support.v4.view.AccessibilityDelegateCompat;
 import android.text.TextUtils;
@@ -91,8 +92,10 @@
         setupByConfig(new Config(orientation, false, 1, GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS),
                 new GridTestAdapter(10, orientation) {
 
+                    @NonNull
                     @Override
-                    public TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+                    public TestViewHolder onCreateViewHolder(
+                            @NonNull ViewGroup parent, int viewType) {
                         View view = new View(parent.getContext());
                         StaggeredGridLayoutManager.LayoutParams layoutParams =
                                 new StaggeredGridLayoutManager.LayoutParams(
@@ -104,7 +107,7 @@
                     }
 
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder, int position) {
+                    public void onBindViewHolder(@NonNull TestViewHolder holder, int position) {
                         // No actual binding needed, but we need to override this to prevent default
                         // behavior of GridTestAdapter.
                     }
@@ -147,6 +150,7 @@
         });
         assertTrue(mRecyclerView.isLayoutRequested());
     }
+
     @Test
     public void areAllStartsTheSame() throws Throwable {
         setupByConfig(new Config(VERTICAL, false, 3, GAP_HANDLING_NONE).itemCount(300));
@@ -336,8 +340,10 @@
         setupByConfig(new Config(VERTICAL, false, 3, GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS),
                 new GridTestAdapter(1000, VERTICAL) {
 
+                    @NonNull
                     @Override
-                    public TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+                    public TestViewHolder onCreateViewHolder(
+                            @NonNull ViewGroup parent, int viewType) {
                         FrameLayout fl = new FrameLayout(parent.getContext());
                         EditText editText = new EditText(parent.getContext());
                         fl.addView(editText);
@@ -346,7 +352,7 @@
                     }
 
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder, int position) {
+                    public void onBindViewHolder(@NonNull TestViewHolder holder, int position) {
                         Item item = mItems.get(position);
                         holder.mBoundItem = item;
                         ((EditText) ((FrameLayout) holder.itemView).getChildAt(0)).setText(
@@ -397,7 +403,7 @@
                     RecyclerView mAttachedRv;
 
                     @Override
-                    public TestViewHolder onCreateViewHolder(ViewGroup parent,
+                    public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                             int viewType) {
                         TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                         testViewHolder.itemView.setFocusable(true);
@@ -418,7 +424,7 @@
                     }
 
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder,
+                    public void onBindViewHolder(@NonNull TestViewHolder holder,
                             int position) {
                         super.onBindViewHolder(holder, position);
                         holder.itemView.setMinimumHeight(mAttachedRv.getHeight() / 3);
@@ -490,7 +496,7 @@
                     RecyclerView mAttachedRv;
 
                     @Override
-                    public TestViewHolder onCreateViewHolder(ViewGroup parent,
+                    public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                             int viewType) {
                         TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                         testViewHolder.itemView.setFocusable(true);
@@ -511,7 +517,7 @@
                     }
 
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder,
+                    public void onBindViewHolder(@NonNull TestViewHolder holder,
                             int position) {
                         super.onBindViewHolder(holder, position);
                         RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) holder.itemView
@@ -604,7 +610,7 @@
                     RecyclerView mAttachedRv;
 
                     @Override
-                    public TestViewHolder onCreateViewHolder(ViewGroup parent,
+                    public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                             int viewType) {
                         TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                         testViewHolder.itemView.setFocusable(true);
@@ -625,7 +631,7 @@
                     }
 
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder,
+                    public void onBindViewHolder(@NonNull TestViewHolder holder,
                             int position) {
                         super.onBindViewHolder(holder, position);
                         RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) holder.itemView
@@ -719,7 +725,7 @@
                     RecyclerView mAttachedRv;
 
                     @Override
-                    public TestViewHolder onCreateViewHolder(ViewGroup parent,
+                    public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                             int viewType) {
                         TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                         testViewHolder.itemView.setFocusable(true);
@@ -740,7 +746,7 @@
                     }
 
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder,
+                    public void onBindViewHolder(@NonNull TestViewHolder holder,
                             int position) {
                         super.onBindViewHolder(holder, position);
                         RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) holder.itemView
@@ -827,7 +833,7 @@
                     RecyclerView mAttachedRv;
 
                     @Override
-                    public TestViewHolder onCreateViewHolder(ViewGroup parent,
+                    public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                             int viewType) {
                         TestViewHolder testViewHolder = super.onCreateViewHolder(parent, viewType);
                         testViewHolder.itemView.setFocusable(true);
@@ -848,7 +854,7 @@
                     }
 
                     @Override
-                    public void onBindViewHolder(TestViewHolder holder,
+                    public void onBindViewHolder(@NonNull TestViewHolder holder,
                             int position) {
                         super.onBindViewHolder(holder, position);
                         RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) holder.itemView
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/TestResizingRelayoutWithAutoMeasure.java b/v7/recyclerview/tests/src/android/support/v7/widget/TestResizingRelayoutWithAutoMeasure.java
index 9881653..6f99f35 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/TestResizingRelayoutWithAutoMeasure.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/TestResizingRelayoutWithAutoMeasure.java
@@ -188,13 +188,13 @@
         }
 
         @Override
-        public TestViewHolder onCreateViewHolder(ViewGroup parent,
+        public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                 int viewType) {
             return new TestViewHolder(new View(parent.getContext()));
         }
 
         @Override
-        public void onBindViewHolder(TestViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull TestViewHolder holder, int position) {
             holder.mBoundItem = new Item(position, "none");
             if (mMinItemHeight < 1 && mMinItemWidth < 1) {
                 return;
@@ -222,4 +222,4 @@
             return mSize;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/WrapContentBasicTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/WrapContentBasicTest.java
index 1947bc9..00d332a 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/WrapContentBasicTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/WrapContentBasicTest.java
@@ -22,6 +22,7 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.support.annotation.NonNull;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.MediumTest;
 import android.support.test.runner.AndroidJUnit4;
@@ -246,12 +247,12 @@
     public class WrapAdapter extends RecyclerView.Adapter {
 
         @Override
-        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
             return null;
         }
 
         @Override
-        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
 
         }
 
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/helper/ItemTouchHelperTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/helper/ItemTouchHelperTest.java
index 090ea69..99d1066 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/helper/ItemTouchHelperTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/helper/ItemTouchHelperTest.java
@@ -27,6 +27,7 @@
 import static org.junit.Assert.assertTrue;
 
 import android.os.Build;
+import android.support.annotation.NonNull;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.SdkSuppress;
 import android.support.test.filters.Suppress;
@@ -245,14 +246,15 @@
         }
 
         @Override
-        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
-                RecyclerView.ViewHolder target) {
+        public boolean onMove(@NonNull RecyclerView recyclerView,
+                @NonNull RecyclerView.ViewHolder viewHolder,
+                @NonNull RecyclerView.ViewHolder target) {
             mMoveRecordList.add(new MoveRecord(viewHolder, target));
             return true;
         }
 
         @Override
-        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
+        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
             mSwipeRecords.add(new SwipeRecord(viewHolder, direction));
         }
 
@@ -266,7 +268,8 @@
         }
 
         @Override
-        public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+        public void clearView(@NonNull RecyclerView recyclerView,
+                @NonNull RecyclerView.ViewHolder viewHolder) {
             super.clearView(recyclerView, viewHolder);
             mCleared.add(viewHolder);
         }
diff --git a/viewpager2/build.gradle b/viewpager2/build.gradle
index 2fee643..7f75d09 100644
--- a/viewpager2/build.gradle
+++ b/viewpager2/build.gradle
@@ -42,4 +42,4 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2017"
     description = "AndroidX Widget ViewPager2"
-}
\ No newline at end of file
+}
diff --git a/wear/Android.mk b/wear/Android.mk
deleted file mode 100644
index 9e5bf5b..0000000
--- a/wear/Android.mk
+++ /dev/null
@@ -1,55 +0,0 @@
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is a prebuilt library containing all the wearable stubs necessary for ambient mode
-include $(CLEAR_VARS)
-LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
-        prebuilt-com.google.android.wearable-stubs:wear_stubs/com.google.android.wearable-stubs.jar
-include $(BUILD_MULTI_PREBUILT)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-wear \
-#       android-support-core-ui \
-#       android-support-v7-recyclerview
-#
-# in their makefiles to include the resources and their dependencies in their package
-
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_AAPT2_ONLY := true
-LOCAL_MODULE := android-support-wear
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
-LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations
-LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-core-ui \
-    android-support-percent \
-    android-support-v7-recyclerview \
-    android-support-v4 \
-    android-support-constraint-layout
-LOCAL_STATIC_JAVA_LIBRARIES := \
-    prebuilt-com.google.android.wearable-stubs
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
diff --git a/wear/api/27.1.0.txt b/wear/api/27.1.0.txt
new file mode 100644
index 0000000..9c5a543
--- /dev/null
+++ b/wear/api/27.1.0.txt
@@ -0,0 +1,283 @@
+package android.support.wear.ambient {
+
+  public final deprecated class AmbientMode extends android.app.Fragment {
+    ctor public AmbientMode();
+    method public static <T extends android.app.Activity> android.support.wear.ambient.AmbientMode.AmbientController attachAmbientSupport(T);
+    field public static final java.lang.String EXTRA_BURN_IN_PROTECTION = "com.google.android.wearable.compat.extra.BURN_IN_PROTECTION";
+    field public static final java.lang.String EXTRA_LOWBIT_AMBIENT = "com.google.android.wearable.compat.extra.LOWBIT_AMBIENT";
+    field public static final java.lang.String FRAGMENT_TAG = "android.support.wearable.ambient.AmbientMode";
+  }
+
+  public static abstract class AmbientMode.AmbientCallback {
+    ctor public AmbientMode.AmbientCallback();
+    method public void onEnterAmbient(android.os.Bundle);
+    method public void onExitAmbient();
+    method public void onUpdateAmbient();
+  }
+
+  public static abstract interface AmbientMode.AmbientCallbackProvider {
+    method public abstract android.support.wear.ambient.AmbientMode.AmbientCallback getAmbientCallback();
+  }
+
+  public final class AmbientMode.AmbientController {
+    method public boolean isAmbient();
+  }
+
+  public final class AmbientModeSupport extends android.support.v4.app.Fragment {
+    ctor public AmbientModeSupport();
+    method public static <T extends android.support.v4.app.FragmentActivity> android.support.wear.ambient.AmbientModeSupport.AmbientController attach(T);
+    field public static final java.lang.String EXTRA_BURN_IN_PROTECTION = "com.google.android.wearable.compat.extra.BURN_IN_PROTECTION";
+    field public static final java.lang.String EXTRA_LOWBIT_AMBIENT = "com.google.android.wearable.compat.extra.LOWBIT_AMBIENT";
+    field public static final java.lang.String FRAGMENT_TAG = "android.support.wearable.ambient.AmbientMode";
+  }
+
+  public static abstract class AmbientModeSupport.AmbientCallback {
+    ctor public AmbientModeSupport.AmbientCallback();
+    method public void onEnterAmbient(android.os.Bundle);
+    method public void onExitAmbient();
+    method public void onUpdateAmbient();
+  }
+
+  public static abstract interface AmbientModeSupport.AmbientCallbackProvider {
+    method public abstract android.support.wear.ambient.AmbientModeSupport.AmbientCallback getAmbientCallback();
+  }
+
+  public final class AmbientModeSupport.AmbientController {
+    method public boolean isAmbient();
+  }
+
+}
+
+package android.support.wear.utils {
+
+  public class MetadataConstants {
+    method public static int getPreviewDrawableResourceId(android.content.Context, boolean);
+    method public static boolean isNotificationBridgingEnabled(android.content.Context);
+    method public static boolean isStandalone(android.content.Context);
+    field public static final java.lang.String NOTIFICATION_BRIDGE_MODE_BRIDGING = "BRIDGING";
+    field public static final java.lang.String NOTIFICATION_BRIDGE_MODE_METADATA_NAME = "com.google.android.wearable.notificationBridgeMode";
+    field public static final java.lang.String NOTIFICATION_BRIDGE_MODE_NO_BRIDGING = "NO_BRIDGING";
+    field public static final java.lang.String STANDALONE_METADATA_NAME = "com.google.android.wearable.standalone";
+    field public static final java.lang.String WATCH_FACE_PREVIEW_CIRCULAR_METADATA_NAME = "com.google.android.wearable.watchface.preview_circular";
+    field public static final java.lang.String WATCH_FACE_PREVIEW_METADATA_NAME = "com.google.android.wearable.watchface.preview";
+  }
+
+}
+
+package android.support.wear.widget {
+
+  public class BoxInsetLayout extends android.view.ViewGroup {
+    ctor public BoxInsetLayout(android.content.Context);
+    ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet);
+    ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet, int);
+    method public android.support.wear.widget.BoxInsetLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+  }
+
+  public static class BoxInsetLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
+    ctor public BoxInsetLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public BoxInsetLayout.LayoutParams(int, int);
+    ctor public BoxInsetLayout.LayoutParams(int, int, int);
+    ctor public BoxInsetLayout.LayoutParams(int, int, int, int);
+    ctor public BoxInsetLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public BoxInsetLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public BoxInsetLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
+    ctor public BoxInsetLayout.LayoutParams(android.support.wear.widget.BoxInsetLayout.LayoutParams);
+    field public static final int BOX_ALL = 15; // 0xf
+    field public static final int BOX_BOTTOM = 8; // 0x8
+    field public static final int BOX_LEFT = 1; // 0x1
+    field public static final int BOX_NONE = 0; // 0x0
+    field public static final int BOX_RIGHT = 4; // 0x4
+    field public static final int BOX_TOP = 2; // 0x2
+    field public int boxedEdges;
+  }
+
+  public class CircularProgressLayout extends android.widget.FrameLayout {
+    ctor public CircularProgressLayout(android.content.Context);
+    ctor public CircularProgressLayout(android.content.Context, android.util.AttributeSet);
+    ctor public CircularProgressLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public CircularProgressLayout(android.content.Context, android.util.AttributeSet, int, int);
+    method public int getBackgroundColor();
+    method public int[] getColorSchemeColors();
+    method public android.support.wear.widget.CircularProgressLayout.OnTimerFinishedListener getOnTimerFinishedListener();
+    method public android.support.v4.widget.CircularProgressDrawable getProgressDrawable();
+    method public float getStartingRotation();
+    method public float getStrokeWidth();
+    method public long getTotalTime();
+    method public boolean isIndeterminate();
+    method public boolean isTimerRunning();
+    method public void setColorSchemeColors(int...);
+    method public void setIndeterminate(boolean);
+    method public void setOnTimerFinishedListener(android.support.wear.widget.CircularProgressLayout.OnTimerFinishedListener);
+    method public void setStartingRotation(float);
+    method public void setStrokeWidth(float);
+    method public void setTotalTime(long);
+    method public void startTimer();
+    method public void stopTimer();
+  }
+
+  public static abstract interface CircularProgressLayout.OnTimerFinishedListener {
+    method public abstract void onTimerFinished(android.support.wear.widget.CircularProgressLayout);
+  }
+
+  public class CurvingLayoutCallback extends android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback {
+    ctor public CurvingLayoutCallback(android.content.Context);
+    method public void adjustAnchorOffsetXY(android.view.View, float[]);
+    method public void onLayoutFinished(android.view.View, android.support.v7.widget.RecyclerView);
+  }
+
+  public class RoundedDrawable extends android.graphics.drawable.Drawable {
+    ctor public RoundedDrawable();
+    method public void draw(android.graphics.Canvas);
+    method public int getBackgroundColor();
+    method public android.graphics.drawable.Drawable getDrawable();
+    method public int getOpacity();
+    method public int getRadius();
+    method public boolean isClipEnabled();
+    method public void setAlpha(int);
+    method public void setBackgroundColor(int);
+    method public void setClipEnabled(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setRadius(int);
+  }
+
+  public class SwipeDismissFrameLayout extends android.widget.FrameLayout {
+    ctor public SwipeDismissFrameLayout(android.content.Context);
+    ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet);
+    ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet, int, int);
+    method public void addCallback(android.support.wear.widget.SwipeDismissFrameLayout.Callback);
+    method public void removeCallback(android.support.wear.widget.SwipeDismissFrameLayout.Callback);
+  }
+
+  public static abstract class SwipeDismissFrameLayout.Callback {
+    ctor public SwipeDismissFrameLayout.Callback();
+    method public void onDismissed(android.support.wear.widget.SwipeDismissFrameLayout);
+    method public void onSwipeCanceled(android.support.wear.widget.SwipeDismissFrameLayout);
+    method public void onSwipeStarted(android.support.wear.widget.SwipeDismissFrameLayout);
+  }
+
+  public class WearableLinearLayoutManager extends android.support.v7.widget.LinearLayoutManager {
+    ctor public WearableLinearLayoutManager(android.content.Context, android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback);
+    ctor public WearableLinearLayoutManager(android.content.Context);
+    method public android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback getLayoutCallback();
+    method public void setLayoutCallback(android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback);
+  }
+
+  public static abstract class WearableLinearLayoutManager.LayoutCallback {
+    ctor public WearableLinearLayoutManager.LayoutCallback();
+    method public abstract void onLayoutFinished(android.view.View, android.support.v7.widget.RecyclerView);
+  }
+
+  public class WearableRecyclerView extends android.support.v7.widget.RecyclerView {
+    ctor public WearableRecyclerView(android.content.Context);
+    ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet);
+    ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet, int, int);
+    method public float getBezelFraction();
+    method public float getScrollDegreesPerScreen();
+    method public boolean isCircularScrollingGestureEnabled();
+    method public boolean isEdgeItemsCenteringEnabled();
+    method public void setBezelFraction(float);
+    method public void setCircularScrollingGestureEnabled(boolean);
+    method public void setEdgeItemsCenteringEnabled(boolean);
+    method public void setScrollDegreesPerScreen(float);
+  }
+
+}
+
+package android.support.wear.widget.drawer {
+
+  public class WearableActionDrawerView extends android.support.wear.widget.drawer.WearableDrawerView {
+    ctor public WearableActionDrawerView(android.content.Context);
+    ctor public WearableActionDrawerView(android.content.Context, android.util.AttributeSet);
+    ctor public WearableActionDrawerView(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableActionDrawerView(android.content.Context, android.util.AttributeSet, int, int);
+    method public android.view.Menu getMenu();
+    method public void setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener);
+    method public void setTitle(java.lang.CharSequence);
+  }
+
+  public class WearableDrawerController {
+    method public void closeDrawer();
+    method public void openDrawer();
+    method public void peekDrawer();
+  }
+
+  public class WearableDrawerLayout extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingParent android.view.View.OnLayoutChangeListener {
+    ctor public WearableDrawerLayout(android.content.Context);
+    ctor public WearableDrawerLayout(android.content.Context, android.util.AttributeSet);
+    ctor public WearableDrawerLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableDrawerLayout(android.content.Context, android.util.AttributeSet, int, int);
+    method public void onFlingComplete(android.view.View);
+    method public void onLayoutChange(android.view.View, int, int, int, int, int, int, int, int);
+    method public void setDrawerStateCallback(android.support.wear.widget.drawer.WearableDrawerLayout.DrawerStateCallback);
+  }
+
+  public static class WearableDrawerLayout.DrawerStateCallback {
+    ctor public WearableDrawerLayout.DrawerStateCallback();
+    method public void onDrawerClosed(android.support.wear.widget.drawer.WearableDrawerLayout, android.support.wear.widget.drawer.WearableDrawerView);
+    method public void onDrawerOpened(android.support.wear.widget.drawer.WearableDrawerLayout, android.support.wear.widget.drawer.WearableDrawerView);
+    method public void onDrawerStateChanged(android.support.wear.widget.drawer.WearableDrawerLayout, int);
+  }
+
+  public class WearableDrawerView extends android.widget.FrameLayout {
+    ctor public WearableDrawerView(android.content.Context);
+    ctor public WearableDrawerView(android.content.Context, android.util.AttributeSet);
+    ctor public WearableDrawerView(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableDrawerView(android.content.Context, android.util.AttributeSet, int, int);
+    method public android.support.wear.widget.drawer.WearableDrawerController getController();
+    method public android.view.View getDrawerContent();
+    method public int getDrawerState();
+    method public boolean isAutoPeekEnabled();
+    method public boolean isClosed();
+    method public boolean isLocked();
+    method public boolean isLockedWhenClosed();
+    method public boolean isOpenOnlyAtTopEnabled();
+    method public boolean isOpened();
+    method public boolean isPeekOnScrollDownEnabled();
+    method public boolean isPeeking();
+    method public void onDrawerClosed();
+    method public void onDrawerOpened();
+    method public void onDrawerStateChanged(int);
+    method public void onPeekContainerClicked(android.view.View);
+    method public void setDrawerContent(android.view.View);
+    method public void setIsAutoPeekEnabled(boolean);
+    method public void setIsLocked(boolean);
+    method public void setLockedWhenClosed(boolean);
+    method public void setOpenOnlyAtTopEnabled(boolean);
+    method public void setPeekContent(android.view.View);
+    method public void setPeekOnScrollDownEnabled(boolean);
+    field public static final int STATE_DRAGGING = 1; // 0x1
+    field public static final int STATE_IDLE = 0; // 0x0
+    field public static final int STATE_SETTLING = 2; // 0x2
+  }
+
+  public class WearableNavigationDrawerView extends android.support.wear.widget.drawer.WearableDrawerView {
+    ctor public WearableNavigationDrawerView(android.content.Context);
+    ctor public WearableNavigationDrawerView(android.content.Context, android.util.AttributeSet);
+    ctor public WearableNavigationDrawerView(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableNavigationDrawerView(android.content.Context, android.util.AttributeSet, int, int);
+    method public void addOnItemSelectedListener(android.support.wear.widget.drawer.WearableNavigationDrawerView.OnItemSelectedListener);
+    method public int getNavigationStyle();
+    method public void removeOnItemSelectedListener(android.support.wear.widget.drawer.WearableNavigationDrawerView.OnItemSelectedListener);
+    method public void setAdapter(android.support.wear.widget.drawer.WearableNavigationDrawerView.WearableNavigationDrawerAdapter);
+    method public void setCurrentItem(int, boolean);
+    field public static final int MULTI_PAGE = 1; // 0x1
+    field public static final int SINGLE_PAGE = 0; // 0x0
+  }
+
+  public static abstract interface WearableNavigationDrawerView.OnItemSelectedListener {
+    method public abstract void onItemSelected(int);
+  }
+
+  public static abstract class WearableNavigationDrawerView.WearableNavigationDrawerAdapter {
+    ctor public WearableNavigationDrawerView.WearableNavigationDrawerAdapter();
+    method public abstract int getCount();
+    method public abstract android.graphics.drawable.Drawable getItemDrawable(int);
+    method public abstract java.lang.CharSequence getItemText(int);
+    method public void notifyDataSetChanged();
+  }
+
+}
+
diff --git a/wear/tests/src/android/support/wear/ambient/AmbientModeSupportResumeTest.java b/wear/src/androidTest/java/android/support/wear/ambient/AmbientModeSupportResumeTest.java
similarity index 100%
rename from wear/tests/src/android/support/wear/ambient/AmbientModeSupportResumeTest.java
rename to wear/src/androidTest/java/android/support/wear/ambient/AmbientModeSupportResumeTest.java
diff --git a/wear/tests/src/android/support/wear/ambient/AmbientModeSupportResumeTestActivity.java b/wear/src/androidTest/java/android/support/wear/ambient/AmbientModeSupportResumeTestActivity.java
similarity index 100%
rename from wear/tests/src/android/support/wear/ambient/AmbientModeSupportResumeTestActivity.java
rename to wear/src/androidTest/java/android/support/wear/ambient/AmbientModeSupportResumeTestActivity.java
diff --git a/wear/tests/src/android/support/wear/ambient/AmbientModeSupportTest.java b/wear/src/androidTest/java/android/support/wear/ambient/AmbientModeSupportTest.java
similarity index 100%
rename from wear/tests/src/android/support/wear/ambient/AmbientModeSupportTest.java
rename to wear/src/androidTest/java/android/support/wear/ambient/AmbientModeSupportTest.java
diff --git a/wear/tests/src/android/support/wear/ambient/AmbientModeSupportTestActivity.java b/wear/src/androidTest/java/android/support/wear/ambient/AmbientModeSupportTestActivity.java
similarity index 100%
rename from wear/tests/src/android/support/wear/ambient/AmbientModeSupportTestActivity.java
rename to wear/src/androidTest/java/android/support/wear/ambient/AmbientModeSupportTestActivity.java
