Merge "Unregister listener before car disconnection." into pi-preview1-androidx-dev
am: cacaa2bfce

Change-Id: I8fbfb1c939f9e52bfda7f6d101157a9830d841cd
diff --git a/adding-support-library-as-included-build.md b/adding-support-library-as-included-build.md
index 136929f..b77233e 100644
--- a/adding-support-library-as-included-build.md
+++ b/adding-support-library-as-included-build.md
@@ -1,5 +1,8 @@
 # Adding the Support Library Build Within Another Build
 
+Sorry, this doesn't seem to be working at the moment.
+For now, run `./gradlew createArchive` and copy the output to where your project can use it, as described fuller in go/support-dev
+
 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?
diff --git a/app-toolkit/settings.gradle b/app-toolkit/settings.gradle
index d065af0..ea455a0 100644
--- a/app-toolkit/settings.gradle
+++ b/app-toolkit/settings.gradle
@@ -59,6 +59,7 @@
 includeProject(":lifecycle:lifecycle-livedata-core", new File(supportRoot, "lifecycle/livedata-core"))
 includeProject(":lifecycle:lifecycle-livedata", new File(supportRoot, "lifecycle/livedata"))
 includeProject(":lifecycle:lifecycle-reactivestreams", new File(supportRoot, "lifecycle/reactivestreams"))
+includeProject(":lifecycle:lifecycle-reactivestreams-ktx", new File(supportRoot, "lifecycle/reactivestreams/ktx"))
 includeProject(":lifecycle:lifecycle-runtime", new File(supportRoot, "lifecycle/runtime"))
 includeProject(":lifecycle:lifecycle-viewmodel", new File(supportRoot, "lifecycle/viewmodel"))
 includeProject(":paging:integration-tests:testapp", new File(supportRoot, "paging/integration-tests/testapp"))
@@ -76,6 +77,7 @@
 includeProject(":room:room-testing", new File(supportRoot, "room/testing"))
 includeProject(":sqlite:sqlite", new File(supportRoot, "persistence/db"))
 includeProject(":sqlite:sqlite-framework", new File(supportRoot, "persistence/db-framework"))
+includeProject(":sqlite:sqlite-ktx", new File(supportRoot, "persistence/db/ktx"))
 
 includeProject(":jetifier-core", new File(supportRoot, "jetifier/jetifier/core"))
 includeProject(":jetifier-processor", new File(supportRoot, "jetifier/jetifier/processor"))
diff --git a/car/build.gradle b/car/build.gradle
index 7cd9e53..52d2a40 100644
--- a/car/build.gradle
+++ b/car/build.gradle
@@ -47,7 +47,7 @@
 
 supportLibrary {
     name = "Android Car Support UI"
-    publish = false
+    publish = true
     mavenVersion = LibraryVersions.SUPPORT_LIBRARY
     mavenGroup = LibraryGroups.CAR
     inceptionYear = "2017"
diff --git a/car/res/values-af/strings.xml b/car/res/values-af/strings.xml
index f307fc7..1e90b40 100644
--- a/car/res/values-af/strings.xml
+++ b/car/res/values-af/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Konsentreer op die pad"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Vou knoppie in/uit"</string>
 </resources>
diff --git a/car/res/values-am/strings.xml b/car/res/values-am/strings.xml
index 30ae48e..6759ee3 100644
--- a/car/res/values-am/strings.xml
+++ b/car/res/values-am/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"መንገዱ ላይ ያተኩሩ"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"አዝራርን ዘርጋ/ሰብስብ"</string>
 </resources>
diff --git a/car/res/values-ar/strings.xml b/car/res/values-ar/strings.xml
index e970ed9..845908b 100644
--- a/car/res/values-ar/strings.xml
+++ b/car/res/values-ar/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"ركِّز في الطريق"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"زر التوسيع/التصغير"</string>
 </resources>
diff --git a/car/res/values-as/strings.xml b/car/res/values-as/strings.xml
new file mode 100644
index 0000000..e5a0015
--- /dev/null
+++ b/car/res/values-as/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="speed_bump_lockout_message" msgid="5405697774899378511">"ৰাষ্টাত মনোযোগ দিয়ক"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"সম্প্ৰসাৰণ/সংকোচন বুটাম"</string>
+</resources>
diff --git a/car/res/values-az/strings.xml b/car/res/values-az/strings.xml
index e813849..b5e25dc 100644
--- a/car/res/values-az/strings.xml
+++ b/car/res/values-az/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Diqqətinizi yola yönəldin"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Düyməni genişləndirin/yığcamlaşdırın"</string>
 </resources>
diff --git a/car/res/values-b+sr+Latn/strings.xml b/car/res/values-b+sr+Latn/strings.xml
index a83a82c..43dbac2 100644
--- a/car/res/values-b+sr+Latn/strings.xml
+++ b/car/res/values-b+sr+Latn/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Fokusirajte se na put"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Dugme Proširi/skupi"</string>
 </resources>
diff --git a/car/res/values-be/strings.xml b/car/res/values-be/strings.xml
index 80912e4..cfef873 100644
--- a/car/res/values-be/strings.xml
+++ b/car/res/values-be/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Увага на дарогу"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Кнопка \"Разгарнуць/згарнуць\""</string>
 </resources>
diff --git a/car/res/values-bg/strings.xml b/car/res/values-bg/strings.xml
index dd5811f..49e7a61 100644
--- a/car/res/values-bg/strings.xml
+++ b/car/res/values-bg/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Съсредоточете се върху пътя"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Бутон за разгъване/свиване"</string>
 </resources>
diff --git a/car/res/values-bn/strings.xml b/car/res/values-bn/strings.xml
index fcf0165..4ab2ca4 100644
--- a/car/res/values-bn/strings.xml
+++ b/car/res/values-bn/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"মনোযোগ দিয়ে গাড়ি চালান"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"বোতাম বড় করুন/আড়াল করুন"</string>
 </resources>
diff --git a/car/res/values-bs/strings.xml b/car/res/values-bs/strings.xml
index 99e655e..6ff5714 100644
--- a/car/res/values-bs/strings.xml
+++ b/car/res/values-bs/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Fokusirajte se na cestu"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Dugme proširi/suzi"</string>
 </resources>
diff --git a/car/res/values-ca/strings.xml b/car/res/values-ca/strings.xml
index 758f6e7..8e20fd8 100644
--- a/car/res/values-ca/strings.xml
+++ b/car/res/values-ca/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Concentra\'t en la carretera"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Botó per desplegar o replegar"</string>
 </resources>
diff --git a/car/res/values-cs/strings.xml b/car/res/values-cs/strings.xml
index 27090ef..1b4cad2 100644
--- a/car/res/values-cs/strings.xml
+++ b/car/res/values-cs/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Soustřeďte se na silnici"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Tlačítko rozbalení/sbalení"</string>
 </resources>
diff --git a/car/res/values-da/strings.xml b/car/res/values-da/strings.xml
index 96cc062..4a0e180 100644
--- a/car/res/values-da/strings.xml
+++ b/car/res/values-da/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Hold øjnene på vejen"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Knappen Udvid/skjul"</string>
 </resources>
diff --git a/car/res/values-de/strings.xml b/car/res/values-de/strings.xml
index ee289ac..f670bd6 100644
--- a/car/res/values-de/strings.xml
+++ b/car/res/values-de/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Achte auf den Verkehr"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Schaltfläche zum Maximieren/Minimieren"</string>
 </resources>
diff --git a/car/res/values-el/strings.xml b/car/res/values-el/strings.xml
index cf8ab8f..4010875 100644
--- a/car/res/values-el/strings.xml
+++ b/car/res/values-el/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Επικεντρωθείτε στον δρόμο"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Κουμπί ανάπτυξης/σύμπτυξης"</string>
 </resources>
diff --git a/car/res/values-en-rAU/strings.xml b/car/res/values-en-rAU/strings.xml
index 8cc3360..a307f7e 100644
--- a/car/res/values-en-rAU/strings.xml
+++ b/car/res/values-en-rAU/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Focus on the road"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Expand/collapse button"</string>
 </resources>
diff --git a/car/res/values-en-rCA/strings.xml b/car/res/values-en-rCA/strings.xml
index 8cc3360..a307f7e 100644
--- a/car/res/values-en-rCA/strings.xml
+++ b/car/res/values-en-rCA/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Focus on the road"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Expand/collapse button"</string>
 </resources>
diff --git a/car/res/values-en-rGB/strings.xml b/car/res/values-en-rGB/strings.xml
index 8cc3360..a307f7e 100644
--- a/car/res/values-en-rGB/strings.xml
+++ b/car/res/values-en-rGB/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Focus on the road"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Expand/collapse button"</string>
 </resources>
diff --git a/car/res/values-en-rIN/strings.xml b/car/res/values-en-rIN/strings.xml
index 8cc3360..a307f7e 100644
--- a/car/res/values-en-rIN/strings.xml
+++ b/car/res/values-en-rIN/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Focus on the road"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Expand/collapse button"</string>
 </resources>
diff --git a/car/res/values-en-rXC/strings.xml b/car/res/values-en-rXC/strings.xml
index c11c1cb..16d0daf 100644
--- a/car/res/values-en-rXC/strings.xml
+++ b/car/res/values-en-rXC/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‎‏‏‏‎‎‏‎‏‎‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‏‎‎‏‏‏‏‎Focus on the road‎‏‎‎‏‎"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‎‏‏‏‎‏‏‏‎‎‏‎‎‎‎‏‎‎‏‎‎‏‎‏‎‏‏‎‎‎‏‎‎‏‎‎‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‎‎‎Expand/collapse button‎‏‎‎‏‎"</string>
 </resources>
diff --git a/car/res/values-es-rUS/strings.xml b/car/res/values-es-rUS/strings.xml
index 6ac20d7..46a5e11 100644
--- a/car/res/values-es-rUS/strings.xml
+++ b/car/res/values-es-rUS/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Concéntrate en el camino"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Botón Expandir/contraer"</string>
 </resources>
diff --git a/car/res/values-es/strings.xml b/car/res/values-es/strings.xml
index 09a493f..33ed10b 100644
--- a/car/res/values-es/strings.xml
+++ b/car/res/values-es/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Céntrate en la carretera"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Botón para mostrar u ocultar"</string>
 </resources>
diff --git a/car/res/values-et/strings.xml b/car/res/values-et/strings.xml
index 66f6e48..7561817 100644
--- a/car/res/values-et/strings.xml
+++ b/car/res/values-et/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Keskenduge teele"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Nupp Laienda/Ahenda"</string>
 </resources>
diff --git a/car/res/values-eu/strings.xml b/car/res/values-eu/strings.xml
index 3773f71..0e92575 100644
--- a/car/res/values-eu/strings.xml
+++ b/car/res/values-eu/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Jarri arreta errepidean"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Zabaltzeko/Tolesteko botoia"</string>
 </resources>
diff --git a/car/res/values-fa/strings.xml b/car/res/values-fa/strings.xml
index 8668d6b..59152f0 100644
--- a/car/res/values-fa/strings.xml
+++ b/car/res/values-fa/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"روی جاده تمرکز داشته باشید"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"دکمه بزرگ کردن/کوچک کردن"</string>
 </resources>
diff --git a/car/res/values-fi/strings.xml b/car/res/values-fi/strings.xml
index e93cb9c..5bbb440 100644
--- a/car/res/values-fi/strings.xml
+++ b/car/res/values-fi/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Pidä katse tiessä"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Laajennus- ja tiivistyspainike"</string>
 </resources>
diff --git a/car/res/values-fr-rCA/strings.xml b/car/res/values-fr-rCA/strings.xml
index f32315b..e90ddf2 100644
--- a/car/res/values-fr-rCA/strings.xml
+++ b/car/res/values-fr-rCA/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Concentrez-vous sur la route"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Bouton Développer/Réduire"</string>
 </resources>
diff --git a/car/res/values-fr/strings.xml b/car/res/values-fr/strings.xml
index f32315b..e90ddf2 100644
--- a/car/res/values-fr/strings.xml
+++ b/car/res/values-fr/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Concentrez-vous sur la route"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Bouton Développer/Réduire"</string>
 </resources>
diff --git a/car/res/values-gl/strings.xml b/car/res/values-gl/strings.xml
index 42bc515..c89cc35 100644
--- a/car/res/values-gl/strings.xml
+++ b/car/res/values-gl/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Céntrate na estrada"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Botón despregar/contraer"</string>
 </resources>
diff --git a/car/res/values-gu/strings.xml b/car/res/values-gu/strings.xml
index f215ec2..4397f5d 100644
--- a/car/res/values-gu/strings.xml
+++ b/car/res/values-gu/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"રસ્તા પર ફોકસ કરો"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"વિસ્તાર કરો/સંકુચિત કરો બટન"</string>
 </resources>
diff --git a/car/res/values-hi/strings.xml b/car/res/values-hi/strings.xml
index 53f8a8d..08d973b 100644
--- a/car/res/values-hi/strings.xml
+++ b/car/res/values-hi/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"सड़क पर ध्यान दें"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"बड़ा/छोटा करने वाला बटन"</string>
 </resources>
diff --git a/car/res/values-hr/strings.xml b/car/res/values-hr/strings.xml
index 0a08dcc..5714327 100644
--- a/car/res/values-hr/strings.xml
+++ b/car/res/values-hr/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Usredotočite se na cestu"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Gumb za proširivanje/sažimanje"</string>
 </resources>
diff --git a/car/res/values-hu/strings.xml b/car/res/values-hu/strings.xml
index 3618719..88c2577 100644
--- a/car/res/values-hu/strings.xml
+++ b/car/res/values-hu/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Figyeljen az útra"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Gomb kibontása/összecsukása"</string>
 </resources>
diff --git a/car/res/values-hy/strings.xml b/car/res/values-hy/strings.xml
index 3a85b41..d97cd0a 100644
--- a/car/res/values-hy/strings.xml
+++ b/car/res/values-hy/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Հետևեք ճանապարհին"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"«Ծավալել/ծալել» կոճակ"</string>
 </resources>
diff --git a/car/res/values-in/strings.xml b/car/res/values-in/strings.xml
index 81daf29..faf2f43 100644
--- a/car/res/values-in/strings.xml
+++ b/car/res/values-in/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Konsentrasi saat mengemudi"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Tombol luaskan/ciutkan"</string>
 </resources>
diff --git a/car/res/values-is/strings.xml b/car/res/values-is/strings.xml
index 4b5d26d..7c2dd76 100644
--- a/car/res/values-is/strings.xml
+++ b/car/res/values-is/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Einbeittu þér að akstrinum"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Hnappur til að stækka/minnka"</string>
 </resources>
diff --git a/car/res/values-it/strings.xml b/car/res/values-it/strings.xml
index b395409..d2b3f4f 100644
--- a/car/res/values-it/strings.xml
+++ b/car/res/values-it/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Concentrati sulla strada"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Pulsante Espandi/Comprimi"</string>
 </resources>
diff --git a/car/res/values-iw/strings.xml b/car/res/values-iw/strings.xml
index ab92be5..79bad9c 100644
--- a/car/res/values-iw/strings.xml
+++ b/car/res/values-iw/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"עליך להתמקד בכביש"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"לחצן הרחבה וכיווץ"</string>
 </resources>
diff --git a/car/res/values-ja/strings.xml b/car/res/values-ja/strings.xml
index 89fce3b..87deba0 100644
--- a/car/res/values-ja/strings.xml
+++ b/car/res/values-ja/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"運転に集中してください"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"展開 / 折りたたみボタン"</string>
 </resources>
diff --git a/car/res/values-ka/strings.xml b/car/res/values-ka/strings.xml
index e3f2e07..b525a9b 100644
--- a/car/res/values-ka/strings.xml
+++ b/car/res/values-ka/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"კონცენტრირდით გზაზე"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"ღილაკის გაფართოება/ჩაკეცვა"</string>
 </resources>
diff --git a/car/res/values-kk/strings.xml b/car/res/values-kk/strings.xml
index bbccd56..ff327d3 100644
--- a/car/res/values-kk/strings.xml
+++ b/car/res/values-kk/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Жолға назар аударыңыз"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"\"Жаю/Жию\" түймесі"</string>
 </resources>
diff --git a/car/res/values-km/strings.xml b/car/res/values-km/strings.xml
index 50fe2db..f9d9111 100644
--- a/car/res/values-km/strings.xml
+++ b/car/res/values-km/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"ផ្តោតលើ​ការបើកបរ"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"ប៊ូតុង​ពង្រីក/បង្រួម"</string>
 </resources>
diff --git a/car/res/values-kn/strings.xml b/car/res/values-kn/strings.xml
index 6562ee2..50ba985 100644
--- a/car/res/values-kn/strings.xml
+++ b/car/res/values-kn/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"ರಸ್ತೆಯ ಮೇಲೆ ಗಮನಹರಿಸಿ"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"ವಿಸ್ತರಿಸಿ/ಕುಗ್ಗಿಸಿ ಬಟನ್"</string>
 </resources>
diff --git a/car/res/values-ko/strings.xml b/car/res/values-ko/strings.xml
index ac5865a..0081b5c 100644
--- a/car/res/values-ko/strings.xml
+++ b/car/res/values-ko/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"도로 상황에 집중하세요."</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"펼치기/접기 버튼"</string>
 </resources>
diff --git a/car/res/values-ky/strings.xml b/car/res/values-ky/strings.xml
index 3640239..8a752fa 100644
--- a/car/res/values-ky/strings.xml
+++ b/car/res/values-ky/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Жолго көңүл буруңуз"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Жайып көрсөтүү/жыйыштыруу баскычы"</string>
 </resources>
diff --git a/car/res/values-lo/strings.xml b/car/res/values-lo/strings.xml
index 4af3152..02afe60 100644
--- a/car/res/values-lo/strings.xml
+++ b/car/res/values-lo/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"ຕັ້ງໃຈຂັບລົດ"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"ປຸ່ມຫຍໍ້/ຂະຫຍາຍ"</string>
 </resources>
diff --git a/car/res/values-lt/strings.xml b/car/res/values-lt/strings.xml
index 685bbe5..5281e18 100644
--- a/car/res/values-lt/strings.xml
+++ b/car/res/values-lt/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Sutelkite dėmesį į kelią"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Mygtukas „Išskleisti / sutraukti“"</string>
 </resources>
diff --git a/car/res/values-lv/strings.xml b/car/res/values-lv/strings.xml
index 417d331..7b4372b 100644
--- a/car/res/values-lv/strings.xml
+++ b/car/res/values-lv/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Pievērsieties autovadīšanai"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Izvēršanas/sakļaušanas poga"</string>
 </resources>
diff --git a/car/res/values-mk/strings.xml b/car/res/values-mk/strings.xml
index 7377299..5184503 100644
--- a/car/res/values-mk/strings.xml
+++ b/car/res/values-mk/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Фокусирајте се на патот"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Копче за проширување/собирање"</string>
 </resources>
diff --git a/car/res/values-ml/strings.xml b/car/res/values-ml/strings.xml
index d5ad91d..8047b4c 100644
--- a/car/res/values-ml/strings.xml
+++ b/car/res/values-ml/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"റോഡിൽ ശ്രദ്ധിക്കുക"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"വികസിപ്പിക്കുക/ചുരുക്കുക ബട്ടൺ"</string>
 </resources>
diff --git a/car/res/values-mn/strings.xml b/car/res/values-mn/strings.xml
index 4b249a4..a8ef13c 100644
--- a/car/res/values-mn/strings.xml
+++ b/car/res/values-mn/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Зам дээр төвлөрөх"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Дэлгэх/буулгах товчлуур"</string>
 </resources>
diff --git a/car/res/values-mr/strings.xml b/car/res/values-mr/strings.xml
index c79f3f3..3032c97 100644
--- a/car/res/values-mr/strings.xml
+++ b/car/res/values-mr/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"रस्त्यावर फोकस करा"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"बटण विस्‍तृत करा/कोलॅप्‍स करा"</string>
 </resources>
diff --git a/car/res/values-ms/strings.xml b/car/res/values-ms/strings.xml
index d209113..301f7eb 100644
--- a/car/res/values-ms/strings.xml
+++ b/car/res/values-ms/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Beri tumpuan pada jalan raya"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Butang kembangkan/runtuhkan"</string>
 </resources>
diff --git a/car/res/values-my/strings.xml b/car/res/values-my/strings.xml
index 438729a..f5317f7 100644
--- a/car/res/values-my/strings.xml
+++ b/car/res/values-my/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"လမ်းကို အာရုံစိုက်ရန်"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"ချဲ့ရန်/ခေါက်သိမ်းရန် ခလုတ်"</string>
 </resources>
diff --git a/car/res/values-nb/strings.xml b/car/res/values-nb/strings.xml
index eb3a144..e4c4810 100644
--- a/car/res/values-nb/strings.xml
+++ b/car/res/values-nb/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Fokuser på veien"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Vis/skjul-knapp"</string>
 </resources>
diff --git a/car/res/values-ne/strings.xml b/car/res/values-ne/strings.xml
index d066c0b..c4499b8 100644
--- a/car/res/values-ne/strings.xml
+++ b/car/res/values-ne/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"सडकमा ध्यान केन्द्रित गर्नु…"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"विस्तृत/संक्षिप्त गर्ने बटन"</string>
 </resources>
diff --git a/car/res/values-nl/strings.xml b/car/res/values-nl/strings.xml
index 7fcb11e..de08f63 100644
--- a/car/res/values-nl/strings.xml
+++ b/car/res/values-nl/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Houd je aandacht op de weg"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Knop voor uitvouwen/samenvouwen"</string>
 </resources>
diff --git a/car/res/values-or/strings.xml b/car/res/values-or/strings.xml
new file mode 100644
index 0000000..3a003b8
--- /dev/null
+++ b/car/res/values-or/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="speed_bump_lockout_message" msgid="5405697774899378511">"ରାସ୍ତା ଉପରେ ଧ୍ୟାନରଖନ୍ତୁ"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"ବିସ୍ତାର/ସଂକୋଚନ ବଟନ୍"</string>
+</resources>
diff --git a/car/res/values-pa/strings.xml b/car/res/values-pa/strings.xml
index 137bd2a..63a19f3 100644
--- a/car/res/values-pa/strings.xml
+++ b/car/res/values-pa/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"ਸੜਕ \'ਤੇ ਧਿਆਨ ਦਿਓ"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"ਵਿਸਤਾਰ ਕਰੋ/ਸਮੇਟੋ ਬਟਨ"</string>
 </resources>
diff --git a/car/res/values-pl/strings.xml b/car/res/values-pl/strings.xml
index c5aa323..133d27e 100644
--- a/car/res/values-pl/strings.xml
+++ b/car/res/values-pl/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Skup się na drodze"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Przycisk zwijania/rozwijania"</string>
 </resources>
diff --git a/car/res/values-pt-rBR/strings.xml b/car/res/values-pt-rBR/strings.xml
index a6c515a..6c6e459 100644
--- a/car/res/values-pt-rBR/strings.xml
+++ b/car/res/values-pt-rBR/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Foco na estrada"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Botão \"Expandir/Recolher\""</string>
 </resources>
diff --git a/car/res/values-pt-rPT/strings.xml b/car/res/values-pt-rPT/strings.xml
index 2338efe..911b120 100644
--- a/car/res/values-pt-rPT/strings.xml
+++ b/car/res/values-pt-rPT/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Concentre-se na estrada."</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Botão Expandir/reduzir"</string>
 </resources>
diff --git a/car/res/values-pt/strings.xml b/car/res/values-pt/strings.xml
index a6c515a..6c6e459 100644
--- a/car/res/values-pt/strings.xml
+++ b/car/res/values-pt/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Foco na estrada"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Botão \"Expandir/Recolher\""</string>
 </resources>
diff --git a/car/res/values-ro/strings.xml b/car/res/values-ro/strings.xml
index 20cc3e7..7fe204a 100644
--- a/car/res/values-ro/strings.xml
+++ b/car/res/values-ro/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Concentrați-vă asupra drumului"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Butonul de extindere/restrângere"</string>
 </resources>
diff --git a/car/res/values-ru/strings.xml b/car/res/values-ru/strings.xml
index 198f7fa..6554dc3 100644
--- a/car/res/values-ru/strings.xml
+++ b/car/res/values-ru/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Следите за дорогой"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Кнопка \"Развернуть/свернуть\""</string>
 </resources>
diff --git a/car/res/values-si/strings.xml b/car/res/values-si/strings.xml
index 530c12a..48977bd 100644
--- a/car/res/values-si/strings.xml
+++ b/car/res/values-si/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"මාර්ගයට අවධානය යොමු කරන්න"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"දිග හැරීමේ/හැකිළීමේ බොත්තම"</string>
 </resources>
diff --git a/car/res/values-sk/strings.xml b/car/res/values-sk/strings.xml
index a959d09..d8175c4 100644
--- a/car/res/values-sk/strings.xml
+++ b/car/res/values-sk/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Sústreďte sa na cestu"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Tlačidlo rozbalenia/zbalenia"</string>
 </resources>
diff --git a/car/res/values-sl/strings.xml b/car/res/values-sl/strings.xml
index c0a8164..85f2602 100644
--- a/car/res/values-sl/strings.xml
+++ b/car/res/values-sl/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Glejte na cesto"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Gumb za razširitev/strnitev"</string>
 </resources>
diff --git a/car/res/values-sq/strings.xml b/car/res/values-sq/strings.xml
index c8c91ef..87cb023 100644
--- a/car/res/values-sq/strings.xml
+++ b/car/res/values-sq/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Përqendrohu te rruga"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Butoni i zgjerimit/palosjes"</string>
 </resources>
diff --git a/car/res/values-sr/strings.xml b/car/res/values-sr/strings.xml
index d7a6b85..d3fe526 100644
--- a/car/res/values-sr/strings.xml
+++ b/car/res/values-sr/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Фокусирајте се на пут"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Дугме Прошири/скупи"</string>
 </resources>
diff --git a/car/res/values-sv/strings.xml b/car/res/values-sv/strings.xml
index 3798509..c4ae438 100644
--- a/car/res/values-sv/strings.xml
+++ b/car/res/values-sv/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Fokusera på körningen"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Knappen Utöka/komprimera"</string>
 </resources>
diff --git a/car/res/values-sw/strings.xml b/car/res/values-sw/strings.xml
index a5b76c7..d3472f5 100644
--- a/car/res/values-sw/strings.xml
+++ b/car/res/values-sw/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Tia makini barabarani"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Kitufe cha kupanua/kukunja"</string>
 </resources>
diff --git a/car/res/values-ta/strings.xml b/car/res/values-ta/strings.xml
index e97f385..e13ede5 100644
--- a/car/res/values-ta/strings.xml
+++ b/car/res/values-ta/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"வாகனம் ஓட்டும்போது கவனம் தேவை"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"விரிவாக்குவதற்கான/சுருக்குவதற்கான பட்டன்"</string>
 </resources>
diff --git a/car/res/values-te/strings.xml b/car/res/values-te/strings.xml
index 9079a09..b106363 100644
--- a/car/res/values-te/strings.xml
+++ b/car/res/values-te/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"రహదారిపై దృష్టి ఉంచండి"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"విస్తరించు/కుదించు బటన్"</string>
 </resources>
diff --git a/car/res/values-th/strings.xml b/car/res/values-th/strings.xml
index 3ba0d6b..05be415 100644
--- a/car/res/values-th/strings.xml
+++ b/car/res/values-th/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"จดจ่อกับถนน"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"ปุ่มขยาย/ยุบ"</string>
 </resources>
diff --git a/car/res/values-tl/strings.xml b/car/res/values-tl/strings.xml
index 395e555..a56c37c 100644
--- a/car/res/values-tl/strings.xml
+++ b/car/res/values-tl/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Tumuon sa kalsada"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Button na i-expand/i-collapse"</string>
 </resources>
diff --git a/car/res/values-tr/strings.xml b/car/res/values-tr/strings.xml
index a0f0b22..b28b66e 100644
--- a/car/res/values-tr/strings.xml
+++ b/car/res/values-tr/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Dikkatinizi yola verin"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Genişlet/daralt düğmesi"</string>
 </resources>
diff --git a/car/res/values-uk/strings.xml b/car/res/values-uk/strings.xml
index 2657348..1964936 100644
--- a/car/res/values-uk/strings.xml
+++ b/car/res/values-uk/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Зосередьтеся на дорозі"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Кнопка \"Розгорнути або згорнути\""</string>
 </resources>
diff --git a/car/res/values-ur/strings.xml b/car/res/values-ur/strings.xml
index 60c578c..c1d6b3e 100644
--- a/car/res/values-ur/strings.xml
+++ b/car/res/values-ur/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"سڑک پر توجہ مرکوز کریں"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"پھیلائیں/سکیڑیں بٹن"</string>
 </resources>
diff --git a/car/res/values-uz/strings.xml b/car/res/values-uz/strings.xml
index bdaba48..a830b84 100644
--- a/car/res/values-uz/strings.xml
+++ b/car/res/values-uz/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Diqqatingizni yo‘lga qarating"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Yoyish/yig‘ish tugmasi"</string>
 </resources>
diff --git a/car/res/values-vi/strings.xml b/car/res/values-vi/strings.xml
index 37457d4..144f41a 100644
--- a/car/res/values-vi/strings.xml
+++ b/car/res/values-vi/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Tập trung vào đường đi"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Nút mở rộng/thu gọn"</string>
 </resources>
diff --git a/car/res/values-zh-rCN/strings.xml b/car/res/values-zh-rCN/strings.xml
index ec0c3c4..0c2caea 100644
--- a/car/res/values-zh-rCN/strings.xml
+++ b/car/res/values-zh-rCN/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"请专心驾驶"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"“展开”/“收起”按钮"</string>
 </resources>
diff --git a/car/res/values-zh-rHK/strings.xml b/car/res/values-zh-rHK/strings.xml
index 61102cc..09c1a9e 100644
--- a/car/res/values-zh-rHK/strings.xml
+++ b/car/res/values-zh-rHK/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"請專心駕駛"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"展開/收合按鈕"</string>
 </resources>
diff --git a/car/res/values-zh-rTW/strings.xml b/car/res/values-zh-rTW/strings.xml
index 61102cc..09c1a9e 100644
--- a/car/res/values-zh-rTW/strings.xml
+++ b/car/res/values-zh-rTW/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"請專心駕駛"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"展開/收合按鈕"</string>
 </resources>
diff --git a/car/res/values-zu/strings.xml b/car/res/values-zu/strings.xml
index bdf7337..9403834 100644
--- a/car/res/values-zu/strings.xml
+++ b/car/res/values-zu/strings.xml
@@ -17,4 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="speed_bump_lockout_message" msgid="5405697774899378511">"Gxila emgwaqweni"</string>
+    <string name="action_bar_expand_collapse_button" msgid="196909968432559564">"Inkinobho yokunweba/ukugoqa"</string>
 </resources>
diff --git a/car/src/main/java/androidx/car/widget/DayNightStyle.java b/car/src/main/java/androidx/car/widget/DayNightStyle.java
index 37d0d51..73f9ce4 100644
--- a/car/src/main/java/androidx/car/widget/DayNightStyle.java
+++ b/car/src/main/java/androidx/car/widget/DayNightStyle.java
@@ -16,8 +16,12 @@
 
 package androidx.car.widget;
 
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
 import androidx.annotation.IntDef;
 
+import java.lang.annotation.Retention;
+
 /**
  * Specifies how the system UI should respond to day/night mode events.
  *
@@ -37,6 +41,7 @@
         DayNightStyle.FORCE_NIGHT,
         DayNightStyle.FORCE_DAY,
 })
+@Retention(SOURCE)
 public @interface DayNightStyle {
     /**
      * Sets the foreground color to be automatically changed based on day/night mode, assuming the
diff --git a/car/src/main/java/androidx/car/widget/PagedListView.java b/car/src/main/java/androidx/car/widget/PagedListView.java
index 6fcad79..03d4ce3 100644
--- a/car/src/main/java/androidx/car/widget/PagedListView.java
+++ b/car/src/main/java/androidx/car/widget/PagedListView.java
@@ -18,6 +18,8 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.graphics.Canvas;
@@ -50,6 +52,8 @@
 import androidx.recyclerview.widget.OrientationHelper;
 import androidx.recyclerview.widget.RecyclerView;
 
+import java.lang.annotation.Retention;
+
 /**
  * View that wraps a {@link RecyclerView} and a scroll bar that has
  * page up and down arrows. Interaction with this view is similar to a {@code RecyclerView} as it
@@ -187,6 +191,7 @@
             Gutter.END,
             Gutter.BOTH,
     })
+    @Retention(SOURCE)
     public @interface Gutter {
         /**
          * No gutter on either side of the list items. The items will span the full width of the
diff --git a/car/src/main/java/androidx/car/widget/SubheaderListItem.java b/car/src/main/java/androidx/car/widget/SubheaderListItem.java
index 8724696..dd5a00b 100644
--- a/car/src/main/java/androidx/car/widget/SubheaderListItem.java
+++ b/car/src/main/java/androidx/car/widget/SubheaderListItem.java
@@ -16,6 +16,8 @@
 
 package androidx.car.widget;
 
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.content.res.TypedArray;
@@ -23,15 +25,16 @@
 import android.view.ViewGroup;
 import android.widget.TextView;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import androidx.annotation.DimenRes;
 import androidx.annotation.IntDef;
 import androidx.annotation.StyleRes;
 import androidx.car.R;
 import androidx.car.utils.CarUxRestrictionsUtils;
 
+import java.lang.annotation.Retention;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Class to build a sub-header list item.
  *
@@ -72,6 +75,7 @@
     @IntDef({
             TEXT_START_MARGIN_TYPE_NONE, TEXT_START_MARGIN_TYPE_LARGE,
             TEXT_START_MARGIN_TYPE_SMALL})
+    @Retention(SOURCE)
     public @interface TextStartMarginType {}
 
     /**
diff --git a/collection/ktx/OWNERS b/collection/ktx/OWNERS
new file mode 100644
index 0000000..e450f4c
--- /dev/null
+++ b/collection/ktx/OWNERS
@@ -0,0 +1 @@
+jakew@google.com
diff --git a/collection/ktx/build.gradle b/collection/ktx/build.gradle
new file mode 100644
index 0000000..83944f2
--- /dev/null
+++ b/collection/ktx/build.gradle
@@ -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.
+ */
+
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.LibraryVersions
+
+plugins {
+    id("SupportKotlinLibraryPlugin")
+}
+
+dependencies {
+    compile(project(":collection"))
+    compile(KOTLIN_STDLIB)
+    testCompile(JUNIT)
+    testCompile(TRUTH)
+    testCompile(project(":internal-testutils-ktx"))
+}
+
+supportLibrary {
+    name = "Collections Kotlin Extensions"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.COLLECTION
+    inceptionYear = "2018"
+    description = "Kotlin extensions for 'collection' artifact"
+}
diff --git a/collection/ktx/src/main/java/androidx/collection/ArrayMap.kt b/collection/ktx/src/main/java/androidx/collection/ArrayMap.kt
new file mode 100644
index 0000000..8f3299e
--- /dev/null
+++ b/collection/ktx/src/main/java/androidx/collection/ArrayMap.kt
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.collection
+
+/** Returns an empty new [ArrayMap]. */
+inline fun <K, V> arrayMapOf(): ArrayMap<K, V> = ArrayMap()
+
+/**
+ * Returns a new [ArrayMap] with the specified contents, given as a list of pairs where the first
+ * component is the key and the second component is the value.
+ *
+ * If multiple pairs have the same key, the resulting map will contain the value from the last of
+ * those pairs.
+ */
+fun <K, V> arrayMapOf(vararg pairs: Pair<K, V>): ArrayMap<K, V> {
+    val map = ArrayMap<K, V>(pairs.size)
+    for (pair in pairs) {
+        map[pair.first] = pair.second
+    }
+    return map
+}
diff --git a/collection/ktx/src/main/java/androidx/collection/ArraySet.kt b/collection/ktx/src/main/java/androidx/collection/ArraySet.kt
new file mode 100644
index 0000000..07b4be7
--- /dev/null
+++ b/collection/ktx/src/main/java/androidx/collection/ArraySet.kt
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.collection
+
+/** Returns an empty new [ArraySet]. */
+inline fun <T> arraySetOf(): ArraySet<T> = ArraySet()
+
+/** Returns a new [ArraySet] with the specified contents. */
+fun <T> arraySetOf(vararg values: T): ArraySet<T> {
+    val set = ArraySet<T>(values.size)
+    @Suppress("LoopToCallChain") // Causes needless copy to a list.
+    for (value in values) {
+        set.add(value)
+    }
+    return set
+}
diff --git a/collection/ktx/src/main/java/androidx/collection/LongSparseArray.kt b/collection/ktx/src/main/java/androidx/collection/LongSparseArray.kt
new file mode 100644
index 0000000..fd6201a
--- /dev/null
+++ b/collection/ktx/src/main/java/androidx/collection/LongSparseArray.kt
@@ -0,0 +1,87 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.collection
+
+/** Returns the number of key/value pairs in the collection. */
+inline val <T> LongSparseArray<T>.size get() = size()
+
+/** Returns true if the collection contains [key]. */
+inline operator fun <T> LongSparseArray<T>.contains(key: Long) = indexOfKey(key) >= 0
+
+/** Allows the use of the index operator for storing values in the collection. */
+inline operator fun <T> LongSparseArray<T>.set(key: Long, value: T) = put(key, value)
+
+/** Creates a new collection by adding or replacing entries from [other]. */
+operator fun <T> LongSparseArray<T>.plus(other: LongSparseArray<T>): LongSparseArray<T> {
+    val new = LongSparseArray<T>(size() + other.size())
+    new.putAll(this)
+    new.putAll(other)
+    return new
+}
+
+/** Returns true if the collection contains [key]. */
+inline fun <T> LongSparseArray<T>.containsKey(key: Long) = indexOfKey(key) >= 0
+
+/** Returns true if the collection contains [value]. */
+inline fun <T> LongSparseArray<T>.containsValue(value: T) = indexOfValue(value) != -1
+
+/** Return the value corresponding to [key], or [defaultValue] when not present. */
+inline fun <T> LongSparseArray<T>.getOrDefault(key: Long, defaultValue: T) =
+    get(key) ?: defaultValue
+
+/** Return the value corresponding to [key], or from [defaultValue] when not present. */
+inline fun <T> LongSparseArray<T>.getOrElse(key: Long, defaultValue: () -> T) =
+    get(key) ?: defaultValue()
+
+/** Return true when the collection contains elements. */
+inline fun <T> LongSparseArray<T>.isNotEmpty() = size() != 0
+
+/** Removes the entry for [key] only if it is mapped to [value]. */
+fun <T> LongSparseArray<T>.remove(key: Long, value: T): Boolean {
+    val index = indexOfKey(key)
+    if (index != -1 && value == valueAt(index)) {
+        removeAt(index)
+        return true
+    }
+    return false
+}
+
+/** Update this collection by adding or replacing entries from [other]. */
+fun <T> LongSparseArray<T>.putAll(other: LongSparseArray<T>) = other.forEach(::put)
+
+/** Performs the given [action] for each key/value entry. */
+inline fun <T> LongSparseArray<T>.forEach(action: (key: Long, value: T) -> Unit) {
+    for (index in 0 until size()) {
+        action(keyAt(index), valueAt(index))
+    }
+}
+
+/** Return an iterator over the collection's keys. */
+fun <T> LongSparseArray<T>.keyIterator(): LongIterator = object : LongIterator() {
+    var index = 0
+    override fun hasNext() = index < size()
+    override fun nextLong() = keyAt(index++)
+}
+
+/** Return an iterator over the collection's values. */
+fun <T> LongSparseArray<T>.valueIterator(): Iterator<T> = object : Iterator<T> {
+    var index = 0
+    override fun hasNext() = index < size()
+    override fun next() = valueAt(index++)
+}
diff --git a/collection/ktx/src/main/java/androidx/collection/LruCache.kt b/collection/ktx/src/main/java/androidx/collection/LruCache.kt
new file mode 100644
index 0000000..554a012
--- /dev/null
+++ b/collection/ktx/src/main/java/androidx/collection/LruCache.kt
@@ -0,0 +1,51 @@
+/*
+ * 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.collection
+
+/**
+ * Creates an [LruCache] with the given parameters.
+ *
+ * @param maxSize for caches that do not specify [sizeOf], this is
+ * the maximum number of entries in the cache. For all other caches,
+ * this is the maximum sum of the sizes of the entries in this cache.
+ * @param sizeOf function that returns the size of the entry for key and value in
+ * user-defined units. The default implementation returns 1.
+ * @param create a create called after a cache miss to compute a value for the corresponding key.
+ * Returns the computed value or null if no value can be computed. The default implementation
+ * returns null.
+ * @param onEntryRemoved a function called for entries that have been evicted or removed.
+ *
+ * @see LruCache.sizeOf
+ * @see LruCache.create
+ * @see LruCache.entryRemoved
+ */
+inline fun <K : Any, V : Any> lruCache(
+    maxSize: Int,
+    crossinline sizeOf: (key: K, value: V) -> Int = { _, _ -> 1 },
+    @Suppress("USELESS_CAST") // https://youtrack.jetbrains.com/issue/KT-21946
+    crossinline create: (key: K) -> V? = { null as V? },
+    crossinline onEntryRemoved: (evicted: Boolean, key: K, oldValue: V, newValue: V?) -> Unit =
+        { _, _, _, _ -> }
+): LruCache<K, V> {
+    return object : LruCache<K, V>(maxSize) {
+        override fun sizeOf(key: K, value: V) = sizeOf(key, value)
+        override fun create(key: K) = create(key)
+        override fun entryRemoved(evicted: Boolean, key: K, oldValue: V, newValue: V?) {
+            onEntryRemoved(evicted, key, oldValue, newValue)
+        }
+    }
+}
diff --git a/collection/ktx/src/main/java/androidx/collection/SparseArray.kt b/collection/ktx/src/main/java/androidx/collection/SparseArray.kt
new file mode 100644
index 0000000..e1d2382
--- /dev/null
+++ b/collection/ktx/src/main/java/androidx/collection/SparseArray.kt
@@ -0,0 +1,87 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.collection
+
+/** Returns the number of key/value pairs in the collection. */
+inline val <T> SparseArrayCompat<T>.size get() = size()
+
+/** Returns true if the collection contains [key]. */
+inline operator fun <T> SparseArrayCompat<T>.contains(key: Int) = indexOfKey(key) >= 0
+
+/** Allows the use of the index operator for storing values in the collection. */
+inline operator fun <T> SparseArrayCompat<T>.set(key: Int, value: T) = put(key, value)
+
+/** Creates a new collection by adding or replacing entries from [other]. */
+operator fun <T> SparseArrayCompat<T>.plus(other: SparseArrayCompat<T>): SparseArrayCompat<T> {
+    val new = SparseArrayCompat<T>(size() + other.size())
+    new.putAll(this)
+    new.putAll(other)
+    return new
+}
+
+/** Returns true if the collection contains [key]. */
+inline fun <T> SparseArrayCompat<T>.containsKey(key: Int) = indexOfKey(key) >= 0
+
+/** Returns true if the collection contains [value]. */
+inline fun <T> SparseArrayCompat<T>.containsValue(value: T) = indexOfValue(value) != -1
+
+/** Return the value corresponding to [key], or [defaultValue] when not present. */
+inline fun <T> SparseArrayCompat<T>.getOrDefault(key: Int, defaultValue: T) =
+    get(key) ?: defaultValue
+
+/** Return the value corresponding to [key], or from [defaultValue] when not present. */
+inline fun <T> SparseArrayCompat<T>.getOrElse(key: Int, defaultValue: () -> T) =
+    get(key) ?: defaultValue()
+
+/** Return true when the collection contains elements. */
+inline fun <T> SparseArrayCompat<T>.isNotEmpty() = size() != 0
+
+/** Removes the entry for [key] only if it is mapped to [value]. */
+fun <T> SparseArrayCompat<T>.remove(key: Int, value: T): Boolean {
+    val index = indexOfKey(key)
+    if (index != -1 && value == valueAt(index)) {
+        removeAt(index)
+        return true
+    }
+    return false
+}
+
+/** Update this collection by adding or replacing entries from [other]. */
+fun <T> SparseArrayCompat<T>.putAll(other: SparseArrayCompat<T>) = other.forEach(::put)
+
+/** Performs the given [action] for each key/value entry. */
+inline fun <T> SparseArrayCompat<T>.forEach(action: (key: Int, value: T) -> Unit) {
+    for (index in 0 until size()) {
+        action(keyAt(index), valueAt(index))
+    }
+}
+
+/** Return an iterator over the collection's keys. */
+fun <T> SparseArrayCompat<T>.keyIterator(): IntIterator = object : IntIterator() {
+    var index = 0
+    override fun hasNext() = index < size()
+    override fun nextInt() = keyAt(index++)
+}
+
+/** Return an iterator over the collection's values. */
+fun <T> SparseArrayCompat<T>.valueIterator(): Iterator<T> = object : Iterator<T> {
+    var index = 0
+    override fun hasNext() = index < size()
+    override fun next() = valueAt(index++)
+}
diff --git a/collection/ktx/src/test/java/androidx/collection/ArrayMapTest.kt b/collection/ktx/src/test/java/androidx/collection/ArrayMapTest.kt
new file mode 100644
index 0000000..8c002dd
--- /dev/null
+++ b/collection/ktx/src/test/java/androidx/collection/ArrayMapTest.kt
@@ -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.
+ */
+
+package androidx.collection
+
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class ArrayMapTest {
+    @Test fun empty() {
+        val map = arrayMapOf<String, String>()
+        assertEquals(0, map.size)
+    }
+
+    @Test fun nonEmpty() {
+        val map = arrayMapOf("foo" to "bar", "bar" to "baz")
+        assertThat(map).containsExactly("foo", "bar", "bar", "baz")
+    }
+
+    @Test fun duplicateKeyKeepsLast() {
+        val map = arrayMapOf("foo" to "bar", "foo" to "baz")
+        assertThat(map).containsExactly("foo", "baz")
+    }
+}
diff --git a/collection/ktx/src/test/java/androidx/collection/ArraySetTest.kt b/collection/ktx/src/test/java/androidx/collection/ArraySetTest.kt
new file mode 100644
index 0000000..71a561d
--- /dev/null
+++ b/collection/ktx/src/test/java/androidx/collection/ArraySetTest.kt
@@ -0,0 +1,33 @@
+/*
+ * 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.collection
+
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class ArraySetTest {
+    @Test fun empty() {
+        val set = arraySetOf<String>()
+        assertEquals(0, set.size)
+    }
+
+    @Test fun nonEmpty() {
+        val set = arraySetOf("foo", "bar", "baz")
+        assertThat(set).containsExactly("foo", "bar", "baz")
+    }
+}
diff --git a/collection/ktx/src/test/java/androidx/collection/LongSparseArrayTest.kt b/collection/ktx/src/test/java/androidx/collection/LongSparseArrayTest.kt
new file mode 100644
index 0000000..3419664
--- /dev/null
+++ b/collection/ktx/src/test/java/androidx/collection/LongSparseArrayTest.kt
@@ -0,0 +1,190 @@
+/*
+ * 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.collection
+
+import androidx.testutils.fail
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertSame
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class LongSparseArrayTest {
+    @Test fun sizeProperty() {
+        val array = LongSparseArray<String>()
+        assertEquals(0, array.size)
+        array.put(1L, "one")
+        assertEquals(1, array.size)
+    }
+
+    @Test fun containsOperator() {
+        val array = LongSparseArray<String>()
+        assertFalse(1L in array)
+        array.put(1L, "one")
+        assertTrue(1L in array)
+    }
+
+    @Test fun containsOperatorWithValue() {
+        val array = LongSparseArray<String>()
+
+        array.put(1L, "one")
+        assertFalse(2L in array)
+
+        array.put(2L, "two")
+        assertTrue(2L in array)
+    }
+
+    @Test fun setOperator() {
+        val array = LongSparseArray<String>()
+        array[1L] = "one"
+        assertEquals("one", array.get(1L))
+    }
+
+    @Test fun plusOperator() {
+        val first = LongSparseArray<String>().apply { put(1L, "one") }
+        val second = LongSparseArray<String>().apply { put(2L, "two") }
+        val combined = first + second
+        assertEquals(2, combined.size())
+        assertEquals(1L, combined.keyAt(0))
+        assertEquals("one", combined.valueAt(0))
+        assertEquals(2L, combined.keyAt(1))
+        assertEquals("two", combined.valueAt(1))
+    }
+
+    @Test fun containsKey() {
+        val array = LongSparseArray<String>()
+        assertFalse(array.containsKey(1L))
+        array.put(1L, "one")
+        assertTrue(array.containsKey(1L))
+    }
+
+    @Test fun containsKeyWithValue() {
+        val array = LongSparseArray<String>()
+
+        array.put(1L, "one")
+        assertFalse(array.containsKey(2L))
+
+        array.put(2L, "one")
+        assertTrue(array.containsKey(2L))
+    }
+
+    @Test fun containsValue() {
+        val array = LongSparseArray<String>()
+        assertFalse(array.containsValue("one"))
+        array.put(1L, "one")
+        assertTrue(array.containsValue("one"))
+    }
+
+    @Test fun getOrDefault() {
+        val array = LongSparseArray<Any>()
+        val default = Any()
+        assertSame(default, array.getOrDefault(1L, default))
+        array.put(1L, "one")
+        assertEquals("one", array.getOrDefault(1L, default))
+    }
+
+    @Test fun getOrElse() {
+        val array = LongSparseArray<Any>()
+        val default = Any()
+        assertSame(default, array.getOrElse(1L) { default })
+        array.put(1L, "one")
+        assertEquals("one", array.getOrElse(1L) { fail() })
+    }
+
+    @Test fun isNotEmpty() {
+        val array = LongSparseArray<String>()
+        assertFalse(array.isNotEmpty())
+        array.put(1L, "one")
+        assertTrue(array.isNotEmpty())
+    }
+
+    @Test fun removeValue() {
+        val array = LongSparseArray<String>()
+        array.put(1L, "one")
+        assertFalse(array.remove(0L, "one"))
+        assertEquals(1, array.size())
+        assertFalse(array.remove(1L, "two"))
+        assertEquals(1, array.size())
+        assertTrue(array.remove(1L, "one"))
+        assertEquals(0, array.size())
+    }
+
+    @Test fun putAll() {
+        val dest = LongSparseArray<String>()
+        val source = LongSparseArray<String>()
+        source.put(1L, "one")
+
+        assertEquals(0, dest.size())
+        dest.putAll(source)
+        assertEquals(1, dest.size())
+    }
+
+    @Test fun forEach() {
+        val array = LongSparseArray<String>()
+        array.forEach { _, _ -> fail() }
+
+        array.put(1L, "one")
+        array.put(2L, "two")
+        array.put(6L, "six")
+
+        val keys = mutableListOf<Long>()
+        val values = mutableListOf<String>()
+        array.forEach { key, value ->
+            keys.add(key)
+            values.add(value)
+        }
+        assertThat(keys).containsExactly(1L, 2L, 6L)
+        assertThat(values).containsExactly("one", "two", "six")
+    }
+
+    @Test fun keyIterator() {
+        val array = LongSparseArray<String>()
+        assertFalse(array.keyIterator().hasNext())
+
+        array.put(1L, "one")
+        array.put(2L, "two")
+        array.put(6L, "six")
+
+        val iterator = array.keyIterator()
+        assertTrue(iterator.hasNext())
+        assertEquals(1L, iterator.nextLong())
+        assertTrue(iterator.hasNext())
+        assertEquals(2L, iterator.nextLong())
+        assertTrue(iterator.hasNext())
+        assertEquals(6L, iterator.nextLong())
+        assertFalse(iterator.hasNext())
+    }
+
+    @Test fun valueIterator() {
+        val array = LongSparseArray<String>()
+        assertFalse(array.valueIterator().hasNext())
+
+        array.put(1L, "one")
+        array.put(2L, "two")
+        array.put(6L, "six")
+
+        val iterator = array.valueIterator()
+        assertTrue(iterator.hasNext())
+        assertEquals("one", iterator.next())
+        assertTrue(iterator.hasNext())
+        assertEquals("two", iterator.next())
+        assertTrue(iterator.hasNext())
+        assertEquals("six", iterator.next())
+        assertFalse(iterator.hasNext())
+    }
+}
diff --git a/collection/ktx/src/test/java/androidx/collection/LruCacheTest.kt b/collection/ktx/src/test/java/androidx/collection/LruCacheTest.kt
new file mode 100644
index 0000000..c47b423
--- /dev/null
+++ b/collection/ktx/src/test/java/androidx/collection/LruCacheTest.kt
@@ -0,0 +1,48 @@
+/*
+ * 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.collection
+
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class LruCacheTest {
+    private data class TestData(val x: String = "bla")
+
+    @Test fun size() {
+        val cache = lruCache<String, TestData>(200, { k, (x) -> k.length * x.length })
+        cache.put("long", TestData())
+        assertEquals(cache.size(), 12)
+    }
+
+    @Test fun create() {
+        val cache = lruCache<String, TestData>(200, create = { key -> TestData("$key foo") })
+        assertEquals(cache.get("kung"), TestData("kung foo"))
+    }
+
+    @Test fun onEntryRemoved() {
+        var wasCalled = false
+
+        val cache = lruCache<String, TestData>(200, onEntryRemoved = { _, _, _, _ ->
+            wasCalled = true
+        })
+        val initial = TestData()
+        cache.put("a", initial)
+        cache.remove("a")
+        assertTrue(wasCalled)
+    }
+}
diff --git a/collection/ktx/src/test/java/androidx/collection/SparseArrayTest.kt b/collection/ktx/src/test/java/androidx/collection/SparseArrayTest.kt
new file mode 100644
index 0000000..90d46c8
--- /dev/null
+++ b/collection/ktx/src/test/java/androidx/collection/SparseArrayTest.kt
@@ -0,0 +1,180 @@
+/*
+ * 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.collection
+
+import androidx.testutils.fail
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertSame
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class SparseArrayCompatTest {
+    @Test fun sizeProperty() {
+        val array = SparseArrayCompat<String>()
+        assertEquals(0, array.size)
+        array.put(1, "one")
+        assertEquals(1, array.size)
+    }
+
+    @Test fun containsOperator() {
+        val array = SparseArrayCompat<String>()
+        assertFalse(1 in array)
+        array.put(1, "one")
+        assertTrue(1 in array)
+    }
+
+    @Test fun containsOperatorWithItem() {
+        val array = SparseArrayCompat<String>()
+
+        array.put(1, "one")
+        assertFalse(2 in array)
+
+        array.put(2, "two")
+        assertTrue(2 in array)
+    }
+
+    @Test fun setOperator() {
+        val array = SparseArrayCompat<String>()
+        array[1] = "one"
+        assertEquals("one", array.get(1))
+    }
+
+    @Test fun plusOperator() {
+        val first = SparseArrayCompat<String>().apply { put(1, "one") }
+        val second = SparseArrayCompat<String>().apply { put(2, "two") }
+        val combined = first + second
+        assertEquals(2, combined.size())
+        assertEquals(1, combined.keyAt(0))
+        assertEquals("one", combined.valueAt(0))
+        assertEquals(2, combined.keyAt(1))
+        assertEquals("two", combined.valueAt(1))
+    }
+
+    @Test fun containsKey() {
+        val array = SparseArrayCompat<String>()
+        assertFalse(array.containsKey(1))
+        array.put(1, "one")
+        assertTrue(array.containsKey(1))
+    }
+
+    @Test fun containsValue() {
+        val array = SparseArrayCompat<String>()
+        assertFalse(array.containsValue("one"))
+        array.put(1, "one")
+        assertTrue(array.containsValue("one"))
+    }
+
+    @Test fun getOrDefault() {
+        val array = SparseArrayCompat<Any>()
+        val default = Any()
+        assertSame(default, array.getOrDefault(1, default))
+        array.put(1, "one")
+        assertEquals("one", array.getOrDefault(1, default))
+    }
+
+    @Test fun getOrElse() {
+        val array = SparseArrayCompat<Any>()
+        val default = Any()
+        assertSame(default, array.getOrElse(1) { default })
+        array.put(1, "one")
+        assertEquals("one", array.getOrElse(1) { fail() })
+    }
+
+    @Test fun isNotEmpty() {
+        val array = SparseArrayCompat<String>()
+        assertFalse(array.isNotEmpty())
+        array.put(1, "one")
+        assertTrue(array.isNotEmpty())
+    }
+
+    @Test fun removeValue() {
+        val array = SparseArrayCompat<String>()
+        array.put(1, "one")
+        assertFalse(array.remove(0, "one"))
+        assertEquals(1, array.size())
+        assertFalse(array.remove(1, "two"))
+        assertEquals(1, array.size())
+        assertTrue(array.remove(1, "one"))
+        assertEquals(0, array.size())
+    }
+
+    @Test fun putAll() {
+        val dest = SparseArrayCompat<String>()
+        val source = SparseArrayCompat<String>()
+        source.put(1, "one")
+
+        assertEquals(0, dest.size())
+        dest.putAll(source)
+        assertEquals(1, dest.size())
+    }
+
+    @Test fun forEach() {
+        val array = SparseArrayCompat<String>()
+        array.forEach { _, _ -> fail() }
+
+        array.put(1, "one")
+        array.put(2, "two")
+        array.put(6, "six")
+
+        val keys = mutableListOf<Int>()
+        val values = mutableListOf<String>()
+        array.forEach { key, value ->
+            keys.add(key)
+            values.add(value)
+        }
+        assertThat(keys).containsExactly(1, 2, 6)
+        assertThat(values).containsExactly("one", "two", "six")
+    }
+
+    @Test fun keyIterator() {
+        val array = SparseArrayCompat<String>()
+        assertFalse(array.keyIterator().hasNext())
+
+        array.put(1, "one")
+        array.put(2, "two")
+        array.put(6, "six")
+
+        val iterator = array.keyIterator()
+        assertTrue(iterator.hasNext())
+        assertEquals(1, iterator.nextInt())
+        assertTrue(iterator.hasNext())
+        assertEquals(2, iterator.nextInt())
+        assertTrue(iterator.hasNext())
+        assertEquals(6, iterator.nextInt())
+        assertFalse(iterator.hasNext())
+    }
+
+    @Test fun valueIterator() {
+        val array = SparseArrayCompat<String>()
+        assertFalse(array.valueIterator().hasNext())
+
+        array.put(1, "one")
+        array.put(2, "two")
+        array.put(6, "six")
+
+        val iterator = array.valueIterator()
+        assertTrue(iterator.hasNext())
+        assertEquals("one", iterator.next())
+        assertTrue(iterator.hasNext())
+        assertEquals("two", iterator.next())
+        assertTrue(iterator.hasNext())
+        assertEquals("six", iterator.next())
+        assertFalse(iterator.hasNext())
+    }
+}
diff --git a/compat/api/current.txt b/compat/api/current.txt
index c80da7b..0a19457 100644
--- a/compat/api/current.txt
+++ b/compat/api/current.txt
@@ -1908,6 +1908,7 @@
     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);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration, android.content.Context);
   }
 
   public final class ViewGroupCompat {
diff --git a/compat/res/values-as/strings.xml b/compat/res/values-as/strings.xml
new file mode 100644
index 0000000..b9c349e
--- /dev/null
+++ b/compat/res/values-as/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="status_bar_notification_info_overflow" msgid="7988687684186075107">"৯৯৯+"</string>
+</resources>
diff --git a/compat/res/values-or/strings.xml b/compat/res/values-or/strings.xml
new file mode 100644
index 0000000..f544aef
--- /dev/null
+++ b/compat/res/values-or/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="status_bar_notification_info_overflow" msgid="7988687684186075107">"999+"</string>
+</resources>
diff --git a/compat/res/values/dimens.xml b/compat/res/values/dimens.xml
index 1dcff5e..9ece458 100644
--- a/compat/res/values/dimens.xml
+++ b/compat/res/values/dimens.xml
@@ -70,4 +70,10 @@
 
     <!-- the paddingtop on the right side of the notification (for time etc.) -->
     <dimen name="notification_right_side_padding_top">2dp</dimen>
+
+    <!-- the maximum width of the large icon, above which it will be downscaled -->
+    <dimen name="compat_notification_large_icon_max_width">320dp</dimen>
+
+    <!-- the maximum height of the large icon, above which it will be downscaled -->
+    <dimen name="compat_notification_large_icon_max_height">320dp</dimen>
 </resources>
diff --git a/compat/src/androidTest/java/androidx/core/graphics/drawable/IconCompatTest.java b/compat/src/androidTest/java/androidx/core/graphics/drawable/IconCompatTest.java
index 75ad1d5..2ca517f 100644
--- a/compat/src/androidTest/java/androidx/core/graphics/drawable/IconCompatTest.java
+++ b/compat/src/androidTest/java/androidx/core/graphics/drawable/IconCompatTest.java
@@ -32,6 +32,7 @@
 import android.graphics.drawable.AdaptiveIconDrawable;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
@@ -258,7 +259,7 @@
     public void testBitmapIconCompat_getType() {
         IconCompat icon = IconCompat.createWithBitmap(Bitmap.createBitmap(16, 16,
                 Bitmap.Config.ARGB_8888));
-        assertEquals(IconCompat.TYPE_BITMAP, icon.getType());
+        assertEquals(Icon.TYPE_BITMAP, icon.getType());
     }
 
     @Test
@@ -266,7 +267,7 @@
         byte[] data = new byte[4];
         data[0] = data[1] = data[2] = data[3] = (byte) 255;
         IconCompat icon = IconCompat.createWithData(data, 0, 4);
-        assertEquals(IconCompat.TYPE_DATA, icon.getType());
+        assertEquals(Icon.TYPE_DATA, icon.getType());
     }
 
     @Test
@@ -278,11 +279,11 @@
             String filePath = file.toURI().getPath();
 
             IconCompat icon = IconCompat.createWithContentUri(Uri.fromFile(file));
-            assertEquals(IconCompat.TYPE_URI, icon.getType());
+            assertEquals(Icon.TYPE_URI, icon.getType());
             assertEquals(filePath, icon.getUri().getPath());
 
             icon = IconCompat.createWithContentUri(file.toURI().toString());
-            assertEquals(IconCompat.TYPE_URI, icon.getType());
+            assertEquals(Icon.TYPE_URI, icon.getType());
             assertEquals(filePath, icon.getUri().getPath());
         } finally {
             file.delete();
@@ -292,7 +293,7 @@
     @Test
     public void testResourceIconCompat_getType() {
         IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.bmp_test);
-        assertEquals(IconCompat.TYPE_RESOURCE, icon.getType());
+        assertEquals(Icon.TYPE_RESOURCE, icon.getType());
         assertEquals("androidx.core.test", icon.getResPackage());
         assertEquals(R.drawable.bmp_test, icon.getResId());
     }
diff --git a/compat/src/androidTest/java/androidx/core/text/util/FindAddressTest.java b/compat/src/androidTest/java/androidx/core/text/util/FindAddressTest.java
index 292f5b1..9cfa78a 100644
--- a/compat/src/androidTest/java/androidx/core/text/util/FindAddressTest.java
+++ b/compat/src/androidTest/java/androidx/core/text/util/FindAddressTest.java
@@ -138,6 +138,15 @@
     public void testFullAddressWithoutZipCode() {
         assertIsAddress("1600 Amphitheatre Parkway Mountain View, CA");
         assertIsAddress("201 S. Division St. Suite 500 Ann Arbor, MI");
+
+        // Check that addresses without a zip code are only accepted at the end of the string.
+        // This isn't implied by the documentation but was the case in the old implementation
+        // and fixing this bug creates a lot of false positives while fixing relatively few
+        // false negatives. In these examples, "one point" is parsed as a street and "as" is a
+        // state abbreviation (this is taken from a false positive reported in a bug).
+        Assert.assertTrue(containsAddress("one point I was as"));
+        Assert.assertTrue(containsAddress("At one point I was as ignorant as"));
+        Assert.assertFalse(containsAddress("At one point I was as ignorant as them"));
     }
 
     @Test
diff --git a/compat/src/androidTest/java/androidx/core/text/util/LinkifyCompatTest.java b/compat/src/androidTest/java/androidx/core/text/util/LinkifyCompatTest.java
index 8435df1..4400d22 100644
--- a/compat/src/androidTest/java/androidx/core/text/util/LinkifyCompatTest.java
+++ b/compat/src/androidTest/java/androidx/core/text/util/LinkifyCompatTest.java
@@ -781,12 +781,6 @@
     // ADDRESS RELATED TESTS
 
     @Test
-    public void testFindAddress_withoutZipcode() {
-        final String address = "455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA";
-        verifyAddLinksWithMapAddressSucceeds("Should match map address: " + address, address);
-    }
-
-    @Test
     public void testFindAddress_withZipcode() {
         final String address = "455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA 92826";
         verifyAddLinksWithMapAddressSucceeds("Should match map address: " + address, address);
diff --git a/compat/src/main/AndroidManifest.xml b/compat/src/main/AndroidManifest.xml
index d18ee92..6c4338d 100644
--- a/compat/src/main/AndroidManifest.xml
+++ b/compat/src/main/AndroidManifest.xml
@@ -13,4 +13,7 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<manifest package="androidx.core"/>
+<manifest package="androidx.core" xmlns:android="http://schemas.android.com/apk/res/android">
+    <application
+        android:appComponentFactory="androidx.core.app.CoreComponentFactory" />
+</manifest>
diff --git a/compat/src/main/java/androidx/core/app/CoreComponentFactory.java b/compat/src/main/java/androidx/core/app/CoreComponentFactory.java
new file mode 100644
index 0000000..ef6acc1
--- /dev/null
+++ b/compat/src/main/java/androidx/core/app/CoreComponentFactory.java
@@ -0,0 +1,112 @@
+/*
+ * 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.core.app;
+
+import android.app.Activity;
+import android.app.AppComponentFactory;
+import android.app.Application;
+import android.app.Service;
+import android.content.BroadcastReceiver;
+import android.content.ContentProvider;
+import android.content.Intent;
+
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+
+/**
+ * Instance of AppComponentFactory for support libraries.
+ * @see CompatWrapped
+ * @hide
+ */
+@RequiresApi(api = 28)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class CoreComponentFactory extends AppComponentFactory {
+    private static final String TAG = "CoreComponentFactory";
+
+    @Override
+    public Activity instantiateActivity(ClassLoader cl, String className, Intent intent)
+            throws InstantiationException, IllegalAccessException, ClassNotFoundException {
+        return checkCompatWrapper(super.instantiateActivity(cl, className, intent));
+    }
+
+    @Override
+    public Application instantiateApplication(ClassLoader cl, String className)
+            throws InstantiationException, IllegalAccessException, ClassNotFoundException {
+        return checkCompatWrapper(super.instantiateApplication(cl, className));
+    }
+
+    @Override
+    public BroadcastReceiver instantiateReceiver(ClassLoader cl, String className, Intent intent)
+            throws InstantiationException, IllegalAccessException, ClassNotFoundException {
+        return checkCompatWrapper(super.instantiateReceiver(cl, className, intent));
+    }
+
+    @Override
+    public ContentProvider instantiateProvider(ClassLoader cl, String className)
+            throws InstantiationException, IllegalAccessException, ClassNotFoundException {
+        return checkCompatWrapper(super.instantiateProvider(cl, className));
+    }
+
+    @Override
+    public Service instantiateService(ClassLoader cl, String className, Intent intent)
+            throws InstantiationException, IllegalAccessException, ClassNotFoundException {
+        return checkCompatWrapper(super.instantiateService(cl, className, intent));
+    }
+
+    private <T> T checkCompatWrapper(T obj) {
+        if (obj instanceof CompatWrapped) {
+            T wrapper = (T) ((CompatWrapped) obj).getWrapper();
+            if (wrapper != null) {
+                return wrapper;
+            }
+        }
+        return obj;
+    }
+
+    /**
+     * Implement this interface to allow a different class to be returned when instantiating
+     * on certain API levels.
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public interface CompatWrapped {
+        /**
+         * Called while this class is being instantiated by the OS.
+         *
+         * If an object is returned then it will be used in place of the class.
+         * Note: this will not be called on API <= 27.
+         *
+         * Example:
+         * <pre class="prettyprint">
+         * {@literal
+         * public AndroidXContentProvider extends ContentProvider implements CompatWrapped {
+         *     ...
+         *
+         *     public Object getWrapper() {
+         *         if (SDK_INT >= 29) {
+         *             return new AndroidXContentProviderV29(this);
+         *         }
+         *         return null;
+         *     }
+         * }
+         * }
+         * </pre>
+         */
+        Object getWrapper();
+    }
+
+}
diff --git a/compat/src/main/java/androidx/core/app/NotificationCompat.java b/compat/src/main/java/androidx/core/app/NotificationCompat.java
index caf94e6..9e60574 100644
--- a/compat/src/main/java/androidx/core/app/NotificationCompat.java
+++ b/compat/src/main/java/androidx/core/app/NotificationCompat.java
@@ -963,11 +963,39 @@
          * Set the large icon that is shown in the ticker and notification.
          */
         public Builder setLargeIcon(Bitmap icon) {
-            mLargeIcon = icon;
+            mLargeIcon = reduceLargeIconSize(icon);
             return this;
         }
 
         /**
+         * Reduce the size of a notification icon if it's overly large. The framework does
+         * this automatically starting from API 27.
+         */
+        private Bitmap reduceLargeIconSize(Bitmap icon) {
+            if (icon == null || Build.VERSION.SDK_INT >= 27) {
+                return icon;
+            }
+
+            Resources res = mContext.getResources();
+            int maxWidth =
+                    res.getDimensionPixelSize(R.dimen.compat_notification_large_icon_max_width);
+            int maxHeight =
+                    res.getDimensionPixelSize(R.dimen.compat_notification_large_icon_max_height);
+            if (icon.getWidth() <= maxWidth && icon.getHeight() <= maxHeight) {
+                return icon;
+            }
+
+            double scale = Math.min(
+                    maxWidth / (double) Math.max(1, icon.getWidth()),
+                    maxHeight / (double) Math.max(1, icon.getHeight()));
+            return Bitmap.createScaledBitmap(
+                    icon,
+                    (int) Math.ceil(icon.getWidth() * scale),
+                    (int) Math.ceil(icon.getHeight() * scale),
+                    true /* filtered */);
+        }
+
+        /**
          * Set the sound to play.  It will play on the default stream.
          *
          * <p>
diff --git a/compat/src/main/java/androidx/core/graphics/drawable/IconCompat.java b/compat/src/main/java/androidx/core/graphics/drawable/IconCompat.java
index cd9968c..366ddf3 100644
--- a/compat/src/main/java/androidx/core/graphics/drawable/IconCompat.java
+++ b/compat/src/main/java/androidx/core/graphics/drawable/IconCompat.java
@@ -16,6 +16,12 @@
 
 package androidx.core.graphics.drawable;
 
+import static android.graphics.drawable.Icon.TYPE_ADAPTIVE_BITMAP;
+import static android.graphics.drawable.Icon.TYPE_BITMAP;
+import static android.graphics.drawable.Icon.TYPE_DATA;
+import static android.graphics.drawable.Icon.TYPE_RESOURCE;
+import static android.graphics.drawable.Icon.TYPE_URI;
+
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
@@ -57,6 +63,7 @@
 import androidx.annotation.VisibleForTesting;
 import androidx.core.content.ContextCompat;
 import androidx.core.content.res.ResourcesCompat;
+import androidx.core.os.BuildCompat;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -79,34 +86,6 @@
      */
     public static final int TYPE_UNKOWN = -1;
 
-    // TODO: Switch these to the public constants in the beta branch.
-    /**
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    public static final int TYPE_BITMAP = 1;
-    /**
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    public static final int TYPE_RESOURCE = 2;
-    /**
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    public static final int TYPE_DATA = 3;
-    /**
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    public static final int TYPE_URI = 4;
-    /**
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    public static final int TYPE_ADAPTIVE_BITMAP = 5;
-
-
     /**
      * @hide
      */
@@ -645,8 +624,10 @@
      */
     @IconType
     @RequiresApi(23)
-    public static int getType(Icon icon) {
-        // TODO: Switch to public APIs on P+ in beta branch.
+    public static int getType(@NonNull Icon icon) {
+        if (BuildCompat.isAtLeastP()) {
+            return icon.getType();
+        }
         try {
             return (int) icon.getClass().getMethod("getType").invoke(icon);
         } catch (IllegalAccessException e) {
@@ -671,8 +652,10 @@
      */
     @Nullable
     @RequiresApi(23)
-    public static String getResPackage(Icon icon) {
-        // TODO: Switch to public APIs on P+ in beta branch.
+    public static String getResPackage(@NonNull Icon icon) {
+        if (BuildCompat.isAtLeastP()) {
+            return icon.getResPackage();
+        }
         try {
             return (String) icon.getClass().getMethod("getResPackage").invoke(icon);
         } catch (IllegalAccessException e) {
@@ -697,8 +680,10 @@
      */
     @IdRes
     @RequiresApi(23)
-    public static int getResId(Icon icon) {
-        // TODO: Switch to public APIs on P+ in beta branch.
+    public static int getResId(@NonNull Icon icon) {
+        if (BuildCompat.isAtLeastP()) {
+            return icon.getResId();
+        }
         try {
             return (int) icon.getClass().getMethod("getResId").invoke(icon);
         } catch (IllegalAccessException e) {
@@ -723,8 +708,10 @@
      */
     @Nullable
     @RequiresApi(23)
-    public Uri getUri(Icon icon) {
-        // TODO: Switch to public APIs on P+ in beta branch.
+    public Uri getUri(@NonNull Icon icon) {
+        if (BuildCompat.isAtLeastP()) {
+            return icon.getUri();
+        }
         try {
             return (Uri) icon.getClass().getMethod("getUri").invoke(icon);
         } catch (IllegalAccessException e) {
diff --git a/compat/src/main/java/androidx/core/os/BuildCompat.java b/compat/src/main/java/androidx/core/os/BuildCompat.java
index 277a724..dc52d1b 100644
--- a/compat/src/main/java/androidx/core/os/BuildCompat.java
+++ b/compat/src/main/java/androidx/core/os/BuildCompat.java
@@ -81,14 +81,10 @@
     /**
      * Checks if the device is running on a pre-release version of Android P or newer.
      * <p>
-     * <strong>Note:</strong> This method will return {@code false} on devices running release
-     * versions of Android. When Android P is finalized for release, this method will be deprecated
-     * and all calls should be replaced with {@code Build.SDK_INT >= Build.VERSION_CODES.P}.
-     *
      * @return {@code true} if P APIs are available for use, {@code false} otherwise
      */
     public static boolean isAtLeastP() {
-        return VERSION.CODENAME.equals("P") || VERSION.CODENAME.equals("Q");
+        return VERSION.SDK_INT >= 28;
     }
 
     /**
diff --git a/compat/src/main/java/androidx/core/text/HtmlCompat.java b/compat/src/main/java/androidx/core/text/HtmlCompat.java
index b846805..a5b97ea 100644
--- a/compat/src/main/java/androidx/core/text/HtmlCompat.java
+++ b/compat/src/main/java/androidx/core/text/HtmlCompat.java
@@ -18,6 +18,8 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
 import android.annotation.SuppressLint;
 import android.graphics.Color;
 import android.os.Build;
@@ -33,6 +35,8 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 
+import java.lang.annotation.Retention;
+
 /**
  * Backwards compatible version of {@link Html}.
  */
@@ -119,6 +123,7 @@
             FROM_HTML_MODE_LEGACY
     }, flag = true)
     @RestrictTo(LIBRARY)
+    @Retention(SOURCE)
     @interface FromHtmlFlags {
     }
 
@@ -128,6 +133,7 @@
             TO_HTML_PARAGRAPH_LINES_INDIVIDUAL
     })
     @RestrictTo(LIBRARY)
+    @Retention(SOURCE)
     @interface ToHtmlOptions {
     }
 
diff --git a/compat/src/main/java/androidx/core/text/util/FindAddress.java b/compat/src/main/java/androidx/core/text/util/FindAddress.java
index 0602428..916db2b 100644
--- a/compat/src/main/java/androidx/core/text/util/FindAddress.java
+++ b/compat/src/main/java/androidx/core/text/util/FindAddress.java
@@ -466,20 +466,21 @@
 
                     // At this point we've matched a state; try to match a zip code after it.
                     Matcher zipMatcher = sWordRe.matcher(content);
-                    if (zipMatcher.find(stateMatch.end())
-                            && isValidZipCode(zipMatcher.group(0), stateMatch)) {
-                        return zipMatcher.end();
+                    if (zipMatcher.find(stateMatch.end())) {
+                        if (isValidZipCode(zipMatcher.group(0), stateMatch)) {
+                            return zipMatcher.end();
+                        }
+                    } else {
+                        // The content ends with a state but no zip
+                        // code. This is a legal match according to the
+                        // documentation. N.B. This is equivalent to the
+                        // original c++ implementation, which only allowed
+                        // the zip code to be optional at the end of the
+                        // string, which presumably is a bug.  We tried
+                        // relaxing this to work in other places but it
+                        // caused too many false positives.
+                        nonZipMatch = stateMatch.end();
                     }
-                    // The content ends with a state but no zip
-                    // code. This is a legal match according to the
-                    // documentation. N.B. This differs from the
-                    // original c++ implementation, which only allowed
-                    // the zip code to be optional at the end of the
-                    // string, which presumably is a bug.  Now we
-                    // prefer to find a match with a zip code, but
-                    // remember non-zip matches and return them if
-                    // necessary.
-                    nonZipMatch = stateMatch.end();
                 }
             }
         }
diff --git a/compat/src/main/java/androidx/core/view/ViewConfigurationCompat.java b/compat/src/main/java/androidx/core/view/ViewConfigurationCompat.java
index 89c3ca5..2e47e55 100644
--- a/compat/src/main/java/androidx/core/view/ViewConfigurationCompat.java
+++ b/compat/src/main/java/androidx/core/view/ViewConfigurationCompat.java
@@ -17,6 +17,7 @@
 package androidx.core.view;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.os.Build;
 import android.util.Log;
 import android.util.TypedValue;
@@ -130,5 +131,21 @@
         return config.getScaledTouchSlop() / 2;
     }
 
+    /**
+     * Check if shortcuts should be displayed in menus.
+     *
+     * @return {@code True} if shortcuts should be displayed in menus.
+     */
+    public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(ViewConfiguration config,
+            @NonNull Context context) {
+        if (android.os.Build.VERSION.SDK_INT >= 28) {
+            return config.shouldShowMenuShortcutsWhenKeyboardPresent();
+        }
+        final Resources res = context.getResources();
+        final int platformResId = res.getIdentifier(
+                "config_showMenuShortcutsWhenKeyboardPresent", "bool", "android");
+        return platformResId != 0 && res.getBoolean(platformResId);
+    }
+
     private ViewConfigurationCompat() {}
 }
diff --git a/core/ktx/OWNERS b/core/ktx/OWNERS
new file mode 100644
index 0000000..e450f4c
--- /dev/null
+++ b/core/ktx/OWNERS
@@ -0,0 +1 @@
+jakew@google.com
diff --git a/core/ktx/api/0.1.txt b/core/ktx/api/0.1.txt
new file mode 100644
index 0000000..e324352
--- /dev/null
+++ b/core/ktx/api/0.1.txt
@@ -0,0 +1,673 @@
+package androidx.animation {
+
+  public final class AnimatorKt {
+    ctor public AnimatorKt();
+    method public static final android.animation.Animator.AnimatorListener addListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onEnd = "null", kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onStart = "null", kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onCancel = "null", kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onRepeat = "null");
+    method @RequiresApi(19) public static final android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onResume = "null", kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onPause = "null");
+    method public static final android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static final android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static final android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static final android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static final android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static final android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.content {
+
+  public final class ContentValuesKt {
+    ctor public ContentValuesKt();
+    method public static final error.NonExistentClass contentValuesOf(kotlin.Pair<String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    ctor public ContextKt();
+    method public static final void withStyledAttributes(android.content.Context, android.util.AttributeSet? set = "null", int[] attrs, @AttrRes int defStyleAttr = "0", @StyleRes int defStyleRes = "0", kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static final void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    ctor public SharedPreferencesKt();
+    method public static final void edit(android.content.SharedPreferences, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.content.res {
+
+  public final class TypedArrayKt {
+    ctor public TypedArrayKt();
+    method public static final boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static final int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static final android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static final float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static final int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static final int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static final android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static final float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static final android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static final int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static final int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static final String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static final CharSequence[] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static final CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+  }
+
+}
+
+package androidx.database {
+
+  public final class CursorKt {
+    ctor public CursorKt();
+    method public static final byte[] getBlob(android.database.Cursor, String columnName);
+    method public static final byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static final error.NonExistentClass getBlobOrNull(android.database.Cursor, String columnName);
+    method public static final double getDouble(android.database.Cursor, String columnName);
+    method public static final Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static final error.NonExistentClass getDoubleOrNull(android.database.Cursor, String columnName);
+    method public static final float getFloat(android.database.Cursor, String columnName);
+    method public static final Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static final error.NonExistentClass getFloatOrNull(android.database.Cursor, String columnName);
+    method public static final int getInt(android.database.Cursor, String columnName);
+    method public static final Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static final error.NonExistentClass getIntOrNull(android.database.Cursor, String columnName);
+    method public static final long getLong(android.database.Cursor, String columnName);
+    method public static final Long? getLongOrNull(android.database.Cursor, int index);
+    method public static final error.NonExistentClass getLongOrNull(android.database.Cursor, String columnName);
+    method public static final short getShort(android.database.Cursor, String columnName);
+    method public static final Short? getShortOrNull(android.database.Cursor, int index);
+    method public static final error.NonExistentClass getShortOrNull(android.database.Cursor, String columnName);
+    method public static final String getString(android.database.Cursor, String columnName);
+    method public static final String? getStringOrNull(android.database.Cursor, int index);
+    method public static final error.NonExistentClass getStringOrNull(android.database.Cursor, String columnName);
+  }
+
+}
+
+package androidx.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    ctor public SQLiteDatabaseKt();
+    method public static final <T> T! transaction(android.database.sqlite.SQLiteDatabase, boolean exclusive = "true", kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.graphics {
+
+  public final class BitmapKt {
+    ctor public BitmapKt();
+    method public static final android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static final android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = "Bitmap.Config.ARGB_8888");
+    method @RequiresApi(26) public static final android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = "Bitmap.Config.ARGB_8888", boolean hasAlpha = "true", android.graphics.ColorSpace colorSpace = "ColorSpace.get(ColorSpace.Named.SRGB)");
+    method public static final operator int get(android.graphics.Bitmap, int x, int y);
+    method public static final android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, boolean filter = "true");
+    method public static final operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    ctor public CanvasKt();
+    method public static final void withRotation(android.graphics.Canvas, float degrees = "0.0f", float pivotX = "0.0f", float pivotY = "0.0f", kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static final void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static final void withScale(android.graphics.Canvas, float x = "1.0f", float y = "1.0f", float pivotX = "0.0f", float pivotY = "0.0f", kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static final void withSkew(android.graphics.Canvas, float x = "0.0f", float y = "0.0f", kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static final void withTranslation(android.graphics.Canvas, float x = "0.0f", float y = "0.0f", kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    ctor public ColorKt();
+    method @RequiresApi(26) public static final operator float component1(android.graphics.Color);
+    method public static final operator int component1(int);
+    method @RequiresApi(26) public static final operator float component1(long);
+    method @RequiresApi(26) public static final operator float component2(android.graphics.Color);
+    method public static final operator int component2(int);
+    method @RequiresApi(26) public static final operator float component2(long);
+    method @RequiresApi(26) public static final operator float component3(android.graphics.Color);
+    method public static final operator int component3(int);
+    method @RequiresApi(26) public static final operator float component3(long);
+    method @RequiresApi(26) public static final operator float component4(android.graphics.Color);
+    method public static final operator int component4(int);
+    method @RequiresApi(26) public static final operator float component4(long);
+    method public static final int getAlpha(int);
+    method @RequiresApi(26) public static final float getAlpha(long);
+    method public static final int getBlue(int);
+    method @RequiresApi(26) public static final float getBlue(long);
+    method @RequiresApi(26) public static final android.graphics.ColorSpace getColorSpace(long);
+    method public static final int getGreen(int);
+    method @RequiresApi(26) public static final float getGreen(long);
+    method @RequiresApi(26) public static final float getLuminance(int);
+    method @RequiresApi(26) public static final float getLuminance(long);
+    method public static final int getRed(int);
+    method @RequiresApi(26) public static final float getRed(long);
+    method @RequiresApi(26) public static final boolean isSrgb(long);
+    method @RequiresApi(26) public static final boolean isWideGamut(long);
+    method @RequiresApi(26) public static final operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static final android.graphics.Color toColor(int);
+    method @RequiresApi(26) public static final android.graphics.Color toColor(long);
+    method @RequiresApi(26) @ColorInt public static final int toColorInt(long);
+    method @RequiresApi(26) @ColorLong public static final long toColorLong(int);
+  }
+
+  public final class MatrixKt {
+    ctor public MatrixKt();
+    method public static final error.NonExistentClass rotationMatrix(float degrees, float px = "0.0f", float py = "0.0f");
+    method public static final error.NonExistentClass scaleMatrix(float sx = "1.0f", float sy = "1.0f");
+    method public static final operator error.NonExistentClass times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static final error.NonExistentClass translationMatrix(float tx = "0.0f", float ty = "0.0f");
+    method public static final error.NonExistentClass values(android.graphics.Matrix);
+  }
+
+  public final class PathKt {
+    ctor public PathKt();
+    method @RequiresApi(19) public static final infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static final Iterable<androidx.graphics.PathSegment> flatten(android.graphics.Path, float error = "0.5f");
+    method @RequiresApi(19) public static final operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static final infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static final operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static final infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF start, float startFraction, android.graphics.PointF end, float endFraction);
+    method public final android.graphics.PointF component1();
+    method public final float component2();
+    method public final android.graphics.PointF component3();
+    method public final float component4();
+    method public final androidx.graphics.PathSegment copy(android.graphics.PointF start, float startFraction, android.graphics.PointF end, float endFraction);
+    method public final android.graphics.PointF getEnd();
+    method public final float getEndFraction();
+    method public final android.graphics.PointF getStart();
+    method public final float getStartFraction();
+  }
+
+  public final class PictureKt {
+    ctor public PictureKt();
+    method public static final android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    ctor public PointKt();
+    method public static final operator int component1(android.graphics.Point);
+    method public static final operator float component1(android.graphics.PointF);
+    method public static final operator int component2(android.graphics.Point);
+    method public static final operator float component2(android.graphics.PointF);
+    method public static final operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static final operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static final operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static final operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static final operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static final operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static final operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static final operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static final android.graphics.Point toPoint(android.graphics.PointF);
+    method public static final android.graphics.PointF toPointF(android.graphics.Point);
+    method public static final operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static final operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    ctor public PorterDuffKt();
+    method public static final android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static final android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    ctor public RectKt();
+    method public static final infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static final infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static final operator int component1(android.graphics.Rect);
+    method public static final operator float component1(android.graphics.RectF);
+    method public static final operator int component2(android.graphics.Rect);
+    method public static final operator float component2(android.graphics.RectF);
+    method public static final operator int component3(android.graphics.Rect);
+    method public static final operator float component3(android.graphics.RectF);
+    method public static final operator int component4(android.graphics.Rect);
+    method public static final operator float component4(android.graphics.RectF);
+    method public static final operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static final operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static final operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static final operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static final operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static final operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static final operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static final operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static final infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static final infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static final operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static final operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static final operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static final operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static final operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static final operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static final android.graphics.Rect toRect(android.graphics.RectF);
+    method public static final android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static final android.graphics.Region toRegion(android.graphics.Rect);
+    method public static final android.graphics.Region toRegion(android.graphics.RectF);
+    method public static final error.NonExistentClass transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static final infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static final infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    ctor public RegionKt();
+    method public static final infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static final infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static final operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static final void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static final operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static final operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static final operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static final operator android.graphics.Region not(android.graphics.Region);
+    method public static final infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static final infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static final operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static final operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static final operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static final infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static final infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    ctor public ShaderKt();
+    method public static final void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    ctor public BitmapDrawableKt();
+    method public static final android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    ctor public ColorDrawableKt();
+    method public static final android.graphics.drawable.ColorDrawable toDrawable(int);
+    method @RequiresApi(26) public static final android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    ctor public DrawableKt();
+    method public static final android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, int width = "intrinsicWidth", int height = "intrinsicHeight", android.graphics.Bitmap.Config? config = "null");
+    method public static final void updateBounds(android.graphics.drawable.Drawable, int left = "bounds.left", int top = "bounds.top", int right = "bounds.right", int bottom = "bounds.bottom");
+  }
+
+  public final class IconKt {
+    ctor public IconKt();
+    method @RequiresApi(26) public static final android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static final android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static final android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static final android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.net {
+
+  public final class UriKt {
+    ctor public UriKt();
+    method public static final android.net.Uri toUri(String);
+  }
+
+}
+
+package androidx.os {
+
+  public final class BundleKt {
+    ctor public BundleKt();
+    method public static final error.NonExistentClass bundleOf(kotlin.Pair<String,?>... pairs);
+  }
+
+  public final class HandlerKt {
+    ctor public HandlerKt();
+    method public static final error.NonExistentClass postAtTime(android.os.Handler, long uptimeMillis, Object? token = "null", kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static final void postDelayed(android.os.Handler, Runnable runnable, Object? token, long delayInMillis);
+    method public static final error.NonExistentClass postDelayed(android.os.Handler, long delayInMillis, Object? token = "null", kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static final error.NonExistentClass postDelayed(android.os.Handler, long amount, java.util.concurrent.TimeUnit unit, Object? token = "null", kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(26) public static final error.NonExistentClass postDelayed(android.os.Handler, java.time.Duration duration, Object? token = "null", kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    ctor public PersistableBundleKt();
+    method @RequiresApi(21) public static final error.NonExistentClass persistableBundleOf(kotlin.Pair<String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    ctor public TraceKt();
+    method public static final <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.text {
+
+  public final class SpannableStringBuilderKt {
+    ctor public SpannableStringBuilderKt();
+    method public static final android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static final android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static final android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static final android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static final android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object[] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static final android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static final android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+}
+
+package androidx.time {
+
+  public final class DayOfWeekKt {
+    ctor public DayOfWeekKt();
+    method @RequiresApi(26) public static final java.time.DayOfWeek asDayOfWeek(int);
+    method @RequiresApi(26) public static final int asInt(java.time.DayOfWeek);
+  }
+
+  public final class DurationKt {
+    ctor public DurationKt();
+    method @RequiresApi(26) public static final operator long component1(java.time.Duration);
+    method @RequiresApi(26) public static final operator int component2(java.time.Duration);
+    method @RequiresApi(26) public static final operator java.time.Duration div(java.time.Duration, long divisor);
+    method @RequiresApi(260) public static final java.time.Duration hours(int);
+    method @RequiresApi(260) public static final java.time.Duration hours(long);
+    method @RequiresApi(26) public static final java.time.Duration millis(int);
+    method @RequiresApi(26) public static final java.time.Duration millis(long);
+    method @RequiresApi(260) public static final java.time.Duration minutes(int);
+    method @RequiresApi(260) public static final java.time.Duration minutes(long);
+    method @RequiresApi(26) public static final java.time.Duration nanos(int);
+    method @RequiresApi(26) public static final java.time.Duration nanos(long);
+    method @RequiresApi(26) public static final java.time.Duration seconds(int);
+    method @RequiresApi(26) public static final java.time.Duration seconds(long);
+    method @RequiresApi(26) public static final operator java.time.Duration times(java.time.Duration, long multiplicand);
+    method @RequiresApi(26) public static final operator java.time.Duration unaryMinus(java.time.Duration);
+  }
+
+  public final class InstantKt {
+    ctor public InstantKt();
+    method @RequiresApi(26) public static final java.time.Instant asEpochMillis(long);
+    method @RequiresApi(26) public static final java.time.Instant asEpochSeconds(long);
+    method @RequiresApi(26) public static final operator long component1(java.time.Instant);
+    method @RequiresApi(26) public static final operator int component2(java.time.Instant);
+  }
+
+  public final class LocalDateKt {
+    ctor public LocalDateKt();
+    method @RequiresApi(26) public static final operator int component1(java.time.LocalDate);
+    method @RequiresApi(26) public static final operator java.time.Month component2(java.time.LocalDate);
+    method @RequiresApi(26) public static final operator int component3(java.time.LocalDate);
+  }
+
+  public final class LocalDateTimeKt {
+    ctor public LocalDateTimeKt();
+    method @RequiresApi(26) public static final operator java.time.LocalDate component1(java.time.LocalDateTime);
+    method @RequiresApi(26) public static final operator java.time.LocalTime component2(java.time.LocalDateTime);
+  }
+
+  public final class LocalTimeKt {
+    ctor public LocalTimeKt();
+    method @RequiresApi(26) public static final operator int component1(java.time.LocalTime);
+    method @RequiresApi(26) public static final operator int component2(java.time.LocalTime);
+    method @RequiresApi(26) public static final operator int component3(java.time.LocalTime);
+    method @RequiresApi(26) public static final operator int component4(java.time.LocalTime);
+  }
+
+  public final class MonthDayKt {
+    ctor public MonthDayKt();
+    method @RequiresApi(26) public static final operator java.time.Month component1(java.time.MonthDay);
+    method @RequiresApi(26) public static final operator int component2(java.time.MonthDay);
+  }
+
+  public final class MonthKt {
+    ctor public MonthKt();
+    method @RequiresApi(26) public static final int asInt(java.time.Month);
+    method @RequiresApi(26) public static final java.time.Month asMonth(int);
+  }
+
+  public final class OffsetDateTimeKt {
+    ctor public OffsetDateTimeKt();
+    method @RequiresApi(26) public static final operator java.time.LocalDateTime component1(java.time.OffsetDateTime);
+    method @RequiresApi(26) public static final operator java.time.ZoneOffset component2(java.time.OffsetDateTime);
+  }
+
+  public final class OffsetTimeKt {
+    ctor public OffsetTimeKt();
+    method @RequiresApi(26) public static final operator java.time.LocalTime component1(java.time.OffsetTime);
+    method @RequiresApi(26) public static final operator java.time.ZoneOffset component2(java.time.OffsetTime);
+  }
+
+  public final class PeriodKt {
+    ctor public PeriodKt();
+    method @RequiresApi(26) public static final operator int component1(java.time.Period);
+    method @RequiresApi(26) public static final operator int component2(java.time.Period);
+    method @RequiresApi(26) public static final operator int component3(java.time.Period);
+    method @RequiresApi(26) public static final java.time.Period days(int);
+    method @RequiresApi(26) public static final java.time.Period months(int);
+    method @RequiresApi(26) public static final operator java.time.Period times(java.time.Period, int multiplicand);
+    method @RequiresApi(26) public static final operator java.time.Period unaryMinus(java.time.Period);
+    method @RequiresApi(26) public static final java.time.Period years(int);
+  }
+
+  public final class YearKt {
+    ctor public YearKt();
+    method @RequiresApi(26) public static final int asInt(java.time.Year);
+    method @RequiresApi(26) public static final java.time.Year asYear(int);
+  }
+
+  public final class YearMonthKt {
+    ctor public YearMonthKt();
+    method @RequiresApi(26) public static final operator int component1(java.time.YearMonth);
+    method @RequiresApi(26) public static final operator java.time.Month component2(java.time.YearMonth);
+  }
+
+  public final class ZonedDateTimeKt {
+    ctor public ZonedDateTimeKt();
+    method @RequiresApi(26) public static final operator java.time.LocalDateTime component1(java.time.ZonedDateTime);
+    method @RequiresApi(26) public static final operator java.time.ZoneId component2(java.time.ZonedDateTime);
+  }
+
+}
+
+package androidx.transition {
+
+  public final class TransitionKt {
+    ctor public TransitionKt();
+    method @RequiresApi(19) public static final void addListener(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onEnd = "null", kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onStart = "null", kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onCancel = "null", kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onResume = "null", kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onPause = "null");
+    method @RequiresApi(19) public static final void doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static final void doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static final void doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static final void doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static final void doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.util {
+
+  public final class ArrayMapKt {
+    ctor public ArrayMapKt();
+    method @RequiresApi(19) public static final <K, V> android.util.ArrayMap<K,V> arrayMapOf();
+    method @RequiresApi(19) public static final <K, V> android.util.ArrayMap<K,V> arrayMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+  }
+
+  public final class ArraySetKt {
+    ctor public ArraySetKt();
+    method @RequiresApi(23) public static final <T> android.util.ArraySet<T> arraySetOf();
+    method @RequiresApi(23) public static final <T> android.util.ArraySet<T> arraySetOf(T... values);
+  }
+
+  public final class AtomicFileKt {
+    ctor public AtomicFileKt();
+    method @RequiresApi(17) public static final byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static final String readText(android.util.AtomicFile, java.nio.charset.Charset charset = "Charsets.UTF_8");
+    method @RequiresApi(17) public static final void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static final void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static final void writeText(android.util.AtomicFile, String text, java.nio.charset.Charset charset = "Charsets.UTF_8");
+  }
+
+  public final class HalfKt {
+    ctor public HalfKt();
+    method @RequiresApi(26) public static final android.util.Half toHalf(short);
+    method @RequiresApi(26) public static final android.util.Half toHalf(float);
+    method @RequiresApi(26) public static final android.util.Half toHalf(double);
+    method @RequiresApi(26) public static final android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    ctor public LongSparseArrayKt();
+    method @RequiresApi(16) public static final operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static final <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static final <T> boolean containsValue(android.util.LongSparseArray<T>, T! value);
+    method @RequiresApi(16) public static final <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static final <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T! defaultValue);
+    method @RequiresApi(16) public static final <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static final <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static final <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static final <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static final <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static final operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static final <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static final <T> boolean remove(android.util.LongSparseArray<T>, long key, T! value);
+    method @RequiresApi(16) public static final operator <T> void set(android.util.LongSparseArray<T>, long key, T! value);
+    method @RequiresApi(16) public static final <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class PairKt {
+    ctor public PairKt();
+    method public static final operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static final operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static final <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static final <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    ctor public RangeKt();
+    method @RequiresApi(21) public static final infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static final operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static final operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static final infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static final <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static final <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    ctor public SizeKt();
+    method @RequiresApi(21) public static final operator int component1(android.util.Size);
+    method @RequiresApi(21) public static final operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static final operator int component2(android.util.Size);
+    method @RequiresApi(21) public static final operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    ctor public SparseArrayKt();
+    method public static final operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static final <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static final <T> boolean containsValue(android.util.SparseArray<T>, T! value);
+    method public static final <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super Integer,? super T,kotlin.Unit> action);
+    method public static final <T> T! getOrDefault(android.util.SparseArray<T>, int key, T! defaultValue);
+    method public static final <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static final <T> int getSize(android.util.SparseArray<T>);
+    method public static final <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static final <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static final <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static final operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static final <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static final <T> boolean remove(android.util.SparseArray<T>, int key, T! value);
+    method public static final operator <T> void set(android.util.SparseArray<T>, int key, T! value);
+    method public static final <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    ctor public SparseBooleanArrayKt();
+    method public static final operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static final boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static final boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static final void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super Integer,? super Boolean,kotlin.Unit> action);
+    method public static final boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static final error.NonExistentClass getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<Boolean> defaultValue);
+    method public static final int getSize(android.util.SparseBooleanArray);
+    method public static final boolean isEmpty(android.util.SparseBooleanArray);
+    method public static final boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static final kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static final operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static final void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static final boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static final void removeAt(android.util.SparseBooleanArray, int index);
+    method public static final operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static final kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    ctor public SparseIntArrayKt();
+    method public static final operator boolean contains(android.util.SparseIntArray, int key);
+    method public static final boolean containsKey(android.util.SparseIntArray, int key);
+    method public static final boolean containsValue(android.util.SparseIntArray, int value);
+    method public static final void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super Integer,? super Integer,kotlin.Unit> action);
+    method public static final int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static final error.NonExistentClass getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<Integer> defaultValue);
+    method public static final int getSize(android.util.SparseIntArray);
+    method public static final boolean isEmpty(android.util.SparseIntArray);
+    method public static final boolean isNotEmpty(android.util.SparseIntArray);
+    method public static final kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static final operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static final void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static final boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static final operator void set(android.util.SparseIntArray, int key, int value);
+    method public static final kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    ctor public SparseLongArrayKt();
+    method @RequiresApi(18) public static final operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static final boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static final boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static final void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super Integer,? super Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static final long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static final error.NonExistentClass getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<Long> defaultValue);
+    method @RequiresApi(18) public static final int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static final boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static final boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static final kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static final operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static final void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static final boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static final operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static final kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.view {
+
+  public final class ViewGroupKt {
+    ctor public ViewGroupKt();
+    method public static final operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static final void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static final void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super Integer,? super android.view.View,kotlin.Unit> action);
+    method public static final operator android.view.View get(android.view.ViewGroup, int index);
+    method public static final int getSize(android.view.ViewGroup);
+    method public static final boolean isEmpty(android.view.ViewGroup);
+    method public static final boolean isNotEmpty(android.view.ViewGroup);
+    method public static final operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static final operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static final operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static final void setMargins(android.view.ViewGroup.MarginLayoutParams, int size);
+    method public static final void updateMargins(android.view.ViewGroup.MarginLayoutParams, int left = "leftMargin", int top = "topMargin", int right = "rightMargin", int bottom = "bottomMargin");
+    method @RequiresApi(17) public static final void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, int start = "marginStart", int top = "topMargin", int end = "marginEnd", int bottom = "bottomMargin");
+  }
+
+  public final class ViewKt {
+    ctor public ViewKt();
+    method public static final void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static final void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static final void doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static final Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static final Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static final void setPadding(android.view.View, int size);
+    method public static final android.graphics.Bitmap toBitmap(android.view.View, android.graphics.Bitmap.Config config = "Bitmap.Config.ARGB_8888");
+    method public static final void updatePadding(android.view.View, int left = "paddingLeft", int top = "paddingTop", int right = "paddingRight", int bottom = "paddingBottom");
+    method @RequiresApi(17) public static final void updatePaddingRelative(android.view.View, int start = "paddingStart", int top = "paddingTop", int end = "paddingEnd", int bottom = "paddingBottom");
+  }
+
+}
+
diff --git a/core/ktx/api/0.2.txt b/core/ktx/api/0.2.txt
new file mode 100644
index 0000000..5fbfe40
--- /dev/null
+++ b/core/ktx/api/0.2.txt
@@ -0,0 +1,742 @@
+package androidx.animation {
+
+  public final class AnimatorKt {
+    ctor public AnimatorKt();
+    method public static android.animation.Animator.AnimatorListener addListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onEnd = "null", kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onStart = "null", kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onCancel = "null", kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onRepeat = "null");
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onResume = "null", kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onPause = "null");
+    method public static android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.content {
+
+  public final class ContentValuesKt {
+    ctor public ContentValuesKt();
+    method public static error.NonExistentClass contentValuesOf(kotlin.Pair<String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    ctor public ContextKt();
+    method public static void withStyledAttributes(android.content.Context, android.util.AttributeSet? set = "null", int[] attrs, @AttrRes int defStyleAttr = "0", @StyleRes int defStyleRes = "0", kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    ctor public SharedPreferencesKt();
+    method public static void edit(android.content.SharedPreferences, boolean commit = "false", kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.content.res {
+
+  public final class TypedArrayKt {
+    ctor public TypedArrayKt();
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence[] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.database {
+
+  public final class CursorKt {
+    ctor public CursorKt();
+    method public static byte[] getBlob(android.database.Cursor, String columnName);
+    method public static byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static error.NonExistentClass getBlobOrNull(android.database.Cursor, String columnName);
+    method public static double getDouble(android.database.Cursor, String columnName);
+    method public static Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static error.NonExistentClass getDoubleOrNull(android.database.Cursor, String columnName);
+    method public static float getFloat(android.database.Cursor, String columnName);
+    method public static Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static error.NonExistentClass getFloatOrNull(android.database.Cursor, String columnName);
+    method public static int getInt(android.database.Cursor, String columnName);
+    method public static Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static error.NonExistentClass getIntOrNull(android.database.Cursor, String columnName);
+    method public static long getLong(android.database.Cursor, String columnName);
+    method public static Long? getLongOrNull(android.database.Cursor, int index);
+    method public static error.NonExistentClass getLongOrNull(android.database.Cursor, String columnName);
+    method public static short getShort(android.database.Cursor, String columnName);
+    method public static Short? getShortOrNull(android.database.Cursor, int index);
+    method public static error.NonExistentClass getShortOrNull(android.database.Cursor, String columnName);
+    method public static String getString(android.database.Cursor, String columnName);
+    method public static String? getStringOrNull(android.database.Cursor, int index);
+    method public static error.NonExistentClass getStringOrNull(android.database.Cursor, String columnName);
+  }
+
+}
+
+package androidx.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    ctor public SQLiteDatabaseKt();
+    method public static <T> T! transaction(android.database.sqlite.SQLiteDatabase, boolean exclusive = "true", kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.graphics {
+
+  public final class BitmapKt {
+    ctor public BitmapKt();
+    method public static android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = "Bitmap.Config.ARGB_8888");
+    method @RequiresApi(26) public static android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = "Bitmap.Config.ARGB_8888", boolean hasAlpha = "true", android.graphics.ColorSpace colorSpace = "ColorSpace.get(ColorSpace.Named.SRGB)");
+    method public static operator int get(android.graphics.Bitmap, int x, int y);
+    method public static android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, boolean filter = "true");
+    method public static operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    ctor public CanvasKt();
+    method public static void withRotation(android.graphics.Canvas, float degrees = "0.0f", float pivotX = "0.0f", float pivotY = "0.0f", kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static void withScale(android.graphics.Canvas, float x = "1.0f", float y = "1.0f", float pivotX = "0.0f", float pivotY = "0.0f", kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static void withSkew(android.graphics.Canvas, float x = "0.0f", float y = "0.0f", kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static void withTranslation(android.graphics.Canvas, float x = "0.0f", float y = "0.0f", kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    ctor public ColorKt();
+    method @RequiresApi(26) public static operator float component1(android.graphics.Color);
+    method public static operator int component1(int);
+    method @RequiresApi(26) public static operator float component1(long);
+    method @RequiresApi(26) public static operator float component2(android.graphics.Color);
+    method public static operator int component2(int);
+    method @RequiresApi(26) public static operator float component2(long);
+    method @RequiresApi(26) public static operator float component3(android.graphics.Color);
+    method public static operator int component3(int);
+    method @RequiresApi(26) public static operator float component3(long);
+    method @RequiresApi(26) public static operator float component4(android.graphics.Color);
+    method public static operator int component4(int);
+    method @RequiresApi(26) public static operator float component4(long);
+    method public static int getAlpha(int);
+    method @RequiresApi(26) public static float getAlpha(long);
+    method public static int getBlue(int);
+    method @RequiresApi(26) public static float getBlue(long);
+    method @RequiresApi(26) public static android.graphics.ColorSpace getColorSpace(long);
+    method public static int getGreen(int);
+    method @RequiresApi(26) public static float getGreen(long);
+    method @RequiresApi(26) public static float getLuminance(int);
+    method @RequiresApi(26) public static float getLuminance(long);
+    method public static int getRed(int);
+    method @RequiresApi(26) public static float getRed(long);
+    method @RequiresApi(26) public static boolean isSrgb(long);
+    method @RequiresApi(26) public static boolean isWideGamut(long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static android.graphics.Color toColor(int);
+    method @RequiresApi(26) public static android.graphics.Color toColor(long);
+    method @RequiresApi(26) @ColorInt public static int toColorInt(long);
+    method @ColorInt public static int toColorInt(String);
+    method @RequiresApi(26) @ColorLong public static long toColorLong(int);
+  }
+
+  public final class MatrixKt {
+    ctor public MatrixKt();
+    method public static error.NonExistentClass rotationMatrix(float degrees, float px = "0.0f", float py = "0.0f");
+    method public static error.NonExistentClass scaleMatrix(float sx = "1.0f", float sy = "1.0f");
+    method public static operator error.NonExistentClass times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static error.NonExistentClass translationMatrix(float tx = "0.0f", float ty = "0.0f");
+    method public static error.NonExistentClass values(android.graphics.Matrix);
+  }
+
+  public final class PathKt {
+    ctor public PathKt();
+    method @RequiresApi(19) public static infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.graphics.PathSegment> flatten(android.graphics.Path, float error = "0.5f");
+    method @RequiresApi(19) public static operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF start, float startFraction, android.graphics.PointF end, float endFraction);
+    method public android.graphics.PointF component1();
+    method public float component2();
+    method public android.graphics.PointF component3();
+    method public float component4();
+    method public androidx.graphics.PathSegment copy(android.graphics.PointF start, float startFraction, android.graphics.PointF end, float endFraction);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PictureKt {
+    ctor public PictureKt();
+    method public static android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    ctor public PointKt();
+    method public static operator int component1(android.graphics.Point);
+    method public static operator float component1(android.graphics.PointF);
+    method public static operator int component2(android.graphics.Point);
+    method public static operator float component2(android.graphics.PointF);
+    method public static operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static android.graphics.Point toPoint(android.graphics.PointF);
+    method public static android.graphics.PointF toPointF(android.graphics.Point);
+    method public static operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    ctor public PorterDuffKt();
+    method public static android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    ctor public RectKt();
+    method public static infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static operator int component1(android.graphics.Rect);
+    method public static operator float component1(android.graphics.RectF);
+    method public static operator int component2(android.graphics.Rect);
+    method public static operator float component2(android.graphics.RectF);
+    method public static operator int component3(android.graphics.Rect);
+    method public static operator float component3(android.graphics.RectF);
+    method public static operator int component4(android.graphics.Rect);
+    method public static operator float component4(android.graphics.RectF);
+    method public static operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static android.graphics.Rect toRect(android.graphics.RectF);
+    method public static android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static android.graphics.Region toRegion(android.graphics.Rect);
+    method public static android.graphics.Region toRegion(android.graphics.RectF);
+    method public static error.NonExistentClass transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    ctor public RegionKt();
+    method public static infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static operator android.graphics.Region not(android.graphics.Region);
+    method public static infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    ctor public ShaderKt();
+    method public static void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    ctor public BitmapDrawableKt();
+    method public static android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    ctor public ColorDrawableKt();
+    method public static android.graphics.drawable.ColorDrawable toDrawable(int);
+    method @RequiresApi(26) public static android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    ctor public DrawableKt();
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, @Px int width = "intrinsicWidth", @Px int height = "intrinsicHeight", android.graphics.Bitmap.Config? config = "null");
+    method public static void updateBounds(android.graphics.drawable.Drawable, @Px int left = "bounds.left", @Px int top = "bounds.top", @Px int right = "bounds.right", @Px int bottom = "bounds.bottom");
+  }
+
+  public final class IconKt {
+    ctor public IconKt();
+    method @RequiresApi(26) public static android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.net {
+
+  public final class UriKt {
+    ctor public UriKt();
+    method public static android.net.Uri toUri(String);
+  }
+
+}
+
+package androidx.os {
+
+  public final class BundleKt {
+    ctor public BundleKt();
+    method public static error.NonExistentClass bundleOf(kotlin.Pair<String,?>... pairs);
+  }
+
+  public final class FileKt {
+    ctor public FileKt();
+    method public static android.net.Uri toUri(java.io.File);
+  }
+
+  public final class HandlerKt {
+    ctor public HandlerKt();
+    method public static error.NonExistentClass postAtTime(android.os.Handler, long uptimeMillis, Object? token = "null", kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static void postDelayed(android.os.Handler, Runnable runnable, Object? token, long delayInMillis);
+    method public static error.NonExistentClass postDelayed(android.os.Handler, long delayInMillis, Object? token = "null", kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static error.NonExistentClass postDelayed(android.os.Handler, long amount, java.util.concurrent.TimeUnit unit, Object? token = "null", kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(26) public static error.NonExistentClass postDelayed(android.os.Handler, java.time.Duration duration, Object? token = "null", kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    ctor public PersistableBundleKt();
+    method @RequiresApi(21) public static error.NonExistentClass persistableBundleOf(kotlin.Pair<String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    ctor public TraceKt();
+    method public static <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.text {
+
+  public final class CharSequenceKt {
+    ctor public CharSequenceKt();
+    method public static boolean isDigitsOnly(CharSequence);
+    method public static int trimmedLength(CharSequence);
+  }
+
+  public final class SpannableStringBuilderKt {
+    ctor public SpannableStringBuilderKt();
+    method public static android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object[] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    ctor public SpannableStringKt();
+    method public static error.NonExistentClass clearSpans(android.text.Spannable);
+    method public static operator void minusAssign(android.text.Spannable, Object span);
+    method public static operator void plusAssign(android.text.Spannable, Object span);
+    method public static android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    ctor public SpannedStringKt();
+    method public static android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    ctor public StringKt();
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.time {
+
+  public final class DayOfWeekKt {
+    ctor public DayOfWeekKt();
+    method @RequiresApi(26) deprecated public static java.time.DayOfWeek asDayOfWeek(int);
+    method @RequiresApi(26) deprecated public static int asInt(java.time.DayOfWeek);
+  }
+
+  public final class DeprecationKt {
+    ctor public DeprecationKt();
+  }
+
+  public final class DurationKt {
+    ctor public DurationKt();
+    method @RequiresApi(26) deprecated public static operator long component1(java.time.Duration);
+    method @RequiresApi(26) deprecated public static operator int component2(java.time.Duration);
+    method @RequiresApi(26) deprecated public static operator java.time.Duration div(java.time.Duration, long divisor);
+    method @RequiresApi(26) deprecated public static java.time.Duration hours(int);
+    method @RequiresApi(26) deprecated public static java.time.Duration hours(long);
+    method @RequiresApi(26) deprecated public static java.time.Duration millis(int);
+    method @RequiresApi(26) deprecated public static java.time.Duration millis(long);
+    method @RequiresApi(26) deprecated public static java.time.Duration minutes(int);
+    method @RequiresApi(26) deprecated public static java.time.Duration minutes(long);
+    method @RequiresApi(26) deprecated public static java.time.Duration nanos(int);
+    method @RequiresApi(26) deprecated public static java.time.Duration nanos(long);
+    method @RequiresApi(26) deprecated public static java.time.Duration seconds(int);
+    method @RequiresApi(26) deprecated public static java.time.Duration seconds(long);
+    method @RequiresApi(26) deprecated public static operator java.time.Duration times(java.time.Duration, long multiplicand);
+    method @RequiresApi(26) deprecated public static operator java.time.Duration unaryMinus(java.time.Duration);
+  }
+
+  public final class InstantKt {
+    ctor public InstantKt();
+    method @RequiresApi(26) deprecated public static java.time.Instant asEpochMillis(long);
+    method @RequiresApi(26) deprecated public static java.time.Instant asEpochSeconds(long);
+    method @RequiresApi(26) deprecated public static operator long component1(java.time.Instant);
+    method @RequiresApi(26) deprecated public static operator int component2(java.time.Instant);
+  }
+
+  public final class LocalDateKt {
+    ctor public LocalDateKt();
+    method @RequiresApi(26) deprecated public static operator int component1(java.time.LocalDate);
+    method @RequiresApi(26) deprecated public static operator java.time.Month component2(java.time.LocalDate);
+    method @RequiresApi(26) deprecated public static operator int component3(java.time.LocalDate);
+  }
+
+  public final class LocalDateTimeKt {
+    ctor public LocalDateTimeKt();
+    method @RequiresApi(26) deprecated public static operator java.time.LocalDate component1(java.time.LocalDateTime);
+    method @RequiresApi(26) deprecated public static operator java.time.LocalTime component2(java.time.LocalDateTime);
+  }
+
+  public final class LocalTimeKt {
+    ctor public LocalTimeKt();
+    method @RequiresApi(26) deprecated public static operator int component1(java.time.LocalTime);
+    method @RequiresApi(26) deprecated public static operator int component2(java.time.LocalTime);
+    method @RequiresApi(26) deprecated public static operator int component3(java.time.LocalTime);
+    method @RequiresApi(26) deprecated public static operator int component4(java.time.LocalTime);
+  }
+
+  public final class MonthDayKt {
+    ctor public MonthDayKt();
+    method @RequiresApi(26) deprecated public static operator java.time.Month component1(java.time.MonthDay);
+    method @RequiresApi(26) deprecated public static operator int component2(java.time.MonthDay);
+  }
+
+  public final class MonthKt {
+    ctor public MonthKt();
+    method @RequiresApi(26) deprecated public static int asInt(java.time.Month);
+    method @RequiresApi(26) deprecated public static java.time.Month asMonth(int);
+  }
+
+  public final class OffsetDateTimeKt {
+    ctor public OffsetDateTimeKt();
+    method @RequiresApi(26) deprecated public static operator java.time.LocalDateTime component1(java.time.OffsetDateTime);
+    method @RequiresApi(26) deprecated public static operator java.time.ZoneOffset component2(java.time.OffsetDateTime);
+  }
+
+  public final class OffsetTimeKt {
+    ctor public OffsetTimeKt();
+    method @RequiresApi(26) deprecated public static operator java.time.LocalTime component1(java.time.OffsetTime);
+    method @RequiresApi(26) deprecated public static operator java.time.ZoneOffset component2(java.time.OffsetTime);
+  }
+
+  public final class PeriodKt {
+    ctor public PeriodKt();
+    method @RequiresApi(26) deprecated public static operator int component1(java.time.Period);
+    method @RequiresApi(26) deprecated public static operator int component2(java.time.Period);
+    method @RequiresApi(26) deprecated public static operator int component3(java.time.Period);
+    method @RequiresApi(26) deprecated public static java.time.Period days(int);
+    method @RequiresApi(26) deprecated public static java.time.Period months(int);
+    method @RequiresApi(26) deprecated public static operator java.time.Period times(java.time.Period, int multiplicand);
+    method @RequiresApi(26) deprecated public static operator java.time.Period unaryMinus(java.time.Period);
+    method @RequiresApi(26) deprecated public static java.time.Period years(int);
+  }
+
+  public final class YearKt {
+    ctor public YearKt();
+    method @RequiresApi(26) deprecated public static int asInt(java.time.Year);
+    method @RequiresApi(26) deprecated public static java.time.Year asYear(int);
+  }
+
+  public final class YearMonthKt {
+    ctor public YearMonthKt();
+    method @RequiresApi(26) deprecated public static operator int component1(java.time.YearMonth);
+    method @RequiresApi(26) deprecated public static operator java.time.Month component2(java.time.YearMonth);
+  }
+
+  public final class ZonedDateTimeKt {
+    ctor public ZonedDateTimeKt();
+    method @RequiresApi(26) deprecated public static operator java.time.LocalDateTime component1(java.time.ZonedDateTime);
+    method @RequiresApi(26) deprecated public static operator java.time.ZoneId component2(java.time.ZonedDateTime);
+  }
+
+}
+
+package androidx.transition {
+
+  public final class TransitionKt {
+    ctor public TransitionKt();
+    method @RequiresApi(19) public static void addListener(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onEnd = "null", kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onStart = "null", kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onCancel = "null", kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onResume = "null", kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onPause = "null");
+    method @RequiresApi(19) public static void doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static void doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static void doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static void doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static void doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.util {
+
+  public final class ArrayMapKt {
+    ctor public ArrayMapKt();
+    method @RequiresApi(19) public static <K, V> android.util.ArrayMap<K,V> arrayMapOf();
+    method @RequiresApi(19) public static <K, V> android.util.ArrayMap<K,V> arrayMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+  }
+
+  public final class ArraySetKt {
+    ctor public ArraySetKt();
+    method @RequiresApi(23) public static <T> android.util.ArraySet<T> arraySetOf();
+    method @RequiresApi(23) public static <T> android.util.ArraySet<T> arraySetOf(T... values);
+  }
+
+  public final class AtomicFileKt {
+    ctor public AtomicFileKt();
+    method @RequiresApi(17) public static byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, java.nio.charset.Charset charset = "Charsets.UTF_8");
+    method @RequiresApi(17) public static void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, java.nio.charset.Charset charset = "Charsets.UTF_8");
+  }
+
+  public final class HalfKt {
+    ctor public HalfKt();
+    method @RequiresApi(26) public static android.util.Half toHalf(short);
+    method @RequiresApi(26) public static android.util.Half toHalf(float);
+    method @RequiresApi(26) public static android.util.Half toHalf(double);
+    method @RequiresApi(26) public static android.util.Half toHalf(String);
+  }
+
+  public final class LocaleKt {
+    ctor public LocaleKt();
+    method @RequiresApi(17) public static int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class LongSparseArrayKt {
+    ctor public LongSparseArrayKt();
+    method @RequiresApi(16) public static operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static <T> boolean containsValue(android.util.LongSparseArray<T>, T! value);
+    method @RequiresApi(16) public static <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T! defaultValue);
+    method @RequiresApi(16) public static <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T! value);
+    method @RequiresApi(16) public static operator <T> void set(android.util.LongSparseArray<T>, long key, T! value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    ctor public LruCacheKt();
+    method public static <K, V> android.util.LruCache<K,V> lruCache(int maxSize, kotlin.jvm.functions.Function2<? super K,? super V,Integer> sizeOf = "{ _, _ -> 1 }", kotlin.jvm.functions.Function1<? super K,? extends V> create = "{ null as V? }", kotlin.jvm.functions.Function4<? super Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved = "{ _, _, _, _ -> }");
+  }
+
+  public final class PairKt {
+    ctor public PairKt();
+    method public static operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    ctor public RangeKt();
+    method @RequiresApi(21) public static infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    ctor public SizeKt();
+    method @RequiresApi(21) public static operator int component1(android.util.Size);
+    method @RequiresApi(21) public static operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static operator int component2(android.util.Size);
+    method @RequiresApi(21) public static operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    ctor public SparseArrayKt();
+    method public static operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static <T> boolean containsValue(android.util.SparseArray<T>, T! value);
+    method public static <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super Integer,? super T,kotlin.Unit> action);
+    method public static <T> T! getOrDefault(android.util.SparseArray<T>, int key, T! defaultValue);
+    method public static <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static <T> int getSize(android.util.SparseArray<T>);
+    method public static <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T! value);
+    method public static operator <T> void set(android.util.SparseArray<T>, int key, T! value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    ctor public SparseBooleanArrayKt();
+    method public static operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super Integer,? super Boolean,kotlin.Unit> action);
+    method public static boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static error.NonExistentClass getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<Boolean> defaultValue);
+    method public static int getSize(android.util.SparseBooleanArray);
+    method public static boolean isEmpty(android.util.SparseBooleanArray);
+    method public static boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static void removeAt(android.util.SparseBooleanArray, int index);
+    method public static operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    ctor public SparseIntArrayKt();
+    method public static operator boolean contains(android.util.SparseIntArray, int key);
+    method public static boolean containsKey(android.util.SparseIntArray, int key);
+    method public static boolean containsValue(android.util.SparseIntArray, int value);
+    method public static void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super Integer,? super Integer,kotlin.Unit> action);
+    method public static int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static error.NonExistentClass getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<Integer> defaultValue);
+    method public static int getSize(android.util.SparseIntArray);
+    method public static boolean isEmpty(android.util.SparseIntArray);
+    method public static boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    ctor public SparseLongArrayKt();
+    method @RequiresApi(18) public static operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super Integer,? super Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static error.NonExistentClass getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<Long> defaultValue);
+    method @RequiresApi(18) public static int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.view {
+
+  public final class MenuKt {
+    ctor public MenuKt();
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static int getSize(android.view.Menu);
+    method public static boolean isEmpty(android.view.Menu);
+    method public static boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+  }
+
+  public final class ViewGroupKt {
+    ctor public ViewGroupKt();
+    method public static operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static int getSize(android.view.ViewGroup);
+    method public static boolean isEmpty(android.view.ViewGroup);
+    method public static boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static void updateLayoutParams(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static void updateMargins(android.view.ViewGroup.MarginLayoutParams, @Px int left = "leftMargin", @Px int top = "topMargin", @Px int right = "rightMargin", @Px int bottom = "bottomMargin");
+    method @RequiresApi(17) public static void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, @Px int start = "marginStart", @Px int top = "topMargin", @Px int end = "marginEnd", @Px int bottom = "bottomMargin");
+  }
+
+  public final class ViewKt {
+    ctor public ViewKt();
+    method public static void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static void doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static boolean isGone(android.view.View);
+    method public static boolean isInvisible(android.view.View);
+    method public static boolean isVisible(android.view.View);
+    method public static Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static void setGone(android.view.View, boolean value);
+    method public static void setInvisible(android.view.View, boolean value);
+    method public static void setPadding(android.view.View, @Px int size);
+    method public static void setVisible(android.view.View, boolean value);
+    method public static android.graphics.Bitmap toBitmap(android.view.View, android.graphics.Bitmap.Config config = "Bitmap.Config.ARGB_8888");
+    method public static void updatePadding(android.view.View, @Px int left = "paddingLeft", @Px int top = "paddingTop", @Px int right = "paddingRight", @Px int bottom = "paddingBottom");
+    method @RequiresApi(17) public static void updatePaddingRelative(android.view.View, @Px int start = "paddingStart", @Px int top = "paddingTop", @Px int end = "paddingEnd", @Px int bottom = "paddingBottom");
+  }
+
+}
+
diff --git a/core/ktx/api/current.txt b/core/ktx/api/current.txt
new file mode 100644
index 0000000..4c56ac9
--- /dev/null
+++ b/core/ktx/api/current.txt
@@ -0,0 +1,658 @@
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    ctor public AnimatorKt();
+    method public static android.animation.Animator.AnimatorListener addListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onEnd = "null", kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onStart = "null", kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onCancel = "null", kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onRepeat = "null");
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onResume = "null", kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit>? onPause = "null");
+    method public static android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    ctor public ContentValuesKt();
+    method public static error.NonExistentClass contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    ctor public ContextKt();
+    method public static void withStyledAttributes(android.content.Context, android.util.AttributeSet? set = "null", int[] attrs, @AttrRes int defStyleAttr = "0", @StyleRes int defStyleRes = "0", kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    ctor public SharedPreferencesKt();
+    method public static void edit(android.content.SharedPreferences, boolean commit = "false", kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    ctor public TypedArrayKt();
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence[] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    ctor public CursorKt();
+    method public static byte[] getBlob(android.database.Cursor, String columnName);
+    method public static byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static error.NonExistentClass getBlobOrNull(android.database.Cursor, String columnName);
+    method public static double getDouble(android.database.Cursor, String columnName);
+    method public static Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static error.NonExistentClass getDoubleOrNull(android.database.Cursor, String columnName);
+    method public static float getFloat(android.database.Cursor, String columnName);
+    method public static Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static error.NonExistentClass getFloatOrNull(android.database.Cursor, String columnName);
+    method public static int getInt(android.database.Cursor, String columnName);
+    method public static Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static error.NonExistentClass getIntOrNull(android.database.Cursor, String columnName);
+    method public static long getLong(android.database.Cursor, String columnName);
+    method public static Long? getLongOrNull(android.database.Cursor, int index);
+    method public static error.NonExistentClass getLongOrNull(android.database.Cursor, String columnName);
+    method public static short getShort(android.database.Cursor, String columnName);
+    method public static Short? getShortOrNull(android.database.Cursor, int index);
+    method public static error.NonExistentClass getShortOrNull(android.database.Cursor, String columnName);
+    method public static String getString(android.database.Cursor, String columnName);
+    method public static String? getStringOrNull(android.database.Cursor, int index);
+    method public static error.NonExistentClass getStringOrNull(android.database.Cursor, String columnName);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    ctor public SQLiteDatabaseKt();
+    method public static <T> T! transaction(android.database.sqlite.SQLiteDatabase, boolean exclusive = "true", kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    ctor public BitmapKt();
+    method public static android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = "Bitmap.Config.ARGB_8888");
+    method @RequiresApi(26) public static android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = "Bitmap.Config.ARGB_8888", boolean hasAlpha = "true", android.graphics.ColorSpace colorSpace = "ColorSpace.get(ColorSpace.Named.SRGB)");
+    method public static operator int get(android.graphics.Bitmap, int x, int y);
+    method public static android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, boolean filter = "true");
+    method public static operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    ctor public CanvasKt();
+    method public static void withMatrix(android.graphics.Canvas, android.graphics.Matrix matrix = "Matrix()", kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static void withRotation(android.graphics.Canvas, float degrees = "0.0f", float pivotX = "0.0f", float pivotY = "0.0f", kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static void withScale(android.graphics.Canvas, float x = "1.0f", float y = "1.0f", float pivotX = "0.0f", float pivotY = "0.0f", kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static void withSkew(android.graphics.Canvas, float x = "0.0f", float y = "0.0f", kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static void withTranslation(android.graphics.Canvas, float x = "0.0f", float y = "0.0f", kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    ctor public ColorKt();
+    method @RequiresApi(26) public static operator float component1(android.graphics.Color);
+    method public static operator int component1(int);
+    method @RequiresApi(26) public static operator float component1(long);
+    method @RequiresApi(26) public static operator float component2(android.graphics.Color);
+    method public static operator int component2(int);
+    method @RequiresApi(26) public static operator float component2(long);
+    method @RequiresApi(26) public static operator float component3(android.graphics.Color);
+    method public static operator int component3(int);
+    method @RequiresApi(26) public static operator float component3(long);
+    method @RequiresApi(26) public static operator float component4(android.graphics.Color);
+    method public static operator int component4(int);
+    method @RequiresApi(26) public static operator float component4(long);
+    method public static int getAlpha(int);
+    method @RequiresApi(26) public static float getAlpha(long);
+    method public static int getBlue(int);
+    method @RequiresApi(26) public static float getBlue(long);
+    method @RequiresApi(26) public static android.graphics.ColorSpace getColorSpace(long);
+    method public static int getGreen(int);
+    method @RequiresApi(26) public static float getGreen(long);
+    method @RequiresApi(26) public static float getLuminance(int);
+    method @RequiresApi(26) public static float getLuminance(long);
+    method public static int getRed(int);
+    method @RequiresApi(26) public static float getRed(long);
+    method @RequiresApi(26) public static boolean isSrgb(long);
+    method @RequiresApi(26) public static boolean isWideGamut(long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static android.graphics.Color toColor(int);
+    method @RequiresApi(26) public static android.graphics.Color toColor(long);
+    method @RequiresApi(26) @ColorInt public static int toColorInt(long);
+    method @ColorInt public static int toColorInt(String);
+    method @RequiresApi(26) @ColorLong public static long toColorLong(int);
+  }
+
+  public final class MatrixKt {
+    ctor public MatrixKt();
+    method public static error.NonExistentClass rotationMatrix(float degrees, float px = "0.0f", float py = "0.0f");
+    method public static error.NonExistentClass scaleMatrix(float sx = "1.0f", float sy = "1.0f");
+    method public static operator error.NonExistentClass times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static error.NonExistentClass translationMatrix(float tx = "0.0f", float ty = "0.0f");
+    method public static error.NonExistentClass values(android.graphics.Matrix);
+  }
+
+  public final class PathKt {
+    ctor public PathKt();
+    method @RequiresApi(19) public static infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, float error = "0.5f");
+    method @RequiresApi(19) public static operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF start, float startFraction, android.graphics.PointF end, float endFraction);
+    method public android.graphics.PointF component1();
+    method public float component2();
+    method public android.graphics.PointF component3();
+    method public float component4();
+    method public androidx.core.graphics.PathSegment copy(android.graphics.PointF start, float startFraction, android.graphics.PointF end, float endFraction);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PictureKt {
+    ctor public PictureKt();
+    method public static android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    ctor public PointKt();
+    method public static operator int component1(android.graphics.Point);
+    method public static operator float component1(android.graphics.PointF);
+    method public static operator int component2(android.graphics.Point);
+    method public static operator float component2(android.graphics.PointF);
+    method public static operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static android.graphics.Point toPoint(android.graphics.PointF);
+    method public static android.graphics.PointF toPointF(android.graphics.Point);
+    method public static operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    ctor public PorterDuffKt();
+    method public static android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    ctor public RectKt();
+    method public static infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static operator int component1(android.graphics.Rect);
+    method public static operator float component1(android.graphics.RectF);
+    method public static operator int component2(android.graphics.Rect);
+    method public static operator float component2(android.graphics.RectF);
+    method public static operator int component3(android.graphics.Rect);
+    method public static operator float component3(android.graphics.RectF);
+    method public static operator int component4(android.graphics.Rect);
+    method public static operator float component4(android.graphics.RectF);
+    method public static operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static android.graphics.Rect toRect(android.graphics.RectF);
+    method public static android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static android.graphics.Region toRegion(android.graphics.Rect);
+    method public static android.graphics.Region toRegion(android.graphics.RectF);
+    method public static error.NonExistentClass transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    ctor public RegionKt();
+    method public static infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static operator android.graphics.Region not(android.graphics.Region);
+    method public static infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    ctor public ShaderKt();
+    method public static void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    ctor public BitmapDrawableKt();
+    method public static android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    ctor public ColorDrawableKt();
+    method public static android.graphics.drawable.ColorDrawable toDrawable(int);
+    method @RequiresApi(26) public static android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    ctor public DrawableKt();
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, @Px int width = "intrinsicWidth", @Px int height = "intrinsicHeight", android.graphics.Bitmap.Config? config = "null");
+    method public static void updateBounds(android.graphics.drawable.Drawable, @Px int left = "bounds.left", @Px int top = "bounds.top", @Px int right = "bounds.right", @Px int bottom = "bounds.bottom");
+  }
+
+  public final class IconKt {
+    ctor public IconKt();
+    method @RequiresApi(26) public static android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    ctor public UriKt();
+    method public static java.io.File toFile(android.net.Uri);
+    method public static android.net.Uri toUri(String);
+    method public static android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    ctor public BundleKt();
+    method public static error.NonExistentClass bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class HandlerKt {
+    ctor public HandlerKt();
+    method public static Runnable postAtTime(android.os.Handler, long uptimeMillis, Object? token = "null", kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static Runnable postDelayed(android.os.Handler, long delayInMillis, Object? token = "null", kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    ctor public PersistableBundleKt();
+    method @RequiresApi(21) public static error.NonExistentClass persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    ctor public TraceKt();
+    method public static <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.preference {
+
+  public final class PreferenceGroupKt {
+    ctor public PreferenceGroupKt();
+    method public static operator boolean contains(android.preference.PreferenceGroup, android.preference.Preference preference);
+    method public static void forEach(android.preference.PreferenceGroup, kotlin.jvm.functions.Function1<? super android.preference.Preference,kotlin.Unit> action);
+    method public static void forEachIndexed(android.preference.PreferenceGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.preference.Preference,kotlin.Unit> action);
+    method public static operator android.preference.Preference get(android.preference.PreferenceGroup, CharSequence key);
+    method public static operator android.preference.Preference get(android.preference.PreferenceGroup, int index);
+    method public static int getSize(android.preference.PreferenceGroup);
+    method public static boolean isEmpty(android.preference.PreferenceGroup);
+    method public static boolean isNotEmpty(android.preference.PreferenceGroup);
+    method public static operator java.util.Iterator<android.preference.Preference> iterator(android.preference.PreferenceGroup);
+    method public static operator void minusAssign(android.preference.PreferenceGroup, android.preference.Preference preference);
+    method public static operator void plusAssign(android.preference.PreferenceGroup, android.preference.Preference preference);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    ctor public CharSequenceKt();
+    method public static boolean isDigitsOnly(CharSequence);
+    method public static int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    ctor public HtmlKt();
+    method public static android.text.Spanned parseAsHtml(String, int flags = "FROM_HTML_MODE_LEGACY", android.text.Html.ImageGetter? imageGetter = "null", android.text.Html.TagHandler? tagHandler = "null");
+    method public static String toHtml(android.text.Spanned, int option = "TO_HTML_PARAGRAPH_LINES_CONSECUTIVE");
+  }
+
+  public final class SpannableStringBuilderKt {
+    ctor public SpannableStringBuilderKt();
+    method public static android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object[] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    ctor public SpannableStringKt();
+    method public static error.NonExistentClass clearSpans(android.text.Spannable);
+    method public static operator void minusAssign(android.text.Spannable, Object span);
+    method public static operator void plusAssign(android.text.Spannable, Object span);
+    method public static operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    ctor public SpannedStringKt();
+    method public static android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    ctor public StringKt();
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    ctor public TransitionKt();
+    method @RequiresApi(19) public static void addListener(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onEnd = "null", kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onStart = "null", kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onCancel = "null", kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onResume = "null", kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit>? onPause = "null");
+    method @RequiresApi(19) public static void doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static void doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static void doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static void doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static void doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class ArrayMapKt {
+    ctor public ArrayMapKt();
+    method @RequiresApi(19) public static <K, V> android.util.ArrayMap<K,V> arrayMapOf();
+    method @RequiresApi(19) public static <K, V> android.util.ArrayMap<K,V> arrayMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+  }
+
+  public final class ArraySetKt {
+    ctor public ArraySetKt();
+    method @RequiresApi(23) public static <T> android.util.ArraySet<T> arraySetOf();
+    method @RequiresApi(23) public static <T> android.util.ArraySet<T> arraySetOf(T... values);
+  }
+
+  public final class AtomicFileKt {
+    ctor public AtomicFileKt();
+    method @RequiresApi(17) public static byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, java.nio.charset.Charset charset = "Charsets.UTF_8");
+    method @RequiresApi(17) public static void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, java.nio.charset.Charset charset = "Charsets.UTF_8");
+  }
+
+  public final class HalfKt {
+    ctor public HalfKt();
+    method @RequiresApi(26) public static android.util.Half toHalf(short);
+    method @RequiresApi(26) public static android.util.Half toHalf(float);
+    method @RequiresApi(26) public static android.util.Half toHalf(double);
+    method @RequiresApi(26) public static android.util.Half toHalf(String);
+  }
+
+  public final class LocaleKt {
+    ctor public LocaleKt();
+    method @RequiresApi(17) public static int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class LongSparseArrayKt {
+    ctor public LongSparseArrayKt();
+    method @RequiresApi(16) public static operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static <T> boolean containsValue(android.util.LongSparseArray<T>, T! value);
+    method @RequiresApi(16) public static <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T! defaultValue);
+    method @RequiresApi(16) public static <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T! value);
+    method @RequiresApi(16) public static operator <T> void set(android.util.LongSparseArray<T>, long key, T! value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    ctor public LruCacheKt();
+    method public static <K, V> android.util.LruCache<K,V> lruCache(int maxSize, kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf = "{ _, _ -> 1 }", kotlin.jvm.functions.Function1<? super K,? extends V> create = "{ null as V? }", kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved = "{ _, _, _, _ -> }");
+  }
+
+  public final class PairKt {
+    ctor public PairKt();
+    method public static operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    ctor public RangeKt();
+    method @RequiresApi(21) public static infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    ctor public SizeKt();
+    method @RequiresApi(21) public static operator int component1(android.util.Size);
+    method @RequiresApi(21) public static operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static operator int component2(android.util.Size);
+    method @RequiresApi(21) public static operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    ctor public SparseArrayKt();
+    method public static operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static <T> boolean containsValue(android.util.SparseArray<T>, T! value);
+    method public static <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static <T> T! getOrDefault(android.util.SparseArray<T>, int key, T! defaultValue);
+    method public static <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static <T> int getSize(android.util.SparseArray<T>);
+    method public static <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T! value);
+    method public static operator <T> void set(android.util.SparseArray<T>, int key, T! value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    ctor public SparseBooleanArrayKt();
+    method public static operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static error.NonExistentClass getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static int getSize(android.util.SparseBooleanArray);
+    method public static boolean isEmpty(android.util.SparseBooleanArray);
+    method public static boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    ctor public SparseIntArrayKt();
+    method public static operator boolean contains(android.util.SparseIntArray, int key);
+    method public static boolean containsKey(android.util.SparseIntArray, int key);
+    method public static boolean containsValue(android.util.SparseIntArray, int value);
+    method public static void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static error.NonExistentClass getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static int getSize(android.util.SparseIntArray);
+    method public static boolean isEmpty(android.util.SparseIntArray);
+    method public static boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    ctor public SparseLongArrayKt();
+    method @RequiresApi(18) public static operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static error.NonExistentClass getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    ctor public MenuKt();
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static int getSize(android.view.Menu);
+    method public static boolean isEmpty(android.view.Menu);
+    method public static boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+  }
+
+  public final class ViewGroupKt {
+    ctor public ViewGroupKt();
+    method public static operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static int getSize(android.view.ViewGroup);
+    method public static boolean isEmpty(android.view.ViewGroup);
+    method public static boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static void updateMargins(android.view.ViewGroup.MarginLayoutParams, @Px int left = "leftMargin", @Px int top = "topMargin", @Px int right = "rightMargin", @Px int bottom = "bottomMargin");
+    method @RequiresApi(17) public static void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, @Px int start = "marginStart", @Px int top = "topMargin", @Px int end = "marginEnd", @Px int bottom = "bottomMargin");
+  }
+
+  public final class ViewKt {
+    ctor public ViewKt();
+    method @RequiresApi(16) public static void announceForAccessibility(android.view.View, @StringRes int resource);
+    method public static void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static void doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static boolean isGone(android.view.View);
+    method public static boolean isInvisible(android.view.View);
+    method public static boolean isVisible(android.view.View);
+    method public static Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static void setGone(android.view.View, boolean value);
+    method public static void setInvisible(android.view.View, boolean value);
+    method public static void setPadding(android.view.View, @Px int size);
+    method public static void setVisible(android.view.View, boolean value);
+    method public static android.graphics.Bitmap toBitmap(android.view.View, android.graphics.Bitmap.Config config = "Bitmap.Config.ARGB_8888");
+    method public static void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static void updatePadding(android.view.View, @Px int left = "paddingLeft", @Px int top = "paddingTop", @Px int right = "paddingRight", @Px int bottom = "paddingBottom");
+    method @RequiresApi(17) public static void updatePaddingRelative(android.view.View, @Px int start = "paddingStart", @Px int top = "paddingTop", @Px int end = "paddingEnd", @Px int bottom = "paddingBottom");
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class ToastKt {
+    ctor public ToastKt();
+    method public static android.widget.Toast toast(android.content.Context, CharSequence text, int duration = "Toast.LENGTH_SHORT");
+    method public static android.widget.Toast toast(android.content.Context, @StringRes int resId, int duration = "Toast.LENGTH_SHORT");
+  }
+
+}
+
diff --git a/core/ktx/build.gradle b/core/ktx/build.gradle
new file mode 100644
index 0000000..bce0757
--- /dev/null
+++ b/core/ktx/build.gradle
@@ -0,0 +1,37 @@
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+    id("org.jetbrains.kotlin.android")
+}
+
+android {
+    buildTypes {
+        debug {
+            testCoverageEnabled = false // Breaks Kotlin compiler.
+        }
+    }
+}
+
+dependencies {
+    api(KOTLIN_STDLIB)
+    api(project(":annotation"))
+    api(project(":core"))
+
+    androidTestImplementation(JUNIT)
+    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(TEST_RULES)
+    androidTestImplementation(TRUTH)
+    androidTestImplementation(project(":internal-testutils-ktx"))
+}
+
+supportLibrary {
+    name = "Core Kotlin Extensions"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.CORE
+    inceptionYear = "2018"
+    description = "Kotlin extensions for 'core' artifact"
+}
diff --git a/core/ktx/src/androidTest/AndroidManifest.xml b/core/ktx/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..259b616
--- /dev/null
+++ b/core/ktx/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,7 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="androidx.core.ktx.test">
+    <application>
+        <activity android:name="androidx.core.TestActivity"/>
+        <activity android:name="androidx.core.TestPreferenceActivity"/>
+    </application>
+</manifest>
diff --git a/core/ktx/src/androidTest/assets/red.png b/core/ktx/src/androidTest/assets/red.png
new file mode 100644
index 0000000..6292f4b
--- /dev/null
+++ b/core/ktx/src/androidTest/assets/red.png
Binary files differ
diff --git a/core/ktx/src/androidTest/font_licenses.txt b/core/ktx/src/androidTest/font_licenses.txt
new file mode 100644
index 0000000..0b83a9a
--- /dev/null
+++ b/core/ktx/src/androidTest/font_licenses.txt
@@ -0,0 +1,93 @@
+Copyright 2006 The Inconsolata Project Authors

+

+This Font Software is licensed under the SIL Open Font License, Version 1.1.

+This license is copied below, and is also available with a FAQ at:

+http://scripts.sil.org/OFL

+

+

+-----------------------------------------------------------

+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007

+-----------------------------------------------------------

+

+PREAMBLE

+The goals of the Open Font License (OFL) are to stimulate worldwide

+development of collaborative font projects, to support the font creation

+efforts of academic and linguistic communities, and to provide a free and

+open framework in which fonts may be shared and improved in partnership

+with others.

+

+The OFL allows the licensed fonts to be used, studied, modified and

+redistributed freely as long as they are not sold by themselves. The

+fonts, including any derivative works, can be bundled, embedded, 

+redistributed and/or sold with any software provided that any reserved

+names are not used by derivative works. The fonts and derivatives,

+however, cannot be released under any other type of license. The

+requirement for fonts to remain under this license does not apply

+to any document created using the fonts or their derivatives.

+

+DEFINITIONS

+"Font Software" refers to the set of files released by the Copyright

+Holder(s) under this license and clearly marked as such. This may

+include source files, build scripts and documentation.

+

+"Reserved Font Name" refers to any names specified as such after the

+copyright statement(s).

+

+"Original Version" refers to the collection of Font Software components as

+distributed by the Copyright Holder(s).

+

+"Modified Version" refers to any derivative made by adding to, deleting,

+or substituting -- in part or in whole -- any of the components of the

+Original Version, by changing formats or by porting the Font Software to a

+new environment.

+

+"Author" refers to any designer, engineer, programmer, technical

+writer or other person who contributed to the Font Software.

+

+PERMISSION & CONDITIONS

+Permission is hereby granted, free of charge, to any person obtaining

+a copy of the Font Software, to use, study, copy, merge, embed, modify,

+redistribute, and sell modified and unmodified copies of the Font

+Software, subject to the following conditions:

+

+1) Neither the Font Software nor any of its individual components,

+in Original or Modified Versions, may be sold by itself.

+

+2) Original or Modified Versions of the Font Software may be bundled,

+redistributed and/or sold with any software, provided that each copy

+contains the above copyright notice and this license. These can be

+included either as stand-alone text files, human-readable headers or

+in the appropriate machine-readable metadata fields within text or

+binary files as long as those fields can be easily viewed by the user.

+

+3) No Modified Version of the Font Software may use the Reserved Font

+Name(s) unless explicit written permission is granted by the corresponding

+Copyright Holder. This restriction only applies to the primary font name as

+presented to the users.

+

+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font

+Software shall not be used to promote, endorse or advertise any

+Modified Version, except to acknowledge the contribution(s) of the

+Copyright Holder(s) and the Author(s) or with their explicit written

+permission.

+

+5) The Font Software, modified or unmodified, in part or in whole,

+must be distributed entirely under this license, and must not be

+distributed under any other license. The requirement for fonts to

+remain under this license does not apply to any document created

+using the Font Software.

+

+TERMINATION

+This license becomes null and void if any of the above conditions are

+not met.

+

+DISCLAIMER

+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,

+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF

+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT

+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE

+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,

+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL

+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM

+OTHER DEALINGS IN THE FONT SOFTWARE.

diff --git a/core/ktx/src/androidTest/java/androidx/core/TestActivity.kt b/core/ktx/src/androidTest/java/androidx/core/TestActivity.kt
new file mode 100644
index 0000000..b0132ab
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/TestActivity.kt
@@ -0,0 +1,28 @@
+/*
+ * 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.core
+
+import android.app.Activity
+import android.os.Bundle
+import androidx.core.ktx.test.R
+
+class TestActivity : Activity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.test_activity)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/TestPreferenceActivity.kt b/core/ktx/src/androidTest/java/androidx/core/TestPreferenceActivity.kt
new file mode 100644
index 0000000..43e3dee
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/TestPreferenceActivity.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 androidx.core
+
+import android.app.Activity
+import android.os.Bundle
+import android.preference.PreferenceFragment
+import androidx.core.ktx.test.R
+
+class TestPreferenceActivity : Activity() {
+
+    companion object {
+        const val TAG = "TestPreferenceActivity"
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        fragmentManager.beginTransaction()
+            .add(android.R.id.content, TestPreferenceFragment(), TAG)
+            .commitNow()
+    }
+
+    class TestPreferenceFragment : PreferenceFragment() {
+        override fun onCreate(savedInstanceState: Bundle?) {
+            super.onCreate(savedInstanceState)
+            addPreferencesFromResource(R.xml.preferences)
+        }
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/animation/AnimatorTest.kt b/core/ktx/src/androidTest/java/androidx/core/animation/AnimatorTest.kt
new file mode 100644
index 0000000..de298a5
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/animation/AnimatorTest.kt
@@ -0,0 +1,115 @@
+/*
+ * 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.core.animation
+
+import android.animation.Animator
+import android.animation.ObjectAnimator
+import android.support.test.InstrumentationRegistry
+import android.support.test.annotation.UiThreadTest
+import android.support.test.filters.SdkSuppress
+import android.support.test.runner.AndroidJUnit4
+import android.view.View
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class AnimatorTest {
+    private val context = InstrumentationRegistry.getContext()
+    private val view = View(context)
+
+    private lateinit var animator: Animator
+
+    @Before fun before() {
+        animator = ObjectAnimator.ofFloat(view, View.ALPHA, 0f, 1f)
+    }
+
+    @Test fun testDoOnStart() {
+        var called = false
+        animator.doOnStart {
+            called = true
+        }
+
+        animator.listeners.forEach { it.onAnimationStart(animator) }
+        assertTrue(called)
+    }
+
+    @Test fun testDoOnEnd() {
+        var called = false
+        animator.doOnEnd {
+            called = true
+        }
+
+        animator.listeners.forEach { it.onAnimationEnd(animator) }
+        assertTrue(called)
+    }
+
+    @Test fun testDoOnCancel() {
+        var cancelCalled = false
+        animator.doOnCancel {
+            cancelCalled = true
+        }
+
+        animator.listeners.forEach { it.onAnimationCancel(animator) }
+        assertTrue(cancelCalled)
+    }
+
+    @Test fun testDoOnRepeat() {
+        var called = false
+        animator.doOnRepeat {
+            called = true
+        }
+
+        animator.listeners.forEach { it.onAnimationRepeat(animator) }
+        assertTrue(called)
+    }
+
+    @UiThreadTest
+    @SdkSuppress(minSdkVersion = 19)
+    @Test fun testDoOnPause() {
+        var called = false
+        animator.doOnPause {
+            called = true
+        }
+
+        // Start and pause and assert doOnPause was called
+        animator.start()
+        animator.pause()
+        assertTrue(called)
+
+        animator.cancel()
+    }
+
+    @UiThreadTest
+    @SdkSuppress(minSdkVersion = 19)
+    @Test fun testDoOnResume() {
+        var called = false
+        animator.doOnResume {
+            called = true
+        }
+
+        animator.start()
+        animator.pause()
+
+        // Now resume and assert doOnResume was called
+        animator.resume()
+        assertTrue(called)
+
+        animator.cancel()
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/content/ContentValuesTest.kt b/core/ktx/src/androidTest/java/androidx/core/content/ContentValuesTest.kt
new file mode 100644
index 0000000..746a634
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/content/ContentValuesTest.kt
@@ -0,0 +1,59 @@
+/*
+ * 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.core.content
+
+import androidx.testutils.assertThrows
+import org.junit.Assert.assertArrayEquals
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
+import org.junit.Test
+import java.util.concurrent.atomic.AtomicInteger
+
+class ContentValuesTest {
+    @Test fun valuesOfValid() {
+        val values = contentValuesOf(
+            "null" to null,
+            "string" to "string",
+            "byte" to 1.toByte(),
+            "short" to 1.toShort(),
+            "int" to 1,
+            "long" to 1L,
+            "float" to 1f,
+            "double" to 1.0,
+            "boolean" to true,
+            "byteArray" to byteArrayOf()
+        )
+        assertEquals(10, values.size())
+        assertNull(values.get("null"))
+        assertEquals("string", values.get("string"))
+        assertEquals(1.toByte(), values.get("byte"))
+        assertEquals(1.toShort(), values.get("short"))
+        assertEquals(1, values.get("int"))
+        assertEquals(1L, values.get("long"))
+        assertEquals(1f, values.get("float"))
+        assertEquals(1.0, values.get("double"))
+        assertEquals(true, values.get("boolean"))
+        assertArrayEquals(byteArrayOf(), values.get("byteArray") as ByteArray)
+    }
+
+    @Test fun valuesOfInvalid() {
+        assertThrows<IllegalArgumentException> {
+            contentValuesOf("nope" to AtomicInteger(1))
+        }.hasMessageThat().isEqualTo(
+            "Illegal value type java.util.concurrent.atomic.AtomicInteger for key \"nope\"")
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/content/ContextTest.kt b/core/ktx/src/androidTest/java/androidx/core/content/ContextTest.kt
new file mode 100644
index 0000000..09d2355
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/content/ContextTest.kt
@@ -0,0 +1,73 @@
+/*
+ * 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.core.content
+
+import android.content.ContextWrapper
+import android.support.test.InstrumentationRegistry
+import android.support.test.filters.SdkSuppress
+import androidx.core.ktx.test.R
+import androidx.core.getAttributeSet
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertSame
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class ContextTest {
+    private val context = InstrumentationRegistry.getContext()
+
+    @SdkSuppress(minSdkVersion = 23)
+    @Test fun systemService() {
+        var lookup: Class<*>? = null
+        val context = object : ContextWrapper(context) {
+            override fun getSystemServiceName(serviceClass: Class<*>): String? {
+                lookup = serviceClass
+                return if (serviceClass == Unit::class.java) "unit" else null
+            }
+
+            override fun getSystemService(name: String): Any? {
+                return if (name == "unit") Unit else null
+            }
+        }
+        val actual = context.systemService<Unit>()
+        assertEquals(Unit::class.java, lookup)
+        assertSame(Unit, actual)
+    }
+
+    @Test fun withStyledAttributes() {
+        context.withStyledAttributes(attrs = intArrayOf(android.R.attr.textColorPrimary)) {
+            val resourceId = getResourceId(0, -1)
+            assertTrue(resourceId != 1)
+        }
+
+        context.withStyledAttributes(
+            android.R.style.Theme_Light,
+            intArrayOf(android.R.attr.textColorPrimary)
+        ) {
+            val resourceId = getResourceId(0, -1)
+            assertTrue(resourceId != 1)
+        }
+
+        val attrs = context.getAttributeSet(R.layout.test_attrs)
+        context.withStyledAttributes(attrs, R.styleable.SampleAttrs) {
+            assertTrue(getInt(R.styleable.SampleAttrs_sample, -1) != -1)
+        }
+
+        context.withStyledAttributes(attrs, R.styleable.SampleAttrs, 0, 0) {
+            assertTrue(getInt(R.styleable.SampleAttrs_sample, -1) != -1)
+        }
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/content/SharedPreferencesTest.kt b/core/ktx/src/androidTest/java/androidx/core/content/SharedPreferencesTest.kt
new file mode 100644
index 0000000..bf1e67d
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/content/SharedPreferencesTest.kt
@@ -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.
+ */
+
+package androidx.core.content
+
+import android.support.test.InstrumentationRegistry
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class SharedPreferencesTest {
+    private val context = InstrumentationRegistry.getContext()
+
+    @Test fun editApply() {
+        val preferences = context.getSharedPreferences("prefs", 0)
+
+        preferences.edit {
+            putString("test_key1", "test_value")
+            putInt("test_key2", 100)
+        }
+
+        assertEquals("test_value", preferences.getString("test_key1", null))
+        assertEquals(100, preferences.getInt("test_key2", 0))
+    }
+
+    @Test fun editCommit() {
+        val preferences = context.getSharedPreferences("prefs", 0)
+        preferences.edit(commit = true) {
+            putString("test_key1", "test_value")
+            putInt("test_key2", 100)
+        }
+
+        assertEquals("test_value", preferences.getString("test_key1", null))
+        assertEquals(100, preferences.getInt("test_key2", 0))
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/content/res/TypedArrayTest.kt b/core/ktx/src/androidTest/java/androidx/core/content/res/TypedArrayTest.kt
new file mode 100644
index 0000000..fe576df
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/content/res/TypedArrayTest.kt
@@ -0,0 +1,221 @@
+/*
+ * 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.core.content.res
+
+import android.graphics.Color
+import android.support.test.InstrumentationRegistry
+import android.support.test.filters.SdkSuppress
+import androidx.core.ktx.test.R
+import androidx.testutils.assertThrows
+import androidx.core.getAttributeSet
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class TypedArrayTest {
+    private val context = InstrumentationRegistry.getContext()
+
+    @Test fun boolean() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        assertTrue(array.getBooleanOrThrow(R.styleable.TypedArrayTypes_boolean_present))
+
+        assertThrows<IllegalArgumentException> {
+            array.getBooleanOrThrow(R.styleable.TypedArrayTypes_boolean_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @Test fun color() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        assertEquals(Color.WHITE, array.getColorOrThrow(R.styleable.TypedArrayTypes_color_present))
+
+        assertThrows<IllegalArgumentException> {
+            array.getColorOrThrow(R.styleable.TypedArrayTypes_color_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @Test fun colorStateList() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+        val stateList = array.getColorStateListOrThrow(R.styleable.TypedArrayTypes_color_present)
+
+        assertEquals(Color.WHITE, stateList.defaultColor)
+
+        assertThrows<IllegalArgumentException> {
+            array.getColorStateListOrThrow(R.styleable.TypedArrayTypes_color_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @Test fun dimension() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        assertEquals(1f, array.getDimensionOrThrow(R.styleable.TypedArrayTypes_dimension_present))
+
+        assertThrows<IllegalArgumentException> {
+            array.getDimensionOrThrow(R.styleable.TypedArrayTypes_dimension_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @Test fun dimensionPixelSize() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        assertEquals(1,
+            array.getDimensionPixelSizeOrThrow(R.styleable.TypedArrayTypes_dimension_present))
+
+        assertThrows<IllegalArgumentException> {
+            array.getDimensionPixelSizeOrThrow(R.styleable.TypedArrayTypes_dimension_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @Test fun dimensionPixelOffset() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        assertEquals(1,
+            array.getDimensionPixelOffsetOrThrow(R.styleable.TypedArrayTypes_dimension_present))
+
+        assertThrows<IllegalArgumentException> {
+            array.getDimensionPixelOffsetOrThrow(R.styleable.TypedArrayTypes_dimension_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @Test fun drawable() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        assertNotNull(array.getDrawableOrThrow(R.styleable.TypedArrayTypes_drawable_present))
+
+        assertThrows<IllegalArgumentException> {
+            array.getDrawableOrThrow(R.styleable.TypedArrayTypes_drawable_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @Test fun float() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        assertEquals(0.1f, array.getFloatOrThrow(R.styleable.TypedArrayTypes_float_present))
+
+        assertThrows<IllegalArgumentException> {
+            array.getFloatOrThrow(R.styleable.TypedArrayTypes_float_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun font() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        assertNotNull(array.getFontOrThrow(R.styleable.TypedArrayTypes_font_present))
+
+        assertThrows<IllegalArgumentException> {
+            array.getFontOrThrow(R.styleable.TypedArrayTypes_font_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @Test fun int() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        assertEquals(1, array.getIntOrThrow(R.styleable.TypedArrayTypes_integer_present))
+
+        assertThrows<IllegalArgumentException> {
+            array.getIntOrThrow(R.styleable.TypedArrayTypes_integer_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @Test fun integer() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        assertEquals(1, array.getIntegerOrThrow(R.styleable.TypedArrayTypes_integer_present))
+
+        assertThrows<IllegalArgumentException> {
+            array.getIntegerOrThrow(R.styleable.TypedArrayTypes_integer_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @Test
+    fun resourceId() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        assertEquals(
+            R.font.inconsolata_regular,
+            array.getResourceIdOrThrow(R.styleable.TypedArrayTypes_resource_present)
+        )
+
+        assertThrows<IllegalArgumentException> {
+            array.getResourceIdOrThrow(R.styleable.TypedArrayTypes_resource_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @Test fun string() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        assertEquals("Hello", array.getStringOrThrow(R.styleable.TypedArrayTypes_string_present))
+
+        assertThrows<IllegalArgumentException> {
+            array.getStringOrThrow(R.styleable.TypedArrayTypes_string_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @Test fun text() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        assertEquals("Hello", array.getTextOrThrow(R.styleable.TypedArrayTypes_string_present))
+
+        assertThrows<IllegalArgumentException> {
+            array.getTextOrThrow(R.styleable.TypedArrayTypes_string_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @Test fun textArray() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        val text = array.getTextArrayOrThrow(R.styleable.TypedArrayTypes_text_array_present)
+        assertEquals("Hello", text[0].toString())
+        assertEquals("World", text[1].toString())
+
+        assertThrows<IllegalArgumentException> {
+            array.getTextOrThrow(R.styleable.TypedArrayTypes_text_array_absent)
+        }.hasMessageThat().isEqualTo("Attribute not defined in set.")
+    }
+
+    @Test fun useRecyclesArray() {
+        val attrs = context.getAttributeSet(R.layout.typed_array)
+        val array = context.obtainStyledAttributes(attrs, R.styleable.TypedArrayTypes)
+
+        val result = array.use {
+            it.getBoolean(R.styleable.TypedArrayTypes_boolean_present, false)
+        }
+        assertTrue(result)
+
+        assertThrows<RuntimeException> {
+            array.recycle()
+        }
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/database/CursorTest.kt b/core/ktx/src/androidTest/java/androidx/core/database/CursorTest.kt
new file mode 100644
index 0000000..86d0731
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/database/CursorTest.kt
@@ -0,0 +1,157 @@
+/*
+ * 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.core.database
+
+import android.database.Cursor
+import android.database.MatrixCursor
+import org.junit.Assert.assertArrayEquals
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
+import org.junit.Test
+
+class CursorTest {
+    @Test fun blobByName() {
+        val cursor = scalarCursor(byteArrayOf(0x01))
+        val blob = cursor.getBlob("data")
+        assertArrayEquals(byteArrayOf(0x01), blob)
+    }
+
+    @Test fun doubleByName() {
+        val cursor = scalarCursor(1.5)
+        val double = cursor.getDouble("data")
+        assertEquals(1.5, double, 0.0)
+    }
+
+    @Test fun floatByName() {
+        val cursor = scalarCursor(1.5f)
+        val float = cursor.getFloat("data")
+        assertEquals(1.5f, float, 0f)
+    }
+
+    @Test fun intByName() {
+        val cursor = scalarCursor(1)
+        val int = cursor.getInt("data")
+        assertEquals(1, int)
+    }
+
+    @Test fun longByName() {
+        val cursor = scalarCursor(1L)
+        val long = cursor.getLong("data")
+        assertEquals(1L, long)
+    }
+
+    @Test fun shortByName() {
+        val cursor = scalarCursor(1.toShort())
+        val short = cursor.getShort("data")
+        assertEquals(1.toShort(), short)
+    }
+
+    @Test fun stringByName() {
+        val cursor = scalarCursor("hey")
+        val string = cursor.getString("data")
+        assertEquals("hey", string)
+    }
+
+    @Test fun blobOrNullByIndex() {
+        val cursor = scalarCursor(null)
+        val blob = cursor.getBlobOrNull(0)
+        assertNull(blob)
+    }
+
+    @Test fun doubleOrNullByIndex() {
+        val cursor = scalarCursor(null)
+        val double = cursor.getDoubleOrNull(0)
+        assertNull(double)
+    }
+
+    @Test fun floatOrNullByIndex() {
+        val cursor = scalarCursor(null)
+        val float = cursor.getFloatOrNull(0)
+        assertNull(float)
+    }
+
+    @Test fun intOrNullByIndex() {
+        val cursor = scalarCursor(null)
+        val int = cursor.getIntOrNull(0)
+        assertNull(int)
+    }
+
+    @Test fun longOrNullByIndex() {
+        val cursor = scalarCursor(null)
+        val long = cursor.getLongOrNull(0)
+        assertNull(long)
+    }
+
+    @Test fun shortOrNullByIndex() {
+        val cursor = scalarCursor(null)
+        val short = cursor.getShortOrNull(0)
+        assertNull(short)
+    }
+
+    @Test fun stringOrNullByIndex() {
+        val cursor = scalarCursor(null)
+        val string = cursor.getStringOrNull(0)
+        assertNull(string)
+    }
+
+    @Test fun blobOrNullByName() {
+        val cursor = scalarCursor(null)
+        val blob = cursor.getBlobOrNull("data")
+        assertNull(blob)
+    }
+
+    @Test fun doubleOrNullByName() {
+        val cursor = scalarCursor(null)
+        val double = cursor.getDoubleOrNull("data")
+        assertNull(double)
+    }
+
+    @Test fun floatOrNullByName() {
+        val cursor = scalarCursor(null)
+        val float = cursor.getFloatOrNull("data")
+        assertNull(float)
+    }
+
+    @Test fun intOrNullByName() {
+        val cursor = scalarCursor(null)
+        val int = cursor.getIntOrNull("data")
+        assertNull(int)
+    }
+
+    @Test fun longOrNullByName() {
+        val cursor = scalarCursor(null)
+        val long = cursor.getLongOrNull("data")
+        assertNull(long)
+    }
+
+    @Test fun shortOrNullByName() {
+        val cursor = scalarCursor(null)
+        val short = cursor.getShortOrNull("data")
+        assertNull(short)
+    }
+
+    @Test fun stringOrNullByName() {
+        val cursor = scalarCursor(null)
+        val string = cursor.getStringOrNull("data")
+        assertNull(string)
+    }
+
+    private fun scalarCursor(item: Any?): Cursor = MatrixCursor(arrayOf("data")).apply {
+        addRow(arrayOf(item))
+        moveToFirst() // Prepare for consumers to read.
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/database/sqlite/SQLiteDatabaseTest.kt b/core/ktx/src/androidTest/java/androidx/core/database/sqlite/SQLiteDatabaseTest.kt
new file mode 100644
index 0000000..c8ed67d
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/database/sqlite/SQLiteDatabaseTest.kt
@@ -0,0 +1,60 @@
+/*
+ * 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.core.database.sqlite
+
+import android.content.ContentValues
+import android.database.sqlite.SQLiteDatabase
+import android.database.sqlite.SQLiteOpenHelper
+import android.support.test.InstrumentationRegistry
+import androidx.testutils.assertThrows
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class SQLiteDatabaseTest {
+    private val context = InstrumentationRegistry.getContext()
+    private val openHelper = object : SQLiteOpenHelper(context, null, null, 1) {
+        override fun onCreate(db: SQLiteDatabase) {
+            db.execSQL("CREATE TABLE test(name TEXT)")
+        }
+
+        override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
+        }
+    }
+    private val db = openHelper.writableDatabase
+
+    @Test fun throwingBodyNotSuccessful() {
+        val exception = RuntimeException()
+        assertThrows<RuntimeException> {
+            db.transaction {
+                insert("test", null, ContentValues().apply { put("name", "Alice") })
+                throw exception
+            }
+        }.isSameAs(exception)
+
+        val query = db.rawQuery("SELECT COUNT(*) FROM test", emptyArray())
+        query.moveToFirst()
+        assertEquals(0L, query.getLong(0))
+        query.close()
+    }
+
+    @Test fun bodyReturnValue() {
+        val result = db.transaction {
+            "Hey"
+        }
+        assertEquals("Hey", result)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/extensions.kt b/core/ktx/src/androidTest/java/androidx/core/extensions.kt
new file mode 100644
index 0000000..dc07142
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/extensions.kt
@@ -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.
+ */
+
+package androidx.core
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.util.AttributeSet
+import android.util.Xml
+import androidx.annotation.LayoutRes
+import org.xmlpull.v1.XmlPullParser
+
+@SuppressLint("ResourceType")
+fun Context.getAttributeSet(@LayoutRes layoutId: Int): AttributeSet {
+    val parser = resources.getXml(layoutId)
+    var type = parser.next()
+    while (type != XmlPullParser.START_TAG) {
+        type = parser.next()
+    }
+    return Xml.asAttributeSet(parser)
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/BitmapTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/BitmapTest.kt
new file mode 100644
index 0000000..25b318b
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/BitmapTest.kt
@@ -0,0 +1,71 @@
+/*
+ * 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.core.graphics
+
+import android.graphics.Bitmap
+import android.graphics.ColorSpace
+import android.support.test.filters.SdkSuppress
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class BitmapTest {
+    @Test fun create() {
+        val bitmap = createBitmap(7, 9)
+        assertEquals(7, bitmap.width)
+        assertEquals(9, bitmap.height)
+        assertEquals(Bitmap.Config.ARGB_8888, bitmap.config)
+    }
+
+    @Test fun createWithConfig() {
+        val bitmap = createBitmap(7, 9, config = Bitmap.Config.RGB_565)
+        assertEquals(Bitmap.Config.RGB_565, bitmap.config)
+    }
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun createWithColorSpace() {
+        val colorSpace = ColorSpace.get(ColorSpace.Named.ADOBE_RGB)
+        val bitmap = createBitmap(7, 9, colorSpace = colorSpace)
+        assertEquals(colorSpace, bitmap.colorSpace)
+    }
+
+    @Test fun scale() {
+        val b = createBitmap(7, 9).scale(3, 5)
+        assertEquals(3, b.width)
+        assertEquals(5, b.height)
+    }
+
+    @Test fun applyCanvas() {
+        val p = createBitmap(2, 2).applyCanvas {
+            drawColor(0x40302010)
+        }.getPixel(1, 1)
+
+        assertEquals(0x40302010, p)
+    }
+
+    @Test fun getPixel() {
+        val b = createBitmap(2, 2).applyCanvas {
+            drawColor(0x40302010)
+        }
+        assertEquals(0x40302010, b[1, 1])
+    }
+
+    @Test fun setPixel() {
+        val b = createBitmap(2, 2)
+        b[1, 1] = 0x40302010
+        assertEquals(0x40302010, b[1, 1])
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/CanvasTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/CanvasTest.kt
new file mode 100644
index 0000000..e940aa9
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/CanvasTest.kt
@@ -0,0 +1,127 @@
+/*
+ * 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.core.graphics
+
+import android.graphics.Canvas
+import android.graphics.Matrix
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class CanvasTest {
+    private val values = FloatArray(9)
+    private val canvas = Canvas(createBitmap(1, 1))
+
+    @Suppress("DEPRECATION")
+    @Test fun withSave() {
+        val beforeCount = canvas.saveCount
+
+        canvas.matrix.getValues(values)
+        val x = values[Matrix.MTRANS_X]
+        val y = values[Matrix.MTRANS_Y]
+
+        canvas.withSave {
+            assertThat(beforeCount).isLessThan(saveCount)
+            translate(10.0f, 10.0f)
+        }
+
+        canvas.matrix.getValues(values)
+        assertEquals(x, values[Matrix.MTRANS_X])
+        assertEquals(y, values[Matrix.MTRANS_Y])
+
+        assertEquals(beforeCount, canvas.saveCount)
+    }
+
+    @Test fun withTranslation() {
+        val beforeCount = canvas.saveCount
+        canvas.withTranslation(x = 16.0f, y = 32.0f) {
+            assertThat(beforeCount).isLessThan(saveCount)
+
+            @Suppress("DEPRECATION")
+            matrix.getValues(values) // will work for a software canvas
+
+            assertEquals(16.0f, values[Matrix.MTRANS_X])
+            assertEquals(32.0f, values[Matrix.MTRANS_Y])
+        }
+        assertEquals(beforeCount, canvas.saveCount)
+    }
+
+    @Test fun withRotation() {
+        val beforeCount = canvas.saveCount
+        canvas.withRotation(degrees = 90.0f, pivotX = 16.0f, pivotY = 32.0f) {
+            assertThat(beforeCount).isLessThan(saveCount)
+
+            @Suppress("DEPRECATION")
+            matrix.getValues(values) // will work for a software canvas
+
+            assertEquals(48.0f, values[Matrix.MTRANS_X])
+            assertEquals(16.0f, values[Matrix.MTRANS_Y])
+            assertEquals(-1.0f, values[Matrix.MSKEW_X])
+            assertEquals(1.0f, values[Matrix.MSKEW_Y])
+        }
+        assertEquals(beforeCount, canvas.saveCount)
+    }
+
+    @Test fun withScale() {
+        val beforeCount = canvas.saveCount
+        canvas.withScale(x = 2.0f, y = 4.0f, pivotX = 16.0f, pivotY = 32.0f) {
+            assertThat(beforeCount).isLessThan(saveCount)
+
+            @Suppress("DEPRECATION")
+            matrix.getValues(values) // will work for a software canvas
+
+            assertEquals(-16.0f, values[Matrix.MTRANS_X])
+            assertEquals(-96.0f, values[Matrix.MTRANS_Y])
+            assertEquals(2.0f, values[Matrix.MSCALE_X])
+            assertEquals(4.0f, values[Matrix.MSCALE_Y])
+        }
+        assertEquals(beforeCount, canvas.saveCount)
+    }
+
+    @Test fun withSkew() {
+        val beforeCount = canvas.saveCount
+        canvas.withSkew(x = 2.0f, y = 4.0f) {
+            assertThat(beforeCount).isLessThan(saveCount)
+
+            @Suppress("DEPRECATION")
+            matrix.getValues(values) // will work for a software canvas
+
+            assertEquals(2.0f, values[Matrix.MSKEW_X])
+            assertEquals(4.0f, values[Matrix.MSKEW_Y])
+        }
+        assertEquals(beforeCount, canvas.saveCount)
+    }
+
+    @Suppress("DEPRECATION")
+    @Test fun withMatrix() {
+        val originMatrix = canvas.matrix
+
+        val inputMatrix = Matrix()
+        inputMatrix.postTranslate(16.0f, 32.0f)
+        inputMatrix.postRotate(90.0f, 16.0f, 32.0f)
+        inputMatrix.postScale(2.0f, 4.0f, 16.0f, 32.0f)
+
+        val beforeCount = canvas.saveCount
+        canvas.withMatrix(inputMatrix) {
+            assertThat(beforeCount).isLessThan(saveCount)
+            assertEquals(inputMatrix, matrix)
+        }
+
+        assertEquals(originMatrix, canvas.matrix)
+        assertEquals(beforeCount, canvas.saveCount)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/ColorTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/ColorTest.kt
new file mode 100644
index 0000000..5c647d1
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/ColorTest.kt
@@ -0,0 +1,127 @@
+/*
+ * 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.core.graphics
+
+import android.graphics.Color
+import android.graphics.ColorSpace
+import android.support.test.filters.SdkSuppress
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class ColorTest {
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun destructuringColor() {
+        val (r, g, b, a) = 0x337f3010.toColor()
+        assertEquals(0.5f, r, 1e-2f)
+        assertEquals(0.19f, g, 1e-2f)
+        assertEquals(0.06f, b, 1e-2f)
+        assertEquals(0.2f, a, 1e-2f)
+    }
+
+    @Test fun destructuringInt() {
+        val (a, r, g, b) = 0x337f3010
+        assertEquals(0x33, a)
+        assertEquals(0x7f, r)
+        assertEquals(0x30, g)
+        assertEquals(0x10, b)
+    }
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun intToColor() = assertEquals(Color.valueOf(0x337f3010), 0x337f3010.toColor())
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun intToColorLong() = assertEquals(Color.pack(0x337f3010), 0x337f3010.toColorLong())
+
+    @Test fun alpha() = assertEquals(0x33, 0x337f3010.alpha)
+    @Test fun red() = assertEquals(0x7f, 0x337f3010.red)
+    @Test fun green() = assertEquals(0x30, 0x337f3010.green)
+    @Test fun blue() = assertEquals(0x10, 0x337f3010.blue)
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun luminance() = assertEquals(0.212f, 0xff7f7f7f.toInt().luminance, 1e-3f)
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun longToColor() {
+        assertEquals(Color.valueOf(0x337f3010), Color.pack(0x337f3010).toColor())
+    }
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun longToColorInt() = assertEquals(0x337f3010, Color.pack(0x337f3010).toColorInt())
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun destructuringLong() {
+        val (r, g, b, a) = Color.pack(0x337f3010)
+        assertEquals(0.20f, a, 1e-2f)
+        assertEquals(0.50f, r, 1e-2f)
+        assertEquals(0.19f, g, 1e-2f)
+        assertEquals(0.06f, b, 1e-2f)
+    }
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun alphaLong() = assertEquals(0.20f, Color.pack(0x337f3010).alpha, 1e-2f)
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun redLong() = assertEquals(0.50f, Color.pack(0x337f3010).red, 1e-2f)
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun greenLong() = assertEquals(0.19f, Color.pack(0x337f3010).green, 1e-2f)
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun blueLong() = assertEquals(0.06f, Color.pack(0x337f3010).blue, 1e-2f)
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun luminanceLong() {
+        assertEquals(0.212f, Color.pack(0xff7f7f7f.toInt()).luminance, 1e-3f)
+    }
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun isSrgb() {
+        assertTrue(0x337f3010.toColorLong().isSrgb)
+        val c = Color.pack(1.0f, 0.0f, 0.0f, 1.0f, ColorSpace.get(ColorSpace.Named.BT2020))
+        assertFalse(c.isSrgb)
+    }
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun isWideGamut() {
+        assertFalse(0x337f3010.toColorLong().isWideGamut)
+        val c = Color.pack(1.0f, 0.0f, 0.0f, 1.0f, ColorSpace.get(ColorSpace.Named.BT2020))
+        assertTrue(c.isWideGamut)
+    }
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun getColorSpace() {
+        val sRGB = ColorSpace.get(ColorSpace.Named.SRGB)
+        assertEquals(sRGB, 0x337f3010.toColorLong().colorSpace)
+
+        val bt2020 = ColorSpace.get(ColorSpace.Named.BT2020)
+        val c = Color.pack(1.0f, 0.0f, 0.0f, 1.0f, bt2020)
+        assertEquals(bt2020, c.colorSpace)
+    }
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun addColorsSameColorSpace() {
+        val (r, g, b, a) = 0x7f7f0000.toColor() + 0x7f007f00.toColor()
+        assertEquals(0.16f, r, 1e-2f)
+        assertEquals(0.33f, g, 1e-2f)
+        assertEquals(0.00f, b, 1e-2f)
+        assertEquals(0.75f, a, 1e-2f)
+    }
+
+    @Test fun stringToColorInt() = assertEquals(Color.GREEN, "#00ff00".toColorInt())
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/MatrixTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/MatrixTest.kt
new file mode 100644
index 0000000..61fce4f
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/MatrixTest.kt
@@ -0,0 +1,62 @@
+/*
+ * 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.core.graphics
+
+import android.graphics.Matrix
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class MatrixTest {
+    @Test fun translationMatrix() {
+        val r = translationMatrix(2.0f, 3.0f).values()
+        assertEquals(1.0f, r[Matrix.MSCALE_X])
+        assertEquals(0.0f, r[Matrix.MSKEW_X])
+        assertEquals(2.0f, r[Matrix.MTRANS_X])
+        assertEquals(0.0f, r[Matrix.MSKEW_Y])
+        assertEquals(1.0f, r[Matrix.MSCALE_Y])
+        assertEquals(3.0f, r[Matrix.MTRANS_Y])
+    }
+
+    @Test fun scaleMatrix() {
+        val r = scaleMatrix(2.0f, 3.0f).values()
+        assertEquals(2.0f, r[Matrix.MSCALE_X])
+        assertEquals(0.0f, r[Matrix.MSKEW_X])
+        assertEquals(0.0f, r[Matrix.MTRANS_X])
+        assertEquals(0.0f, r[Matrix.MSKEW_Y])
+        assertEquals(3.0f, r[Matrix.MSCALE_Y])
+        assertEquals(0.0f, r[Matrix.MTRANS_Y])
+    }
+
+    @Test fun rotationMatrix() {
+        val r = rotationMatrix(90.0f, 2.0f, 3.0f).values()
+        assertEquals(0.0f, r[Matrix.MSCALE_X])
+        assertEquals(-1.0f, r[Matrix.MSKEW_X])
+        assertEquals(5.0f, r[Matrix.MTRANS_X])
+        assertEquals(1.0f, r[Matrix.MSKEW_Y])
+        assertEquals(0.0f, r[Matrix.MSCALE_Y])
+        assertEquals(1.0f, r[Matrix.MTRANS_Y])
+    }
+
+    @Test fun multiply() {
+        val t = translationMatrix(2.0f, 3.0f)
+        val s = scaleMatrix(2.0f, 3.0f)
+        val r = (s * t).values()
+
+        assertEquals(4.0f, r[Matrix.MTRANS_X], 1e-4f)
+        assertEquals(9.0f, r[Matrix.MTRANS_Y], 1e-4f)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/PathTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/PathTest.kt
new file mode 100644
index 0000000..36f2cba
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/PathTest.kt
@@ -0,0 +1,121 @@
+/*
+ * 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.core.graphics
+
+import android.graphics.Path
+import android.graphics.RectF
+import android.support.test.filters.SdkSuppress
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotEquals
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class PathTest {
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun testFlatten() {
+        val p = Path()
+
+        // Start with several moves
+        p.moveTo(5.0f, 5.0f)
+        p.moveTo(10.0f, 10.0f)
+        p.lineTo(20.0f, 20.0f)
+        p.lineTo(30.0f, 10.0f)
+        // Several moves in the middle
+        p.moveTo(40.0f, 10.0f)
+        p.moveTo(50.0f, 10.0f)
+        p.lineTo(60.0f, 20.0f)
+        // End with several moves
+        p.moveTo(10.0f, 10.0f)
+        p.moveTo(30.0f, 30.0f)
+
+        var count = 0
+        p.flatten().forEach {
+            count++
+            assertNotEquals(it.startFraction, it.endFraction)
+        }
+        assertEquals(3, count)
+    }
+
+    @SdkSuppress(minSdkVersion = 19)
+    @Test fun testUnion() {
+        val r1 = Path().apply { addRect(0.0f, 0.0f, 10.0f, 10.0f, Path.Direction.CW) }
+        val r2 = Path().apply { addRect(5.0f, 0.0f, 15.0f, 15.0f, Path.Direction.CW) }
+
+        val p = r1 + r2
+        val r = RectF()
+        p.computeBounds(r, true)
+
+        assertEquals(RectF(0.0f, 0.0f, 15.0f, 15.0f), r)
+    }
+
+    @SdkSuppress(minSdkVersion = 19)
+    @Test fun testAnd() {
+        val r1 = Path().apply { addRect(0.0f, 0.0f, 10.0f, 10.0f, Path.Direction.CW) }
+        val r2 = Path().apply { addRect(5.0f, 0.0f, 15.0f, 15.0f, Path.Direction.CW) }
+
+        val p = r1 and r2
+        val r = RectF()
+        p.computeBounds(r, true)
+
+        assertEquals(RectF(0.0f, 0.0f, 15.0f, 15.0f), r)
+    }
+
+    @SdkSuppress(minSdkVersion = 19)
+    @Test fun testDifference() {
+        val r1 = Path().apply { addRect(0.0f, 0.0f, 10.0f, 10.0f, Path.Direction.CW) }
+        val r2 = Path().apply { addRect(5.0f, 0.0f, 15.0f, 15.0f, Path.Direction.CW) }
+
+        val p = r1 - r2
+        val r = RectF()
+        p.computeBounds(r, true)
+
+        assertEquals(RectF(0.0f, 0.0f, 5.0f, 10.0f), r)
+    }
+
+    @SdkSuppress(minSdkVersion = 19)
+    @Test fun testIntersection() {
+        val r1 = Path().apply { addRect(0.0f, 0.0f, 10.0f, 10.0f, Path.Direction.CW) }
+        val r2 = Path().apply { addRect(5.0f, 0.0f, 15.0f, 15.0f, Path.Direction.CW) }
+
+        val p = r1 or r2
+        val r = RectF()
+        p.computeBounds(r, true)
+
+        assertEquals(RectF(5.0f, 0.0f, 10.0f, 10.0f), r)
+    }
+
+    @SdkSuppress(minSdkVersion = 19)
+    @Test fun testEmptyIntersection() {
+        val r1 = Path().apply { addRect(0.0f, 0.0f, 2.0f, 2.0f, Path.Direction.CW) }
+        val r2 = Path().apply { addRect(5.0f, 5.0f, 7.0f, 7.0f, Path.Direction.CW) }
+
+        val p = r1 or r2
+        assertTrue(p.isEmpty)
+    }
+
+    @SdkSuppress(minSdkVersion = 19)
+    @Test fun testXor() {
+        val r1 = Path().apply { addRect(0.0f, 0.0f, 10.0f, 10.0f, Path.Direction.CW) }
+        val r2 = Path().apply { addRect(5.0f, 5.0f, 15.0f, 15.0f, Path.Direction.CW) }
+
+        val p = r1 xor r2
+        val r = RectF()
+        p.computeBounds(r, true)
+
+        assertEquals(RectF(0.0f, 0.0f, 15.0f, 15.0f), r)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/PictureTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/PictureTest.kt
new file mode 100644
index 0000000..6d0029f
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/PictureTest.kt
@@ -0,0 +1,34 @@
+/*
+ * 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.core.graphics
+
+import android.graphics.Color
+import android.graphics.Picture
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class PictureTest {
+    @Test fun record() {
+        val p = Picture().record(1, 1) {
+            drawColor(Color.RED)
+        }
+        val v = createBitmap(1, 1).applyCanvas {
+            drawPicture(p)
+        }.getPixel(0, 0)
+        assertEquals(0xffff0000.toInt(), v)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/PointTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/PointTest.kt
new file mode 100644
index 0000000..791d35f
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/PointTest.kt
@@ -0,0 +1,106 @@
+/*
+ * 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.core.graphics
+
+import android.graphics.Point
+import android.graphics.PointF
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class PointTest {
+    @Test fun destructuringInt() {
+        val (x, y) = Point(2, 3)
+        assertEquals(2, x)
+        assertEquals(3, y)
+    }
+
+    @Test fun destructuringFloat() {
+        val (x, y) = PointF(2.0f, 3.0f)
+        assertEquals(2.0f, x)
+        assertEquals(3.0f, y)
+    }
+
+    @Test fun offsetInt() {
+        val (x, y) = Point(2, 3) + 2
+        assertEquals(4, x)
+        assertEquals(5, y)
+    }
+
+    @Test fun offsetFloat() {
+        val (x, y) = PointF(2.0f, 3.0f) + 2.0f
+        assertEquals(4.0f, x)
+        assertEquals(5.0f, y)
+    }
+
+    @Test fun offsetPoint() {
+        val (x, y) = Point(2, 3) + Point(1, 2)
+        assertEquals(3, x)
+        assertEquals(5, y)
+    }
+
+    @Test fun offsetPointF() {
+        val (x, y) = PointF(2.0f, 3.0f) + PointF(1.0f, 2.0f)
+        assertEquals(3.0f, x)
+        assertEquals(5.0f, y)
+    }
+
+    @Test fun negativeOffsetInt() {
+        val (x, y) = Point(2, 3) - 2
+        assertEquals(0, x)
+        assertEquals(1, y)
+    }
+
+    @Test fun negativeOffsetFloat() {
+        val (x, y) = PointF(2.0f, 3.0f) - 2.0f
+        assertEquals(0.0f, x)
+        assertEquals(1.0f, y)
+    }
+
+    @Test fun negativeOffsetPoint() {
+        val (x, y) = Point(2, 3) - Point(1, 2)
+        assertEquals(1, x)
+        assertEquals(1, y)
+    }
+
+    @Test fun negativeOffsetPointF() {
+        val (x, y) = PointF(2.0f, 3.0f) - PointF(1.0f, 2.0f)
+        assertEquals(1.0f, x)
+        assertEquals(1.0f, y)
+    }
+
+    @Test fun negateInt() {
+        val (x, y) = -Point(2, 3)
+        assertEquals(-2, x)
+        assertEquals(-3, y)
+    }
+
+    @Test fun negateFloat() {
+        val (x, y) = -PointF(2.0f, 3.0f)
+        assertEquals(-2.0f, x)
+        assertEquals(-3.0f, y)
+    }
+
+    @Test fun toPointF() {
+        val pointF = Point(1, 2).toPointF()
+        assertEquals(1f, pointF.x, 0f)
+        assertEquals(2f, pointF.y, 0f)
+    }
+
+    @Test fun toPoint() {
+        assertEquals(Point(1, 2), PointF(1.1f, 2.8f).toPoint())
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/PorterDuffTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/PorterDuffTest.kt
new file mode 100644
index 0000000..9b44a50
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/PorterDuffTest.kt
@@ -0,0 +1,50 @@
+/*
+ * 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.core.graphics
+
+import android.graphics.Paint
+import android.graphics.PorterDuff
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class PorterDuffTest {
+    @Test fun xfermode() {
+        val p = createBitmap(1, 1).applyCanvas {
+            val p = Paint().apply { color = 0xffffffff.toInt() }
+            drawRect(0f, 0f, 1f, 1f, p)
+
+            p.color = 0x7f00ff00
+            p.xfermode = PorterDuff.Mode.SRC.toXfermode()
+            drawRect(0f, 0f, 1f, 1f, p)
+        }.getPixel(0, 0)
+
+        assertEquals(0x7f00ff00, p)
+    }
+
+    @Test fun colorFilter() {
+        val p = createBitmap(1, 1).applyCanvas {
+            val p = Paint().apply { color = 0xffffffff.toInt() }
+            drawRect(0f, 0f, 1f, 1f, p)
+
+            p.color = 0xff000000.toInt()
+            p.colorFilter = PorterDuff.Mode.SRC.toColorFilter(0xff00ff00.toInt())
+            drawRect(0f, 0f, 1f, 1f, p)
+        }.getPixel(0, 0)
+
+        assertEquals(0xff00ff00.toInt(), p)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/RectTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/RectTest.kt
new file mode 100644
index 0000000..8b2613f
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/RectTest.kt
@@ -0,0 +1,232 @@
+/*
+ * 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.core.graphics
+
+import android.graphics.Matrix
+import android.graphics.Point
+import android.graphics.PointF
+import android.graphics.Rect
+import android.graphics.RectF
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class RectTest {
+    @Test fun destructuringInt() {
+        val (l, t, r, b) = Rect(4, 8, 16, 24)
+        assertEquals(4, l)
+        assertEquals(8, t)
+        assertEquals(16, r)
+        assertEquals(24, b)
+    }
+
+    @Test fun destructuringFloat() {
+        val (l, t, r, b) = RectF(4.0f, 8.0f, 16.0f, 24.0f)
+        assertEquals(4.0f, l)
+        assertEquals(8.0f, t)
+        assertEquals(16.0f, r)
+        assertEquals(24.0f, b)
+    }
+
+    @Test fun unionInt() {
+        val (l, t, r, b) = Rect(0, 0, 4, 4) + Rect(-1, -1, 6, 6)
+        assertEquals(-1, l)
+        assertEquals(-1, t)
+        assertEquals(6, r)
+        assertEquals(6, b)
+    }
+
+    @Test fun unionAsAndInt() {
+        val (l, t, r, b) = Rect(0, 0, 4, 4) and Rect(-1, -1, 6, 6)
+        assertEquals(-1, l)
+        assertEquals(-1, t)
+        assertEquals(6, r)
+        assertEquals(6, b)
+    }
+
+    @Test fun unionFloat() {
+        val (l, t, r, b) = RectF(0.0f, 0.0f, 4.0f, 4.0f) + RectF(-1.0f, -1.0f, 6.0f, 6.0f)
+        assertEquals(-1.0f, l)
+        assertEquals(-1.0f, t)
+        assertEquals(6.0f, r)
+        assertEquals(6.0f, b)
+    }
+
+    @Test fun unionAsAndFloat() {
+        val (l, t, r, b) = RectF(0.0f, 0.0f, 4.0f, 4.0f) and RectF(-1.0f, -1.0f, 6.0f, 6.0f)
+        assertEquals(-1.0f, l)
+        assertEquals(-1.0f, t)
+        assertEquals(6.0f, r)
+        assertEquals(6.0f, b)
+    }
+
+    @Test fun differenceInt() {
+        val r = Rect(0, 0, 4, 4) - Rect(-1, 2, 6, 6)
+        assertEquals(Rect(0, 0, 4, 2), r.bounds)
+    }
+
+    @Test fun differenceFloat() {
+        val r = RectF(0.0f, 0.0f, 4.0f, 4.0f) - RectF(-1.0f, 2.0f, 6.0f, 6.0f)
+        assertEquals(Rect(0, 0, 4, 2), r.bounds)
+    }
+
+    @Test fun intersectionAsOrInt() {
+        val (l, t, r, b) = Rect(0, 0, 4, 4) or Rect(2, 2, 6, 6)
+        assertEquals(2, l)
+        assertEquals(2, t)
+        assertEquals(4, r)
+        assertEquals(4, b)
+    }
+
+    @Test fun intersectionAsOrFloat() {
+        val (l, t, r, b) = RectF(0.0f, 0.0f, 4.0f, 4.0f) or RectF(2.0f, 2.0f, 6.0f, 6.0f)
+        assertEquals(2.0f, l)
+        assertEquals(2.0f, t)
+        assertEquals(4.0f, r)
+        assertEquals(4.0f, b)
+    }
+
+    @Test fun xorInt() {
+        val r = Rect(0, 0, 4, 4) xor Rect(2, 2, 6, 6)
+        assertEquals(Rect(0, 0, 4, 4) and Rect(2, 2, 6, 6), r.bounds)
+        assertFalse(r.contains(3, 3))
+    }
+
+    @Test fun xorFloat() {
+        val r = RectF(0.0f, 0.0f, 4.0f, 4.0f) xor RectF(2.0f, 2.0f, 6.0f, 6.0f)
+        assertEquals(Rect(0, 0, 4, 4) and Rect(2, 2, 6, 6), r.bounds)
+        assertFalse(r.contains(3, 3))
+    }
+
+    @Test fun offsetInt() {
+        val (l, t, r, b) = Rect(0, 0, 2, 2) + 2
+        assertEquals(l, 2)
+        assertEquals(t, 2)
+        assertEquals(r, 4)
+        assertEquals(b, 4)
+    }
+
+    @Test fun offsetPoint() {
+        val (l, t, r, b) = Rect(0, 0, 2, 2) + Point(1, 2)
+        assertEquals(l, 1)
+        assertEquals(t, 2)
+        assertEquals(r, 3)
+        assertEquals(b, 4)
+    }
+
+    @Test fun offsetFloat() {
+        val (l, t, r, b) = RectF(0.0f, 0.0f, 2.0f, 2.0f) + 2.0f
+        assertEquals(l, 2.0f)
+        assertEquals(t, 2.0f)
+        assertEquals(r, 4.0f)
+        assertEquals(b, 4.0f)
+    }
+
+    @Test fun offsetPointF() {
+        val (l, t, r, b) = RectF(0.0f, 0.0f, 2.0f, 2.0f) + PointF(1.0f, 2.0f)
+        assertEquals(l, 1.0f)
+        assertEquals(t, 2.0f)
+        assertEquals(r, 3.0f)
+        assertEquals(b, 4.0f)
+    }
+
+    @Test fun negativeOffsetInt() {
+        val (l, t, r, b) = Rect(0, 0, 2, 2) - 2
+        assertEquals(l, -2)
+        assertEquals(t, -2)
+        assertEquals(r, 0)
+        assertEquals(b, 0)
+    }
+
+    @Test fun negativeOffsetPoint() {
+        val (l, t, r, b) = Rect(0, 0, 2, 2) - Point(1, 2)
+        assertEquals(l, -1)
+        assertEquals(t, -2)
+        assertEquals(r, 1)
+        assertEquals(b, 0)
+    }
+
+    @Test fun negativeOffsetFloat() {
+        val (l, t, r, b) = RectF(0.0f, 0.0f, 2.0f, 2.0f) - 2.0f
+        assertEquals(l, -2.0f)
+        assertEquals(t, -2.0f)
+        assertEquals(r, 0.0f)
+        assertEquals(b, 0.0f)
+    }
+
+    @Test fun negativeOffsetPointF() {
+        val (l, t, r, b) = RectF(0.0f, 0.0f, 2.0f, 2.0f) - PointF(1.0f, 2.0f)
+        assertEquals(l, -1.0f)
+        assertEquals(t, -2.0f)
+        assertEquals(r, 1.0f)
+        assertEquals(b, 0.0f)
+    }
+
+    @Test fun pointInside() {
+        assertTrue(Point(1, 1) in Rect(0, 0, 2, 2))
+        assertTrue(PointF(1.0f, 1.0f) in RectF(0.0f, 0.0f, 2.0f, 2.0f))
+    }
+
+    @Test fun toRect() {
+        assertEquals(
+            Rect(0, 1, 2, 3),
+            RectF(0f, 1f, 2f, 3f).toRect())
+
+        assertEquals(
+            Rect(0, 1, 2, 3),
+            RectF(0.1f, 1.1f, 1.9f, 2.9f).toRect())
+    }
+
+    @Test fun toRectF() {
+        val rectF = Rect(0, 1, 2, 3).toRectF()
+        assertEquals(0f, rectF.left, 0f)
+        assertEquals(1f, rectF.top, 0f)
+        assertEquals(2f, rectF.right, 0f)
+        assertEquals(3f, rectF.bottom, 0f)
+    }
+
+    @Test fun toRegionInt() {
+        assertEquals(Rect(1, 1, 5, 5), Rect(1, 1, 5, 5).toRegion().bounds)
+    }
+
+    @Test fun toRegionFloat() {
+        assertEquals(Rect(1, 1, 5, 5), RectF(1.1f, 1.1f, 4.8f, 4.8f).toRegion().bounds)
+    }
+
+    @Test fun transformRectToRect() {
+        val m = Matrix()
+        m.setScale(2.0f, 2.0f)
+
+        val r = RectF(2.0f, 2.0f, 5.0f, 7.0f).transform(m)
+        assertEquals(4f, r.left, 0f)
+        assertEquals(4f, r.top, 0f)
+        assertEquals(10f, r.right, 0f)
+        assertEquals(14f, r.bottom, 0f)
+    }
+
+    @Test fun transformRectNotPreserved() {
+        val m = Matrix()
+        m.setRotate(45.0f)
+
+        val (l, t, r, b) = RectF(-1.0f, -1.0f, 1.0f, 1.0f).transform(m)
+        assertEquals(-1.414f, l, 1e-3f)
+        assertEquals(-1.414f, t, 1e-3f)
+        assertEquals( 1.414f, r, 1e-3f)
+        assertEquals( 1.414f, b, 1e-3f)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/RegionTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/RegionTest.kt
new file mode 100644
index 0000000..21e6443
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/RegionTest.kt
@@ -0,0 +1,157 @@
+/*
+ * 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.core.graphics
+
+import android.graphics.Point
+import android.graphics.Rect
+import android.graphics.Region
+import androidx.testutils.assertThrows
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertNotSame
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class RegionTest {
+    @Test fun containsPoint() {
+        assertFalse(Point(1, 1) in Region())
+        assertTrue(Point(1, 1) in Region(0, 0, 2, 2))
+    }
+
+    @Test fun unionRect() {
+        val r = Region(0, 0, 2, 2) + Rect(4, 4, 6, 6)
+        assertFalse(Point(3, 3) in r)
+        assertTrue(Point(1, 1) in r)
+        assertTrue(Point(5, 5) in r)
+    }
+
+    @Test fun unionRegion() {
+        val r = Region(0, 0, 2, 2) + Region(4, 4, 6, 6)
+        assertFalse(Point(3, 3) in r)
+        assertTrue(Point(1, 1) in r)
+        assertTrue(Point(5, 5) in r)
+    }
+
+    @Test fun unionAsAndRect() {
+        val r = Region(0, 0, 2, 2) and Rect(4, 4, 6, 6)
+        assertFalse(Point(3, 3) in r)
+        assertTrue(Point(1, 1) in r)
+        assertTrue(Point(5, 5) in r)
+    }
+
+    @Test fun unionAsAndRegion() {
+        val r = Region(0, 0, 2, 2) and Region(4, 4, 6, 6)
+        assertFalse(Point(3, 3) in r)
+        assertTrue(Point(1, 1) in r)
+        assertTrue(Point(5, 5) in r)
+    }
+
+    @Test fun differenceRect() {
+        val r = Region(0, 0, 4, 4) - Rect(2, 2, 6, 6)
+        assertFalse(Point(3, 3) in r)
+        assertTrue(Point(1, 1) in r)
+        assertFalse(Point(5, 5) in r)
+    }
+
+    @Test fun differenceRegion() {
+        val r = Region(0, 0, 4, 4) - Region(2, 2, 6, 6)
+        assertFalse(Point(3, 3) in r)
+        assertTrue(Point(1, 1) in r)
+        assertFalse(Point(5, 5) in r)
+    }
+
+    @Test fun unaryMinus() {
+        val r = Rect(0, 0, 10, 10) - Rect(4, 4, 6, 6)
+        assertTrue(Point(1, 1) in r)
+        assertFalse(Point(5, 5) in r)
+
+        val i = -r
+        assertFalse(Point(1, 1) in i)
+        assertTrue(Point(5, 5) in i)
+    }
+
+    @Test fun not() {
+        val r = Rect(0, 0, 10, 10) - Rect(4, 4, 6, 6)
+        assertTrue(Point(1, 1) in r)
+        assertFalse(Point(5, 5) in r)
+
+        val i = !r
+        assertFalse(Point(1, 1) in i)
+        assertTrue(Point(5, 5) in i)
+    }
+
+    @Test fun orRect() {
+        val r = Region(0, 0, 4, 4) or Rect(2, 2, 6, 6)
+        assertFalse(Point(1, 1) in r)
+        assertTrue(Point(3, 3) in r)
+    }
+
+    @Test fun orRegion() {
+        val r = Region(0, 0, 4, 4) or Region(2, 2, 6, 6)
+        assertFalse(Point(1, 1) in r)
+        assertTrue(Point(3, 3) in r)
+    }
+
+    @Test fun xorRect() {
+        val r = Region(0, 0, 4, 4) xor Rect(2, 2, 6, 6)
+        assertFalse(Point(3, 3) in r)
+        assertTrue(Point(1, 1) in r)
+    }
+
+    @Test fun xorRegion() {
+        val r = Region(0, 0, 4, 4) xor Region(2, 2, 6, 6)
+        assertFalse(Point(3, 3) in r)
+        assertTrue(Point(1, 1) in r)
+    }
+
+    @Test fun iteratorForLoop() {
+        val region = Region(0, 0, 4, 4) -
+                Rect(2, 2, 6, 6)
+        var count = 0
+        var r = Rect()
+        for (rect in region) {
+            count++
+            assertNotSame(r, rect)
+            r = rect
+        }
+        assertEquals(2, count)
+    }
+
+    @Test fun iteratorOutOfBounds() {
+        val region = Region(0, 0, 4, 4) -
+                Rect(2, 2, 6, 6)
+        val it = region.iterator()
+        it.next()
+        it.next()
+        assertThrows<IndexOutOfBoundsException> {
+            it.next()
+        }
+    }
+
+    @Test fun iteratorForEach() {
+        val region = Region(0, 0, 4, 4) -
+                Rect(2, 2, 6, 6)
+        var count = 0
+        var r = Rect()
+        region.forEach {
+            count++
+            assertNotSame(r, it)
+            r = it
+        }
+        assertEquals(2, count)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/ShaderTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/ShaderTest.kt
new file mode 100644
index 0000000..ad2b63c
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/ShaderTest.kt
@@ -0,0 +1,44 @@
+/*
+ * 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.core.graphics
+
+import android.graphics.Matrix
+import android.graphics.Shader
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class ShaderTest {
+    @Test
+    fun testTransform() {
+        @Suppress("DEPRECATION")
+        val shader = Shader()
+        val values = FloatArray(9)
+        val matrix = Matrix()
+
+        shader.transform {
+            setTranslate(10f, 30f)
+        }
+
+        // Now read matrix from Shader
+        shader.getLocalMatrix(matrix)
+        matrix.getValues(values)
+
+        // Assert that the values are as expected
+        assertEquals(10f, values[Matrix.MTRANS_X])
+        assertEquals(30f, values[Matrix.MTRANS_Y])
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/drawable/BitmapDrawableTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/drawable/BitmapDrawableTest.kt
new file mode 100644
index 0000000..4c4ceb6
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/drawable/BitmapDrawableTest.kt
@@ -0,0 +1,32 @@
+/*
+ * 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.core.graphics.drawable
+
+import android.support.test.InstrumentationRegistry
+import androidx.core.graphics.createBitmap
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class BitmapDrawableTest {
+    private val context = InstrumentationRegistry.getContext()
+
+    @Test fun fromBitmap() {
+        val b = createBitmap(1, 1)
+        val drawable = b.toDrawable(context.resources)
+        assertEquals(b, drawable.bitmap)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/drawable/ColorDrawableTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/drawable/ColorDrawableTest.kt
new file mode 100644
index 0000000..ad7a39b
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/drawable/ColorDrawableTest.kt
@@ -0,0 +1,35 @@
+/*
+ * 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.core.graphics.drawable
+
+import android.graphics.Color
+import android.support.test.filters.SdkSuppress
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class ColorDrawableTest {
+    @Test fun fromInt() {
+        val drawable = Color.CYAN.toDrawable()
+        assertEquals(Color.CYAN, drawable.color)
+    }
+
+    @SdkSuppress(minSdkVersion = 26)
+    @Test fun fromColor() {
+        val drawable = Color.valueOf(Color.CYAN).toDrawable()
+        assertEquals(Color.CYAN, drawable.color)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/drawable/DrawableTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/drawable/DrawableTest.kt
new file mode 100644
index 0000000..6455d0a
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/drawable/DrawableTest.kt
@@ -0,0 +1,167 @@
+/*
+ * 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.core.graphics.drawable
+
+import android.graphics.Bitmap.Config
+import android.graphics.Color
+import android.graphics.drawable.BitmapDrawable
+import android.graphics.drawable.ColorDrawable
+import android.support.test.InstrumentationRegistry
+import androidx.core.graphics.createBitmap
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class DrawableTest {
+    private val context = InstrumentationRegistry.getContext()
+    private val resources = context.resources
+
+    @Test fun bitmapDrawableNoSizeNoConfig() {
+        val original = createBitmap(10, 10).apply {
+            eraseColor(Color.RED)
+        }
+        val drawable = BitmapDrawable(resources, original)
+
+        val bitmap = drawable.toBitmap()
+        assertEquals(10, bitmap.width)
+        assertEquals(10, bitmap.height)
+        assertEquals(Config.ARGB_8888, bitmap.config)
+        assertEquals(Color.RED, bitmap.getPixel(5, 5))
+    }
+
+    @Test fun bitmapDrawableNoSizeRetainedConfig() {
+        val original = createBitmap(10, 10).apply {
+            eraseColor(Color.RED)
+        }
+        val drawable = BitmapDrawable(resources, original)
+
+        val bitmap = drawable.toBitmap(config = Config.ARGB_8888)
+        assertEquals(10, bitmap.width)
+        assertEquals(10, bitmap.height)
+        assertEquals(Config.ARGB_8888, bitmap.config)
+        assertEquals(Color.RED, bitmap.getPixel(5, 5))
+    }
+
+    @Test fun bitmapDrawableNoSizeDifferentConfig() {
+        val original = createBitmap(10, 10).apply {
+            eraseColor(Color.RED)
+        }
+        val drawable = BitmapDrawable(resources, original)
+
+        val bitmap = drawable.toBitmap(config = Config.ARGB_8888)
+        assertEquals(10, bitmap.width)
+        assertEquals(10, bitmap.height)
+        assertEquals(Config.ARGB_8888, bitmap.config)
+        assertEquals(Color.RED, bitmap.getPixel(5, 5))
+    }
+
+    @Test fun bitmapDrawableDifferentSizeNoConfig() {
+        val original = createBitmap(10, 10).apply {
+            eraseColor(Color.RED)
+        }
+        val drawable = BitmapDrawable(resources, original)
+
+        val bitmap = drawable.toBitmap(20, 20)
+        assertEquals(20, bitmap.width)
+        assertEquals(20, bitmap.height)
+        assertEquals(Config.ARGB_8888, bitmap.config)
+        assertEquals(Color.RED, bitmap.getPixel(10, 10))
+    }
+
+    @Test fun bitmapDrawableDifferentSizeDifferentConfig() {
+        val original = createBitmap(10, 10).apply {
+            eraseColor(Color.RED)
+        }
+        val drawable = BitmapDrawable(resources, original)
+
+        val bitmap = drawable.toBitmap(20, 20, Config.ARGB_8888)
+        assertEquals(20, bitmap.width)
+        assertEquals(20, bitmap.height)
+        assertEquals(Config.ARGB_8888, bitmap.config)
+        assertEquals(Color.RED, bitmap.getPixel(10, 10))
+    }
+
+    @Test fun drawableNoConfig() {
+        val drawable = object : ColorDrawable(Color.RED) {
+            override fun getIntrinsicWidth() = 10
+            override fun getIntrinsicHeight() = 10
+        }
+
+        val bitmap = drawable.toBitmap()
+        assertEquals(10, bitmap.width)
+        assertEquals(10, bitmap.height)
+        assertEquals(Config.ARGB_8888, bitmap.config)
+        assertEquals(Color.RED, bitmap.getPixel(5, 5))
+    }
+
+    @Test fun drawableConfig() {
+        val drawable = object : ColorDrawable(Color.RED) {
+            override fun getIntrinsicWidth() = 10
+            override fun getIntrinsicHeight() = 10
+        }
+
+        val bitmap = drawable.toBitmap(config = Config.RGB_565)
+        assertEquals(10, bitmap.width)
+        assertEquals(10, bitmap.height)
+        assertEquals(Config.RGB_565, bitmap.config)
+        assertEquals(Color.RED, bitmap.getPixel(5, 5))
+    }
+
+    @Test fun drawableSize() {
+        val drawable = object : ColorDrawable(Color.RED) {
+            override fun getIntrinsicWidth() = 10
+            override fun getIntrinsicHeight() = 10
+        }
+
+        val bitmap = drawable.toBitmap(20, 20)
+        assertEquals(20, bitmap.width)
+        assertEquals(20, bitmap.height)
+        assertEquals(Config.ARGB_8888, bitmap.config)
+        assertEquals(Color.RED, bitmap.getPixel(10, 10))
+    }
+
+    @Test fun oldBoundsRestored() {
+        val drawable = object : ColorDrawable(Color.RED) {
+            override fun getIntrinsicWidth() = 10
+            override fun getIntrinsicHeight() = 10
+        }
+        drawable.setBounds(2, 2, 8, 8)
+
+        val bitmap = drawable.toBitmap()
+        assertEquals(10, bitmap.width)
+        assertEquals(10, bitmap.height)
+
+        assertEquals(2, drawable.bounds.left)
+        assertEquals(2, drawable.bounds.top)
+        assertEquals(8, drawable.bounds.right)
+        assertEquals(8, drawable.bounds.bottom)
+    }
+
+    @Test fun updateBoundsTest() {
+        val drawable = object : ColorDrawable(Color.RED) {
+            override fun getIntrinsicWidth() = 10
+            override fun getIntrinsicHeight() = 10
+        }
+        drawable.setBounds(0, 0, 10, 10)
+
+        drawable.updateBounds(1, 2, 3, 4)
+
+        assertEquals(1, drawable.bounds.left)
+        assertEquals(2, drawable.bounds.top)
+        assertEquals(3, drawable.bounds.right)
+        assertEquals(4, drawable.bounds.bottom)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/graphics/drawable/IconTest.kt b/core/ktx/src/androidTest/java/androidx/core/graphics/drawable/IconTest.kt
new file mode 100644
index 0000000..e2dd84c
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/graphics/drawable/IconTest.kt
@@ -0,0 +1,96 @@
+/*
+ * 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.core.graphics.drawable
+
+import android.graphics.Bitmap
+import android.graphics.Bitmap.Config.ARGB_8888
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.drawable.Icon
+import android.support.test.InstrumentationRegistry
+import android.support.test.filters.SdkSuppress
+import androidx.core.graphics.createBitmap
+import androidx.core.net.toUri
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import java.io.File
+
+@SdkSuppress(minSdkVersion = 26)
+class IconTest {
+    private val context = InstrumentationRegistry.getContext()
+
+    @Test fun fromBitmapAdaptive() {
+        val density = context.resources.displayMetrics.density
+
+        val edge = (108.0f * density + 0.5f).toInt()
+        val bitmap = Bitmap.createBitmap(edge, edge, ARGB_8888).apply {
+            eraseColor(Color.RED)
+        }
+        val icon = bitmap.toAdaptiveIcon()
+
+        val rendered = icon.toIntrinsicBitmap()
+        val masked = (72.0f * density + 0.5f).toInt()
+        assertEquals(masked, rendered.width)
+        assertEquals(masked, rendered.height)
+        // Grab a pixel from the middle to ensure we are not being masked.
+        assertEquals(Color.RED, rendered.getPixel(masked / 2, masked / 2))
+    }
+
+    @Test fun fromBitmap() {
+        val bitmap = createBitmap(1, 1).apply {
+            eraseColor(Color.RED)
+        }
+        val icon = bitmap.toIcon()
+
+        val rendered = icon.toIntrinsicBitmap()
+        assertEquals(1, rendered.width)
+        assertEquals(1, rendered.height)
+        assertEquals(Color.RED, rendered.getPixel(0, 0))
+    }
+
+    @Test fun fromUri() {
+        // Icon can't read from file:///android_asset/red.png so copy to a real file.
+        val cacheFile = File(context.cacheDir, "red.png")
+        context.assets.open("red.png").use { cacheFile.writeBytes(it.readBytes()) }
+
+        val uri = cacheFile.toUri()
+        val icon = uri.toIcon()
+
+        val rendered = icon.toIntrinsicBitmap()
+        assertEquals(1, rendered.width)
+        assertEquals(1, rendered.height)
+        assertEquals(Color.RED, rendered.getPixel(0, 0))
+    }
+
+    @Test fun fromByteArray() {
+        val bytes = context.assets.open("red.png").use { it.readBytes() }
+        val icon = bytes.toIcon()
+
+        val rendered = icon.toIntrinsicBitmap()
+        assertEquals(1, rendered.width)
+        assertEquals(1, rendered.height)
+        assertEquals(Color.RED, rendered.getPixel(0, 0))
+    }
+
+    private fun Icon.toIntrinsicBitmap(): Bitmap {
+        val drawable = loadDrawable(context)
+        val bitmap = createBitmap(drawable.intrinsicWidth, drawable.intrinsicHeight)
+        drawable.setBounds(0, 0, drawable.intrinsicHeight, drawable.intrinsicHeight)
+        drawable.draw(Canvas(bitmap))
+        return bitmap
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/net/UriTest.kt b/core/ktx/src/androidTest/java/androidx/core/net/UriTest.kt
new file mode 100644
index 0000000..d25de35
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/net/UriTest.kt
@@ -0,0 +1,39 @@
+/*
+ * 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.core.net
+
+import android.net.Uri
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import java.io.File
+
+class UriTest {
+    @Test fun uriFromString() {
+        val string = "https://test.example.com/foo?bar#baz"
+        assertEquals(Uri.parse(string), string.toUri())
+    }
+
+    @Test fun uriFromFile() {
+        val file = File("/path/to/my/file")
+        assertEquals(Uri.fromFile(file), file.toUri())
+    }
+
+    @Test fun fileFromUri() {
+        val uri = Uri.parse("path/to/my/file")
+        assertEquals(File(uri.path), uri.toFile())
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/os/BundleTest.kt b/core/ktx/src/androidTest/java/androidx/core/os/BundleTest.kt
new file mode 100644
index 0000000..924e9ad
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/os/BundleTest.kt
@@ -0,0 +1,141 @@
+/*
+ * 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.core.os
+
+import android.graphics.Rect
+import android.os.Binder
+import android.os.Bundle
+import android.support.test.InstrumentationRegistry
+import android.support.test.filters.SdkSuppress
+import android.util.Size
+import android.util.SizeF
+import android.view.View
+import androidx.testutils.assertThrows
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertArrayEquals
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
+import org.junit.Assert.assertSame
+import org.junit.Test
+import java.util.concurrent.atomic.AtomicInteger
+
+class BundleTest {
+    @Test fun bundleOfValid() {
+        val bundleValue = Bundle()
+        val charSequenceValue = "hey"
+        val parcelableValue = Rect(1, 2, 3, 4)
+        val serializableValue = AtomicInteger(1)
+
+        val bundle = bundleOf(
+            "null" to null,
+
+            "boolean" to true,
+            "byte" to 1.toByte(),
+            "char" to 'a',
+            "double" to 1.0,
+            "float" to 1f,
+            "int" to 1,
+            "long" to 1L,
+            "short" to 1.toShort(),
+
+            "bundle" to bundleValue,
+            "charSequence" to charSequenceValue,
+            "parcelable" to parcelableValue,
+
+            "booleanArray" to booleanArrayOf(),
+            "byteArray" to byteArrayOf(),
+            "charArray" to charArrayOf(),
+            "doubleArray" to doubleArrayOf(),
+            "floatArray" to floatArrayOf(),
+            "intArray" to intArrayOf(),
+            "longArray" to longArrayOf(),
+            "shortArray" to shortArrayOf(),
+
+            "parcelableArray" to arrayOf(parcelableValue),
+            "stringArray" to arrayOf("hey"),
+            "charSequenceArray" to arrayOf<CharSequence>("hey"),
+            "serializableArray" to arrayOf(serializableValue),
+
+            "serializable" to serializableValue
+        )
+
+        assertEquals(25, bundle.size())
+
+        assertNull(bundle["null"])
+
+        assertEquals(true, bundle["boolean"])
+        assertEquals(1.toByte(), bundle["byte"])
+        assertEquals('a', bundle["char"])
+        assertEquals(1.0, bundle["double"])
+        assertEquals(1f, bundle["float"])
+        assertEquals(1, bundle["int"])
+        assertEquals(1L, bundle["long"])
+        assertEquals(1.toShort(), bundle["short"])
+
+        assertSame(bundleValue, bundle["bundle"])
+        assertSame(charSequenceValue, bundle["charSequence"])
+        assertSame(parcelableValue, bundle["parcelable"])
+
+        assertArrayEquals(booleanArrayOf(), bundle["booleanArray"] as BooleanArray)
+        assertArrayEquals(byteArrayOf(), bundle["byteArray"] as ByteArray)
+        assertArrayEquals(charArrayOf(), bundle["charArray"] as CharArray)
+        assertArrayEquals(doubleArrayOf(), bundle["doubleArray"] as DoubleArray, 0.0)
+        assertArrayEquals(floatArrayOf(), bundle["floatArray"] as FloatArray, 0f)
+        assertArrayEquals(intArrayOf(), bundle["intArray"] as IntArray)
+        assertArrayEquals(longArrayOf(), bundle["longArray"] as LongArray)
+        assertArrayEquals(shortArrayOf(), bundle["shortArray"] as ShortArray)
+
+        assertThat(bundle["parcelableArray"] as Array<*>).asList().containsExactly(parcelableValue)
+        assertThat(bundle["stringArray"] as Array<*>).asList().containsExactly("hey")
+        assertThat(bundle["charSequenceArray"] as Array<*>).asList().containsExactly("hey")
+        assertThat(bundle["serializableArray"] as Array<*>).asList()
+            .containsExactly(serializableValue)
+
+        assertSame(serializableValue, bundle["serializable"])
+    }
+
+    @SdkSuppress(minSdkVersion = 18)
+    @Test fun bundleOfValidApi18() {
+        val binderValue = Binder()
+        val bundle = bundleOf("binder" to binderValue)
+        assertSame(binderValue, bundle["binder"])
+    }
+
+    @SdkSuppress(minSdkVersion = 21)
+    @Test fun bundleOfValidApi21() {
+        val sizeValue = Size(1, 1)
+        val sizeFValue = SizeF(1f, 1f)
+
+        val bundle = bundleOf(
+            "size" to sizeValue,
+            "sizeF" to sizeFValue
+        )
+
+        assertSame(sizeValue, bundle["size"])
+        assertSame(sizeFValue, bundle["sizeF"])
+    }
+
+    @Test fun bundleOfInvalid() {
+        assertThrows<IllegalArgumentException> {
+            bundleOf("nope" to View(InstrumentationRegistry.getContext()))
+        }.hasMessageThat().isEqualTo("Illegal value type android.view.View for key \"nope\"")
+
+        assertThrows<IllegalArgumentException> {
+            bundleOf("nopes" to arrayOf(View(InstrumentationRegistry.getContext())))
+        }.hasMessageThat().isEqualTo("Illegal value array type android.view.View for key \"nopes\"")
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/os/HandlerTest.kt b/core/ktx/src/androidTest/java/androidx/core/os/HandlerTest.kt
new file mode 100644
index 0000000..e0fdf4e
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/os/HandlerTest.kt
@@ -0,0 +1,121 @@
+/*
+ * 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.core.os
+
+import android.os.Handler
+import android.os.HandlerThread
+import android.os.SystemClock
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeUnit.MILLISECONDS
+import java.util.concurrent.TimeUnit.SECONDS
+
+class HandlerTest {
+    private val handlerThread = HandlerThread("handler-test")
+    private lateinit var handler: Handler
+
+    @Before fun before() {
+        handlerThread.start()
+        handler = Handler(handlerThread.looper)
+    }
+
+    @After fun after() {
+        handlerThread.quit()
+    }
+
+    @Test fun postDelayedLambdaMillis() {
+        var called = 0
+        handler.postDelayed(10) {
+            called++
+        }
+
+        handler.await(20, MILLISECONDS)
+        assertEquals(1, called)
+    }
+
+    @Test fun postDelayedLambdaMillisRemoved() {
+        var called = 0
+        val runnable = handler.postDelayed(10) {
+            called++
+        }
+        handler.removeCallbacks(runnable)
+
+        handler.await(20, MILLISECONDS)
+        assertEquals(0, called)
+    }
+
+    @Test fun postAtTimeLambda() {
+        var called = 0
+        handler.postAtTime(SystemClock.uptimeMillis() + 10) {
+            called++
+        }
+
+        handler.await(20, MILLISECONDS)
+        assertEquals(1, called)
+    }
+
+    @Test fun postAtTimeLambdaRemoved() {
+        var called = 0
+        val runnable = handler.postAtTime(SystemClock.uptimeMillis() + 10) {
+            called++
+        }
+        handler.removeCallbacks(runnable)
+
+        handler.await(20, MILLISECONDS)
+        assertEquals(0, called)
+    }
+
+    @Test fun postAtTimeLambdaWithTokenRuns() {
+        val token = Any()
+        var called = 0
+        handler.postAtTime(SystemClock.uptimeMillis() + 10, token) {
+            called++
+        }
+
+        handler.await(20, MILLISECONDS)
+        assertEquals(1, called)
+    }
+
+    @Test fun postAtTimeLambdaWithTokenCancelWithToken() {
+        // This test uses the token to cancel the runnable as it's the only way we have to verify
+        // that the Runnable was actually posted with the token.
+
+        val token = Any()
+        var called = 0
+        handler.postAtTime(SystemClock.uptimeMillis() + 10, token) {
+            called++
+        }
+        handler.removeCallbacksAndMessages(token)
+
+        handler.await(20, MILLISECONDS)
+        assertEquals(0, called)
+    }
+
+    private fun Handler.await(amount: Long, unit: TimeUnit) {
+        val latch = CountDownLatch(1)
+        postDelayed(latch::countDown, unit.toMillis(amount))
+
+        // Wait up to 1s longer than desired to account for time skew.
+        val wait = unit.toMillis(amount) + SECONDS.toMillis(1)
+        assertTrue(latch.await(wait, MILLISECONDS))
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/os/PersistableBundleTest.kt b/core/ktx/src/androidTest/java/androidx/core/os/PersistableBundleTest.kt
new file mode 100644
index 0000000..8683155
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/os/PersistableBundleTest.kt
@@ -0,0 +1,85 @@
+/*
+ * 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.core.os
+
+import android.support.test.InstrumentationRegistry
+import android.support.test.filters.SdkSuppress
+import android.view.View
+import androidx.testutils.assertThrows
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertArrayEquals
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
+import org.junit.Test
+
+@SdkSuppress(minSdkVersion = 21)
+class PersistableBundleTest {
+    @Test fun persistableBundleOfValid() {
+        val bundle = persistableBundleOf(
+            "null" to null,
+
+            "double" to 1.0,
+            "int" to 1,
+            "long" to 1L,
+
+            "string" to "hey",
+
+            "doubleArray" to doubleArrayOf(),
+            "intArray" to intArrayOf(),
+            "longArray" to longArrayOf(),
+
+            "stringArray" to arrayOf("hey")
+        )
+
+        assertEquals(9, bundle.size())
+
+        assertNull(bundle["null"])
+
+        assertEquals(1.0, bundle["double"])
+        assertEquals(1, bundle["int"])
+        assertEquals(1L, bundle["long"])
+
+        assertEquals("hey", bundle["string"])
+
+        assertArrayEquals(doubleArrayOf(), bundle["doubleArray"] as DoubleArray, 0.0)
+        assertArrayEquals(intArrayOf(), bundle["intArray"] as IntArray)
+        assertArrayEquals(longArrayOf(), bundle["longArray"] as LongArray)
+
+        assertThat(bundle["stringArray"] as Array<*>).asList().containsExactly("hey")
+    }
+
+    @SdkSuppress(minSdkVersion = 22)
+    @Test fun persistableBundleOfValidApi22() {
+        val bundle = persistableBundleOf(
+            "boolean" to true,
+            "booleanArray" to booleanArrayOf()
+        )
+
+        assertEquals(true, bundle["boolean"])
+        assertArrayEquals(booleanArrayOf(), bundle["booleanArray"] as BooleanArray)
+    }
+
+    @Test fun persistableBundleOfInvalid() {
+        assertThrows<IllegalArgumentException> {
+            persistableBundleOf("nope" to View(InstrumentationRegistry.getContext()))
+        }.hasMessageThat().isEqualTo("Illegal value type android.view.View for key \"nope\"")
+
+        assertThrows<IllegalArgumentException> {
+            persistableBundleOf("nopes" to arrayOf(View(InstrumentationRegistry.getContext())))
+        }.hasMessageThat().isEqualTo("Illegal value array type android.view.View for key \"nopes\"")
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/preference/PreferenceGroupTest.kt b/core/ktx/src/androidTest/java/androidx/core/preference/PreferenceGroupTest.kt
new file mode 100644
index 0000000..0653a28
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/preference/PreferenceGroupTest.kt
@@ -0,0 +1,176 @@
+/*
+ * 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.core.preference
+
+import android.preference.Preference
+import android.preference.PreferenceFragment
+import android.preference.PreferenceGroup
+import android.support.test.InstrumentationRegistry
+import android.support.test.rule.ActivityTestRule
+import androidx.core.TestPreferenceActivity
+import androidx.testutils.assertThrows
+import androidx.testutils.fail
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertSame
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+class PreferenceGroupTest {
+
+    @JvmField
+    @Rule
+    val rule = ActivityTestRule(TestPreferenceActivity::class.java)
+    private val context = InstrumentationRegistry.getContext()
+    private lateinit var preferenceGroup: PreferenceGroup
+
+    @Before fun setup() {
+        preferenceGroup = (rule
+            .activity
+            .fragmentManager
+            .findFragmentByTag(TestPreferenceActivity.TAG) as PreferenceFragment).preferenceScreen
+    }
+
+    @Test fun get() {
+        val key = "key"
+        val preference = Preference(context)
+        preference.key = key
+        preferenceGroup.addPreference(preference)
+        assertSame(preference, preferenceGroup[key])
+        assertSame(preference, preferenceGroup[0])
+    }
+
+    @Test fun contains() {
+        val preference = Preference(context)
+        assertFalse(preference in preferenceGroup)
+        assertTrue(preference !in preferenceGroup)
+        preferenceGroup.addPreference(preference)
+        assertFalse(preference !in preferenceGroup)
+        assertTrue(preference in preferenceGroup)
+        preferenceGroup.removePreference(preference)
+        assertFalse(preference in preferenceGroup)
+        assertTrue(preference !in preferenceGroup)
+    }
+
+    @Test fun plusAssign() {
+        assertEquals(0, preferenceGroup.preferenceCount)
+
+        val preference1 = Preference(context)
+        preferenceGroup += preference1
+        assertEquals(1, preferenceGroup.preferenceCount)
+        assertSame(preference1, preferenceGroup.getPreference(0))
+
+        val preference2 = Preference(context)
+        preferenceGroup += preference2
+        assertEquals(2, preferenceGroup.preferenceCount)
+        assertSame(preference2, preferenceGroup.getPreference(1))
+    }
+
+    @Test fun minusAssign() {
+        val preference1 = Preference(context)
+        preferenceGroup.addPreference(preference1)
+        val preference2 = Preference(context)
+        preferenceGroup.addPreference(preference2)
+
+        assertEquals(2, preferenceGroup.preferenceCount)
+
+        preferenceGroup -= preference2
+        assertEquals(1, preferenceGroup.preferenceCount)
+        assertSame(preference1, preferenceGroup.getPreference(0))
+
+        preferenceGroup -= preference1
+        assertEquals(0, preferenceGroup.preferenceCount)
+    }
+
+    @Test fun size() {
+        assertEquals(0, preferenceGroup.size)
+
+        val preference = Preference(context)
+        preferenceGroup.addPreference(preference)
+        assertEquals(1, preferenceGroup.size)
+
+        preferenceGroup.removePreference(preference)
+        assertEquals(0, preferenceGroup.size)
+    }
+
+    @Test fun isEmpty() {
+        assertTrue(preferenceGroup.isEmpty())
+        preferenceGroup.addPreference(Preference(context))
+        assertFalse(preferenceGroup.isEmpty())
+    }
+
+    @Test fun isNotEmpty() {
+        assertFalse(preferenceGroup.isNotEmpty())
+        preferenceGroup.addPreference(Preference(context))
+        assertTrue(preferenceGroup.isNotEmpty())
+    }
+
+    @Test fun forEach() {
+        preferenceGroup.forEach {
+            fail("Empty preference group should not invoke lambda")
+        }
+
+        val preference1 = Preference(context).apply { key = "ASD" }
+        preferenceGroup.addPreference(preference1)
+        val preference2 = Preference(context)
+        preferenceGroup.addPreference(preference2)
+
+        val preferences = mutableListOf<Preference>()
+        preferenceGroup.forEach {
+            preferences += it
+        }
+        assertThat(preferences).containsExactly(preference1, preference2)
+    }
+
+    @Test fun forEachIndexed() {
+        preferenceGroup.forEach {
+            fail("Empty preference group should not invoke lambda")
+        }
+
+        val preference1 = Preference(context)
+        preferenceGroup.addPreference(preference1)
+        val preference2 = Preference(context)
+        preferenceGroup.addPreference(preference2)
+
+        val preferences = mutableListOf<Preference>()
+        preferenceGroup.forEachIndexed { index, preference ->
+            assertEquals(index, preferences.size)
+            preferences += preference
+        }
+        assertThat(preferences).containsExactly(preference1, preference2)
+    }
+
+    @Test fun iterator() {
+        val preference1 = Preference(context)
+        preferenceGroup.addPreference(preference1)
+        val preference2 = Preference(context)
+        preferenceGroup.addPreference(preference2)
+
+        val iterator = preferenceGroup.iterator()
+        assertTrue(iterator.hasNext())
+        assertSame(preference1, iterator.next())
+        assertTrue(iterator.hasNext())
+        assertSame(preference2, iterator.next())
+        assertFalse(iterator.hasNext())
+        assertThrows<IndexOutOfBoundsException> {
+            iterator.next()
+        }
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/text/CharSequenceTest.kt b/core/ktx/src/androidTest/java/androidx/core/text/CharSequenceTest.kt
new file mode 100644
index 0000000..0ce0a3c
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/text/CharSequenceTest.kt
@@ -0,0 +1,36 @@
+/*
+ * 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.core.text
+
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class CharSequenceTest {
+    @Test fun isDigitsOnly() {
+        assertTrue("012345".isDigitsOnly())
+        assertFalse("0123 abc".isDigitsOnly())
+    }
+
+    @Test fun trimmedLength() {
+        assertEquals(6, "string    ".trimmedLength())
+        assertEquals(6, "    string".trimmedLength())
+        assertEquals(6, "string".trimmedLength())
+        assertEquals(0, "".trimmedLength())
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/text/HtmlTest.kt b/core/ktx/src/androidTest/java/androidx/core/text/HtmlTest.kt
new file mode 100644
index 0000000..0fef5ed
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/text/HtmlTest.kt
@@ -0,0 +1,62 @@
+/*
+ * 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.core.text
+
+import android.text.Html.FROM_HTML_MODE_COMPACT
+import android.text.Html.ImageGetter
+import android.text.Html.TagHandler
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class HtmlTest {
+    private val imageGetter = ImageGetter { null }
+    private val tagHandler = TagHandler { _, _, _, _ -> }
+
+    @Test fun parseAsHtml() {
+        val parsed = "<b>Hi</b> © > <".parseAsHtml().toString()
+        assertEquals("Hi \u00a9 > <", parsed)
+    }
+
+    @Test fun parseAsHtmlFlags() {
+        val parsed = "<b>Hi</b> © > <".parseAsHtml(FROM_HTML_MODE_COMPACT).toString()
+        assertEquals("Hi \u00a9 > <", parsed)
+    }
+
+    @Test fun parseAsHtmlImageGetterTagHandler() {
+        val parsed = "<b>Hi</b> © > <"
+            .parseAsHtml(FROM_HTML_MODE_COMPACT, imageGetter, tagHandler)
+            .toString()
+        assertEquals("Hi \u00a9 > <", parsed)
+    }
+
+    @Test fun parseAsHtmlFlagsImageGetterTagHandler() {
+        val parsed = "<b>Hi</b> © > <"
+            .parseAsHtml(imageGetter = imageGetter, tagHandler = tagHandler)
+            .toString()
+        assertEquals("Hi \u00a9 > <", parsed)
+    }
+
+    @Test fun convertToHtml() {
+        val html = buildSpannedString {
+            bold {
+                append("Hi")
+            }
+        }.toHtml()
+        assertTrue(html, html.contains("<b>Hi</b>"))
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/text/SpannableStringBuilderTest.kt b/core/ktx/src/androidTest/java/androidx/core/text/SpannableStringBuilderTest.kt
new file mode 100644
index 0000000..5d67e83
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/text/SpannableStringBuilderTest.kt
@@ -0,0 +1,267 @@
+/*
+ * 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.core.text
+
+import android.graphics.Color.RED
+import android.graphics.Color.YELLOW
+import android.graphics.Typeface.BOLD
+import android.graphics.Typeface.ITALIC
+import android.text.SpannedString
+import android.text.style.BackgroundColorSpan
+import android.text.style.BulletSpan
+import android.text.style.ForegroundColorSpan
+import android.text.style.RelativeSizeSpan
+import android.text.style.StrikethroughSpan
+import android.text.style.StyleSpan
+import android.text.style.SubscriptSpan
+import android.text.style.SuperscriptSpan
+import android.text.style.UnderlineSpan
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertSame
+import org.junit.Test
+
+class SpannableStringBuilderTest {
+    @Test fun builder() {
+        val result: SpannedString = buildSpannedString {
+            append("Hello,")
+            append(" World")
+        }
+        assertEquals("Hello, World", result.toString())
+    }
+
+    @Test fun builderInSpan() {
+        val bold = StyleSpan(BOLD)
+        val result: SpannedString = buildSpannedString {
+            append("Hello, ")
+            inSpans(bold) {
+                append("World")
+            }
+        }
+        assertEquals("Hello, World", result.toString())
+
+        val spans = result.getSpans<Any>()
+        assertEquals(1, spans.size)
+
+        val boldSpan = spans.filterIsInstance<StyleSpan>().single()
+        assertSame(bold, boldSpan)
+        assertEquals(7, result.getSpanStart(bold))
+        assertEquals(12, result.getSpanEnd(bold))
+    }
+
+    @Test fun builderBold() {
+        val result: SpannedString = buildSpannedString {
+            append("Hello, ")
+            bold {
+                append("World")
+            }
+        }
+        assertEquals("Hello, World", result.toString())
+
+        val spans = result.getSpans<Any>()
+        assertEquals(1, spans.size)
+
+        val bold = spans.filterIsInstance<StyleSpan>().single()
+        assertEquals(BOLD, bold.style)
+        assertEquals(7, result.getSpanStart(bold))
+        assertEquals(12, result.getSpanEnd(bold))
+    }
+
+    @Test fun builderItalic() {
+        val result: SpannedString = buildSpannedString {
+            append("Hello, ")
+            italic {
+                append("World")
+            }
+        }
+        assertEquals("Hello, World", result.toString())
+
+        val spans = result.getSpans<Any>()
+        assertEquals(1, spans.size)
+
+        val italic = spans.filterIsInstance<StyleSpan>().single()
+        assertEquals(ITALIC, italic.style)
+        assertEquals(7, result.getSpanStart(italic))
+        assertEquals(12, result.getSpanEnd(italic))
+    }
+
+    @Test fun builderUnderline() {
+        val result: SpannedString = buildSpannedString {
+            append("Hello, ")
+            underline {
+                append("World")
+            }
+        }
+        assertEquals("Hello, World", result.toString())
+
+        val spans = result.getSpans<Any>()
+        assertEquals(1, spans.size)
+
+        val underline = spans.filterIsInstance<UnderlineSpan>().single()
+        assertEquals(7, result.getSpanStart(underline))
+        assertEquals(12, result.getSpanEnd(underline))
+    }
+
+    @Test fun builderColor() {
+        val result: SpannedString = buildSpannedString {
+            append("Hello, ")
+            color(RED) {
+                append("World")
+            }
+        }
+        assertEquals("Hello, World", result.toString())
+
+        val spans = result.getSpans<Any>()
+        assertEquals(1, spans.size)
+
+        val color = spans.filterIsInstance<ForegroundColorSpan>().single()
+        assertEquals(RED, color.foregroundColor)
+        assertEquals(7, result.getSpanStart(color))
+        assertEquals(12, result.getSpanEnd(color))
+    }
+
+    @Test fun builderBackgroundColor() {
+        val result: SpannedString = buildSpannedString {
+            append("Hello, ")
+            backgroundColor(RED) {
+                append("World")
+            }
+        }
+        assertEquals("Hello, World", result.toString())
+
+        val spans = result.getSpans<Any>()
+        assertEquals(1, spans.size)
+
+        val color = spans.filterIsInstance<BackgroundColorSpan>().single()
+        assertEquals(RED, color.backgroundColor)
+        assertEquals(7, result.getSpanStart(color))
+        assertEquals(12, result.getSpanEnd(color))
+    }
+
+    @Test fun builderStrikeThrough() {
+        val result: SpannedString = buildSpannedString {
+            append("Hello, ")
+            strikeThrough {
+                append("World")
+            }
+        }
+        assertEquals("Hello, World", result.toString())
+
+        val spans = result.getSpans<Any>()
+        assertEquals(1, spans.size)
+
+        val strikeThrough = spans.filterIsInstance<StrikethroughSpan>().single()
+        assertEquals(7, result.getSpanStart(strikeThrough))
+        assertEquals(12, result.getSpanEnd(strikeThrough))
+    }
+
+    @Test fun builderScale() {
+        val result: SpannedString = buildSpannedString {
+            append("Hello, ")
+            scale(2f) {
+                append("World")
+            }
+        }
+        assertEquals("Hello, World", result.toString())
+
+        val spans = result.getSpans<Any>()
+        assertEquals(1, spans.size)
+
+        val scale = spans.filterIsInstance<RelativeSizeSpan>().single()
+        assertEquals(2f, scale.sizeChange)
+        assertEquals(7, result.getSpanStart(scale))
+        assertEquals(12, result.getSpanEnd(scale))
+    }
+
+    @Test fun nested() {
+        val result: SpannedString = buildSpannedString {
+            color(RED) {
+                append('H')
+                inSpans(SubscriptSpan()) {
+                    append('e')
+                }
+                append('l')
+                inSpans(SuperscriptSpan()) {
+                    append('l')
+                }
+                append('o')
+            }
+            append(", ")
+            backgroundColor(YELLOW) {
+                append('W')
+                underline {
+                    append('o')
+                    bold {
+                        append('r')
+                    }
+                    append('l')
+                }
+                append('d')
+            }
+        }
+        assertEquals("Hello, World", result.toString())
+
+        val spans = result.getSpans<Any>()
+        assertEquals(6, spans.size)
+
+        val color = spans.filterIsInstance<ForegroundColorSpan>().single()
+        assertEquals(RED, color.foregroundColor)
+        assertEquals(0, result.getSpanStart(color))
+        assertEquals(5, result.getSpanEnd(color))
+
+        val subscript = spans.filterIsInstance<SubscriptSpan>().single()
+        assertEquals(1, result.getSpanStart(subscript))
+        assertEquals(2, result.getSpanEnd(subscript))
+
+        val superscript = spans.filterIsInstance<SuperscriptSpan>().single()
+        assertEquals(3, result.getSpanStart(superscript))
+        assertEquals(4, result.getSpanEnd(superscript))
+
+        val backgroundColor = spans.filterIsInstance<BackgroundColorSpan>().single()
+        assertEquals(YELLOW, backgroundColor.backgroundColor)
+        assertEquals(7, result.getSpanStart(backgroundColor))
+        assertEquals(12, result.getSpanEnd(backgroundColor))
+
+        val underline = spans.filterIsInstance<UnderlineSpan>().single()
+        assertEquals(8, result.getSpanStart(underline))
+        assertEquals(11, result.getSpanEnd(underline))
+
+        val bold = spans.filterIsInstance<StyleSpan>().single()
+        assertEquals(BOLD, bold.style)
+        assertEquals(9, result.getSpanStart(bold))
+        assertEquals(10, result.getSpanEnd(bold))
+    }
+
+    @Test fun multipleSpans() {
+        val result: SpannedString = buildSpannedString {
+            append("Hello, ")
+            inSpans(BulletSpan(), UnderlineSpan()) {
+                append("World")
+            }
+        }
+        assertEquals("Hello, World", result.toString())
+
+        val spans = result.getSpans<Any>()
+        assertEquals(2, spans.size)
+
+        val bullet = spans.filterIsInstance<BulletSpan>().single()
+        assertEquals(7, result.getSpanStart(bullet))
+        assertEquals(12, result.getSpanEnd(bullet))
+        val underline = spans.filterIsInstance<UnderlineSpan>().single()
+        assertEquals(7, result.getSpanStart(underline))
+        assertEquals(12, result.getSpanEnd(underline))
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/text/SpannableStringTest.kt b/core/ktx/src/androidTest/java/androidx/core/text/SpannableStringTest.kt
new file mode 100644
index 0000000..5fe3c5d
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/text/SpannableStringTest.kt
@@ -0,0 +1,89 @@
+/*
+ * 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.core.text
+
+import android.graphics.Typeface.BOLD
+import android.text.SpannableString
+import android.text.style.StyleSpan
+import android.text.style.UnderlineSpan
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class SpannableStringTest {
+
+    @Test fun toSpannableString() = assertTrue("Hello, World".toSpannable() is SpannableString)
+
+    @Test fun plusAssign() {
+        val s = "Hello, World".toSpannable()
+
+        val bold = StyleSpan(BOLD)
+        s += bold
+        assertEquals(0, s.getSpanStart(bold))
+        assertEquals(s.length, s.getSpanEnd(bold))
+    }
+
+    @Test fun minusAssign() {
+        val s = "Hello, World".toSpannable()
+        val bold = StyleSpan(BOLD)
+        s += bold
+        assertTrue(s.getSpans<Any>().isNotEmpty())
+        s -= bold
+        assertTrue(s.getSpans<Any>().isEmpty())
+    }
+
+    @Test fun clearSpans() {
+        val s = "Hello, World".toSpannable()
+        s += StyleSpan(BOLD)
+        s += UnderlineSpan()
+        assertTrue(s.getSpans<Any>().isNotEmpty())
+        s.clearSpans()
+        assertTrue(s.getSpans<Any>().isEmpty())
+    }
+
+    @Test fun setIndices() {
+        val s = "Hello, World".toSpannable()
+        s[0, 5] = StyleSpan(BOLD)
+        s[7, 12] = UnderlineSpan()
+
+        val spans = s.getSpans<Any>()
+
+        val bold = spans.filterIsInstance<StyleSpan>().single()
+        assertEquals(0, s.getSpanStart(bold))
+        assertEquals(5, s.getSpanEnd(bold))
+
+        val underline = spans.filterIsInstance<UnderlineSpan>().single()
+        assertEquals(7, s.getSpanStart(underline))
+        assertEquals(12, s.getSpanEnd(underline))
+    }
+
+    @Test fun setRange() {
+        val s = "Hello, World".toSpannable()
+        s[0..5] = StyleSpan(BOLD)
+        s[7..12] = UnderlineSpan()
+
+        val spans = s.getSpans<Any>()
+
+        val bold = spans.filterIsInstance<StyleSpan>().single()
+        assertEquals(0, s.getSpanStart(bold))
+        assertEquals(5, s.getSpanEnd(bold))
+
+        val underline = spans.filterIsInstance<UnderlineSpan>().single()
+        assertEquals(7, s.getSpanStart(underline))
+        assertEquals(12, s.getSpanEnd(underline))
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/text/SpannedStringTest.kt b/core/ktx/src/androidTest/java/androidx/core/text/SpannedStringTest.kt
new file mode 100644
index 0000000..cb8930a
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/text/SpannedStringTest.kt
@@ -0,0 +1,48 @@
+/*
+ * 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.core.text
+
+import android.graphics.Typeface.BOLD
+import android.text.Spanned.SPAN_INCLUSIVE_EXCLUSIVE
+import android.text.SpannedString
+import android.text.style.StyleSpan
+import android.text.style.UnderlineSpan
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertSame
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class SpannedStringTest {
+
+    @Test fun toSpanned() = assertTrue("Hello, World".toSpanned() is SpannedString)
+
+    @Test fun getSpans() {
+        val bold = StyleSpan(BOLD)
+        val underline = UnderlineSpan()
+
+        val s = "Hello, World".toSpannable()
+        s.setSpan(bold, 0, 5, SPAN_INCLUSIVE_EXCLUSIVE)
+        s.setSpan(underline, 7, 12, SPAN_INCLUSIVE_EXCLUSIVE)
+
+        assertSame(bold, s.getSpans<StyleSpan>().single())
+        assertSame(underline, s.getSpans<UnderlineSpan>().single())
+        assertEquals(s.getSpans<Any>().size, 2)
+
+        assertSame(bold, s.getSpans<Any>(0, 6).single())
+        assertSame(underline, s.getSpans<Any>(6, 12).single())
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/text/StringTest.kt b/core/ktx/src/androidTest/java/androidx/core/text/StringTest.kt
new file mode 100644
index 0000000..2812799
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/text/StringTest.kt
@@ -0,0 +1,26 @@
+/*
+ * 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.core.text
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class StringTest {
+    @Test fun htmlEncode() {
+        assertEquals("&lt;&gt; &amp; &quot; &#39;", """<> & " '""".htmlEncode())
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/transition/TransitionTest.kt b/core/ktx/src/androidTest/java/androidx/core/transition/TransitionTest.kt
new file mode 100644
index 0000000..c3a2d22
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/transition/TransitionTest.kt
@@ -0,0 +1,95 @@
+/*
+ * 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.core.transition
+
+import android.support.test.InstrumentationRegistry
+import android.support.test.filters.SdkSuppress
+import android.support.test.rule.ActivityTestRule
+import android.transition.Fade
+import android.transition.Transition
+import android.transition.TransitionManager
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import androidx.core.TestActivity
+import androidx.core.ktx.test.R
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.atomic.AtomicBoolean
+
+@SdkSuppress(minSdkVersion = 19)
+class TransitionTest {
+    @JvmField @Rule val rule = ActivityTestRule<TestActivity>(TestActivity::class.java)
+
+    private lateinit var transition: Transition
+
+    @Before fun setup() {
+        transition = Fade().setDuration(50)
+    }
+
+    @Test fun testDoOnStart() {
+        val called = AtomicBoolean()
+        transition.doOnStart {
+            called.set(true)
+        }
+
+        startTransition(transition)
+        assertTrue(called.get())
+    }
+
+    @Test fun testDoOnEnd() {
+        val called = AtomicBoolean()
+        transition.doOnEnd {
+            called.set(true)
+        }
+
+        val latch = CountDownLatch(1)
+        transition.addListener(object : Transition.TransitionListener {
+            override fun onTransitionEnd(transition: Transition?) {
+                latch.countDown()
+            }
+
+            override fun onTransitionResume(transition: Transition?) = Unit
+            override fun onTransitionPause(transition: Transition?) = Unit
+            override fun onTransitionCancel(transition: Transition?) = Unit
+            override fun onTransitionStart(transition: Transition?) = Unit
+        })
+
+        startTransition(transition)
+
+        assertTrue(latch.await(1, TimeUnit.SECONDS))
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync()
+
+        assertTrue(called.get())
+    }
+
+    private fun startTransition(t: Transition) {
+        rule.runOnUiThread {
+            val sceneRoot = rule.activity.findViewById<ViewGroup>(R.id.root)
+            val view = rule.activity.findViewById<ImageView>(R.id.image_view)
+
+            TransitionManager.beginDelayedTransition(sceneRoot, t)
+
+            view.visibility = View.INVISIBLE
+        }
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync()
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/util/ArrayMapTest.kt b/core/ktx/src/androidTest/java/androidx/core/util/ArrayMapTest.kt
new file mode 100644
index 0000000..5eddef2
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/util/ArrayMapTest.kt
@@ -0,0 +1,40 @@
+/*
+ * 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.core.util
+
+import android.support.test.filters.SdkSuppress
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+@SdkSuppress(minSdkVersion = 19)
+class ArrayMapTest {
+    @Test fun empty() {
+        val map = arrayMapOf<String, String>()
+        assertEquals(0, map.size)
+    }
+
+    @Test fun nonEmpty() {
+        val map = arrayMapOf("foo" to "bar", "bar" to "baz")
+        assertThat(map).containsExactly("foo", "bar", "bar", "baz")
+    }
+
+    @Test fun duplicateKeyKeepsLast() {
+        val map = arrayMapOf("foo" to "bar", "foo" to "baz")
+        assertThat(map).containsExactly("foo", "baz")
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/util/ArraySetTest.kt b/core/ktx/src/androidTest/java/androidx/core/util/ArraySetTest.kt
new file mode 100644
index 0000000..934f18c
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/util/ArraySetTest.kt
@@ -0,0 +1,35 @@
+/*
+ * 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.core.util
+
+import android.support.test.filters.SdkSuppress
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+@SdkSuppress(minSdkVersion = 23)
+class ArraySetTest {
+    @Test fun empty() {
+        val set = arraySetOf<String>()
+        assertEquals(0, set.size)
+    }
+
+    @Test fun nonEmpty() {
+        val set = arraySetOf("foo", "bar", "baz")
+        assertThat(set).containsExactly("foo", "bar", "baz")
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/util/AtomicFileTest.kt b/core/ktx/src/androidTest/java/androidx/core/util/AtomicFileTest.kt
new file mode 100644
index 0000000..59fc8d9
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/util/AtomicFileTest.kt
@@ -0,0 +1,109 @@
+/*
+ * 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.core.util
+
+import android.support.test.filters.SdkSuppress
+import android.util.AtomicFile
+import androidx.testutils.assertThrows
+import org.junit.Assert.assertArrayEquals
+import org.junit.Assert.assertEquals
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.TemporaryFolder
+import java.io.IOException
+
+@SdkSuppress(minSdkVersion = 17)
+class AtomicFileTest {
+    @get:Rule val temporaryFolder = TemporaryFolder()
+
+    private lateinit var file: AtomicFile
+
+    @Before fun before() {
+        file = AtomicFile(temporaryFolder.newFile())
+    }
+
+    @Test fun tryWriteSuccess() {
+        file.tryWrite {
+            it.write(byteArrayOf(0, 1, 2))
+        }
+        val bytes = file.openRead().use { it.readBytes() }
+        assertArrayEquals(byteArrayOf(0, 1, 2), bytes)
+    }
+
+    @Test fun tryWriteFail() {
+        val os = file.startWrite()
+        os.write(byteArrayOf(0, 1, 2))
+        file.finishWrite(os)
+
+        val failure = IOException("Broken!")
+        assertThrows<IOException> {
+            file.tryWrite {
+                it.write(byteArrayOf(3, 4, 5))
+                throw failure
+            }
+        }.isSameAs(failure)
+
+        val bytes = file.openRead().use { it.readBytes() }
+        assertArrayEquals(byteArrayOf(0, 1, 2), bytes)
+    }
+
+    @Test fun writeBytes() {
+        file.writeBytes(byteArrayOf(0, 1, 2))
+
+        val bytes = file.openRead().use { it.readBytes() }
+        assertArrayEquals(byteArrayOf(0, 1, 2), bytes)
+    }
+
+    @Test fun writeText() {
+        file.writeText("Hey")
+
+        val bytes = file.openRead().use { it.readBytes() }
+        assertArrayEquals(byteArrayOf(72, 101, 121), bytes)
+    }
+
+    @Test fun writeTextCharset() {
+        file.writeText("Hey", charset = Charsets.UTF_16LE)
+
+        val bytes = file.openRead().use { it.readBytes() }
+        assertArrayEquals(byteArrayOf(72, 0, 101, 0, 121, 0), bytes)
+    }
+
+    @Test fun readBytes() {
+        val os = file.startWrite()
+        os.write(byteArrayOf(0, 1, 2))
+        file.finishWrite(os)
+
+        assertArrayEquals(byteArrayOf(0, 1, 2), file.readBytes())
+    }
+
+    @Test fun readText() {
+        val os = file.startWrite()
+        os.write(byteArrayOf(72, 101, 121))
+        file.finishWrite(os)
+
+        assertEquals("Hey", file.readText())
+    }
+
+    @Test fun readTextCharset() {
+        val os = file.startWrite()
+        os.write(byteArrayOf(72, 0, 101, 0, 121, 0))
+        file.finishWrite(os)
+
+        assertEquals("Hey", file.readText(charset = Charsets.UTF_16LE))
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/util/HalfTest.kt b/core/ktx/src/androidTest/java/androidx/core/util/HalfTest.kt
new file mode 100644
index 0000000..b79e064
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/util/HalfTest.kt
@@ -0,0 +1,33 @@
+/*
+ * 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.core.util
+
+import android.support.test.filters.SdkSuppress
+import android.util.Half
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+@SdkSuppress(minSdkVersion = 26)
+class HalfTest {
+    @Test fun shortToHalf() = assertEquals(Half(1.toShort()), 1.toShort().toHalf())
+
+    @Test fun floatToHalf() = assertEquals(Half(1f), 1f.toHalf())
+
+    @Test fun doubleToHalf() = assertEquals(Half(1.0), 1.0.toHalf())
+
+    @Test fun stringToHalf() = assertEquals(Half("1"), "1".toHalf())
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/util/LocaleTest.kt b/core/ktx/src/androidTest/java/androidx/core/util/LocaleTest.kt
new file mode 100644
index 0000000..0a345f0
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/util/LocaleTest.kt
@@ -0,0 +1,34 @@
+/*
+ * 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.core.util
+
+import android.view.View
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import java.util.Locale
+
+class LocaleTest {
+    @Test fun layoutDirectionWithLTR() {
+        val ltrLocale = Locale.Builder().setLanguage("en").build()
+        assertEquals(View.LAYOUT_DIRECTION_LTR, ltrLocale.layoutDirection)
+    }
+
+    @Test fun layoutDirectionWithRTL() {
+        val rtlLocale = Locale.Builder().setLanguage("ar").build()
+        assertEquals(View.LAYOUT_DIRECTION_RTL, rtlLocale.layoutDirection)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/util/LongSparseArrayTest.kt b/core/ktx/src/androidTest/java/androidx/core/util/LongSparseArrayTest.kt
new file mode 100644
index 0000000..c2289e6
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/util/LongSparseArrayTest.kt
@@ -0,0 +1,200 @@
+/*
+ * 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.core.util
+
+import android.support.test.filters.SdkSuppress
+import android.util.LongSparseArray
+import androidx.testutils.fail
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertSame
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+@SdkSuppress(minSdkVersion = 16)
+class LongSparseArrayTest {
+    @Test fun sizeProperty() {
+        val array = LongSparseArray<String>()
+        assertEquals(0, array.size)
+        array.put(1L, "one")
+        assertEquals(1, array.size)
+    }
+
+    @Test fun containsOperator() {
+        val array = LongSparseArray<String>()
+        assertFalse(1L in array)
+        array.put(1L, "one")
+        assertTrue(1L in array)
+    }
+
+    @Test fun containsOperatorWithValue() {
+        val array = LongSparseArray<String>()
+
+        array.put(1L, "one")
+        assertFalse(2L in array)
+
+        array.put(2L, "two")
+        assertTrue(2L in array)
+    }
+
+    @Test fun setOperator() {
+        val array = LongSparseArray<String>()
+        array[1L] = "one"
+        assertEquals("one", array.get(1L))
+    }
+
+    @Test fun plusOperator() {
+        val first = LongSparseArray<String>().apply { put(1L, "one") }
+        val second = LongSparseArray<String>().apply { put(2L, "two") }
+        val combined = first + second
+        assertEquals(2, combined.size())
+        assertEquals(1L, combined.keyAt(0))
+        assertEquals("one", combined.valueAt(0))
+        assertEquals(2L, combined.keyAt(1))
+        assertEquals("two", combined.valueAt(1))
+    }
+
+    @Test fun containsKey() {
+        val array = LongSparseArray<String>()
+        assertFalse(array.containsKey(1L))
+        array.put(1L, "one")
+        assertTrue(array.containsKey(1L))
+    }
+
+    @Test fun containsKeyWithValue() {
+        val array = LongSparseArray<String>()
+
+        array.put(1L, "one")
+        assertFalse(array.containsKey(2L))
+
+        array.put(2L, "one")
+        assertTrue(array.containsKey(2L))
+    }
+
+    @Test fun containsValue() {
+        val array = LongSparseArray<String>()
+        assertFalse(array.containsValue("one"))
+        array.put(1L, "one")
+        assertTrue(array.containsValue("one"))
+    }
+
+    @Test fun getOrDefault() {
+        val array = LongSparseArray<Any>()
+        val default = Any()
+        assertSame(default, array.getOrDefault(1L, default))
+        array.put(1L, "one")
+        assertEquals("one", array.getOrDefault(1L, default))
+    }
+
+    @Test fun getOrElse() {
+        val array = LongSparseArray<Any>()
+        val default = Any()
+        assertSame(default, array.getOrElse(1L) { default })
+        array.put(1L, "one")
+        assertEquals("one", array.getOrElse(1L) { fail() })
+    }
+
+    @Test fun isEmpty() {
+        val array = LongSparseArray<String>()
+        assertTrue(array.isEmpty())
+        array.put(1L, "one")
+        assertFalse(array.isEmpty())
+    }
+
+    @Test fun isNotEmpty() {
+        val array = LongSparseArray<String>()
+        assertFalse(array.isNotEmpty())
+        array.put(1L, "one")
+        assertTrue(array.isNotEmpty())
+    }
+
+    @Test fun removeValue() {
+        val array = LongSparseArray<String>()
+        array.put(1L, "one")
+        assertFalse(array.remove(0L, "one"))
+        assertEquals(1, array.size())
+        assertFalse(array.remove(1L, "two"))
+        assertEquals(1, array.size())
+        assertTrue(array.remove(1L, "one"))
+        assertEquals(0, array.size())
+    }
+
+    @Test fun putAll() {
+        val dest = LongSparseArray<String>()
+        val source = LongSparseArray<String>()
+        source.put(1L, "one")
+
+        assertEquals(0, dest.size())
+        dest.putAll(source)
+        assertEquals(1, dest.size())
+    }
+
+    @Test fun forEach() {
+        val array = LongSparseArray<String>()
+        array.forEach { _, _ -> fail() }
+
+        array.put(1L, "one")
+        array.put(2L, "two")
+        array.put(6L, "six")
+
+        val keys = mutableListOf<Long>()
+        val values = mutableListOf<String>()
+        array.forEach { key, value ->
+            keys.add(key)
+            values.add(value)
+        }
+        assertThat(keys).containsExactly(1L, 2L, 6L)
+        assertThat(values).containsExactly("one", "two", "six")
+    }
+
+    @Test fun keyIterator() {
+        val array = LongSparseArray<String>()
+        assertFalse(array.keyIterator().hasNext())
+
+        array.put(1L, "one")
+        array.put(2L, "two")
+        array.put(6L, "six")
+
+        val iterator = array.keyIterator()
+        assertTrue(iterator.hasNext())
+        assertEquals(1L, iterator.nextLong())
+        assertTrue(iterator.hasNext())
+        assertEquals(2L, iterator.nextLong())
+        assertTrue(iterator.hasNext())
+        assertEquals(6L, iterator.nextLong())
+        assertFalse(iterator.hasNext())
+    }
+
+    @Test fun valueIterator() {
+        val array = LongSparseArray<String>()
+        assertFalse(array.valueIterator().hasNext())
+
+        array.put(1L, "one")
+        array.put(2L, "two")
+        array.put(6L, "six")
+
+        val iterator = array.valueIterator()
+        assertTrue(iterator.hasNext())
+        assertEquals("one", iterator.next())
+        assertTrue(iterator.hasNext())
+        assertEquals("two", iterator.next())
+        assertTrue(iterator.hasNext())
+        assertEquals("six", iterator.next())
+        assertFalse(iterator.hasNext())
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/util/LruCacheTest.kt b/core/ktx/src/androidTest/java/androidx/core/util/LruCacheTest.kt
new file mode 100644
index 0000000..198e13d
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/util/LruCacheTest.kt
@@ -0,0 +1,48 @@
+/*
+ * 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.core.util
+
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class LruCacheTest {
+    private data class TestData(val x: String = "bla")
+
+    @Test fun size() {
+        val cache = lruCache<String, TestData>(200, { k, (x) -> k.length * x.length })
+        cache.put("long", TestData())
+        assertEquals(cache.size(), 12)
+    }
+
+    @Test fun create() {
+        val cache = lruCache<String, TestData>(200, create = { key -> TestData("$key foo") })
+        assertEquals(cache.get("kung"), TestData("kung foo"))
+    }
+
+    @Test fun onEntryRemoved() {
+        var wasCalled = false
+
+        val cache = lruCache<String, TestData>(200, onEntryRemoved = { _, _, _, _ ->
+            wasCalled = true
+        })
+        val initial = TestData()
+        cache.put("a", initial)
+        cache.remove("a")
+        assertTrue(wasCalled)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/util/PairTest.kt b/core/ktx/src/androidTest/java/androidx/core/util/PairTest.kt
new file mode 100644
index 0000000..e3fac39
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/util/PairTest.kt
@@ -0,0 +1,50 @@
+/*
+ * 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.core.util
+
+import android.util.Pair
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertSame
+import org.junit.Test
+
+class PairTest {
+    @Test fun destructuringNonNull() {
+        val pair = Pair("one", "two")
+        val (first: String, second: String) = pair
+        assertSame(pair.first, first)
+        assertSame(pair.second, second)
+    }
+
+    @Test fun destructuringNullable() {
+        val pair = Pair("one", "two")
+        val (first: String?, second: String?) = pair
+        assertSame(pair.first, first)
+        assertSame(pair.second, second)
+    }
+
+    @Test fun toKotlin() {
+        val android = Pair("one", "two")
+        val kotlin = android.toKotlinPair()
+        assertEquals(android.first to android.second, kotlin)
+    }
+
+    @Test fun toAndroid() {
+        val kotlin = kotlin.Pair("one", "two")
+        val android = kotlin.toAndroidPair()
+        assertEquals(Pair(kotlin.first, kotlin.second), android)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/util/RangeTest.kt b/core/ktx/src/androidTest/java/androidx/core/util/RangeTest.kt
new file mode 100644
index 0000000..ec5d238
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/util/RangeTest.kt
@@ -0,0 +1,61 @@
+/*
+ * 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.core.util
+
+import android.support.test.filters.SdkSuppress
+import android.util.Range
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+@SdkSuppress(minSdkVersion = 21)
+class RangeTest {
+    @Test fun infixFactory() {
+        val range: Range<String> = "a" rangeTo "c"
+        assertEquals("a", range.lower)
+        assertEquals("c", range.upper)
+    }
+
+    @Test fun extendValue() {
+        val range = ("a" rangeTo "c") + "e"
+        assertEquals("a", range.lower)
+        assertEquals("e", range.upper)
+    }
+
+    @Test fun extendRange() {
+        val range = ("a" rangeTo "c") + ("e" rangeTo "g")
+        assertEquals("a", range.lower)
+        assertEquals("g", range.upper)
+    }
+
+    @Test fun intersection() {
+        val range = ("a" rangeTo "e") and ("c" rangeTo "g")
+        assertEquals("c", range.lower)
+        assertEquals("e", range.upper)
+    }
+
+    @Test fun kotlinToAndroid() {
+        val range: Range<Int> = (1..3).toRange()
+        assertEquals(1, range.lower)
+        assertEquals(3, range.upper)
+    }
+
+    @Test fun androidToKotlin() {
+        val range: ClosedRange<String> = Range<String>("a", "c").toClosedRange()
+        assertEquals("a", range.start)
+        assertEquals("c", range.endInclusive)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/util/SizeTest.kt b/core/ktx/src/androidTest/java/androidx/core/util/SizeTest.kt
new file mode 100644
index 0000000..b38c747
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/util/SizeTest.kt
@@ -0,0 +1,38 @@
+/*
+ * 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.core.util
+
+import android.support.test.filters.SdkSuppress
+import android.util.Size
+import android.util.SizeF
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+@SdkSuppress(minSdkVersion = 21)
+class SizeTest {
+    @Test fun destructuringSize() {
+        val (w, h) = Size(320, 240)
+        assertEquals(320, w)
+        assertEquals(240, h)
+    }
+
+    @Test fun destructuringSizeF() {
+        val (w, h) = SizeF(1920.0f, 1080.0f)
+        assertEquals(1920.0f, w)
+        assertEquals(1080.0f, h)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/util/SparseArrayTest.kt b/core/ktx/src/androidTest/java/androidx/core/util/SparseArrayTest.kt
new file mode 100644
index 0000000..4a49214
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/util/SparseArrayTest.kt
@@ -0,0 +1,188 @@
+/*
+ * 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.core.util
+
+import android.util.SparseArray
+import androidx.testutils.fail
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertSame
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class SparseArrayTest {
+    @Test fun sizeProperty() {
+        val array = SparseArray<String>()
+        assertEquals(0, array.size)
+        array.put(1, "one")
+        assertEquals(1, array.size)
+    }
+
+    @Test fun containsOperator() {
+        val array = SparseArray<String>()
+        assertFalse(1 in array)
+        array.put(1, "one")
+        assertTrue(1 in array)
+    }
+
+    @Test fun containsOperatorWithItem() {
+        val array = SparseArray<String>()
+
+        array.put(1, "one")
+        assertFalse(2 in array)
+
+        array.put(2, "two")
+        assertTrue(2 in array)
+    }
+
+    @Test fun setOperator() {
+        val array = SparseArray<String>()
+        array[1] = "one"
+        assertEquals("one", array.get(1))
+    }
+
+    @Test fun plusOperator() {
+        val first = SparseArray<String>().apply { put(1, "one") }
+        val second = SparseArray<String>().apply { put(2, "two") }
+        val combined = first + second
+        assertEquals(2, combined.size())
+        assertEquals(1, combined.keyAt(0))
+        assertEquals("one", combined.valueAt(0))
+        assertEquals(2, combined.keyAt(1))
+        assertEquals("two", combined.valueAt(1))
+    }
+
+    @Test fun containsKey() {
+        val array = SparseArray<String>()
+        assertFalse(array.containsKey(1))
+        array.put(1, "one")
+        assertTrue(array.containsKey(1))
+    }
+
+    @Test fun containsValue() {
+        val array = SparseArray<String>()
+        assertFalse(array.containsValue("one"))
+        array.put(1, "one")
+        assertTrue(array.containsValue("one"))
+    }
+
+    @Test fun getOrDefault() {
+        val array = SparseArray<Any>()
+        val default = Any()
+        assertSame(default, array.getOrDefault(1, default))
+        array.put(1, "one")
+        assertEquals("one", array.getOrDefault(1, default))
+    }
+
+    @Test fun getOrElse() {
+        val array = SparseArray<Any>()
+        val default = Any()
+        assertSame(default, array.getOrElse(1) { default })
+        array.put(1, "one")
+        assertEquals("one", array.getOrElse(1) { fail() })
+    }
+
+    @Test fun isEmpty() {
+        val array = SparseArray<String>()
+        assertTrue(array.isEmpty())
+        array.put(1, "one")
+        assertFalse(array.isEmpty())
+    }
+
+    @Test fun isNotEmpty() {
+        val array = SparseArray<String>()
+        assertFalse(array.isNotEmpty())
+        array.put(1, "one")
+        assertTrue(array.isNotEmpty())
+    }
+
+    @Test fun removeValue() {
+        val array = SparseArray<String>()
+        array.put(1, "one")
+        assertFalse(array.remove(0, "one"))
+        assertEquals(1, array.size())
+        assertFalse(array.remove(1, "two"))
+        assertEquals(1, array.size())
+        assertTrue(array.remove(1, "one"))
+        assertEquals(0, array.size())
+    }
+
+    @Test fun putAll() {
+        val dest = SparseArray<String>()
+        val source = SparseArray<String>()
+        source.put(1, "one")
+
+        assertEquals(0, dest.size())
+        dest.putAll(source)
+        assertEquals(1, dest.size())
+    }
+
+    @Test fun forEach() {
+        val array = SparseArray<String>()
+        array.forEach { _, _ -> fail() }
+
+        array.put(1, "one")
+        array.put(2, "two")
+        array.put(6, "six")
+
+        val keys = mutableListOf<Int>()
+        val values = mutableListOf<String>()
+        array.forEach { key, value ->
+            keys.add(key)
+            values.add(value)
+        }
+        assertThat(keys).containsExactly(1, 2, 6)
+        assertThat(values).containsExactly("one", "two", "six")
+    }
+
+    @Test fun keyIterator() {
+        val array = SparseArray<String>()
+        assertFalse(array.keyIterator().hasNext())
+
+        array.put(1, "one")
+        array.put(2, "two")
+        array.put(6, "six")
+
+        val iterator = array.keyIterator()
+        assertTrue(iterator.hasNext())
+        assertEquals(1, iterator.nextInt())
+        assertTrue(iterator.hasNext())
+        assertEquals(2, iterator.nextInt())
+        assertTrue(iterator.hasNext())
+        assertEquals(6, iterator.nextInt())
+        assertFalse(iterator.hasNext())
+    }
+
+    @Test fun valueIterator() {
+        val array = SparseArray<String>()
+        assertFalse(array.valueIterator().hasNext())
+
+        array.put(1, "one")
+        array.put(2, "two")
+        array.put(6, "six")
+
+        val iterator = array.valueIterator()
+        assertTrue(iterator.hasNext())
+        assertEquals("one", iterator.next())
+        assertTrue(iterator.hasNext())
+        assertEquals("two", iterator.next())
+        assertTrue(iterator.hasNext())
+        assertEquals("six", iterator.next())
+        assertFalse(iterator.hasNext())
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/util/SparseBooleanArrayTest.kt b/core/ktx/src/androidTest/java/androidx/core/util/SparseBooleanArrayTest.kt
new file mode 100644
index 0000000..1d67493
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/util/SparseBooleanArrayTest.kt
@@ -0,0 +1,195 @@
+/*
+ * 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.core.util
+
+import android.util.SparseBooleanArray
+import androidx.testutils.fail
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class SparseBooleanArrayTest {
+    @Test fun sizeProperty() {
+        val array = SparseBooleanArray()
+        assertEquals(0, array.size)
+        array.put(1, true)
+        assertEquals(1, array.size)
+    }
+
+    @Test fun containsOperator() {
+        val array = SparseBooleanArray()
+        assertFalse(1 in array)
+        array.put(1, true)
+        assertTrue(1 in array)
+    }
+
+    @Test fun containsOperatorWithValue() {
+        val array = SparseBooleanArray()
+
+        array.put(1, true)
+        assertFalse(2 in array)
+
+        array.put(2, true)
+        assertTrue(2 in array)
+    }
+
+    @Test fun setOperator() {
+        val array = SparseBooleanArray()
+        array[1] = true
+        assertTrue(array.get(1))
+    }
+
+    @Test fun plusOperator() {
+        val first = SparseBooleanArray().apply { put(1, true) }
+        val second = SparseBooleanArray().apply { put(2, false) }
+        val combined = first + second
+        assertEquals(2, combined.size())
+        assertEquals(1, combined.keyAt(0))
+        assertTrue(combined.valueAt(0))
+        assertEquals(2, combined.keyAt(1))
+        assertFalse(combined.valueAt(1))
+    }
+
+    @Test fun containsKey() {
+        val array = SparseBooleanArray()
+        assertFalse(array.containsKey(1))
+        array.put(1, true)
+        assertTrue(array.containsKey(1))
+    }
+
+    @Test fun containsKeyWithValue() {
+        val array = SparseBooleanArray()
+
+        array.put(1, true)
+        assertFalse(array.containsKey(2))
+
+        array.put(2, true)
+        assertTrue(array.containsKey(2))
+    }
+
+    @Test fun containsValue() {
+        val array = SparseBooleanArray()
+        assertFalse(array.containsValue(true))
+        array.put(1, true)
+        assertTrue(array.containsValue(true))
+    }
+
+    @Test fun getOrDefault() {
+        val array = SparseBooleanArray()
+        assertFalse(array.getOrDefault(1, false))
+        array.put(1, true)
+        assertTrue(array.getOrDefault(1, false))
+    }
+
+    @Test fun getOrElse() {
+        val array = SparseBooleanArray()
+        assertFalse(array.getOrElse(1) { false })
+        array.put(1, true)
+        assertTrue(array.getOrElse(1) { fail() })
+    }
+
+    @Test fun isEmpty() {
+        val array = SparseBooleanArray()
+        assertTrue(array.isEmpty())
+        array.put(1, true)
+        assertFalse(array.isEmpty())
+    }
+
+    @Test fun isNotEmpty() {
+        val array = SparseBooleanArray()
+        assertFalse(array.isNotEmpty())
+        array.put(1, true)
+        assertTrue(array.isNotEmpty())
+    }
+
+    @Test fun removeValue() {
+        val array = SparseBooleanArray()
+        array.put(1, true)
+        assertFalse(array.remove(0, true))
+        assertEquals(1, array.size())
+        assertFalse(array.remove(1, false))
+        assertEquals(1, array.size())
+        assertTrue(array.remove(1, true))
+        assertEquals(0, array.size())
+    }
+
+    @Test fun putAll() {
+        val dest = SparseBooleanArray()
+        val source = SparseBooleanArray()
+        source.put(1, true)
+
+        assertEquals(0, dest.size())
+        dest.putAll(source)
+        assertEquals(1, dest.size())
+    }
+
+    @Test fun forEach() {
+        val array = SparseBooleanArray()
+        array.forEach { _, _ -> fail() }
+
+        array.put(1, true)
+        array.put(2, false)
+        array.put(6, true)
+
+        val keys = mutableListOf<Int>()
+        val values = mutableListOf<Boolean>()
+        array.forEach { key, value ->
+            keys.add(key)
+            values.add(value)
+        }
+        assertThat(keys).containsExactly(1, 2, 6)
+        assertThat(values).containsExactly(true, false, true)
+    }
+
+    @Test fun keyIterator() {
+        val array = SparseBooleanArray()
+        assertFalse(array.keyIterator().hasNext())
+
+        array.put(1, true)
+        array.put(2, false)
+        array.put(6, true)
+
+        val iterator = array.keyIterator()
+        assertTrue(iterator.hasNext())
+        assertEquals(1, iterator.nextInt())
+        assertTrue(iterator.hasNext())
+        assertEquals(2, iterator.nextInt())
+        assertTrue(iterator.hasNext())
+        assertEquals(6, iterator.nextInt())
+        assertFalse(iterator.hasNext())
+    }
+
+    @Test fun valueIterator() {
+        val array = SparseBooleanArray()
+        assertFalse(array.valueIterator().hasNext())
+
+        array.put(1, true)
+        array.put(2, false)
+        array.put(6, true)
+
+        val iterator = array.valueIterator()
+        assertTrue(iterator.hasNext())
+        assertTrue(iterator.nextBoolean())
+        assertTrue(iterator.hasNext())
+        assertFalse(iterator.nextBoolean())
+        assertTrue(iterator.hasNext())
+        assertTrue(iterator.nextBoolean())
+        assertFalse(iterator.hasNext())
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/util/SparseIntArrayTest.kt b/core/ktx/src/androidTest/java/androidx/core/util/SparseIntArrayTest.kt
new file mode 100644
index 0000000..40794c1
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/util/SparseIntArrayTest.kt
@@ -0,0 +1,195 @@
+/*
+ * 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.core.util
+
+import android.util.SparseIntArray
+import androidx.testutils.fail
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class SparseIntArrayTest {
+    @Test fun sizeProperty() {
+        val array = SparseIntArray()
+        assertEquals(0, array.size)
+        array.put(1, 11)
+        assertEquals(1, array.size)
+    }
+
+    @Test fun containsOperator() {
+        val array = SparseIntArray()
+        assertFalse(1 in array)
+        array.put(1, 11)
+        assertTrue(1 in array)
+    }
+
+    @Test fun containsOperatorWithValue() {
+        val array = SparseIntArray()
+
+        array.put(1, 11)
+        assertFalse(2 in array)
+
+        array.put(2, 22)
+        assertTrue(2 in array)
+    }
+
+    @Test fun setOperator() {
+        val array = SparseIntArray()
+        array[1] = 11
+        assertEquals(11, array.get(1))
+    }
+
+    @Test fun plusOperator() {
+        val first = SparseIntArray().apply { put(1, 11) }
+        val second = SparseIntArray().apply { put(2, 22) }
+        val combined = first + second
+        assertEquals(2, combined.size())
+        assertEquals(1, combined.keyAt(0))
+        assertEquals(11, combined.valueAt(0))
+        assertEquals(2, combined.keyAt(1))
+        assertEquals(22, combined.valueAt(1))
+    }
+
+    @Test fun containsKey() {
+        val array = SparseIntArray()
+        assertFalse(array.containsKey(1))
+        array.put(1, 11)
+        assertTrue(array.containsKey(1))
+    }
+
+    @Test fun containsKeyWithValue() {
+        val array = SparseIntArray()
+
+        array.put(1, 11)
+        assertFalse(array.containsKey(2))
+
+        array.put(2, 22)
+        assertTrue(array.containsKey(2))
+    }
+
+    @Test fun containsValue() {
+        val array = SparseIntArray()
+        assertFalse(array.containsValue(11))
+        array.put(1, 11)
+        assertTrue(array.containsValue(11))
+    }
+
+    @Test fun getOrDefault() {
+        val array = SparseIntArray()
+        assertEquals(22, array.getOrDefault(1, 22))
+        array.put(1, 11)
+        assertEquals(11, array.getOrDefault(1, 22))
+    }
+
+    @Test fun getOrElse() {
+        val array = SparseIntArray()
+        assertEquals(22, array.getOrElse(1) { 22 })
+        array.put(1, 11)
+        assertEquals(11, array.getOrElse(1) { fail() })
+    }
+
+    @Test fun isEmpty() {
+        val array = SparseIntArray()
+        assertTrue(array.isEmpty())
+        array.put(1, 11)
+        assertFalse(array.isEmpty())
+    }
+
+    @Test fun isNotEmpty() {
+        val array = SparseIntArray()
+        assertFalse(array.isNotEmpty())
+        array.put(1, 11)
+        assertTrue(array.isNotEmpty())
+    }
+
+    @Test fun removeValue() {
+        val array = SparseIntArray()
+        array.put(1, 11)
+        assertFalse(array.remove(0, 11))
+        assertEquals(1, array.size())
+        assertFalse(array.remove(1, 22))
+        assertEquals(1, array.size())
+        assertTrue(array.remove(1, 11))
+        assertEquals(0, array.size())
+    }
+
+    @Test fun putAll() {
+        val dest = SparseIntArray()
+        val source = SparseIntArray()
+        source.put(1, 11)
+
+        assertEquals(0, dest.size())
+        dest.putAll(source)
+        assertEquals(1, dest.size())
+    }
+
+    @Test fun forEach() {
+        val array = SparseIntArray()
+        array.forEach { _, _ -> fail() }
+
+        array.put(1, 11)
+        array.put(2, 22)
+        array.put(6, 66)
+
+        val keys = mutableListOf<Int>()
+        val values = mutableListOf<Int>()
+        array.forEach { key, value ->
+            keys.add(key)
+            values.add(value)
+        }
+        assertThat(keys).containsExactly(1, 2, 6)
+        assertThat(values).containsExactly(11, 22, 66)
+    }
+
+    @Test fun keyIterator() {
+        val array = SparseIntArray()
+        assertFalse(array.keyIterator().hasNext())
+
+        array.put(1, 11)
+        array.put(2, 22)
+        array.put(6, 66)
+
+        val iterator = array.keyIterator()
+        assertTrue(iterator.hasNext())
+        assertEquals(1, iterator.nextInt())
+        assertTrue(iterator.hasNext())
+        assertEquals(2, iterator.nextInt())
+        assertTrue(iterator.hasNext())
+        assertEquals(6, iterator.nextInt())
+        assertFalse(iterator.hasNext())
+    }
+
+    @Test fun valueIterator() {
+        val array = SparseIntArray()
+        assertFalse(array.valueIterator().hasNext())
+
+        array.put(1, 11)
+        array.put(2, 22)
+        array.put(6, 66)
+
+        val iterator = array.valueIterator()
+        assertTrue(iterator.hasNext())
+        assertEquals(11, iterator.nextInt())
+        assertTrue(iterator.hasNext())
+        assertEquals(22, iterator.nextInt())
+        assertTrue(iterator.hasNext())
+        assertEquals(66, iterator.nextInt())
+        assertFalse(iterator.hasNext())
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/util/SparseLongArrayTest.kt b/core/ktx/src/androidTest/java/androidx/core/util/SparseLongArrayTest.kt
new file mode 100644
index 0000000..c65c2ad
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/util/SparseLongArrayTest.kt
@@ -0,0 +1,197 @@
+/*
+ * 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.core.util
+
+import android.support.test.filters.SdkSuppress
+import android.util.SparseLongArray
+import androidx.testutils.fail
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+@SdkSuppress(minSdkVersion = 18)
+class SparseLongArrayTest {
+    @Test fun sizeProperty() {
+        val array = SparseLongArray()
+        assertEquals(0, array.size)
+        array.put(1, 11L)
+        assertEquals(1, array.size)
+    }
+
+    @Test fun containsOperator() {
+        val array = SparseLongArray()
+        assertFalse(1 in array)
+        array.put(1, 11L)
+        assertTrue(1 in array)
+    }
+
+    @Test fun containsOperatorWithValue() {
+        val array = SparseLongArray()
+
+        array.put(1, 11L)
+        assertFalse(2 in array)
+
+        array.put(2, 22L)
+        assertTrue(2 in array)
+    }
+
+    @Test fun setOperator() {
+        val array = SparseLongArray()
+        array[1] = 11L
+        assertEquals(11L, array.get(1))
+    }
+
+    @Test fun plusOperator() {
+        val first = SparseLongArray().apply { put(1, 11L) }
+        val second = SparseLongArray().apply { put(2, 22L) }
+        val combined = first + second
+        assertEquals(2, combined.size())
+        assertEquals(1, combined.keyAt(0))
+        assertEquals(11L, combined.valueAt(0))
+        assertEquals(2, combined.keyAt(1))
+        assertEquals(22L, combined.valueAt(1))
+    }
+
+    @Test fun containsKey() {
+        val array = SparseLongArray()
+        assertFalse(array.containsKey(1))
+        array.put(1, 11L)
+        assertTrue(array.containsKey(1))
+    }
+
+    @Test fun containsKeyWithValue() {
+        val array = SparseLongArray()
+
+        array.put(1, 11L)
+        assertFalse(array.containsKey(2))
+
+        array.put(2, 22L)
+        assertTrue(array.containsKey(2))
+    }
+
+    @Test fun containsValue() {
+        val array = SparseLongArray()
+        assertFalse(array.containsValue(11L))
+        array.put(1, 11L)
+        assertTrue(array.containsValue(11L))
+    }
+
+    @Test fun getOrDefault() {
+        val array = SparseLongArray()
+        assertEquals(22L, array.getOrDefault(1, 22L))
+        array.put(1, 11L)
+        assertEquals(11L, array.getOrDefault(1, 22L))
+    }
+
+    @Test fun getOrElse() {
+        val array = SparseLongArray()
+        assertEquals(22L, array.getOrElse(1) { 22L })
+        array.put(1, 11L)
+        assertEquals(11L, array.getOrElse(1) { fail() })
+    }
+
+    @Test fun isEmpty() {
+        val array = SparseLongArray()
+        assertTrue(array.isEmpty())
+        array.put(1, 11L)
+        assertFalse(array.isEmpty())
+    }
+
+    @Test fun isNotEmpty() {
+        val array = SparseLongArray()
+        assertFalse(array.isNotEmpty())
+        array.put(1, 11L)
+        assertTrue(array.isNotEmpty())
+    }
+
+    @Test fun removeValue() {
+        val array = SparseLongArray()
+        array.put(1, 11L)
+        assertFalse(array.remove(0, 11L))
+        assertEquals(1, array.size())
+        assertFalse(array.remove(1, 22L))
+        assertEquals(1, array.size())
+        assertTrue(array.remove(1, 11L))
+        assertEquals(0, array.size())
+    }
+
+    @Test fun putAll() {
+        val dest = SparseLongArray()
+        val source = SparseLongArray()
+        source.put(1, 11L)
+
+        assertEquals(0, dest.size())
+        dest.putAll(source)
+        assertEquals(1, dest.size())
+    }
+
+    @Test fun forEach() {
+        val array = SparseLongArray()
+        array.forEach { _, _ -> fail() }
+
+        array.put(1, 11L)
+        array.put(2, 22L)
+        array.put(6, 66L)
+
+        val keys = mutableListOf<Int>()
+        val values = mutableListOf<Long>()
+        array.forEach { key, value ->
+            keys.add(key)
+            values.add(value)
+        }
+        assertThat(keys).containsExactly(1, 2, 6)
+        assertThat(values).containsExactly(11L, 22L, 66L)
+    }
+
+    @Test fun keyIterator() {
+        val array = SparseLongArray()
+        assertFalse(array.keyIterator().hasNext())
+
+        array.put(1, 11L)
+        array.put(2, 22L)
+        array.put(6, 66L)
+
+        val iterator = array.keyIterator()
+        assertTrue(iterator.hasNext())
+        assertEquals(1, iterator.nextInt())
+        assertTrue(iterator.hasNext())
+        assertEquals(2, iterator.nextInt())
+        assertTrue(iterator.hasNext())
+        assertEquals(6, iterator.nextInt())
+        assertFalse(iterator.hasNext())
+    }
+
+    @Test fun valueIterator() {
+        val array = SparseLongArray()
+        assertFalse(array.valueIterator().hasNext())
+
+        array.put(1, 11L)
+        array.put(2, 22L)
+        array.put(6, 66L)
+
+        val iterator = array.valueIterator()
+        assertTrue(iterator.hasNext())
+        assertEquals(11, iterator.nextLong())
+        assertTrue(iterator.hasNext())
+        assertEquals(22, iterator.nextLong())
+        assertTrue(iterator.hasNext())
+        assertEquals(66, iterator.nextLong())
+        assertFalse(iterator.hasNext())
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/view/AccessibilityAnnouncementCapturingView.kt b/core/ktx/src/androidTest/java/androidx/core/view/AccessibilityAnnouncementCapturingView.kt
new file mode 100644
index 0000000..81996b8
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/view/AccessibilityAnnouncementCapturingView.kt
@@ -0,0 +1,14 @@
+package androidx.core.view
+
+import android.content.Context
+import android.view.View
+
+class AccessibilityAnnouncementCapturingView(context: Context?) : View(context) {
+
+    var announcement: CharSequence? = null
+
+    override fun announceForAccessibility(text: CharSequence?) {
+        super.announceForAccessibility(text)
+        announcement = text
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/view/MenuTest.kt b/core/ktx/src/androidTest/java/androidx/core/view/MenuTest.kt
new file mode 100644
index 0000000..18e1b56
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/view/MenuTest.kt
@@ -0,0 +1,135 @@
+/*
+ * 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.core.view
+
+import android.support.test.InstrumentationRegistry
+import android.view.Menu.NONE
+import android.view.MenuItem
+import android.widget.Toolbar
+import androidx.testutils.assertThrows
+import androidx.testutils.fail
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertSame
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class MenuTest {
+    private val menu = Toolbar(InstrumentationRegistry.getContext()).menu
+
+    @Test fun get() {
+        val item = menu.add("")
+        assertSame(item, menu[0])
+    }
+
+    @Test fun contains() {
+        val item1 = menu.add("")
+        assertTrue(item1 in menu)
+
+        val item2 = menu.add("")
+        assertTrue(item2 in menu)
+    }
+
+    @Test fun size() {
+        assertEquals(0, menu.size)
+
+        menu.add("")
+        assertEquals(1, menu.size)
+
+        menu.add(NONE, 123, NONE, "")
+        assertEquals(2, menu.size)
+
+        menu.removeItem(123)
+        assertEquals(1, menu.size)
+    }
+
+    @Test fun isEmpty() {
+        assertTrue(menu.isEmpty())
+        menu.add("")
+        assertFalse(menu.isEmpty())
+    }
+
+    @Test fun isNotEmpty() {
+        assertFalse(menu.isNotEmpty())
+        menu.add("")
+        assertTrue(menu.isNotEmpty())
+    }
+
+    @Test fun forEach() {
+        menu.forEach {
+            fail("Empty menu should not invoke lambda")
+        }
+
+        val item1 = menu.add("")
+        val item2 = menu.add("")
+
+        val items = mutableListOf<MenuItem>()
+        menu.forEach {
+            items += it
+        }
+        assertThat(items).containsExactly(item1, item2)
+    }
+
+    @Test fun forEachIndexed() {
+        menu.forEachIndexed { _, _ ->
+            fail("Empty menu should not invoke lambda")
+        }
+
+        val item1 = menu.add("")
+        val item2 = menu.add("")
+
+        val items = mutableListOf<MenuItem>()
+        menu.forEachIndexed { index, item ->
+            assertEquals(index, items.size)
+            items += item
+        }
+        assertThat(items).containsExactly(item1, item2)
+    }
+
+    @Test fun iterator() {
+        val item1 = menu.add("")
+        val item2 = menu.add("")
+
+        val iterator = menu.iterator()
+        assertTrue(iterator.hasNext())
+        assertSame(item1, iterator.next())
+        assertTrue(iterator.hasNext())
+        assertSame(item2, iterator.next())
+        assertFalse(iterator.hasNext())
+        assertThrows<IndexOutOfBoundsException> {
+            iterator.next()
+        }
+    }
+
+    @Test fun iteratorRemoving() {
+        val item1 = menu.add("")
+        val item2 = menu.add("")
+
+        val iterator = menu.iterator()
+
+        assertSame(item1, iterator.next())
+        iterator.remove()
+        assertFalse(item1 in menu)
+        assertEquals(1, menu.size())
+
+        assertSame(item2, iterator.next())
+        iterator.remove()
+        assertFalse(item2 in menu)
+        assertEquals(0, menu.size())
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/view/ViewGroupTest.kt b/core/ktx/src/androidTest/java/androidx/core/view/ViewGroupTest.kt
new file mode 100644
index 0000000..7ec791d
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/view/ViewGroupTest.kt
@@ -0,0 +1,264 @@
+/*
+ * 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.core.view
+
+import android.support.test.InstrumentationRegistry
+import android.support.test.filters.SdkSuppress
+import android.view.View
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import androidx.testutils.assertThrows
+import androidx.testutils.fail
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertSame
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class ViewGroupTest {
+    private val context = InstrumentationRegistry.getContext()
+    private val viewGroup = LinearLayout(context)
+
+    @Test fun get() {
+        val view1 = View(context)
+        viewGroup.addView(view1)
+        val view2 = View(context)
+        viewGroup.addView(view2)
+
+        assertSame(view1, viewGroup[0])
+        assertSame(view2, viewGroup[1])
+
+        assertThrows<IndexOutOfBoundsException> {
+            viewGroup[-1]
+        }.hasMessageThat().isEqualTo("Index: -1, Size: 2")
+
+        assertThrows<IndexOutOfBoundsException> {
+            viewGroup[2]
+        }.hasMessageThat().isEqualTo("Index: 2, Size: 2")
+    }
+
+    @Test fun contains() {
+        val view1 = View(context)
+        viewGroup.addView(view1)
+        assertTrue(view1 in viewGroup)
+        assertFalse(view1 !in viewGroup)
+
+        val view2 = View(context)
+        assertFalse(view2 in viewGroup)
+        assertTrue(view2 !in viewGroup)
+    }
+
+    @Test fun plusAssign() {
+        assertEquals(0, viewGroup.childCount)
+
+        val view1 = View(context)
+        viewGroup += view1
+        assertEquals(1, viewGroup.childCount)
+        assertSame(view1, viewGroup.getChildAt(0))
+
+        val view2 = View(context)
+        viewGroup += view2
+        assertEquals(2, viewGroup.childCount)
+        assertSame(view2, viewGroup.getChildAt(1))
+    }
+
+    @Test fun minusAssign() {
+        val view1 = View(context)
+        viewGroup.addView(view1)
+        val view2 = View(context)
+        viewGroup.addView(view2)
+
+        assertEquals(2, viewGroup.childCount)
+
+        viewGroup -= view2
+        assertEquals(1, viewGroup.childCount)
+        assertSame(view1, viewGroup.getChildAt(0))
+
+        viewGroup -= view1
+        assertEquals(0, viewGroup.childCount)
+    }
+
+    @Test fun size() {
+        assertEquals(0, viewGroup.size)
+
+        viewGroup.addView(View(context))
+        assertEquals(1, viewGroup.size)
+
+        viewGroup.addView(View(context))
+        assertEquals(2, viewGroup.size)
+
+        viewGroup.removeViewAt(0)
+        assertEquals(1, viewGroup.size)
+    }
+
+    @Test fun isEmpty() {
+        assertTrue(viewGroup.isEmpty())
+        viewGroup.addView(View(context))
+        assertFalse(viewGroup.isEmpty())
+    }
+
+    @Test fun isNotEmpty() {
+        assertFalse(viewGroup.isNotEmpty())
+        viewGroup.addView(View(context))
+        assertTrue(viewGroup.isNotEmpty())
+    }
+
+    @Test fun forEach() {
+        viewGroup.forEach {
+            fail("Empty view group should not invoke lambda")
+        }
+
+        val view1 = View(context)
+        viewGroup.addView(view1)
+        val view2 = View(context)
+        viewGroup.addView(view2)
+
+        val views = mutableListOf<View>()
+        viewGroup.forEach {
+            views += it
+        }
+        assertThat(views).containsExactly(view1, view2)
+    }
+
+    @Test fun forEachIndexed() {
+        viewGroup.forEachIndexed { _, _ ->
+            fail("Empty view group should not invoke lambda")
+        }
+
+        val view1 = View(context)
+        viewGroup.addView(view1)
+        val view2 = View(context)
+        viewGroup.addView(view2)
+
+        val views = mutableListOf<View>()
+        viewGroup.forEachIndexed { index, view ->
+            assertEquals(index, views.size)
+            views += view
+        }
+        assertThat(views).containsExactly(view1, view2)
+    }
+
+    @Test fun iterator() {
+        val view1 = View(context)
+        viewGroup.addView(view1)
+        val view2 = View(context)
+        viewGroup.addView(view2)
+
+        val iterator = viewGroup.iterator()
+        assertTrue(iterator.hasNext())
+        assertSame(view1, iterator.next())
+        assertTrue(iterator.hasNext())
+        assertSame(view2, iterator.next())
+        assertFalse(iterator.hasNext())
+        assertThrows<IndexOutOfBoundsException> {
+            iterator.next()
+        }
+    }
+
+    @Test fun iteratorRemoving() {
+        val view1 = View(context)
+        viewGroup.addView(view1)
+        val view2 = View(context)
+        viewGroup.addView(view2)
+
+        val iterator = viewGroup.iterator()
+
+        assertSame(view1, iterator.next())
+        iterator.remove()
+        assertFalse(view1 in viewGroup)
+        assertEquals(1, viewGroup.childCount)
+
+        assertSame(view2, iterator.next())
+        iterator.remove()
+        assertFalse(view2 in viewGroup)
+        assertEquals(0, viewGroup.childCount)
+    }
+
+    @Test fun iteratorForEach() {
+        val views = listOf(View(context), View(context))
+        views.forEach(viewGroup::addView)
+
+        var index = 0
+        for (view in viewGroup) {
+            assertSame(views[index++], view)
+        }
+    }
+
+    @Test fun children() {
+        val views = listOf(View(context), View(context), View(context))
+        views.forEach { viewGroup.addView(it) }
+
+        viewGroup.children.forEachIndexed { index, child ->
+            assertSame(views[index], child)
+        }
+    }
+
+    @Test fun setMargins() {
+        val layoutParams = ViewGroup.MarginLayoutParams(100, 200)
+        layoutParams.setMargins(42)
+        assertEquals(42, layoutParams.leftMargin)
+        assertEquals(42, layoutParams.topMargin)
+        assertEquals(42, layoutParams.rightMargin)
+        assertEquals(42, layoutParams.bottomMargin)
+    }
+
+    @Test fun updateMargins() {
+        val layoutParams = ViewGroup.MarginLayoutParams(100, 200)
+        layoutParams.updateMargins(top = 10, right = 20)
+        assertEquals(0, layoutParams.leftMargin)
+        assertEquals(10, layoutParams.topMargin)
+        assertEquals(20, layoutParams.rightMargin)
+        assertEquals(0, layoutParams.bottomMargin)
+    }
+
+    @Test fun updateMarginsNoOp() {
+        val layoutParams = ViewGroup.MarginLayoutParams(100, 200)
+        layoutParams.setMargins(10, 20, 30, 40)
+        layoutParams.updateMargins()
+        assertEquals(10, layoutParams.leftMargin)
+        assertEquals(20, layoutParams.topMargin)
+        assertEquals(30, layoutParams.rightMargin)
+        assertEquals(40, layoutParams.bottomMargin)
+    }
+
+    @SdkSuppress(minSdkVersion = 17)
+    @Test fun updateMarginsRelative() {
+        val layoutParams = ViewGroup.MarginLayoutParams(100, 200)
+        layoutParams.updateMarginsRelative(start = 10, end = 20)
+        assertEquals(0, layoutParams.leftMargin)
+        assertEquals(0, layoutParams.topMargin)
+        assertEquals(0, layoutParams.rightMargin)
+        assertEquals(0, layoutParams.bottomMargin)
+        assertEquals(10, layoutParams.marginStart)
+        assertEquals(20, layoutParams.marginEnd)
+        assertTrue(layoutParams.isMarginRelative)
+    }
+
+    @SdkSuppress(minSdkVersion = 17)
+    @Test fun updateMarginsRelativeNoOp() {
+        val layoutParams = ViewGroup.MarginLayoutParams(100, 200)
+        layoutParams.setMargins(10, 20, 30, 40)
+        layoutParams.updateMarginsRelative()
+        assertEquals(10, layoutParams.leftMargin)
+        assertEquals(20, layoutParams.topMargin)
+        assertEquals(30, layoutParams.rightMargin)
+        assertEquals(40, layoutParams.bottomMargin)
+        assertEquals(10, layoutParams.marginStart)
+        assertEquals(30, layoutParams.marginEnd)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/view/ViewTest.kt b/core/ktx/src/androidTest/java/androidx/core/view/ViewTest.kt
new file mode 100644
index 0000000..0b7cfa2
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/view/ViewTest.kt
@@ -0,0 +1,248 @@
+/*
+ * 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.core.view
+
+import android.graphics.Bitmap
+import android.support.test.InstrumentationRegistry
+import android.view.View
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import android.widget.RelativeLayout
+import androidx.core.ktx.test.R
+import androidx.testutils.assertThrows
+import androidx.testutils.fail
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertSame
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class ViewTest {
+    private val context = InstrumentationRegistry.getContext()
+    private val view = View(context)
+
+    @Test
+    fun doOnNextLayout() {
+        var calls = 0
+        view.doOnNextLayout {
+            calls++
+        }
+        view.layout(0, 0, 10, 10)
+        assertEquals(1, calls)
+
+        // Now layout again and make sure that the listener was removed
+        view.layout(0, 0, 10, 10)
+        assertEquals(1, calls)
+    }
+
+    @Test
+    fun doOnLayoutBeforeLayout() {
+        var called = false
+        view.doOnLayout {
+            called = true
+        }
+        view.layout(0, 0, 10, 10)
+        assertTrue(called)
+    }
+
+    @Test
+    fun doOnLayoutAfterLayout() {
+        view.layout(0, 0, 10, 10)
+
+        var called = false
+        view.doOnLayout {
+            called = true
+        }
+        assertTrue(called)
+    }
+
+    @Test
+    fun doOnLayoutWhileLayoutRequested() {
+        // First layout the view
+        view.layout(0, 0, 10, 10)
+        // Then later a layout is requested
+        view.requestLayout()
+
+        var called = false
+        view.doOnLayout {
+            called = true
+        }
+
+        // Assert that we haven't been called while the layout pass is pending
+        assertFalse(called)
+
+        // Now layout the view and assert that we're called
+        view.layout(0, 0, 20, 20)
+        assertTrue(called)
+    }
+
+    @Test
+    fun doOnPreDraw() {
+        var calls = 0
+        view.doOnPreDraw {
+            calls++
+        }
+        view.viewTreeObserver.dispatchOnPreDraw()
+        assertEquals(1, calls)
+
+        // Now dispatch again to make sure that the listener was removed
+        view.viewTreeObserver.dispatchOnPreDraw()
+        assertEquals(1, calls)
+    }
+
+    @Test
+    fun setPadding() {
+        view.setPadding(42)
+        assertEquals(42, view.paddingLeft)
+        assertEquals(42, view.paddingTop)
+        assertEquals(42, view.paddingRight)
+        assertEquals(42, view.paddingBottom)
+    }
+
+    @Test
+    fun updatePadding() {
+        view.updatePadding(top = 10, right = 20)
+        assertEquals(0, view.paddingLeft)
+        assertEquals(10, view.paddingTop)
+        assertEquals(20, view.paddingRight)
+        assertEquals(0, view.paddingBottom)
+    }
+
+    @Test
+    fun updatePaddingNoOp() {
+        view.setPadding(10, 20, 30, 40)
+        view.updatePadding()
+        assertEquals(10, view.paddingLeft)
+        assertEquals(20, view.paddingTop)
+        assertEquals(30, view.paddingRight)
+        assertEquals(40, view.paddingBottom)
+    }
+
+    @Test
+    fun updatePaddingRelative() {
+        view.updatePaddingRelative(start = 10, end = 20)
+        assertEquals(10, view.paddingStart)
+        assertEquals(0, view.paddingTop)
+        assertEquals(20, view.paddingEnd)
+        assertEquals(0, view.paddingBottom)
+    }
+
+    @Test
+    fun updatePaddingRelativeNoOp() {
+        view.setPaddingRelative(10, 20, 30, 40)
+        view.updatePaddingRelative()
+        assertEquals(10, view.paddingStart)
+        assertEquals(20, view.paddingTop)
+        assertEquals(30, view.paddingEnd)
+        assertEquals(40, view.paddingBottom)
+    }
+
+    @Test
+    fun toBitmapBeforeLayout() {
+        assertThrows<IllegalStateException> {
+            view.toBitmap()
+        }
+    }
+
+    @Test
+    fun toBitmap() {
+        view.layout(0, 0, 100, 100)
+        val bitmap = view.toBitmap()
+
+        assertEquals(100, bitmap.width)
+        assertEquals(100, bitmap.height)
+    }
+
+    @Test
+    fun toBitmapCustomConfig() {
+        view.layout(0, 0, 100, 100)
+        val bitmap = view.toBitmap(Bitmap.Config.RGB_565)
+
+        assertSame(Bitmap.Config.RGB_565, bitmap.config)
+    }
+
+    @Test fun isVisible() {
+        view.isVisible = true
+        assertTrue(view.isVisible)
+        assertEquals(View.VISIBLE, view.visibility)
+
+        view.isVisible = false
+        assertFalse(view.isVisible)
+        assertEquals(View.GONE, view.visibility)
+    }
+
+    @Test fun isInvisible() {
+        view.isInvisible = true
+        assertTrue(view.isInvisible)
+        assertEquals(View.INVISIBLE, view.visibility)
+
+        view.isInvisible = false
+        assertFalse(view.isInvisible)
+        assertEquals(View.VISIBLE, view.visibility)
+    }
+
+    @Test fun isGone() {
+        view.isGone = true
+        assertTrue(view.isGone)
+        assertEquals(View.GONE, view.visibility)
+
+        view.isGone = false
+        assertFalse(view.isGone)
+        assertEquals(View.VISIBLE, view.visibility)
+    }
+
+    @Test fun updateLayoutParams() {
+        view.layoutParams = ViewGroup.LayoutParams(0, 0)
+        view.updateLayoutParams {
+            assertSame(view.layoutParams, this)
+
+            width = 500
+            height = 1000
+        }
+
+        assertEquals(500, view.layoutParams.width)
+        assertEquals(1000, view.layoutParams.height)
+    }
+
+    @Test fun updateLayoutParamsAsType() {
+        view.layoutParams = LinearLayout.LayoutParams(0, 0)
+        view.updateLayoutParams<LinearLayout.LayoutParams> {
+            assertSame(view.layoutParams, this)
+
+            weight = 2f
+        }
+
+        assertEquals(2f, (view.layoutParams as LinearLayout.LayoutParams).weight)
+    }
+
+    @Test fun updateLayoutParamsWrongType() {
+        assertThrows<ClassCastException> {
+            view.updateLayoutParams<RelativeLayout.LayoutParams> {
+                fail()
+            }
+        }
+    }
+
+    @Test fun announceForAccessibility() {
+        val testView = AccessibilityAnnouncementCapturingView(context)
+
+        testView.announceForAccessibility(R.string.text)
+
+        val resolvedText = context.getText(R.string.text)
+        assertEquals(testView.announcement, resolvedText)
+    }
+}
diff --git a/core/ktx/src/androidTest/java/androidx/core/widget/ToastTest.kt b/core/ktx/src/androidTest/java/androidx/core/widget/ToastTest.kt
new file mode 100644
index 0000000..f8e9931
--- /dev/null
+++ b/core/ktx/src/androidTest/java/androidx/core/widget/ToastTest.kt
@@ -0,0 +1,80 @@
+/*
+ * 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.core.widget
+
+import android.support.test.InstrumentationRegistry
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import android.widget.Toast
+import androidx.core.ktx.test.R
+import androidx.core.view.forEach
+import androidx.core.view.isVisible
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class ToastTest {
+    private val context = InstrumentationRegistry.getContext()
+    private val instrumentation = InstrumentationRegistry.getInstrumentation()
+
+    @Test
+    fun createToastWithTextShort() = instrumentation.runOnMainSync {
+        val toast = context.toast("Short Toast")
+        assertEquals(Toast.LENGTH_SHORT, toast.duration)
+        assertTrue(containsText(toast.view, "Short Toast"))
+        assertTrue(toast.view.isVisible)
+    }
+
+    @Test
+    fun createToastWithTextLong() = instrumentation.runOnMainSync {
+        val toast = context.toast("Long Toast", Toast.LENGTH_LONG)
+        assertEquals(Toast.LENGTH_LONG, toast.duration)
+        assertTrue(containsText(toast.view, "Long Toast"))
+        assertTrue(toast.view.isVisible)
+    }
+
+    @Test
+    fun createToastWithResIdShort() = instrumentation.runOnMainSync {
+        val toast = context.toast(R.string.text)
+        assertEquals(Toast.LENGTH_SHORT, toast.duration)
+        assertTrue(containsText(toast.view, context.getString(R.string.text)))
+        assertTrue(toast.view.isVisible)
+    }
+
+    @Test
+    fun createToastWithResIdLong() = instrumentation.runOnMainSync {
+        val toast = context.toast(R.string.text, Toast.LENGTH_LONG)
+        assertEquals(Toast.LENGTH_LONG, toast.duration)
+        assertTrue(containsText(toast.view, context.getString(R.string.text)))
+        assertTrue(toast.view.isVisible)
+    }
+
+    private fun containsText(view: View, text: String): Boolean {
+        if (view is TextView && view.text == text) {
+            return true
+        }
+        if (view is ViewGroup) {
+            view.forEach {
+                if (containsText(it, text)) {
+                    return true
+                }
+            }
+        }
+        return false
+    }
+}
diff --git a/core/ktx/src/androidTest/res/drawable/box.xml b/core/ktx/src/androidTest/res/drawable/box.xml
new file mode 100644
index 0000000..3915878
--- /dev/null
+++ b/core/ktx/src/androidTest/res/drawable/box.xml
@@ -0,0 +1,22 @@
+<?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.
+  -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <size android:height="10px" android:width="10px"/>
+    <solid android:color="#fff"/>
+</shape>
diff --git a/core/ktx/src/androidTest/res/font/inconsolata_regular.ttf b/core/ktx/src/androidTest/res/font/inconsolata_regular.ttf
new file mode 100644
index 0000000..fc981ce
--- /dev/null
+++ b/core/ktx/src/androidTest/res/font/inconsolata_regular.ttf
Binary files differ
diff --git a/core/ktx/src/androidTest/res/layout/test_activity.xml b/core/ktx/src/androidTest/res/layout/test_activity.xml
new file mode 100644
index 0000000..a477350
--- /dev/null
+++ b/core/ktx/src/androidTest/res/layout/test_activity.xml
@@ -0,0 +1,29 @@
+<?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"
+              android:id="@+id/root"
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+
+    <ImageView android:id="@+id/image_view"
+               android:layout_width="wrap_content"
+               android:layout_height="wrap_content"
+               android:src="@android:drawable/ic_media_play"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/core/ktx/src/androidTest/res/layout/test_attrs.xml b/core/ktx/src/androidTest/res/layout/test_attrs.xml
new file mode 100644
index 0000000..d5975c5
--- /dev/null
+++ b/core/ktx/src/androidTest/res/layout/test_attrs.xml
@@ -0,0 +1,25 @@
+<?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.
+  -->
+
+<LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/root"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:sample="42" />
diff --git a/core/ktx/src/androidTest/res/layout/typed_array.xml b/core/ktx/src/androidTest/res/layout/typed_array.xml
new file mode 100644
index 0000000..e485ffd
--- /dev/null
+++ b/core/ktx/src/androidTest/res/layout/typed_array.xml
@@ -0,0 +1,31 @@
+<?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.
+  -->
+
+<View 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"
+      app:boolean_present="true"
+      app:color_present="#fff"
+      app:dimension_present="1px"
+      app:drawable_present="@drawable/box"
+      app:string_present="Hello"
+      app:float_present="0.1"
+      app:integer_present="1"
+      app:resource_present="@font/inconsolata_regular"
+      app:font_present="@font/inconsolata_regular"
+      app:text_array_present="@array/text_array"
+/>
diff --git a/core/ktx/src/androidTest/res/values/attrs.xml b/core/ktx/src/androidTest/res/values/attrs.xml
new file mode 100644
index 0000000..e3f9723
--- /dev/null
+++ b/core/ktx/src/androidTest/res/values/attrs.xml
@@ -0,0 +1,22 @@
+<?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>
+    <declare-styleable name="SampleAttrs">
+        <attr name="sample" format="integer" />
+    </declare-styleable>
+</resources>
diff --git a/core/ktx/src/androidTest/res/values/strings.xml b/core/ktx/src/androidTest/res/values/strings.xml
new file mode 100644
index 0000000..20877e9
--- /dev/null
+++ b/core/ktx/src/androidTest/res/values/strings.xml
@@ -0,0 +1,24 @@
+<?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>
+    <string name="text">Hello World</string>
+    <string-array name="text_array">
+        <item>Hello</item>
+        <item>World</item>
+    </string-array>
+</resources>
diff --git a/core/ktx/src/androidTest/res/values/styles.xml b/core/ktx/src/androidTest/res/values/styles.xml
new file mode 100644
index 0000000..ea35e47
--- /dev/null
+++ b/core/ktx/src/androidTest/res/values/styles.xml
@@ -0,0 +1,50 @@
+<?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>
+    <declare-styleable name="TypedArrayTypes">
+        <attr name="boolean_present" format="boolean"/>
+        <attr name="boolean_absent" format="boolean"/>
+
+        <attr name="color_present" format="color"/>
+        <attr name="color_absent" format="color"/>
+
+        <attr name="dimension_present" format="dimension"/>
+        <attr name="dimension_absent" format="dimension"/>
+
+        <attr name="drawable_present" format="reference"/>
+        <attr name="drawable_absent" format="reference"/>
+
+        <attr name="float_present" format="float"/>
+        <attr name="float_absent" format="float"/>
+
+        <attr name="font_present" format="reference"/>
+        <attr name="font_absent" format="reference"/>
+
+        <attr name="integer_present" format="integer"/>
+        <attr name="integer_absent" format="integer"/>
+
+        <attr name="resource_present" format="reference"/>
+        <attr name="resource_absent" format="reference"/>
+
+        <attr name="string_present" format="string"/>
+        <attr name="string_absent" format="string"/>
+
+        <attr name="text_array_present" format="reference"/>
+        <attr name="text_array_absent" format="reference"/>
+    </declare-styleable>
+</resources>
diff --git a/core/ktx/src/androidTest/res/xml/preferences.xml b/core/ktx/src/androidTest/res/xml/preferences.xml
new file mode 100644
index 0000000..33629e1
--- /dev/null
+++ b/core/ktx/src/androidTest/res/xml/preferences.xml
@@ -0,0 +1,18 @@
+<?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.
+  -->
+
+<PreferenceScreen/>
\ No newline at end of file
diff --git a/core/ktx/src/main/AndroidManifest.xml b/core/ktx/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..7f93e5e
--- /dev/null
+++ b/core/ktx/src/main/AndroidManifest.xml
@@ -0,0 +1 @@
+<manifest package="androidx.core.ktx"/>
diff --git a/core/ktx/src/main/java/androidx/core/animation/Animator.kt b/core/ktx/src/main/java/androidx/core/animation/Animator.kt
new file mode 100644
index 0000000..1438bcd
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/animation/Animator.kt
@@ -0,0 +1,119 @@
+/*
+ * 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.core.animation
+
+import android.animation.Animator
+import androidx.annotation.RequiresApi
+
+/**
+ * Add an action which will be invoked when the animation has ended.
+ *
+ * @return the [Animator.AnimatorListener] added to the Animator
+ * @see Animator.end
+ */
+fun Animator.doOnEnd(action: (animator: Animator) -> Unit) = addListener(onEnd = action)
+
+/**
+ * Add an action which will be invoked when the animation has started.
+ *
+ * @return the [Animator.AnimatorListener] added to the Animator
+ * @see Animator.start
+ */
+fun Animator.doOnStart(action: (animator: Animator) -> Unit) = addListener(onStart = action)
+
+/**
+ * Add an action which will be invoked when the animation has been cancelled.
+ *
+ * @return the [Animator.AnimatorListener] added to the Animator
+ * @see Animator.cancel
+ */
+fun Animator.doOnCancel(action: (animator: Animator) -> Unit) = addListener(onCancel = action)
+
+/**
+ * Add an action which will be invoked when the animation has repeated.
+ * @return the [Animator.AnimatorListener] added to the Animator
+ */
+fun Animator.doOnRepeat(action: (animator: Animator) -> Unit) = addListener(onRepeat = action)
+
+/**
+ * Add an action which will be invoked when the animation has resumed after a pause.
+ *
+ * @return the [Animator.AnimatorPauseListener] added to the Animator
+ * @see Animator.resume
+ */
+@RequiresApi(19)
+fun Animator.doOnResume(action: (animator: Animator) -> Unit) = addPauseListener(onResume = action)
+
+/**
+ * Add an action which will be invoked when the animation has been paused.
+ *
+ * @return the [Animator.AnimatorPauseListener] added to the Animator
+ * @see Animator.pause
+ */
+@RequiresApi(19)
+fun Animator.doOnPause(action: (animator: Animator) -> Unit) = addPauseListener(onPause = action)
+
+/**
+ * Add a listener to this Animator using the provided actions.
+ */
+fun Animator.addListener(
+    onEnd: ((animator: Animator) -> Unit)? = null,
+    onStart: ((animator: Animator) -> Unit)? = null,
+    onCancel: ((animator: Animator) -> Unit)? = null,
+    onRepeat: ((animator: Animator) -> Unit)? = null
+): Animator.AnimatorListener {
+    val listener = object : Animator.AnimatorListener {
+        override fun onAnimationRepeat(animator: Animator) {
+            onRepeat?.invoke(animator)
+        }
+
+        override fun onAnimationEnd(animator: Animator) {
+            onEnd?.invoke(animator)
+        }
+
+        override fun onAnimationCancel(animator: Animator) {
+            onCancel?.invoke(animator)
+        }
+
+        override fun onAnimationStart(animator: Animator) {
+            onStart?.invoke(animator)
+        }
+    }
+    addListener(listener)
+    return listener
+}
+
+/**
+ * Add a pause and resume listener to this Animator using the provided actions.
+ */
+@RequiresApi(19)
+fun Animator.addPauseListener(
+    onResume: ((animator: Animator) -> Unit)? = null,
+    onPause: ((animator: Animator) -> Unit)? = null
+): Animator.AnimatorPauseListener {
+    val listener = object : Animator.AnimatorPauseListener {
+        override fun onAnimationPause(animator: Animator) {
+            onPause?.invoke(animator)
+        }
+
+        override fun onAnimationResume(animator: Animator) {
+            onResume?.invoke(animator)
+        }
+    }
+    addPauseListener(listener)
+    return listener
+}
diff --git a/core/ktx/src/main/java/androidx/core/content/ContentValues.kt b/core/ktx/src/main/java/androidx/core/content/ContentValues.kt
new file mode 100644
index 0000000..e1a0d01
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/content/ContentValues.kt
@@ -0,0 +1,45 @@
+/*
+ * 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.core.content
+
+import android.content.ContentValues
+
+/**
+ * Returns a new [ContentValues] with the given key/value pairs as elements.
+ *
+ * @throws IllegalArgumentException When a value is not a supported type of [ContentValues].
+ */
+fun contentValuesOf(vararg pairs: Pair<String, Any?>) = ContentValues(pairs.size).apply {
+    for ((key, value) in pairs) {
+        when (value) {
+            null -> putNull(key)
+            is String -> put(key, value)
+            is Int -> put(key, value)
+            is Long -> put(key, value)
+            is Boolean -> put(key, value)
+            is Float -> put(key, value)
+            is Double -> put(key, value)
+            is ByteArray -> put(key, value)
+            is Byte -> put(key, value)
+            is Short -> put(key, value)
+            else -> {
+                val valueType = value.javaClass.canonicalName
+                throw IllegalArgumentException("Illegal value type $valueType for key \"$key\"")
+            }
+        }
+    }
+}
diff --git a/core/ktx/src/main/java/androidx/core/content/Context.kt b/core/ktx/src/main/java/androidx/core/content/Context.kt
new file mode 100644
index 0000000..2ffb17b
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/content/Context.kt
@@ -0,0 +1,93 @@
+/*
+ * 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.core.content
+
+import android.content.Context
+import android.content.res.TypedArray
+import android.util.AttributeSet
+import androidx.annotation.AttrRes
+import androidx.annotation.RequiresApi
+import androidx.annotation.StyleRes
+
+/**
+ * Return the handle to a system-level service by class.
+ *
+ * The return type of this function intentionally uses a
+ * [platform type](https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types)
+ * to allow callers to decide whether they require a service be present or can tolerate its absence.
+ *
+ * @see Context.getSystemService(Class)
+ */
+@RequiresApi(23)
+@Suppress("HasPlatformType") // Intentionally propagating platform type with unknown nullability.
+inline fun <reified T> Context.systemService() = getSystemService(T::class.java)
+
+/**
+ * Executes [block] on a [TypedArray] receiver. The [TypedArray] holds the attribute
+ * values in [set] that are listed in [attrs]. In addition, if the given [AttributeSet]
+ * specifies a style class (through the `style` attribute), that style will be applied
+ * on top of the base attributes it defines.
+ *
+ * @param set The base set of attribute values.
+ * @param attrs The desired attributes to be retrieved. These attribute IDs must be
+ *              sorted in ascending order.
+ * @param defStyleAttr An attribute in the current theme that contains a reference to
+ *                     a style resource that supplies defaults values for the [TypedArray].
+ *                     Can be 0 to not look for defaults.
+ * @param defStyleRes A resource identifier of a style resource that supplies default values
+ *                    for the [TypedArray], used only if [defStyleAttr] is 0 or can not be found
+ *                     in the theme. Can be 0 to not look for defaults.
+ *
+ * @see Context.obtainStyledAttributes
+ * @see android.content.res.Resources.Theme.obtainStyledAttributes
+ */
+inline fun Context.withStyledAttributes(
+    set: AttributeSet? = null,
+    attrs: IntArray,
+    @AttrRes defStyleAttr: Int = 0,
+    @StyleRes defStyleRes: Int = 0,
+    block: TypedArray.() -> Unit
+) {
+    val typedArray = obtainStyledAttributes(set, attrs, defStyleAttr, defStyleRes)
+    try {
+        typedArray.block()
+    } finally {
+        typedArray.recycle()
+    }
+}
+
+/**
+ * Executes [block] on a [TypedArray] receiver. The [TypedArray] holds the the values
+ * defined by the style resource [resourceId] which are listed in [attrs].
+ *
+ * @param attrs The desired attributes. These attribute IDs must be sorted in ascending order.
+ *
+ * @see Context.obtainStyledAttributes
+ * @see android.content.res.Resources.Theme.obtainStyledAttributes
+ */
+inline fun Context.withStyledAttributes(
+    @StyleRes resourceId: Int,
+    attrs: IntArray,
+    block: TypedArray.() -> Unit
+) {
+    val typedArray = obtainStyledAttributes(resourceId, attrs)
+    try {
+        typedArray.block()
+    } finally {
+        typedArray.recycle()
+    }
+}
diff --git a/core/ktx/src/main/java/androidx/core/content/SharedPreferences.kt b/core/ktx/src/main/java/androidx/core/content/SharedPreferences.kt
new file mode 100644
index 0000000..c4677ea
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/content/SharedPreferences.kt
@@ -0,0 +1,50 @@
+/*
+ * 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.core.content
+
+import android.annotation.SuppressLint
+import android.content.SharedPreferences
+
+/**
+ * Allows editing of this preference instance with a call to [apply][SharedPreferences.Editor.apply]
+ * or [commit][SharedPreferences.Editor.commit] to persist the changes.
+ * Default behaviour is [apply][SharedPreferences.Editor.apply].
+ * ```
+ * prefs.edit {
+ *     putString("key", value)
+ * }
+ * ```
+ * To [commit][SharedPreferences.Editor.commit] changes:
+ * ```
+ * prefs.edit(commit = true) {
+ *     putString("key", value)
+ * }
+ * ```
+ */
+@SuppressLint("ApplySharedPref")
+inline fun SharedPreferences.edit(
+    commit: Boolean = false,
+    action: SharedPreferences.Editor.() -> Unit
+) {
+    val editor = edit()
+    action(editor)
+    if (commit) {
+        editor.commit()
+    } else {
+        editor.apply()
+    }
+}
diff --git a/core/ktx/src/main/java/androidx/core/content/res/TypedArray.kt b/core/ktx/src/main/java/androidx/core/content/res/TypedArray.kt
new file mode 100644
index 0000000..a4f6fef
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/content/res/TypedArray.kt
@@ -0,0 +1,235 @@
+/*
+ * 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.core.content.res
+
+import android.content.res.ColorStateList
+import android.content.res.TypedArray
+import android.graphics.Typeface
+import android.graphics.drawable.Drawable
+import androidx.annotation.AnyRes
+import androidx.annotation.ColorInt
+import androidx.annotation.Dimension
+import androidx.annotation.RequiresApi
+import androidx.annotation.StyleableRes
+
+private fun TypedArray.checkAttribute(@StyleableRes index: Int) {
+    if (!hasValue(index)) {
+        throw IllegalArgumentException("Attribute not defined in set.")
+    }
+}
+
+/**
+ * Retrieve the boolean value for the attribute at [index] or throws [IllegalArgumentException]
+ * if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getBoolean
+ */
+fun TypedArray.getBooleanOrThrow(@StyleableRes index: Int): Boolean {
+    checkAttribute(index)
+    return getBoolean(index, false)
+}
+
+/**
+ * Retrieve the color value for the attribute at [index] or throws [IllegalArgumentException]
+ * if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getColor
+ */
+@ColorInt
+fun TypedArray.getColorOrThrow(@StyleableRes index: Int): Int {
+    checkAttribute(index)
+    return getColor(index, 0)
+}
+
+/**
+ * Retrieve the color state list value for the attribute at [index] or throws
+ * [IllegalArgumentException] if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getColorStateList
+ */
+fun TypedArray.getColorStateListOrThrow(@StyleableRes index: Int): ColorStateList {
+    checkAttribute(index)
+    return checkNotNull(getColorStateList(index)) {
+        "Attribute value was not a color or color state list."
+    }
+}
+
+/**
+ * Retrieve the dimension value for the attribute at [index] or throws [IllegalArgumentException]
+ * if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getDimension
+ */
+fun TypedArray.getDimensionOrThrow(@StyleableRes index: Int): Float {
+    checkAttribute(index)
+    return getDimension(index, 0f)
+}
+
+/**
+ * Retrieve the dimension pixel offset value for the attribute at [index] or throws
+ * [IllegalArgumentException] if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getDimensionPixelOffset
+ */
+@Dimension
+fun TypedArray.getDimensionPixelOffsetOrThrow(@StyleableRes index: Int): Int {
+    checkAttribute(index)
+    return getDimensionPixelOffset(index, 0)
+}
+
+/**
+ * Retrieve the dimension pixel size value for the attribute at [index] or throws
+ * [IllegalArgumentException] if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getDimensionPixelSize
+ */
+@Dimension
+fun TypedArray.getDimensionPixelSizeOrThrow(@StyleableRes index: Int): Int {
+    checkAttribute(index)
+    return getDimensionPixelSize(index, 0)
+}
+
+/**
+ * Retrieve the drawable value for the attribute at [index] or throws [IllegalArgumentException]
+ * if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getDrawable
+ */
+fun TypedArray.getDrawableOrThrow(@StyleableRes index: Int): Drawable {
+    checkAttribute(index)
+    return getDrawable(index)
+}
+
+/**
+ * Retrieve the float value for the attribute at [index] or throws [IllegalArgumentException]
+ * if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getFloat
+ */
+fun TypedArray.getFloatOrThrow(@StyleableRes index: Int): Float {
+    checkAttribute(index)
+    return getFloat(index, 0f)
+}
+
+/**
+ * Retrieve the font value for the attribute at [index] or throws [IllegalArgumentException]
+ * if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getFont
+ */
+@RequiresApi(26)
+fun TypedArray.getFontOrThrow(@StyleableRes index: Int): Typeface {
+    checkAttribute(index)
+    return getFont(index)
+}
+
+/**
+ * Retrieve the integer value for the attribute at [index] or throws [IllegalArgumentException]
+ * if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getInt
+ */
+fun TypedArray.getIntOrThrow(@StyleableRes index: Int): Int {
+    checkAttribute(index)
+    return getInt(index, 0)
+}
+
+/**
+ * Retrieve the integer value for the attribute at [index] or throws [IllegalArgumentException]
+ * if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getInteger
+ */
+fun TypedArray.getIntegerOrThrow(@StyleableRes index: Int): Int {
+    checkAttribute(index)
+    return getInteger(index, 0)
+}
+
+/**
+ * Retrieves the resource identifier for the attribute at [index] or throws
+ * [IllegalArgumentException] if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getResourceId
+ */
+@AnyRes
+fun TypedArray.getResourceIdOrThrow(@StyleableRes index: Int): Int {
+    checkAttribute(index)
+    return getResourceId(index, 0)
+}
+
+/**
+ * Retrieve the string value for the attribute at [index] or throws [IllegalArgumentException]
+ * if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getString
+ */
+fun TypedArray.getStringOrThrow(@StyleableRes index: Int): String {
+    checkAttribute(index)
+    return checkNotNull(getString(index)) {
+        "Attribute value could not be coerced to String."
+    }
+}
+
+/**
+ * Retrieve the text value for the attribute at [index] or throws [IllegalArgumentException]
+ * if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getText
+ */
+fun TypedArray.getTextOrThrow(@StyleableRes index: Int): CharSequence {
+    checkAttribute(index)
+    return checkNotNull(getText(index)) {
+        "Attribute value could not be coerced to CharSequence."
+    }
+}
+
+/**
+ * Retrieve the text array value for the attribute at [index] or throws
+ * [IllegalArgumentException] if not defined.
+ *
+ * @see TypedArray.hasValue
+ * @see TypedArray.getTextArray
+ */
+fun TypedArray.getTextArrayOrThrow(@StyleableRes index: Int): Array<CharSequence> {
+    checkAttribute(index)
+    return getTextArray(index)
+}
+
+/**
+ * Executes the given [block] function on this TypedArray and then recycles it.
+ *
+ * @see kotlin.io.use
+ */
+inline fun <R> TypedArray.use(block: (TypedArray) -> R): R {
+    return block(this).also {
+        recycle()
+    }
+}
diff --git a/core/ktx/src/main/java/androidx/core/database/Cursor.kt b/core/ktx/src/main/java/androidx/core/database/Cursor.kt
new file mode 100644
index 0000000..b63e719
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/database/Cursor.kt
@@ -0,0 +1,269 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to other public API.
+
+package androidx.core.database
+
+import android.database.Cursor
+
+/**
+ * Returns the value of the requested column as a byte array.
+ *
+ * The result and whether this method throws an exception when the column value is null or the
+ * column type is not a blob type is implementation-defined.
+ *
+ * @see Cursor.getColumnIndexOrThrow
+ * @see Cursor.getBlob
+ */
+inline fun Cursor.getBlob(columnName: String): ByteArray =
+    getBlob(getColumnIndexOrThrow(columnName))
+
+/**
+ * Returns the value of the requested column as a double.
+ *
+ * The result and whether this method throws an exception when the column value is null or the
+ * column type is not a floating-point type is implementation-defined.
+ *
+ * @see Cursor.getColumnIndexOrThrow
+ * @see Cursor.getDouble
+ */
+inline fun Cursor.getDouble(columnName: String): Double =
+    getDouble(getColumnIndexOrThrow(columnName))
+
+/**
+ * Returns the value of the requested column as a float.
+ *
+ * The result and whether this method throws an exception when the column value is null or the
+ * column type is not a floating-point type is implementation-defined.
+ *
+ * @see Cursor.getColumnIndexOrThrow
+ * @see Cursor.getFloat
+ */
+inline fun Cursor.getFloat(columnName: String): Float = getFloat(getColumnIndexOrThrow(columnName))
+
+/**
+ * Returns the value of the requested column as an integer.
+ *
+ * The result and whether this method throws an exception when the column value is null or the
+ * column type is not an integral type is implementation-defined.
+ *
+ * @see Cursor.getColumnIndexOrThrow
+ * @see Cursor.getInt
+ */
+inline fun Cursor.getInt(columnName: String): Int = getInt(getColumnIndexOrThrow(columnName))
+
+/**
+ * Returns the value of the requested column as a long.
+ *
+ * The result and whether this method throws an exception when the column value is null or the
+ * column type is not an integral type is implementation-defined.
+ *
+ * @see Cursor.getColumnIndexOrThrow
+ * @see Cursor.getLong
+ */
+inline fun Cursor.getLong(columnName: String): Long = getLong(getColumnIndexOrThrow(columnName))
+
+/**
+ * Returns the value of the requested column as a short.
+ *
+ * The result and whether this method throws an exception when the column value is null or the
+ * column type is not an integral type is implementation-defined.
+ *
+ * @see Cursor.getColumnIndexOrThrow
+ * @see Cursor.getShort
+ */
+inline fun Cursor.getShort(columnName: String): Short = getShort(getColumnIndexOrThrow(columnName))
+
+/**
+ * Returns the value of the requested column as a string.
+ *
+ * The result and whether this method throws an exception when the column value is null or the
+ * column type is not a string type is implementation-defined.
+ *
+ * @see Cursor.getColumnIndexOrThrow
+ * @see Cursor.getString
+ */
+inline fun Cursor.getString(columnName: String): String =
+    getString(getColumnIndexOrThrow(columnName))
+
+/**
+ * Returns the value of the requested column as a nullable byte array.
+ *
+ * The result and whether this method throws an exception when the column type is not a blob type is
+ * implementation-defined.
+ *
+ * @see Cursor.isNull
+ * @see Cursor.getBlob
+ */
+inline fun Cursor.getBlobOrNull(index: Int) = if (isNull(index)) null else getBlob(index)
+
+/**
+ * Returns the value of the requested column as a nullable double.
+ *
+ * The result and whether this method throws an exception when the column type is not a
+ * floating-point type is implementation-defined.
+ *
+ * @see Cursor.isNull
+ * @see Cursor.getDouble
+ */
+inline fun Cursor.getDoubleOrNull(index: Int) = if (isNull(index)) null else getDouble(index)
+
+/**
+ * Returns the value of the requested column as a nullable float.
+ *
+ * The result and whether this method throws an exception when the column type is not a
+ * floating-point type is implementation-defined.
+ *
+ * @see Cursor.isNull
+ * @see Cursor.getFloat
+ */
+inline fun Cursor.getFloatOrNull(index: Int) = if (isNull(index)) null else getFloat(index)
+
+/**
+ * Returns the value of the requested column as a nullable integer.
+ *
+ * The result and whether this method throws an exception when the column type is not an integral
+ * type is implementation-defined.
+ *
+ * @see Cursor.isNull
+ * @see Cursor.getInt
+ */
+inline fun Cursor.getIntOrNull(index: Int) = if (isNull(index)) null else getInt(index)
+
+/**
+ * Returns the value of the requested column as a nullable long.
+ *
+ * The result and whether this method throws an exception when the column type is not an integral
+ * type is implementation-defined.
+ *
+ * @see Cursor.isNull
+ * @see Cursor.getLong
+ */
+inline fun Cursor.getLongOrNull(index: Int) = if (isNull(index)) null else getLong(index)
+
+/**
+ * Returns the value of the requested column as a nullable short.
+ *
+ * The result and whether this method throws an exception when the column type is not an integral
+ * type is implementation-defined.
+ *
+ * @see Cursor.isNull
+ * @see Cursor.getShort
+ */
+inline fun Cursor.getShortOrNull(index: Int) = if (isNull(index)) null else getShort(index)
+
+/**
+ * Returns the value of the requested column as a nullable string.
+ *
+ * The result and whether this method throws an exception when the column type is not a string type
+ * is implementation-defined.
+ *
+ * @see Cursor.isNull
+ * @see Cursor.getString
+ */
+inline fun Cursor.getStringOrNull(index: Int) = if (isNull(index)) null else getString(index)
+
+/**
+ * Returns the value of the requested column as a nullable byte array.
+ *
+ * The result and whether this method throws an exception when the column type is not a blob type is
+ * implementation-defined.
+ *
+ * @see Cursor.getColumnIndexOrThrow
+ * @see Cursor.isNull
+ * @see Cursor.getBlob
+ */
+inline fun Cursor.getBlobOrNull(columnName: String) =
+    getColumnIndexOrThrow(columnName).let { if (isNull(it)) null else getBlob(it) }
+
+/**
+ * Returns the value of the requested column as a nullable double.
+ *
+ * The result and whether this method throws an exception when the column type is not a
+ * floating-point type is implementation-defined.
+ *
+ * @see Cursor.getColumnIndexOrThrow
+ * @see Cursor.isNull
+ * @see Cursor.getDouble
+ */
+inline fun Cursor.getDoubleOrNull(columnName: String) =
+    getColumnIndexOrThrow(columnName).let { if (isNull(it)) null else getDouble(it) }
+
+/**
+ * Returns the value of the requested column as a nullable float.
+ *
+ * The result and whether this method throws an exception when the column type is not a
+ * floating-point type is implementation-defined.
+ *
+ * @see Cursor.getColumnIndexOrThrow
+ * @see Cursor.isNull
+ * @see Cursor.getFloat
+ */
+inline fun Cursor.getFloatOrNull(columnName: String) =
+    getColumnIndexOrThrow(columnName).let { if (isNull(it)) null else getFloat(it) }
+
+/**
+ * Returns the value of the requested column as a nullable integer.
+ *
+ * The result and whether this method throws an exception when the column type is not an integral
+ * type is implementation-defined.
+ *
+ * @see Cursor.getColumnIndexOrThrow
+ * @see Cursor.isNull
+ * @see Cursor.getInt
+ */
+inline fun Cursor.getIntOrNull(columnName: String) =
+    getColumnIndexOrThrow(columnName).let { if (isNull(it)) null else getInt(it) }
+
+/**
+ * Returns the value of the requested column as a nullable long.
+ *
+ * The result and whether this method throws an exception when the column type is not an integral
+ * type is implementation-defined.
+ *
+ * @see Cursor.getColumnIndexOrThrow
+ * @see Cursor.isNull
+ * @see Cursor.getLong
+ */
+inline fun Cursor.getLongOrNull(columnName: String) =
+    getColumnIndexOrThrow(columnName).let { if (isNull(it)) null else getLong(it) }
+
+/**
+ * Returns the value of the requested column as a nullable short.
+ *
+ * The result and whether this method throws an exception when the column type is not an integral
+ * type is implementation-defined.
+ *
+ * @see Cursor.getColumnIndexOrThrow
+ * @see Cursor.isNull
+ * @see Cursor.getShort
+ */
+inline fun Cursor.getShortOrNull(columnName: String) =
+    getColumnIndexOrThrow(columnName).let { if (isNull(it)) null else getShort(it) }
+
+/**
+ * Returns the value of the requested column as a nullable string.
+ *
+ * The result and whether this method throws an exception when the column type is not a string type
+ * is implementation-defined.
+ *
+ * @see Cursor.getColumnIndexOrThrow
+ * @see Cursor.isNull
+ * @see Cursor.getString
+ */
+inline fun Cursor.getStringOrNull(columnName: String) =
+    getColumnIndexOrThrow(columnName).let { if (isNull(it)) null else getString(it) }
diff --git a/core/ktx/src/main/java/androidx/core/database/sqlite/SQLiteDatabase.kt b/core/ktx/src/main/java/androidx/core/database/sqlite/SQLiteDatabase.kt
new file mode 100644
index 0000000..bdbd94e
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/database/sqlite/SQLiteDatabase.kt
@@ -0,0 +1,42 @@
+/*
+ * 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.core.database.sqlite
+
+import android.database.sqlite.SQLiteDatabase
+
+/**
+ * Run [body] in a transaction marking it as successful if it completes without exception.
+ *
+ * @param exclusive Run in `EXCLUSIVE` mode when true, `IMMEDIATE` mode otherwise.
+ */
+inline fun <T> SQLiteDatabase.transaction(
+    exclusive: Boolean = true,
+    body: SQLiteDatabase.() -> T
+): T {
+    if (exclusive) {
+        beginTransaction()
+    } else {
+        beginTransactionNonExclusive()
+    }
+    try {
+        val result = body()
+        setTransactionSuccessful()
+        return result
+    } finally {
+        endTransaction()
+    }
+}
diff --git a/core/ktx/src/main/java/androidx/core/graphics/Bitmap.kt b/core/ktx/src/main/java/androidx/core/graphics/Bitmap.kt
new file mode 100644
index 0000000..45ab6ba
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/Bitmap.kt
@@ -0,0 +1,113 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.core.graphics
+
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.ColorSpace
+import androidx.annotation.ColorInt
+import androidx.annotation.RequiresApi
+
+/**
+ * Creates a new [Canvas] to draw on this bitmap and executes the specified
+ * [block] on the newly created canvas. Example:
+ *
+ * ```
+ * return Bitmap.createBitmap(…).applyCanvas {
+ *    drawLine(…)
+ *    translate(…)
+ *    drawRect(…)
+ * }
+ * ```
+ */
+inline fun Bitmap.applyCanvas(block: Canvas.() -> Unit): Bitmap {
+    val c = Canvas(this)
+    c.block()
+    return this
+}
+
+/**
+ * Returns the value of the pixel at the specified location. The returned value
+ * is a [color int][android.graphics.Color] in the sRGB color space.
+ */
+inline operator fun Bitmap.get(x: Int, y: Int) = getPixel(x, y)
+
+/**
+ * Writes the specified [color int][android.graphics.Color] into the bitmap
+ * (assuming it is mutable) at the specified `(x, y)` coordinate. The specified
+ * color is converted from sRGB to the bitmap's color space if needed.
+ */
+inline operator fun Bitmap.set(x: Int, y: Int, @ColorInt color: Int) = setPixel(x, y, color)
+
+/**
+ * Creates a new bitmap, scaled from this bitmap, when possible. If the specified
+ * [width] and [height] are the same as the current width and height of this bitmap,
+ * this bitmap is returned and no new bitmap is created.
+ *
+ * @param width The new bitmap's desired width
+ * @param height The new bitmap's desired height
+ * @param filter `true` if the source should be filtered (`true` by default)
+ *
+ * @return The new scaled bitmap or the source bitmap if no scaling is required.
+ */
+inline fun Bitmap.scale(width: Int, height: Int, filter: Boolean = true): Bitmap {
+    return Bitmap.createScaledBitmap(this, width, height, filter)
+}
+
+/**
+ * Returns a mutable bitmap with the specified [width] and [height]. A config
+ * can be optionally specified. If not, the default config is [Bitmap.Config.ARGB_8888].
+ *
+ * @param width The new bitmap's desired width
+ * @param height The new bitmap's desired height
+ * @param config The new bitmap's desired [config][Bitmap.Config]
+ *
+ * @return A new bitmap with the specified dimensions and config
+ */
+inline fun createBitmap(
+    width: Int,
+    height: Int,
+    config: Bitmap.Config = Bitmap.Config.ARGB_8888
+): Bitmap {
+    return Bitmap.createBitmap(width, height, config)
+}
+
+/**
+ * Returns a mutable bitmap with the specified [width] and [height]. The config,
+ * transparency and color space can optionally be specified. They respectively
+ * default to [Bitmap.Config.ARGB_8888], `true` and [sRGB][ColorSpace.Named.SRGB].
+ *
+ * @param width The new bitmap's desired width
+ * @param height The new bitmap's desired height
+ * @param config The new bitmap's desired [config][Bitmap.Config]
+ * @param hasAlpha Whether the new bitmap is opaque or not
+ * @param colorSpace The new bitmap's color space
+ *
+ * @return A new bitmap with the specified dimensions and config
+ */
+@RequiresApi(26)
+inline fun createBitmap(
+    width: Int,
+    height: Int,
+    config: Bitmap.Config = Bitmap.Config.ARGB_8888,
+    hasAlpha: Boolean = true,
+    colorSpace: ColorSpace = ColorSpace.get(ColorSpace.Named.SRGB)
+): Bitmap {
+    return Bitmap.createBitmap(width, height, config, hasAlpha, colorSpace)
+}
diff --git a/core/ktx/src/main/java/androidx/core/graphics/Canvas.kt b/core/ktx/src/main/java/androidx/core/graphics/Canvas.kt
new file mode 100644
index 0000000..71efc08
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/Canvas.kt
@@ -0,0 +1,125 @@
+/*
+ * 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.core.graphics
+
+import android.graphics.Canvas
+import android.graphics.Matrix
+
+/**
+ * Wrap the specified [block] in calls to [Canvas.save]
+ * and [Canvas.restoreToCount].
+ */
+inline fun Canvas.withSave(block: Canvas.() -> Unit) {
+    val checkpoint = save()
+    try {
+        block()
+    } finally {
+        restoreToCount(checkpoint)
+    }
+}
+
+/**
+ * Wrap the specified [block] in calls to [Canvas.save]/[Canvas.translate]
+ * and [Canvas.restoreToCount].
+ */
+inline fun Canvas.withTranslation(
+    x: Float = 0.0f,
+    y: Float = 0.0f,
+    block: Canvas.() -> Unit
+) {
+    val checkpoint = save()
+    translate(x, y)
+    try {
+        block()
+    } finally {
+        restoreToCount(checkpoint)
+    }
+}
+
+/**
+ * Wrap the specified [block] in calls to [Canvas.save]/[Canvas.rotate]
+ * and [Canvas.restoreToCount].
+ */
+inline fun Canvas.withRotation(
+    degrees: Float = 0.0f,
+    pivotX: Float = 0.0f,
+    pivotY: Float = 0.0f,
+    block: Canvas.() -> Unit
+) {
+    val checkpoint = save()
+    rotate(degrees, pivotX, pivotY)
+    try {
+        block()
+    } finally {
+        restoreToCount(checkpoint)
+    }
+}
+
+/**
+ * Wrap the specified [block] in calls to [Canvas.save]/[Canvas.scale]
+ * and [Canvas.restoreToCount].
+ */
+inline fun Canvas.withScale(
+    x: Float = 1.0f,
+    y: Float = 1.0f,
+    pivotX: Float = 0.0f,
+    pivotY: Float = 0.0f,
+    block: Canvas.() -> Unit
+) {
+    val checkpoint = save()
+    scale(x, y, pivotX, pivotY)
+    try {
+        block()
+    } finally {
+        restoreToCount(checkpoint)
+    }
+}
+
+/**
+ * Wrap the specified [block] in calls to [Canvas.save]/[Canvas.skew]
+ * and [Canvas.restoreToCount].
+ */
+inline fun Canvas.withSkew(
+    x: Float = 0.0f,
+    y: Float = 0.0f,
+    block: Canvas.() -> Unit
+) {
+    val checkpoint = save()
+    skew(x, y)
+    try {
+        block()
+    } finally {
+        restoreToCount(checkpoint)
+    }
+}
+
+/**
+ * Wrap the specified [block] in calls to [Canvas.save]/[Canvas.concat]
+ * and [Canvas.restoreToCount].
+ */
+inline fun Canvas.withMatrix(
+    matrix: Matrix = Matrix(),
+    block: Canvas.() -> Unit
+) {
+    val checkpoint = save()
+    concat(matrix)
+    try {
+        block()
+    } finally {
+        restoreToCount(checkpoint)
+    }
+}
diff --git a/core/ktx/src/main/java/androidx/core/graphics/Color.kt b/core/ktx/src/main/java/androidx/core/graphics/Color.kt
new file mode 100644
index 0000000..f853422
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/Color.kt
@@ -0,0 +1,364 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE", "WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET_ON_TYPE")
+
+package androidx.core.graphics
+
+import android.graphics.Color
+import android.graphics.ColorSpace
+import androidx.annotation.ColorInt
+import androidx.annotation.ColorLong
+import androidx.annotation.RequiresApi
+
+/**
+ * Returns the first component of the color. For instance, when the color model
+ * of the color is [android.graphics.ColorSpace.Model.RGB], the first component
+ * is "red".
+ *
+ * This method allows to use destructuring declarations when working with colors,
+ * for example:
+ * ```
+ * val (red, green, blue) = myColor
+ * ```
+ */
+@RequiresApi(26)
+inline operator fun Color.component1() = getComponent(0)
+
+/**
+ * Returns the second component of the color. For instance, when the color model
+ * of the color is [android.graphics.ColorSpace.Model.RGB], the second component
+ * is "green".
+ *
+ * This method allows to use destructuring declarations when working with colors,
+ * for example:
+ * ```
+ * val (red, green, blue) = myColor
+ * ```
+ */
+@RequiresApi(26)
+inline operator fun Color.component2() = getComponent(1)
+
+/**
+ * Returns the third component of the color. For instance, when the color model
+ * of the color is [android.graphics.ColorSpace.Model.RGB], the third component
+ * is "blue".
+= *
+ * This method allows to use destructuring declarations when working with colors,
+ * for example:
+ * ```
+ * val (red, green, blue) = myColor
+ * ```
+ */
+@RequiresApi(26)
+inline operator fun Color.component3() = getComponent(2)
+
+/**
+ * Returns the fourth component of the color. For instance, when the color model
+ * of the color is [android.graphics.ColorSpace.Model.RGB], the fourth component
+ * is "alpha".
+ *
+ * This method allows to use destructuring declarations when working with colors,
+ * for example:
+ * ```
+ * val (red, green, blue, alpha) = myColor
+ * ```
+ */
+@RequiresApi(26)
+inline operator fun Color.component4() = getComponent(3)
+
+/**
+ * Composites two translucent colors together. More specifically, adds two colors using
+ * the [source over][android.graphics.PorterDuff.Mode.SRC_OVER] blending mode. The colors
+ * must not be pre-multiplied and the result is a non pre-multiplied color.
+ *
+ * If the two colors have different color spaces, the color in the right-hand part
+ * of the expression is converted to the color space of the color in left-hand part
+ * of the expression.
+ *
+ * The following example creates a purple color by blending opaque blue with
+ * semi-translucent red:
+ *
+ * ```
+ * val purple = Color.valueOf(0f, 0f, 1f) + Color.valueOf(1f, 0f, 0f, 0.5f)
+ * ```
+ *
+ * @throws IllegalArgumentException if the [color models][android.graphics.Color.getModel]
+ *                                  of the colors do not match
+ */
+@RequiresApi(26)
+operator fun Color.plus(c: Color): Color = ColorUtils.compositeColors(c, this)
+
+/**
+ * Return the alpha component of a color int. This is equivalent to calling:
+ * ```
+ * Color.alpha(myInt)
+ * ```
+ */
+inline val @receiver:ColorInt Int.alpha get() = (this shr 24) and 0xff
+
+/**
+ * Return the red component of a color int. This is equivalent to calling:
+ * ```
+ * Color.red(myInt)
+ * ```
+ */
+inline val @receiver:ColorInt Int.red get() = (this shr 16) and 0xff
+
+/**
+ * Return the green component of a color int. This is equivalent to calling:
+ * ```
+ * Color.green(myInt)
+ * ```
+ */
+inline val @receiver:ColorInt Int.green get() = (this shr 8) and 0xff
+
+/**
+ * Return the blue component of a color int. This is equivalent to calling:
+ * ```
+ * Color.blue(myInt)
+ * ```
+ */
+inline val @receiver:ColorInt Int.blue get() = this and 0xff
+
+/**
+ * Return the alpha component of a color int. This is equivalent to calling:
+ * ```
+ * Color.alpha(myInt)
+ * ```
+ *
+ * This method allows to use destructuring declarations when working with colors,
+ * for example:
+ * ```
+ * val (alpha, red, green, blue) = myColor
+ * ```
+ */
+inline operator fun @receiver:ColorInt Int.component1() = (this shr 24) and 0xff
+
+/**
+ * Return the red component of a color int. This is equivalent to calling:
+ * ```
+ * Color.red(myInt)
+ * ```
+ *
+ * This method allows to use destructuring declarations when working with colors,
+ * for example:
+ * ```
+ * val (alpha, red, green, blue) = myColor
+ * ```
+ */
+inline operator fun @receiver:ColorInt Int.component2() = (this shr 16) and 0xff
+
+/**
+ * Return the green component of a color int. This is equivalent to calling:
+ * ```
+ * Color.green(myInt)
+ * ```
+ *
+ * This method allows to use destructuring declarations when working with colors,
+ * for example:
+ * ```
+ * val (alpha, red, green, blue) = myColor
+ * ```
+ */
+inline operator fun @receiver:ColorInt Int.component3() = (this shr 8) and 0xff
+
+/**
+ * Return the blue component of a color int. This is equivalent to calling:
+ * ```
+ * Color.blue(myInt)
+ * ```
+ *
+ * This method allows to use destructuring declarations when working with colors,
+ * for example:
+ * ```
+ * val (alpha, red, green, blue) = myColor
+ * ```
+ */
+inline operator fun @receiver:ColorInt Int.component4() = this and 0xff
+
+/**
+ * Returns the relative luminance of a color int, assuming sRGB encoding.
+ * Based on the formula for relative luminance defined in WCAG 2.0,
+ * W3C Recommendation 11 December 2008.
+ */
+@get:RequiresApi(26)
+inline val @receiver:ColorInt Int.luminance get() = Color.luminance(this)
+
+/**
+ * Creates a new [Color] instance from a color int. The resulting color
+ * is in the [sRGB][android.graphics.ColorSpace.Named.SRGB] color space.
+ */
+@RequiresApi(26)
+inline fun @receiver:ColorInt Int.toColor(): Color = Color.valueOf(this)
+
+/**
+ * Converts the specified ARGB [color int][Color] to an RGBA [color long][Color]
+ * in the [sRGB][android.graphics.ColorSpace.Named.SRGB] color space.
+ */
+@RequiresApi(26)
+@ColorLong
+inline fun @receiver:ColorInt Int.toColorLong() = Color.pack(this)
+
+/**
+ * Returns the first component of the color. For instance, when the color model
+ * of the color is [android.graphics.ColorSpace.Model.RGB], the first component
+ * is "red".
+ *
+ * This method allows to use destructuring declarations when working with colors,
+ * for example:
+ * ```
+ * val (red, green, blue, alpha) = myColorLong
+ * ```
+ */
+@RequiresApi(26)
+inline operator fun @receiver:ColorLong Long.component1() = Color.red(this)
+
+/**
+ * Returns the second component of the color. For instance, when the color model
+ * of the color is [android.graphics.ColorSpace.Model.RGB], the second component
+ * is "green".
+ *
+ * This method allows to use destructuring declarations when working with colors,
+ * for example:
+ * ```
+ * val (red, green, blue, alpha) = myColorLong
+ * ```
+ */
+@RequiresApi(26)
+inline operator fun @receiver:ColorLong Long.component2() = Color.green(this)
+
+/**
+ * Returns the third component of the color. For instance, when the color model
+ * of the color is [android.graphics.ColorSpace.Model.RGB], the third component
+ * is "blue".
+ *
+ * This method allows to use destructuring declarations when working with colors,
+ * for example:
+ * ```
+ * val (red, green, blue, alpha) = myColorLong
+ * ```
+ */
+@RequiresApi(26)
+inline operator fun @receiver:ColorLong Long.component3() = Color.blue(this)
+
+/**
+ * Returns the fourth component of the color. For instance, when the color model
+ * of the color is [android.graphics.ColorSpace.Model.RGB], the fourth component
+ * is "alpha".
+ *
+ * This method allows to use destructuring declarations when working with colors,
+ * for example:
+ * ```
+ * val (red, green, blue, alpha) = myColorLong
+ * ```
+ */
+@RequiresApi(26)
+inline operator fun @receiver:ColorLong Long.component4() = Color.alpha(this)
+
+/**
+ * Return the alpha component of a color long. This is equivalent to calling:
+ * ```
+ * Color.alpha(myLong)
+ * ```
+ */
+@get:RequiresApi(26)
+inline val @receiver:ColorLong Long.alpha get() = Color.alpha(this)
+
+/**
+ * Return the red component of a color long. This is equivalent to calling:
+ * ```
+ * Color.red(myLong)
+ * ```
+ */
+@get:RequiresApi(26)
+inline val @receiver:ColorLong Long.red get() = Color.red(this)
+
+/**
+ * Return the green component of a color long. This is equivalent to calling:
+ * ```
+ * Color.green(myLong)
+ * ```
+ */
+@get:RequiresApi(26)
+inline val @receiver:ColorLong Long.green get() = Color.green(this)
+
+/**
+ * Return the blue component of a color long. This is equivalent to calling:
+ * ```
+ * Color.blue(myLong)
+ * ```
+ */
+@get:RequiresApi(26)
+inline val @receiver:ColorLong Long.blue get() = Color.blue(this)
+
+/**
+ * Returns the relative luminance of a color. Based on the formula for
+ * relative luminance defined in WCAG 2.0, W3C Recommendation 11 December 2008.
+ */
+@get:RequiresApi(26)
+inline val @receiver:ColorLong Long.luminance get() = Color.luminance(this)
+
+/**
+ * Creates a new [Color] instance from a [color long][Color].
+ */
+@RequiresApi(26)
+inline fun @receiver:ColorLong Long.toColor(): Color = Color.valueOf(this)
+
+/**
+ * Converts the specified [color long][Color] to an ARGB [color int][Color].
+ */
+@RequiresApi(26)
+@ColorInt
+inline fun @receiver:ColorLong Long.toColorInt() = Color.toArgb(this)
+
+/**
+ * Indicates whether the color is in the [sRGB][android.graphics.ColorSpace.Named.SRGB]
+ * color space.
+ */
+@get:RequiresApi(26)
+inline val @receiver:ColorLong Long.isSrgb get() = Color.isSrgb(this)
+
+/**
+ * Indicates whether the color is in a [wide-gamut][android.graphics.ColorSpace] color space.
+ */
+@get:RequiresApi(26)
+inline val @receiver:ColorLong Long.isWideGamut get() = Color.isWideGamut(this)
+
+/**
+ * Returns the color space encoded in the specified color long.
+ */
+@get:RequiresApi(26)
+inline val @receiver:ColorLong Long.colorSpace: ColorSpace get() = Color.colorSpace(this)
+
+/**
+ * Return a corresponding [Int] color of this [String].
+ *
+ * Supported formats are:
+ * ```
+ * #RRGGBB
+ * #AARRGGBB
+ * ```
+ *
+ * The following names are also accepted: "red", "blue", "green", "black", "white",
+ * "gray", "cyan", "magenta", "yellow", "lightgray", "darkgray",
+ * "grey", "lightgrey", "darkgrey", "aqua", "fuchsia", "lime",
+ * "maroon", "navy", "olive", "purple", "silver", "teal".
+ *
+ * @throws IllegalArgumentException if this [String] cannot be parsed.
+ */
+@ColorInt
+inline fun String.toColorInt(): Int = Color.parseColor(this)
diff --git a/core/ktx/src/main/java/androidx/core/graphics/Matrix.kt b/core/ktx/src/main/java/androidx/core/graphics/Matrix.kt
new file mode 100644
index 0000000..5cb0cdf
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/Matrix.kt
@@ -0,0 +1,51 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.core.graphics
+
+import android.graphics.Matrix
+
+/**
+ * Multiplies this [Matrix] by another matrix and returns the result as
+ * a new matrix.
+ */
+inline operator fun Matrix.times(m: Matrix) = Matrix(this).apply { preConcat(m) }
+
+/**
+ * Returns the 9 values of this [Matrix] as a new array of floats.
+ */
+inline fun Matrix.values() = FloatArray(9).apply { getValues(this) }
+
+/**
+ * Creates a translation matrix with the translation amounts [tx] and [ty]
+ * respectively on the `x` and `y` axis.
+ */
+fun translationMatrix(tx: Float = 0.0f, ty: Float = 0.0f) = Matrix().apply { setTranslate(tx, ty) }
+
+/**
+ * Creates a scale matrix with the scale factor [sx] and [sy] respectively on the
+ * `x` and `y` axis.
+ */
+fun scaleMatrix(sx: Float = 1.0f, sy: Float = 1.0f) = Matrix().apply { setScale(sx, sy) }
+
+/**
+ * Creates a rotation matrix, defined by a rotation angle in degrees around the pivot
+ * point located at the coordinates ([px], [py]).
+ */
+fun rotationMatrix(degrees: Float, px: Float = 0.0f, py: Float = 0.0f) =
+    Matrix().apply { setRotate(degrees, px, py) }
diff --git a/core/ktx/src/main/java/androidx/core/graphics/Path.kt b/core/ktx/src/main/java/androidx/core/graphics/Path.kt
new file mode 100644
index 0000000..ca70533
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/Path.kt
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.core.graphics
+
+import android.graphics.Path
+import androidx.annotation.RequiresApi
+
+/**
+ * Flattens (or approximate) the [Path] with a series of line segments.
+ *
+ * @param error The acceptable error for a line on the Path. Typically this would be
+ *              0.5 so that the error is less than half a pixel. This value must be
+ *              positive and is set to 0.5 by default.
+ *
+ * @see Path.approximate
+ */
+@RequiresApi(26)
+fun Path.flatten(error: Float = 0.5f): Iterable<PathSegment> = PathUtils.flatten(this, error)
+
+/**
+ * Returns the union of two paths as a new [Path].
+ */
+@RequiresApi(19)
+inline operator fun Path.plus(p: Path): Path {
+    return Path(this).apply {
+        op(p, Path.Op.UNION)
+    }
+}
+
+/**
+ * Returns the difference of two paths as a new [Path].
+ */
+@RequiresApi(19)
+inline operator fun Path.minus(p: Path): Path {
+    return Path(this).apply {
+        op(p, Path.Op.DIFFERENCE)
+    }
+}
+
+/**
+ * Returns the union of two paths as a new [Path].
+ */
+@RequiresApi(19)
+inline infix fun Path.and(p: Path) = this + p
+
+/**
+ * Returns the intersection of two paths as a new [Path].
+ * If the paths do not intersect, returns an empty path.
+ */
+@RequiresApi(19)
+inline infix fun Path.or(p: Path): Path {
+    return Path().apply {
+        op(this@or, p, Path.Op.INTERSECT)
+    }
+}
+
+/**
+ * Returns the union minus the intersection of two paths as a new [Path].
+ */
+@RequiresApi(19)
+inline infix fun Path.xor(p: Path): Path {
+    return Path(this).apply {
+        op(p, Path.Op.XOR)
+    }
+}
diff --git a/core/ktx/src/main/java/androidx/core/graphics/Picture.kt b/core/ktx/src/main/java/androidx/core/graphics/Picture.kt
new file mode 100644
index 0000000..d1e8c99
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/Picture.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 20188 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.core.graphics
+
+import android.graphics.Canvas
+import android.graphics.Picture
+
+/**
+ * Creates a new [Canvas] to record commands in this [Picture], executes the specified
+ * [block] on the newly created canvas and returns this [Picture]. Example:
+ *
+ * ```
+ * return myPicture.record(1280, 720) {
+ *    drawLine(…)
+ *    translate(…)
+ *    drawRect(…)
+ * }
+ * ```
+ */
+inline fun Picture.record(width: Int, height: Int, block: Canvas.() -> Unit): Picture {
+    val c = beginRecording(width, height)
+    try {
+        c.block()
+    } finally {
+        endRecording()
+    }
+    return this
+}
diff --git a/core/ktx/src/main/java/androidx/core/graphics/Point.kt b/core/ktx/src/main/java/androidx/core/graphics/Point.kt
new file mode 100644
index 0000000..b6e35e6
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/Point.kt
@@ -0,0 +1,164 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.core.graphics
+
+import android.graphics.Point
+import android.graphics.PointF
+
+/**
+ * Returns the x coordinate of this point.
+ *
+ * This method allows to use destructuring declarations when working with points,
+ * for example:
+ * ```
+ * val (x, y) = myPoint
+ * ```
+ */
+inline operator fun Point.component1() = this.x
+
+/**
+ * Returns the y coordinate of this point.
+ *
+ * This method allows to use destructuring declarations when working with points,
+ * for example:
+ * ```
+ * val (x, y) = myPoint
+ * ```
+ */
+inline operator fun Point.component2() = this.y
+
+/**
+ * Returns the x coordinate of this point.
+ *
+ * This method allows to use destructuring declarations when working with points,
+ * for example:
+ * ```
+ * val (x, y) = myPoint
+ * ```
+ */
+inline operator fun PointF.component1() = this.x
+
+/**
+ * Returns the y coordinate of this point.
+ *
+ * This method allows to use destructuring declarations when working with points,
+ * for example:
+ * ```
+ * val (x, y) = myPoint
+ * ```
+ */
+inline operator fun PointF.component2() = this.y
+
+/**
+ * Offsets this point by the specified point and returns the result as a new point.
+ */
+inline operator fun Point.plus(p: Point): Point {
+    return Point(x, y).apply {
+        offset(p.x, p.y)
+    }
+}
+
+/**
+ * Offsets this point by the specified point and returns the result as a new point.
+ */
+inline operator fun PointF.plus(p: PointF): PointF {
+    return PointF(x, y).apply {
+        offset(p.x, p.y)
+    }
+}
+
+/**
+ * Offsets this point by the specified amount on both X and Y axis and returns the
+ * result as a new point.
+ */
+inline operator fun Point.plus(xy: Int): Point {
+    return Point(x, y).apply {
+        offset(xy, xy)
+    }
+}
+
+/**
+ * Offsets this point by the specified amount on both X and Y axis and returns the
+ * result as a new point.
+ */
+inline operator fun PointF.plus(xy: Float): PointF {
+    return PointF(x, y).apply {
+        offset(xy, xy)
+    }
+}
+
+/**
+ * Offsets this point by the negation of the specified point and returns the result
+ * as a new point.
+ */
+inline operator fun Point.minus(p: Point): Point {
+    return Point(x, y).apply {
+        offset(-p.x, -p.y)
+    }
+}
+
+/**
+ * Offsets this point by the negation of the specified point and returns the result
+ * as a new point.
+ */
+inline operator fun PointF.minus(p: PointF): PointF {
+    return PointF(x, y).apply {
+        offset(-p.x, -p.y)
+    }
+}
+
+/**
+ * Offsets this point by the negation of the specified amount on both X and Y axis and
+ * returns the result as a new point.
+ */
+inline operator fun Point.minus(xy: Int): Point {
+    return Point(x, y).apply {
+        offset(-xy, -xy)
+    }
+}
+
+/**
+ * Offsets this point by the negation of the specified amount on both X and Y axis and
+ * returns the result as a new point.
+ */
+inline operator fun PointF.minus(xy: Float): PointF {
+    return PointF(x, y).apply {
+        offset(-xy, -xy)
+    }
+}
+
+/**
+ * Returns a new point representing the negation of this point.
+ */
+inline operator fun Point.unaryMinus() = Point(-x, -y)
+
+/**
+ * Returns a new point representing the negation of this point.
+ */
+inline operator fun PointF.unaryMinus() = PointF(-x, -y)
+
+/**
+ * Returns a [PointF] representation of this point.
+ */
+inline fun Point.toPointF() = PointF(this)
+
+/**
+ * Returns a [Point] representation of this point.
+ */
+inline fun PointF.toPoint() = Point(x.toInt(), y.toInt())
diff --git a/core/ktx/src/main/java/androidx/core/graphics/PorterDuff.kt b/core/ktx/src/main/java/androidx/core/graphics/PorterDuff.kt
new file mode 100644
index 0000000..a34d6f9
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/PorterDuff.kt
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.core.graphics
+
+import android.graphics.PorterDuff
+import android.graphics.PorterDuffColorFilter
+import android.graphics.PorterDuffXfermode
+
+/**
+ * Creates a new [PorterDuffXfermode] that uses this [PorterDuff.Mode] as the
+ * alpha compositing or blending mode.
+ */
+inline fun PorterDuff.Mode.toXfermode() = PorterDuffXfermode(this)
+
+/**
+ * Creates a new [PorterDuffColorFilter] that uses this [PorterDuff.Mode] as the
+ * alpha compositing or blending mode, and the specified [color].
+ */
+inline fun PorterDuff.Mode.toColorFilter(color: Int) = PorterDuffColorFilter(color, this)
diff --git a/core/ktx/src/main/java/androidx/core/graphics/Rect.kt b/core/ktx/src/main/java/androidx/core/graphics/Rect.kt
new file mode 100644
index 0000000..960c0c5
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/Rect.kt
@@ -0,0 +1,335 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.core.graphics
+
+import android.annotation.SuppressLint
+import android.graphics.Matrix
+import android.graphics.Point
+import android.graphics.PointF
+import android.graphics.Rect
+import android.graphics.RectF
+import android.graphics.Region
+
+/**
+ * Returns "left", the first component of the rectangle.
+ *
+ * This method allows to use destructuring declarations when working with rectangles,
+ * for example:
+ * ```
+ * val (left, top, right, bottom) = myRectangle
+ * ```
+ */
+inline operator fun Rect.component1() = this.left
+
+/**
+ * Returns "top", the second component of the rectangle.
+ *
+ * This method allows to use destructuring declarations when working with rectangles,
+ * for example:
+ * ```
+ * val (left, top, right, bottom) = myRectangle
+ * ```
+ */
+inline operator fun Rect.component2() = this.top
+
+/**
+ * Returns "right", the third component of the rectangle.
+ *
+ * This method allows to use destructuring declarations when working with rectangles,
+ * for example:
+ * ```
+ * val (left, top, right, bottom) = myRectangle
+ * ```
+ */
+inline operator fun Rect.component3() = this.right
+
+/**
+ * Returns "bottom", the fourth component of the rectangle.
+ *
+ * This method allows to use destructuring declarations when working with rectangles,
+ * for example:
+ * ```
+ * val (left, top, right, bottom) = myRectangle
+ * ```
+ */
+inline operator fun Rect.component4() = this.bottom
+
+/**
+ * Returns "left", the first component of the rectangle.
+ *
+ * This method allows to use destructuring declarations when working with rectangles,
+ * for example:
+ * ```
+ * val (left, top, right, bottom) = myRectangle
+ * ```
+ */
+inline operator fun RectF.component1() = this.left
+
+/**
+ * Returns "top", the second component of the rectangle.
+ *
+ * This method allows to use destructuring declarations when working with rectangles,
+ * for example:
+ * ```
+ * val (left, top, right, bottom) = myRectangle
+ * ```
+ */
+inline operator fun RectF.component2() = this.top
+
+/**
+ * Returns "right", the third component of the rectangle.
+ *
+ * This method allows to use destructuring declarations when working with rectangles,
+ * for example:
+ * ```
+ * val (left, top, right, bottom) = myRectangle
+ * ```
+ */
+inline operator fun RectF.component3() = this.right
+
+/**
+ * Returns "bottom", the fourth component of the rectangle.
+ *
+ * This method allows to use destructuring declarations when working with rectangles,
+ * for example:
+ * ```
+ * val (left, top, right, bottom) = myRectangle
+ * ```
+ */
+inline operator fun RectF.component4() = this.bottom
+
+/**
+ * Performs the union of this rectangle and the specified rectangle and returns
+ * the result as a new rectangle.
+ */
+inline operator fun Rect.plus(r: Rect): Rect {
+    return Rect(this).apply {
+        union(r)
+    }
+}
+
+/**
+ * Performs the union of this rectangle and the specified rectangle and returns
+ * the result as a new rectangle.
+ */
+inline operator fun RectF.plus(r: RectF): RectF {
+    return RectF(this).apply {
+        union(r)
+    }
+}
+
+/**
+ * Returns a new rectangle representing this rectangle offset by the specified
+ * amount on both X and Y axis.
+ */
+inline operator fun Rect.plus(xy: Int): Rect {
+    return Rect(this).apply {
+        offset(xy, xy)
+    }
+}
+
+/**
+ * Returns a new rectangle representing this rectangle offset by the specified
+ * amount on both X and Y axis.
+ */
+inline operator fun RectF.plus(xy: Float): RectF {
+    return RectF(this).apply {
+        offset(xy, xy)
+    }
+}
+
+/**
+ * Returns a new rectangle representing this rectangle offset by the specified
+ * point.
+ */
+inline operator fun Rect.plus(xy: Point): Rect {
+    return Rect(this).apply {
+        offset(xy.x, xy.y)
+    }
+}
+
+/**
+ * Returns a new rectangle representing this rectangle offset by the specified
+ * point.
+ */
+inline operator fun RectF.plus(xy: PointF): RectF {
+    return RectF(this).apply {
+        offset(xy.x, xy.y)
+    }
+}
+
+/**
+ * Returns the difference of this rectangle and the specified rectangle as a new region.
+ */
+inline operator fun Rect.minus(r: Rect): Region {
+    return Region(this).apply {
+        op(r, Region.Op.DIFFERENCE)
+    }
+}
+
+/**
+ * Returns the difference of this rectangle and the specified rectangle as a new region.
+ * This rectangle is first converted to a [Rect] using [RectF.toRect].
+ */
+inline operator fun RectF.minus(r: RectF): Region {
+    return Region(this.toRect()).apply {
+        op(r.toRect(), Region.Op.DIFFERENCE)
+    }
+}
+
+/**
+ * Returns a new rectangle representing this rectangle offset by the negation
+ * of the specified amount on both X and Y axis.
+ */
+inline operator fun Rect.minus(xy: Int): Rect {
+    return Rect(this).apply {
+        offset(-xy, -xy)
+    }
+}
+
+/**
+ * Returns a new rectangle representing this rectangle offset by the negation
+ * of the specified amount on both X and Y axis.
+ */
+inline operator fun RectF.minus(xy: Float): RectF {
+    return RectF(this).apply {
+        offset(-xy, -xy)
+    }
+}
+
+/**
+ * Returns a new rectangle representing this rectangle offset by the negation of
+ * the specified point.
+ */
+inline operator fun Rect.minus(xy: Point): Rect {
+    return Rect(this).apply {
+        offset(-xy.x, -xy.y)
+    }
+}
+
+/**
+ * Returns a new rectangle representing this rectangle offset by the negation of
+ * the specified point.
+ */
+inline operator fun RectF.minus(xy: PointF): RectF {
+    return RectF(this).apply {
+        offset(-xy.x, -xy.y)
+    }
+}
+
+/**
+ * Returns the union of two rectangles as a new rectangle.
+ */
+inline infix fun Rect.and(r: Rect) = this + r
+
+/**
+ * Returns the union of two rectangles as a new rectangle.
+ */
+inline infix fun RectF.and(r: RectF) = this + r
+
+/**
+ * Returns the intersection of two rectangles as a new rectangle.
+ * If the rectangles do not intersect, returns a copy of the left hand side
+ * rectangle.
+ */
+@SuppressLint("CheckResult")
+inline infix fun Rect.or(r: Rect): Rect {
+    return Rect(this).apply {
+        intersect(r)
+    }
+}
+
+/**
+ * Returns the intersection of two rectangles as a new rectangle.
+ * If the rectangles do not intersect, returns a copy of the left hand side
+ * rectangle.
+ */
+@SuppressLint("CheckResult")
+inline infix fun RectF.or(r: RectF): RectF {
+    return RectF(this).apply {
+        intersect(r)
+    }
+}
+
+/**
+ * Returns the union minus the intersection of two rectangles as a new region.
+ */
+inline infix fun Rect.xor(r: Rect): Region {
+    return Region(this).apply {
+        op(r, Region.Op.XOR)
+    }
+}
+
+/**
+ * Returns the union minus the intersection of two rectangles as a new region.
+ * The two rectangles are first converted to [Rect] using [RectF.toRect].
+ */
+inline infix fun RectF.xor(r: RectF): Region {
+    return Region(this.toRect()).apply {
+        op(r.toRect(), Region.Op.XOR)
+    }
+}
+
+/**
+ * Returns true if the specified point is inside the rectangle.
+ * The left and top are considered to be inside, while the right and bottom are not.
+ * This means that for a point to be contained: left <= x < right and top <= y < bottom.
+ * An empty rectangle never contains any point.
+ */
+inline operator fun Rect.contains(p: Point) = contains(p.x, p.y)
+
+/**
+ * Returns true if the specified point is inside the rectangle.
+ * The left and top are considered to be inside, while the right and bottom are not.
+ * This means that for a point to be contained: left <= x < right and top <= y < bottom.
+ * An empty rectangle never contains any point.
+ */
+inline operator fun RectF.contains(p: PointF) = contains(p.x, p.y)
+
+/**
+ * Returns a [RectF] representation of this rectangle.
+ */
+inline fun Rect.toRectF(): RectF = RectF(this)
+
+/**
+ * Returns a [Rect] representation of this rectangle. The resulting rect will be sized such
+ * that this rect can fit within it.
+ */
+inline fun RectF.toRect(): Rect {
+    val r = Rect()
+    roundOut(r)
+    return r
+}
+
+/**
+ * Returns a [Region] representation of this rectangle.
+ */
+inline fun Rect.toRegion() = Region(this)
+
+/**
+ * Returns a [Region] representation of this rectangle. The resulting rect will be sized such
+ * that this rect can fit within it.
+ */
+inline fun RectF.toRegion() = Region(this.toRect())
+
+/**
+ * Transform this rectangle in place using the supplied [Matrix] and returns
+ * this rectangle.
+ */
+inline fun RectF.transform(m: Matrix) = apply { m.mapRect(this@transform) }
diff --git a/core/ktx/src/main/java/androidx/core/graphics/Region.kt b/core/ktx/src/main/java/androidx/core/graphics/Region.kt
new file mode 100644
index 0000000..4fc5179
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/Region.kt
@@ -0,0 +1,157 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.core.graphics
+
+import android.graphics.Point
+import android.graphics.Rect
+import android.graphics.Region
+import android.graphics.RegionIterator
+
+/**
+ * Return true if the region contains the specified [Point].
+ */
+inline operator fun Region.contains(p: Point) = contains(p.x, p.y)
+
+/**
+ * Return the union of this region and the specified [Rect] as a new region.
+ */
+inline operator fun Region.plus(r: Rect): Region {
+    return Region(this).apply {
+        union(r)
+    }
+}
+
+/**
+ * Return the union of this region and the specified region as a new region.
+ */
+inline operator fun Region.plus(r: Region): Region {
+    return Region(this).apply {
+        op(r, Region.Op.UNION)
+    }
+}
+
+/**
+ * Return the difference of this region and the specified [Rect] as a new region.
+ */
+inline operator fun Region.minus(r: Rect): Region {
+    return Region(this).apply {
+        op(r, Region.Op.DIFFERENCE)
+    }
+}
+
+/**
+ * Return the difference of this region and the specified region as a new region.
+ */
+inline operator fun Region.minus(r: Region): Region {
+    return Region(this).apply {
+        op(r, Region.Op.DIFFERENCE)
+    }
+}
+
+/**
+ * Returns the negation of this region as a new region.
+ */
+inline operator fun Region.unaryMinus(): Region {
+    return Region(bounds).apply {
+        op(this@unaryMinus, Region.Op.DIFFERENCE)
+    }
+}
+
+/**
+ * Returns the negation of this region as a new region.
+ */
+inline operator fun Region.not() = -this
+
+/**
+ * Return the union of this region and the specified [Rect] as a new region.
+ */
+inline infix fun Region.and(r: Rect) = this + r
+
+/**
+ * Return the union of this region and the specified region as a new region.
+ */
+inline infix fun Region.and(r: Region) = this + r
+
+/**
+ * Return the intersection of this region and the specified [Rect] as a new region.
+ */
+inline infix fun Region.or(r: Rect): Region {
+    return Region(this).apply {
+        op(r, Region.Op.INTERSECT)
+    }
+}
+
+/**
+ * Return the intersection of this region and the specified region as a new region.
+ */
+inline infix fun Region.or(r: Region): Region {
+    return Region(this).apply {
+        op(r, Region.Op.INTERSECT)
+    }
+}
+
+/**
+ * Return the union minus the intersection of this region and the specified [Rect]
+ * as a new region.
+ */
+inline infix fun Region.xor(r: Rect): Region {
+    return Region(this).apply {
+        op(r, Region.Op.XOR)
+    }
+}
+
+/**
+ * Return the union minus the intersection of this region and the specified region
+ * as a new region.
+ */
+inline infix fun Region.xor(r: Region): Region {
+    return Region(this).apply {
+        op(r, Region.Op.XOR)
+    }
+}
+
+/** Performs the given action on each rect in this region. */
+inline fun Region.forEach(action: (rect: Rect) -> Unit) {
+    val iterator = RegionIterator(this)
+    while (true) {
+        val r = Rect()
+        if (!iterator.next(r)) {
+            break
+        }
+        action(r)
+    }
+}
+
+/** Returns an [Iterator] over the rects in this region. */
+operator fun Region.iterator() = object : Iterator<Rect> {
+    private val iterator = RegionIterator(this@iterator)
+    private val rect = Rect()
+    private var hasMore = iterator.next(rect)
+
+    override fun hasNext() = hasMore
+
+    override fun next(): Rect {
+        if (hasMore) {
+            val r = Rect(rect)
+            hasMore = iterator.next(rect)
+            return r
+        }
+        throw IndexOutOfBoundsException()
+    }
+}
diff --git a/core/ktx/src/main/java/androidx/core/graphics/Shader.kt b/core/ktx/src/main/java/androidx/core/graphics/Shader.kt
new file mode 100644
index 0000000..0fb93cb
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/Shader.kt
@@ -0,0 +1,30 @@
+/*
+ * 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.core.graphics
+
+import android.graphics.Matrix
+import android.graphics.Shader
+
+/**
+ * Wrap the specified [block] in calls to [Shader.getLocalMatrix] and [Shader.setLocalMatrix].
+ */
+inline fun Shader.transform(block: Matrix.() -> Unit) {
+    val matrix = Matrix()
+    getLocalMatrix(matrix)
+    block(matrix)
+    setLocalMatrix(matrix)
+}
diff --git a/core/ktx/src/main/java/androidx/core/graphics/drawable/BitmapDrawable.kt b/core/ktx/src/main/java/androidx/core/graphics/drawable/BitmapDrawable.kt
new file mode 100644
index 0000000..4a96aab
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/drawable/BitmapDrawable.kt
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE", "WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET_ON_TYPE")
+
+package androidx.core.graphics.drawable
+
+import android.content.res.Resources
+import android.graphics.Bitmap
+import android.graphics.drawable.BitmapDrawable
+
+/** Create a [BitmapDrawable] from this [Bitmap]. */
+inline fun Bitmap.toDrawable(resources: Resources) = BitmapDrawable(resources, this)
diff --git a/core/ktx/src/main/java/androidx/core/graphics/drawable/ColorDrawable.kt b/core/ktx/src/main/java/androidx/core/graphics/drawable/ColorDrawable.kt
new file mode 100644
index 0000000..bef04df
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/drawable/ColorDrawable.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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE", "WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET_ON_TYPE")
+
+package androidx.core.graphics.drawable
+
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import androidx.annotation.ColorInt
+import androidx.annotation.RequiresApi
+
+/** Create a [ColorDrawable] from this color value. */
+inline fun @receiver:ColorInt Int.toDrawable() = ColorDrawable(this)
+
+/** Create a [ColorDrawable] from this [Color] (via [Color.toArgb]). */
+@RequiresApi(26)
+inline fun Color.toDrawable() = ColorDrawable(toArgb())
diff --git a/core/ktx/src/main/java/androidx/core/graphics/drawable/Drawable.kt b/core/ktx/src/main/java/androidx/core/graphics/drawable/Drawable.kt
new file mode 100644
index 0000000..9e63bbd
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/drawable/Drawable.kt
@@ -0,0 +1,81 @@
+/*
+ * 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.core.graphics.drawable
+
+import android.graphics.Bitmap
+import android.graphics.Bitmap.Config
+import android.graphics.Canvas
+import android.graphics.drawable.BitmapDrawable
+import android.graphics.drawable.Drawable
+import androidx.annotation.Px
+import androidx.core.graphics.component1
+import androidx.core.graphics.component2
+import androidx.core.graphics.component3
+import androidx.core.graphics.component4
+
+/**
+ * Return a [Bitmap] representation of this [Drawable].
+ *
+ * If this instance is a [BitmapDrawable] and the [width], [height], and [config] match, the
+ * underlying [Bitmap] instance will be returned directly. If any of those three properties differ
+ * then a new [Bitmap] is created. For all other [Drawable] types, a new [Bitmap] is created.
+ *
+ * @param width Width of the desired bitmap. Defaults to [Drawable.getIntrinsicWidth].
+ * @param height Height of the desired bitmap. Defaults to [Drawable.getIntrinsicHeight].
+ * @param config Bitmap config of the desired bitmap. Null attempts to use the native config, if
+ * any. Defaults to [Config.ARGB_8888] otherwise.
+ */
+fun Drawable.toBitmap(
+    @Px width: Int = intrinsicWidth,
+    @Px height: Int = intrinsicHeight,
+    config: Config? = null
+): Bitmap {
+    if (this is BitmapDrawable) {
+        if (config == null || bitmap.config == config) {
+            // Fast-path to return original. Bitmap.createScaledBitmap will do this check, but it
+            // involves allocation and two jumps into native code so we perform the check ourselves.
+            if (width == intrinsicWidth && height == intrinsicHeight) {
+                return bitmap
+            }
+            return Bitmap.createScaledBitmap(bitmap, width, height, true)
+        }
+    }
+
+    val (oldLeft, oldTop, oldRight, oldBottom) = bounds
+
+    val bitmap = Bitmap.createBitmap(width, height, config ?: Config.ARGB_8888)
+    setBounds(0, 0, width, height)
+    draw(Canvas(bitmap))
+
+    setBounds(oldLeft, oldTop, oldRight, oldBottom)
+    return bitmap
+}
+
+/**
+ * Updates this drawable's bounds. This version of the method allows using named parameters
+ * to just set one or more axes.
+ *
+ * @see Drawable.setBounds
+ */
+fun Drawable.updateBounds(
+    @Px left: Int = bounds.left,
+    @Px top: Int = bounds.top,
+    @Px right: Int = bounds.right,
+    @Px bottom: Int = bounds.bottom
+) {
+    setBounds(left, top, right, bottom)
+}
diff --git a/core/ktx/src/main/java/androidx/core/graphics/drawable/Icon.kt b/core/ktx/src/main/java/androidx/core/graphics/drawable/Icon.kt
new file mode 100644
index 0000000..a9077e2
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/graphics/drawable/Icon.kt
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.core.graphics.drawable
+
+import android.graphics.Bitmap
+import android.graphics.drawable.Icon
+import android.net.Uri
+import androidx.annotation.RequiresApi
+
+/**
+ * Create an [Icon] from this adaptive [Bitmap].
+ *
+ * @see Icon.createWithAdaptiveBitmap
+ */
+@RequiresApi(26)
+inline fun Bitmap.toAdaptiveIcon(): Icon = Icon.createWithAdaptiveBitmap(this)
+
+/**
+ * Create an [Icon] from this [Bitmap].
+ *
+ * @see Icon.createWithBitmap
+ */
+@RequiresApi(26)
+inline fun Bitmap.toIcon(): Icon = Icon.createWithBitmap(this)
+
+/**
+ * Create an [Icon] from this [Uri].
+ *
+ * @see Icon.createWithContentUri
+ */
+@RequiresApi(26)
+inline fun Uri.toIcon(): Icon = Icon.createWithContentUri(this)
+
+/**
+ * Create an [Icon] from this [ByteArray].
+ *
+ * @see Icon.createWithData
+ */
+@RequiresApi(26)
+inline fun ByteArray.toIcon(): Icon = Icon.createWithData(this, 0, size)
diff --git a/core/ktx/src/main/java/androidx/core/net/Uri.kt b/core/ktx/src/main/java/androidx/core/net/Uri.kt
new file mode 100644
index 0000000..a5d9f1d
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/net/Uri.kt
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.core.net
+
+import android.net.Uri
+import java.io.File
+
+/**
+ * Creates a Uri from the given encoded URI string.
+ *
+ * @see Uri.parse
+ */
+inline fun String.toUri(): Uri = Uri.parse(this)
+
+/**
+ * Creates a Uri from the given file.
+ *
+ * @see Uri.fromFile
+ */
+inline fun File.toUri(): Uri = Uri.fromFile(this)
+
+/** Creates a [File] from the given [Uri]. */
+inline fun Uri.toFile(): File = File(path)
diff --git a/core/ktx/src/main/java/androidx/core/os/Bundle.kt b/core/ktx/src/main/java/androidx/core/os/Bundle.kt
new file mode 100644
index 0000000..53da45d
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/os/Bundle.kt
@@ -0,0 +1,104 @@
+/*
+ * 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.core.os
+
+import android.os.Binder
+import android.os.Build
+import android.os.Bundle
+import android.os.Parcelable
+import android.util.Size
+import android.util.SizeF
+import java.io.Serializable
+
+/**
+ * Returns a new [Bundle] with the given key/value pairs as elements.
+ *
+ * @throws IllegalArgumentException When a value is not a supported type of [Bundle].
+ */
+fun bundleOf(vararg pairs: Pair<String, Any?>) = Bundle(pairs.size).apply {
+    for ((key, value) in pairs) {
+        when (value) {
+            null -> putString(key, null) // Any nullable type will suffice.
+
+            // Scalars
+            is Boolean -> putBoolean(key, value)
+            is Byte -> putByte(key, value)
+            is Char -> putChar(key, value)
+            is Double -> putDouble(key, value)
+            is Float -> putFloat(key, value)
+            is Int -> putInt(key, value)
+            is Long -> putLong(key, value)
+            is Short -> putShort(key, value)
+
+            // References
+            is Bundle -> putBundle(key, value)
+            is CharSequence -> putCharSequence(key, value)
+            is Parcelable -> putParcelable(key, value)
+
+            // Scalar arrays
+            is BooleanArray -> putBooleanArray(key, value)
+            is ByteArray -> putByteArray(key, value)
+            is CharArray -> putCharArray(key, value)
+            is DoubleArray -> putDoubleArray(key, value)
+            is FloatArray -> putFloatArray(key, value)
+            is IntArray -> putIntArray(key, value)
+            is LongArray -> putLongArray(key, value)
+            is ShortArray -> putShortArray(key, value)
+
+            // Reference arrays
+            is Array<*> -> {
+                val componentType = value::class.java.componentType
+                @Suppress("UNCHECKED_CAST") // Checked by reflection.
+                when {
+                    Parcelable::class.java.isAssignableFrom(componentType) -> {
+                        putParcelableArray(key, value as Array<Parcelable>)
+                    }
+                    String::class.java.isAssignableFrom(componentType) -> {
+                        putStringArray(key, value as Array<String>)
+                    }
+                    CharSequence::class.java.isAssignableFrom(componentType) -> {
+                        putCharSequenceArray(key, value as Array<CharSequence>)
+                    }
+                    Serializable::class.java.isAssignableFrom(componentType) -> {
+                        putSerializable(key, value)
+                    }
+                    else -> {
+                        val valueType = componentType.canonicalName
+                        throw IllegalArgumentException(
+                            "Illegal value array type $valueType for key \"$key\"")
+                    }
+                }
+            }
+
+            // Last resort. Also we must check this after Array<*> as all arrays are serializable.
+            is Serializable -> putSerializable(key, value)
+
+            else -> {
+                if (Build.VERSION.SDK_INT >= 18 && value is Binder) {
+                    putBinder(key, value)
+                } else if (Build.VERSION.SDK_INT >= 21 && value is Size) {
+                    putSize(key, value)
+                } else if (Build.VERSION.SDK_INT >= 21 && value is SizeF) {
+                    putSizeF(key, value)
+                } else {
+                    val valueType = value.javaClass.canonicalName
+                    throw IllegalArgumentException("Illegal value type $valueType for key \"$key\"")
+                }
+            }
+        }
+    }
+}
diff --git a/core/ktx/src/main/java/androidx/core/os/Handler.kt b/core/ktx/src/main/java/androidx/core/os/Handler.kt
new file mode 100644
index 0000000..de09a9b
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/os/Handler.kt
@@ -0,0 +1,68 @@
+/*
+ * 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.core.os
+
+import android.os.Handler
+
+/**
+ * Version of [Handler.postDelayed] which re-orders the parameters, allowing the action to be
+ * placed outside of parentheses.
+ *
+ * ```
+ * handler.postDelayed(200) {
+ *     doSomething()
+ * }
+ * ```
+ *
+ * @return the created Runnable
+ */
+inline fun Handler.postDelayed(
+    delayInMillis: Long,
+    token: Any? = null,
+    crossinline action: () -> Unit
+): Runnable {
+    val runnable = Runnable { action() }
+    if (token == null) {
+        postDelayed(runnable, delayInMillis)
+    } else {
+        HandlerCompat.postDelayed(this, runnable, token, delayInMillis)
+    }
+    return runnable
+}
+
+/**
+ * Version of [Handler.postAtTime] which re-orders the parameters, allowing the action to be
+ * placed outside of parentheses.
+ *
+ * ```
+ * handler.postAtTime(200) {
+ *     doSomething()
+ * }
+ * ```
+ *
+ * @param token An optional object with which the posted message will be associated.
+ * @return the created Runnable
+ */
+inline fun Handler.postAtTime(
+    uptimeMillis: Long,
+    token: Any? = null,
+    crossinline action: () -> Unit
+): Runnable {
+    val runnable = Runnable { action() }
+    postAtTime(runnable, token, uptimeMillis)
+    return runnable
+}
diff --git a/core/ktx/src/main/java/androidx/core/os/PersistableBundle.kt b/core/ktx/src/main/java/androidx/core/os/PersistableBundle.kt
new file mode 100644
index 0000000..261e72b
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/os/PersistableBundle.kt
@@ -0,0 +1,83 @@
+/*
+ * 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.core.os
+
+import android.os.Build
+import android.os.PersistableBundle
+import androidx.annotation.RequiresApi
+
+/**
+ * Returns a new [PersistableBundle] with the given key/value pairs as elements.
+ *
+ * @throws IllegalArgumentException When a value is not a supported type of [PersistableBundle].
+ */
+@RequiresApi(21)
+fun persistableBundleOf(vararg pairs: Pair<String, Any?>) = PersistableBundle(pairs.size).apply {
+    for ((key, value) in pairs) {
+        when (value) {
+            null -> putString(key, null) // Any nullable type will suffice.
+
+            // Scalars
+            is Boolean -> {
+                if (Build.VERSION.SDK_INT >= 22) {
+                    putBoolean(key, value)
+                } else {
+                    throw IllegalArgumentException("Illegal value type boolean for key \"$key\"")
+                }
+            }
+            is Double -> putDouble(key, value)
+            is Int -> putInt(key, value)
+            is Long -> putLong(key, value)
+
+            // References
+            is String -> putString(key, value)
+
+            // Scalar arrays
+            is BooleanArray -> {
+                if (Build.VERSION.SDK_INT >= 22) {
+                    putBooleanArray(key, value)
+                } else {
+                    throw IllegalArgumentException("Illegal value type boolean[] for key \"$key\"")
+                }
+            }
+            is DoubleArray -> putDoubleArray(key, value)
+            is IntArray -> putIntArray(key, value)
+            is LongArray -> putLongArray(key, value)
+
+            // Reference arrays
+            is Array<*> -> {
+                val componentType = value::class.java.componentType
+                @Suppress("UNCHECKED_CAST") // Checked by reflection.
+                when {
+                    String::class.java.isAssignableFrom(componentType) -> {
+                        putStringArray(key, value as Array<String>)
+                    }
+                    else -> {
+                        val valueType = componentType.canonicalName
+                        throw IllegalArgumentException(
+                            "Illegal value array type $valueType for key \"$key\"")
+                    }
+                }
+            }
+
+            else -> {
+                val valueType = value.javaClass.canonicalName
+                throw IllegalArgumentException("Illegal value type $valueType for key \"$key\"")
+            }
+        }
+    }
+}
diff --git a/core/ktx/src/main/java/androidx/core/os/Trace.kt b/core/ktx/src/main/java/androidx/core/os/Trace.kt
new file mode 100644
index 0000000..43bf85e
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/os/Trace.kt
@@ -0,0 +1,32 @@
+/*
+ * 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.core.os
+
+import android.os.Trace
+
+/**
+ * Wrap the specified [block] in calls to [Trace.beginSection] (with the supplied [sectionName])
+ * and [Trace.endSection].
+ */
+inline fun <T> trace(sectionName: String, block: () -> T): T {
+    TraceCompat.beginSection(sectionName)
+    try {
+        return block()
+    } finally {
+        TraceCompat.endSection()
+    }
+}
diff --git a/core/ktx/src/main/java/androidx/core/preference/PreferenceGroup.kt b/core/ktx/src/main/java/androidx/core/preference/PreferenceGroup.kt
new file mode 100644
index 0000000..b4f267e
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/preference/PreferenceGroup.kt
@@ -0,0 +1,90 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.core.preference
+
+import android.preference.Preference
+import android.preference.PreferenceGroup
+
+/**
+ * Returns the preference with `key`.
+ *
+ * @throws NullPointerException if no preference is found with that key.
+ */
+inline operator fun PreferenceGroup.get(key: CharSequence): Preference = findPreference(key)
+
+/**
+ * Returns the preference at `index`.
+ *
+ * @throws IndexOutOfBoundsException if index is less than 0 or greater than or equal to the count.
+ */
+operator fun PreferenceGroup.get(index: Int): Preference = getPreference(index)
+        ?: throw IndexOutOfBoundsException("Index: $index, Size: $preferenceCount")
+
+/** Returns `true` if `preference` is found in this preference group. */
+operator fun PreferenceGroup.contains(preference: Preference): Boolean {
+    for (index in 0 until size) {
+        if (get(index) == preference) {
+            return true
+        }
+    }
+    return false
+}
+
+/** Adds `preference` to this preference group. */
+inline operator fun PreferenceGroup.plusAssign(preference: Preference) {
+    addPreference(preference)
+}
+
+/** Removes `preference` from this preference group. */
+inline operator fun PreferenceGroup.minusAssign(preference: Preference) {
+    removePreference(preference)
+}
+
+/** Returns the number of preferences in this preference group. */
+inline val PreferenceGroup.size: Int get() = preferenceCount
+
+/** Returns true if this preference group contains no preferences. */
+inline fun PreferenceGroup.isEmpty(): Boolean = size == 0
+
+/** Returns true if this preference group contains one or more preferences. */
+inline fun PreferenceGroup.isNotEmpty(): Boolean = size != 0
+
+/** Performs the given action on each preference in this preference group. */
+inline fun PreferenceGroup.forEach(action: (preference: Preference) -> Unit) {
+    for (index in 0 until size) {
+        action(get(index))
+    }
+}
+
+/** Performs the given action on each preference in this preference group, providing its sequential index. */
+inline fun PreferenceGroup.forEachIndexed(action: (index: Int, preference: Preference) -> Unit) {
+    for (index in 0 until size) {
+        action(index, get(index))
+    }
+}
+
+/** Returns a [MutableIterator] over the preferences in this preference group. */
+operator fun PreferenceGroup.iterator() = object : MutableIterator<Preference> {
+    private var index = 0
+    override fun hasNext() = index < size
+    override fun next() = getPreference(index++) ?: throw IndexOutOfBoundsException()
+    override fun remove() {
+        removePreference(getPreference(--index))
+    }
+}
diff --git a/core/ktx/src/main/java/androidx/core/text/CharSequence.kt b/core/ktx/src/main/java/androidx/core/text/CharSequence.kt
new file mode 100644
index 0000000..d41aed2
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/text/CharSequence.kt
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.core.text
+
+import android.text.TextUtils
+
+/**
+ * Returns whether the given [CharSequence] contains only digits.
+ *
+ * @see TextUtils.isDigitsOnly
+ */
+inline fun CharSequence.isDigitsOnly() = TextUtils.isDigitsOnly(this)
+
+/**
+ * Returns the length that the specified [CharSequence] would have if spaces and ASCII control
+ * characters were trimmed from the start and end, as by [String.trim].
+ *
+ * @see TextUtils.getTrimmedLength
+ */
+inline fun CharSequence.trimmedLength() = TextUtils.getTrimmedLength(this)
diff --git a/core/ktx/src/main/java/androidx/core/text/Html.kt b/core/ktx/src/main/java/androidx/core/text/Html.kt
new file mode 100644
index 0000000..d2636ee
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/text/Html.kt
@@ -0,0 +1,51 @@
+/*
+ * 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.core.text
+
+import android.annotation.SuppressLint
+import android.text.Html
+import android.text.Html.FROM_HTML_MODE_LEGACY
+import android.text.Html.ImageGetter
+import android.text.Html.TO_HTML_PARAGRAPH_LINES_CONSECUTIVE
+import android.text.Html.TagHandler
+import android.text.Spanned
+
+/**
+ * Returns a [Spanned] from parsing this string as HTML.
+ *
+ * @param flags Additional option to set the behavior of the HTML parsing. Default is set to
+ * [Html.FROM_HTML_MODE_LEGACY] which was introduced in API 24.
+ * @param imageGetter Returns displayable styled text from the provided HTML string.
+ * @param tagHandler Notified when HTML tags are encountered a tag the parser does
+ * not know how to interpret.
+ *
+ * @see Html.fromHtml
+ */
+fun String.parseAsHtml(
+    @SuppressLint("InlinedApi") flags: Int = FROM_HTML_MODE_LEGACY,
+    imageGetter: ImageGetter? = null,
+    tagHandler: TagHandler? = null
+): Spanned = HtmlCompat.fromHtml(this, flags, imageGetter, tagHandler)
+
+/**
+ * Returns a string of HTML from the spans in this [Spanned].
+ *
+ * @see Html.toHtml
+ */
+fun Spanned.toHtml(
+    @SuppressLint("InlinedApi") option: Int = TO_HTML_PARAGRAPH_LINES_CONSECUTIVE
+): String = HtmlCompat.toHtml(this, option)
diff --git a/core/ktx/src/main/java/androidx/core/text/SpannableString.kt b/core/ktx/src/main/java/androidx/core/text/SpannableString.kt
new file mode 100644
index 0000000..29aa9c2
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/text/SpannableString.kt
@@ -0,0 +1,72 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.core.text
+
+import android.text.Spannable
+import android.text.SpannableString
+import android.text.Spanned.SPAN_INCLUSIVE_EXCLUSIVE
+
+/**
+ * Returns a new [Spannable] from [CharSequence],
+ * or the source itself if it is already an instance of [SpannableString].
+ */
+inline fun CharSequence.toSpannable(): Spannable = SpannableString.valueOf(this)
+
+/** Adds [span] to the entire text. */
+inline operator fun Spannable.plusAssign(span: Any) =
+    setSpan(span, 0, length, SPAN_INCLUSIVE_EXCLUSIVE)
+
+/** Removes [span] from this text. */
+inline operator fun Spannable.minusAssign(span: Any) = removeSpan(span)
+
+/** Clear all spans from this text. */
+inline fun Spannable.clearSpans() = getSpans<Any>().forEach { removeSpan(it) }
+
+/**
+ * Add [span] to the range [start]&hellip;[end] of the text.
+ *
+ * ```
+ * val s = "Hello, World!".toSpannable()
+ * s[0, 5] = UnderlineSpan()
+ * ```
+ *
+ * Note: The [end] value is exclusive.
+ *
+ * @see Spannable.setSpan
+ */
+inline operator fun Spannable.set(start: Int, end: Int, span: Any) {
+    setSpan(span, start, end, SPAN_INCLUSIVE_EXCLUSIVE)
+}
+
+/**
+ * Add [span] to the [range] of the text.
+ *
+ * ```
+ * val s = "Hello, World!".toSpannable()
+ * s[0..5] = UnderlineSpan()
+ * ```
+ *
+ * Note: The range end value is exclusive.
+ *
+ * @see Spannable.setSpan
+ */
+inline operator fun Spannable.set(range: IntRange, span: Any) {
+    // This looks weird, but endInclusive is just the exact upper value.
+    setSpan(span, range.start, range.endInclusive, SPAN_INCLUSIVE_EXCLUSIVE)
+}
diff --git a/core/ktx/src/main/java/androidx/core/text/SpannableStringBuilder.kt b/core/ktx/src/main/java/androidx/core/text/SpannableStringBuilder.kt
new file mode 100644
index 0000000..5834a34
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/text/SpannableStringBuilder.kt
@@ -0,0 +1,136 @@
+/*
+ * 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.core.text
+
+import android.graphics.Typeface.BOLD
+import android.graphics.Typeface.ITALIC
+import android.text.Spannable.SPAN_INCLUSIVE_EXCLUSIVE
+import android.text.SpannableStringBuilder
+import android.text.SpannedString
+import android.text.style.BackgroundColorSpan
+import android.text.style.ForegroundColorSpan
+import android.text.style.RelativeSizeSpan
+import android.text.style.StrikethroughSpan
+import android.text.style.StyleSpan
+import android.text.style.UnderlineSpan
+import androidx.annotation.ColorInt
+
+/**
+ * Builds new string by populating a newly created [SpannableStringBuilder] using the provided
+ * [builderAction] and then converting it to [SpannedString].
+ */
+inline fun buildSpannedString(builderAction: SpannableStringBuilder.() -> Unit): SpannedString {
+    val builder = SpannableStringBuilder()
+    builder.builderAction()
+    return SpannedString(builder)
+}
+
+/**
+ * Wrap appended text in [builderAction] in [spans].
+ *
+ * Note: the spans will only have the correct position if the [builderAction] only appends or
+ * replaces text. Inserting, deleting, or clearing the text will cause the span to be placed at
+ * an incorrect position.
+ */
+inline fun SpannableStringBuilder.inSpans(
+    vararg spans: Any,
+    builderAction: SpannableStringBuilder.() -> Unit
+): SpannableStringBuilder {
+    val start = length
+    builderAction()
+    for (span in spans) setSpan(span, start, length, SPAN_INCLUSIVE_EXCLUSIVE)
+    return this
+}
+
+/**
+ * Wrap appended text in [builderAction] in [span].
+ *
+ * Note: the span will only have the correct position if the `builderAction` only appends or
+ * replaces text. Inserting, deleting, or clearing the text will cause the span to be placed at
+ * an incorrect position.
+ */
+inline fun SpannableStringBuilder.inSpans(
+    span: Any,
+    builderAction: SpannableStringBuilder.() -> Unit
+): SpannableStringBuilder {
+    val start = length
+    builderAction()
+    setSpan(span, start, length, SPAN_INCLUSIVE_EXCLUSIVE)
+    return this
+}
+
+/**
+ * Wrap appended text in [builderAction] in a bold [StyleSpan].
+ *
+ * @see SpannableStringBuilder.inSpans
+ */
+inline fun SpannableStringBuilder.bold(builderAction: SpannableStringBuilder.() -> Unit) =
+    inSpans(StyleSpan(BOLD), builderAction = builderAction)
+
+/**
+ * Wrap appended text in [builderAction] in an italic [StyleSpan].
+ *
+ * @see SpannableStringBuilder.inSpans
+ */
+inline fun SpannableStringBuilder.italic(builderAction: SpannableStringBuilder.() -> Unit) =
+    inSpans(StyleSpan(ITALIC), builderAction = builderAction)
+
+/**
+ * Wrap appended text in [builderAction] in an [UnderlineSpan].
+ *
+ * @see SpannableStringBuilder.inSpans
+ */
+inline fun SpannableStringBuilder.underline(builderAction: SpannableStringBuilder.() -> Unit) =
+    inSpans(UnderlineSpan(), builderAction = builderAction)
+
+/**
+ * Wrap appended text in [builderAction] in a [ForegroundColorSpan].
+ *
+ * @see SpannableStringBuilder.inSpans
+ */
+inline fun SpannableStringBuilder.color(
+    @ColorInt color: Int,
+    builderAction: SpannableStringBuilder.() -> Unit
+) = inSpans(ForegroundColorSpan(color), builderAction = builderAction)
+
+/**
+ * Wrap appended text in [builderAction] in a [BackgroundColorSpan].
+ *
+ * @see SpannableStringBuilder.inSpans
+ */
+inline fun SpannableStringBuilder.backgroundColor(
+    @ColorInt color: Int,
+    builderAction: SpannableStringBuilder.() -> Unit
+) = inSpans(BackgroundColorSpan(color), builderAction = builderAction)
+
+/**
+ * Wrap appended text in [builderAction] in a [StrikethroughSpan].
+ *
+ * @see SpannableStringBuilder.inSpans
+ */
+inline fun SpannableStringBuilder.strikeThrough(builderAction: SpannableStringBuilder.() -> Unit) =
+    inSpans(StrikethroughSpan(), builderAction = builderAction)
+
+/**
+ * Wrap appended text in [builderAction] in a [RelativeSizeSpan].
+ *
+ * @see SpannableStringBuilder.inSpans
+ */
+inline fun SpannableStringBuilder.scale(
+    proportion: Float,
+    builderAction: SpannableStringBuilder.() -> Unit
+) = inSpans(RelativeSizeSpan(proportion), builderAction = builderAction)
diff --git a/core/ktx/src/main/java/androidx/core/text/SpannedString.kt b/core/ktx/src/main/java/androidx/core/text/SpannedString.kt
new file mode 100644
index 0000000..db27511
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/text/SpannedString.kt
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.core.text
+
+import android.text.Spanned
+import android.text.SpannedString
+
+/**
+ * Returns a new [Spanned] from [CharSequence],
+ * or the source itself if it is already an instance of [SpannedString].
+ */
+inline fun CharSequence.toSpanned(): Spanned = SpannedString.valueOf(this)
+
+/** Get all spans that are instance of [T]. */
+inline fun <reified T : Any> Spanned.getSpans(start: Int = 0, end: Int = length): Array<out T> =
+    getSpans(start, end, T::class.java)
diff --git a/core/ktx/src/main/java/androidx/core/text/String.kt b/core/ktx/src/main/java/androidx/core/text/String.kt
new file mode 100644
index 0000000..8bffdd0
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/text/String.kt
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.core.text
+
+import android.text.TextUtils
+
+/**
+ * Html-encode the string.
+ *
+ * @see TextUtils.htmlEncode
+ */
+inline fun String.htmlEncode(): String = TextUtils.htmlEncode(this)
diff --git a/core/ktx/src/main/java/androidx/core/transition/Transition.kt b/core/ktx/src/main/java/androidx/core/transition/Transition.kt
new file mode 100644
index 0000000..b79f2cb
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/transition/Transition.kt
@@ -0,0 +1,94 @@
+/*
+ * 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.core.transition
+
+import android.transition.Transition
+import androidx.annotation.RequiresApi
+
+/**
+ * Add an action which will be invoked when this transition has ended.
+ */
+@RequiresApi(19)
+fun Transition.doOnEnd(action: (transition: Transition) -> Unit) {
+    addListener(onEnd = action)
+}
+
+/**
+ * Add an action which will be invoked when this transition has started.
+ */
+@RequiresApi(19)
+fun Transition.doOnStart(action: (transition: Transition) -> Unit) {
+    addListener(onStart = action)
+}
+
+/**
+ * Add an action which will be invoked when this transition has been cancelled.
+ */
+@RequiresApi(19)
+fun Transition.doOnCancel(action: (transition: Transition) -> Unit) {
+    addListener(onCancel = action)
+}
+
+/**
+ * Add an action which will be invoked when this transition has resumed after a pause.
+ */
+@RequiresApi(19)
+fun Transition.doOnResume(action: (transition: Transition) -> Unit) {
+    addListener(onResume = action)
+}
+
+/**
+ * Add an action which will be invoked when this transition has been paused.
+ */
+@RequiresApi(19)
+fun Transition.doOnPause(action: (transition: Transition) -> Unit) {
+    addListener(onPause = action)
+}
+
+/**
+ * Add a listener to this Transition using the provided actions.
+ */
+@RequiresApi(19)
+fun Transition.addListener(
+    onEnd: ((transition: Transition) -> Unit)? = null,
+    onStart: ((transition: Transition) -> Unit)? = null,
+    onCancel: ((transition: Transition) -> Unit)? = null,
+    onResume: ((transition: Transition) -> Unit)? = null,
+    onPause: ((transition: Transition) -> Unit)? = null
+) {
+    addListener(object : Transition.TransitionListener {
+        override fun onTransitionEnd(transition: Transition) {
+            onEnd?.invoke(transition)
+        }
+
+        override fun onTransitionResume(transition: Transition) {
+            onResume?.invoke(transition)
+        }
+
+        override fun onTransitionPause(transition: Transition) {
+            onPause?.invoke(transition)
+        }
+
+        override fun onTransitionCancel(transition: Transition) {
+            onCancel?.invoke(transition)
+        }
+
+        override fun onTransitionStart(transition: Transition) {
+            onStart?.invoke(transition)
+        }
+    })
+}
diff --git a/core/ktx/src/main/java/androidx/core/util/ArrayMap.kt b/core/ktx/src/main/java/androidx/core/util/ArrayMap.kt
new file mode 100644
index 0000000..b676403
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/util/ArrayMap.kt
@@ -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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.core.util
+
+import android.util.ArrayMap
+import androidx.annotation.RequiresApi
+import kotlin.Pair
+
+/** Returns an empty new [ArrayMap]. */
+@RequiresApi(19)
+inline fun <K, V> arrayMapOf(): ArrayMap<K, V> = ArrayMap()
+
+/**
+ * Returns a new [ArrayMap] with the specified contents, given as a list of pairs where the first
+ * component is the key and the second component is the value.
+ *
+ * If multiple pairs have the same key, the resulting map will contain the value from the last of
+ * those pairs.
+ */
+@RequiresApi(19)
+fun <K, V> arrayMapOf(vararg pairs: Pair<K, V>): ArrayMap<K, V> {
+    val map = ArrayMap<K, V>(pairs.size)
+    for (pair in pairs) {
+        map[pair.first] = pair.second
+    }
+    return map
+}
diff --git a/core/ktx/src/main/java/androidx/core/util/ArraySet.kt b/core/ktx/src/main/java/androidx/core/util/ArraySet.kt
new file mode 100644
index 0000000..6773d23
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/util/ArraySet.kt
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.core.util
+
+import android.util.ArraySet
+import androidx.annotation.RequiresApi
+
+/** Returns an empty new [ArraySet]. */
+@RequiresApi(23)
+inline fun <T> arraySetOf(): ArraySet<T> = ArraySet()
+
+/** Returns a new [ArraySet] with the specified contents. */
+@RequiresApi(23)
+fun <T> arraySetOf(vararg values: T): ArraySet<T> {
+    val set = ArraySet<T>(values.size)
+    @Suppress("LoopToCallChain") // Causes needless copy to a list.
+    for (value in values) {
+        set.add(value)
+    }
+    return set
+}
diff --git a/core/ktx/src/main/java/androidx/core/util/AtomicFile.kt b/core/ktx/src/main/java/androidx/core/util/AtomicFile.kt
new file mode 100644
index 0000000..b8fbba7
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/util/AtomicFile.kt
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to other public API.
+
+package androidx.core.util
+
+import android.util.AtomicFile
+import androidx.annotation.RequiresApi
+import java.io.FileOutputStream
+import java.nio.charset.Charset
+
+/**
+ * Perform the write operations inside [block] on this file. If [block] throws an exception the
+ * write will be failed. Otherwise the write will be applied atomically to the file.
+ */
+@RequiresApi(17)
+inline fun AtomicFile.tryWrite(block: (out: FileOutputStream) -> Unit) {
+    val stream = startWrite()
+    var success = false
+    try {
+        block(stream)
+        success = true
+    } finally {
+        if (success) {
+            finishWrite(stream)
+        } else {
+            failWrite(stream)
+        }
+    }
+}
+
+/**
+ * Sets the content of this file as an [array] of bytes.
+ */
+@RequiresApi(17)
+fun AtomicFile.writeBytes(array: ByteArray) {
+    tryWrite {
+        it.write(array)
+    }
+}
+
+/**
+ * Sets the content of this file as [text] encoded using UTF-8 or specified [charset].
+ * If this file exists, it becomes overwritten.
+ */
+@RequiresApi(17)
+fun AtomicFile.writeText(text: String, charset: Charset = Charsets.UTF_8) {
+    writeBytes(text.toByteArray(charset))
+}
+
+/**
+ * Gets the entire content of this file as a byte array.
+ *
+ * This method is not recommended on huge files. It has an internal limitation of 2 GB file size.
+ */
+@RequiresApi(17)
+inline fun AtomicFile.readBytes(): ByteArray = readFully()
+
+/**
+ * Gets the entire content of this file as a String using UTF-8 or specified [charset].
+ *
+ * This method is not recommended on huge files. It has an internal limitation of 2 GB file size.
+ */
+@RequiresApi(17)
+fun AtomicFile.readText(charset: Charset = Charsets.UTF_8): String {
+    return readFully().toString(charset)
+}
diff --git a/core/ktx/src/main/java/androidx/core/util/Half.kt b/core/ktx/src/main/java/androidx/core/util/Half.kt
new file mode 100644
index 0000000..409c01e
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/util/Half.kt
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to other public API.
+
+package androidx.core.util
+
+import android.util.Half
+import androidx.annotation.HalfFloat
+import androidx.annotation.RequiresApi
+
+/**
+ * Returns a [Half] instance representing given [Short].
+ *
+ * @see Half.valueOf
+ */
+// TODO https://youtrack.jetbrains.com/issue/KT-21696
+@Suppress("WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET_ON_TYPE")
+@RequiresApi(26)
+inline fun @receiver:HalfFloat Short.toHalf(): Half = Half.valueOf(this)
+
+/**
+ * Returns a [Half] instance representing given [Float].
+ *
+ * @see Half.valueOf
+ */
+@RequiresApi(26)
+inline fun Float.toHalf(): Half = Half.valueOf(this)
+
+/**
+ * Returns a [Half] instance representing given [Double].
+ *
+ * @see Half.valueOf
+ */
+@RequiresApi(26)
+inline fun Double.toHalf(): Half = toFloat().toHalf()
+
+/**
+ * Returns a [Half] instance representing given [String].
+ *
+ * @see Half.valueOf
+ */
+@RequiresApi(26)
+inline fun String.toHalf(): Half = Half.valueOf(this)
diff --git a/core/ktx/src/main/java/androidx/core/util/Locale.kt b/core/ktx/src/main/java/androidx/core/util/Locale.kt
new file mode 100644
index 0000000..2b4312e
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/util/Locale.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 androidx.core.util
+
+import android.text.TextUtils
+import androidx.annotation.RequiresApi
+import java.util.Locale
+
+/**
+ * Returns layout direction for a given locale.
+ * @see TextUtils.getLayoutDirectionFromLocale
+ */
+val Locale.layoutDirection: Int
+        @RequiresApi(17)
+        get() = TextUtils.getLayoutDirectionFromLocale(this)
diff --git a/core/ktx/src/main/java/androidx/core/util/LongSparseArray.kt b/core/ktx/src/main/java/androidx/core/util/LongSparseArray.kt
new file mode 100644
index 0000000..cd9eb4c
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/util/LongSparseArray.kt
@@ -0,0 +1,108 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.core.util
+
+import android.util.LongSparseArray
+import androidx.annotation.RequiresApi
+
+/** Returns the number of key/value pairs in the collection. */
+@get:RequiresApi(16)
+inline val <T> LongSparseArray<T>.size get() = size()
+
+/** Returns true if the collection contains [key]. */
+@RequiresApi(16)
+inline operator fun <T> LongSparseArray<T>.contains(key: Long) = indexOfKey(key) >= 0
+
+/** Allows the use of the index operator for storing values in the collection. */
+@RequiresApi(16)
+inline operator fun <T> LongSparseArray<T>.set(key: Long, value: T) = put(key, value)
+
+/** Creates a new collection by adding or replacing entries from [other]. */
+@RequiresApi(16)
+operator fun <T> LongSparseArray<T>.plus(other: LongSparseArray<T>): LongSparseArray<T> {
+    val new = LongSparseArray<T>(size() + other.size())
+    new.putAll(this)
+    new.putAll(other)
+    return new
+}
+
+/** Returns true if the collection contains [key]. */
+@RequiresApi(16)
+inline fun <T> LongSparseArray<T>.containsKey(key: Long) = indexOfKey(key) >= 0
+
+/** Returns true if the collection contains [value]. */
+@RequiresApi(16)
+inline fun <T> LongSparseArray<T>.containsValue(value: T) = indexOfValue(value) != -1
+
+/** Return the value corresponding to [key], or [defaultValue] when not present. */
+@RequiresApi(16)
+inline fun <T> LongSparseArray<T>.getOrDefault(key: Long, defaultValue: T) =
+    get(key) ?: defaultValue
+
+/** Return the value corresponding to [key], or from [defaultValue] when not present. */
+@RequiresApi(16)
+inline fun <T> LongSparseArray<T>.getOrElse(key: Long, defaultValue: () -> T) =
+    get(key) ?: defaultValue()
+
+/** Return true when the collection contains no elements. */
+@RequiresApi(16)
+inline fun <T> LongSparseArray<T>.isEmpty() = size() == 0
+
+/** Return true when the collection contains elements. */
+@RequiresApi(16)
+inline fun <T> LongSparseArray<T>.isNotEmpty() = size() != 0
+
+/** Removes the entry for [key] only if it is mapped to [value]. */
+@RequiresApi(16)
+fun <T> LongSparseArray<T>.remove(key: Long, value: T): Boolean {
+    val index = indexOfKey(key)
+    if (index != -1 && value == valueAt(index)) {
+        removeAt(index)
+        return true
+    }
+    return false
+}
+
+/** Update this collection by adding or replacing entries from [other]. */
+@RequiresApi(16)
+fun <T> LongSparseArray<T>.putAll(other: LongSparseArray<T>) = other.forEach(::put)
+
+/** Performs the given [action] for each key/value entry. */
+@RequiresApi(16)
+inline fun <T> LongSparseArray<T>.forEach(action: (key: Long, value: T) -> Unit) {
+    for (index in 0 until size()) {
+        action(keyAt(index), valueAt(index))
+    }
+}
+
+/** Return an iterator over the collection's keys. */
+@RequiresApi(16)
+fun <T> LongSparseArray<T>.keyIterator(): LongIterator = object : LongIterator() {
+    var index = 0
+    override fun hasNext() = index < size()
+    override fun nextLong() = keyAt(index++)
+}
+
+/** Return an iterator over the collection's values. */
+@RequiresApi(16)
+fun <T> LongSparseArray<T>.valueIterator(): Iterator<T> = object : Iterator<T> {
+    var index = 0
+    override fun hasNext() = index < size()
+    override fun next() = valueAt(index++)
+}
diff --git a/core/ktx/src/main/java/androidx/core/util/LruCache.kt b/core/ktx/src/main/java/androidx/core/util/LruCache.kt
new file mode 100644
index 0000000..44c2f8d
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/util/LruCache.kt
@@ -0,0 +1,53 @@
+/*
+ * 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.core.util
+
+import android.util.LruCache
+
+/**
+ * Creates an [LruCache] with the given parameters.
+ *
+ * @param maxSize for caches that do not specify [sizeOf], this is
+ * the maximum number of entries in the cache. For all other caches,
+ * this is the maximum sum of the sizes of the entries in this cache.
+ * @param sizeOf function that returns the size of the entry for key and value in
+ * user-defined units. The default implementation returns 1.
+ * @param create a create called after a cache miss to compute a value for the corresponding key.
+ * Returns the computed value or null if no value can be computed. The default implementation
+ * returns null.
+ * @param onEntryRemoved a function called for entries that have been evicted or removed.
+ *
+ * @see LruCache.sizeOf
+ * @see LruCache.create
+ * @see LruCache.entryRemoved
+ */
+inline fun <K : Any, V : Any> lruCache(
+    maxSize: Int,
+    crossinline sizeOf: (key: K, value: V) -> Int = { _, _ -> 1 },
+    @Suppress("USELESS_CAST") // https://youtrack.jetbrains.com/issue/KT-21946
+    crossinline create: (key: K) -> V? = { null as V? },
+    crossinline onEntryRemoved: (evicted: Boolean, key: K, oldValue: V, newValue: V?) -> Unit =
+        { _, _, _, _ -> }
+): LruCache<K, V> {
+    return object : LruCache<K, V>(maxSize) {
+        override fun sizeOf(key: K, value: V) = sizeOf(key, value)
+        override fun create(key: K) = create(key)
+        override fun entryRemoved(evicted: Boolean, key: K, oldValue: V, newValue: V?) {
+            onEntryRemoved(evicted, key, oldValue, newValue)
+        }
+    }
+}
diff --git a/core/ktx/src/main/java/androidx/core/util/Pair.kt b/core/ktx/src/main/java/androidx/core/util/Pair.kt
new file mode 100644
index 0000000..cf12156
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/util/Pair.kt
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.core.util
+
+import android.util.Pair
+
+/**
+ * Returns the first component of the pair.
+ *
+ * This method allows to use destructuring declarations when working with pairs, for example:
+ * ```
+ * val (first, second) = myPair
+ * ```
+ */
+@Suppress("HasPlatformType") // Intentionally propagating platform type with unknown nullability.
+inline operator fun <F, S> Pair<F, S>.component1() = first
+
+/**
+ * Returns the second component of the pair.
+ *
+ * This method allows to use destructuring declarations when working with pairs, for example:
+ * ```
+ * val (first, second) = myPair
+ * ```
+ */
+@Suppress("HasPlatformType") // Intentionally propagating platform type with unknown nullability.
+inline operator fun <F, S> Pair<F, S>.component2() = second
+
+/** Returns this [Pair] as a [kotlin.Pair]. */
+inline fun <F, S> Pair<F, S>.toKotlinPair() = kotlin.Pair(first, second)
+
+/** Returns this [kotlin.Pair] as an Android [Pair]. */
+// Note: the return type is explicitly specified here to prevent always seeing platform types.
+inline fun <F, S> kotlin.Pair<F, S>.toAndroidPair(): Pair<F, S> = Pair(first, second)
diff --git a/core/ktx/src/main/java/androidx/core/util/Range.kt b/core/ktx/src/main/java/androidx/core/util/Range.kt
new file mode 100644
index 0000000..b5f7eb6
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/util/Range.kt
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.core.util
+
+import android.util.Range
+import androidx.annotation.RequiresApi
+
+/**
+ * Creates a range from this [Comparable] value to [that].
+ *
+ * @throws IllegalArgumentException if this value is comparatively smaller than [that].
+ */
+@RequiresApi(21)
+inline infix fun <T : Comparable<T>> T.rangeTo(that: T): Range<T> = Range(this, that)
+
+/** Return the smallest range that includes this and [value]. */
+@RequiresApi(21)
+inline operator fun <T : Comparable<T>> Range<T>.plus(value: T): Range<T> = extend(value)
+
+/** Return the smallest range that includes this and [other]. */
+@RequiresApi(21)
+inline operator fun <T : Comparable<T>> Range<T>.plus(other: Range<T>): Range<T> = extend(other)
+
+/**
+ * Return the intersection of this range and [other].
+ *
+ * @throws IllegalArgumentException if this is disjoint from [other].
+ */
+@RequiresApi(21)
+inline infix fun <T : Comparable<T>> Range<T>.and(other: Range<T>): Range<T> = intersect(other)
+
+/** Returns this [Range] as a [ClosedRange]. */
+@RequiresApi(21)
+fun <T : Comparable<T>> Range<T>.toClosedRange(): ClosedRange<T> = object : ClosedRange<T> {
+    override val endInclusive get() = upper
+    override val start get() = lower
+}
+
+/** Returns this [ClosedRange] as a [Range]. */
+@RequiresApi(21)
+fun <T : Comparable<T>> ClosedRange<T>.toRange(): Range<T> = Range(start, endInclusive)
diff --git a/core/ktx/src/main/java/androidx/core/util/Size.kt b/core/ktx/src/main/java/androidx/core/util/Size.kt
new file mode 100644
index 0000000..34f6854
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/util/Size.kt
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.core.util
+
+import android.util.Size
+import android.util.SizeF
+import androidx.annotation.RequiresApi
+
+/**
+ * Returns "width", the first component of this [Size].
+ *
+ * This method allows to use destructuring declarations when working with
+ * sizes, for example:
+ * ```
+ * val (w, h) = mySize
+ * ```
+ */
+@RequiresApi(21)
+inline operator fun Size.component1() = width
+
+/**
+ * Returns "height", the second component of this [Size].
+ *
+ * This method allows to use destructuring declarations when working with
+ * sizes, for example:
+ * ```
+ * val (w, h) = mySize
+ * ```
+ */
+@RequiresApi(21)
+inline operator fun Size.component2() = height
+
+/**
+ * Returns "width", the first component of this [SizeF].
+ *
+ * This method allows to use destructuring declarations when working with
+ * sizes, for example:
+ * ```
+ * val (w, h) = mySize
+ * ```
+ */
+@RequiresApi(21)
+inline operator fun SizeF.component1() = width
+
+/**
+ * Returns "height", the second component of this [SizeF].
+ *
+ * This method allows to use destructuring declarations when working with
+ * sizes, for example:
+ * ```
+ * val (w, h) = mySize
+ * ```
+ */
+@RequiresApi(21)
+inline operator fun SizeF.component2() = height
diff --git a/core/ktx/src/main/java/androidx/core/util/SparseArray.kt b/core/ktx/src/main/java/androidx/core/util/SparseArray.kt
new file mode 100644
index 0000000..2b34a46
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/util/SparseArray.kt
@@ -0,0 +1,91 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.core.util
+
+import android.util.SparseArray
+
+/** Returns the number of key/value pairs in the collection. */
+inline val <T> SparseArray<T>.size get() = size()
+
+/** Returns true if the collection contains [key]. */
+inline operator fun <T> SparseArray<T>.contains(key: Int) = indexOfKey(key) >= 0
+
+/** Allows the use of the index operator for storing values in the collection. */
+inline operator fun <T> SparseArray<T>.set(key: Int, value: T) = put(key, value)
+
+/** Creates a new collection by adding or replacing entries from [other]. */
+operator fun <T> SparseArray<T>.plus(other: SparseArray<T>): SparseArray<T> {
+    val new = SparseArray<T>(size() + other.size())
+    new.putAll(this)
+    new.putAll(other)
+    return new
+}
+
+/** Returns true if the collection contains [key]. */
+inline fun <T> SparseArray<T>.containsKey(key: Int) = indexOfKey(key) >= 0
+
+/** Returns true if the collection contains [value]. */
+inline fun <T> SparseArray<T>.containsValue(value: T) = indexOfValue(value) != -1
+
+/** Return the value corresponding to [key], or [defaultValue] when not present. */
+inline fun <T> SparseArray<T>.getOrDefault(key: Int, defaultValue: T) = get(key) ?: defaultValue
+
+/** Return the value corresponding to [key], or from [defaultValue] when not present. */
+inline fun <T> SparseArray<T>.getOrElse(key: Int, defaultValue: () -> T) =
+    get(key) ?: defaultValue()
+
+/** Return true when the collection contains no elements. */
+inline fun <T> SparseArray<T>.isEmpty() = size() == 0
+
+/** Return true when the collection contains elements. */
+inline fun <T> SparseArray<T>.isNotEmpty() = size() != 0
+
+/** Removes the entry for [key] only if it is mapped to [value]. */
+fun <T> SparseArray<T>.remove(key: Int, value: T): Boolean {
+    val index = indexOfKey(key)
+    if (index != -1 && value == valueAt(index)) {
+        removeAt(index)
+        return true
+    }
+    return false
+}
+
+/** Update this collection by adding or replacing entries from [other]. */
+fun <T> SparseArray<T>.putAll(other: SparseArray<T>) = other.forEach(::put)
+
+/** Performs the given [action] for each key/value entry. */
+inline fun <T> SparseArray<T>.forEach(action: (key: Int, value: T) -> Unit) {
+    for (index in 0 until size()) {
+        action(keyAt(index), valueAt(index))
+    }
+}
+
+/** Return an iterator over the collection's keys. */
+fun <T> SparseArray<T>.keyIterator(): IntIterator = object : IntIterator() {
+    var index = 0
+    override fun hasNext() = index < size()
+    override fun nextInt() = keyAt(index++)
+}
+
+/** Return an iterator over the collection's values. */
+fun <T> SparseArray<T>.valueIterator(): Iterator<T> = object : Iterator<T> {
+    var index = 0
+    override fun hasNext() = index < size()
+    override fun next() = valueAt(index++)
+}
diff --git a/core/ktx/src/main/java/androidx/core/util/SparseBooleanArray.kt b/core/ktx/src/main/java/androidx/core/util/SparseBooleanArray.kt
new file mode 100644
index 0000000..b349326
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/util/SparseBooleanArray.kt
@@ -0,0 +1,92 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.core.util
+
+import android.util.SparseBooleanArray
+
+/** Returns the number of key/value pairs in the collection. */
+inline val SparseBooleanArray.size get() = size()
+
+/** Returns true if the collection contains [key]. */
+inline operator fun SparseBooleanArray.contains(key: Int) = indexOfKey(key) >= 0
+
+/** Allows the use of the index operator for storing values in the collection. */
+inline operator fun SparseBooleanArray.set(key: Int, value: Boolean) = put(key, value)
+
+/** Creates a new collection by adding or replacing entries from [other]. */
+operator fun SparseBooleanArray.plus(other: SparseBooleanArray): SparseBooleanArray {
+    val new = SparseBooleanArray(size() + other.size())
+    new.putAll(this)
+    new.putAll(other)
+    return new
+}
+
+/** Returns true if the collection contains [key]. */
+inline fun SparseBooleanArray.containsKey(key: Int) = indexOfKey(key) >= 0
+
+/** Returns true if the collection contains [value]. */
+inline fun SparseBooleanArray.containsValue(value: Boolean) = indexOfValue(value) != -1
+
+/** Return the value corresponding to [key], or [defaultValue] when not present. */
+inline fun SparseBooleanArray.getOrDefault(key: Int, defaultValue: Boolean) = get(key, defaultValue)
+
+/** Return the value corresponding to [key], or from [defaultValue] when not present. */
+inline fun SparseBooleanArray.getOrElse(key: Int, defaultValue: () -> Boolean) =
+    indexOfKey(key).let { if (it != -1) valueAt(it) else defaultValue() }
+
+/** Return true when the collection contains no elements. */
+inline fun SparseBooleanArray.isEmpty() = size() == 0
+
+/** Return true when the collection contains elements. */
+inline fun SparseBooleanArray.isNotEmpty() = size() != 0
+
+/** Removes the entry for [key] only if it is mapped to [value]. */
+fun SparseBooleanArray.remove(key: Int, value: Boolean): Boolean {
+    val index = indexOfKey(key)
+    if (index != -1 && value == valueAt(index)) {
+        // Delete by key because of https://issuetracker.google.com/issues/70934959.
+        delete(key)
+        return true
+    }
+    return false
+}
+
+/** Update this collection by adding or replacing entries from [other]. */
+fun SparseBooleanArray.putAll(other: SparseBooleanArray) = other.forEach(::put)
+
+/** Performs the given [action] for each key/value entry. */
+inline fun SparseBooleanArray.forEach(action: (key: Int, value: Boolean) -> Unit) {
+    for (index in 0 until size()) {
+        action(keyAt(index), valueAt(index))
+    }
+}
+
+/** Return an iterator over the collection's keys. */
+fun SparseBooleanArray.keyIterator(): IntIterator = object : IntIterator() {
+    var index = 0
+    override fun hasNext() = index < size()
+    override fun nextInt() = keyAt(index++)
+}
+
+/** Return an iterator over the collection's values. */
+fun SparseBooleanArray.valueIterator(): BooleanIterator = object : BooleanIterator() {
+    var index = 0
+    override fun hasNext() = index < size()
+    override fun nextBoolean() = valueAt(index++)
+}
diff --git a/core/ktx/src/main/java/androidx/core/util/SparseIntArray.kt b/core/ktx/src/main/java/androidx/core/util/SparseIntArray.kt
new file mode 100644
index 0000000..bba57c6
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/util/SparseIntArray.kt
@@ -0,0 +1,91 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.core.util
+
+import android.util.SparseIntArray
+
+/** Returns the number of key/value pairs in the collection. */
+inline val SparseIntArray.size get() = size()
+
+/** Returns true if the collection contains [key]. */
+inline operator fun SparseIntArray.contains(key: Int) = indexOfKey(key) >= 0
+
+/** Allows the use of the index operator for storing values in the collection. */
+inline operator fun SparseIntArray.set(key: Int, value: Int) = put(key, value)
+
+/** Creates a new collection by adding or replacing entries from [other]. */
+operator fun SparseIntArray.plus(other: SparseIntArray): SparseIntArray {
+    val new = SparseIntArray(size() + other.size())
+    new.putAll(this)
+    new.putAll(other)
+    return new
+}
+
+/** Returns true if the collection contains [key]. */
+inline fun SparseIntArray.containsKey(key: Int) = indexOfKey(key) >= 0
+
+/** Returns true if the collection contains [value]. */
+inline fun SparseIntArray.containsValue(value: Int) = indexOfValue(value) != -1
+
+/** Return the value corresponding to [key], or [defaultValue] when not present. */
+inline fun SparseIntArray.getOrDefault(key: Int, defaultValue: Int) = get(key, defaultValue)
+
+/** Return the value corresponding to [key], or from [defaultValue] when not present. */
+inline fun SparseIntArray.getOrElse(key: Int, defaultValue: () -> Int) =
+    indexOfKey(key).let { if (it != -1) valueAt(it) else defaultValue() }
+
+/** Return true when the collection contains no elements. */
+inline fun SparseIntArray.isEmpty() = size() == 0
+
+/** Return true when the collection contains elements. */
+inline fun SparseIntArray.isNotEmpty() = size() != 0
+
+/** Removes the entry for [key] only if it is mapped to [value]. */
+fun SparseIntArray.remove(key: Int, value: Int): Boolean {
+    val index = indexOfKey(key)
+    if (index != -1 && value == valueAt(index)) {
+        removeAt(index)
+        return true
+    }
+    return false
+}
+
+/** Update this collection by adding or replacing entries from [other]. */
+fun SparseIntArray.putAll(other: SparseIntArray) = other.forEach(::put)
+
+/** Performs the given [action] for each key/value entry. */
+inline fun SparseIntArray.forEach(action: (key: Int, value: Int) -> Unit) {
+    for (index in 0 until size()) {
+        action(keyAt(index), valueAt(index))
+    }
+}
+
+/** Return an iterator over the collection's keys. */
+fun SparseIntArray.keyIterator(): IntIterator = object : IntIterator() {
+    var index = 0
+    override fun hasNext() = index < size()
+    override fun nextInt() = keyAt(index++)
+}
+
+/** Return an iterator over the collection's values. */
+fun SparseIntArray.valueIterator(): IntIterator = object : IntIterator() {
+    var index = 0
+    override fun hasNext() = index < size()
+    override fun nextInt() = valueAt(index++)
+}
diff --git a/core/ktx/src/main/java/androidx/core/util/SparseLongArray.kt b/core/ktx/src/main/java/androidx/core/util/SparseLongArray.kt
new file mode 100644
index 0000000..68b4763
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/util/SparseLongArray.kt
@@ -0,0 +1,107 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.core.util
+
+import android.util.SparseLongArray
+import androidx.annotation.RequiresApi
+
+/** Returns the number of key/value entries in the collection. */
+@get:RequiresApi(18)
+inline val SparseLongArray.size get() = size()
+
+/** Returns true if the collection contains [key]. */
+@RequiresApi(18)
+inline operator fun SparseLongArray.contains(key: Int) = indexOfKey(key) >= 0
+
+/** Allows the use of the index operator for storing values in the collection. */
+@RequiresApi(18)
+inline operator fun SparseLongArray.set(key: Int, value: Long) = put(key, value)
+
+/** Creates a new collection by adding or replacing entries from [other]. */
+@RequiresApi(18)
+operator fun SparseLongArray.plus(other: SparseLongArray): SparseLongArray {
+    val new = SparseLongArray(size() + other.size())
+    new.putAll(this)
+    new.putAll(other)
+    return new
+}
+
+/** Returns true if the collection contains [key]. */
+@RequiresApi(18)
+inline fun SparseLongArray.containsKey(key: Int) = indexOfKey(key) >= 0
+
+/** Returns true if the collection contains [value]. */
+@RequiresApi(18)
+inline fun SparseLongArray.containsValue(value: Long) = indexOfValue(value) != -1
+
+/** Return the value corresponding to [key], or [defaultValue] when not present. */
+@RequiresApi(18)
+inline fun SparseLongArray.getOrDefault(key: Int, defaultValue: Long) = get(key, defaultValue)
+
+/** Return the value corresponding to [key], or from [defaultValue] when not present. */
+@RequiresApi(18)
+inline fun SparseLongArray.getOrElse(key: Int, defaultValue: () -> Long) =
+    indexOfKey(key).let { if (it != -1) valueAt(it) else defaultValue() }
+
+/** Return true when the collection contains no elements. */
+@RequiresApi(18)
+inline fun SparseLongArray.isEmpty() = size() == 0
+
+/** Return true when the collection contains elements. */
+@RequiresApi(18)
+inline fun SparseLongArray.isNotEmpty() = size() != 0
+
+/** Removes the entry for [key] only if it is set to [value]. */
+@RequiresApi(18)
+fun SparseLongArray.remove(key: Int, value: Long): Boolean {
+    val index = indexOfKey(key)
+    if (index != -1 && value == valueAt(index)) {
+        removeAt(index)
+        return true
+    }
+    return false
+}
+
+/** Update this collection by adding or replacing entries from [other]. */
+@RequiresApi(18)
+fun SparseLongArray.putAll(other: SparseLongArray) = other.forEach(::put)
+
+/** Performs the given [action] for each key/value entry. */
+@RequiresApi(18)
+inline fun SparseLongArray.forEach(action: (key: Int, value: Long) -> Unit) {
+    for (index in 0 until size()) {
+        action(keyAt(index), valueAt(index))
+    }
+}
+
+/** Return an iterator over the collection's keys. */
+@RequiresApi(18)
+fun SparseLongArray.keyIterator(): IntIterator = object : IntIterator() {
+    var index = 0
+    override fun hasNext() = index < size()
+    override fun nextInt() = keyAt(index++)
+}
+
+/** Return an iterator over the collection's values. */
+@RequiresApi(18)
+fun SparseLongArray.valueIterator(): LongIterator = object : LongIterator() {
+    var index = 0
+    override fun hasNext() = index < size()
+    override fun nextLong() = valueAt(index++)
+}
diff --git a/core/ktx/src/main/java/androidx/core/view/Menu.kt b/core/ktx/src/main/java/androidx/core/view/Menu.kt
new file mode 100644
index 0000000..7ab479f
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/view/Menu.kt
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.core.view
+
+import android.view.Menu
+import android.view.MenuItem
+
+/**
+ * Returns the menu at [index].
+ *
+ * @throws IndexOutOfBoundsException if index is less than 0 or greater than or equal to the count.
+ */
+inline operator fun Menu.get(index: Int): MenuItem = getItem(index)
+
+/** Returns `true` if [item] is found in this menu. */
+operator fun Menu.contains(item: MenuItem): Boolean {
+    @Suppress("LoopToCallChain")
+    for (index in 0 until size) {
+        if (getItem(index) == item) {
+            return true
+        }
+    }
+    return false
+}
+
+/** Returns the number of items in this menu. */
+inline val Menu.size get() = size()
+
+/** Returns true if this menu contains no items. */
+inline fun Menu.isEmpty() = size() == 0
+
+/** Returns true if this menu contains one or more items. */
+inline fun Menu.isNotEmpty() = size() != 0
+
+/** Performs the given action on each item in this menu. */
+inline fun Menu.forEach(action: (item: MenuItem) -> Unit) {
+    for (index in 0 until size()) {
+        action(getItem(index))
+    }
+}
+
+/** Performs the given action on each item in this menu, providing its sequential index. */
+inline fun Menu.forEachIndexed(action: (index: Int, item: MenuItem) -> Unit) {
+    for (index in 0 until size()) {
+        action(index, getItem(index))
+    }
+}
+
+/** Returns a [MutableIterator] over the items in this menu. */
+operator fun Menu.iterator() = object : MutableIterator<MenuItem> {
+    private var index = 0
+    override fun hasNext() = index < size()
+    override fun next() = getItem(index++) ?: throw IndexOutOfBoundsException()
+    override fun remove() = removeItem(--index)
+}
diff --git a/core/ktx/src/main/java/androidx/core/view/View.kt b/core/ktx/src/main/java/androidx/core/view/View.kt
new file mode 100644
index 0000000..fcb0256
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/view/View.kt
@@ -0,0 +1,287 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to other public API.
+
+package androidx.core.view
+
+import android.graphics.Bitmap
+import android.view.View
+import android.view.ViewGroup
+import android.view.ViewTreeObserver
+import android.view.accessibility.AccessibilityEvent
+import androidx.annotation.Px
+import androidx.annotation.RequiresApi
+import androidx.annotation.StringRes
+import androidx.core.graphics.applyCanvas
+
+/**
+ * Performs the given action when this view is next laid out.
+ *
+ * @see doOnLayout
+ */
+inline fun View.doOnNextLayout(crossinline action: (view: View) -> Unit) {
+    addOnLayoutChangeListener(object : View.OnLayoutChangeListener {
+        override fun onLayoutChange(
+            view: View,
+            left: Int,
+            top: Int,
+            right: Int,
+            bottom: Int,
+            oldLeft: Int,
+            oldTop: Int,
+            oldRight: Int,
+            oldBottom: Int
+        ) {
+            view.removeOnLayoutChangeListener(this)
+            action(view)
+        }
+    })
+}
+
+/**
+ * Performs the given action when this view is laid out. If the view has been laid out and it
+ * has not requested a layout, the action will be performed straight away, otherwise the
+ * action will be performed after the view is next laid out.
+ *
+ * @see doOnNextLayout
+ */
+inline fun View.doOnLayout(crossinline action: (view: View) -> Unit) {
+    if (ViewCompat.isLaidOut(this) && !isLayoutRequested) {
+        action(this)
+    } else {
+        doOnNextLayout {
+            action(it)
+        }
+    }
+}
+
+/**
+ * Performs the given action when the view tree is about to be drawn.
+ */
+inline fun View.doOnPreDraw(crossinline action: (view: View) -> Unit) {
+    val vto = viewTreeObserver
+    vto.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
+        override fun onPreDraw(): Boolean {
+            action(this@doOnPreDraw)
+            when {
+                vto.isAlive -> vto.removeOnPreDrawListener(this)
+                else -> viewTreeObserver.removeOnPreDrawListener(this)
+            }
+            return true
+        }
+    })
+}
+
+/**
+ * Sends [AccessibilityEvent] of type [AccessibilityEvent.TYPE_ANNOUNCEMENT].
+ *
+ * @see View.announceForAccessibility
+ */
+@RequiresApi(16)
+inline fun View.announceForAccessibility(@StringRes resource: Int) {
+    val announcement = resources.getString(resource)
+    announceForAccessibility(announcement)
+}
+
+/**
+ * Updates this view's relative padding. This version of the method allows using named parameters
+ * to just set one or more axes.
+ *
+ * @see View.setPaddingRelative
+ */
+@RequiresApi(17)
+inline fun View.updatePaddingRelative(
+    @Px start: Int = paddingStart,
+    @Px top: Int = paddingTop,
+    @Px end: Int = paddingEnd,
+    @Px bottom: Int = paddingBottom
+) {
+    setPaddingRelative(start, top, end, bottom)
+}
+
+/**
+ * Updates this view's padding. This version of the method allows using named parameters
+ * to just set one or more axes.
+ *
+ * @see View.setPadding
+ */
+inline fun View.updatePadding(
+    @Px left: Int = paddingLeft,
+    @Px top: Int = paddingTop,
+    @Px right: Int = paddingRight,
+    @Px bottom: Int = paddingBottom
+) {
+    setPadding(left, top, right, bottom)
+}
+
+/**
+ * Sets the view's padding. This version of the method sets all axes to the provided size.
+ *
+ * @see View.setPadding
+ */
+inline fun View.setPadding(@Px size: Int) {
+    setPadding(size, size, size, size)
+}
+
+/**
+ * Version of [View.postDelayed] which re-orders the parameters, allowing the action to be placed
+ * outside of parentheses.
+ *
+ * ```
+ * view.postDelayed(200) {
+ *     doSomething()
+ * }
+ * ```
+ *
+ * @return the created Runnable
+ */
+inline fun View.postDelayed(delayInMillis: Long, crossinline action: () -> Unit): Runnable {
+    val runnable = Runnable { action() }
+    postDelayed(runnable, delayInMillis)
+    return runnable
+}
+
+/**
+ * Version of [View.postOnAnimationDelayed] which re-orders the parameters, allowing the action
+ * to be placed outside of parentheses.
+ *
+ * ```
+ * view.postOnAnimationDelayed(16) {
+ *     doSomething()
+ * }
+ * ```
+ *
+ * @return the created Runnable
+ */
+@RequiresApi(16)
+inline fun View.postOnAnimationDelayed(
+    delayInMillis: Long,
+    crossinline action: () -> Unit
+): Runnable {
+    val runnable = Runnable { action() }
+    postOnAnimationDelayed(runnable, delayInMillis)
+    return runnable
+}
+
+/**
+ * Return a [Bitmap] representation of this [View].
+ *
+ * The resulting bitmap will be the same width and height as this view's current layout
+ * dimensions. This does not take into account any transformations such as scale or translation.
+ *
+ * Note, this will use the software rendering pipeline to draw the view to the bitmap. This may
+ * result with different drawing to what is rendered on a hardware accelerated canvas (such as
+ * the device screen).
+ *
+ * If this view has not been laid out this method will throw a [IllegalStateException].
+ *
+ * @param config Bitmap config of the desired bitmap. Defaults to [Bitmap.Config.ARGB_8888].
+ */
+fun View.toBitmap(config: Bitmap.Config = Bitmap.Config.ARGB_8888): Bitmap {
+    if (!ViewCompat.isLaidOut(this)) {
+        throw IllegalStateException("View needs to be laid out before calling toBitmap()")
+    }
+    return Bitmap.createBitmap(width, height, config).applyCanvas(::draw)
+}
+
+/**
+ * Returns true when this view's visibility is [View.VISIBLE], false otherwise.
+ *
+ * ```
+ * if (view.isVisible) {
+ *     // Behavior...
+ * }
+ * ```
+ *
+ * Setting this property to true sets the visibility to [View.VISIBLE], false to [View.GONE].
+ *
+ * ```
+ * view.isVisible = true
+ * ```
+ */
+inline var View.isVisible: Boolean
+    get() = visibility == View.VISIBLE
+    set(value) {
+        visibility = if (value) View.VISIBLE else View.GONE
+    }
+
+/**
+ * Returns true when this view's visibility is [View.INVISIBLE], false otherwise.
+ *
+ * ```
+ * if (view.isInvisible) {
+ *     // Behavior...
+ * }
+ * ```
+ *
+ * Setting this property to true sets the visibility to [View.INVISIBLE], false to [View.VISIBLE].
+ *
+ * ```
+ * view.isInvisible = true
+ * ```
+ */
+inline var View.isInvisible: Boolean
+    get() = visibility == View.INVISIBLE
+    set(value) {
+        visibility = if (value) View.INVISIBLE else View.VISIBLE
+    }
+
+/**
+ * Returns true when this view's visibility is [View.GONE], false otherwise.
+ *
+ * ```
+ * if (view.isGone) {
+ *     // Behavior...
+ * }
+ * ```
+ *
+ * Setting this property to true sets the visibility to [View.GONE], false to [View.VISIBLE].
+ *
+ * ```
+ * view.isGone = true
+ * ```
+ */
+inline var View.isGone: Boolean
+    get() = visibility == View.GONE
+    set(value) {
+        visibility = if (value) View.GONE else View.VISIBLE
+    }
+
+/**
+ * Executes [block] with the View's layoutParams and reassigns the layoutParams with the
+ * updated version.
+ *
+ * @see View.getLayoutParams
+ * @see View.setLayoutParams
+ **/
+inline fun View.updateLayoutParams(block: ViewGroup.LayoutParams.() -> Unit) {
+    updateLayoutParams<ViewGroup.LayoutParams>(block)
+}
+
+/**
+ * Executes [block] with a typed version of the View's layoutParams and reassigns the
+ * layoutParams with the updated version.
+ *
+ * @see View.getLayoutParams
+ * @see View.setLayoutParams
+ **/
+@JvmName("updateLayoutParamsTyped")
+inline fun <reified T : ViewGroup.LayoutParams> View.updateLayoutParams(block: T.() -> Unit) {
+    val params = layoutParams as T
+    block(params)
+    layoutParams = params
+}
diff --git a/core/ktx/src/main/java/androidx/core/view/ViewGroup.kt b/core/ktx/src/main/java/androidx/core/view/ViewGroup.kt
new file mode 100644
index 0000000..8a7152a
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/view/ViewGroup.kt
@@ -0,0 +1,122 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to other public API.
+
+package androidx.core.view
+
+import android.view.View
+import android.view.ViewGroup
+import androidx.annotation.Px
+import androidx.annotation.RequiresApi
+
+/**
+ * Returns the view at [index].
+ *
+ * @throws IndexOutOfBoundsException if index is less than 0 or greater than or equal to the count.
+ */
+operator fun ViewGroup.get(index: Int) =
+    getChildAt(index) ?: throw IndexOutOfBoundsException("Index: $index, Size: $childCount")
+
+/** Returns `true` if [view] is found in this view group. */
+inline operator fun ViewGroup.contains(view: View) = indexOfChild(view) != -1
+
+/** Adds [view] to this view group. */
+inline operator fun ViewGroup.plusAssign(view: View) = addView(view)
+
+/** Removes [view] from this view group. */
+inline operator fun ViewGroup.minusAssign(view: View) = removeView(view)
+
+/** Returns the number of views in this view group. */
+inline val ViewGroup.size get() = childCount
+
+/** Returns true if this view group contains no views. */
+inline fun ViewGroup.isEmpty() = childCount == 0
+
+/** Returns true if this view group contains one or more views. */
+inline fun ViewGroup.isNotEmpty() = childCount != 0
+
+/** Performs the given action on each view in this view group. */
+inline fun ViewGroup.forEach(action: (view: View) -> Unit) {
+    for (index in 0 until childCount) {
+        action(getChildAt(index))
+    }
+}
+
+/** Performs the given action on each view in this view group, providing its sequential index. */
+inline fun ViewGroup.forEachIndexed(action: (index: Int, view: View) -> Unit) {
+    for (index in 0 until childCount) {
+        action(index, getChildAt(index))
+    }
+}
+
+/** Returns a [MutableIterator] over the views in this view group. */
+operator fun ViewGroup.iterator() = object : MutableIterator<View> {
+    private var index = 0
+    override fun hasNext() = index < childCount
+    override fun next() = getChildAt(index++) ?: throw IndexOutOfBoundsException()
+    override fun remove() = removeViewAt(--index)
+}
+
+/** Returns a [Sequence] over the child views in this view group. */
+val ViewGroup.children: Sequence<View>
+    get() = object : Sequence<View> {
+        override fun iterator() = this@children.iterator()
+    }
+
+/**
+ * Sets the margins in the ViewGroup's MarginLayoutParams. This version of the method sets all axes
+ * to the provided size.
+ *
+ * @see ViewGroup.MarginLayoutParams.setMargins
+ */
+inline fun ViewGroup.MarginLayoutParams.setMargins(@Px size: Int) {
+    setMargins(size, size, size, size)
+}
+
+/**
+ * Updates the margins in the [ViewGroup]'s [ViewGroup.MarginLayoutParams].
+ * This version of the method allows using named parameters to just set one or more axes.
+ *
+ * @see ViewGroup.MarginLayoutParams.setMargins
+ */
+inline fun ViewGroup.MarginLayoutParams.updateMargins(
+    @Px left: Int = leftMargin,
+    @Px top: Int = topMargin,
+    @Px right: Int = rightMargin,
+    @Px bottom: Int = bottomMargin
+) {
+    setMargins(left, top, right, bottom)
+}
+
+/**
+ * Updates the relative margins in the ViewGroup's MarginLayoutParams.
+ * This version of the method allows using named parameters to just set one or more axes.
+ *
+ * @see ViewGroup.MarginLayoutParams.setMargins
+ */
+@RequiresApi(17)
+inline fun ViewGroup.MarginLayoutParams.updateMarginsRelative(
+    @Px start: Int = marginStart,
+    @Px top: Int = topMargin,
+    @Px end: Int = marginEnd,
+    @Px bottom: Int = bottomMargin
+) {
+    marginStart = start
+    topMargin = top
+    marginEnd = end
+    bottomMargin = bottom
+}
diff --git a/core/ktx/src/main/java/androidx/core/widget/Toast.kt b/core/ktx/src/main/java/androidx/core/widget/Toast.kt
new file mode 100644
index 0000000..b0ddfd1
--- /dev/null
+++ b/core/ktx/src/main/java/androidx/core/widget/Toast.kt
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.core.widget
+
+import android.content.Context
+import android.widget.Toast
+import androidx.annotation.StringRes
+
+/**
+ * Creates and shows a [Toast] with the given [text]
+ *
+ * @param duration Toast duration, defaults to [Toast.LENGTH_SHORT]
+ */
+inline fun Context.toast(text: CharSequence, duration: Int = Toast.LENGTH_SHORT): Toast {
+    return Toast.makeText(this, text, duration).apply { show() }
+}
+
+/**
+ * Creates and shows a [Toast] with text from a resource
+ *
+ * @param resId Resource id of the string resource to use
+ * @param duration Toast duration, defaults to [Toast.LENGTH_SHORT]
+ */
+inline fun Context.toast(@StringRes resId: Int, duration: Int = Toast.LENGTH_SHORT): Toast {
+    return Toast.makeText(this, resId, duration).apply { show() }
+}
diff --git a/emoji/core/api/current.txt b/emoji/core/api/current.txt
index 785f44a..7b343a1 100644
--- a/emoji/core/api/current.txt
+++ b/emoji/core/api/current.txt
@@ -9,6 +9,7 @@
     method public boolean hasEmojiGlyph(java.lang.CharSequence);
     method public boolean hasEmojiGlyph(java.lang.CharSequence, int);
     method public static androidx.emoji.text.EmojiCompat init(androidx.emoji.text.EmojiCompat.Config);
+    method public void load();
     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);
@@ -17,9 +18,12 @@
     method public void unregisterInitCallback(androidx.emoji.text.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_DEFAULT = 3; // 0x3
     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 LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 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
@@ -31,6 +35,7 @@
     method public androidx.emoji.text.EmojiCompat.Config registerInitCallback(androidx.emoji.text.EmojiCompat.InitCallback);
     method public androidx.emoji.text.EmojiCompat.Config setEmojiSpanIndicatorColor(int);
     method public androidx.emoji.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji.text.EmojiCompat.Config setMetadataLoadStrategy(int);
     method public androidx.emoji.text.EmojiCompat.Config setReplaceAll(boolean);
     method public androidx.emoji.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
     method public androidx.emoji.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer>);
diff --git a/emoji/core/src/androidTest/java/androidx/emoji/text/ConfigTest.java b/emoji/core/src/androidTest/java/androidx/emoji/text/ConfigTest.java
index 34f31fd..c8d3dad 100644
--- a/emoji/core/src/androidTest/java/androidx/emoji/text/ConfigTest.java
+++ b/emoji/core/src/androidTest/java/androidx/emoji/text/ConfigTest.java
@@ -26,6 +26,7 @@
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
@@ -148,9 +149,25 @@
         assertTrue(emojiCompat.isEmojiSpanIndicatorEnabled());
     }
 
+    @Test
+    public void testBuild_manualLoadStrategy_doesNotCallMetadataLoaderLoad() {
+        final EmojiCompat.MetadataRepoLoader loader = mock(EmojiCompat.MetadataRepoLoader.class);
+        final EmojiCompat.Config config = new ValidTestConfig(loader)
+                .setMetadataLoadStrategy(EmojiCompat.LOAD_STRATEGY_MANUAL);
+
+        EmojiCompat.reset(config);
+
+        verify(loader, never()).load(any(EmojiCompat.MetadataRepoLoaderCallback.class));
+        assertEquals(EmojiCompat.LOAD_STATE_DEFAULT, EmojiCompat.get().getLoadState());
+    }
+
     private static class ValidTestConfig extends EmojiCompat.Config {
         ValidTestConfig() {
             super(new TestConfigBuilder.TestEmojiDataLoader());
         }
+
+        ValidTestConfig(EmojiCompat.MetadataRepoLoader loader) {
+            super(loader);
+        }
     }
 }
diff --git a/emoji/core/src/androidTest/java/androidx/emoji/text/EmojiCompatTest.java b/emoji/core/src/androidTest/java/androidx/emoji/text/EmojiCompatTest.java
index dd8f3b9..fd9df56 100644
--- a/emoji/core/src/androidTest/java/androidx/emoji/text/EmojiCompatTest.java
+++ b/emoji/core/src/androidTest/java/androidx/emoji/text/EmojiCompatTest.java
@@ -53,6 +53,7 @@
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
@@ -691,6 +692,97 @@
         metadataLoader.getLoaderLatch().countDown();
     }
 
+    @Test(expected = IllegalStateException.class)
+    public void testLoad_throwsException_whenLoadStrategyDefault() {
+        final EmojiCompat.MetadataRepoLoader loader = mock(EmojiCompat.MetadataRepoLoader.class);
+        final EmojiCompat.Config config = new TestConfigBuilder.TestConfig(loader);
+        EmojiCompat.reset(config);
+
+        EmojiCompat.get().load();
+    }
+
+    @Test
+    @SdkSuppress(maxSdkVersion = 18)
+    public void testLoad_pre19() {
+        final EmojiCompat.MetadataRepoLoader loader = spy(new TestConfigBuilder
+                .TestEmojiDataLoader());
+        final EmojiCompat.Config config = new TestConfigBuilder.TestConfig(loader)
+                .setMetadataLoadStrategy(EmojiCompat.LOAD_STRATEGY_MANUAL);
+
+        EmojiCompat.reset(config);
+
+        verify(loader, never()).load(any(EmojiCompat.MetadataRepoLoaderCallback.class));
+        assertEquals(EmojiCompat.LOAD_STATE_DEFAULT, EmojiCompat.get().getLoadState());
+
+        EmojiCompat.get().load();
+        assertEquals(EmojiCompat.LOAD_STATE_SUCCEEDED, EmojiCompat.get().getLoadState());
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 19)
+    public void testLoad_startsLoading() {
+        final EmojiCompat.MetadataRepoLoader loader = spy(new TestConfigBuilder
+                .TestEmojiDataLoader());
+        final EmojiCompat.Config config = new TestConfigBuilder.TestConfig(loader)
+                .setMetadataLoadStrategy(EmojiCompat.LOAD_STRATEGY_MANUAL);
+
+        EmojiCompat.reset(config);
+
+        verify(loader, never()).load(any(EmojiCompat.MetadataRepoLoaderCallback.class));
+        assertEquals(EmojiCompat.LOAD_STATE_DEFAULT, EmojiCompat.get().getLoadState());
+
+        EmojiCompat.get().load();
+        verify(loader, times(1)).load(any(EmojiCompat.MetadataRepoLoaderCallback.class));
+        assertEquals(EmojiCompat.LOAD_STATE_SUCCEEDED, EmojiCompat.get().getLoadState());
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 19)
+    public void testLoad_onceSuccessDoesNotStartLoading() {
+        final EmojiCompat.MetadataRepoLoader loader = spy(new TestConfigBuilder
+                .TestEmojiDataLoader());
+        final EmojiCompat.Config config = new TestConfigBuilder.TestConfig(loader)
+                .setMetadataLoadStrategy(EmojiCompat.LOAD_STRATEGY_MANUAL);
+
+        EmojiCompat.reset(config);
+
+        EmojiCompat.get().load();
+        verify(loader, times(1)).load(any(EmojiCompat.MetadataRepoLoaderCallback.class));
+        assertEquals(EmojiCompat.LOAD_STATE_SUCCEEDED, EmojiCompat.get().getLoadState());
+
+        reset(loader);
+        EmojiCompat.get().load();
+        verify(loader, never()).load(any(EmojiCompat.MetadataRepoLoaderCallback.class));
+        assertEquals(EmojiCompat.LOAD_STATE_SUCCEEDED, EmojiCompat.get().getLoadState());
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 19)
+    public void testLoad_onceLoadingDoesNotStartLoading() throws InterruptedException {
+        final TestConfigBuilder.WaitingDataLoader loader = spy(
+                new TestConfigBuilder.WaitingDataLoader(true /*success*/));
+        final EmojiCompat.Config config = new TestConfigBuilder.TestConfig(loader)
+                .setMetadataLoadStrategy(EmojiCompat.LOAD_STRATEGY_MANUAL);
+
+        EmojiCompat.reset(config);
+
+        verify(loader, never()).load(any(EmojiCompat.MetadataRepoLoaderCallback.class));
+
+        EmojiCompat.get().load();
+        verify(loader, times(1)).load(any(EmojiCompat.MetadataRepoLoaderCallback.class));
+        assertEquals(EmojiCompat.get().getLoadState(), EmojiCompat.LOAD_STATE_LOADING);
+
+        reset(loader);
+
+        EmojiCompat.get().load();
+        verify(loader, never()).load(any(EmojiCompat.MetadataRepoLoaderCallback.class));
+
+        loader.getLoaderLatch().countDown();
+        loader.getTestLatch().await();
+
+        assertEquals(EmojiCompat.get().getLoadState(), EmojiCompat.LOAD_STATE_SUCCEEDED);
+    }
+
     @Test
     @SdkSuppress(maxSdkVersion = 18)
     public void testGetAssetSignature() {
diff --git a/emoji/core/src/androidTest/java/androidx/emoji/widget/EmojiInputFilterTest.java b/emoji/core/src/androidTest/java/androidx/emoji/widget/EmojiInputFilterTest.java
index 27ea7c6..2882858 100644
--- a/emoji/core/src/androidTest/java/androidx/emoji/widget/EmojiInputFilterTest.java
+++ b/emoji/core/src/androidTest/java/androidx/emoji/widget/EmojiInputFilterTest.java
@@ -114,4 +114,16 @@
         verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt());
         verify(mEmojiCompat, times(0)).registerInitCallback(any(EmojiCompat.InitCallback.class));
     }
+
+    @Test
+    public void testFilter_withManualLoadStrategy() {
+        final Spannable testString = new SpannableString("abc");
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_DEFAULT);
+
+        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);
+
+        assertNotNull(result);
+        verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt());
+        verify(mEmojiCompat, times(1)).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
 }
diff --git a/emoji/core/src/androidTest/java/androidx/emoji/widget/EmojiTextWatcherTest.java b/emoji/core/src/androidTest/java/androidx/emoji/widget/EmojiTextWatcherTest.java
index fade6f7..b8f0154 100644
--- a/emoji/core/src/androidTest/java/androidx/emoji/widget/EmojiTextWatcherTest.java
+++ b/emoji/core/src/androidTest/java/androidx/emoji/widget/EmojiTextWatcherTest.java
@@ -109,4 +109,15 @@
         verify(mEmojiCompat, times(1)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(),
                 eq(EmojiCompat.REPLACE_STRATEGY_ALL));
     }
+
+    @Test
+    public void testFilter_withManualLoadStrategy() {
+        final Spannable testString = new SpannableString("abc");
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_DEFAULT);
+
+        mTextWatcher.onTextChanged(testString, 0, 0, 1);
+
+        verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt());
+        verify(mEmojiCompat, times(1)).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
 }
diff --git a/emoji/core/src/androidTest/java/androidx/emoji/widget/EmojiTransformationMethodTest.java b/emoji/core/src/androidTest/java/androidx/emoji/widget/EmojiTransformationMethodTest.java
new file mode 100644
index 0000000..cf74331
--- /dev/null
+++ b/emoji/core/src/androidTest/java/androidx/emoji/widget/EmojiTransformationMethodTest.java
@@ -0,0 +1,158 @@
+/*
+ * 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.emoji.widget;
+
+import static junit.framework.TestCase.assertSame;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.same;
+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.when;
+
+import static androidx.emoji.util.EmojiMatcher.sameCharSequence;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.TextUtils;
+import android.text.method.TransformationMethod;
+import android.view.View;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import androidx.emoji.text.EmojiCompat;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class EmojiTransformationMethodTest {
+
+    private EmojiTransformationMethod mTransformationMethod;
+    private TransformationMethod mWrappedTransformationMethod;
+    private View mView;
+    private EmojiCompat mEmojiCompat;
+    private final String mTestString = "abc";
+
+    @Before
+    public void setup() {
+        mEmojiCompat = mock(EmojiCompat.class);
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_SUCCEEDED);
+        when(mEmojiCompat.process(any(CharSequence.class))).thenAnswer(new Answer<CharSequence>() {
+            @Override
+            public CharSequence answer(InvocationOnMock invocation) {
+                Object[] args = invocation.getArguments();
+                return new SpannableString((String) args[0]);
+            }
+        });
+        EmojiCompat.reset(mEmojiCompat);
+
+        mView = mock(View.class);
+        when(mView.isInEditMode()).thenReturn(false);
+
+        mWrappedTransformationMethod = mock(TransformationMethod.class);
+        when(mWrappedTransformationMethod.getTransformation(any(CharSequence.class),
+                any(View.class))).thenAnswer(new Answer<CharSequence>() {
+            @Override
+            public CharSequence answer(InvocationOnMock invocation) {
+                Object[] args = invocation.getArguments();
+                return (String) args[0];
+            }
+        });
+
+        mTransformationMethod = new EmojiTransformationMethod(mWrappedTransformationMethod);
+    }
+
+    @Test
+    public void testFilter_withNullSource() {
+        assertNull(mTransformationMethod.getTransformation(null, mView));
+        verify(mEmojiCompat, never()).process(any(CharSequence.class));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testFilter_withNullView() {
+        mTransformationMethod.getTransformation("", null);
+    }
+
+    @Test
+    public void testFilter_withNullTransformationMethod() {
+        mTransformationMethod = new EmojiTransformationMethod(null);
+
+        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
+
+        assertTrue(TextUtils.equals(new SpannableString(mTestString), result));
+        verify(mEmojiCompat, times(1)).process(sameCharSequence(mTestString));
+    }
+
+    @Test
+    public void testFilter() {
+        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
+
+        assertTrue(TextUtils.equals(new SpannableString(mTestString), result));
+        assertTrue(result instanceof Spannable);
+        verify(mWrappedTransformationMethod, times(1)).getTransformation(
+                sameCharSequence(mTestString), same(mView));
+        verify(mEmojiCompat, times(1)).process(sameCharSequence(mTestString));
+        verify(mEmojiCompat, never()).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+
+    @Test
+    public void testFilter_whenEmojiCompatLoading() {
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_LOADING);
+
+        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
+
+        assertSame(mTestString, result);
+        verify(mWrappedTransformationMethod, times(1)).getTransformation(
+                sameCharSequence(mTestString), same(mView));
+        verify(mEmojiCompat, never()).process(sameCharSequence(mTestString));
+        verify(mEmojiCompat, never()).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+
+    @Test
+    public void testFilter_whenEmojiCompatLoadFailed() {
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_FAILED);
+
+        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
+
+        assertSame(mTestString, result);
+        verify(mWrappedTransformationMethod, times(1)).getTransformation(
+                sameCharSequence(mTestString), same(mView));
+        verify(mEmojiCompat, never()).process(sameCharSequence(mTestString));
+        verify(mEmojiCompat, never()).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+
+    @Test
+    public void testFilter_withManualLoadStrategy() {
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_DEFAULT);
+
+        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
+
+        assertSame(mTestString, result);
+        verify(mWrappedTransformationMethod, times(1)).getTransformation(
+                sameCharSequence(mTestString), same(mView));
+        verify(mEmojiCompat, never()).process(sameCharSequence(mTestString));
+        verify(mEmojiCompat, never()).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+}
diff --git a/emoji/core/src/main/java/androidx/emoji/text/EmojiCompat.java b/emoji/core/src/main/java/androidx/emoji/text/EmojiCompat.java
index 31d359d..572606f 100644
--- a/emoji/core/src/main/java/androidx/emoji/text/EmojiCompat.java
+++ b/emoji/core/src/main/java/androidx/emoji/text/EmojiCompat.java
@@ -61,7 +61,9 @@
  * <pre><code>EmojiCompat.init(&#47;* a config instance *&#47;);</code></pre>
  * <p/>
  * It is suggested to make the initialization as early as possible in your app. Please check {@link
- * EmojiCompat.Config} for more configuration parameters.
+ * EmojiCompat.Config} for more configuration parameters. Once {@link #init(EmojiCompat.Config)} is
+ * called a singleton instance will be created. Any call after that will not create a new instance
+ * and will return immediately.
  * <p/>
  * During initialization information about emojis is loaded on a background thread. Before the
  * EmojiCompat instance is initialized, calls to functions such as {@link
@@ -96,6 +98,11 @@
             "android.support.text.emoji.emojiCompat_replaceAll";
 
     /**
+     * EmojiCompat instance is constructed, however the initialization did not start yet.
+     */
+    public static final int LOAD_STATE_DEFAULT = 3;
+
+    /**
      * EmojiCompat is initializing.
      */
     public static final int LOAD_STATE_LOADING = 0;
@@ -115,7 +122,7 @@
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP)
-    @IntDef({LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED, LOAD_STATE_FAILED})
+    @IntDef({LOAD_STATE_DEFAULT, LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED, LOAD_STATE_FAILED})
     @Retention(RetentionPolicy.SOURCE)
     public @interface LoadState {
     }
@@ -145,6 +152,26 @@
     }
 
     /**
+     * {@link EmojiCompat} will start loading metadata when {@link #init(Config)} is called.
+     */
+    public static final int LOAD_STRATEGY_DEFAULT = 0;
+
+    /**
+     * {@link EmojiCompat} will wait for {@link #load()} to be called by developer in order to
+     * start loading metadata.
+     */
+    public static final int LOAD_STRATEGY_MANUAL = 1;
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY_GROUP)
+    @IntDef({LOAD_STRATEGY_DEFAULT, LOAD_STRATEGY_MANUAL})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface LoadStrategy {
+    }
+
+    /**
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP)
@@ -205,18 +232,25 @@
     private final int mEmojiSpanIndicatorColor;
 
     /**
+     * @see Config#setMetadataLoadStrategy(int)
+     */
+    @LoadStrategy private final int mMetadataLoadStrategy;
+
+    /**
      * Private constructor for singleton instance.
      *
      * @see #init(Config)
      */
     private EmojiCompat(@NonNull final Config config) {
         mInitLock = new ReentrantReadWriteLock();
+        mLoadState = LOAD_STATE_DEFAULT;
         mReplaceAll = config.mReplaceAll;
         mUseEmojiAsDefaultStyle = config.mUseEmojiAsDefaultStyle;
         mEmojiAsDefaultStyleExceptions = config.mEmojiAsDefaultStyleExceptions;
         mEmojiSpanIndicatorEnabled = config.mEmojiSpanIndicatorEnabled;
         mEmojiSpanIndicatorColor = config.mEmojiSpanIndicatorColor;
         mMetadataLoader = config.mMetadataLoader;
+        mMetadataLoadStrategy = config.mMetadataLoadStrategy;
         mMainHandler = new Handler(Looper.getMainLooper());
         mInitCallbacks = new ArraySet<>();
         if (config.mInitCallbacks != null && !config.mInitCallbacks.isEmpty()) {
@@ -230,7 +264,9 @@
     /**
      * Initialize the singleton instance with a configuration. When used on devices running API 18
      * or below, the singleton instance is immediately moved into {@link #LOAD_STATE_SUCCEEDED}
-     * state without loading any metadata.
+     * state without loading any metadata. When called for the first time, the library will create
+     * the singleton instance and any call after that will not create a new instance and return
+     * immediately.
      *
      * @see EmojiCompat.Config
      */
@@ -304,9 +340,30 @@
         }
     }
 
-    private void loadMetadata() {
+    /**
+     * When {@link Config#setMetadataLoadStrategy(int)} is set to {@link #LOAD_STRATEGY_MANUAL},
+     * this function starts loading the metadata. Calling the function when
+     * {@link Config#setMetadataLoadStrategy(int)} is {@code not} set to
+     * {@link #LOAD_STRATEGY_MANUAL} will throw an exception. The load will {@code not} start if:
+     * <ul>
+     *     <li>the metadata is already loaded successfully and {@link #getLoadState()} is
+     *     {@link #LOAD_STATE_SUCCEEDED}.
+     *     </li>
+     *      <li>a previous load attempt is not finished yet and {@link #getLoadState()} is
+     *     {@link #LOAD_STATE_LOADING}.</li>
+     * </ul>
+     *
+     * @throws IllegalStateException when {@link Config#setMetadataLoadStrategy(int)} is not set
+     * to {@link #LOAD_STRATEGY_MANUAL}
+     */
+    public void load() {
+        Preconditions.checkState(mMetadataLoadStrategy == LOAD_STRATEGY_MANUAL,
+                "Set metadataLoadStrategy to LOAD_STRATEGY_MANUAL to execute manual loading");
+        if (isInitialized()) return;
+
         mInitLock.writeLock().lock();
         try {
+            if (mLoadState == LOAD_STATE_LOADING) return;
             mLoadState = LOAD_STATE_LOADING;
         } finally {
             mInitLock.writeLock().unlock();
@@ -315,6 +372,21 @@
         mHelper.loadMetadata();
     }
 
+    private void loadMetadata() {
+        mInitLock.writeLock().lock();
+        try {
+            if (mMetadataLoadStrategy == LOAD_STRATEGY_DEFAULT) {
+                mLoadState = LOAD_STATE_LOADING;
+            }
+        } finally {
+            mInitLock.writeLock().unlock();
+        }
+
+        if (getLoadState() == LOAD_STATE_LOADING) {
+            mHelper.loadMetadata();
+        }
+    }
+
     private void onMetadataLoadSuccess() {
         final Collection<InitCallback> initCallbacks = new ArrayList<>();
         mInitLock.writeLock().lock();
@@ -389,8 +461,8 @@
      * Returns loading state of the EmojiCompat instance. When used on devices running API 18 or
      * below always returns {@link #LOAD_STATE_SUCCEEDED}.
      *
-     * @return one of {@link #LOAD_STATE_LOADING}, {@link #LOAD_STATE_SUCCEEDED},
-     * {@link #LOAD_STATE_FAILED}
+     * @return one of {@link #LOAD_STATE_DEFAULT}, {@link #LOAD_STATE_LOADING},
+     * {@link #LOAD_STATE_SUCCEEDED}, {@link #LOAD_STATE_FAILED}
      */
     public @LoadState int getLoadState() {
         mInitLock.readLock().lock();
@@ -805,6 +877,7 @@
         private Set<InitCallback> mInitCallbacks;
         private boolean mEmojiSpanIndicatorEnabled;
         private int mEmojiSpanIndicatorColor = Color.GREEN;
+        @LoadStrategy private int mMetadataLoadStrategy = LOAD_STRATEGY_DEFAULT;
 
         /**
          * Default constructor.
@@ -938,6 +1011,21 @@
         }
 
         /**
+         * Determines the strategy to start loading the metadata. By default {@link EmojiCompat}
+         * will start loading the metadata during {@link EmojiCompat#init(Config)}. When set to
+         * {@link EmojiCompat#LOAD_STRATEGY_MANUAL}, you should call {@link EmojiCompat#load()} to
+         * initiate metadata loading.
+         *
+         * @param strategy one of {@link EmojiCompat#LOAD_STRATEGY_DEFAULT},
+         *                  {@link EmojiCompat#LOAD_STRATEGY_MANUAL}
+         *
+         */
+        public Config setMetadataLoadStrategy(@LoadStrategy int strategy) {
+            mMetadataLoadStrategy = strategy;
+            return this;
+        }
+
+        /**
          * Returns the {@link MetadataRepoLoader}.
          */
         protected final MetadataRepoLoader getMetadataRepoLoader() {
diff --git a/emoji/core/src/main/java/androidx/emoji/widget/EmojiInputFilter.java b/emoji/core/src/main/java/androidx/emoji/widget/EmojiInputFilter.java
index 22837a6..b44e859 100644
--- a/emoji/core/src/main/java/androidx/emoji/widget/EmojiInputFilter.java
+++ b/emoji/core/src/main/java/androidx/emoji/widget/EmojiInputFilter.java
@@ -79,6 +79,7 @@
 
                 return source;
             case EmojiCompat.LOAD_STATE_LOADING:
+            case EmojiCompat.LOAD_STATE_DEFAULT:
                 EmojiCompat.get().registerInitCallback(getInitCallback());
                 return source;
 
diff --git a/emoji/core/src/main/java/androidx/emoji/widget/EmojiTextWatcher.java b/emoji/core/src/main/java/androidx/emoji/widget/EmojiTextWatcher.java
index 5d0e552..2197aff 100644
--- a/emoji/core/src/main/java/androidx/emoji/widget/EmojiTextWatcher.java
+++ b/emoji/core/src/main/java/androidx/emoji/widget/EmojiTextWatcher.java
@@ -80,6 +80,7 @@
                             mEmojiReplaceStrategy);
                     break;
                 case EmojiCompat.LOAD_STATE_LOADING:
+                case EmojiCompat.LOAD_STATE_DEFAULT:
                     EmojiCompat.get().registerInitCallback(getInitCallback());
                     break;
                 case EmojiCompat.LOAD_STATE_FAILED:
diff --git a/emoji/core/src/main/java/androidx/emoji/widget/EmojiTransformationMethod.java b/emoji/core/src/main/java/androidx/emoji/widget/EmojiTransformationMethod.java
index c082c83..81fe615 100644
--- a/emoji/core/src/main/java/androidx/emoji/widget/EmojiTransformationMethod.java
+++ b/emoji/core/src/main/java/androidx/emoji/widget/EmojiTransformationMethod.java
@@ -57,6 +57,7 @@
                     return EmojiCompat.get().process(source);
                 case EmojiCompat.LOAD_STATE_LOADING:
                 case EmojiCompat.LOAD_STATE_FAILED:
+                case EmojiCompat.LOAD_STATE_DEFAULT:
                 default:
                     break;
             }
diff --git a/fragment/ktx/OWNERS b/fragment/ktx/OWNERS
new file mode 100644
index 0000000..e450f4c
--- /dev/null
+++ b/fragment/ktx/OWNERS
@@ -0,0 +1 @@
+jakew@google.com
diff --git a/fragment/ktx/build.gradle b/fragment/ktx/build.gradle
new file mode 100644
index 0000000..52cb265
--- /dev/null
+++ b/fragment/ktx/build.gradle
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+    id("org.jetbrains.kotlin.android")
+}
+
+android {
+    buildTypes {
+        debug {
+            testCoverageEnabled = false // Breaks Kotlin compiler.
+        }
+    }
+}
+
+dependencies {
+    api(project(":fragment"))
+    api(KOTLIN_STDLIB)
+    androidTestImplementation(JUNIT)
+    androidTestImplementation(TRUTH)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(TEST_RULES_TMP, libs.exclude_for_espresso)
+}
+
+supportLibrary {
+    name = "Fragment Kotlin Extensions"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.FRAGMENT
+    inceptionYear = "2018"
+    description = "Kotlin extensions for 'fragment' artifact"
+}
diff --git a/fragment/ktx/src/androidTest/AndroidManifest.xml b/fragment/ktx/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..0a62e3e
--- /dev/null
+++ b/fragment/ktx/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="androidx.fragment.ktx">
+    <application>
+        <activity android:name="androidx.fragment.app.TestActivity"/>
+    </application>
+</manifest>
diff --git a/fragment/ktx/src/androidTest/java/androidx/fragment/app/FragmentManagerTest.kt b/fragment/ktx/src/androidTest/java/androidx/fragment/app/FragmentManagerTest.kt
new file mode 100644
index 0000000..7097955
--- /dev/null
+++ b/fragment/ktx/src/androidTest/java/androidx/fragment/app/FragmentManagerTest.kt
@@ -0,0 +1,59 @@
+package androidx.fragment.app
+
+import android.support.test.annotation.UiThreadTest
+import android.support.test.filters.MediumTest
+import android.support.test.rule.ActivityTestRule
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+
+@MediumTest
+class FragmentManagerTest {
+    @get:Rule val activityRule = ActivityTestRule<TestActivity>(TestActivity::class.java)
+    private val fragmentManager get() = activityRule.activity.supportFragmentManager
+
+    @UiThreadTest
+    @Test fun transaction() {
+        val fragment = TestFragment()
+        fragmentManager.transaction {
+            add(fragment, null)
+        }
+        assertThat(fragmentManager.fragments).doesNotContain(fragment)
+        fragmentManager.executePendingTransactions()
+        assertThat(fragmentManager.fragments).contains(fragment)
+    }
+
+    @UiThreadTest
+    @Test fun transactionNow() {
+        val fragment = TestFragment()
+        fragmentManager.transaction(now = true) {
+            add(fragment, null)
+        }
+        assertThat(fragmentManager.fragments).contains(fragment)
+    }
+
+    @UiThreadTest
+    @Test fun transactionAllowingStateLoss() {
+        // Use a detached FragmentManager to ensure state loss.
+        val fragmentManager = FragmentManagerImpl()
+
+        fragmentManager.transaction(allowStateLoss = true) {
+            add(TestFragment(), null)
+        }
+        assertThat(fragmentManager.fragments).isEmpty()
+    }
+
+    @UiThreadTest
+    @Test fun transactionNowAllowingStateLoss() {
+        // Use a detached FragmentManager to ensure state loss.
+        val fragmentManager = FragmentManagerImpl()
+
+        fragmentManager.transaction(now = true, allowStateLoss = true) {
+            add(TestFragment(), null)
+        }
+        assertThat(fragmentManager.fragments).isEmpty()
+    }
+}
+
+class TestActivity : FragmentActivity()
+class TestFragment : Fragment()
diff --git a/fragment/ktx/src/main/AndroidManifest.xml b/fragment/ktx/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..cd21eb1
--- /dev/null
+++ b/fragment/ktx/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?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.
+-->
+<manifest package="androidx.fragment.ktx"/>
diff --git a/fragment/ktx/src/main/java/androidx/fragment/app/FragmentManager.kt b/fragment/ktx/src/main/java/androidx/fragment/app/FragmentManager.kt
new file mode 100644
index 0000000..d9e8e96
--- /dev/null
+++ b/fragment/ktx/src/main/java/androidx/fragment/app/FragmentManager.kt
@@ -0,0 +1,52 @@
+/*
+ * 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.fragment.app
+
+/**
+ * Run [body] in a [FragmentTransaction] which is automatically committed if it completes without
+ * exception.
+ *
+ * One of four commit functions will be used based on the values of `now` and `allowStateLoss`:
+ *
+ * | `now` | `allowStateLoss` | Method                         |
+ * | ----- | ---------------- | ------------------------------ |
+ * | false | false            | `commit()`                     |
+ * | false | true             | `commitAllowingStateLoss()`    |
+ * | true  | false            | `commitNow()`                  |
+ * | true  | true             | `commitNowAllowingStateLoss()` |
+ */
+inline fun FragmentManager.transaction(
+    now: Boolean = false,
+    allowStateLoss: Boolean = false,
+    body: FragmentTransaction.() -> Unit
+) {
+    val transaction = beginTransaction()
+    transaction.body()
+    if (now) {
+        if (allowStateLoss) {
+            transaction.commitNowAllowingStateLoss()
+        } else {
+            transaction.commitNow()
+        }
+    } else {
+        if (allowStateLoss) {
+            transaction.commitAllowingStateLoss()
+        } else {
+            transaction.commit()
+        }
+    }
+}
diff --git a/heifwriter/api/current.txt b/heifwriter/api/current.txt
index c7311ba..3c39776 100644
--- a/heifwriter/api/current.txt
+++ b/heifwriter/api/current.txt
@@ -1,8 +1,6 @@
 package androidx.heifwriter {
 
   public final class HeifWriter implements java.lang.AutoCloseable {
-    ctor public HeifWriter(java.lang.String, int, int, boolean, int, int, int, int, android.os.Handler) throws java.io.IOException;
-    ctor public HeifWriter(java.io.FileDescriptor, int, int, boolean, int, int, int, int, android.os.Handler) throws java.io.IOException;
     method public void addBitmap(android.graphics.Bitmap);
     method public void addYuvBuffer(int, byte[]);
     method public void close();
@@ -15,5 +13,17 @@
     field public static final int INPUT_MODE_SURFACE = 1; // 0x1
   }
 
+  public static final class HeifWriter.Builder {
+    ctor public HeifWriter.Builder(java.lang.String, int, int, int);
+    ctor public HeifWriter.Builder(java.io.FileDescriptor, int, int, int);
+    method public androidx.heifwriter.HeifWriter build() throws java.io.IOException;
+    method public androidx.heifwriter.HeifWriter.Builder setGridEnabled(boolean);
+    method public androidx.heifwriter.HeifWriter.Builder setHandler(android.os.Handler);
+    method public androidx.heifwriter.HeifWriter.Builder setMaxImages(int);
+    method public androidx.heifwriter.HeifWriter.Builder setPrimaryIndex(int);
+    method public androidx.heifwriter.HeifWriter.Builder setQuality(int);
+    method public androidx.heifwriter.HeifWriter.Builder setRotation(int);
+  }
+
 }
 
diff --git a/heifwriter/src/androidTest/java/androidx/heifwriter/HeifWriterTest.java b/heifwriter/src/androidTest/java/androidx/heifwriter/HeifWriterTest.java
index 99f47d2..127ba1c 100644
--- a/heifwriter/src/androidTest/java/androidx/heifwriter/HeifWriterTest.java
+++ b/heifwriter/src/androidTest/java/androidx/heifwriter/HeifWriterTest.java
@@ -18,12 +18,6 @@
 
 import static android.support.test.InstrumentationRegistry.getContext;
 
-import static androidx.heifwriter.HeifWriter.INPUT_MODE_BITMAP;
-import static androidx.heifwriter.HeifWriter.INPUT_MODE_BUFFER;
-import static androidx.heifwriter.HeifWriter.INPUT_MODE_SURFACE;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
 import android.graphics.Bitmap;
 import android.graphics.ImageFormat;
 import android.media.MediaExtractor;
@@ -34,13 +28,21 @@
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Process;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import android.support.test.filters.LargeTest;
 import android.support.test.runner.AndroidJUnit4;
 import android.util.Log;
+
+import static androidx.heifwriter.HeifWriter.INPUT_MODE_BITMAP;
+import static androidx.heifwriter.HeifWriter.INPUT_MODE_BUFFER;
+import static androidx.heifwriter.HeifWriter.INPUT_MODE_SURFACE;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.heifwriter.test.R;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -222,7 +224,11 @@
     }
 
     private void doTestForVariousNumberImages(TestConfig.Builder builder) throws Exception {
-        doTest(builder.setNumImages(4).build());
+        builder.setNumImages(4);
+        doTest(builder.setRotation(270).build());
+        doTest(builder.setRotation(180).build());
+        doTest(builder.setRotation(90).build());
+        doTest(builder.setRotation(0).build());
         doTest(builder.setNumImages(1).build());
         doTest(builder.setNumImages(8).build());
     }
@@ -250,102 +256,109 @@
     }
 
     private static class TestConfig {
-        final int inputMode;
-        final boolean useGrid;
-        final boolean useHandler;
-        final int maxNumImages;
-        final int numImages;
-        final int width;
-        final int height;
-        final int quality;
-        final String inputPath;
-        final String outputPath;
-        final Bitmap[] bitmaps;
+        final int mInputMode;
+        final boolean mUseGrid;
+        final boolean mUseHandler;
+        final int mMaxNumImages;
+        final int mNumImages;
+        final int mWidth;
+        final int mHeight;
+        final int mRotation;
+        final int mQuality;
+        final String mInputPath;
+        final String mOutputPath;
+        final Bitmap[] mBitmaps;
 
-        TestConfig(int _inputMode, boolean _useGrid, boolean _useHandler,
-                   int _maxNumImage, int _numImages, int _width, int _height, int _quality,
-                   String _inputPath, String _outputPath, Bitmap[] _bitmaps) {
-            inputMode = _inputMode;
-            useGrid = _useGrid;
-            useHandler = _useHandler;
-            maxNumImages = _maxNumImage;
-            numImages = _numImages;
-            width = _width;
-            height = _height;
-            quality = _quality;
-            inputPath = _inputPath;
-            outputPath = _outputPath;
-            bitmaps = _bitmaps;
+        TestConfig(int inputMode, boolean useGrid, boolean useHandler,
+                   int maxNumImages, int numImages, int width, int height,
+                   int rotation, int quality,
+                   String inputPath, String outputPath, Bitmap[] bitmaps) {
+            mInputMode = inputMode;
+            mUseGrid = useGrid;
+            mUseHandler = useHandler;
+            mMaxNumImages = maxNumImages;
+            mNumImages = numImages;
+            mWidth = width;
+            mHeight = height;
+            mRotation = rotation;
+            mQuality = quality;
+            mInputPath = inputPath;
+            mOutputPath = outputPath;
+            mBitmaps = bitmaps;
         }
 
         static class Builder {
-            final int inputMode;
-            final boolean useGrid;
-            final boolean useHandler;
-            int maxNumImages;
-            int numImages;
-            int width;
-            int height;
-            int quality;
-            String inputPath;
-            final String outputPath;
-            Bitmap[] bitmaps;
-
-            boolean numImagesSetExplicitly;
+            final int mInputMode;
+            final boolean mUseGrid;
+            final boolean mUseHandler;
+            int mMaxNumImages;
+            int mNumImages;
+            int mWidth;
+            int mHeight;
+            int mRotation;
+            final int mQuality;
+            String mInputPath;
+            final String mOutputPath;
+            Bitmap[] mBitmaps;
+            boolean mNumImagesSetExplicitly;
 
 
-            Builder(int _inputMode, boolean _useGrids, boolean _useHandler) {
-                inputMode = _inputMode;
-                useGrid = _useGrids;
-                useHandler = _useHandler;
-                maxNumImages = numImages = 4;
-                width = 1920;
-                height = 1080;
-                quality = 100;
-                outputPath = new File(Environment.getExternalStorageDirectory(),
+            Builder(int inputMode, boolean useGrids, boolean useHandler) {
+                mInputMode = inputMode;
+                mUseGrid = useGrids;
+                mUseHandler = useHandler;
+                mMaxNumImages = mNumImages = 4;
+                mWidth = 1920;
+                mHeight = 1080;
+                mRotation = 0;
+                mQuality = 100;
+                mOutputPath = new File(Environment.getExternalStorageDirectory(),
                         OUTPUT_FILENAME).getAbsolutePath();
             }
 
-            Builder setInputPath(String _inputPath) {
-                inputPath = (inputMode == INPUT_MODE_BITMAP) ? _inputPath : null;
+            Builder setInputPath(String inputPath) {
+                mInputPath = (mInputMode == INPUT_MODE_BITMAP) ? inputPath : null;
                 return this;
             }
 
-            Builder setNumImages(int _numImages) {
-                numImagesSetExplicitly = true;
-                numImages = _numImages;
+            Builder setNumImages(int numImages) {
+                mNumImagesSetExplicitly = true;
+                mNumImages = numImages;
+                return this;
+            }
+
+            Builder setRotation(int rotation) {
+                mRotation = rotation;
                 return this;
             }
 
             private void loadBitmapInputs() {
-                if (inputMode != INPUT_MODE_BITMAP) {
+                if (mInputMode != INPUT_MODE_BITMAP) {
                     return;
                 }
                 MediaMetadataRetriever retriever = new MediaMetadataRetriever();
-                retriever.setDataSource(inputPath);
+                retriever.setDataSource(mInputPath);
                 String hasImage = retriever.extractMetadata(
                         MediaMetadataRetriever.METADATA_KEY_HAS_IMAGE);
                 if (!"yes".equals(hasImage)) {
                     throw new IllegalArgumentException("no bitmap found!");
                 }
-                width = Integer.parseInt(retriever.extractMetadata(
-                        MediaMetadataRetriever.METADATA_KEY_IMAGE_WIDTH));
-                height = Integer.parseInt(retriever.extractMetadata(
-                        MediaMetadataRetriever.METADATA_KEY_IMAGE_HEIGHT));
-                maxNumImages = Math.min(maxNumImages, Integer.parseInt(retriever.extractMetadata(
+                mMaxNumImages = Math.min(mMaxNumImages, Integer.parseInt(retriever.extractMetadata(
                         MediaMetadataRetriever.METADATA_KEY_IMAGE_COUNT)));
-                if (!numImagesSetExplicitly) {
-                    numImages = maxNumImages;
+                if (!mNumImagesSetExplicitly) {
+                    mNumImages = mMaxNumImages;
                 }
-                bitmaps = new Bitmap[maxNumImages];
-                for (int i = 0; i < bitmaps.length; i++) {
-                    bitmaps[i] = retriever.getImageAtIndex(i);
+                mBitmaps = new Bitmap[mMaxNumImages];
+                for (int i = 0; i < mBitmaps.length; i++) {
+                    mBitmaps[i] = retriever.getImageAtIndex(i);
                 }
+                mWidth = mBitmaps[0].getWidth();
+                mHeight = mBitmaps[0].getHeight();
                 retriever.release();
             }
 
             private void cleanupStaleOutputs() {
-                File outputFile = new File(outputPath);
+                File outputFile = new File(mOutputPath);
                 if (outputFile.exists()) {
                     outputFile.delete();
                 }
@@ -355,58 +368,61 @@
                 cleanupStaleOutputs();
                 loadBitmapInputs();
 
-                return new TestConfig(inputMode, useGrid, useHandler, maxNumImages, numImages,
-                        width, height, quality, inputPath, outputPath, bitmaps);
+                return new TestConfig(mInputMode, mUseGrid, mUseHandler, mMaxNumImages, mNumImages,
+                        mWidth, mHeight, mRotation, mQuality, mInputPath, mOutputPath, mBitmaps);
             }
         }
 
         @Override
         public String toString() {
-            return "TestConfig" +
-                    ": inputMode " + inputMode +
-                    ", useGrid " + useGrid +
-                    ", useHandler " + useHandler +
-                    ", maxNumImages " + maxNumImages +
-                    ", numImages " + numImages +
-                    ", width " + width +
-                    ", height " + height +
-                    ", quality " + quality +
-                    ", inputPath " + inputPath +
-                    ", outputPath " + outputPath;
+            return "TestConfig"
+                    + ": mInputMode " + mInputMode
+                    + ", mUseGrid " + mUseGrid
+                    + ", mUseHandler " + mUseHandler
+                    + ", mMaxNumImages " + mMaxNumImages
+                    + ", mNumImages " + mNumImages
+                    + ", mWidth " + mWidth
+                    + ", mHeight " + mHeight
+                    + ", mRotation " + mRotation
+                    + ", mQuality " + mQuality
+                    + ", mInputPath " + mInputPath
+                    + ", mOutputPath " + mOutputPath;
         }
     }
 
-    private void doTest(TestConfig testConfig) throws Exception {
-        int width = testConfig.width;
-        int height = testConfig.height;
-        int numImages = testConfig.numImages;
+    private void doTest(TestConfig config) throws Exception {
+        int width = config.mWidth;
+        int height = config.mHeight;
+        int numImages = config.mNumImages;
 
         mInputIndex = 0;
         HeifWriter heifWriter = null;
         FileInputStream inputStream = null;
         FileOutputStream outputStream = null;
         try {
-            if (DEBUG) Log.d(TAG, "started: " + testConfig);
+            if (DEBUG) Log.d(TAG, "started: " + config);
 
-            heifWriter = new HeifWriter(testConfig.outputPath, width, height,
-                    testConfig.useGrid,
-                    testConfig.quality,
-                    testConfig.maxNumImages,
-                    testConfig.maxNumImages - 1,
-                    testConfig.inputMode,
-                    testConfig.useHandler ? mHandler : null);
+            heifWriter = new HeifWriter.Builder(
+                    config.mOutputPath, width, height, config.mInputMode)
+                    .setRotation(config.mRotation)
+                    .setGridEnabled(config.mUseGrid)
+                    .setMaxImages(config.mMaxNumImages)
+                    .setQuality(config.mQuality)
+                    .setPrimaryIndex(config.mMaxNumImages - 1)
+                    .setHandler(config.mUseHandler ? mHandler : null)
+                    .build();
 
-            if (testConfig.inputMode == INPUT_MODE_SURFACE) {
+            if (config.mInputMode == INPUT_MODE_SURFACE) {
                 mInputEglSurface = new EglWindowSurface(heifWriter.getInputSurface());
             }
 
             heifWriter.start();
 
-            if (testConfig.inputMode == INPUT_MODE_BUFFER) {
+            if (config.mInputMode == INPUT_MODE_BUFFER) {
                 byte[] data = new byte[width * height * 3 / 2];
 
-                if (testConfig.inputPath != null) {
-                    inputStream = new FileInputStream(testConfig.inputPath);
+                if (config.mInputPath != null) {
+                    inputStream = new FileInputStream(config.mInputPath);
                 }
 
                 if (DUMP_YUV_INPUT) {
@@ -424,7 +440,7 @@
                     }
                     heifWriter.addYuvBuffer(ImageFormat.YUV_420_888, data);
                 }
-            } else if (testConfig.inputMode == INPUT_MODE_SURFACE) {
+            } else if (config.mInputMode == INPUT_MODE_SURFACE) {
                 // The input surface is a surface texture using single buffer mode, draws will be
                 // blocked until onFrameAvailable is done with the buffer, which is dependant on
                 // how fast MediaCodec processes them, which is further dependent on how fast the
@@ -436,8 +452,8 @@
                 }
                 heifWriter.setInputEndOfStreamTimestamp(
                         1000 * computePresentationTime(numImages - 1));
-            } else if (testConfig.inputMode == INPUT_MODE_BITMAP) {
-                Bitmap[] bitmaps = testConfig.bitmaps;
+            } else if (config.mInputMode == INPUT_MODE_BITMAP) {
+                Bitmap[] bitmaps = config.mBitmaps;
                 for (int i = 0; i < Math.min(bitmaps.length, numImages); i++) {
                     if (DEBUG) Log.d(TAG, "addBitmap: " + i);
                     heifWriter.addBitmap(bitmaps[i]);
@@ -446,8 +462,8 @@
             }
 
             heifWriter.stop(3000);
-            verifyResult(testConfig.outputPath, width, height, testConfig.useGrid,
-                    Math.min(numImages, testConfig.maxNumImages));
+            verifyResult(config.mOutputPath, width, height, config.mRotation, config.mUseGrid,
+                    Math.min(numImages, config.mMaxNumImages));
             if (DEBUG) Log.d(TAG, "finished: PASS");
         } finally {
             try {
@@ -530,7 +546,7 @@
     }
 
     private void verifyResult(
-            String filename, int width, int height, boolean useGrid, int numImages)
+            String filename, int width, int height, int rotation, boolean useGrid, int numImages)
             throws Exception {
         MediaMetadataRetriever retriever = new MediaMetadataRetriever();
         retriever.setDataSource(filename);
@@ -540,23 +556,30 @@
         }
         assertEquals("Wrong image count", numImages,
                 Integer.parseInt(retriever.extractMetadata(
-                MediaMetadataRetriever.METADATA_KEY_IMAGE_COUNT)));
+                    MediaMetadataRetriever.METADATA_KEY_IMAGE_COUNT)));
         assertEquals("Wrong width", width,
                 Integer.parseInt(retriever.extractMetadata(
-                MediaMetadataRetriever.METADATA_KEY_IMAGE_WIDTH)));
+                    MediaMetadataRetriever.METADATA_KEY_IMAGE_WIDTH)));
         assertEquals("Wrong height", height,
                 Integer.parseInt(retriever.extractMetadata(
-                MediaMetadataRetriever.METADATA_KEY_IMAGE_HEIGHT)));
+                    MediaMetadataRetriever.METADATA_KEY_IMAGE_HEIGHT)));
+        assertEquals("Wrong rotation", rotation,
+                Integer.parseInt(retriever.extractMetadata(
+                    MediaMetadataRetriever.METADATA_KEY_IMAGE_ROTATION)));
         retriever.release();
 
         if (useGrid) {
             MediaExtractor extractor = new MediaExtractor();
             extractor.setDataSource(filename);
             MediaFormat format = extractor.getTrackFormat(0);
-            int gridWidth = format.getInteger(MediaFormat.KEY_GRID_WIDTH);
-            int gridHeight = format.getInteger(MediaFormat.KEY_GRID_HEIGHT);
-            assertEquals("Wrong grid width", 512, gridWidth);
-            assertEquals("Wrong grid height", 512, gridHeight);
+            int gridWidth = format.getInteger(MediaFormat.KEY_TILE_WIDTH);
+            int gridHeight = format.getInteger(MediaFormat.KEY_TILE_HEIGHT);
+            int gridRows = format.getInteger(MediaFormat.KEY_GRID_ROWS);
+            int gridCols = format.getInteger(MediaFormat.KEY_GRID_COLUMNS);
+            assertTrue("Wrong grid width or cols",
+                    ((width + gridWidth - 1) / gridWidth) == gridCols);
+            assertTrue("Wrong grid height or rows",
+                    ((height + gridHeight - 1) / gridHeight) == gridRows);
             extractor.release();
         }
     }
diff --git a/heifwriter/src/main/java/androidx/heifwriter/HeifEncoder.java b/heifwriter/src/main/java/androidx/heifwriter/HeifEncoder.java
index 85aa925..be5425a 100644
--- a/heifwriter/src/main/java/androidx/heifwriter/HeifEncoder.java
+++ b/heifwriter/src/main/java/androidx/heifwriter/HeifEncoder.java
@@ -17,14 +17,9 @@
 package androidx.heifwriter;
 
 import android.graphics.Bitmap;
+import android.graphics.Canvas;
 import android.graphics.Rect;
 import android.graphics.SurfaceTexture;
-import android.opengl.GLES20;
-import android.opengl.GLUtils;
-import android.os.Looper;
-import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import android.media.Image;
 import android.media.MediaCodec;
 import android.media.MediaCodec.BufferInfo;
@@ -32,13 +27,19 @@
 import android.media.MediaCodecInfo;
 import android.media.MediaCodecInfo.CodecCapabilities;
 import android.media.MediaFormat;
+import android.opengl.GLES20;
 import android.os.Handler;
 import android.os.HandlerThread;
+import android.os.Looper;
 import android.os.Process;
 import android.util.Log;
 import android.util.Range;
 import android.view.Surface;
 
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 import java.io.IOException;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -179,25 +180,29 @@
             throw new IllegalArgumentException("invalid encoder inputs");
         }
 
-        mEncoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_HEVC);
+        // Disable grid if the image is too small
+        useGrid &= (width > GRID_WIDTH || height > GRID_HEIGHT);
 
-        mWidth = width;
-        mHeight = height;
-
-        if (useGrid) {
-            mGridWidth = GRID_WIDTH;
-            mGridHeight = GRID_HEIGHT;
-            mGridRows = (height + GRID_HEIGHT - 1) / GRID_HEIGHT;
-            mGridCols = (width + GRID_WIDTH - 1) / GRID_WIDTH;
-        } else {
-            mGridWidth = mWidth;
-            mGridHeight = mHeight;
-            mGridRows = 1;
-            mGridCols = 1;
+        boolean useHeicEncoder = false;
+        MediaCodecInfo.CodecCapabilities caps = null;
+        try {
+            mEncoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_IMAGE_ANDROID_HEIC);
+            caps = mEncoder.getCodecInfo().getCapabilitiesForType(
+                    MediaFormat.MIMETYPE_IMAGE_ANDROID_HEIC);
+            // If the HEIC encoder can't support the size, fall back to HEVC encoder.
+            if (!caps.getVideoCapabilities().isSizeSupported(width, height)) {
+                mEncoder.release();
+                mEncoder = null;
+                throw new Exception();
+            }
+            useHeicEncoder = true;
+        } catch (Exception e) {
+            mEncoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_HEVC);
+            caps = mEncoder.getCodecInfo().getCapabilitiesForType(MediaFormat.MIMETYPE_VIDEO_HEVC);
+            // Always enable grid if the size is too large for the HEVC encoder
+            useGrid |= !caps.getVideoCapabilities().isSizeSupported(width, height);
         }
 
-        mNumTiles = mGridRows * mGridCols;
-
         mInputMode = inputMode;
 
         mCallback = cb;
@@ -217,18 +222,59 @@
         int colorFormat = useSurfaceInternally ? CodecCapabilities.COLOR_FormatSurface :
                 CodecCapabilities.COLOR_FormatYUV420Flexible;
 
-        // TODO: determine how to set bitrate and framerate, or use constant quality
-        MediaFormat codecFormat = MediaFormat.createVideoFormat(
-                MediaFormat.MIMETYPE_VIDEO_HEVC, mGridWidth, mGridHeight);
+        mWidth = width;
+        mHeight = height;
+
+        int gridWidth, gridHeight, gridRows, gridCols;
+
+        if (useGrid) {
+            gridWidth = GRID_WIDTH;
+            gridHeight = GRID_HEIGHT;
+            gridRows = (height + GRID_HEIGHT - 1) / GRID_HEIGHT;
+            gridCols = (width + GRID_WIDTH - 1) / GRID_WIDTH;
+        } else {
+            gridWidth = mWidth;
+            gridHeight = mHeight;
+            gridRows = 1;
+            gridCols = 1;
+        }
+
+        MediaFormat codecFormat;
+        if (useHeicEncoder) {
+            codecFormat = MediaFormat.createVideoFormat(
+                    MediaFormat.MIMETYPE_IMAGE_ANDROID_HEIC, mWidth, mHeight);
+        } else {
+            codecFormat = MediaFormat.createVideoFormat(
+                    MediaFormat.MIMETYPE_VIDEO_HEVC, gridWidth, gridHeight);
+        }
+
+        if (useGrid) {
+            codecFormat.setInteger(MediaFormat.KEY_TILE_WIDTH, gridWidth);
+            codecFormat.setInteger(MediaFormat.KEY_TILE_HEIGHT, gridHeight);
+            codecFormat.setInteger(MediaFormat.KEY_GRID_COLUMNS, gridCols);
+            codecFormat.setInteger(MediaFormat.KEY_GRID_ROWS, gridRows);
+        }
+
+        if (useHeicEncoder) {
+            mGridWidth = width;
+            mGridHeight = height;
+            mGridRows = 1;
+            mGridCols = 1;
+        } else {
+            mGridWidth = gridWidth;
+            mGridHeight = gridHeight;
+            mGridRows = gridRows;
+            mGridCols = gridCols;
+        }
+        mNumTiles = mGridRows * mGridCols;
+
         codecFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 0);
         codecFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
-
-        MediaCodecInfo.CodecCapabilities caps =
-                mEncoder.getCodecInfo().getCapabilitiesForType(MediaFormat.MIMETYPE_VIDEO_HEVC);
-        MediaCodecInfo.EncoderCapabilities encoderCaps = caps.getEncoderCapabilities();
-
         codecFormat.setInteger(MediaFormat.KEY_FRAME_RATE, mNumTiles);
         codecFormat.setInteger(MediaFormat.KEY_CAPTURE_RATE, mNumTiles * 30);
+
+        MediaCodecInfo.EncoderCapabilities encoderCaps = caps.getEncoderCapabilities();
+
         if (encoderCaps.isBitrateModeSupported(
                 MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CQ)) {
             Log.d(TAG, "Setting bitrate mode to constant quality");
@@ -240,14 +286,14 @@
                             (qualityRange.getUpper() - qualityRange.getLower()) * quality / 100.0));
         } else {
             if (encoderCaps.isBitrateModeSupported(
-                    MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR)) {
-                Log.d(TAG, "Setting bitrate mode to variable bitrate");
-                codecFormat.setInteger(MediaFormat.KEY_BITRATE_MODE,
-                        MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR);
-            } else { // assume CBR
+                    MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR)) {
                 Log.d(TAG, "Setting bitrate mode to constant bitrate");
                 codecFormat.setInteger(MediaFormat.KEY_BITRATE_MODE,
                         MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR);
+            } else { // assume VBR
+                Log.d(TAG, "Setting bitrate mode to variable bitrate");
+                codecFormat.setInteger(MediaFormat.KEY_BITRATE_MODE,
+                        MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR);
             }
             // Calculate the bitrate based on image dimension, max compression ratio and quality.
             // Note that we set the frame rate to the number of tiles, so the bitrate would be the
@@ -262,34 +308,36 @@
         if (useSurfaceInternally) {
             mEncoderSurface = mEncoder.createInputSurface();
 
-            boolean useGLCopy = (mNumTiles > 1) || (inputMode == INPUT_MODE_BITMAP);
-            mEOSTracker = new SurfaceEOSTracker(useGLCopy);
+            boolean copyTiles = (mNumTiles > 1);
+            mEOSTracker = new SurfaceEOSTracker(copyTiles);
 
-            if (useGLCopy) {
-                mEncoderEglSurface = new EglWindowSurface(mEncoderSurface);
-                mEncoderEglSurface.makeCurrent();
+            if (inputMode == INPUT_MODE_SURFACE) {
+                if (copyTiles) {
+                    mEncoderEglSurface = new EglWindowSurface(mEncoderSurface);
+                    mEncoderEglSurface.makeCurrent();
 
-                mRectBlt = new EglRectBlt(
-                        new Texture2dProgram((inputMode == INPUT_MODE_BITMAP) ?
-                                Texture2dProgram.TEXTURE_2D :
-                                Texture2dProgram.TEXTURE_EXT),
-                        mWidth, mHeight);
+                    mRectBlt = new EglRectBlt(
+                            new Texture2dProgram((inputMode == INPUT_MODE_BITMAP)
+                                    ? Texture2dProgram.TEXTURE_2D
+                                    : Texture2dProgram.TEXTURE_EXT),
+                            mWidth, mHeight);
 
-                mTextureId = mRectBlt.createTextureObject();
+                    mTextureId = mRectBlt.createTextureObject();
 
-                if (inputMode == INPUT_MODE_SURFACE) {
-                    // use single buffer mode to block on input
-                    mInputTexture = new SurfaceTexture(mTextureId, true);
-                    mInputTexture.setOnFrameAvailableListener(this);
-                    mInputTexture.setDefaultBufferSize(mWidth, mHeight);
-                    mInputSurface = new Surface(mInputTexture);
+                    if (inputMode == INPUT_MODE_SURFACE) {
+                        // use single buffer mode to block on input
+                        mInputTexture = new SurfaceTexture(mTextureId, true);
+                        mInputTexture.setOnFrameAvailableListener(this);
+                        mInputTexture.setDefaultBufferSize(mWidth, mHeight);
+                        mInputSurface = new Surface(mInputTexture);
+                    }
+
+                    // make uncurrent since onFrameAvailable could be called on arbituray thread.
+                    // making the context current on a different thread will cause error.
+                    mEncoderEglSurface.makeUnCurrent();
+                } else {
+                    mInputSurface = mEncoderSurface;
                 }
-
-                // make uncurrent since the onFrameAvailable could be called on arbituray thread.
-                // making the context current on a different thread will cause error.
-                mEncoderEglSurface.makeUnCurrent();
-            } else {
-                mInputSurface = mEncoderSurface;
             }
         } else {
             for (int i = 0; i < INPUT_BUFFER_POOL_SIZE; i++) {
@@ -321,7 +369,20 @@
                     computePresentationTime(mInputIndex + mNumTiles - 1));
 
             if (takeFrame) {
-                copyTilesGL(mTmpMatrix);
+                // Copies from surface texture to encoder inputs using GL.
+                GLES20.glViewport(0, 0, mGridWidth, mGridHeight);
+
+                for (int row = 0; row < mGridRows; row++) {
+                    for (int col = 0; col < mGridCols; col++) {
+                        int left = col * mGridWidth;
+                        int top = row * mGridHeight;
+                        mSrcRect.set(left, top, left + mGridWidth, top + mGridHeight);
+                        mRectBlt.copyRect(mTextureId, mTmpMatrix, mSrcRect);
+                        mEncoderEglSurface.setPresentationTime(
+                                1000 * computePresentationTime(mInputIndex++));
+                        mEncoderEglSurface.swapBuffers();
+                    }
+                }
             }
 
             surfaceTexture.releaseTexImage();
@@ -407,21 +468,16 @@
         if (!takeFrame) return;
 
         synchronized (this) {
-            if (mEncoderEglSurface == null) {
-                return;
+            for (int row = 0; row < mGridRows; row++) {
+                for (int col = 0; col < mGridCols; col++) {
+                    int left = col * mGridWidth;
+                    int top = row * mGridHeight;
+                    mSrcRect.set(left, top, left + mGridWidth, top + mGridHeight);
+                    Canvas canvas = mEncoderSurface.lockCanvas(null);
+                    canvas.drawBitmap(bitmap, mSrcRect, mDstRect, null);
+                    mEncoderSurface.unlockCanvasAndPost(canvas);
+                }
             }
-
-            mEncoderEglSurface.makeCurrent();
-
-            // load the bitmap to texture
-            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureId);
-            GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
-
-            copyTilesGL(Texture2dProgram.V_FLIP_MATRIX);
-
-            // make uncurrent since the onFrameAvailable could be called on arbituray thread.
-            // making the context current on a different thread will cause error.
-            mEncoderEglSurface.makeUnCurrent();
         }
     }
 
@@ -594,28 +650,6 @@
     }
 
     /**
-     * Copies from source frame to encoder inputs using GL. The source could be either
-     * client's input surface, or the input bitmap loaded to texture.
-     *
-     * @param texMatrix The texture matrix to use. See the shader program in
-     * {@link Texture2dProgram} as well as {@link SurfaceTexture} for more details.
-     */
-    private void copyTilesGL(float[] texMatrix) {
-        GLES20.glViewport(0, 0, mGridWidth, mGridHeight);
-
-        for (int row = 0; row < mGridRows; row++) {
-            for (int col = 0; col < mGridCols; col++) {
-                int left = col * mGridWidth;
-                int top = row * mGridHeight;
-                mSrcRect.set(left, top, left + mGridWidth, top + mGridHeight);
-                mRectBlt.copyRect(mTextureId, texMatrix, mSrcRect);
-                mEncoderEglSurface.setPresentationTime(1000 * computePresentationTime(mInputIndex++));
-                mEncoderEglSurface.swapBuffers();
-            }
-        }
-    }
-
-    /**
      * Routine to release all resources. Must be run on the same looper that
      * handles the MediaCodec callbacks.
      */
@@ -677,7 +711,7 @@
     private class SurfaceEOSTracker {
         private static final boolean DEBUG_EOS = false;
 
-        final boolean mUseGLCopy;
+        final boolean mCopyTiles;
         long mInputEOSTimeNs = -1;
         long mLastInputTimeNs = -1;
         long mEncoderEOSTimeUs = -1;
@@ -685,14 +719,14 @@
         long mLastOutputTimeUs = -1;
         boolean mSignaled;
 
-        SurfaceEOSTracker(boolean useGLCopy) {
-            mUseGLCopy = useGLCopy;
+        SurfaceEOSTracker(boolean copyTiles) {
+            mCopyTiles = copyTiles;
         }
 
         synchronized void updateInputEOSTime(long timestampNs) {
             if (DEBUG_EOS) Log.d(TAG, "updateInputEOSTime: " + timestampNs);
 
-            if (mUseGLCopy) {
+            if (mCopyTiles) {
                 if (mInputEOSTimeNs < 0) {
                     mInputEOSTimeNs = timestampNs;
                 }
@@ -773,15 +807,18 @@
 
             if (DEBUG) Log.d(TAG, "onOutputFormatChanged: " + format);
 
-            format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_IMAGE_ANDROID_HEIC);
-            format.setInteger(MediaFormat.KEY_WIDTH, mWidth);
-            format.setInteger(MediaFormat.KEY_HEIGHT, mHeight);
+            if (!MediaFormat.MIMETYPE_IMAGE_ANDROID_HEIC.equals(
+                    format.getString(MediaFormat.KEY_MIME))) {
+                format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_IMAGE_ANDROID_HEIC);
+                format.setInteger(MediaFormat.KEY_WIDTH, mWidth);
+                format.setInteger(MediaFormat.KEY_HEIGHT, mHeight);
 
-            if (mNumTiles > 1) {
-                format.setInteger(MediaFormat.KEY_GRID_WIDTH, mGridWidth);
-                format.setInteger(MediaFormat.KEY_GRID_HEIGHT, mGridHeight);
-                format.setInteger(MediaFormat.KEY_GRID_ROWS, mGridRows);
-                format.setInteger(MediaFormat.KEY_GRID_COLS, mGridCols);
+                if (mNumTiles > 1) {
+                    format.setInteger(MediaFormat.KEY_TILE_WIDTH, mGridWidth);
+                    format.setInteger(MediaFormat.KEY_TILE_HEIGHT, mGridHeight);
+                    format.setInteger(MediaFormat.KEY_GRID_ROWS, mGridRows);
+                    format.setInteger(MediaFormat.KEY_GRID_COLUMNS, mGridCols);
+                }
             }
 
             mCallback.onOutputFormatChanged(HeifEncoder.this, format);
@@ -800,8 +837,12 @@
         public void onOutputBufferAvailable(MediaCodec codec, int index, BufferInfo info) {
             if (codec != mEncoder || mOutputEOS) return;
 
-            if (DEBUG) Log.d(TAG, "onInputBufferAvailable: " + index + ", time "
-                    + info.presentationTimeUs + ", size " + info.size + ", flags " + info.flags);
+            if (DEBUG) {
+                Log.d(TAG, "onOutputBufferAvailable: " + index
+                        + ", time " + info.presentationTimeUs
+                        + ", size " + info.size
+                        + ", flags " + info.flags);
+            }
 
             if ((info.size > 0) && ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) == 0)) {
                 ByteBuffer outputBuffer = codec.getOutputBuffer(index);
diff --git a/heifwriter/src/main/java/androidx/heifwriter/HeifWriter.java b/heifwriter/src/main/java/androidx/heifwriter/HeifWriter.java
index be7dffb..bc657c4 100644
--- a/heifwriter/src/main/java/androidx/heifwriter/HeifWriter.java
+++ b/heifwriter/src/main/java/androidx/heifwriter/HeifWriter.java
@@ -16,6 +16,8 @@
 
 package androidx.heifwriter;
 
+import static android.media.MediaMuxer.OutputFormat.MUXER_OUTPUT_HEIF;
+
 import android.annotation.SuppressLint;
 import android.graphics.Bitmap;
 import android.media.MediaCodec;
@@ -25,11 +27,12 @@
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.Process;
+import android.util.Log;
+import android.view.Surface;
+
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import android.util.Log;
-import android.view.Surface;
 
 import java.io.FileDescriptor;
 import java.io.IOException;
@@ -38,8 +41,6 @@
 import java.nio.ByteBuffer;
 import java.util.concurrent.TimeoutException;
 
-import static android.media.MediaMuxer.OutputFormat.MUXER_OUTPUT_HEIF;
-
 /**
  * This class writes one or more still images (of the same dimensions) into
  * a heif file.
@@ -79,7 +80,8 @@
     private final HandlerThread mHandlerThread;
     private final Handler mHandler;
     private int mNumTiles;
-    private final int mNumImages;
+    private final int mRotation;
+    private final int mMaxImages;
     private final int mPrimaryIndex;
     private final ResultWaiter mResultWaiter = new ResultWaiter();
 
@@ -119,96 +121,200 @@
     public @interface InputMode {}
 
     /**
-     * Construct a heif writer that writes to a file specified by its path.
-     *
-     * @param path Path of the file to be written.
-     * @param width Width of the image.
-     * @param height Height of the image.
-     * @param useGrid Whether to encode image into tiles. If enabled, the tile size will be
-     *                automatically chosen.
-     * @param quality A number between 0 and 100 (inclusive), with 100 indicating the best quality
-     *                supported by this implementation (which often results in larger file size).
-     * @param numImages Max number of images to write. Frames exceeding this number will not be
-     *                  written to file. The writing can be stopped earlier before this number of
-     *                  images are written by {@link #stop(long)}, except for the input mode of
-     *                  {@link #INPUT_MODE_SURFACE}, where the EOS timestamp must be specified (via
-     *                 {@link #setInputEndOfStreamTimestamp(long)} and reached.
-     * @param primaryIndex Index of the image that should be marked as primary, must be within range
-     *                     [0, numImages - 1] inclusive.
-     * @param inputMode Input mode for this writer, must be one of {@link #INPUT_MODE_BUFFER},
-     *                  {@link #INPUT_MODE_SURFACE}, or {@link #INPUT_MODE_BITMAP}.
-     * @param handler If not null, client will receive all callbacks on the handler's looper.
-     *                Otherwise, client will receive callbacks on a looper created by the writer.
-     *
-     * @throws IOException if failed to construct MediaMuxer or HeifEncoder.
+     * Builder class for constructing a HeifWriter object from specified parameters.
      */
-    @SuppressLint("WrongConstant")
-    public HeifWriter(@NonNull String path,
-                      int width, int height, boolean useGrid,
-                      int quality, int numImages, int primaryIndex,
-                      @InputMode int inputMode,
-                      @Nullable Handler handler) throws IOException {
-        this(width, height, useGrid, quality, numImages, primaryIndex, inputMode, handler,
-                new MediaMuxer(path, MUXER_OUTPUT_HEIF));
+    public static final class Builder {
+        private final String mPath;
+        private final FileDescriptor mFd;
+        private final int mWidth;
+        private final int mHeight;
+        private final @InputMode int mInputMode;
+        private boolean mGridEnabled = true;
+        private int mQuality = 100;
+        private int mMaxImages = 1;
+        private int mPrimaryIndex = 0;
+        private int mRotation = 0;
+        private Handler mHandler;
+
+        /**
+         * Construct a Builder with output specified by its path.
+         *
+         * @param path Path of the file to be written.
+         * @param width Width of the image.
+         * @param height Height of the image.
+         * @param inputMode Input mode for this writer, must be one of {@link #INPUT_MODE_BUFFER},
+         *                  {@link #INPUT_MODE_SURFACE}, or {@link #INPUT_MODE_BITMAP}.
+         */
+        public Builder(@NonNull String path,
+                       int width, int height, @InputMode int inputMode) {
+            this(path, null, width, height, inputMode);
+        }
+
+        /**
+         * Construct a Builder with output specified by its file descriptor.
+         *
+         * @param fd File descriptor of the file to be written.
+         * @param width Width of the image.
+         * @param height Height of the image.
+         * @param inputMode Input mode for this writer, must be one of {@link #INPUT_MODE_BUFFER},
+         *                  {@link #INPUT_MODE_SURFACE}, or {@link #INPUT_MODE_BITMAP}.
+         */
+        public Builder(@NonNull FileDescriptor fd,
+                       int width, int height, @InputMode int inputMode) {
+            this(null, fd, width, height, inputMode);
+        }
+
+        private Builder(String path, FileDescriptor fd,
+                        int width, int height, @InputMode int inputMode) {
+            if (width <= 0 || height <= 0) {
+                throw new IllegalArgumentException("Invalid image size: " + width + "x" + height);
+            }
+            mPath = path;
+            mFd = fd;
+            mWidth = width;
+            mHeight = height;
+            mInputMode = inputMode;
+        }
+
+        /**
+         * Set the image rotation in degrees.
+         *
+         * @param rotation Rotation angle (clockwise) of the image, must be 0, 90, 180 or 270.
+         *                 Default is 0.
+         * @return this Builder object.
+         */
+        public Builder setRotation(int rotation) {
+            if (rotation != 0 && rotation != 90 && rotation != 180 && rotation != 270) {
+                throw new IllegalArgumentException("Invalid rotation angle: " + rotation);
+            }
+            mRotation = rotation;
+            return this;
+        }
+
+        /**
+         * Set whether to enable grid option.
+         *
+         * @param gridEnabled Whether to enable grid option. If enabled, the tile size will be
+         *                    automatically chosen. Default is to enable.
+         * @return this Builder object.
+         */
+        public Builder setGridEnabled(boolean gridEnabled) {
+            mGridEnabled = gridEnabled;
+            return this;
+        }
+
+        /**
+         * Set the quality for encoding images.
+         *
+         * @param quality A number between 0 and 100 (inclusive), with 100 indicating the best
+         *                quality supported by this implementation. Default is 100.
+         * @return this Builder object.
+         */
+        public Builder setQuality(int quality) {
+            if (quality < 0 || quality > 100) {
+                throw new IllegalArgumentException("Invalid quality: " + quality);
+            }
+            mQuality = quality;
+            return this;
+        }
+
+        /**
+         * Set the maximum number of images to write.
+         *
+         * @param maxImages Max number of images to write. Frames exceeding this number will not be
+         *                  written to file. The writing can be stopped earlier before this number
+         *                  of images are written by {@link #stop(long)}, except for the input mode
+         *                  of {@link #INPUT_MODE_SURFACE}, where the EOS timestamp must be
+         *                  specified (via {@link #setInputEndOfStreamTimestamp(long)} and reached.
+         *                  Default is 1.
+         * @return this Builder object.
+         */
+        public Builder setMaxImages(int maxImages) {
+            if (maxImages <= 0) {
+                throw new IllegalArgumentException("Invalid maxImage: " + maxImages);
+            }
+            mMaxImages = maxImages;
+            return this;
+        }
+
+        /**
+         * Set the primary image index.
+         *
+         * @param primaryIndex Index of the image that should be marked as primary, must be within
+         *                     range [0, maxImages - 1] inclusive. Default is 0.
+         * @return this Builder object.
+         */
+        public Builder setPrimaryIndex(int primaryIndex) {
+            if (primaryIndex < 0) {
+                throw new IllegalArgumentException("Invalid primaryIndex: " + primaryIndex);
+            }
+            mPrimaryIndex = primaryIndex;
+            return this;
+        }
+
+        /**
+         * Provide a handler for the HeifWriter to use.
+         *
+         * @param handler If not null, client will receive all callbacks on the handler's looper.
+         *                Otherwise, client will receive callbacks on a looper created by the
+         *                writer. Default is null.
+         * @return this Builder object.
+         */
+        public Builder setHandler(@Nullable Handler handler) {
+            mHandler = handler;
+            return this;
+        }
+
+        /**
+         * Build a HeifWriter object.
+         *
+         * @return a HeifWriter object built according to the specifications.
+         * @throws IOException if failed to create the writer, possibly due to failure to create
+         *                     {@link android.media.MediaMuxer} or {@link android.media.MediaCodec}.
+         */
+        public HeifWriter build() throws IOException {
+            return new HeifWriter(mPath, mFd, mWidth, mHeight, mRotation, mGridEnabled, mQuality,
+                    mMaxImages, mPrimaryIndex, mInputMode, mHandler);
+        }
     }
 
-    /**
-     * Construct a heif writer that writes to a file specified by file descriptor.
-     *
-     * @param fd File descriptor of the file to be written.
-     * @param width Width of the image.
-     * @param height Height of the image.
-     * @param useGrid Whether to encode image into tiles. If enabled, the tile size will be
-     *                automatically chosen.
-     * @param quality A number between 0 and 100 (inclusive), with 100 indicating the best quality
-     *                supported by this implementation (which often results in larger file size).
-     * @param numImages Max number of images to write. Frames exceeding this number will not be
-     *                  written to file. The writing can be stopped earlier before this number of
-     *                  images are written by {@link #stop(long)}, except for the input mode of
-     *                  {@link #INPUT_MODE_SURFACE}, where the EOS timestamp must be specified (via
-     *                 {@link #setInputEndOfStreamTimestamp(long)} and reached.
-     * @param primaryIndex Index of the image that should be marked as primary, must be within range
-     *                     [0, numImages - 1] inclusive.
-     * @param inputMode Input mode for this writer, must be one of {@link #INPUT_MODE_BUFFER},
-     *                  {@link #INPUT_MODE_SURFACE}, or {@link #INPUT_MODE_BITMAP}.
-     * @param handler If not null, client will receive all callbacks on the handler's looper.
-     *                Otherwise, client will receive callbacks on a looper created by the writer.
-     *
-     * @throws IOException if failed to construct MediaMuxer or HeifEncoder.
-     */
     @SuppressLint("WrongConstant")
-    public HeifWriter(@NonNull FileDescriptor fd,
-                      int width, int height, boolean useGrid,
-                      int quality, int numImages, int primaryIndex,
-                      @InputMode int inputMode,
-                      @Nullable Handler handler) throws IOException {
-        this(width, height, useGrid, quality, numImages, primaryIndex, inputMode, handler,
-                new MediaMuxer(fd, MUXER_OUTPUT_HEIF));
-    }
-
-    private HeifWriter(int width, int height, boolean useGrid,
-                       int quality, int numImages, int primaryIndex,
+    private HeifWriter(@NonNull String path,
+                       @NonNull FileDescriptor fd,
+                       int width,
+                       int height,
+                       int rotation,
+                       boolean gridEnabled,
+                       int quality,
+                       int maxImages,
+                       int primaryIndex,
                        @InputMode int inputMode,
-                       @Nullable Handler handler,
-                       @NonNull MediaMuxer muxer) throws IOException {
-        if (numImages <= 0 || primaryIndex < 0 || primaryIndex >= numImages) {
+                       @Nullable Handler handler) throws IOException {
+        if (primaryIndex >= maxImages) {
             throw new IllegalArgumentException(
-                    "Invalid numImages (" + numImages + ") or primaryIndex (" + primaryIndex + ")");
+                    "Invalid maxImages (" + maxImages + ") or primaryIndex (" + primaryIndex + ")");
+        }
+
+        if (DEBUG) {
+            Log.d(TAG, "width: " + width
+                    + ", height: " + height
+                    + ", rotation: " + rotation
+                    + ", gridEnabled: " + gridEnabled
+                    + ", quality: " + quality
+                    + ", maxImages: " + maxImages
+                    + ", primaryIndex: " + primaryIndex
+                    + ", inputMode: " + inputMode);
         }
 
         MediaFormat format = MediaFormat.createVideoFormat(
                 MediaFormat.MIMETYPE_IMAGE_ANDROID_HEIC, width, height);
 
-        if (DEBUG) {
-            Log.d(TAG, "format: " + format + ", inputMode: " + inputMode +
-                    ", numImage: " + numImages + ", primaryIndex: " + primaryIndex);
-        }
-
         // set to 1 initially, and wait for output format to know for sure
         mNumTiles = 1;
 
+        mRotation = rotation;
         mInputMode = inputMode;
-        mNumImages = numImages;
+        mMaxImages = maxImages;
         mPrimaryIndex = primaryIndex;
 
         Looper looper = (handler != null) ? handler.getLooper() : null;
@@ -222,9 +328,10 @@
         }
         mHandler = new Handler(looper);
 
-        mMuxer = muxer;
+        mMuxer = (path != null) ? new MediaMuxer(path, MUXER_OUTPUT_HEIF)
+                                : new MediaMuxer(fd, MUXER_OUTPUT_HEIF);
 
-        mHeifEncoder = new HeifEncoder(width, height, useGrid, quality,
+        mHeifEncoder = new HeifEncoder(width, height, gridEnabled, quality,
                 mInputMode, mHandler, new HeifCallback());
     }
 
@@ -400,19 +507,23 @@
 
             try {
                 int gridRows = format.getInteger(MediaFormat.KEY_GRID_ROWS);
-                int gridCols = format.getInteger(MediaFormat.KEY_GRID_COLS);
+                int gridCols = format.getInteger(MediaFormat.KEY_GRID_COLUMNS);
                 mNumTiles = gridRows * gridCols;
             } catch (NullPointerException | ClassCastException  e) {
                 mNumTiles = 1;
             }
 
-            // add mNumImages image tracks of the same format
-            mTrackIndexArray = new int[mNumImages];
+            // add mMaxImages image tracks of the same format
+            mTrackIndexArray = new int[mMaxImages];
+
+            // set rotation angle
+            if (mRotation > 0) {
+                Log.d(TAG, "setting rotation: " + mRotation);
+                mMuxer.setOrientationHint(mRotation);
+            }
             for (int i = 0; i < mTrackIndexArray.length; i++) {
                 // mark primary
-                if (i == mPrimaryIndex) {
-                    format.setInteger(MediaFormat.KEY_IS_DEFAULT, 1);
-                }
+                format.setInteger(MediaFormat.KEY_IS_DEFAULT, (i == mPrimaryIndex) ? 1 : 0);
                 mTrackIndexArray[i] = mMuxer.addTrack(format);
             }
             mMuxer.start();
@@ -436,7 +547,7 @@
                 return;
             }
 
-            if (mOutputIndex < mNumImages * mNumTiles) {
+            if (mOutputIndex < mMaxImages * mNumTiles) {
                 MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
                 info.set(byteBuffer.position(), byteBuffer.remaining(), 0, 0);
                 mMuxer.writeSampleData(
@@ -446,7 +557,7 @@
             mOutputIndex++;
 
             // post EOS if reached max number of images allowed.
-            if (mOutputIndex == mNumImages * mNumTiles) {
+            if (mOutputIndex == mMaxImages * mNumTiles) {
                 stopAndNotify(null);
             }
         }
diff --git a/leanback/src/main/res/values-as/strings.xml b/leanback/src/main/res/values-as/strings.xml
new file mode 100644
index 0000000..eb3b2b0
--- /dev/null
+++ b/leanback/src/main/res/values-as/strings.xml
@@ -0,0 +1,59 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="8126335323963415494">"নেভিগেশ্বন মেনু"</string>
+    <string name="orb_search_action" msgid="7534843523462177008">"সন্ধান সম্পৰ্কীয় কাৰ্য"</string>
+    <string name="lb_search_bar_hint" msgid="4819380969103509861">"সন্ধান"</string>
+    <string name="lb_search_bar_hint_speech" msgid="2795474673510974502">"সন্ধান কৰিবলৈ কথা কওক"</string>
+    <string name="lb_search_bar_hint_with_title" msgid="7453744869467668159">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> সন্ধান কৰক"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="5851694095153624617">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> সন্ধান কৰিবলৈ কথা কওক"</string>
+    <string name="lb_control_display_fast_forward_multiplier" msgid="2721825378927619928">"%1$dX"</string>
+    <string name="lb_control_display_rewind_multiplier" msgid="6173753802428649303">"%1$dX"</string>
+    <string name="lb_playback_controls_play" msgid="1590369760862605402">"প্লে কৰক"</string>
+    <string name="lb_playback_controls_pause" msgid="1769131316742618433">"পজ কৰক"</string>
+    <string name="lb_playback_controls_fast_forward" msgid="8966769845721269304">"ফাষ্ট ফৰৱাৰ্ড"</string>
+    <string name="lb_playback_controls_fast_forward_multiplier" msgid="801276177839339511">"ফাষ্ট ফৰৱার্ড কৰক %1$dX"</string>
+    <string name="lb_playback_controls_rewind" msgid="1412664391757869774">"ৰিৱাইণ্ড কৰক"</string>
+    <string name="lb_playback_controls_rewind_multiplier" msgid="8651612807713092781">"ৰিৱাইণ্ড কৰক %1$dX"</string>
+    <string name="lb_playback_controls_skip_next" msgid="4877009494447817003">"পৰৱৰ্তীটোলৈ এৰি যাওক"</string>
+    <string name="lb_playback_controls_skip_previous" msgid="3147124289285911980">"আগৰটোলৈ এৰি যাওক"</string>
+    <string name="lb_playback_controls_more_actions" msgid="2827883329510404797">"অধিক কাৰ্য"</string>
+    <string name="lb_playback_controls_thumb_up" msgid="8332816524260995892">"থাম্ব আপ বাছনি নাইকিয়া কৰক"</string>
+    <string name="lb_playback_controls_thumb_up_outline" msgid="1038344559734334272">"থাম্ব আপ বাছনি কৰক"</string>
+    <string name="lb_playback_controls_thumb_down" msgid="5075744418630733006">"থাম্ব ডাউন বাছনি নাইকিয়া কৰক"</string>
+    <string name="lb_playback_controls_thumb_down_outline" msgid="2847309435442474470">"থাম্ব ডাউন বাছনি কৰক"</string>
+    <string name="lb_playback_controls_repeat_none" msgid="5812341701962930499">"একো পুনৰাই প্লে নকৰিব"</string>
+    <string name="lb_playback_controls_repeat_all" msgid="5164826436271322261">"সকলো পুনৰাই প্লে কৰক"</string>
+    <string name="lb_playback_controls_repeat_one" msgid="7675097479246139440">"এটা পুনৰাই প্লে কৰক"</string>
+    <string name="lb_playback_controls_shuffle_enable" msgid="7809089255981448519">"সান-মিহলি সক্ষম কৰক"</string>
+    <string name="lb_playback_controls_shuffle_disable" msgid="8182435535948303910">"সান-মিহলি অক্ষম কৰক"</string>
+    <string name="lb_playback_controls_high_quality_enable" msgid="1862669142355962638">"উচ্চ মানৰ প্লেবেক সক্ষম কৰক"</string>
+    <string name="lb_playback_controls_high_quality_disable" msgid="3000046054608531995">"উচ্চ মান অক্ষম কৰক"</string>
+    <string name="lb_playback_controls_closed_captioning_enable" msgid="3934392140182327163">"ছাব-টাইটেল সক্ষম কৰক"</string>
+    <string name="lb_playback_controls_closed_captioning_disable" msgid="5508271941331836786">"ছাব-টাইটেল অক্ষম কৰক"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="8800305194045609275">"চিত্ৰৰ ভিতৰত চিত্ৰ ম\'ড আৰম্ভ কৰক"</string>
+    <string name="lb_playback_time_separator" msgid="6549544638083578695">"/"</string>
+    <string name="lb_playback_controls_shown" msgid="7794717158616536936">"মিডিয়াৰ নিয়ন্ত্ৰণসমূহ দেখুওৱা হ\'ল"</string>
+    <string name="lb_playback_controls_hidden" msgid="619396299825306757">"মিডিয়াৰ নিয়ন্ত্ৰণসমূহ লুকুৱাই ৰখা হৈছে, দেখুওৱাবলৈ ডি-পেডত টিপক"</string>
+    <string name="lb_guidedaction_finish_title" msgid="7747913934287176843">"সমাপ্ত"</string>
+    <string name="lb_guidedaction_continue_title" msgid="1122271825827282965">"অব্যাহত ৰাখক"</string>
+    <string name="lb_media_player_error" msgid="8748646000835486516">"MediaPlayer ত্ৰুটি ক\'ড %1$d, অতিৰিক্ত %2$d"</string>
+    <string name="lb_onboarding_get_started" msgid="7674487829030291492">"আৰম্ভ কৰক"</string>
+    <string name="lb_onboarding_accessibility_next" msgid="4213611627196077555">"পৰৱৰ্তী"</string>
+</resources>
diff --git a/leanback/src/main/res/values-be/strings.xml b/leanback/src/main/res/values-be/strings.xml
index 2828004..a4038d6 100644
--- a/leanback/src/main/res/values-be/strings.xml
+++ b/leanback/src/main/res/values-be/strings.xml
@@ -21,8 +21,8 @@
     <string name="orb_search_action" msgid="7534843523462177008">"Пошук"</string>
     <string name="lb_search_bar_hint" msgid="4819380969103509861">"Пошук"</string>
     <string name="lb_search_bar_hint_speech" msgid="2795474673510974502">"Прамоўце пошукавы запыт"</string>
-    <string name="lb_search_bar_hint_with_title" msgid="7453744869467668159">"Шукаць тут <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="5851694095153624617">"Прамоўце пошукавы запыт тут <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title" msgid="7453744869467668159">"Шукаць тут: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="5851694095153624617">"Прамоўце запыт для пошуку тут: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="2721825378927619928">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="6173753802428649303">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="1590369760862605402">"Прайграць"</string>
@@ -53,7 +53,7 @@
     <string name="lb_playback_controls_hidden" msgid="619396299825306757">"Элементы кіравання мультымедыя схаваны. Каб паказаць іх, націсніце d-pad"</string>
     <string name="lb_guidedaction_finish_title" msgid="7747913934287176843">"Завяршыць"</string>
     <string name="lb_guidedaction_continue_title" msgid="1122271825827282965">"Працягнуць"</string>
-    <string name="lb_media_player_error" msgid="8748646000835486516">"Код памылкі MediaPlayer %1$d дадаткова %2$d"</string>
+    <string name="lb_media_player_error" msgid="8748646000835486516">"Код памылкі MediaPlayer: %1$d (дадатковы: %2$d)"</string>
     <string name="lb_onboarding_get_started" msgid="7674487829030291492">"ПАЧАЦЬ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="4213611627196077555">"Далей"</string>
 </resources>
diff --git a/leanback/src/main/res/values-es/strings.xml b/leanback/src/main/res/values-es/strings.xml
index dc33a6b..53e6797 100644
--- a/leanback/src/main/res/values-es/strings.xml
+++ b/leanback/src/main/res/values-es/strings.xml
@@ -22,7 +22,7 @@
     <string name="lb_search_bar_hint" msgid="4819380969103509861">"Haz una búsqueda"</string>
     <string name="lb_search_bar_hint_speech" msgid="2795474673510974502">"Habla para buscar"</string>
     <string name="lb_search_bar_hint_with_title" msgid="7453744869467668159">"Busca <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="5851694095153624617">"Busca <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> por voz"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="5851694095153624617">"Habla para buscar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="2721825378927619928">"%1$dx"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="6173753802428649303">"%1$dx"</string>
     <string name="lb_playback_controls_play" msgid="1590369760862605402">"Reproducir"</string>
@@ -47,7 +47,7 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="3000046054608531995">"Inhabilitar alta calidad"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="3934392140182327163">"Habilitar subtítulos"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="5508271941331836786">"Inhabilitar subtítulos"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="8800305194045609275">"Activar modo pantalla en pantalla"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="8800305194045609275">"Activar modo imagen en imagen"</string>
     <string name="lb_playback_time_separator" msgid="6549544638083578695">"/"</string>
     <string name="lb_playback_controls_shown" msgid="7794717158616536936">"Controles multimedia mostrados"</string>
     <string name="lb_playback_controls_hidden" msgid="619396299825306757">"Controles multimedia ocultos (pulsa la cruceta para mostrarlos)"</string>
diff --git a/leanback/src/main/res/values-eu/strings.xml b/leanback/src/main/res/values-eu/strings.xml
index 6b7226f..72c433f 100644
--- a/leanback/src/main/res/values-eu/strings.xml
+++ b/leanback/src/main/res/values-eu/strings.xml
@@ -49,8 +49,8 @@
     <string name="lb_playback_controls_closed_captioning_disable" msgid="5508271941331836786">"Desgaitu azpitituluak"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="8800305194045609275">"Aktibatu \"Pantaila txiki gainjarri\" modua"</string>
     <string name="lb_playback_time_separator" msgid="6549544638083578695">"/"</string>
-    <string name="lb_playback_controls_shown" msgid="7794717158616536936">"Multimedia kontrolatzeko aukerak ikusgai"</string>
-    <string name="lb_playback_controls_hidden" msgid="619396299825306757">"Ezkutatuta daude multimedia-edukia kontrolatzeko aukerak. Erakusteko, sakatu nabigazio-gurutzea."</string>
+    <string name="lb_playback_controls_shown" msgid="7794717158616536936">"Multimedia-edukia kontrolatzeko aukerak ikusgai"</string>
+    <string name="lb_playback_controls_hidden" msgid="619396299825306757">"Ezkutatuta daude multimedia-edukia kontrolatzeko aukerak. Haiek erakusteko, sakatu nabigazio-gurutzea."</string>
     <string name="lb_guidedaction_finish_title" msgid="7747913934287176843">"Amaitu"</string>
     <string name="lb_guidedaction_continue_title" msgid="1122271825827282965">"Egin aurrera"</string>
     <string name="lb_media_player_error" msgid="8748646000835486516">"MediaPlayer errore-kodea: %1$d (%2$d gehigarria)"</string>
diff --git a/leanback/src/main/res/values-fr-rCA/strings.xml b/leanback/src/main/res/values-fr-rCA/strings.xml
index de3fde5..ad38e94 100644
--- a/leanback/src/main/res/values-fr-rCA/strings.xml
+++ b/leanback/src/main/res/values-fr-rCA/strings.xml
@@ -32,7 +32,7 @@
     <string name="lb_playback_controls_rewind" msgid="1412664391757869774">"Retour arrière"</string>
     <string name="lb_playback_controls_rewind_multiplier" msgid="8651612807713092781">"Retour rapide à %1$dX"</string>
     <string name="lb_playback_controls_skip_next" msgid="4877009494447817003">"Passer à l\'élément suivant"</string>
-    <string name="lb_playback_controls_skip_previous" msgid="3147124289285911980">"Passer à l\'élément précédent"</string>
+    <string name="lb_playback_controls_skip_previous" msgid="3147124289285911980">"Retourner à l\'élément précédent"</string>
     <string name="lb_playback_controls_more_actions" msgid="2827883329510404797">"Autres actions"</string>
     <string name="lb_playback_controls_thumb_up" msgid="8332816524260995892">"Désélectionner la mention « J\'aime »"</string>
     <string name="lb_playback_controls_thumb_up_outline" msgid="1038344559734334272">"Sélectionner la mention « J\'aime »"</string>
diff --git a/leanback/src/main/res/values-ja/strings.xml b/leanback/src/main/res/values-ja/strings.xml
index 22980f1..96f27e2 100644
--- a/leanback/src/main/res/values-ja/strings.xml
+++ b/leanback/src/main/res/values-ja/strings.xml
@@ -43,8 +43,8 @@
     <string name="lb_playback_controls_repeat_one" msgid="7675097479246139440">"1 曲をリピート"</string>
     <string name="lb_playback_controls_shuffle_enable" msgid="7809089255981448519">"シャッフルを有効にする"</string>
     <string name="lb_playback_controls_shuffle_disable" msgid="8182435535948303910">"シャッフルを無効にする"</string>
-    <string name="lb_playback_controls_high_quality_enable" msgid="1862669142355962638">"高品質を有効にする"</string>
-    <string name="lb_playback_controls_high_quality_disable" msgid="3000046054608531995">"高品質を無効にする"</string>
+    <string name="lb_playback_controls_high_quality_enable" msgid="1862669142355962638">"高画質を有効にする"</string>
+    <string name="lb_playback_controls_high_quality_disable" msgid="3000046054608531995">"高画質を無効にする"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="3934392140182327163">"クローズド キャプションを有効にする"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="5508271941331836786">"クローズド キャプションを無効にする"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="8800305194045609275">"ピクチャー イン ピクチャー モードに移動"</string>
diff --git a/leanback/src/main/res/values-ko/strings.xml b/leanback/src/main/res/values-ko/strings.xml
index 9eacb53..b1587b9 100644
--- a/leanback/src/main/res/values-ko/strings.xml
+++ b/leanback/src/main/res/values-ko/strings.xml
@@ -40,7 +40,7 @@
     <string name="lb_playback_controls_thumb_down_outline" msgid="2847309435442474470">"싫어요 선택"</string>
     <string name="lb_playback_controls_repeat_none" msgid="5812341701962930499">"반복 안함"</string>
     <string name="lb_playback_controls_repeat_all" msgid="5164826436271322261">"전체 반복"</string>
-    <string name="lb_playback_controls_repeat_one" msgid="7675097479246139440">"한 항목 반복"</string>
+    <string name="lb_playback_controls_repeat_one" msgid="7675097479246139440">"한 개 반복"</string>
     <string name="lb_playback_controls_shuffle_enable" msgid="7809089255981448519">"셔플 사용 설정"</string>
     <string name="lb_playback_controls_shuffle_disable" msgid="8182435535948303910">"셔플 사용 중지"</string>
     <string name="lb_playback_controls_high_quality_enable" msgid="1862669142355962638">"고품질 사용 설정"</string>
diff --git a/leanback/src/main/res/values-mr/strings.xml b/leanback/src/main/res/values-mr/strings.xml
index b01e273..07b4e14 100644
--- a/leanback/src/main/res/values-mr/strings.xml
+++ b/leanback/src/main/res/values-mr/strings.xml
@@ -29,7 +29,7 @@
     <!-- String.format failed for translation -->
     <!-- no translation found for lb_control_display_rewind_multiplier (6173753802428649303) -->
     <skip />
-    <string name="lb_playback_controls_play" msgid="1590369760862605402">"खेळा"</string>
+    <string name="lb_playback_controls_play" msgid="1590369760862605402">"प्ले"</string>
     <string name="lb_playback_controls_pause" msgid="1769131316742618433">"विराम द्या"</string>
     <string name="lb_playback_controls_fast_forward" msgid="8966769845721269304">"पुढे ढकला"</string>
     <string name="lb_playback_controls_fast_forward_multiplier" msgid="801276177839339511">"फास्ट फॉरवर्ड %1$d"</string>
@@ -38,10 +38,10 @@
     <string name="lb_playback_controls_skip_next" msgid="4877009494447817003">"पुढील वगळा"</string>
     <string name="lb_playback_controls_skip_previous" msgid="3147124289285911980">"मागील वगळा"</string>
     <string name="lb_playback_controls_more_actions" msgid="2827883329510404797">"आणखी क्रिया"</string>
-    <string name="lb_playback_controls_thumb_up" msgid="8332816524260995892">"वर अंगठा निवड रद्द करा"</string>
-    <string name="lb_playback_controls_thumb_up_outline" msgid="1038344559734334272">"वर अंगठा निवडा"</string>
-    <string name="lb_playback_controls_thumb_down" msgid="5075744418630733006">"खाली अंगठा निवड रद्द करा"</string>
-    <string name="lb_playback_controls_thumb_down_outline" msgid="2847309435442474470">"खाली अंगठा निवडा"</string>
+    <string name="lb_playback_controls_thumb_up" msgid="8332816524260995892">"थंब अप निवड रद्द करा"</string>
+    <string name="lb_playback_controls_thumb_up_outline" msgid="1038344559734334272">"थंब अप निवडा"</string>
+    <string name="lb_playback_controls_thumb_down" msgid="5075744418630733006">"थंब डाउन निवड रद्द करा"</string>
+    <string name="lb_playback_controls_thumb_down_outline" msgid="2847309435442474470">"थंब डाउन निवडा"</string>
     <string name="lb_playback_controls_repeat_none" msgid="5812341701962930499">"काहीही रिपीट करू नका"</string>
     <string name="lb_playback_controls_repeat_all" msgid="5164826436271322261">"सर्व रिपीट करा"</string>
     <string name="lb_playback_controls_repeat_one" msgid="7675097479246139440">"एक रिपीट करा"</string>
diff --git a/leanback/src/main/res/values-or/strings.xml b/leanback/src/main/res/values-or/strings.xml
new file mode 100644
index 0000000..ce6d1ea
--- /dev/null
+++ b/leanback/src/main/res/values-or/strings.xml
@@ -0,0 +1,59 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="8126335323963415494">"ନେଭିଗେଶନ୍ ମେନୁ"</string>
+    <string name="orb_search_action" msgid="7534843523462177008">"ଖୋଜିବା କାମ"</string>
+    <string name="lb_search_bar_hint" msgid="4819380969103509861">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
+    <string name="lb_search_bar_hint_speech" msgid="2795474673510974502">"ଖୋଜିବା ପାଇଁ କୁହନ୍ତୁ"</string>
+    <string name="lb_search_bar_hint_with_title" msgid="7453744869467668159">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> ଖୋଜନ୍ତୁ"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="5851694095153624617">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> ଖୋଜିବା ପାଇଁ କୁହନ୍ତୁ"</string>
+    <string name="lb_control_display_fast_forward_multiplier" msgid="2721825378927619928">"%1$dX"</string>
+    <string name="lb_control_display_rewind_multiplier" msgid="6173753802428649303">"%1$dX"</string>
+    <string name="lb_playback_controls_play" msgid="1590369760862605402">"ଚଲାନ୍ତୁ"</string>
+    <string name="lb_playback_controls_pause" msgid="1769131316742618433">"ପଜ୍‍ କରନ୍ତୁ"</string>
+    <string name="lb_playback_controls_fast_forward" msgid="8966769845721269304">"ଫାଷ୍ଟ ଫର୍‌ୱାର୍ଡ"</string>
+    <string name="lb_playback_controls_fast_forward_multiplier" msgid="801276177839339511">"%1$dX ବେଗରେ ଫାଷ୍ଟ ଫରୱାର୍ଡ"</string>
+    <string name="lb_playback_controls_rewind" msgid="1412664391757869774">"ରିୱାଇଣ୍ଡ"</string>
+    <string name="lb_playback_controls_rewind_multiplier" msgid="8651612807713092781">"%1$dX ବେଗରେ ରିୱାଇଣ୍ଡ କରନ୍ତୁ"</string>
+    <string name="lb_playback_controls_skip_next" msgid="4877009494447817003">"ପରବର୍ତ୍ତୀକୁ ଯାଆନ୍ତୁ"</string>
+    <string name="lb_playback_controls_skip_previous" msgid="3147124289285911980">"ପୂର୍ବଟିକୁ ଛାଡ଼ିଦିଅନ୍ତୁ"</string>
+    <string name="lb_playback_controls_more_actions" msgid="2827883329510404797">"ଅଧିକ ଗତିବିଧି"</string>
+    <string name="lb_playback_controls_thumb_up" msgid="8332816524260995892">"ପସନ୍ଦକୁ ଚୟନ କରନ୍ତୁ ନାହିଁ"</string>
+    <string name="lb_playback_controls_thumb_up_outline" msgid="1038344559734334272">"ପସନ୍ଦକୁ ଚୟନ କରନ୍ତୁ"</string>
+    <string name="lb_playback_controls_thumb_down" msgid="5075744418630733006">"ପସନ୍ଦହୀନକୁ ଚୟନ କରନ୍ତୁ ନାହିଁ"</string>
+    <string name="lb_playback_controls_thumb_down_outline" msgid="2847309435442474470">"ପସନ୍ଦହୀନକୁ ଚୟନ କରନ୍ତୁ"</string>
+    <string name="lb_playback_controls_repeat_none" msgid="5812341701962930499">"କୌଣସିଟି ଦୋହରାନ୍ତୁ ନାହିଁ"</string>
+    <string name="lb_playback_controls_repeat_all" msgid="5164826436271322261">"ସବୁଗୁଡ଼ିକୁ ଦୋହରାନ୍ତୁ"</string>
+    <string name="lb_playback_controls_repeat_one" msgid="7675097479246139440">"ଗୋଟିଏ ଦୋହରାନ୍ତୁ"</string>
+    <string name="lb_playback_controls_shuffle_enable" msgid="7809089255981448519">"ଅଦଳବଦଳକୁ ସକ୍ଷମ କରନ୍ତୁ"</string>
+    <string name="lb_playback_controls_shuffle_disable" msgid="8182435535948303910">"ଅଦଳବଦଳକୁ ଅକ୍ଷମ କରନ୍ତୁ"</string>
+    <string name="lb_playback_controls_high_quality_enable" msgid="1862669142355962638">"ଉଚ୍ଚ କ୍ୱାଲିଟୀକୁ ସକ୍ଷମ କରନ୍ତୁ"</string>
+    <string name="lb_playback_controls_high_quality_disable" msgid="3000046054608531995">"ଉଚ୍ଚ କ୍ୱାଲିଟୀକୁ ଅକ୍ଷମ କରନ୍ତୁ"</string>
+    <string name="lb_playback_controls_closed_captioning_enable" msgid="3934392140182327163">"କ୍ଲୋଜଡ୍‍ କ୍ୟାପ୍ସନିଙ୍ଗକୁ ସକ୍ଷମ କରନ୍ତୁ"</string>
+    <string name="lb_playback_controls_closed_captioning_disable" msgid="5508271941331836786">"କ୍ଲୋଜଡ୍‍ କ୍ୟାପ୍ସନିଙ୍ଗକୁ ଅକ୍ଷମ କରନ୍ତୁ"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="8800305194045609275">"ଛବି ଭିତରେ ଛବି ମୋଡ୍‌ରେ ପ୍ରବେଶ କରନ୍ତୁ"</string>
+    <string name="lb_playback_time_separator" msgid="6549544638083578695">"/"</string>
+    <string name="lb_playback_controls_shown" msgid="7794717158616536936">"ମିଡିଆ ନିୟନ୍ତ୍ରଣ ଦେଖାଯାଇଛି"</string>
+    <string name="lb_playback_controls_hidden" msgid="619396299825306757">"ମିଡିଆ ନିୟନ୍ତ୍ରଣ ଲୁଚିଯାଇଛି, ଦେଖାଇବାକୁ ଡି-ପ୍ୟାଡ୍‍ ଦବାନ୍ତୁ"</string>
+    <string name="lb_guidedaction_finish_title" msgid="7747913934287176843">"ସମାପ୍ତ କରନ୍ତୁ"</string>
+    <string name="lb_guidedaction_continue_title" msgid="1122271825827282965">"ଜାରି ରଖନ୍ତୁ"</string>
+    <string name="lb_media_player_error" msgid="8748646000835486516">"MediaPlayer ତ୍ରୁଟି କୋଡ୍‍ %1$d ଅତିରିକ୍ତ %2$d"</string>
+    <string name="lb_onboarding_get_started" msgid="7674487829030291492">"ଆରମ୍ଭ କରନ୍ତୁ"</string>
+    <string name="lb_onboarding_accessibility_next" msgid="4213611627196077555">"ପରବର୍ତ୍ତୀ"</string>
+</resources>
diff --git a/leanback/src/main/res/values-uz/strings.xml b/leanback/src/main/res/values-uz/strings.xml
index 50a86af..95e0b67 100644
--- a/leanback/src/main/res/values-uz/strings.xml
+++ b/leanback/src/main/res/values-uz/strings.xml
@@ -21,8 +21,8 @@
     <string name="orb_search_action" msgid="7534843523462177008">"Qidiruv amali"</string>
     <string name="lb_search_bar_hint" msgid="4819380969103509861">"Qidiruv"</string>
     <string name="lb_search_bar_hint_speech" msgid="2795474673510974502">"Qidirish uchun gapiring"</string>
-    <string name="lb_search_bar_hint_with_title" msgid="7453744869467668159">"Qidirish: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="5851694095153624617">"Qidirish uchun ayting: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title" msgid="7453744869467668159">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> ichidan qidirish"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="5851694095153624617">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> ichidan qidirish uchun gapiring"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="2721825378927619928">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="6173753802428649303">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="1590369760862605402">"Ijro"</string>
@@ -39,14 +39,14 @@
     <string name="lb_playback_controls_thumb_down" msgid="5075744418630733006">"Salbiy baho tanlovini bekor qilish"</string>
     <string name="lb_playback_controls_thumb_down_outline" msgid="2847309435442474470">"Salbiy bahoni tanlash"</string>
     <string name="lb_playback_controls_repeat_none" msgid="5812341701962930499">"Takrorlamaslik"</string>
-    <string name="lb_playback_controls_repeat_all" msgid="5164826436271322261">"Barchasini takrorlash"</string>
+    <string name="lb_playback_controls_repeat_all" msgid="5164826436271322261">"Hammasini takrorlash"</string>
     <string name="lb_playback_controls_repeat_one" msgid="7675097479246139440">"Bir marta takrorlash"</string>
     <string name="lb_playback_controls_shuffle_enable" msgid="7809089255981448519">"Aralashtirish funksiyasini yoqish"</string>
-    <string name="lb_playback_controls_shuffle_disable" msgid="8182435535948303910">"Aralashtirish funksiyasini o‘chirish"</string>
+    <string name="lb_playback_controls_shuffle_disable" msgid="8182435535948303910">"Aralashtirmaslik"</string>
     <string name="lb_playback_controls_high_quality_enable" msgid="1862669142355962638">"Yuqori sifatni yoqish"</string>
-    <string name="lb_playback_controls_high_quality_disable" msgid="3000046054608531995">"Yuqori sifatni o‘chirib qo‘yish"</string>
+    <string name="lb_playback_controls_high_quality_disable" msgid="3000046054608531995">"Yuqori sifatda ijro qilmaslik"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="3934392140182327163">"Taglavhalarni yoqish"</string>
-    <string name="lb_playback_controls_closed_captioning_disable" msgid="5508271941331836786">"Taglavhalarni o‘chirib qo‘yish"</string>
+    <string name="lb_playback_controls_closed_captioning_disable" msgid="5508271941331836786">"Taglavhalarni chiqarmaslik"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="8800305194045609275">"Tasvir ustida tasvir rejimiga kirish"</string>
     <string name="lb_playback_time_separator" msgid="6549544638083578695">"/"</string>
     <string name="lb_playback_controls_shown" msgid="7794717158616536936">"Boshqaruv elementlari ochiq"</string>
diff --git a/leanback/src/main/res/values-zh-rTW/strings.xml b/leanback/src/main/res/values-zh-rTW/strings.xml
index bcaf11e..9aea4d2 100644
--- a/leanback/src/main/res/values-zh-rTW/strings.xml
+++ b/leanback/src/main/res/values-zh-rTW/strings.xml
@@ -34,10 +34,10 @@
     <string name="lb_playback_controls_skip_next" msgid="4877009494447817003">"跳至下一個項目"</string>
     <string name="lb_playback_controls_skip_previous" msgid="3147124289285911980">"跳至上一個項目"</string>
     <string name="lb_playback_controls_more_actions" msgid="2827883329510404797">"更多動作"</string>
-    <string name="lb_playback_controls_thumb_up" msgid="8332816524260995892">"取消選取喜歡"</string>
-    <string name="lb_playback_controls_thumb_up_outline" msgid="1038344559734334272">"選取喜歡"</string>
-    <string name="lb_playback_controls_thumb_down" msgid="5075744418630733006">"取消選取不喜歡"</string>
-    <string name="lb_playback_controls_thumb_down_outline" msgid="2847309435442474470">"選取不喜歡"</string>
+    <string name="lb_playback_controls_thumb_up" msgid="8332816524260995892">"取消選取「喜歡」"</string>
+    <string name="lb_playback_controls_thumb_up_outline" msgid="1038344559734334272">"選取「喜歡」"</string>
+    <string name="lb_playback_controls_thumb_down" msgid="5075744418630733006">"取消選取「不喜歡」"</string>
+    <string name="lb_playback_controls_thumb_down_outline" msgid="2847309435442474470">"選取「不喜歡」"</string>
     <string name="lb_playback_controls_repeat_none" msgid="5812341701962930499">"不重複播放"</string>
     <string name="lb_playback_controls_repeat_all" msgid="5164826436271322261">"重複播放所有項目"</string>
     <string name="lb_playback_controls_repeat_one" msgid="7675097479246139440">"重複播放單一項目"</string>
diff --git a/lifecycle/reactivestreams/build.gradle b/lifecycle/reactivestreams/build.gradle
index 34390b7..649c526 100644
--- a/lifecycle/reactivestreams/build.gradle
+++ b/lifecycle/reactivestreams/build.gradle
@@ -35,9 +35,7 @@
 
     testImplementation(JUNIT)
     testImplementation(RX_JAVA)
-    testImplementation(TEST_RUNNER)
-
-    androidTestImplementation(SUPPORT_APPCOMPAT, libs.support_exclude_config)
+    testImplementation(project(":arch:core-testing"))
 }
 
 supportLibrary {
@@ -48,4 +46,4 @@
     inceptionYear = "2017"
     description = "Android Lifecycle Reactivestreams"
     url = SupportLibraryExtension.ARCHITECTURE_URL
-}
\ No newline at end of file
+}
diff --git a/lifecycle/reactivestreams/ktx/OWNERS b/lifecycle/reactivestreams/ktx/OWNERS
new file mode 100644
index 0000000..e450f4c
--- /dev/null
+++ b/lifecycle/reactivestreams/ktx/OWNERS
@@ -0,0 +1 @@
+jakew@google.com
diff --git a/lifecycle/reactivestreams/ktx/build.gradle b/lifecycle/reactivestreams/ktx/build.gradle
new file mode 100644
index 0000000..2604a8e
--- /dev/null
+++ b/lifecycle/reactivestreams/ktx/build.gradle
@@ -0,0 +1,45 @@
+/*
+ * 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 androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.LibraryVersions
+import androidx.build.SupportLibraryExtension
+
+plugins {
+  id("SupportAndroidLibraryPlugin")
+  id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+  api(project(":lifecycle:lifecycle-reactivestreams"))
+  api(KOTLIN_STDLIB)
+
+  testImplementation(JUNIT)
+  testImplementation(RX_JAVA)
+  testImplementation(TRUTH)
+  testImplementation(project(":arch:core-testing"))
+}
+
+supportLibrary {
+  name = "Android Lifecycle ReactiveStreams KTX"
+  publish = true
+  mavenVersion = LibraryVersions.LIFECYCLES_EXT
+  mavenGroup = LibraryGroups.LIFECYCLE
+  inceptionYear = "2018"
+  description = "Kotlin extensions for Lifecycle ReactiveStreams"
+  url = SupportLibraryExtension.ARCHITECTURE_URL
+}
diff --git a/lifecycle/reactivestreams/ktx/src/main/AndroidManifest.xml b/lifecycle/reactivestreams/ktx/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..d2c150c
--- /dev/null
+++ b/lifecycle/reactivestreams/ktx/src/main/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<!--
+  ~ 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.
+  -->
+
+<manifest package="androidx.lifecycle.reactivestreams.ktx"/>
diff --git a/lifecycle/reactivestreams/ktx/src/main/java/androidx/lifecycle/LiveDataReactiveSteams.kt b/lifecycle/reactivestreams/ktx/src/main/java/androidx/lifecycle/LiveDataReactiveSteams.kt
new file mode 100644
index 0000000..e4a95e7
--- /dev/null
+++ b/lifecycle/reactivestreams/ktx/src/main/java/androidx/lifecycle/LiveDataReactiveSteams.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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.lifecycle
+
+import org.reactivestreams.Publisher
+
+/**
+ * Adapts the given [LiveData] stream to a ReactiveStreams [Publisher].
+ *
+ * @see LiveDataReactiveStreams.toPublisher
+ */
+inline fun <T> LiveData<T>.toPublisher(lifecycle: LifecycleOwner): Publisher<T> =
+    LiveDataReactiveStreams.toPublisher(lifecycle, this)
+
+/**
+ * Creates an observable [LiveData] stream from a ReactiveStreams [Publisher].
+ *
+ * @see LiveDataReactiveStreams.fromPublisher
+ */
+inline fun <T> Publisher<T>.toLiveData(): LiveData<T> =
+    LiveDataReactiveStreams.fromPublisher(this)
diff --git a/lifecycle/reactivestreams/ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt b/lifecycle/reactivestreams/ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt
new file mode 100644
index 0000000..ad3bdb2
--- /dev/null
+++ b/lifecycle/reactivestreams/ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt
@@ -0,0 +1,72 @@
+/*
+ * 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.lifecycle
+
+import androidx.arch.core.executor.testing.InstantTaskExecutorRule
+import com.google.common.truth.Truth.assertThat
+import io.reactivex.processors.PublishProcessor
+import io.reactivex.processors.ReplayProcessor
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+class LiveDataReactiveStreamsTest {
+    @get:Rule val rule = InstantTaskExecutorRule()
+
+    private lateinit var lifecycleOwner: LifecycleOwner
+
+    @Before fun init() {
+        lifecycleOwner = object : LifecycleOwner {
+            internal var registry = LifecycleRegistry(this)
+
+            init {
+                registry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
+            }
+
+            override fun getLifecycle(): Lifecycle {
+                return registry
+            }
+        }
+    }
+
+    @Test fun convertsFromPublisher() {
+        val processor = PublishProcessor.create<String>()
+        val liveData = processor.toLiveData()
+
+        val output = mutableListOf<String?>()
+        liveData.observe(lifecycleOwner, Observer { output.add(it) })
+
+        processor.onNext("foo")
+        processor.onNext("bar")
+        processor.onNext("baz")
+
+        assertThat(output).containsExactly("foo", "bar", "baz")
+    }
+
+    @Test fun convertsToPublisherWithSyncData() {
+        val liveData = MutableLiveData<String>()
+        liveData.value = "foo"
+
+        val outputProcessor = ReplayProcessor.create<String>()
+        liveData.toPublisher(lifecycleOwner).subscribe(outputProcessor)
+
+        liveData.value = "bar"
+        liveData.value = "baz"
+
+        assertThat(outputProcessor.values).asList().containsExactly("foo", "bar", "baz")
+    }
+}
diff --git a/lifecycle/reactivestreams/src/androidTest/AndroidManifest.xml b/lifecycle/reactivestreams/src/androidTest/AndroidManifest.xml
deleted file mode 100644
index 304fd93..0000000
--- a/lifecycle/reactivestreams/src/androidTest/AndroidManifest.xml
+++ /dev/null
@@ -1,28 +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.
-  -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="androidx.lifecycle.reactivestreams.test">
-    <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
-
-    <application>
-        <activity android:name="androidx.lifecycle.viewmodeltest.ViewModelActivity"
-                  android:theme="@style/Base.Theme.AppCompat">
-        </activity>
-    </application>
-
-</manifest>
diff --git a/lifecycle/reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java b/lifecycle/reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java
index 4af5a09..711e71e 100644
--- a/lifecycle/reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java
+++ b/lifecycle/reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java
@@ -165,7 +165,7 @@
     }
 
     /**
-     * Creates an Observable {@link LiveData} stream from a ReactiveStreams publisher.
+     * Creates an observable {@link LiveData} stream from a ReactiveStreams {@link Publisher}}.
      *
      * <p>
      * When the LiveData becomes active, it subscribes to the emissions from the Publisher.
diff --git a/lifecycle/reactivestreams/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.java b/lifecycle/reactivestreams/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.java
index 6311d94..ed792d2 100644
--- a/lifecycle/reactivestreams/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.java
+++ b/lifecycle/reactivestreams/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.java
@@ -21,15 +21,13 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
-import android.support.test.filters.SmallTest;
-
 import androidx.annotation.Nullable;
-import androidx.arch.core.executor.ArchTaskExecutor;
-import androidx.arch.core.executor.TaskExecutor;
+import androidx.arch.core.executor.testing.InstantTaskExecutorRule;
 
-import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestRule;
 import org.reactivestreams.Subscriber;
 import org.reactivestreams.Subscription;
 
@@ -47,8 +45,9 @@
 import io.reactivex.schedulers.TestScheduler;
 import io.reactivex.subjects.AsyncSubject;
 
-@SmallTest
 public class LiveDataReactiveStreamsTest {
+    @Rule public final TestRule instantTaskExecutorRule = new InstantTaskExecutorRule();
+
     private LifecycleOwner mLifecycleOwner;
 
     private final List<String> mLiveDataOutput = new ArrayList<>();
@@ -62,7 +61,6 @@
     private final ReplayProcessor<String> mOutputProcessor = ReplayProcessor.create();
 
     private static final TestScheduler sBackgroundScheduler = new TestScheduler();
-    private Thread mTestThread;
 
     @Before
     public void init() {
@@ -77,31 +75,6 @@
                 return mRegistry;
             }
         };
-        mTestThread = Thread.currentThread();
-        ArchTaskExecutor.getInstance().setDelegate(new TaskExecutor() {
-
-            @Override
-            public void executeOnDiskIO(Runnable runnable) {
-                throw new IllegalStateException();
-            }
-
-            @Override
-            public void postToMainThread(Runnable runnable) {
-                // Wrong implementation, but it is fine for test
-                runnable.run();
-            }
-
-            @Override
-            public boolean isMainThread() {
-                return Thread.currentThread() == mTestThread;
-            }
-
-        });
-    }
-
-    @After
-    public void removeExecutorDelegate() {
-        ArchTaskExecutor.getInstance().setDelegate(null);
     }
 
     @Test
diff --git a/media/build.gradle b/media/build.gradle
index eda587d..af0928b 100644
--- a/media/build.gradle
+++ b/media/build.gradle
@@ -41,4 +41,6 @@
     mavenGroup = LibraryGroups.MEDIA
     inceptionYear = "2011"
     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."
+    failOnUncheckedWarnings = false
+    failOnDeprecationWarnings = false
 }
diff --git a/media/version-compat-tests/lib/build.gradle b/media/version-compat-tests/lib/build.gradle
index df9e75c..f9dfeac 100644
--- a/media/version-compat-tests/lib/build.gradle
+++ b/media/version-compat-tests/lib/build.gradle
@@ -23,3 +23,7 @@
 dependencies {
     implementation(JUNIT)
 }
+
+supportLibrary {
+    failOnUncheckedWarnings = false
+}
\ No newline at end of file
diff --git a/mediarouter/src/main/res/values-af/strings.xml b/mediarouter/src/main/res/values-af/strings.xml
index 1968699..f2f054d 100644
--- a/mediarouter/src/main/res/values-af/strings.xml
+++ b/mediarouter/src/main/res/values-af/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Stelsel"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Toestelle"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Uitsaai-knoppie"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Uitsaai-knoppie. Ontkoppel"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Uitsaai-knoppie. Koppel tans"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Uitsaai-knoppie. Gekoppel"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Saai uit na"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Soek tans toestelle"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Ontkoppel"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Hou op uitsaai"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Maak toe"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Speel"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Onderbreek"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Stop"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Vou uit"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Vou in"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Albumkunswerk"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Volumeglyer"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Geen media is gekies nie"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Geen inligting is beskikbaar nie"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Saai tans skerm uit"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Stelsel"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Toestelle"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Uitsaai-knoppie"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Uitsaai-knoppie. Ontkoppel"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Uitsaai-knoppie. Koppel tans"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Uitsaai-knoppie. Gekoppel"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Saai uit na"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Soek tans toestelle"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Ontkoppel"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Hou op uitsaai"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Maak toe"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Speel"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Onderbreek"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Stop"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Vou uit"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Vou in"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Albumkunswerk"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Volumeglyer"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Geen media is gekies nie"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Geen inligting is beskikbaar nie"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Saai tans skerm uit"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-am/strings.xml b/mediarouter/src/main/res/values-am/strings.xml
index 5e4eb42..06ec198 100644
--- a/mediarouter/src/main/res/values-am/strings.xml
+++ b/mediarouter/src/main/res/values-am/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"ሥርዓት"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"መሣሪያዎች"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"የCast አዝራር"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Cast አዝራር። ግንኙነት ተቋርጧል"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Cast አዝራር። በመገናኘት ላይ"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"የCast አዝራር። ተገናኝቷል"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Cast አድርግ ወደ"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"መሣሪያዎችን በማግኘት ላይ"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"ግንኙነት አቋርጥ"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Cast ማድረግ አቁም"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"ዝጋ"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"አጫውት"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"ለአፍታ አቁም"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"አቁም"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"ዘርጋ"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"ሰብስብ"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"የአልበም ስነ-ጥበብ"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"ተንሸራታች የድምፅ መቆጣጠሪያ"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"ምንም ማህደረ መረጃ አልተመረጠም"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"ምንም መረጃ አይገኝም"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"ማያ ገጽን Cast በማድረግ ላይ"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"ሥርዓት"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"መሣሪያዎች"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"የCast አዝራር"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Cast አዝራር። ግንኙነት ተቋርጧል"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"የCast አዝራር። በመገናኘት ላይ"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"የCast አዝራር። ተገናኝቷል"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Cast አድርግ ወደ"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"መሣሪያዎችን በማግኘት ላይ"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"ግንኙነት አቋርጥ"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Cast ማድረግ አቁም"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"ዝጋ"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"አጫውት"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"ባለበት አቁም"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"አቁም"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"ዘርጋ"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"ሰብስብ"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"የአልበም ስነ-ጥበብ"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"ተንሸራታች የድምፅ መቆጣጠሪያ"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"ምንም ማህደረ መረጃ አልተመረጠም"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"ምንም መረጃ አይገኝም"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"ማያ ገጽን Cast በማድረግ ላይ"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-ar/strings.xml b/mediarouter/src/main/res/values-ar/strings.xml
index 12a6df3..6ff046b 100644
--- a/mediarouter/src/main/res/values-ar/strings.xml
+++ b/mediarouter/src/main/res/values-ar/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"النظام"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"الأجهزة"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"زر الإرسال"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"زر الإرسال. تم قطع الاتصال"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"زر الإرسال. جارٍ الاتصال"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"زر الإرسال. تم الاتصال"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"إرسال إلى"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"جارٍ البحث عن أجهزة"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"قطع الاتصال"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"إيقاف الإرسال"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"إغلاق"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"تشغيل"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"إيقاف مؤقت"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"إيقاف"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"توسيع"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"تصغير"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"صورة الألبوم"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"شريط تمرير مستوى الصوت"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"لم يتم اختيار أي وسائط"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"لا تتوفر أي معلومات"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"جارٍ إرسال الشاشة"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"النظام"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"الأجهزة"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"زر الإرسال"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"زر الإرسال. تم قطع الاتصال"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"زر الإرسال. جارٍ الاتصال"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"زر الإرسال. تم الاتصال"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"إرسال إلى"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"جارٍ البحث عن أجهزة"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"قطع اتصال"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"إيقاف الإرسال"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"إغلاق"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"تشغيل"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"إيقاف مؤقت"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"إيقاف"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"توسيع"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"تصغير"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"صورة الألبوم"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"شريط تمرير مستوى الصوت"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"لم يتم اختيار أي وسائط"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"لا تتوفر أي معلومات"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"جارٍ إرسال الشاشة"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-az/strings.xml b/mediarouter/src/main/res/values-az/strings.xml
index 651c84c..8f3b518 100644
--- a/mediarouter/src/main/res/values-az/strings.xml
+++ b/mediarouter/src/main/res/values-az/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistem"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Cihazlar"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Yayım düyməsi"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Yayım düyməsi. Bağlantı kəsildi"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Yayım düyməsi. Qoşulur"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Yayım düyməsi. Qoşuldu"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Bura yayımlayın"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Cihazlar axtarılır"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Ayırın"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Yayımı dayandırın"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Bağlayın"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Fasilə verin"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Dayandırın"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Dayandırın"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Genişləndirin"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Yığcamlaşdırın"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Albom incəsənəti"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Səs ayarlayıcısı"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Media seçilməyib"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Əlçatan məlumat yoxdur"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Ekran yayımlanır"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistem"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Cihazlar"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Yayım düyməsi"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Yayım düyməsi. Bağlantı kəsildi"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Yayım düyməsi. Qoşulur"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Yayım düyməsi. Qoşuldu"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Bura yayımlayın"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Cihazlar axtarılır"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Əlaqəni silin"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Yayımı dayandırın"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Bağlayın"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Oyun"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pauza"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Dayandırın"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Genişləndirin"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Yığcamlaşdırın"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Albom incəsənəti"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Səs ayarlayıcısı"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Media seçilməyib"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Əlçatan məlumat yoxdur"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Ekran yayımlanır"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-b+sr+Latn/strings.xml b/mediarouter/src/main/res/values-b+sr+Latn/strings.xml
index 805709b..91ee101 100644
--- a/mediarouter/src/main/res/values-b+sr+Latn/strings.xml
+++ b/mediarouter/src/main/res/values-b+sr+Latn/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistem"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Uređaji"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Dugme Prebaci"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Dugme Prebaci. Veza je prekinuta"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Dugme Prebaci. Povezuje se"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Dugme Prebaci. Povezan je"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Prebacite na"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Traže se uređaji"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Prekini vezu"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Zaustavi prebacivanje"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Zatvori"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Pusti"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pauziraj"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Zaustavi"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Proširi"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Skupi"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Omot albuma"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Klizač za jačinu zvuka"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Nema izabranih medija"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Nema dostupnih informacija"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Prebacuje se ekran"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistem"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Uređaji"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Dugme Prebaci"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Dugme Prebaci. Veza je prekinuta"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Dugme Prebaci. Povezuje se"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Dugme Prebaci. Povezan je"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Prebacite na"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Traže se uređaji"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Prekini vezu"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Zaustavi prebacivanje"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Zatvori"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Pusti"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pauziraj"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Zaustavi"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Proširi"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Skupi"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Omot albuma"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Klizač za jačinu zvuka"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Nema izabranih medija"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Nema dostupnih informacija"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Prebacuje se ekran"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-be/strings.xml b/mediarouter/src/main/res/values-be/strings.xml
index b0ae4d5..208b225 100644
--- a/mediarouter/src/main/res/values-be/strings.xml
+++ b/mediarouter/src/main/res/values-be/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Сістэма"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Прылады"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Кнопка трансляцыі"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Кнопка трансляцыі. Прылада адключана"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Кнопка трансляцыі. Прылада падключаецца"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Кнопка трансляцыі. Прылада падключана"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Трансліраваць на прыладу"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Пошук прылад"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Адключыць"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Спыніць трансляцыю"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Закрыць"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Прайграць"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Паўза"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Спыніць"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Разгарнуць"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Згарнуць"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Вокладка альбома"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Рэгулятар гучнасці"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Медыяфайл не выбраны"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Інфармацыя адсутнічае"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Экран трансліруецца"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Сістэма"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Прылады"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Кнопка трансляцыі"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Кнопка трансляцыі. Прылада адлучана"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Кнопка трансляцыі. Прылада злучаецца"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Кнопка трансляцыі. Прылада злучана"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Трансліраваць на прыладу"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Пошук прылад"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Адлучыць"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Спыніць трансляцыю"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Закрыць"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Прайграць"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Прыпыніць"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Спыніць"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Разгарнуць"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Згарнуць"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Вокладка альбома"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Рэгулятар гучнасці"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Мультымедыя не выбрана"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Інфармацыя адсутнічае"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Трансліруецца змесціва экрана"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-bg/strings.xml b/mediarouter/src/main/res/values-bg/strings.xml
index 7491533..03048a1 100644
--- a/mediarouter/src/main/res/values-bg/strings.xml
+++ b/mediarouter/src/main/res/values-bg/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Система"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Устройства"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Бутон за предаване"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Бутон за предаване. Връзката е прекратена"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Бутон за предаване. Установява се връзка"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Бутон за предаване. Установена е връзка"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Предаване към"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Търсят се устройства"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Прекратяване на връзката"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Спиране на предаването"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Затваряне"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Възпроизвеждане"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Поставяне на пауза"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Спиране"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Разгъване"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Свиване"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Обложка на албума"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Плъзгач за силата на звука"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Няма избрана мултимедия"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Няма налична информация"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Екранът се предава"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Система"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Устройства"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Бутон за предаване"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Бутон за предаване. Връзката е прекратена"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Бутон за предаване. Установява се връзка"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Бутон за предаване. Установена е връзка"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Предаване към"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Търсят се устройства"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Прекратяване на връзката"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Спиране на предаването"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Затваряне"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Възпроизвеждане"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Поставяне на пауза"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Спиране"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Разгъване"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Свиване"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Обложка на албума"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Плъзгач за силата на звука"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Няма избрана мултимедия"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Няма налична информация"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Екранът се предава"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-bn/strings.xml b/mediarouter/src/main/res/values-bn/strings.xml
deleted file mode 100644
index b3ed757..0000000
--- a/mediarouter/src/main/res/values-bn/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"সিস্টেম"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"ডিভাইস"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"কাস্ট করার বোতাম"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"কাস্ট করার বোতাম। কানেক্ট করা নেই"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"কাস্ট করার বোতাম। কানেক্ট করা হচ্ছে"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"কাস্ট করার বোতাম। কানেক্ট হয়েছে"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"এখানে কাস্ট করুন"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"ডিভাইস খোঁজা হচ্ছে"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"ডিসকানেক্ট"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"কাস্ট করা বন্ধ করুন"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"বন্ধ করুন"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"চালান"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"পজ করুন"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"থামান"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"বড় করে দেখুন"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"আড়াল করুন"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"অ্যালবাম আর্ট"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"ভলিউম স্লাইডার"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"কোনও মিডিয়া বেছে নেওয়া হয়নি"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"কোনও তথ্য উপলভ্য নেই"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"স্ক্রিন কাস্ট করা হচ্ছে"</string>
-</resources>
diff --git a/mediarouter/src/main/res/values-bs/strings.xml b/mediarouter/src/main/res/values-bs/strings.xml
index 553efdf..11ba502 100644
--- a/mediarouter/src/main/res/values-bs/strings.xml
+++ b/mediarouter/src/main/res/values-bs/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistem"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Uređaji"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Dugme za emitiranje"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Dugme za emitiranje. Veza je prekinuta"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Dugme za emitiranje. Povezivanje"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Dugme za emitiranje. Povezano"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Emitiranje na"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Traženje uređaja"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Prekini vezu"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Zaustavi emitiranje"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Zatvori"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Reproduciraj"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pauza"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Zaustavi"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Proširi"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Skupi"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Omot albuma"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Klizač za jačinu zvuka"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Nije odabran nijedan medij"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Nema dostupnih informacija"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Emitiranje ekrana"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistem"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Uređaji"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Dugme za emitiranje"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Dugme za emitiranje. Veza je prekinuta"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Dugme za emitiranje. Povezivanje"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Dugme za emitiranje. Povezano"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Emitiranje na"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Traženje uređaja"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Prekini vezu"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Zaustavi emitiranje"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Zatvori"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Pokreni"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pauziraj"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Zaustavi"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Proširi"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Suzi"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Omot albuma"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Klizač za jačinu zvuka"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Nije odabran nijedan medij"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Nema dostupnih informacija"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Emitiranje ekrana"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-ca/strings.xml b/mediarouter/src/main/res/values-ca/strings.xml
index e6a2f71..d5ea5b6 100644
--- a/mediarouter/src/main/res/values-ca/strings.xml
+++ b/mediarouter/src/main/res/values-ca/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistema"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Dispositius"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Botó d\'emetre"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Botó d\'emetre. Desconnectat."</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Botó d\'emetre. S\'està connectant."</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Botó d\'emetre. Connectat."</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Emet contingut a"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"S\'estan cercant dispositius"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Desconnecta"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Atura l\'emissió"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Tanca"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Reprodueix"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Posa en pausa"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Atura"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Desplega"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Replega"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Imatge de l\'àlbum"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Control lliscant de volum"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"No hi ha contingut multimèdia seleccionat"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"No hi ha informació disponible"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"S\'està emetent la pantalla"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistema"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Dispositius"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Botó d\'emetre"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Botó d\'emetre. Desconnectat."</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Botó d\'emetre. S\'està connectant."</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Botó d\'emetre. Connectat."</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Emet contingut a"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"S\'estan cercant dispositius"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Desconnecta"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Atura l\'emissió"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Tanca"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Reprodueix"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Posa en pausa"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Atura"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Desplega"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Replega"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Imatge de l\'àlbum"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Control lliscant de volum"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"No hi ha contingut multimèdia seleccionat"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"No hi ha informació disponible"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"S\'està emetent la pantalla"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-cs/strings.xml b/mediarouter/src/main/res/values-cs/strings.xml
index a914d34..d8e6c6b 100644
--- a/mediarouter/src/main/res/values-cs/strings.xml
+++ b/mediarouter/src/main/res/values-cs/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Systém"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Zařízení"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Tlačítko odesílání"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Tlačítko odesílání. Odpojeno"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Tlačítko odesílání. Připojování"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Tlačítko odesílání. Připojeno"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Odeslat do zařízení"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Hledání zařízení"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Odpojit"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Zastavit odesílání"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Zavřít"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Přehrát"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pozastavit"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Ukončit"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Rozbalit"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Sbalit"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Obal alba"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Posuvník hlasitosti"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Není vybrán žádný mediální obsah"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Nejsou k dispozici žádné informace"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Odesílání obsahu obrazovky"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Systém"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Zařízení"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Tlačítko odesílání"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Tlačítko odesílání. Odpojeno"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Tlačítko odesílání. Připojování"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Tlačítko odesílání. Připojeno"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Odeslat do zařízení"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Hledání zařízení"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Odpojit"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Zastavit odesílání"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Zavřít"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Přehrát"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pozastavit"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Zastavit"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Rozbalit"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Sbalit"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Obal alba"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Posuvník hlasitosti"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Není vybrán žádný mediální obsah"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Nejsou k dispozici žádné informace"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Odesílání obsahu obrazovky"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-da/strings.xml b/mediarouter/src/main/res/values-da/strings.xml
index 5736cb5..5a95576 100644
--- a/mediarouter/src/main/res/values-da/strings.xml
+++ b/mediarouter/src/main/res/values-da/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"System"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Enheder"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Cast-knap"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Cast-knap. Forbindelsen er afbrudt"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Cast-knap. Opretter forbindelse"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Cast-knap. Tilsluttet"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Cast til"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Finder enheder"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Afbryd"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Stop med at caste"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Luk"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Afspil"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Sæt på pause"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Stop"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Udvid"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Skjul"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Albumgrafik"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Lydstyrkeskyder"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Ingen medier er markeret"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Der er ingen tilgængelige oplysninger"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Skærmen castes"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"System"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Enheder"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Cast-knap"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Cast-knap. Forbindelsen er afbrudt"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Cast-knap. Opretter forbindelse"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Cast-knap. Der er oprettet forbindelse"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Cast til"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Finder enheder"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Afbryd forbindelse"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Stop med at caste"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Luk"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Afspil"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Sæt på pause"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Stop"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Udvid"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Skjul"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Albumgrafik"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Lydstyrkeskyder"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Ingen medier er markeret"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Der er ingen tilgængelige oplysninger"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Skærmen castes"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-de/strings.xml b/mediarouter/src/main/res/values-de/strings.xml
index bfab0be..e2927da 100644
--- a/mediarouter/src/main/res/values-de/strings.xml
+++ b/mediarouter/src/main/res/values-de/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"System"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Geräte"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Cast-Symbol"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Cast-Symbol. Nicht verbunden"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Cast-Symbol. Verbindung wird hergestellt"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Cast-Symbol. Verbunden"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Streamen auf"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Keine Geräte gefunden"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Trennen"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Streaming beenden"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Schließen"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Wiedergeben"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pausieren"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Beenden"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Maximieren"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Minimieren"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Albumcover"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Schieberegler für die Lautstärke"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Keine Medien ausgewählt"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Keine Informationen verfügbar"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Bildschirm wird übertragen"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"System"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Geräte"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Cast-Symbol"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Cast-Symbol. Nicht verbunden."</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Cast-Symbol. Verbindung wird hergestellt."</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Cast-Symbol. Verbunden."</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Streamen auf"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Geräte werden gesucht"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Trennen"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Streaming beenden"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Schließen"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Wiedergabe"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pause"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Stopp"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Maximieren"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Minimieren"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Albumcover"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Schieberegler für die Lautstärke"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Keine Medien ausgewählt"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Keine Informationen verfügbar"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Bildschirm wird übertragen"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-el/strings.xml b/mediarouter/src/main/res/values-el/strings.xml
index 6290c3d..d689f25 100644
--- a/mediarouter/src/main/res/values-el/strings.xml
+++ b/mediarouter/src/main/res/values-el/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Σύστημα"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Συσκευές"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Κουμπί μετάδοσης"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Κουμπί μετάδοσης. Αποσυνδέθηκε."</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Κουμπί μετάδοση. Σύνδεση."</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Κουμπί μετάδοσης. Συνδέθηκε."</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Μετάδοση σε"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Εύρεση συσκευών"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Αποσύνδεση"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Διακοπή μετάδοσης"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Κλείσιμο"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Αναπαραγωγή"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Παύση"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Διακοπή"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Ανάπτυξη"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Σύμπτυξη"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Εξώφυλλο άλμπουμ"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Ρυθμιστικό έντασης ήχου"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Δεν επιλέχθηκαν μέσα"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Δεν υπάρχουν διαθέσιμες πληροφορίες"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Μετάδοση οθόνης"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Σύστημα"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Συσκευές"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Κουμπί μετάδοσης"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Κουμπί μετάδοσης. Αποσυνδέθηκε"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Κουμπί μετάδοσης. Σύνδεση"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Κουμπί μετάδοσης. Συνδέθηκε"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Μετάδοση σε"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Εύρεση συσκευών"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Αποσύνδεση"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Διακοπή μετάδοσης"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Κλείσιμο"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Αναπαραγωγή"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Παύση"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Διακοπή"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Ανάπτυξη"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Σύμπτυξη"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Εξώφυλλο άλμπουμ"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Ρυθμιστικό έντασης ήχου"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Δεν επιλέχθηκαν μέσα"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Δεν υπάρχουν διαθέσιμες πληροφορίες"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Μετάδοση οθόνης"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-en-rAU/strings.xml b/mediarouter/src/main/res/values-en-rAU/strings.xml
index 420d536..df5801c 100644
--- a/mediarouter/src/main/res/values-en-rAU/strings.xml
+++ b/mediarouter/src/main/res/values-en-rAU/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"System"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Devices"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Cast button"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Cast button. Disconnected"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Cast button. Connecting"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Cast button. Connected"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Cast to"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Finding devices"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Disconnect"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Stop casting"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Close"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Play"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pause"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Stop"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Expand"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Collapse"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Album art"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Volume slider"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"No media selected"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"No info available"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Casting screen"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"System"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Devices"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Cast button"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Cast button. Disconnected"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Cast button. Connecting"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Cast button. Connected"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Cast to"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Finding devices"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Disconnect"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Stop casting"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Close"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Play"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pause"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Stop"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Expand"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Collapse"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Album art"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Volume slider"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"No media selected"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"No info available"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Casting screen"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-en-rCA/strings.xml b/mediarouter/src/main/res/values-en-rCA/strings.xml
index 420d536..df5801c 100644
--- a/mediarouter/src/main/res/values-en-rCA/strings.xml
+++ b/mediarouter/src/main/res/values-en-rCA/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"System"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Devices"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Cast button"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Cast button. Disconnected"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Cast button. Connecting"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Cast button. Connected"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Cast to"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Finding devices"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Disconnect"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Stop casting"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Close"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Play"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pause"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Stop"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Expand"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Collapse"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Album art"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Volume slider"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"No media selected"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"No info available"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Casting screen"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"System"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Devices"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Cast button"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Cast button. Disconnected"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Cast button. Connecting"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Cast button. Connected"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Cast to"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Finding devices"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Disconnect"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Stop casting"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Close"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Play"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pause"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Stop"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Expand"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Collapse"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Album art"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Volume slider"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"No media selected"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"No info available"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Casting screen"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-en-rGB/strings.xml b/mediarouter/src/main/res/values-en-rGB/strings.xml
index 420d536..df5801c 100644
--- a/mediarouter/src/main/res/values-en-rGB/strings.xml
+++ b/mediarouter/src/main/res/values-en-rGB/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"System"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Devices"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Cast button"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Cast button. Disconnected"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Cast button. Connecting"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Cast button. Connected"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Cast to"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Finding devices"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Disconnect"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Stop casting"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Close"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Play"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pause"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Stop"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Expand"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Collapse"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Album art"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Volume slider"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"No media selected"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"No info available"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Casting screen"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"System"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Devices"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Cast button"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Cast button. Disconnected"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Cast button. Connecting"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Cast button. Connected"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Cast to"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Finding devices"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Disconnect"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Stop casting"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Close"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Play"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pause"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Stop"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Expand"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Collapse"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Album art"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Volume slider"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"No media selected"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"No info available"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Casting screen"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-en-rIN/strings.xml b/mediarouter/src/main/res/values-en-rIN/strings.xml
index 420d536..df5801c 100644
--- a/mediarouter/src/main/res/values-en-rIN/strings.xml
+++ b/mediarouter/src/main/res/values-en-rIN/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"System"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Devices"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Cast button"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Cast button. Disconnected"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Cast button. Connecting"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Cast button. Connected"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Cast to"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Finding devices"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Disconnect"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Stop casting"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Close"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Play"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pause"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Stop"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Expand"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Collapse"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Album art"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Volume slider"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"No media selected"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"No info available"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Casting screen"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"System"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Devices"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Cast button"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Cast button. Disconnected"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Cast button. Connecting"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Cast button. Connected"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Cast to"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Finding devices"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Disconnect"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Stop casting"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Close"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Play"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pause"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Stop"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Expand"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Collapse"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Album art"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Volume slider"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"No media selected"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"No info available"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Casting screen"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-en-rXC/strings.xml b/mediarouter/src/main/res/values-en-rXC/strings.xml
index 03083ad..993d212 100644
--- a/mediarouter/src/main/res/values-en-rXC/strings.xml
+++ b/mediarouter/src/main/res/values-en-rXC/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‏‏‎‏‏‎‏‏‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‎‎System‎‏‎‎‏‎"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‏‏‏‎‎‎‏‎‎‎‏‏‎‏‎‎‏‏‎‏‎‏‏‏‎‎‏‏‎‎‎‎‎‏‎‎‏‎‏‏‏‎‎‏‎‏‎Devices‎‏‎‎‏‎"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‎‎‎‏‏‎‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‎‏‏‏‎Cast button‎‏‎‎‏‎"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‏‎‎‎‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‏‎‎Cast button. Disconnected‎‏‎‎‏‎"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎Cast button. Connecting‎‏‎‎‏‎"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‎‎‏‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‎‏‎‏‏‎‏‎‏‎‎‎‎‎‏‎‏‎‎‎‎‎‏‏‎‎‏‏‎Cast button. Connected‎‏‎‎‏‎"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‎‏‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‎‎‏‎‎‏‏‎Cast to‎‏‎‎‏‎"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‎‏‎‏‎‏‏‎‎‎‎‎‏‏‎‎‏‎‏‏‏‎‏‏‎‏‏‎‎Finding devices‎‏‎‎‏‎"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‎‏‏‎‏‏‎‎‎‏‎‏‏‏‎‎‏‎‏‎‎‎‏‎‏‏‎‏‎‏‎‎‏‏‎‎‎‎‎‎Disconnect‎‏‎‎‏‎"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‎‎‎‏‏‏‏‎‎‎‎‎‏‎‏‏‎‏‎‎‎‎‎‏‏‎‎‏‎‎‏‎‎‎‎‎Stop casting‎‏‎‎‏‎"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‎‎‏‎‏‎‎‎‏‏‎‎‏‎‎‎Close‎‏‎‎‏‎"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‏‎‏‎‎‎‏‏‏‎‎‎‎‎‎‎‎‏‏‎‎‎‏‎‎‎‎‏‏‎‎‏‎‎‏‎‎‎‎‎‎Play‎‏‎‎‏‎"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‏‎‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‏‎‎‎‏‎‎‏‎‏‎‏‎‏‎‏‎‏‎‎‏‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‎Pause‎‏‎‎‏‎"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‏‎‎‎‎‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‏‎‏‏‎‎‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‏‎‏‏‎Stop‎‏‎‎‏‎"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‎‎‎‎‏‎‏‏‏‏‏‎‎‎‏‎‏‏‎‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎‏‏‏‏‏‎‎‏‏‏‎Expand‎‏‎‎‏‎"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‏‎‏‎‏‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‎‏‏‏‎‎‎‎‏‎‏‏‎‎‎‎‏‎‎‎‏‏‎Collapse‎‏‎‎‏‎"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‏‏‎‏‎‎‎‏‏‎‎‏‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‎‎‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‎‎‎‎‎Album art‎‏‎‎‏‎"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‎‏‎‏‎‏‏‏‎‏‎‎‎‎‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‏‎‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‎‏‎‏‏‎Volume slider‎‏‎‎‏‎"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‎‏‏‎‏‎‏‏‎‎‎‏‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‎‎‏‎‎‎‏‎‏‎‏‏‎No media selected‎‏‎‎‏‎"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‏‎‎‎‏‏‎‎‎‏‏‎‏‏‎‏‏‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‏‏‎‏‏‏‏‎‏‎‏‏‎‎‎No info available‎‏‎‎‏‎"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‎‏‏‎‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‏‏‏‏‎‏‏‏‏‏‏‎‎‎Casting screen‎‏‎‎‏‎"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‎‎‏‎‏‎‎‏‏‏‏‎‎‏‎‎‎‏‎‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎‎‏‏‎‏‏‏‏‎‏‏‎‏‏‏‎‎‏‎‎System‎‏‎‎‏‎"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‎‏‏‎‏‎‏‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‏‎‎Devices‎‏‎‎‏‎"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‏‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‏‎‏‎‎‏‏‎‏‏‏‏‏‏‏‏‎Cast button‎‏‎‎‏‎"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‏‎‎‎‎‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‎‏‏‎‏‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎Cast button. Disconnected‎‏‎‎‏‎"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎‏‎‎‎‎Cast button. Connecting‎‏‎‎‏‎"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‏‎‏‏‎‏‎‎‎‎‎‎‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‏‎‎‏‎‎‎‏‏‏‏‎Cast button. Connected‎‏‎‎‏‎"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‎‎‎‏‎‏‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‎‎‎‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎Cast to‎‏‎‎‏‎"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‏‎‎‏‎‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‎‎‏‎Finding devices‎‏‎‎‏‎"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‎‎‏‎‏‏‎‎‎‏‎‏‎‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‎‏‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‎‏‏‏‏‏‏‎Disconnect‎‏‎‎‏‎"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‎‏‎‎‎‏‏‎‏‏‏‎‏‏‏‏‏‎‎‎‎‎‏‏‏‎‎‎‏‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‎‏‏‎Stop casting‎‏‎‎‏‎"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‏‏‎‎‏‏‏‎‏‎‎‎‎‎‎‎‏‏‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎Close‎‏‎‎‏‎"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‏‎‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎Play‎‏‎‎‏‎"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‎‎‎‏‎‏‎‎‎‏‏‏‎‎‎‏‏‎‏‎‎‏‏‎‎‏‎Pause‎‏‎‎‏‎"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‏‏‎‎‎‏‎‏‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‏‎‏‏‏‎‎‏‎‎‏‏‏‏‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎Stop‎‏‎‎‏‎"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‏‏‏‏‏‎‎‎‏‏‎‎‎‏‎‏‏‏‎‎‎‎‎‏‏‏‎‎‎‎‎‏‎‏‎‎‏‎‎‎‎‎‎‎‎‎‏‏‏‎‏‎‎‎Expand‎‏‎‎‏‎"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‏‎‏‏‏‎‏‏‏‏‎‏‎‏‏‎‏‏‎‏‏‏‎‏‎Collapse‎‏‎‎‏‎"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‏‏‎‎‏‏‏‎‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‎‎‏‏‏‎‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‎Album art‎‏‎‎‏‎"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‎‏‎‏‎‏‏‏‎‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‏‎‎‏‏‎‏‎‏‎‏‎‎‎‎‎Volume slider‎‏‎‎‏‎"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‎‏‎‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‏‎‏‎‏‎‎‏‎‎‎‎‎‎‎‏‏‏‎‎No media selected‎‏‎‎‏‎"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‎‎‏‎‎‏‎‎‎‏‎‏‎‎‏‎‎‏‏‎‏‏‎‏‏‏‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‏‎‏‎‎No info available‎‏‎‎‏‎"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‏‎‎‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎‏‎‏‎‏‏‏‏‎‏‎Casting screen‎‏‎‎‏‎"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-es-rUS/strings.xml b/mediarouter/src/main/res/values-es-rUS/strings.xml
index 51a2955..cec1175 100644
--- a/mediarouter/src/main/res/values-es-rUS/strings.xml
+++ b/mediarouter/src/main/res/values-es-rUS/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistema"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Dispositivos"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Botón para transmitir"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Botón para transmitir (desconectado)"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Botón para transmitir (conectando)"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Botón para transmitir (conectado)"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Transmitir a"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Buscando dispositivos"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Desconectar"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Detener transmisión"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Cerrar"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Reproducir"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pausar"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Detener"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Expandir"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Contraer"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Imagen del álbum"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Control deslizante del volumen"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"No se seleccionó ningún contenido multimedia"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Sin información disponible"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Transmitiendo pantalla"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistema"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Dispositivos"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Botón para transmitir"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Botón para transmitir (desconectado)"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Botón para transmitir (conectando)"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Botón para transmitir (conectado)"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Transmitir a"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Buscando dispositivos"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Desconectar"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Detener transmisión"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Cerrar"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Reproducir"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pausa"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Detener"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Expandir"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Contraer"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Imagen del álbum"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Control deslizante del volumen"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"No se seleccionó ningún contenido multimedia"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Sin información disponible"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Transmitiendo pantalla"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-es/strings.xml b/mediarouter/src/main/res/values-es/strings.xml
index e07a751..34de0dc 100644
--- a/mediarouter/src/main/res/values-es/strings.xml
+++ b/mediarouter/src/main/res/values-es/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistema"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Dispositivos"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Botón de enviar"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Botón de enviar. Desconectado"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Botón de enviar. Conectando"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Botón de enviar. Conectado"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Enviar a"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Buscando dispositivos"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Desconectar"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Detener envío"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Cerrar"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Reproducir"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pausar"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Detener"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Mostrar"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Ocultar"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Carátula del álbum"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Control deslizante de volumen"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"No se ha seleccionado contenido multimedia"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"No hay información disponible"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Enviando pantalla"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistema"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Dispositivos"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Botón de enviar"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Botón de enviar. Desconectado"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Botón de enviar. Conectando"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Botón de enviar. Conectado"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Enviar a"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Buscando dispositivos"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Desconectar"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Detener envío"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Cerrar"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Reproducir"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pausar"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Detener"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Mostrar"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Ocultar"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Carátula del álbum"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Control deslizante de volumen"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"No se ha seleccionado contenido multimedia"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"No hay información disponible"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Enviando pantalla"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-et/strings.xml b/mediarouter/src/main/res/values-et/strings.xml
index 4ff3f62..386462a 100644
--- a/mediarouter/src/main/res/values-et/strings.xml
+++ b/mediarouter/src/main/res/values-et/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Süsteem"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Seadmed"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Ülekandenupp"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Ülekandenupp. Ühendus on katkestatud"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Ülekandenupp. Ühendamine"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Ülekandenupp. Ühendatud"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Ülekandmine seadmesse"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Seadmete otsimine"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Katkesta ühendus"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Peata ülekandmine"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Sulgemine"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Esitamine"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Peatamine"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Peatamine"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Laiendamine"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Ahendamine"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Albumi kujundus"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Helitugevuse liugur"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Meediat pole valitud"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Teave pole saadaval"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Ekraanikuva ülekandmine"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Süsteem"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Seadmed"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Ülekandenupp"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Ülekandenupp. Ühendus on katkestatud"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Ülekandenupp. Ühendamine"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Ülekandenupp. Ühendatud"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Ülekandmine seadmesse"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Seadmete otsimine"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Katkesta ühendus"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Katkesta ülekandmine"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Sule"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Esita"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Peata"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Katkesta"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Laienda"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Ahenda"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Albumi kujundus"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Helitugevuse liugur"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Meediat pole valitud"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Teave pole saadaval"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Ekraanikuva ülekandmine"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-eu/strings.xml b/mediarouter/src/main/res/values-eu/strings.xml
index 18aeed3..edde802 100644
--- a/mediarouter/src/main/res/values-eu/strings.xml
+++ b/mediarouter/src/main/res/values-eu/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistema"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Gailuak"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Igorri botoia"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Igortzeko botoia. Deskonektatuta"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Igortzeko botoia. Konektatzen"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Igortzeko botoia. Konektatuta"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Igorri hona"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Gailuak bilatzen"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Deskonektatu"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Utzi igortzeari"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Itxi"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Erreproduzitu"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pausatu"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Gelditu"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Zabaldu"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Tolestu"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Albumaren azala"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Bolumenaren graduatzailea"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Ez da ezer hautatu"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Ez dago informaziorik"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Pantaila igortzen"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistema"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Gailuak"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"\"Igorri\" botoia"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"\"Igorri\" botoia. Deskonektatuta."</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"\"Igorri\" botoia. Konektatzen."</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"\"Igorri\" botoia. Konektatuta."</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Igorri hona"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Gailuak bilatzen"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Deskonektatu"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Utzi igortzeari"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Itxi"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Erreproduzitu"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pausatu"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Utzi"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Zabaldu"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Tolestu"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Albumaren azala"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Bolumenaren graduatzailea"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Ez da hautatu multimedia-edukirik"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Ez dago informaziorik"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Pantaila igortzen"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-fa/strings.xml b/mediarouter/src/main/res/values-fa/strings.xml
index eb0ea6c..4c9928e 100644
--- a/mediarouter/src/main/res/values-fa/strings.xml
+++ b/mediarouter/src/main/res/values-fa/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"سیستم"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"دستگاه‌ها"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"دکمه ارسال محتوا"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"دکمه فرستادن. اتصال قطع شد"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"دکمه فرستادن. درحال اتصال"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"دکمه فرستادن. متصل"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"ارسال محتوا به"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"پیدا کردن دستگاه‌ها"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"قطع اتصال"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"توقف ارسال محتوا"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"بستن"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"پخش"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"مکث"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"توقف"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"بزرگ کردن"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"کوچک کردن"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"عکس روی جلد آلبوم"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"لغزنده میزان صدا"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"رسانه‌ای انتخاب نشده است"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"اطلاعات دردسترس نیست"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"صفحه ارسال محتوا"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"سیستم"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"دستگاه‌ها"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"دکمه فرستادن"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"دکمه فرستادن. اتصال قطع شد"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"دکمه فرستادن. درحال اتصال"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"دکمه فرستادن. متصل"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"ارسال محتوا به"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"درحال پیدا کردن دستگاه‌ها"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"قطع اتصال"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"توقف ارسال محتوا"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"بستن"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"پخش"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"مکث"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"توقف"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"بزرگ کردن"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"کوچک کردن"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"عکس روی جلد آلبوم"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"لغزنده میزان صدا"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"رسانه‌ای انتخاب نشده است"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"اطلاعاتی دردسترس نیست"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"صفحه ارسال محتوا"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-fi/strings.xml b/mediarouter/src/main/res/values-fi/strings.xml
index a365147..6c51525 100644
--- a/mediarouter/src/main/res/values-fi/strings.xml
+++ b/mediarouter/src/main/res/values-fi/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Järjestelmä"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Laitteet"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Cast-painike"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Cast-painike. Yhteys katkaistu"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Cast-painike. Yhdistetään"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Cast-painike. Yhdistetty"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Suoratoiston kohde"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Etsitään laitteita"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Katkaise yhteys"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Lopeta suoratoisto"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Sulje"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Toista"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Keskeytä"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Lopeta"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Laajenna"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Tiivistä"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Albumin kansikuva"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Äänenvoimakkuuden liukusäädin"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Ei valittua mediaa"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Ei tietoja saatavilla"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Suoratoistetaan näyttöä"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Järjestelmä"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Laitteet"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Cast-painike"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Cast-painike. Yhteys katkaistu"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Cast-painike. Yhdistetään"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Cast-painike. Yhdistetty"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Suoratoiston kohde"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Etsitään laitteita"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Katkaise yhteys"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Lopeta suoratoisto"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Sulje"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Toista"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Keskeytä"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Pysäytä"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Laajenna"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Tiivistä"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Albumin kansikuva"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Äänenvoimakkuuden liukusäädin"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Ei valittua mediaa"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Ei tietoja saatavilla"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Suoratoistetaan näyttöä"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-fr-rCA/strings.xml b/mediarouter/src/main/res/values-fr-rCA/strings.xml
index 8df9031..e5cb25e 100644
--- a/mediarouter/src/main/res/values-fr-rCA/strings.xml
+++ b/mediarouter/src/main/res/values-fr-rCA/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Système"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Appareils"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Bouton Diffuser"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Bouton Diffuser. Déconnecté"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Bouton Diffuser. Connexion en cours…"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Bouton Diffuser. Connecté"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Diffuser vers"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Recherche d\'appareils"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Dissocier"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Arrêter la diffusion"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Fermer"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Lire"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pause"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Arrêter"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Développer"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Réduire"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Image de l\'album"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Curseur de réglage du volume"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Aucun média sélectionné"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Aucune donnée trouvée"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Diffusion de l\'écran en cours"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Système"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Appareils"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Bouton Diffuser"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Bouton Diffuser. Déconnecté"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Bouton Diffuser. Connexion en cours…"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Bouton Diffuser. Connecté"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Diffuser vers"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Recherche d\'appareils en cours…"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Déconnecter"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Arrêter la diffusion"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Fermer"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Lire"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pause"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Arrêter"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Développer"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Réduire"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Image de l\'album"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Curseur de réglage du volume"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Aucun média sélectionné"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Aucune donnée trouvée"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Diffusion de l\'écran en cours…"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-fr/strings.xml b/mediarouter/src/main/res/values-fr/strings.xml
index cfce49b..8518e0b 100644
--- a/mediarouter/src/main/res/values-fr/strings.xml
+++ b/mediarouter/src/main/res/values-fr/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Système"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Appareils"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Icône Cast"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Icône Cast. Déconnecté"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Icône Cast. Connexion…"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Icône Cast. Connecté"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Caster sur"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Recherche d\'appareils…"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Déconnecter"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Arrêter la diffusion"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Fermer"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Lecture"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pause"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Arrêt"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Développer"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Réduire"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Image de l\'album"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Curseur de volume"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Aucun contenu multimédia sélectionné"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Aucune information disponible"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Diffusion de l\'écran"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Système"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Appareils"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Icône Cast"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Icône Cast. Déconnecté"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Icône Cast. Connexion…"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Icône Cast. Connecté"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Caster sur"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Recherche d\'appareils…"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Déconnecter"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Arrêter la diffusion"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Fermer"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Lecture"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pause"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Arrêt"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Développer"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Réduire"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Image de l\'album"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Curseur de volume"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Aucun contenu multimédia sélectionné"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Aucune information disponible"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Diffusion de l\'écran…"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-gl/strings.xml b/mediarouter/src/main/res/values-gl/strings.xml
index 2eb5e04..2ac850e 100644
--- a/mediarouter/src/main/res/values-gl/strings.xml
+++ b/mediarouter/src/main/res/values-gl/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistema"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Dispositivos"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Botón de emitir"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Botón de emitir. Desconectado"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Botón de emitir. Conectando"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Botón de emitir. Conectado"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Emitir en"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Buscando dispositivos"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Desconectar"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Deter emisión"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Pechar"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Reproducir"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pausar"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Deter"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Despregar"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Contraer"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Portada do álbum"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Control desprazable do volume"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Non se seleccionou ningún recurso multimedia"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Non hai información dispoñible"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Emitindo a pantalla"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistema"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Dispositivos"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Botón de emitir"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Botón de emitir. Desconectado"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Botón de emitir. Conectando"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Botón de emitir. Conectado"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Emitir en"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Buscando dispositivos"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Desconectar"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Deter emisión"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Pechar"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Reproducir"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pór en pausa"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Deter"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Despregar"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Contraer"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Portada do álbum"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Control desprazable do volume"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Non se seleccionou ningún recurso multimedia"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Non hai información dispoñible"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Emitindo a pantalla"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-gu/strings.xml b/mediarouter/src/main/res/values-gu/strings.xml
deleted file mode 100644
index 8459bcd..0000000
--- a/mediarouter/src/main/res/values-gu/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"સિસ્ટમ"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"ઉપકરણો"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"કાસ્ટ બટન"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"કાસ્ટ બટન. ડિસ્કનેક્ટેડ"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"કાસ્ટ બટન. કનેક્ટ કરી રહ્યાં છીએ"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"કાસ્ટ બટન. કનેક્ટેડ"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"આના પર કાસ્ટ કરો"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"ઉપકરણો શોધી રહ્યાં છીએ"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"ડિસ્કનેક્ટ કરો"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"કાસ્ટ કરવાનું રોકો"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"બંધ કરો"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"ચલાવો"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"થોભાવો"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"રોકો"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"વિસ્તાર કરો"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"સંકુચિત કરો"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"આલ્બમ આર્ટ"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"વૉલ્યુમ સ્લાઇડર"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"કોઈ મીડિયા પસંદ કરેલ નથી"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"કોઈ માહિતી ઉપલબ્ધ નથી"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"સ્ક્રીનને કાસ્ટ કરી રહ્યાં છીએ"</string>
-</resources>
diff --git a/mediarouter/src/main/res/values-hi/strings.xml b/mediarouter/src/main/res/values-hi/strings.xml
deleted file mode 100644
index 891d765..0000000
--- a/mediarouter/src/main/res/values-hi/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"सिस्‍टम"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"डिवाइस"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"कास्ट करें बटन"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"कास्ट करें बटन. नहीं जुड़ा है"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"कास्ट करें बटन. जुड़ रहा है"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"कास्ट करें बटन. जुड़ा है"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"इस पर कास्‍ट करें"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"डिवाइस ढूंढे जा रहे हैं"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"कनेक्शन हटाएं"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"कास्ट करना रोकें"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"बंद करें"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"चलाएं"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"रोकें"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"रुकें"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"सदस्याें की सूची को बड़ा करके देखें"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"सदस्याें की सूची छोटी करें"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"एल्बम आर्ट"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"आवाज़ बढ़ाने या घटाने वाला स्लाइडर"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"कोई मीडिया चुना नहीं गया"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"कोई जानकारी मौजूद नहीं है"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"स्क्रीन कास्ट की जा रही है"</string>
-</resources>
diff --git a/mediarouter/src/main/res/values-hr/strings.xml b/mediarouter/src/main/res/values-hr/strings.xml
index e17a0e7..425cf36 100644
--- a/mediarouter/src/main/res/values-hr/strings.xml
+++ b/mediarouter/src/main/res/values-hr/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sustav"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Uređaji"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Gumb za emitiranje"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Gumb za emitiranje. Veza prekinuta"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Gumb za emitiranje. Povezivanje"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Gumb za emitiranje. Povezan"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Emitiranje na"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Traženje uređaja"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Prekini"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Zaustavi emitiranje"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Zatvori"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Pokreni"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pauza"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Zaustavi"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Proširi"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Sažmi"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Naslovnica albuma"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Klizač za glasnoću"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Nije odabran nijedan medij"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Informacije nisu dostupne"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Emitiranje zaslona"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sustav"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Uređaji"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Gumb za emitiranje"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Gumb za emitiranje. Veza prekinuta"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Gumb za emitiranje. Povezivanje"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Gumb za emitiranje. Povezan"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Emitiranje na"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Traženje uređaja"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Prekini vezu"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Zaustavi emitiranje"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Zatvori"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Reproduciraj"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pauziraj"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Zaustavi"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Proširi"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Sažmi"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Naslovnica albuma"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Klizač za glasnoću"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Nije odabran nijedan medij"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Informacije nisu dostupne"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Emitiranje zaslona"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-hu/strings.xml b/mediarouter/src/main/res/values-hu/strings.xml
index a9f80f4..7d47861 100644
--- a/mediarouter/src/main/res/values-hu/strings.xml
+++ b/mediarouter/src/main/res/values-hu/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Rendszer"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Eszközök"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Átküldés gomb"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Átküldés gomb. Kapcsolat bontva"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Átküldés gomb. Csatlakozás"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Átküldés gomb. Csatlakoztatva"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Átküldés ide:"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Eszközök keresése"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Leválasztás"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Átküldés leállítása"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Bezárás"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Lejátszás"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Szünet"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Leállítás"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Kibontás"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Összecsukás"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Lemezborító"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Hangerőszabályzó"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Nincs médiatartalom kiválasztva"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Nincs információ"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Képernyőtartalom átküldése…"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Rendszer"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Eszközök"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Átküldés gomb"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Átküldés gomb. Kapcsolat bontva"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Átküldés gomb. Csatlakozás"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Átküldés gomb. Csatlakoztatva"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Átküldés ide:"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Eszközök keresése"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Leválasztás"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Átküldés leállítása"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Bezárás"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Lejátszás"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Szünet"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Leállítás"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Kibontás"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Összecsukás"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Lemezborító"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Hangerőszabályzó"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Nincs kiválasztott médiatartalom"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Nincs információ"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Képernyőtartalom átküldése…"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-hy/strings.xml b/mediarouter/src/main/res/values-hy/strings.xml
index e48fac5..77cba70 100644
--- a/mediarouter/src/main/res/values-hy/strings.xml
+++ b/mediarouter/src/main/res/values-hy/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Համակարգ"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Սարքեր"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Հեռարձակման կոճակ"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Հեռարձակման կոճակ: Սարքն անջատած է:"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Հեռարձակման կոճակ: Սարքը միանում է:"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Հեռարձակման կոճակ: Սարքը միացված է:"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Ընտրեք սարք"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Սարքերի որոնում"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Անջատել"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Դադարեցնել հեռարձակումը"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Փակել"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Նվագարկել"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Ընդհատել"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Դադարեցնել"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Ընդարձակել"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Կոծկել"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Ալբոմի շապիկ"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Ձայնի ուժգնության կարգավորիչ"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Մեդիա ֆայլ չի ընտրվել"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Հասանելի տեղեկություններ չկան"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Էկրանի հեռարձակում"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Համակարգ"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Սարքեր"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Հեռարձակման կոճակ"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Հեռարձակման կոճակ: Սարքն անջատած է:"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Հեռարձակման կոճակ: Սարքը միանում է:"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Հեռարձակման կոճակ: Սարքը միացված է:"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Ընտրեք սարք"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Սարքերի որոնում"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Անջատել"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Դադարեցնել հեռարձակումը"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Փակել"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Նվագարկել"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Դադարեցնել"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Կանգնեցնել"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Ծավալել"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Ծալել"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Ալբոմի շապիկ"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Ձայնի ուժգնության կարգավորիչ"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Մեդիա ֆայլ չի ընտրվել"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Տեղեկություններ չկան"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Էկրանի հեռարձակում"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-in/strings.xml b/mediarouter/src/main/res/values-in/strings.xml
index 5a19254..777f85b 100644
--- a/mediarouter/src/main/res/values-in/strings.xml
+++ b/mediarouter/src/main/res/values-in/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistem"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Perangkat"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Tombol Cast"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Tombol Cast. Terputus"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Tombol Cast. Menghubungkan"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Tombol Cast. Terhubung"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Cast ke"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Mencari perangkat"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Putuskan hubungan"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Hentikan cast"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Tutup"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Putar"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Jeda"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Berhenti"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Luaskan"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Ciutkan"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Sampul album"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Penggeser volume"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Tidak ada media yang dipilih"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Tidak ada info yang tersedia"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Melakukan cast layar"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistem"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Perangkat"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Tombol Cast"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Tombol Cast. Terputus"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Tombol Cast. Menghubungkan"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Tombol Cast. Terhubung"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Cast ke"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Mencari perangkat"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Putuskan hubungan"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Hentikan cast"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Tutup"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Putar"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Jeda"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Berhenti"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Luaskan"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Ciutkan"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Sampul album"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Penggeser volume"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Tidak ada media yang dipilih"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Tidak ada info yang tersedia"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Melakukan cast layar"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-is/strings.xml b/mediarouter/src/main/res/values-is/strings.xml
index bc3c36d..66334e4 100644
--- a/mediarouter/src/main/res/values-is/strings.xml
+++ b/mediarouter/src/main/res/values-is/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Kerfi"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Tæki"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Útsendingarhnappur"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Útsendingarhnappur. Aftengt"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Útsendingarhnappur. Tengist"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Útsendingarhnappur. Tengt"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Senda út í"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Leitað að tækj"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Aftengja"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Stöðva útsendingu"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Loka"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Spila"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Hlé"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Stöðva"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Stækka"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Minnka"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Plötuumslag"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Hljóðstyrkssleði"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Ekkert efni valið"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Engar upplýsingar í boði"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Skjár sendur út"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Kerfi"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Tæki"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Útsendingarhnappur"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Útsendingarhnappur. Aftengt"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Útsendingarhnappur. Tengist"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Útsendingarhnappur. Tengt"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Senda út í"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Leitað að tækjum"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Aftengja"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Stöðva útsendingu"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Loka"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Spila"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Gera hlé"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Stöðva"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Stækka"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Draga saman"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Plötuumslag"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Hljóðstyrkssleði"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Ekkert efni valið"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Engar upplýsingar í boði"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Skjár sendur út"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-it/strings.xml b/mediarouter/src/main/res/values-it/strings.xml
index 3bbfecd..845ce6f 100644
--- a/mediarouter/src/main/res/values-it/strings.xml
+++ b/mediarouter/src/main/res/values-it/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistema"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Dispositivi"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Pulsante Trasmetti"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Pulsante Trasmetti. Disconnesso"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Pulsante Trasmetti. Connessione in corso"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Pulsante Trasmetti. Connesso"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Trasmetti a"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Ricerca di dispositivi"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Disconnetti"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Interrompi trasmissione"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Chiudi"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Riproduci"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Metti in pausa"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Interrompi"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Espandi"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Comprimi"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Copertina"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Dispositivo di scorrimento del volume"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Nessun contenuto multimediale selezionato"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Nessuna informazione disponibile"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Trasmissione dello schermo"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistema"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Dispositivi"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Pulsante Trasmetti"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Pulsante Trasmetti. Disconnesso"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Pulsante Trasmetti. Connessione in corso"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Pulsante Trasmetti. Connesso"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Trasmetti a"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Ricerca di dispositivi"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Disconnetti"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Interrompi trasmissione"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Chiudi"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Riproduci"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Metti in pausa"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Interrompi"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Espandi"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Comprimi"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Copertina dell\'album"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Dispositivo di scorrimento del volume"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Nessun contenuto multimediale selezionato"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Nessuna informazione disponibile"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Trasmissione dello schermo attiva"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-iw/strings.xml b/mediarouter/src/main/res/values-iw/strings.xml
index 72ebc9c..30e60d5 100644
--- a/mediarouter/src/main/res/values-iw/strings.xml
+++ b/mediarouter/src/main/res/values-iw/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"מערכת"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"מכשירים"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"‏לחצן הפעלת Cast"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"‏לחצן הפעלת Cast. מנותק"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"‏לחצן הפעלת Cast. מתחבר"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"‏לחצן הפעלת Cast. מחובר"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"העברה אל"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"מחפש מכשירים"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"ניתוק"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"עצירת העברה"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"סגירה"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"הפעלה"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"השהיה"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"הפסקה"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"הרחבה"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"כיווץ"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"עטיפת אלבום"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"מחוון עוצמה"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"לא נבחרה מדיה"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"אין מידע זמין"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"העברת מסך מתבצעת"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"מערכת"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"מכשירים"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"‏לחצן הפעלת Cast"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"‏לחצן הפעלת Cast. מנותק"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"‏לחצן הפעלת Cast. מתחבר"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"‏לחצן הפעלת Cast. מחובר"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"העברה אל"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"מתבצע חיפוש מכשירים"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"ניתוק"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"עצירת העברה"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"סגירה"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"הפעלה"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"השהיה"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"הפסקה"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"הרחבה"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"כיווץ"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"עטיפת אלבום"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"מחוון עוצמה"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"לא נבחרה מדיה"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"אין מידע זמין"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"העברת מסך מתבצעת"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-ja/strings.xml b/mediarouter/src/main/res/values-ja/strings.xml
index b33ffb9..74bf75c 100644
--- a/mediarouter/src/main/res/values-ja/strings.xml
+++ b/mediarouter/src/main/res/values-ja/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"システム"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"端末"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"キャスト アイコン"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"キャスト アイコン。接続解除済み"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"キャスト アイコン。接続中"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"キャスト アイコン。接続済み"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"キャスト先"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"端末を検索しています"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"接続を解除"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"キャストを停止"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"閉じる"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"再生"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"一時停止"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"停止"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"展開"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"折りたたむ"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"アルバムアート"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"音量スライダー"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"メディアを選択していません"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"情報がありません"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"画面をキャストしています"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"システム"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"端末"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"キャスト アイコン"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"キャスト アイコン。接続解除済み"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"キャスト アイコン。接続中"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"キャスト アイコン。接続済み"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"キャスト先"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"端末を検出しています"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"接続を解除"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"キャストを停止"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"閉じる"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"再生"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"一時停止"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"停止"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"展開"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"折りたたむ"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"アルバムアート"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"音量スライダー"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"メディアが選択されていません"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"情報がありません"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"画面をキャストしています"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-ka/strings.xml b/mediarouter/src/main/res/values-ka/strings.xml
index 446a9e0..7ee094e 100644
--- a/mediarouter/src/main/res/values-ka/strings.xml
+++ b/mediarouter/src/main/res/values-ka/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"სისტემა"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"მოწყობილობები"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"ტრანსლირების ღილაკი"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"ტრანსლირების ღილაკი. გათიშული"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"ტრანსლირების ღილაკი. მიმდინარეობს დაკავშირება"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"ტრანსლირების ღილაკი. დაკავშირებული"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"ტრანსლირება:"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"მოწყობილობების მოძიება..."</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"გათიშვა"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"ტრანსლირების შეწყვეტა"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"დახურვა"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"დაკვრა"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"პაუზა"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"შეწყვეტა"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"გაშლა"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"ჩაკეცვა"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"ალბომის გარეკანი"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"ხმის სლაიდერი"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"მედია არჩეული არ არის"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"ინფორმაცია არ არის ხელმისაწვდომი"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"მიმდინარეობს ეკრანის ტრანსლირება"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"სისტემა"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"მოწყობილობები"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"ტრანსლირების ღილაკი"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"ტრანსლირების ღილაკი. გათიშული"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"ტრანსლირების ღილაკი. მიმდინარეობს დაკავშირება"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"ტრანსლირების ღილაკი. დაკავშირებული"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"ტრანსლირება"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"მიმდინარეობს მოწყობილობების მოძიება"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"გათიშვა"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"ტრანსლირების შეწყვეტა"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"დახურვა"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"დაკვრა"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"პაუზა"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"შეწყვეტა"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"გაშლა"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"ჩაკეცვა"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"ალბომის გარეკანი"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"ხმის სლაიდერი"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"მედია არჩეული არ არის"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"ინფორმაცია არ არის ხელმისაწვდომი"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"მიმდინარეობს ეკრანის ტრანსლირება"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-kk/strings.xml b/mediarouter/src/main/res/values-kk/strings.xml
index d512ff9..d107272 100644
--- a/mediarouter/src/main/res/values-kk/strings.xml
+++ b/mediarouter/src/main/res/values-kk/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Жүйе"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Құрылғылар"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Трансляциялау түймесі"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Трансляциялау түймесі. Ажыратылды"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Трансляциялау түймесі. Қосылуда"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Трансляциялау түймесі. Қосылды"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Трансляция:"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Құрылғылар ізделуде"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Ажырату"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Трансляцияны тоқтату"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Жабу"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Ойнату"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Кідірту"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Тоқтату"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Жаю"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Жию"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Альбомның мұқабасы"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Дыбыс деңгейінің жүгірткісі"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Ешқандай медиафайл таңдалмаған"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Қолжетімді ақпарат жоқ"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Экранды трансляциялау"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Жүйе"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Құрылғылар"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Трансляциялау түймесі"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Трансляциялау түймесі. Ажыратылды"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Трансляциялау түймесі. Қосылуда"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Трансляциялау түймесі. Қосылды"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Келесіге трансляциялау:"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Құрылғылар ізделуде"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Ажырату"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Трансляцияны тоқтату"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Жабу"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Ойнату"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Кідірту"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Тоқтату"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Жаю"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Жию"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Альбомның мұқабасы"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Дыбыс деңгейінің жүгірткісі"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Ешқандай медиафайл таңдалмаған"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Ешқандай ақпарат жоқ"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Экран трансляциялануда"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-km/strings.xml b/mediarouter/src/main/res/values-km/strings.xml
index 9303a1b..eb8a346 100644
--- a/mediarouter/src/main/res/values-km/strings.xml
+++ b/mediarouter/src/main/res/values-km/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"ប្រព័ន្ធ"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"ឧបករណ៍"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"ប៊ូតុង​បញ្ជូន"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"ប៊ូតុង​បញ្ជូន។ បាន​ផ្តាច់"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"ប៊ូតុង​បញ្ជូន។ កំពុង​ភ្ជាប់"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"ប៊ូតុង​បញ្ជូន។ បាន​ភ្ជាប់​ហើយ"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"បញ្ជូន​ទៅ"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"កំពុង​ស្វែងរក​ឧបករណ៍"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"ផ្ដាច់"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"បញ្ឈប់​ការបញ្ជូន"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"បិទ"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"ចាក់"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"ផ្អាក"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"បញ្ឈប់"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"ពង្រីក"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"បង្រួម"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"រូបភាព​សិល្បៈ​ក្រប​អាល់ប៊ុម"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"របារកម្រិតសំឡេង"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"មិនបាន​ជ្រើសរើស​មេឌៀ​ទេ"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"មិនមានព័ត៌មានទេ"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"កំពុង​បញ្ជូន​អេក្រង់"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"ប្រព័ន្ធ"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"ឧបករណ៍"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"ប៊ូតុង​បញ្ជូន"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"ប៊ូតុង​បញ្ជូន។ បាន​ផ្តាច់"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"ប៊ូតុង​បញ្ជូន។ កំពុង​ភ្ជាប់"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"ប៊ូតុង​បញ្ជូន។ បាន​ភ្ជាប់​ហើយ"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"បញ្ជូន​ទៅ"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"កំពុង​ស្វែងរក​ឧបករណ៍"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"ផ្ដាច់"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"ឈប់ភ្ជាប់"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"បិទ"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"លេង"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"ផ្អាក"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"ឈប់"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"ពង្រីក"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"បង្រួម"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"រូបភាព​សិល្បៈ​ក្រប​អាល់ប៊ុម"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"របារកម្រិតសំឡេង"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"មិនបាន​ជ្រើសរើស​មេឌៀ​ទេ"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"មិនមានព័ត៌មានទេ"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"កំពុង​បញ្ជូន​អេក្រង់"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-kn/strings.xml b/mediarouter/src/main/res/values-kn/strings.xml
deleted file mode 100644
index f495017..0000000
--- a/mediarouter/src/main/res/values-kn/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"ಸಿಸ್ಟಂ"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"ಸಾಧನಗಳು"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"ಬಿತ್ತರಿಸು ಬಟನ್‌"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"ಬಿತ್ತರಿಸು ಬಟನ್‌. ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"ಬಿತ್ತರಿಸು ಬಟನ್‌. ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"ಬಿತ್ತರಿಸು ಬಟನ್‌. ಸಂಪರ್ಕಿತಗೊಂಡಿದೆ"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"ಇದಕ್ಕೆ ಬಿತ್ತರಿಸಿ"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಿ"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"ಬಿತ್ತರಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿ"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"ಮುಚ್ಚಿ"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"ಪ್ಲೇ"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"ವಿರಾಮ"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"ನಿಲ್ಲಿಸಿ"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"ಹಿಗ್ಗಿಸಿ"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"ಕುಗ್ಗಿಸಿ"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"ಆಲ್ಬಮ್ ಕಲೆ"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"ವಾಲ್ಯೂಮ್ ಸ್ಲೈಡರ್"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"ಯಾವುದೇ ಮಾಧ್ಯಮ ಆಯ್ಕೆ ಮಾಡಿಲ್ಲ"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"ಯಾವುದೇ ಮಾಹಿತಿ ಲಭ್ಯವಿಲ್ಲ"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"ಪರದೆಯನ್ನು ಬಿತ್ತರಿಸಲಾಗುತ್ತಿದೆ"</string>
-</resources>
diff --git a/mediarouter/src/main/res/values-ko/strings.xml b/mediarouter/src/main/res/values-ko/strings.xml
index 178fab0..f2e926f 100644
--- a/mediarouter/src/main/res/values-ko/strings.xml
+++ b/mediarouter/src/main/res/values-ko/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"시스템"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"기기"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"전송 버튼"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"전송 버튼. 연결 해제됨"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"전송 버튼. 연결 중"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"전송 버튼. 연결됨"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"전송 대상"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"기기를 찾는 중"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"연결 끊기"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"전송 중지"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"닫기"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"재생"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"일시중지"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"중지"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"확대"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"접기"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"앨범아트"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"볼륨 슬라이더"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"선택된 미디어 없음"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"사용할 수 있는 정보 없음"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"화면 전송 중"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"시스템"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"기기"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"전송 버튼"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"전송 버튼. 연결 해제됨"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"전송 버튼. 연결 중"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"전송 버튼. 연결됨"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"전송 대상"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"기기를 찾는 중"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"연결 해제"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"전송 중지"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"닫기"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"재생"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"일시중지"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"중지"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"펼치기"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"접기"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"앨범아트"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"볼륨 슬라이더"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"선택된 미디어 없음"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"사용할 수 있는 정보 없음"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"화면 전송 중"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-ky/strings.xml b/mediarouter/src/main/res/values-ky/strings.xml
index 100e5a5..2e4fcd8 100644
--- a/mediarouter/src/main/res/values-ky/strings.xml
+++ b/mediarouter/src/main/res/values-ky/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Тутум"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Түзмөктөр"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Тышкы экранга чыгаруу баскычы"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Тышкы экранга чыгаруу баскычы. Түзмөк ажырап турат."</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Тышкы экранга чыгаруу баскычы. Түзмөк туташууда"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Тышкы экранга чыгаруу баскычы. Түзмөк туташып турат"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Түзмөккө чыгаруу"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Түзмөктөр изделүүдө"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Ажыратуу"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Тышкы экранга чыгарууну токтотуу"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Жабуу"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Угуу"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Тыным"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Токтотуу"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Жайып көрсөтүү"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Жыйыштыруу"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Альбом мукабасы"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Үндү катуулатуучу сыдырма"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Эч нерсе тандалган жок"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Эч маалымат жок"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Тышкы экранга чыгарылууда"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Тутум"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Түзмөктөр"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Тышкы экранга чыгаруу баскычы"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Тышкы экранга чыгаруу баскычы. Түзмөк ажырап турат."</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Тышкы экранга чыгаруу баскычы. Түзмөк туташууда"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Тышкы экранга чыгаруу баскычы. Түзмөк туташып турат"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Түзмөккө чыгаруу"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Түзмөктөр изделүүдө"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Ажыратуу"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Тышкы экранга чыгарууну токтотуу"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Жабуу"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Ойнотуу"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Тындыруу"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Токтотуу"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Жайып көрсөтүү"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Жыйыштыруу"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Альбом мукабасы"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Үн башкаруучу сыдырма"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Эч нерсе тандалган жок"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Эч маалымат жок"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Тышкы экранга чыгарылууда"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-lo/strings.xml b/mediarouter/src/main/res/values-lo/strings.xml
index 79bd210..0b52b24 100644
--- a/mediarouter/src/main/res/values-lo/strings.xml
+++ b/mediarouter/src/main/res/values-lo/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"ລະບົບ"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"ອຸປະກອນ"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"ປຸ່ມສົ່ງສັນຍານ"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"ປຸ່ມສົ່ງສັນຍານ. ຕັດການເຊື່ອມຕໍ່ແລ້ວ"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"ປຸ່ມສົ່ງສັນຍານ. ກຳລັງເຊື່ອມຕໍ່"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"ປຸ່ມສົ່ງສັນຍານ. ເຊື່ອມຕໍ່ແລ້ວ"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"ສົ່ງສັນຍານໄປທີ່"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"ກຳລັງຊອກຫາອຸປະກອນ"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"ຕັດການເຊື່ອມຕໍ່"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"ຢຸດການສົ່ງສັນຍານ"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"ປິດ"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"ຫຼິ້ນ"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"ຢຸດຊົ່ວຄາວ"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"ຢຸດ"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"ຂະຫຍາຍ"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"ຫຍໍ້ລົງ"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"ໜ້າປົກອະລະບໍ້າ"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"ຕົວປັບລະດັບສຽງ"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"ບໍ່ໄດ້ເລືອກສື່ໃດ"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"ບໍ່ມີຂໍ້ມູນ"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"ກຳລັງສົ່ງສັນຍານພາບ"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"ລະບົບ"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"ອຸປະກອນ"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"ປຸ່ມສົ່ງສັນຍານ"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"ປຸ່ມສົ່ງສັນຍານ. ຕັດການເຊື່ອມຕໍ່ແລ້ວ"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"ປຸ່ມສົ່ງສັນຍານ. ກຳລັງເຊື່ອມຕໍ່"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"ປຸ່ມສົ່ງສັນຍານ. ເຊື່ອມຕໍ່ແລ້ວ"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"ສົ່ງສັນຍານໄປທີ່"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"ກຳລັງຊອກຫາອຸປະກອນ"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"ຕັດການເຊື່ອມຕໍ່"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"ຢຸດການສົ່ງສັນຍານ"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"ປິດ"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"ຫຼິ້ນ"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"ຢຸດຊົ່ວຄາວ"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"ຢຸດ"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"ຂະຫຍາຍ"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"ຫຍໍ້ລົງ"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"ໜ້າປົກອະລະບໍ້າ"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"ຕົວປັບລະດັບສຽງ"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"ບໍ່ໄດ້ເລືອກສື່ໃດ"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"ບໍ່ມີຂໍ້ມູນ"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"ກຳລັງສົ່ງສັນຍານພາບ"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-lt/strings.xml b/mediarouter/src/main/res/values-lt/strings.xml
index 6f1ce9f..1108c32 100644
--- a/mediarouter/src/main/res/values-lt/strings.xml
+++ b/mediarouter/src/main/res/values-lt/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistema"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Įrenginiai"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Perdavimo mygtukas"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Perdavimo mygtukas. Atsijungta"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Perdavimo mygtukas. Prisijungiama"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Perdavimo mygtukas. Prisijungta"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Perduoti į"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Randami įrenginiai"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Atsijungti"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Sustabdyti perdavimą"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Uždaryti"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Leisti"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pristabdyti"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Sustabdyti"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Išskleisti"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Sutraukti"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Albumo viršelis"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Garsumo šliaužiklis"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Nepasirinkta jokios medijos"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Informacija nepasiekiama"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Perduodamas ekranas"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistema"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Įrenginiai"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Perdavimo mygtukas"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Perdavimo mygtukas. Atsijungta"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Perdavimo mygtukas. Prisijungiama"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Perdavimo mygtukas. Prisijungta"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Perduoti į"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Randami įrenginiai"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Atjungti"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Sustabdyti perdavimą"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Uždaryti"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Leisti"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pristabdyti"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Sustabdyti"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Išskleisti"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Sutraukti"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Albumo viršelis"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Garsumo šliaužiklis"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Nepasirinkta jokios medijos"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Informacija nepasiekiama"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Perduodamas ekranas"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-lv/strings.xml b/mediarouter/src/main/res/values-lv/strings.xml
index 56432f8..950b3dc 100644
--- a/mediarouter/src/main/res/values-lv/strings.xml
+++ b/mediarouter/src/main/res/values-lv/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistēma"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Ierīces"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Apraides poga"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Apraides poga. Savienojums pārtraukts."</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Apraides poga. Notiek savienojuma izveide."</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Apraides poga. Savienojums izveidots."</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Apraides veikšana uz ierīci"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Ierīču meklēšana"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Atvienot"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Apturēt apraidi"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Aizvērt"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Atskaņot"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pauzēt"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Apturēt"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Izvērst"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Sakļaut"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Albuma vāciņš"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Skaļuma slīdnis"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Nav atlasīts multivides saturs"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Nav informācijas"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Notiek ekrāna apraide"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistēma"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Ierīces"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Apraides poga"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Apraides poga. Savienojums pārtraukts."</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Apraides poga. Notiek savienojuma izveide."</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Apraides poga. Savienojums izveidots."</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Apraides veikšana uz ierīci"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Notiek ierīču meklēšana"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Atvienot"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Pārtraukt apraidi"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Aizvērt"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Atskaņot"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pauzēt"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Apturēt"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Izvērst"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Sakļaut"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Albuma noformējums"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Skaļuma slīdnis"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Nav atlasīts multivides saturs"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Nav informācijas"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Notiek ekrāna apraide"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-mk/strings.xml b/mediarouter/src/main/res/values-mk/strings.xml
index e4572c5..5739525 100644
--- a/mediarouter/src/main/res/values-mk/strings.xml
+++ b/mediarouter/src/main/res/values-mk/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Систем"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Уреди"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Копче за Cast"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Копче за Cast. Исклучено"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Копче за Cast. Се поврзува"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Копче за Cast. Поврзано"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Емитување на"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Се бараат уреди"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Исклучи"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Сопри со емитување"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Затвори"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Пушти"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Паузирај"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Сопри"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Прошири"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Собери"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Корица на албум"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Лизгач за јачина на звук"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Не се избрани аудиовизуелни датотеки"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Нема достапни информации"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Се емитува екран"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Систем"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Уреди"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Копче за Cast"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Копче за Cast. Исклучено"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Копче за Cast. Се поврзува"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Копче за Cast. Поврзано"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Емитување на"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Се бараат уреди"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Исклучи"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Сопри со емитување"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Затвори"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Пушти"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Пауза"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Запри"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Прошири"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Собери"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Омот на албум"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Лизгач за јачина на звук"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Не се избрани аудиовизуелни датотеки"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Нема достапни информации"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Се емитува екран"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-ml/strings.xml b/mediarouter/src/main/res/values-ml/strings.xml
deleted file mode 100644
index d7c987b..0000000
--- a/mediarouter/src/main/res/values-ml/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"സിസ്റ്റം"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"ഉപകരണങ്ങൾ"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"കാസ്റ്റ് ബട്ടൺ"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"കാസ്റ്റ് ബട്ടൺ. വിച്ഛേദിച്ചു"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"കാസ്‌റ്റ് ബട്ടൺ. കണക്‌റ്റ് ചെയ്യുന്നു"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"കാസ്റ്റ് ബട്ടൺ. കണക്‌റ്റ് ചെയ്തു"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"ഇതിലേക്ക് കാസ്‌റ്റ് ചെയ്യുക"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"ഉപകരണങ്ങൾ കണ്ടെത്തുന്നു"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"വിച്ഛേദിക്കുക"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"കാസ്റ്റ് ചെയ്യുന്നത് നിർത്തുക"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"അവസാനിപ്പിക്കുക"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"പ്ലേ ചെയ്യുക"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"താൽക്കാലികമായി നിർത്തുക"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"നിര്‍ത്തുക"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"വികസിപ്പിക്കുക"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"ചുരുക്കുക"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"ആൽബം ആർട്ട്"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"ശബ്‌ദ സ്ലൈഡർ"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"മീഡിയയൊന്നും തിരഞ്ഞെടുത്തിട്ടില്ല"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"വിവരങ്ങളൊന്നും ലഭ്യമല്ല"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"സ്‌ക്രീൻ കാസ്‌റ്റ് ചെയ്യുന്നു"</string>
-</resources>
diff --git a/mediarouter/src/main/res/values-mn/strings.xml b/mediarouter/src/main/res/values-mn/strings.xml
index 9f03518..38e8a77 100644
--- a/mediarouter/src/main/res/values-mn/strings.xml
+++ b/mediarouter/src/main/res/values-mn/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Систем"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Төхөөрөмж"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Дамжуулах товч"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Дамжуулах товч. Салсан"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Дамжуулах товч. Холбогдож байна"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Дамжуулах товч. Холбогдсон"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Дамжуулах"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Төхөөрөмжийг хайж байна"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Салгах"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Дамжуулахыг зогсоох"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Хаах"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Тоглуулах"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Түр зогсоох"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Зогсоох"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Дэлгэх"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Хумих"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Цомгийн зураг"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Дууны түвшин тааруулагч"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Ямар ч медиа сонгоогүй байна"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Мэдээлэл байхгүй байна"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Дэлгэцийг дамжуулж байна"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Систем"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Төхөөрөмжүүд"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Cast товчлуур"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Cast товчлуур. Салсан"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Cast товчлуур. Холбогдож байна"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Cast товчлуур. Холбогдсон"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Дараахад дамжуулах"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Төхөөрөмжүүдийг хайж байна"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Салгах"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Дамжуулахыг зогсоох"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Хаах"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Тоглуулах"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Түр зогсоох"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Зогсоох"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Дэлгэх"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Буулгах"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Цомгийн зураг"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Дууны түвшин тааруулагч"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Ямар ч медиа сонгоогүй байна"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Мэдээлэл алга"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Дэлгэцийг дамжуулж байна"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-mr/strings.xml b/mediarouter/src/main/res/values-mr/strings.xml
deleted file mode 100644
index f3ccbb9..0000000
--- a/mediarouter/src/main/res/values-mr/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"सिस्टम"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"डिव्हाइस"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"कास्ट बटण"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"कास्ट बटण. डिस्कनेक्ट केले"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"कास्ट बटण. कनेक्ट करत आहे"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"कास्ट बटण. कनेक्ट केले"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"यावर कास्ट करा"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"डिव्हाइस शोधत आहे"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"‍डिस्कनेक्ट करा"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"कास्ट करणे थांबवा"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"बंद"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"खेळा"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"विराम द्या"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"थांबा"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"विस्तार करा"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"कोलॅप्स"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"अल्बम कला"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"व्हॉल्यूम स्लायडर"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"मीडिया निवडला नाही"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"कोणतीही माहिती उपलब्ध नाही"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"स्क्रीन कास्‍ट करत आहे"</string>
-</resources>
diff --git a/mediarouter/src/main/res/values-ms/strings.xml b/mediarouter/src/main/res/values-ms/strings.xml
index 5096704..f7c0840 100644
--- a/mediarouter/src/main/res/values-ms/strings.xml
+++ b/mediarouter/src/main/res/values-ms/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistem"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Peranti"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Butang hantar"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Butang hantar. Sambungan diputuskan"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Butang hantar. Menyambung"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Butang hantar. Disambungkan"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Hantar ke"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Mencari peranti"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Putuskan sambungan"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Berhenti menghantar"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Tutup"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Main"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Jeda"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Berhenti"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Kembangkan"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Runtuhkan"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Seni album"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Peluncur kelantangan"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Tiada media yang dipilih"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Maklumat tidak tersedia"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Menghantar skrin"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistem"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Peranti"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Butang hantar"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Butang hantar. Sambungan diputuskan"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Butang hantar. Menyambung"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Butang hantar. Disambungkan"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Hantar ke"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Mencari peranti"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Putuskan sambungan"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Berhenti menghantar"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Tutup"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Main"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Jeda"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Berhenti"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Kembangkan"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Runtuhkan"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Seni album"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Peluncur kelantangan"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Tiada media yang dipilih"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Maklumat tidak tersedia"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Menghantar skrin"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-my/strings.xml b/mediarouter/src/main/res/values-my/strings.xml
index 5e843a0..c6698f1 100644
--- a/mediarouter/src/main/res/values-my/strings.xml
+++ b/mediarouter/src/main/res/values-my/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"စနစ်"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"စက်များ"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"ကာစ်ခလုတ်"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"ကာစ်ခလုတ်။ ချိတ်ဆက်မထားပါ"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"ကာစ်ခလုတ်။ ချိတ်ဆက်နေသည်"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"ကာစ်ခလုတ်။ ချိတ်ဆက်ထားသည်"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"ဤစက်သို့ ကာစ်လုပ်ရန်"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"စက်များ ရှာနေသည်"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"ချိတ်ဆက်မှု ဖြုတ်ရန်"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"ကာစ်လုပ်ခြင်းကို ရပ်ရန်"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"ပိတ်ရန်"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"ဖွင့်ရန်"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"ခဏရပ်ရန်"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"ရပ်ရန်"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"ချဲ့ရန်"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"လျှော့ပြရန်"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"အယ်လ်ဘမ်ပုံ"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"အသံအတိုးအကျယ်ချိန်သည့် ဆလိုက်ဒါ"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"မီဒီယာ ရွေးမထားပါ"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"အချက်အလက် မရရှိနိုင်ပါ"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"ကာစ်တ်လုပ်သည့် မျက်နှာပြင်"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"စနစ်"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"စက်များ"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"ကာစ်ခလုတ်"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"ကာစ်ခလုတ်။ ချိတ်ဆက်မထားပါ"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"ကာစ်ခလုတ်။ ချိတ်ဆက်နေသည်"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"ကာစ်ခလုတ်။ ချိတ်ဆက်ထားသည်"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"ဤစက်သို့ ကာစ်လုပ်ရန်"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"စက်များကို ရှာနေသည်"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"ချိတ်ဆက်မှု ဖြုတ်ရန်"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"ကာစ်လုပ်ခြင်းကို ရပ်ရန်"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"ပိတ်ရန်"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"ကစားရန်"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"ခဏရပ်ရန်"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"ရပ်ရန်"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"ချဲ့ရန်"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"လျှော့ပြရန်"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"အယ်လ်ဘမ်ပုံ"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"အသံအတိုးအကျယ်ချိန်သည့် ရွှေ့တုံး"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"မီဒီယာ ရွေးမထားပါ"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"အချက်အလက် မရရှိနိုင်ပါ"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"ကာစ်တ်လုပ်သည့် မျက်နှာပြင်"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-nb/strings.xml b/mediarouter/src/main/res/values-nb/strings.xml
index 487b9d5..a4a04f5 100644
--- a/mediarouter/src/main/res/values-nb/strings.xml
+++ b/mediarouter/src/main/res/values-nb/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"System"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Enheter"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Cast-ikonet"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Cast-ikonet. Frakoblet"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Cast-ikonet. Kobler til"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Cast-ikonet. Tilkoblet"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Cast til"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Finner enheter"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Koble fra"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Stopp castingen"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Lukk"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Spill av"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Sett på pause"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Stopp"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Vis"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Skjul"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Albumgrafikk"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Glidebryter for volum"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Ingen medier er valgt"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Ingen informasjon er tilgjengelig"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Caster skjermen"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"System"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Enheter"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Cast-ikonet"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Cast-ikonet. Frakoblet"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Cast-ikonet. Kobler til"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Cast-ikonet. Tilkoblet"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Cast til"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Finner enheter"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Koble fra"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Stopp castingen"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Lukk"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Spill av"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Sett på pause"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Stopp"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Vis"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Skjul"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Albumgrafikk"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Glidebryter for volum"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Ingen medier er valgt"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Ingen informasjon er tilgjengelig"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Caster skjermen"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-ne/strings.xml b/mediarouter/src/main/res/values-ne/strings.xml
deleted file mode 100644
index 8a13ac7..0000000
--- a/mediarouter/src/main/res/values-ne/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"प्रणाली"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"यन्त्रहरू"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Cast बटन"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Cast बटन। जडान विच्छेद गरियो"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Cast बटन। जडान गरिँदै छ"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Cast बटन। जडान गरियो"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"यसमा Cast गर्नुहोस्"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"यन्त्रहरू पत्ता लगाइँदै छ"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"विच्छेद गर्नुहोस्"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Cast गर्न छाड्नुहोस्"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"बन्द गर्नुहोस्"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"प्ले गर्नुहोस्"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"पज गर्नुहोस्"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"रोक्नुहोस्"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"विस्तृत गर्नुहोस्"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"संक्षिप्त गर्नुहोस्"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"एल्बम आर्ट"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"भोल्युमको स्लाइडर"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"कुनै पनि मिडिया चयन गरिएन"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"कुनै पनि जानकारी उपलब्ध छैन"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"स्क्रिन Cast गरिँदै छ"</string>
-</resources>
diff --git a/mediarouter/src/main/res/values-nl/strings.xml b/mediarouter/src/main/res/values-nl/strings.xml
index eb19187..c1279aa 100644
--- a/mediarouter/src/main/res/values-nl/strings.xml
+++ b/mediarouter/src/main/res/values-nl/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Systeem"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Apparaten"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Cast-knop"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Cast-icoon. Verbinding verbroken"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Cast-icoon. Verbinding maken"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Cast-icoon. Verbonden"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Casten naar"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Apparaten zoeken"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Loskoppelen"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Casten stoppen"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Sluiten"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Afspelen"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pauzeren"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Stoppen"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Uitvouwen"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Samenvouwen"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Albumhoes"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Volumeschuifregelaar"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Geen media geselecteerd"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Geen informatie beschikbaar"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Scherm casten"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Systeem"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Apparaten"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Cast-icoon"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Cast-icoon. Verbinding verbroken"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Cast-icoon. Verbinding maken"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Cast-icoon. Verbonden"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Casten naar"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Apparaten zoeken"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Verbinding verbreken"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Casten stoppen"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Sluiten"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Afspelen"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pauzeren"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Stoppen"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Uitvouwen"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Samenvouwen"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Albumhoes"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Volumeschuifregelaar"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Geen media geselecteerd"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Geen informatie beschikbaar"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Scherm casten"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-pa/strings.xml b/mediarouter/src/main/res/values-pa/strings.xml
deleted file mode 100644
index 5092ae0..0000000
--- a/mediarouter/src/main/res/values-pa/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"ਸਿਸਟਮ"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"ਡੀਵਾਈਸ"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"\'ਕਾਸਟ ਕਰੋ\' ਬਟਨ"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"\'ਕਾਸਟ ਕਰੋ\' ਬਟਨ। ਡਿਸਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"\'ਕਾਸਟ ਕਰੋ\' ਬਟਨ। ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"\'ਕਾਸਟ ਕਰੋ\' ਬਟਨ। ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"ਏਥੇ ਕਾਸਟ ਕਰੋ"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"ਡੀਵਾਈਸ ਲੱਭੇ ਜਾ ਰਹੇ ਹਨ"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"ਕਾਸਟ ਕਰਨਾ ਬੰਦ ਕਰੋ"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"ਬੰਦ ਕਰੋ"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"ਚਲਾਓ"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"ਰੋਕੋ"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"ਬੰਦ ਕਰੋ"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"ਵਿਸਤਾਰ ਕਰੋ"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"ਸਮੇਟੋ"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"ਐਲਬਮ ਕਲਾ"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"ਵੌਲਯੂਮ ਸਲਾਈਡਰ"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"ਕੋਈ ਮੀਡੀਆ ਨਹੀਂ ਚੁਣਿਆ ਗਿਆ"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"ਕੋਈ ਜਾਣਕਾਰੀ ਉਪਲਬਧ ਨਹੀਂ"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"ਸਕ੍ਰੀਨ \'ਤੇ ਕਾਸਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
-</resources>
diff --git a/mediarouter/src/main/res/values-pl/strings.xml b/mediarouter/src/main/res/values-pl/strings.xml
index 6f52faf..b0bf098 100644
--- a/mediarouter/src/main/res/values-pl/strings.xml
+++ b/mediarouter/src/main/res/values-pl/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"System"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Urządzenia"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Przycisk Cast"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Przycisk Cast. Rozłączono"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Przycisk Cast. Łączę"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Przycisk Cast. Połączono"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Przesyłaj na"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Znajdowanie urządzeń"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Odłącz"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Zatrzymaj przesyłanie"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Zamknij"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Odtwórz"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Wstrzymaj"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Zatrzymaj"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Rozwiń"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Zwiń"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Okładka albumu"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Suwak głośności"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Nie wybrano multimediów"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Brak informacji"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Przesyłanie ekranu"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"System"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Urządzenia"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Przycisk Cast"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Przycisk Cast – rozłączono"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Przycisk Cast – łączę"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Przycisk Cast – połączono"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Przesyłaj na"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Szukam urządzeń"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Odłącz"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Zatrzymaj przesyłanie"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Zamknij"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Odtwórz"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Wstrzymaj"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Zatrzymaj"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Rozwiń"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Zwiń"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Okładka albumu"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Suwak głośności"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Nie wybrano multimediów"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Brak informacji"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Przesyłam ekran"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-pt-rBR/strings.xml b/mediarouter/src/main/res/values-pt-rBR/strings.xml
index 213424a..e527f35 100644
--- a/mediarouter/src/main/res/values-pt-rBR/strings.xml
+++ b/mediarouter/src/main/res/values-pt-rBR/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistema"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Dispositivos"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Botão \"Transmitir\""</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Botão \"Transmitir\". Desconectado"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Botão \"Transmitir\". Conectando"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Botão \"Transmitir\". Conectado"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Transmitir para"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Localizando dispositivos"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Desconectar"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Parar transmissão"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Fechar"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Reproduzir"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pausar"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Parar"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Expandir"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Recolher"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Arte do álbum"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Controle deslizante de volume"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Nenhuma mídia selecionada"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Nenhuma informação disponível"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Transmitindo tela"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistema"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Dispositivos"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Botão \"Transmitir\""</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Botão \"Transmitir\". Desconectado"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Botão \"Transmitir\". Conectando"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Botão \"Transmitir\". Conectado"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Transmitir para"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Localizando dispositivos"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Desconectar"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Parar transmissão"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Fechar"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Reproduzir"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pausar"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Parar"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Expandir"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Recolher"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Arte do álbum"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Controle deslizante de volume"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Nenhuma mídia selecionada"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Nenhuma informação disponível"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Transmitindo tela"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-pt-rPT/strings.xml b/mediarouter/src/main/res/values-pt-rPT/strings.xml
index 4780144..1a2d2ba 100644
--- a/mediarouter/src/main/res/values-pt-rPT/strings.xml
+++ b/mediarouter/src/main/res/values-pt-rPT/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistema"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Dispositivos"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Botão Transmitir"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Botão Transmitir. Desligado."</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Botão Transmitir. A ligar..."</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Botão Transmitir. Ligado"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Transmitir para"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"A localizar dispositivos..."</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Desligar"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Parar transmissão"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Fechar"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Reproduzir"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Interromper"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Parar"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Expandir"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Reduzir"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Imagem do álbum"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Controlo de deslize do volume"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Nenhum conteúdo multimédia selecionado."</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Nenhuma informação disponível."</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"A transmitir o ecrã..."</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistema"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Dispositivos"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Botão Transmitir"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Botão Transmitir. Desligado."</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Botão Transmitir. A ligar..."</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Botão Transmitir. Ligado."</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Transmitir para"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"A localizar dispositivos..."</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Desligar"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Parar transmissão"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Fechar"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Reproduzir"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Colocar em pausa"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Parar"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Expandir"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Reduzir"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Imagem do álbum"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Controlo de deslize do volume"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Nenhum conteúdo multimédia selecionado."</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Nenhuma informação disponível."</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"A transmitir o ecrã..."</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-pt/strings.xml b/mediarouter/src/main/res/values-pt/strings.xml
index 213424a..e527f35 100644
--- a/mediarouter/src/main/res/values-pt/strings.xml
+++ b/mediarouter/src/main/res/values-pt/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistema"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Dispositivos"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Botão \"Transmitir\""</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Botão \"Transmitir\". Desconectado"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Botão \"Transmitir\". Conectando"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Botão \"Transmitir\". Conectado"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Transmitir para"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Localizando dispositivos"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Desconectar"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Parar transmissão"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Fechar"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Reproduzir"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pausar"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Parar"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Expandir"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Recolher"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Arte do álbum"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Controle deslizante de volume"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Nenhuma mídia selecionada"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Nenhuma informação disponível"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Transmitindo tela"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistema"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Dispositivos"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Botão \"Transmitir\""</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Botão \"Transmitir\". Desconectado"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Botão \"Transmitir\". Conectando"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Botão \"Transmitir\". Conectado"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Transmitir para"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Localizando dispositivos"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Desconectar"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Parar transmissão"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Fechar"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Reproduzir"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pausar"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Parar"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Expandir"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Recolher"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Arte do álbum"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Controle deslizante de volume"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Nenhuma mídia selecionada"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Nenhuma informação disponível"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Transmitindo tela"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-ro/strings.xml b/mediarouter/src/main/res/values-ro/strings.xml
index 82660fc..c3292b4 100644
--- a/mediarouter/src/main/res/values-ro/strings.xml
+++ b/mediarouter/src/main/res/values-ro/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistem"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Dispozitive"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Butonul de proiecție"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Butonul de proiecție. Deconectat"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Butonul de proiecție. Se conectează"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Butonul de proiecție. Conectat"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Proiectați pe"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Se caută dispozitive"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Deconectați"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Nu mai proiectați"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Închideți"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Redați"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Întrerupeți"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Opriți"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Extindeți"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Restrângeți"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Grafica albumului"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Glisor pentru volum"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Niciun conținut media selectat"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Nu sunt disponibile informații"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Se proiectează ecranul"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistem"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Dispozitive"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Butonul de proiecție"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Butonul de proiecție. Deconectat"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Butonul de proiecție. Se conectează"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Butonul de proiecție. Conectat"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Proiectați pe"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Se caută dispozitive"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Deconectați"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Nu mai proiectați"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Închideți"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Redați"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Întrerupeți"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Opriți"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Extindeți"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Restrângeți"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Grafica albumului"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Glisor pentru volum"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Niciun conținut media selectat"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Nu sunt disponibile informații"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Se proiectează ecranul"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-ru/strings.xml b/mediarouter/src/main/res/values-ru/strings.xml
index b3e5e16..de0fe64 100644
--- a/mediarouter/src/main/res/values-ru/strings.xml
+++ b/mediarouter/src/main/res/values-ru/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Система"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Устройства"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Кнопка Google Cast"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Кнопка трансляции. Устройство отключено."</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Кнопка трансляции. Устройство подключается."</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Кнопка трансляции. Устройство подключено."</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Транслировать на устройство"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Поиск устройств…"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Отключить"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Прекратить трансляцию"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Закрыть"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Воспроизвести"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Пауза"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Остановить"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Развернуть"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Скрыть"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Обложка"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Регулятор громкости"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Контент не выбран"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Данных нет"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Подключение к удаленному монитору"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Система"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Устройства"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Кнопка трансляции"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Кнопка трансляции. Устройство отключено."</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Кнопка трансляции. Устройство подключается."</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Кнопка трансляции. Устройство подключено."</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Транслировать на устройство"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Поиск устройств…"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Отключить"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Остановить трансляцию"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Закрыть"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Воспроизвести"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Приостановить"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Остановить"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Показать"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Скрыть"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Обложка"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Регулятор громкости"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Медиафайл не выбран"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Данных нет"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Трансляция экрана…"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-si/strings.xml b/mediarouter/src/main/res/values-si/strings.xml
index 044f1a3..95bd78c 100644
--- a/mediarouter/src/main/res/values-si/strings.xml
+++ b/mediarouter/src/main/res/values-si/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"පද්ධතිය"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"උපාංග"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"විකාශ බොත්තම"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"විකාශ බොත්තම. විසන්ධි කරන ලදී"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"විකාශ බොත්තම සම්බන්ධ කරමින්"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"විකාශ බොත්තම සම්බන්ධ කරන ලදී"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"විකාශය"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"උපාංග සෙවීම"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"විසන්ධි කරන්න"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"විකාශය නවතන්න"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"වසන්න"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"ධාවනය කරන්න"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"විරාම කරන්න"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"නවත්වන්න"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"දිග හරින්න"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"හකුළන්න"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"ඇල්බම කලාව"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"හඬ පරිමා ස්ලයිඩරය"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"මාධ්‍ය තෝරා නැත"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"ලබා ගත හැකි තොරතුරු නොමැත"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"විකාශ තිරය"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"පද්ධතිය"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"උපාංග"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"විකාශ බොත්තම"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"විකාශ බොත්තම. විසන්ධි කරන ලදී"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"විකාශ බොත්තම සම්බන්ධ කරමින්"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"විකාශ බොත්තම සම්බන්ධ කරන ලදී"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"විකාශය"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"උපාංග සෙවීම"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"විසන්ධි කරන්න"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"විකාශය නවතන්න"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"වසන්න"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"ධාවනය කරන්න"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"විරාමය"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"නවත්වන්න"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"දිග හරින්න"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"හකුළන්න"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"ඇල්බම කලාව"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"හඬ පරිමා ස්ලයිඩරය"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"මාධ්‍ය තෝරා නැත"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"ලබා ගත හැකි තොරතුරු නොමැත"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"විකාශ තිරය"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-sk/strings.xml b/mediarouter/src/main/res/values-sk/strings.xml
index bb81d01..765ff2c 100644
--- a/mediarouter/src/main/res/values-sk/strings.xml
+++ b/mediarouter/src/main/res/values-sk/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Systém"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Zariadenia"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Tlačidlo prenosu"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Tlačidlo prenosu. Odpojené"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Tlačidlo prenosu. Pripája sa"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Tlačidlo prenosu. Pripojené"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Prenos do zariadenia"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Hľadajú sa zariadenia"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Odpojiť"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Zastaviť prenos"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Zavrieť"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Prehrať"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pozastaviť"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Ukončiť"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Rozbaliť"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Zbaliť"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Obrázok albumu"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Posúvač hlasitosti"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Nie sú vybrané žiadne médiá"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Nie sú k dispozícii žiadne informácie"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Prenáša sa obrazovka"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Systém"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Zariadenia"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Tlačidlo prenosu"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Tlačidlo prenosu. Odpojené"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Tlačidlo prenosu. Pripája sa"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Tlačidlo prenosu. Pripojené"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Prenos do zariadenia"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Hľadajú sa zariadenia"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Odpojiť"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Zastaviť prenos"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Zavrieť"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Prehrať"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pozastaviť"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Zastaviť"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Rozbaliť"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Zbaliť"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Obrázok albumu"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Posúvač hlasitosti"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Nie sú vybraté žiadne médiá"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Nie sú k dispozícii žiadne informácie"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Prenáša sa obrazovka"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-sl/strings.xml b/mediarouter/src/main/res/values-sl/strings.xml
index 2b0eeb8..fe83391 100644
--- a/mediarouter/src/main/res/values-sl/strings.xml
+++ b/mediarouter/src/main/res/values-sl/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistem"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Naprave"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Gumb za predvajanje"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Gumb za predvajanje. Povezava je prekinjena."</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Gumb za predvajanje. Vzpostavljanje povezave."</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Gumb za predvajanje. Povezava je vzpostavljena."</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Predvajanje prek:"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Iskanje naprav"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Prekini povezavo"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Ustavi predvajanje"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Zapri"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Predvajaj"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Začasno ustavi"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Ustavi"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Razširi"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Strni"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Naslovnica albuma"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Drsnik za glasnost"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Predstavnost ni izbrana"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Ni podatkov"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Predvajanje vsebine zaslona"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistem"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Naprave"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Gumb za predvajanje"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Gumb za predvajanje. Povezava je prekinjena."</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Gumb za predvajanje. Vzpostavljanje povezave."</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Gumb za predvajanje. Povezava je vzpostavljena."</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Predvajanje v napravi:"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Iskanje naprav"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Prekini povezavo"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Ustavi predvajanje"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Zapri"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Predvajaj"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Začasno ustavi"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Ustavi"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Razširi"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Strni"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Naslovnica albuma"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Drsnik za glasnost"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Predstavnost ni izbrana"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Ni podatkov"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Predvajanje vsebine zaslona"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-sq/strings.xml b/mediarouter/src/main/res/values-sq/strings.xml
index f172212..aec71e7 100644
--- a/mediarouter/src/main/res/values-sq/strings.xml
+++ b/mediarouter/src/main/res/values-sq/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistemi"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Pajisjet"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Butoni i transmetimit"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Butoni i transmetimit. Je i shkëputur"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Butoni i transmetimit. Po lidhet"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Butoni i transmetimit. Je i lidhur"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Transmeto te"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Po kërkon pajisje"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Shkëput"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Ndalo transmetimin"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Mbyll"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Luaj"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pauzë"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Ndalo"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Zgjero"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Palos"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Kopertina e albumit"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Rrëshqitësi i volumit"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Nuk është zgjedhur asnjë media"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Nuk jepet asnjë informacion"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Po transmeton ekranin"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistemi"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Pajisjet"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Butoni i transmetimit"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Butoni i transmetimit. Je i shkëputur"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Butoni i transmetimit. Po lidhet"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Butoni i transmetimit. Je i lidhur"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Transmeto te"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Po kërkon pajisje"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Shkëput"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Ndalo transmetimin"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Mbyll"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Luaj"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pauzë"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Ndalo"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Zgjero"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Palos"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Kopertina e albumit"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Rrëshqitësi i volumit"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Nuk është zgjedhur asnjë media"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Nuk jepet asnjë informacion"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Po transmeton ekranin"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-sr/strings.xml b/mediarouter/src/main/res/values-sr/strings.xml
index e5d3577..31abee0 100644
--- a/mediarouter/src/main/res/values-sr/strings.xml
+++ b/mediarouter/src/main/res/values-sr/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Систем"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Уређаји"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Дугме Пребаци"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Дугме Пребаци. Веза је прекинута"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Дугме Пребаци. Повезује се"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Дугме Пребаци. Повезан је"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Пребаците на"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Траже се уређаји"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Прекини везу"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Заустави пребацивање"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Затвори"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Пусти"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Паузирај"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Заустави"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Прошири"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Скупи"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Омот албума"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Клизач за јачину звука"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Нема изабраних медија"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Нема доступних информација"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Пребацује се екран"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Систем"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Уређаји"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Дугме Пребаци"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Дугме Пребаци. Веза је прекинута"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Дугме Пребаци. Повезује се"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Дугме Пребаци. Повезан је"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Пребаците на"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Траже се уређаји"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Прекини везу"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Заустави пребацивање"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Затвори"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Пусти"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Паузирај"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Заустави"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Прошири"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Скупи"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Омот албума"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Клизач за јачину звука"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Нема изабраних медија"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Нема доступних информација"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Пребацује се екран"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-sv/strings.xml b/mediarouter/src/main/res/values-sv/strings.xml
index 3ed8212..4b04e77 100644
--- a/mediarouter/src/main/res/values-sv/strings.xml
+++ b/mediarouter/src/main/res/values-sv/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"System"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Enheter"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Cast-knappen"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Cast-knappen. Frånkopplad"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Cast-knappen. Ansluter"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Cast-knappen. Ansluten"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Casta till"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Letar efter enheter"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Koppla från"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Sluta casta"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Stäng"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Spela upp"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pausa"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Stoppa"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Utöka"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Komprimera"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Skivomslag"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Volymreglage"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Ingen media har valts"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Det finns ingen information"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Skärmen castas"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"System"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Enheter"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Cast-knappen"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Cast-knappen. Frånkopplad"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Cast-knappen. Ansluter"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Cast-knappen. Ansluten"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Casta till"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Letar efter enheter"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Koppla från"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Sluta casta"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Stäng"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Spela upp"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pausa"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Stopp"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Utöka"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Dölj"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Skivomslag"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Volymreglage"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Ingen media har valts"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Det finns ingen information"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Skärmen castas"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-sw/strings.xml b/mediarouter/src/main/res/values-sw/strings.xml
index 2a7af85..03228c3 100644
--- a/mediarouter/src/main/res/values-sw/strings.xml
+++ b/mediarouter/src/main/res/values-sw/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Mfumo"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Vifaa"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Kitufe cha kutuma"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Kitufe cha kutuma. Kimeondolewa"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Kitufe cha kutuma. Kinaunganishwa"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Kitufe cha kutuma. Kimeunganishwa"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Tuma kwenye"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Inatafuta vifaa"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Ondoa"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Acha kutuma"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Funga"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Cheza"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Sitisha"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Simamisha"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Panua"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Kunja"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Sanaa ya albamu"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Kidhibiti cha sauti"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Hakuna maudhui yaliyochaguliwa"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Hakuna maelezo yaliyopatikana"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Inatuma skrini"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Mfumo"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Vifaa"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Kitufe cha kutuma"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Kitufe cha kutuma. Kimeondolewa"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Kitufe cha kutuma. Kinaunganishwa"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Kitufe cha kutuma. Kimeunganishwa"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Tuma kwenye"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Inatafuta vifaa"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Ondoa"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Acha kutuma"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Funga"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Cheza"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Sitisha"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Acha kucheza"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Panua"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Kunja"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Sanaa ya albamu"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Kidhibiti cha sauti"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Hakuna maudhui yaliyochaguliwa"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Hakuna maelezo yaliyopatikana"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Inatuma skrini"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-ta/strings.xml b/mediarouter/src/main/res/values-ta/strings.xml
deleted file mode 100644
index 6b4f896..0000000
--- a/mediarouter/src/main/res/values-ta/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"சிஸ்டம்"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"சாதனங்கள்"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"அலைபரப்பும் பட்டன்"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"அலைபரப்பும் பட்டன். துண்டிக்கப்பட்டது"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"அலைபரப்பும் பட்டன். இணைக்கிறது"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"அலைபரப்பும் பட்டன். இணைக்கப்பட்டது"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"இதற்கு அலைபரப்பு:"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"சாதனங்களைத் தேடுகிறது"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"துண்டி"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"அலைபரப்புவதை நிறுத்து"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"மூடுவதற்கான பட்டன்"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"இயக்குவதற்கான பட்டன்"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"இடைநிறுத்துவதற்கான பட்டன்"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"நிறுத்துவதற்கான பட்டன்"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"விரிவாக்குவதற்கான பட்டன்"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"சுருக்குவதற்கான பட்டன்"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"ஆல்பம் ஆர்ட்"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"ஒலியளவு ஸ்லைடர்"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"மீடியா எதுவும் தேர்ந்தெடுக்கப்படவில்லை"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"தகவல் எதுவுமில்லை"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"திரையை அலைபரப்புகிறது"</string>
-</resources>
diff --git a/mediarouter/src/main/res/values-te/strings.xml b/mediarouter/src/main/res/values-te/strings.xml
deleted file mode 100644
index 0d4168f..0000000
--- a/mediarouter/src/main/res/values-te/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"సిస్టమ్"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"పరికరాలు"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Cast బటన్"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Cast బటన్. డిస్‌కనెక్ట్ చేయబడింది"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Cast బటన్. కనెక్ట్ చేస్తోంది"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Cast బటన్. కనెక్ట్ చేయబడింది"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"దీనికి ప్రసారం చేయండి"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"పరికరాలను కనుగొంటోంది"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"డిస్‌కనెక్ట్ చేయి"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"ప్రసారాన్ని ఆపివేయి"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"మూసివేయి"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"ప్లే చేయి"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"పాజ్ చేయి"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"ఆపివేయి"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"విస్తరించు"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"కుదించు"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"ఆల్బమ్ ఆర్ట్"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"వాల్యూమ్ స్లయిడర్"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"మీడియా ఏదీ ఎంచుకోలేదు"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"సమాచారం అందుబాటులో లేదు"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"స్క్రీన్‌ను ప్రసారం చేస్తోంది"</string>
-</resources>
diff --git a/mediarouter/src/main/res/values-th/strings.xml b/mediarouter/src/main/res/values-th/strings.xml
index b360779..4a388ed 100644
--- a/mediarouter/src/main/res/values-th/strings.xml
+++ b/mediarouter/src/main/res/values-th/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"ระบบ"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"อุปกรณ์"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"ปุ่ม \"แคสต์\""</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"ปุ่ม \"แคสต์\" ยกเลิกการเชื่อมต่อแล้ว"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"ปุ่ม \"แคสต์\" กำลังเชื่อมต่อ"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"ปุ่ม \"แคสต์\" เชื่อมต่อแล้ว"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"แคสต์ไปยัง"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"กำลังค้นหาอุปกรณ์"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"ยกเลิกการเชื่อมต่อ"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"หยุดแคสต์"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"ปิด"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"เล่น"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"หยุดชั่วคราว"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"หยุด"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"ขยาย"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"ยุบ"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"ปกอัลบั้ม"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"แถบเลื่อนปรับระดับเสียง"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"ไม่ได้เลือกสื่อไว้"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"ไม่มีข้อมูล"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"กำลังแคสต์หน้าจอ"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"ระบบ"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"อุปกรณ์"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"ปุ่ม \"แคสต์\""</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"ปุ่ม \"แคสต์\" ยกเลิกการเชื่อมต่อแล้ว"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"ปุ่ม \"แคสต์\" กำลังเชื่อมต่อ"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"ปุ่ม \"แคสต์\" เชื่อมต่อแล้ว"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"แคสต์ไปยัง"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"กำลังค้นหาอุปกรณ์"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"ยกเลิกการเชื่อมต่อ"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"หยุดแคสต์"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"ปิด"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"เปิด"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"หยุดชั่วคราว"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"หยุด"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"ขยาย"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"ยุบ"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"ปกอัลบั้ม"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"แถบเลื่อนปรับระดับเสียง"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"ไม่ได้เลือกสื่อไว้"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"ไม่มีข้อมูล"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"กำลังแคสต์หน้าจอ"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-tl/strings.xml b/mediarouter/src/main/res/values-tl/strings.xml
index 4d21125..0e450f3 100644
--- a/mediarouter/src/main/res/values-tl/strings.xml
+++ b/mediarouter/src/main/res/values-tl/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"System"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Mga Device"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Button na I-cast"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Button na I-cast. Nadiskonekta"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Button na I-cast. Kumokonekta"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Button na I-cast. Nakakonekta"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"I-cast sa"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Naghahanap ng mga device"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Idiskonekta"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Ihinto ang pag-cast"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Isara"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"I-play"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"I-pause"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Ihinto"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"I-expand"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"I-collapse"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Album art"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Slider ng volume"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Walang napiling media"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Walang available na impormasyon"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Ikina-cast ang screen"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"System"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Mga Device"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Button na I-cast"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Button na I-cast. Nadiskonekta"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Button na I-cast. Kumokonekta"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Button na I-cast. Nakakonekta"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"I-cast sa"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Naghahanap ng mga device"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Idiskonekta"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Ihinto ang pag-cast"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Isara"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"I-play"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"I-pause"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Ihinto"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"I-expand"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"I-collapse"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Album art"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Slider ng volume"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Walang napiling media"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Walang available na impormasyon"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Ikina-cast ang screen"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-tr/strings.xml b/mediarouter/src/main/res/values-tr/strings.xml
index e44f443..5c8882f 100644
--- a/mediarouter/src/main/res/values-tr/strings.xml
+++ b/mediarouter/src/main/res/values-tr/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Sistem"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Cihazlar"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Yayınla düğmesi"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Yayınla düğmesi. Bağlantı kesildi"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Yayınla düğmesi. Bağlanıyor"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Yayınla düğmesi. Bağlandı"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Şuraya yayınla:"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Cihazlar bulunuyor"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Bağlantıyı kes"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Yayını durdur"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Kapat"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Oynat"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Duraklat"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Durdur"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Genişlet"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Daralt"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Albüm kapağı"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Ses düzeyi kaydırma çubuğu"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Medya seçilmedi"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Bilgi yok"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Ekran yayınlanıyor"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Sistem"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Cihazlar"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Yayınla düğmesi"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Yayınla düğmesi. Bağlantı kesildi"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Yayınla düğmesi. Bağlanıyor"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Yayınla düğmesi. Bağlandı"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Yayınlanacak yer:"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Cihazlar bulunuyor"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Bağlantıyı kes"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Yayını durdur"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Kapat"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Oynat"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Duraklat"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Durdur"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Genişlet"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Daralt"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Albüm kapağı"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Ses düzeyi kaydırma çubuğu"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Medya seçilmedi"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Bilgi yok"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Ekran yayınlanıyor"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-uk/strings.xml b/mediarouter/src/main/res/values-uk/strings.xml
index 28e09bd..c90ece6 100644
--- a/mediarouter/src/main/res/values-uk/strings.xml
+++ b/mediarouter/src/main/res/values-uk/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Система"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Пристрої"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Кнопка трансляції"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Кнопка трансляції. Від’єднано"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Кнопка трансляції. Під’єднання"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Кнопка трансляції. Під’єднано"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Транслювати на"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Пошук пристроїв"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Від’єднати"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Припинити трансляцію"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Закрити"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Відтворити"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Призупинити"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Припинити"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Розгорнути"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Згорнути"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Обкладинка альбому"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Повзунок гучності"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Не вибрано медіа"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Немає даних"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Трансляція екрана"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Система"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Пристрої"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Кнопка трансляції"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Кнопка трансляції. Від’єднано"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Кнопка трансляції. Під’єднання"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Кнопка трансляції. Під’єднано"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Транслювати на пристрій"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Пошук пристроїв"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Від’єднати"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Припинити трансляцію"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Закрити"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Відтворити"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Призупинити"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Зупинити"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Розгорнути"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Згорнути"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Обкладинка альбому"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Повзунок гучності"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Не вибрано медіа-вміст"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Немає даних"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Трансляція екрана"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-ur/strings.xml b/mediarouter/src/main/res/values-ur/strings.xml
deleted file mode 100644
index 8c09830..0000000
--- a/mediarouter/src/main/res/values-ur/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"سسٹم"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"آلات"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"کاسٹ کرنے کا بٹن"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"کاسٹ کرنے کا بٹن۔ غیر منسلک ہے"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"کاسٹ کرنے کا بٹن۔ منسلک ہو رہا ہے"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"کاسٹ کرنے کا بٹن۔ منسلک ہے"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"اس میں کاسٹ کریں"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"آلات تلاش کئے جا رہے ہیں"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"غیر منسلک کریں"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"کاسٹ کرنا بند کریں"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"بند کریں"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"چلائیں"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"موقوف کریں"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"روکیں"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"پھیلائیں"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"سکیڑیں"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"البم آرٹ"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"والیوم سلائیڈر"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"کوئی میڈیا منتخب نہیں ہے"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"کوئی معلومات دستیاب نہیں"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"اسکرین کاسٹ ہو رہی ہے"</string>
-</resources>
diff --git a/mediarouter/src/main/res/values-uz/strings.xml b/mediarouter/src/main/res/values-uz/strings.xml
index 2eadc9b..0c6fbf1 100644
--- a/mediarouter/src/main/res/values-uz/strings.xml
+++ b/mediarouter/src/main/res/values-uz/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Tizim"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Qurilmalar"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Translatsiya qilish tugmasi"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Translatsiya tugmasi. Uzildi"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Translatsiya tugmasi. Ulanmoqda"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Translatsiya tugmasi. Ulandi"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Bunga translatsiya qilish:"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Qurilmalarni topish"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Uzish"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Translatsiyani to‘xtatish"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Yopish"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Ijro"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Pauza"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"To‘xtatish"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Yoyish"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Yig‘ish"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Albom muqovasi"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Tovush balandligi slayderi"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Multimedia tanlamagan"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Ma’lumot yo‘q"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Ekran namoyish qilinmoqda"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Tizim"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Qurilmalar"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Translatsiya tugmasi"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Translatsiya tugmasi. Uzildi"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Translatsiya tugmasi. Ulanmoqda"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Translatsiya tugmasi. Ulandi"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Bunga translatsiya qilish:"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Qurilmalarni topish"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Uzish"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Translatsiyani to‘xtatish"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Yopish"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Ijro"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Pauza"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"To‘xtatish"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Yoyish"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Yig‘ish"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Albom muqovasi"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Tovush balandligi slayderi"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Multimedia tanlamagan"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Ma’lumot yo‘q"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Ekran namoyish qilinmoqda"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-vi/strings.xml b/mediarouter/src/main/res/values-vi/strings.xml
index d0f7311..82204b4 100644
--- a/mediarouter/src/main/res/values-vi/strings.xml
+++ b/mediarouter/src/main/res/values-vi/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Hệ thống"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Thiết bị"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Nút truyền"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Nút truyền. Đã ngắt kết nối"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Nút truyền. Đang kết nối"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Nút truyền. Đã kết nối"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Truyền tới"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Đang tìm thiết bị"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Ngắt kết nối"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Dừng truyền"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Đóng"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Phát"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Tạm dừng"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Dừng"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Mở rộng"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Thu gọn"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Ảnh bìa album"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Thanh trượt âm lượng"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Không có phương tiện nào được chọn"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Không có thông tin nào"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Đang truyền màn hình"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Hệ thống"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Thiết bị"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Nút truyền"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Nút truyền. Đã ngắt kết nối"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Nút truyền. Đang kết nối"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Nút truyền. Đã kết nối"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Truyền tới"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Đang tìm thiết bị"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Ngắt kết nối"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Dừng truyền"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Đóng"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Phát"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Tạm dừng"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Dừng"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Mở rộng"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Thu gọn"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Ảnh bìa album"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Thanh trượt âm lượng"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Chưa chọn phương tiện nào"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Không có thông tin nào"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Đang truyền màn hình"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-zh-rCN/strings.xml b/mediarouter/src/main/res/values-zh-rCN/strings.xml
index 140c817..92fe319 100644
--- a/mediarouter/src/main/res/values-zh-rCN/strings.xml
+++ b/mediarouter/src/main/res/values-zh-rCN/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"系统"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"设备"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"投射按钮"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"投射按钮。已断开连接"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"投射按钮。正在连接"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"投射按钮。已连接"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"投射到"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"正在查找设备"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"断开连接"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"停止投射"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"关闭"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"播放"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"暂停"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"停止"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"展开"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"收起"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"专辑封面"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"音量滑块"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"未选择任何媒体内容"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"没有任何相关信息"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"正在投射屏幕"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"系统"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"设备"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"投射按钮"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"投射按钮。已断开连接"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"投射按钮。正在连接"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"投射按钮。已连接"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"投射到"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"正在查找设备"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"断开连接"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"停止投射"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"关闭"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"播放"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"暂停"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"停止"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"展开"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"收起"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"专辑封面"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"音量滑块"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"未选择任何媒体内容"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"没有任何相关信息"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"正在投射屏幕"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-zh-rHK/strings.xml b/mediarouter/src/main/res/values-zh-rHK/strings.xml
index 9318093..2de9f04 100644
--- a/mediarouter/src/main/res/values-zh-rHK/strings.xml
+++ b/mediarouter/src/main/res/values-zh-rHK/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"系統"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"裝置"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"投放按鈕"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"投放按鈕。解除咗連線"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"投放按鈕。連緊線"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"投放按鈕。連咗線"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"投放至"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"正在尋找裝置"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"解除連線"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"停止投放"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"閂"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"播放"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"暫停"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"停"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"展開"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"收合"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"專輯封面"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"音量滑桿"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"未選取任何媒體"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"沒有資料可以提供"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"正在投放畫面"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"系統"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"裝置"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"投放按鈕"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"投放按鈕。解除咗連線"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"投放按鈕。連緊線"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"投放按鈕。連咗線"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"投放至"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"正在尋找裝置"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"解除連接"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"停止投放"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"閂"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"播"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"暫停"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"停"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"展開"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"收合"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"專輯封面"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"音量滑桿"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"未選取任何媒體"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"沒有資料可以提供"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"正在投放畫面"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-zh-rTW/strings.xml b/mediarouter/src/main/res/values-zh-rTW/strings.xml
index bd2f9ad..08b92c6 100644
--- a/mediarouter/src/main/res/values-zh-rTW/strings.xml
+++ b/mediarouter/src/main/res/values-zh-rTW/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"系統"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"裝置"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"投放按鈕"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"投放按鈕;已中斷連線"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"投放按鈕;連線中"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"投放按鈕;已連線"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"投放到"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"正在尋找裝置"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"中斷連線"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"停止投放"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"關閉"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"播放"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"暫停"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"停止"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"展開"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"收合"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"專輯封面"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"音量滑桿"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"未選取任何媒體"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"沒有可用的資訊"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"正在投放畫面"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"系統"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"裝置"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"投放按鈕"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"投放按鈕;已中斷連線"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"投放按鈕;連線中"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"投放按鈕;已連線"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"投放到"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"正在尋找裝置"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"中斷連線"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"停止投放"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"關閉"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"播放"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"暫停"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"停止"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"展開"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"收合"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"專輯封面"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"音量滑桿"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"未選取任何媒體"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"沒有可用的資訊"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"正在投放畫面"</string>
 </resources>
diff --git a/mediarouter/src/main/res/values-zu/strings.xml b/mediarouter/src/main/res/values-zu/strings.xml
index e91293f..cf767c0 100644
--- a/mediarouter/src/main/res/values-zu/strings.xml
+++ b/mediarouter/src/main/res/values-zu/strings.xml
@@ -16,25 +16,25 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="6445173646164603280">"Isistimu"</string>
-    <string name="mr_user_route_category_name" msgid="8951247913519682277">"Amadivayisi"</string>
-    <string name="mr_button_content_description" msgid="6209940985205889239">"Inkinobho yokusakaza"</string>
-    <string name="mr_cast_button_disconnected" msgid="1214396433859225686">"Inkinobho yokusakaza. Kunqanyuliwe"</string>
-    <string name="mr_cast_button_connecting" msgid="7767160474954808770">"Inkinobho yokusakaza. Kuyaxhunywa"</string>
-    <string name="mr_cast_button_connected" msgid="7205934955575650355">"Inkinobho yokusakaza. Kuxhunyiwe"</string>
-    <string name="mr_chooser_title" msgid="1469819231928206099">"Sakaza ku-"</string>
-    <string name="mr_chooser_searching" msgid="7883700464756247478">"Ithola amadivayisi"</string>
-    <string name="mr_controller_disconnect" msgid="1224563715954797152">"Nqamula"</string>
-    <string name="mr_controller_stop_casting" msgid="6043110833085090960">"Misa ukusakaza"</string>
-    <string name="mr_controller_close_description" msgid="1404151965680505956">"Vala"</string>
-    <string name="mr_controller_play" msgid="2233159395781515552">"Dlala"</string>
-    <string name="mr_controller_pause" msgid="5465089322498973309">"Misa isikhashana"</string>
-    <string name="mr_controller_stop" msgid="6970507798830838731">"Misa"</string>
-    <string name="mr_controller_expand_group" msgid="6561849209271950311">"Nweba"</string>
-    <string name="mr_controller_collapse_group" msgid="5621264648958127139">"Goqa"</string>
-    <string name="mr_controller_album_art" msgid="8313236767081989488">"Ubuciko be-albhamu"</string>
-    <string name="mr_controller_volume_slider" msgid="390328956880221771">"Isilayida sevolumu"</string>
-    <string name="mr_controller_no_media_selected" msgid="5388112032574870059">"Ayikho imidiya ekhethiwe"</string>
-    <string name="mr_controller_no_info_available" msgid="942251150039480236">"Alukho ulwazi olutholakalayo"</string>
-    <string name="mr_controller_casting_screen" msgid="2406876321200529148">"Isikrini sokusakaza"</string>
+    <string name="mr_system_route_name" msgid="3117964881088969586">"Isistimu"</string>
+    <string name="mr_user_route_category_name" msgid="8236416097133080726">"Amadivayisi"</string>
+    <string name="mr_button_content_description" msgid="1685185767093348095">"Inkinobho yokusakaza"</string>
+    <string name="mr_cast_button_disconnected" msgid="5501231066847739632">"Inkinobho yokusakaza. Kunqanyuliwe"</string>
+    <string name="mr_cast_button_connecting" msgid="8959304318293841992">"Inkinobho yokusakaza. Kuyaxhunywa"</string>
+    <string name="mr_cast_button_connected" msgid="1350095112462806159">"Inkinobho yokusakaza. Kuxhunyiwe"</string>
+    <string name="mr_chooser_title" msgid="7548226170787476564">"Sakaza ku-"</string>
+    <string name="mr_chooser_searching" msgid="5504553798429329689">"Ithola amadivayisi"</string>
+    <string name="mr_controller_disconnect" msgid="1370654436555555647">"Nqamula"</string>
+    <string name="mr_controller_stop_casting" msgid="7617024847862349259">"Misa ukusakaza"</string>
+    <string name="mr_controller_close_description" msgid="5468775621814500662">"Vala"</string>
+    <string name="mr_controller_play" msgid="4443315438268112801">"Dlala"</string>
+    <string name="mr_controller_pause" msgid="4701315813294065305">"Phumula"</string>
+    <string name="mr_controller_stop" msgid="5106056093749454009">"Misa"</string>
+    <string name="mr_controller_expand_group" msgid="2422682304043876468">"Nweba"</string>
+    <string name="mr_controller_collapse_group" msgid="5518911192681928413">"Goqa"</string>
+    <string name="mr_controller_album_art" msgid="5813284753012893250">"Ubuciko be-albhamu"</string>
+    <string name="mr_controller_volume_slider" msgid="691656961160498512">"Isilayida sevolumu"</string>
+    <string name="mr_controller_no_media_selected" msgid="4342878516155861006">"Ayikho imidiya ekhethiwe"</string>
+    <string name="mr_controller_no_info_available" msgid="7299368841849988218">"Alukho ulwazi olutholakalayo"</string>
+    <string name="mr_controller_casting_screen" msgid="5286734709674025661">"Isikrini sokusakaza"</string>
 </resources>
diff --git a/palette/ktx/OWNERS b/palette/ktx/OWNERS
new file mode 100644
index 0000000..e450f4c
--- /dev/null
+++ b/palette/ktx/OWNERS
@@ -0,0 +1 @@
+jakew@google.com
diff --git a/palette/ktx/build.gradle b/palette/ktx/build.gradle
new file mode 100644
index 0000000..e5d5d43
--- /dev/null
+++ b/palette/ktx/build.gradle
@@ -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.
+ */
+
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+    id("org.jetbrains.kotlin.android")
+}
+
+android {
+    buildTypes {
+        debug {
+            testCoverageEnabled = false // Breaks Kotlin compiler.
+        }
+    }
+}
+
+dependencies {
+    api(project(":palette"))
+    api(KOTLIN_STDLIB)
+    androidTestImplementation(JUNIT)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+}
+
+supportLibrary {
+    name = "Palette Kotlin Extensions"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.PALETTE
+    inceptionYear = "2018"
+    description = "Kotlin extensions for 'palette' artifact"
+}
diff --git a/palette/ktx/src/androidTest/java/androidx/palette/graphics/PaletteTest.kt b/palette/ktx/src/androidTest/java/androidx/palette/graphics/PaletteTest.kt
new file mode 100644
index 0000000..c108493
--- /dev/null
+++ b/palette/ktx/src/androidTest/java/androidx/palette/graphics/PaletteTest.kt
@@ -0,0 +1,42 @@
+/*
+ * 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.palette.graphics
+
+import android.graphics.Bitmap
+import android.graphics.Bitmap.Config.ARGB_8888
+import android.graphics.Canvas
+import android.graphics.Color.RED
+import androidx.palette.graphics.Target.VIBRANT
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertSame
+import org.junit.Test
+
+class PaletteTest {
+    @Test fun bitmapBuild() {
+        val bitmap = Bitmap.createBitmap(10, 10, ARGB_8888)
+        // There's no easy way to test that the palette was created from our Bitmap.
+        assertNotNull(bitmap.buildPalette())
+    }
+
+    @Test fun operatorGet() {
+        val bitmap = Bitmap.createBitmap(10, 10, ARGB_8888).apply {
+            Canvas(this).drawColor(RED)
+        }
+        val palette = Palette.from(bitmap).generate()
+        assertSame(palette.getSwatchForTarget(VIBRANT), palette[VIBRANT])
+    }
+}
diff --git a/palette/ktx/src/main/AndroidManifest.xml b/palette/ktx/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f25fda5
--- /dev/null
+++ b/palette/ktx/src/main/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?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.
+  -->
+<manifest package="androidx.palette.ktx"/>
diff --git a/palette/ktx/src/main/java/androidx/palette/graphics/Palette.kt b/palette/ktx/src/main/java/androidx/palette/graphics/Palette.kt
new file mode 100644
index 0000000..58da09a
--- /dev/null
+++ b/palette/ktx/src/main/java/androidx/palette/graphics/Palette.kt
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
+
+package androidx.palette.graphics
+
+import android.graphics.Bitmap
+
+/**
+ * Create a [Palette.Builder] from this bitmap.
+ *
+ * @see Palette.from
+ */
+inline fun Bitmap.buildPalette() = Palette.Builder(this)
+
+/**
+ * Returns the selected swatch for the given target from the palette, or `null` if one
+ * could not be found.
+ *
+ * @see Palette.getSwatchForTarget
+ */
+inline operator fun Palette.get(target: Target): Palette.Swatch? = getSwatchForTarget(target)
diff --git a/persistence/db/ktx/OWNERS b/persistence/db/ktx/OWNERS
new file mode 100644
index 0000000..e450f4c
--- /dev/null
+++ b/persistence/db/ktx/OWNERS
@@ -0,0 +1 @@
+jakew@google.com
diff --git a/persistence/db/ktx/build.gradle b/persistence/db/ktx/build.gradle
new file mode 100644
index 0000000..676445b
--- /dev/null
+++ b/persistence/db/ktx/build.gradle
@@ -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.
+ */
+
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.LibraryVersions
+import androidx.build.SupportLibraryExtension
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    api(project(":sqlite:sqlite"))
+    api(KOTLIN_STDLIB)
+
+    testImplementation(JUNIT)
+    testImplementation(MOCKITO_CORE)
+}
+
+supportLibrary {
+    name = "Android DB KTX"
+    publish = true
+    mavenVersion = LibraryVersions.ROOM
+    mavenGroup = LibraryGroups.PERSISTENCE
+    inceptionYear = "2018"
+    description = "Kotlin extensions for DB"
+    url = SupportLibraryExtension.ARCHITECTURE_URL
+}
diff --git a/persistence/db/ktx/src/main/AndroidManifest.xml b/persistence/db/ktx/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f4d66ba
--- /dev/null
+++ b/persistence/db/ktx/src/main/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<!--
+  ~ 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.
+  -->
+
+<manifest package="androidx.sqlite.db.ktx"/>
diff --git a/persistence/db/ktx/src/main/java/androidx/sqlite/db/SupportSQLiteDatabase.kt b/persistence/db/ktx/src/main/java/androidx/sqlite/db/SupportSQLiteDatabase.kt
new file mode 100644
index 0000000..ba7b338
--- /dev/null
+++ b/persistence/db/ktx/src/main/java/androidx/sqlite/db/SupportSQLiteDatabase.kt
@@ -0,0 +1,40 @@
+/*
+ * 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.sqlite.db
+
+/**
+ * Run [body] in a transaction marking it as successful if it completes without exception.
+ *
+ * @param exclusive Run in `EXCLUSIVE` mode when true, `IMMEDIATE` mode otherwise.
+ */
+inline fun <T> SupportSQLiteDatabase.transaction(
+    exclusive: Boolean = true,
+    body: SupportSQLiteDatabase.() -> T
+): T {
+    if (exclusive) {
+        beginTransaction()
+    } else {
+        beginTransactionNonExclusive()
+    }
+    try {
+        val result = body()
+        setTransactionSuccessful()
+        return result
+    } finally {
+        endTransaction()
+    }
+}
diff --git a/persistence/db/ktx/src/test/java/androidx/sqlite/db/SupportSQLiteDatabaseTest.kt b/persistence/db/ktx/src/test/java/androidx/sqlite/db/SupportSQLiteDatabaseTest.kt
new file mode 100644
index 0000000..76698d3
--- /dev/null
+++ b/persistence/db/ktx/src/test/java/androidx/sqlite/db/SupportSQLiteDatabaseTest.kt
@@ -0,0 +1,64 @@
+/*
+ * 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.sqlite.db
+
+import org.junit.Assert.fail
+import org.junit.Test
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+
+class SupportSQLiteDatabaseTest {
+    @Test fun exclusiveDefault() {
+        val db = mock(SupportSQLiteDatabase::class.java)
+        db.transaction {}
+        verify(db).beginTransaction()
+    }
+
+    @Test fun exclusiveFalse() {
+        val db = mock(SupportSQLiteDatabase::class.java)
+        db.transaction(exclusive = false) {}
+        verify(db).beginTransactionNonExclusive()
+    }
+
+    @Test fun exclusiveTrue() {
+        val db = mock(SupportSQLiteDatabase::class.java)
+        db.transaction(exclusive = true) {}
+        verify(db).beginTransaction()
+    }
+
+    @Test fun bodyNormalCallsSuccessAndEnd() {
+        val db = mock(SupportSQLiteDatabase::class.java)
+        db.transaction {}
+        verify(db).setTransactionSuccessful()
+        verify(db).endTransaction()
+    }
+
+    @Suppress("UNREACHABLE_CODE") // A programming error might not invoke the lambda.
+    @Test fun bodyThrowsDoesNotCallSuccess() {
+        val db = mock(SupportSQLiteDatabase::class.java)
+        try {
+            db.transaction {
+                throw IllegalStateException()
+            }
+            fail()
+        } catch (e: IllegalStateException) {
+        }
+        verify(db, times(0)).setTransactionSuccessful()
+        verify(db).endTransaction()
+    }
+}
diff --git a/preference/res/values-af/strings.xml b/preference/res/values-af/strings.xml
index 17c2037..0f325ec 100644
--- a/preference/res/values-af/strings.xml
+++ b/preference/res/values-af/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"AAN"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"AF"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Gevorderd"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"AAN"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"AF"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Gevorderd"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-am/strings.xml b/preference/res/values-am/strings.xml
index 052425c..c7de5d8 100644
--- a/preference/res/values-am/strings.xml
+++ b/preference/res/values-am/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"በርቷል"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ቅናሽ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"የላቀ"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>፣ <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"በርቷል"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ጠፍቷል"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"የላቀ"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>፣ <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-ar/strings.xml b/preference/res/values-ar/strings.xml
index 1e5515d..90b2266 100644
--- a/preference/res/values-ar/strings.xml
+++ b/preference/res/values-ar/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"تفعيل"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"إيقاف"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"إعدادات متقدمة"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>، <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"تفعيل"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"إيقاف"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"إعدادات متقدمة"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>، <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-az/strings.xml b/preference/res/values-az/strings.xml
index 978b862..1b208c8 100644
--- a/preference/res/values-az/strings.xml
+++ b/preference/res/values-az/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"AKTİV"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"DEAKTİV"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Qabaqcıl"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"AKTİV"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"DEAKTİV"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Qabaqcıl"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-b+sr+Latn/strings.xml b/preference/res/values-b+sr+Latn/strings.xml
index 61c784a..6ab31a0 100644
--- a/preference/res/values-b+sr+Latn/strings.xml
+++ b/preference/res/values-b+sr+Latn/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"UKLJUČENO"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ISKLJUČENO"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Napredno"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"UKLJUČENO"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ISKLJUČENO"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Napredno"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-be/strings.xml b/preference/res/values-be/strings.xml
index 8ebdeaf..0e2bd91 100644
--- a/preference/res/values-be/strings.xml
+++ b/preference/res/values-be/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"УКЛ."</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ВЫКЛ."</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Высокая"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"УКЛ."</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ВЫКЛ."</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Пашыраныя налады"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-bg/strings.xml b/preference/res/values-bg/strings.xml
index e2e9544..0323468 100644
--- a/preference/res/values-bg/strings.xml
+++ b/preference/res/values-bg/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ВКЛ."</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ИЗКЛ."</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Разширени"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ВКЛ."</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ИЗКЛ."</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Разширени"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-bn/strings.xml b/preference/res/values-bn/strings.xml
deleted file mode 100644
index a17e22a..0000000
--- a/preference/res/values-bn/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"চালু"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"বন্ধ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"উন্নত"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-</resources>
diff --git a/preference/res/values-bs/strings.xml b/preference/res/values-bs/strings.xml
index 61c784a..6ab31a0 100644
--- a/preference/res/values-bs/strings.xml
+++ b/preference/res/values-bs/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"UKLJUČENO"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ISKLJUČENO"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Napredno"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"UKLJUČENO"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ISKLJUČENO"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Napredno"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-ca/strings.xml b/preference/res/values-ca/strings.xml
index 56e5c66..10f3d94 100644
--- a/preference/res/values-ca/strings.xml
+++ b/preference/res/values-ca/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ACTIVAT"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"DESACTIVAT"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Opcions avançades"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ACTIVAT"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"DESACTIVAT"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Opcions avançades"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-cs/strings.xml b/preference/res/values-cs/strings.xml
index 5865c0b..11a67f8 100644
--- a/preference/res/values-cs/strings.xml
+++ b/preference/res/values-cs/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ZAP"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"VYP"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Rozšířené"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ZAP"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"VYP"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Rozšířená nastavení"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-da/strings.xml b/preference/res/values-da/strings.xml
index da2532f..67cb27c 100644
--- a/preference/res/values-da/strings.xml
+++ b/preference/res/values-da/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"TIL"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"FRA"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Avanceret"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"TIL"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"FRA"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Avanceret"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-de/strings.xml b/preference/res/values-de/strings.xml
index 5b0be51..59f20a6 100644
--- a/preference/res/values-de/strings.xml
+++ b/preference/res/values-de/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"AN"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"AUS"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Erweitert"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"AN"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"AUS"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Erweitert"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-el/strings.xml b/preference/res/values-el/strings.xml
index 59ba395..645d0bf 100644
--- a/preference/res/values-el/strings.xml
+++ b/preference/res/values-el/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Σύνθετες"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ΕΝΕΡΓΗ"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ΑΝΕΝΕΡΓΗ"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Σύνθετες"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-en-rAU/strings.xml b/preference/res/values-en-rAU/strings.xml
index dd3e15f..c8d1681 100644
--- a/preference/res/values-en-rAU/strings.xml
+++ b/preference/res/values-en-rAU/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ON"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"OFF"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Advanced"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ON"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"OFF"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Advanced"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-en-rCA/strings.xml b/preference/res/values-en-rCA/strings.xml
index dd3e15f..c8d1681 100644
--- a/preference/res/values-en-rCA/strings.xml
+++ b/preference/res/values-en-rCA/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ON"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"OFF"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Advanced"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ON"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"OFF"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Advanced"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-en-rGB/strings.xml b/preference/res/values-en-rGB/strings.xml
index dd3e15f..c8d1681 100644
--- a/preference/res/values-en-rGB/strings.xml
+++ b/preference/res/values-en-rGB/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ON"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"OFF"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Advanced"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ON"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"OFF"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Advanced"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-en-rIN/strings.xml b/preference/res/values-en-rIN/strings.xml
index dd3e15f..c8d1681 100644
--- a/preference/res/values-en-rIN/strings.xml
+++ b/preference/res/values-en-rIN/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ON"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"OFF"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Advanced"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ON"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"OFF"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Advanced"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-en-rXC/strings.xml b/preference/res/values-en-rXC/strings.xml
index 3f4c7a0..96219e7 100644
--- a/preference/res/values-en-rXC/strings.xml
+++ b/preference/res/values-en-rXC/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‎‎‎‎‏‏‎‎‎‏‎‏‎‎‎‎‏‎‏‏‎‎‎‎‎‎‏‏‎‎‏‎‎‏‎‎‏‏‎‎‎ON‎‏‎‎‏‎"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‎‎‎‏‏‏‏‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‏‎‏‏‎‏‏‎‏‏‎‎OFF‎‏‎‎‏‎"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎‏‎‎‎‏‎‎‏‏‏‏‎‏‎‎‏‎‎‏‎‏‎‎‎‎‏‎‏‎‎‎‏‏‎‎‎‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‎‎Advanced‎‏‎‎‏‎"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‏‏‎‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>‎‏‎‎‏‏‏‎, ‎‏‎‎‏‏‎<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‏‏‏‏‏‎‎‎‎‏‎‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‏‎‎‎‏‏‏‎ON‎‏‎‎‏‎"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‎‏‏‏‏‎‏‎‎‏‎‎‎‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‏‏‎‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‎‎‎‏‎‏‏‎OFF‎‏‎‎‏‎"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‎‎‎‎‏‎‏‎‏‎‏‏‏‏‎‏‎‏‏‏‎‎‏‏‎‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‎Advanced‎‏‎‎‏‎"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‏‏‏‎‎‎‎‎‏‎‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‎‎‏‏‏‎‏‎‎‏‏‎‎‏‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>‎‏‎‎‏‏‏‎, ‎‏‎‎‏‏‎<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
 </resources>
diff --git a/preference/res/values-es-rUS/strings.xml b/preference/res/values-es-rUS/strings.xml
index 3911ab9..e7639c1 100644
--- a/preference/res/values-es-rUS/strings.xml
+++ b/preference/res/values-es-rUS/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ACTIVADO"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"DESACTIVADO"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Avanzado"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ACTIVADA"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"DESACTIVADA"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Opciones avanzadas"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-es/strings.xml b/preference/res/values-es/strings.xml
index 3911ab9..e5640eb 100644
--- a/preference/res/values-es/strings.xml
+++ b/preference/res/values-es/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ACTIVADO"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"DESACTIVADO"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Avanzado"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ACTIVADA"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"DESACTIVADA"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Avanzada"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-et/strings.xml b/preference/res/values-et/strings.xml
index 9fa4f4f..a315280 100644
--- a/preference/res/values-et/strings.xml
+++ b/preference/res/values-et/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"SEES"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"VÄLJAS"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Täpsemad"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"SEES"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"VÄLJAS"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Täpsem"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-eu/strings.xml b/preference/res/values-eu/strings.xml
index 6718992..1a71b90 100644
--- a/preference/res/values-eu/strings.xml
+++ b/preference/res/values-eu/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"AKTIBATUTA"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"DESAKTIBATUTA"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Aurreratua"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"AKTIBATUTA"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"DESAKTIBATUTA"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Hobespen aurreratuak"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-fa/strings.xml b/preference/res/values-fa/strings.xml
index 86e9f30..b4191aa 100644
--- a/preference/res/values-fa/strings.xml
+++ b/preference/res/values-fa/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"روشن"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"خاموش"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"پیشرفته"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>، <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"روشن"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"خاموش"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"پیشرفته"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>، <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-fi/strings.xml b/preference/res/values-fi/strings.xml
index cec0857..cd82547 100644
--- a/preference/res/values-fi/strings.xml
+++ b/preference/res/values-fi/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"PÄÄLLÄ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"POIS PÄÄLTÄ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Lisätiedot"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"KÄYTÖSSÄ"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"POIS KÄYTÖSTÄ"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Lisäasetukset"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-fr-rCA/strings.xml b/preference/res/values-fr-rCA/strings.xml
index db4c2b5..9e9269d 100644
--- a/preference/res/values-fr-rCA/strings.xml
+++ b/preference/res/values-fr-rCA/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ACTIVÉ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"DÉSACTIVÉ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Avancé"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ACTIVÉ"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"DÉSACTIVER"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Avancé"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-fr/strings.xml b/preference/res/values-fr/strings.xml
index b5cca98..e74b2a4 100644
--- a/preference/res/values-fr/strings.xml
+++ b/preference/res/values-fr/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ACTIVÉ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"DÉSACTIVÉ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Options avancées"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ACTIVÉ"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"DÉSACTIVÉ"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Préférences avancées"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-gl/strings.xml b/preference/res/values-gl/strings.xml
index 3911ab9..8091d9c 100644
--- a/preference/res/values-gl/strings.xml
+++ b/preference/res/values-gl/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ACTIVADO"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"DESACTIVADO"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Avanzado"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ACTIVADO"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"DESACTIVADO"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Configuración avanzada"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-gu/strings.xml b/preference/res/values-gu/strings.xml
deleted file mode 100644
index 468fd2c..0000000
--- a/preference/res/values-gu/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ચાલુ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"બંધ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"વિગતવાર"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-</resources>
diff --git a/preference/res/values-hi/strings.xml b/preference/res/values-hi/strings.xml
deleted file mode 100644
index dcfb766..0000000
--- a/preference/res/values-hi/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"चालू"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"बंद"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"बेहतर विकल्प"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-</resources>
diff --git a/preference/res/values-hr/strings.xml b/preference/res/values-hr/strings.xml
index 61c784a..6ab31a0 100644
--- a/preference/res/values-hr/strings.xml
+++ b/preference/res/values-hr/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"UKLJUČENO"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ISKLJUČENO"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Napredno"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"UKLJUČENO"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ISKLJUČENO"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Napredno"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-hu/strings.xml b/preference/res/values-hu/strings.xml
index 85f80aa..0b65185 100644
--- a/preference/res/values-hu/strings.xml
+++ b/preference/res/values-hu/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"BE"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"KI"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Speciális"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"BE"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"KI"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Speciális"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-hy/strings.xml b/preference/res/values-hy/strings.xml
index 06f9d22..c9d47a8 100644
--- a/preference/res/values-hy/strings.xml
+++ b/preference/res/values-hy/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ՄԻԱՑՎԱԾ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ԱՆՋԱՏԱԾ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Լրացուցիչ"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ՄԻԱՑՎԱԾ"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ԱՆՋԱՏԱԾ"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Լրացուցիչ"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-in/strings.xml b/preference/res/values-in/strings.xml
index e17c251..d56dcd3 100644
--- a/preference/res/values-in/strings.xml
+++ b/preference/res/values-in/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"AKTIF"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"NONAKTIF"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Lanjutan"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"AKTIF"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"NONAKTIF"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Lanjutan"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-is/strings.xml b/preference/res/values-is/strings.xml
index 361d1c3..6af367f 100644
--- a/preference/res/values-is/strings.xml
+++ b/preference/res/values-is/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"KVEIKT"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"SLÖKKT"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Ítarlegt"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"KVEIKT"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"SLÖKKT"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Ítarlegt"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-it/strings.xml b/preference/res/values-it/strings.xml
index 2514600..4fb3179 100644
--- a/preference/res/values-it/strings.xml
+++ b/preference/res/values-it/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ON"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"OFF"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Avanzate"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ON"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"OFF"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Avanzate"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-iw/strings.xml b/preference/res/values-iw/strings.xml
index 6ca15e5..8afe71e 100644
--- a/preference/res/values-iw/strings.xml
+++ b/preference/res/values-iw/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"מופעל"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"כבוי"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"מתקדם"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"מופעל"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"כבוי"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"מתקדם"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-ja/strings.xml b/preference/res/values-ja/strings.xml
index 2d599d3..30ebd12 100644
--- a/preference/res/values-ja/strings.xml
+++ b/preference/res/values-ja/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ON"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"OFF"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"詳細設定"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>、<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ON"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"OFF"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"詳細設定"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>、<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-ka/strings.xml b/preference/res/values-ka/strings.xml
index 21b8246..731ddd4 100644
--- a/preference/res/values-ka/strings.xml
+++ b/preference/res/values-ka/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ჩართული"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"გამორთული"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"დამატებით"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ჩართული"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"გამორთული"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"დამატებით"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-kk/strings.xml b/preference/res/values-kk/strings.xml
index ebbba78..2a5880c 100644
--- a/preference/res/values-kk/strings.xml
+++ b/preference/res/values-kk/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ҚОСУЛЫ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ӨШІРУЛІ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Қосымша"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ҚОСУЛЫ"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ӨШІРУЛІ"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Қосымша"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-km/strings.xml b/preference/res/values-km/strings.xml
index d7cb942..4945df6 100644
--- a/preference/res/values-km/strings.xml
+++ b/preference/res/values-km/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"បើក"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"បិទ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"កម្រិតខ្ពស់"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"បើក"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"បិទ"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"កម្រិតខ្ពស់"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-kn/strings.xml b/preference/res/values-kn/strings.xml
deleted file mode 100644
index 9ce1917..0000000
--- a/preference/res/values-kn/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ಆನ್"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ಆಫ್"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"ಸುಧಾರಿತ"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-</resources>
diff --git a/preference/res/values-ko/strings.xml b/preference/res/values-ko/strings.xml
index ab1f380..78d6449 100644
--- a/preference/res/values-ko/strings.xml
+++ b/preference/res/values-ko/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"사용"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"사용 안함"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"고급"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"사용"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"사용 안함"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"고급"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-ky/strings.xml b/preference/res/values-ky/strings.xml
index 257c6d5..621effa 100644
--- a/preference/res/values-ky/strings.xml
+++ b/preference/res/values-ky/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"КҮЙҮК"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ӨЧҮК"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Өркүндөтүлгөн"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"КҮЙҮК"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ӨЧҮК"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Өркүндөтүлгөн"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-lo/strings.xml b/preference/res/values-lo/strings.xml
index f4c1e2d..9a740a8 100644
--- a/preference/res/values-lo/strings.xml
+++ b/preference/res/values-lo/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ເປີດ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ປິດ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"ຂັ້ນສູງ"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ເປີດ"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ປິດ"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"ຂັ້ນສູງ"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-lt/strings.xml b/preference/res/values-lt/strings.xml
index ef1bfd6..ddfd0dc 100644
--- a/preference/res/values-lt/strings.xml
+++ b/preference/res/values-lt/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"Įjungta"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"Išjungta"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Išplėstinės"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ĮJUNGTA"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"IŠJUNGTA"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Išplėstinė"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-lv/strings.xml b/preference/res/values-lv/strings.xml
index e4890b1..07c4dea 100644
--- a/preference/res/values-lv/strings.xml
+++ b/preference/res/values-lv/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"IESLĒGTS"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"IZSLĒGTS"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Papildu"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"IESLĒGTS"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"IZSLĒGTS"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Papildu iestatījumi"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-mk/strings.xml b/preference/res/values-mk/strings.xml
index f276876..fd4d5a1 100644
--- a/preference/res/values-mk/strings.xml
+++ b/preference/res/values-mk/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ВКЛУЧЕНО"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ИСКЛУЧЕНО"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Напредно"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ВКЛУЧЕНО"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ИСКЛУЧЕНО"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Напредни"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-ml/strings.xml b/preference/res/values-ml/strings.xml
deleted file mode 100644
index 83d1125..0000000
--- a/preference/res/values-ml/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ഓൺ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ഓഫ്"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"വിപുലമായത്"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-</resources>
diff --git a/preference/res/values-mn/strings.xml b/preference/res/values-mn/strings.xml
index 2d20950..bf54850 100644
--- a/preference/res/values-mn/strings.xml
+++ b/preference/res/values-mn/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"АСААЛТТАЙ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"УНТРААТАЙ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Нарийвчилсан"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ИДЭВХТЭЙ"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ИДЭВХГҮЙ"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Дэлгэрэнгүй"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-mr/strings.xml b/preference/res/values-mr/strings.xml
deleted file mode 100644
index 1e492dd..0000000
--- a/preference/res/values-mr/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"चालू"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"बंद"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"प्रगत"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-</resources>
diff --git a/preference/res/values-ms/strings.xml b/preference/res/values-ms/strings.xml
index 1601d8a..b753aac 100644
--- a/preference/res/values-ms/strings.xml
+++ b/preference/res/values-ms/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"HIDUP"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"MATI"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Lanjutan"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"HIDUP"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"MATI"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Terperinci"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-my/strings.xml b/preference/res/values-my/strings.xml
index 77237bc..e1a96ec 100644
--- a/preference/res/values-my/strings.xml
+++ b/preference/res/values-my/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ဖွင့်ရန်"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ပိတ်ရန်"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"အဆင့်မြင့်"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>၊ <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ဖွင့်ရန်"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ပိတ်ရန်"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"အဆင့်မြင့်"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>၊ <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-nb/strings.xml b/preference/res/values-nb/strings.xml
index d5c814b..07e7b3a 100644
--- a/preference/res/values-nb/strings.xml
+++ b/preference/res/values-nb/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"PÅ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"AV"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Avansert"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"PÅ"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"AV"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Avansert"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-ne/strings.xml b/preference/res/values-ne/strings.xml
deleted file mode 100644
index 1da1f25..0000000
--- a/preference/res/values-ne/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"सक्रिय छ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"निष्क्रिय छ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"उन्नत"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-</resources>
diff --git a/preference/res/values-nl/strings.xml b/preference/res/values-nl/strings.xml
index dc84ab8..5269cf0 100644
--- a/preference/res/values-nl/strings.xml
+++ b/preference/res/values-nl/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"AAN"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"UIT"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Geavanceerd"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"AAN"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"UIT"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Geavanceerd"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-pa/strings.xml b/preference/res/values-pa/strings.xml
deleted file mode 100644
index 29471c3..0000000
--- a/preference/res/values-pa/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ਚਾਲੂ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ਬੰਦ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"ਉੱਨਤ"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-</resources>
diff --git a/preference/res/values-pl/strings.xml b/preference/res/values-pl/strings.xml
index ef7bbf8..d5d3bc1 100644
--- a/preference/res/values-pl/strings.xml
+++ b/preference/res/values-pl/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"WŁ."</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"WYŁ."</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Zaawansowane"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"WŁ."</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"WYŁ."</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Zaawansowane"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-pt-rBR/strings.xml b/preference/res/values-pt-rBR/strings.xml
index 433e8e3..a77b7d4 100644
--- a/preference/res/values-pt-rBR/strings.xml
+++ b/preference/res/values-pt-rBR/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ATIVADO"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"DESATIVADO"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Avançado"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ATIVADO"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"DESATIVADO"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Avançado"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-pt-rPT/strings.xml b/preference/res/values-pt-rPT/strings.xml
index 4f296f6..2c02859 100644
--- a/preference/res/values-pt-rPT/strings.xml
+++ b/preference/res/values-pt-rPT/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ATIVADA"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"DESATIVADA"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Avançadas"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ATIVADO"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"DESATIVADO"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Avançadas"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-pt/strings.xml b/preference/res/values-pt/strings.xml
index 433e8e3..a77b7d4 100644
--- a/preference/res/values-pt/strings.xml
+++ b/preference/res/values-pt/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ATIVADO"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"DESATIVADO"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Avançado"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ATIVADO"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"DESATIVADO"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Avançado"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-ro/strings.xml b/preference/res/values-ro/strings.xml
index 1353a6f..296bef2 100644
--- a/preference/res/values-ro/strings.xml
+++ b/preference/res/values-ro/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ACTIVAT"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"DEZACTIVAT"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Avansat"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ACTIVAT"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"DEZACTIVAT"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Avansat"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-ru/strings.xml b/preference/res/values-ru/strings.xml
index 8449700..854a395 100644
--- a/preference/res/values-ru/strings.xml
+++ b/preference/res/values-ru/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ВКЛ."</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ВЫКЛ."</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Дополнительно"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ВКЛ."</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ВЫКЛ."</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Дополнительно"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-si/strings.xml b/preference/res/values-si/strings.xml
index 27bf118..11f85fe 100644
--- a/preference/res/values-si/strings.xml
+++ b/preference/res/values-si/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ක්‍රියාත්මකයි"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ක්‍රියාවිරහිතයි"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"උසස්"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ක්‍රියාත්මකයි"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ක්‍රියාවිරහිතයි"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"උසස්"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-sk/strings.xml b/preference/res/values-sk/strings.xml
index a087a8b..5d56e98 100644
--- a/preference/res/values-sk/strings.xml
+++ b/preference/res/values-sk/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ZAP."</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"VYP."</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Rozšírené"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"ZAP."</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"VYP."</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Rozšírené"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-sl/strings.xml b/preference/res/values-sl/strings.xml
index 887c1b1..c21b129 100644
--- a/preference/res/values-sl/strings.xml
+++ b/preference/res/values-sl/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"VKLOPLJENO"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"IZKLOPLJENO"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Dodatno"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"VKLOPLJENO"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"IZKLOPLJENO"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Dodatno"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-sq/strings.xml b/preference/res/values-sq/strings.xml
index f2f5b77..7ba659c 100644
--- a/preference/res/values-sq/strings.xml
+++ b/preference/res/values-sq/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"AKTIV"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"JOAKTIV"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Të përparuara"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"AKTIV"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"JOAKTIV"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Të përparuara"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-sr/strings.xml b/preference/res/values-sr/strings.xml
index 322ace5..3128648 100644
--- a/preference/res/values-sr/strings.xml
+++ b/preference/res/values-sr/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"УКЉУЧЕНО"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ИСКЉУЧЕНО"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Напредно"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"УКЉУЧЕНО"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ИСКЉУЧЕНО"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Напредно"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-sv/strings.xml b/preference/res/values-sv/strings.xml
index c689ea1..9257e88 100644
--- a/preference/res/values-sv/strings.xml
+++ b/preference/res/values-sv/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"PÅ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"AV"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Avancerat"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"PÅ"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"AV"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Avancerat"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-sw/strings.xml b/preference/res/values-sw/strings.xml
index 9010663..f3e72d5 100644
--- a/preference/res/values-sw/strings.xml
+++ b/preference/res/values-sw/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"IMEWASHWA"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"IMEZIMWA"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Mipangilio ya Kina"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"IMEWASHWA"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"IMEZIMWA"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Mipangilio ya Kina"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-ta/strings.xml b/preference/res/values-ta/strings.xml
deleted file mode 100644
index 9fc536d..0000000
--- a/preference/res/values-ta/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ஆன் செய்"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ஆஃப் செய்"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"மேம்பட்டது"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-</resources>
diff --git a/preference/res/values-te/strings.xml b/preference/res/values-te/strings.xml
deleted file mode 100644
index 7277c76..0000000
--- a/preference/res/values-te/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"ఆన్"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ఆఫ్"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"అధునాతనం"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-</resources>
diff --git a/preference/res/values-th/strings.xml b/preference/res/values-th/strings.xml
index 90a5433..18e3ba4 100644
--- a/preference/res/values-th/strings.xml
+++ b/preference/res/values-th/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"เปิด"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ปิด"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"ขั้นสูง"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g> <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"เปิด"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ปิด"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"ขั้นสูง"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g> <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-tl/strings.xml b/preference/res/values-tl/strings.xml
index 5b6885b..1d9a85d 100644
--- a/preference/res/values-tl/strings.xml
+++ b/preference/res/values-tl/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"NAKA-ON"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"NAKA-OFF"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Advanced"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"NAKA-ON"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"NAKA-OFF"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Advanced"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-tr/strings.xml b/preference/res/values-tr/strings.xml
index fa66179..8363a5b 100644
--- a/preference/res/values-tr/strings.xml
+++ b/preference/res/values-tr/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"AÇIK"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"KAPALI"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Gelişmiş"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"AÇIK"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"KAPALI"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Gelişmiş"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-uk/strings.xml b/preference/res/values-uk/strings.xml
index 47280c3..b8c60e0 100644
--- a/preference/res/values-uk/strings.xml
+++ b/preference/res/values-uk/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"УВІМКНЕНО"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"ВИМКНЕНО"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Додатково"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"УВІМКНЕНО"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"ВИМКНЕНО"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Додатково"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-ur/strings.xml b/preference/res/values-ur/strings.xml
deleted file mode 100644
index c304b12..0000000
--- a/preference/res/values-ur/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"آن"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"آف"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"جدید ترین"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>، <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
-</resources>
diff --git a/preference/res/values-uz/strings.xml b/preference/res/values-uz/strings.xml
index 6730b74..cdf990b 100644
--- a/preference/res/values-uz/strings.xml
+++ b/preference/res/values-uz/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"YONIQ"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"O‘CHIQ"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Ekspert"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"YONIQ"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"O‘CHIQ"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Kengaytirilgan"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-vi/strings.xml b/preference/res/values-vi/strings.xml
index d8ea12b..3cdbad3 100644
--- a/preference/res/values-vi/strings.xml
+++ b/preference/res/values-vi/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"BẬT"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"TẮT"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Nâng cao"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"BẬT"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"TẮT"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Nâng cao"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-zh-rCN/strings.xml b/preference/res/values-zh-rCN/strings.xml
index 3f91ed6..ffb20a7 100644
--- a/preference/res/values-zh-rCN/strings.xml
+++ b/preference/res/values-zh-rCN/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"开启"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"关闭"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"高级"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"当前显示了 <xliff:g id="CURRENT_ITEMS">%1$s</xliff:g> 项(已添加 <xliff:g id="ADDED_ITEMS">%2$s</xliff:g> 项)"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"开启"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"关闭"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"高级"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"当前显示了 <xliff:g id="CURRENT_ITEMS">%1$s</xliff:g> 项(已添加 <xliff:g id="ADDED_ITEMS">%2$s</xliff:g> 项)"</string>
 </resources>
diff --git a/preference/res/values-zh-rHK/strings.xml b/preference/res/values-zh-rHK/strings.xml
index fe64c50..ac8a0ed 100644
--- a/preference/res/values-zh-rHK/strings.xml
+++ b/preference/res/values-zh-rHK/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"開啟"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"關閉"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"進階"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>,<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"開啟"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"關閉"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"進階"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>,<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-zh-rTW/strings.xml b/preference/res/values-zh-rTW/strings.xml
index fe64c50..ac8a0ed 100644
--- a/preference/res/values-zh-rTW/strings.xml
+++ b/preference/res/values-zh-rTW/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"開啟"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"關閉"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"進階"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>,<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"開啟"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"關閉"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"進階"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>,<xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/preference/res/values-zu/strings.xml b/preference/res/values-zu/strings.xml
index dab4cba..85b99bb 100644
--- a/preference/res/values-zu/strings.xml
+++ b/preference/res/values-zu/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="7922757586228621900">"VULA"</string>
-    <string name="v7_preference_off" msgid="2082379519172883894">"VALA"</string>
-    <string name="expand_button_title" msgid="3265458434114353660">"Okuthuthukisiwe"</string>
-    <string name="summary_collapsed_preference_list" msgid="5255557321652385027">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
+    <string name="v7_preference_on" msgid="27351710992731591">"VULA"</string>
+    <string name="v7_preference_off" msgid="5138405918326871307">"VALA"</string>
+    <string name="expand_button_title" msgid="1234962710353108940">"Okuthuthukisiwe"</string>
+    <string name="summary_collapsed_preference_list" msgid="5190123168583152844">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
 </resources>
diff --git a/room/common/src/main/java/androidx/room/ForeignKey.java b/room/common/src/main/java/androidx/room/ForeignKey.java
index 847941a..54b9252 100644
--- a/room/common/src/main/java/androidx/room/ForeignKey.java
+++ b/room/common/src/main/java/androidx/room/ForeignKey.java
@@ -13,11 +13,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package androidx.room;
 
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
 import androidx.annotation.IntDef;
 
+import java.lang.annotation.Retention;
+
 /**
  * Declares a foreign key on another {@link Entity}.
  * <p>
@@ -161,6 +164,7 @@
      * {@link #onUpdate()}.
      */
     @IntDef({NO_ACTION, RESTRICT, SET_NULL, SET_DEFAULT, CASCADE})
+    @Retention(SOURCE)
     @interface Action {
     }
 }
diff --git a/samples/SupportSliceDemos/src/main/AndroidManifest.xml b/samples/SupportSliceDemos/src/main/AndroidManifest.xml
index 4d43211..355a77a 100644
--- a/samples/SupportSliceDemos/src/main/AndroidManifest.xml
+++ b/samples/SupportSliceDemos/src/main/AndroidManifest.xml
@@ -48,7 +48,6 @@
 
         <provider android:authorities="com.example.androidx.slice.demos"
                   android:name=".SampleSliceProvider"
-                  android:exported="true"
                   android:grantUriPermissions="true">
             <intent-filter>
                 <action android:name="androidx.intent.SLICE_ACTION"/>
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
index 0a855a5..4facfb3 100644
--- 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
@@ -22,6 +22,7 @@
 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;
@@ -129,6 +130,7 @@
             mSearchView.setQuery(savedInstanceState.getString("SELECTED_QUERY"), true);
         }
 
+        grantPackage(getPackageName());
         // TODO: Listen for changes.
         updateAvailableSlices();
         if (TEST_INTENT) {
@@ -144,6 +146,7 @@
         mTypeMenu.add("Shortcut");
         mTypeMenu.add("Small");
         mTypeMenu.add("Large");
+        menu.add("Auth");
         super.onCreateOptionsMenu(menu);
         return true;
     }
@@ -151,6 +154,9 @@
     @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;
@@ -177,6 +183,21 @@
         outState.putString("SELECTED_QUERY", mSearchView.getQuery().toString());
     }
 
+    private void authAllSlices() {
+        List<ApplicationInfo> packages = getPackageManager().getInstalledApplications(0);
+        for (ApplicationInfo info : packages) {
+            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()
diff --git a/settings.gradle b/settings.gradle
index 8a3a7fe..d969d88 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -40,9 +40,11 @@
 includeProject(":car", "car")
 includeProject(":cardview", "cardview")
 includeProject(":collection", "collection")
+includeProject(":collection-ktx", "collection/ktx")
 includeProject(":contentpaging", "content")
 includeProject(":coordinatorlayout", "coordinatorlayout")
 includeProject(":core", "compat")
+includeProject(":core-ktx", "core/ktx")
 includeProject(":cursoradapter", "cursoradapter")
 includeProject(":customview", "customview")
 includeProject(":documentfile", "documentfile")
@@ -69,6 +71,7 @@
 includeProject(":media-widget", "media-widget")
 includeProject(":mediarouter", "mediarouter")
 includeProject(":palette", "palette")
+includeProject(":palette-ktx", "palette/ktx")
 includeProject(":percentlayout", "percent")
 includeProject(":preference", "preference")
 includeProject(":print", "print")
@@ -79,6 +82,7 @@
 includeProject(":slice-view", "slices/view")
 includeProject(":slice-builders", "slices/builders")
 includeProject(":slidingpanelayout", "slidingpanelayout")
+includeProject(":fragment-ktx", "fragment/ktx")
 includeProject(":swiperefreshlayout", "swiperefreshlayout")
 includeProject(":textclassifier", "textclassifier")
 includeProject(":transition", "transition")
@@ -138,6 +142,7 @@
 /////////////////////////////
 
 includeProject(":internal-testutils", "testutils")
+includeProject(":internal-testutils-ktx", "testutils-ktx")
 
 /////////////////////////////
 //
diff --git a/slices/core/api/current.txt b/slices/core/api/current.txt
index bbaa3a8..09a69fd 100644
--- a/slices/core/api/current.txt
+++ b/slices/core/api/current.txt
@@ -17,21 +17,33 @@
     method public java.util.List<java.lang.String> getHints();
     method public androidx.core.graphics.drawable.IconCompat getIcon();
     method public int getInt();
+    method public long getLong();
     method public androidx.slice.Slice getSlice();
     method public java.lang.String getSubType();
     method public java.lang.CharSequence getText();
-    method public long getTimestamp();
+    method public deprecated long getTimestamp();
     method public boolean hasHint(java.lang.String);
   }
 
-  public abstract class SliceProvider extends android.content.ContentProvider {
+  public abstract class SliceProvider extends android.content.ContentProvider implements androidx.core.app.CoreComponentFactory.CompatWrapped {
     ctor public SliceProvider();
+    method public final int bulkInsert(android.net.Uri, android.content.ContentValues[]);
+    method public final android.net.Uri canonicalize(android.net.Uri);
+    method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
+    method public final java.lang.String getType(android.net.Uri);
+    method public java.lang.Object getWrapper();
+    method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
     method public abstract androidx.slice.Slice onBindSlice(android.net.Uri);
+    method public final boolean onCreate();
     method public abstract boolean onCreateSliceProvider();
     method public java.util.Collection<android.net.Uri> onGetSliceDescendants(android.net.Uri);
     method public android.net.Uri onMapIntentToUri(android.content.Intent);
     method public void onSlicePinned(android.net.Uri);
     method public void onSliceUnpinned(android.net.Uri);
+    method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+    method public final android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
+    method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
+    method public final int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
   }
 
 }
diff --git a/slices/core/src/androidTest/java/androidx/slice/SliceTestProvider.java b/slices/core/src/androidTest/java/androidx/slice/SliceTestProvider.java
index d6f1628..519e5b8 100644
--- a/slices/core/src/androidTest/java/androidx/slice/SliceTestProvider.java
+++ b/slices/core/src/androidTest/java/androidx/slice/SliceTestProvider.java
@@ -33,6 +33,7 @@
 
     @Override
     public boolean onCreateSliceProvider() {
+        getContext().getPackageName();
         return true;
     }
 
diff --git a/slices/core/src/main/java/androidx/slice/Slice.java b/slices/core/src/main/java/androidx/slice/Slice.java
index d291ad2..d18ef23 100644
--- a/slices/core/src/main/java/androidx/slice/Slice.java
+++ b/slices/core/src/main/java/androidx/slice/Slice.java
@@ -31,6 +31,7 @@
 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_LONG;
 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;
@@ -58,6 +59,7 @@
 import androidx.annotation.StringDef;
 import androidx.core.graphics.drawable.IconCompat;
 import androidx.core.os.BuildCompat;
+import androidx.core.util.Consumer;
 import androidx.slice.compat.SliceProviderCompat;
 
 import java.util.ArrayList;
@@ -285,6 +287,19 @@
         }
 
         /**
+         * Add an action to the slice being constructed
+         * @param subType Optional template-specific type information
+         * @see {@link SliceItem#getSubType()}
+         */
+        public Slice.Builder addAction(@NonNull Consumer<Uri> 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()}
@@ -377,6 +392,19 @@
          * @param subType Optional template-specific type information
          * @see {@link SliceItem#getSubType()}
          */
+        public Slice.Builder addLong(long time, @Nullable String subType,
+                @SliceHint String... hints) {
+            mItems.add(new SliceItem(time, FORMAT_LONG, subType, hints));
+            return this;
+        }
+
+        /**
+         * Add a timestamp to the slice being constructed
+         * @param subType Optional template-specific type information
+         * @see {@link SliceItem#getSubType()}
+         * @deprecated TO BE REMOVED
+         */
+        @Deprecated
         public Slice.Builder addTimestamp(long time, @Nullable String subType,
                 @SliceHint String... hints) {
             mItems.add(new SliceItem(time, FORMAT_TIMESTAMP, subType, hints));
diff --git a/slices/core/src/main/java/androidx/slice/SliceItem.java b/slices/core/src/main/java/androidx/slice/SliceItem.java
index a5741f0..004e51d 100644
--- a/slices/core/src/main/java/androidx/slice/SliceItem.java
+++ b/slices/core/src/main/java/androidx/slice/SliceItem.java
@@ -19,6 +19,7 @@
 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_LONG;
 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;
@@ -26,6 +27,9 @@
 
 import android.app.PendingIntent;
 import android.app.RemoteInput;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.Parcelable;
 import android.text.TextUtils;
@@ -36,6 +40,7 @@
 import androidx.annotation.RestrictTo.Scope;
 import androidx.annotation.StringDef;
 import androidx.core.graphics.drawable.IconCompat;
+import androidx.core.util.Consumer;
 import androidx.core.util.Pair;
 
 import java.util.Arrays;
@@ -71,7 +76,7 @@
      */
     @RestrictTo(Scope.LIBRARY)
     @StringDef({FORMAT_SLICE, FORMAT_TEXT, FORMAT_IMAGE, FORMAT_ACTION, FORMAT_INT,
-            FORMAT_TIMESTAMP, FORMAT_REMOTE_INPUT})
+            FORMAT_TIMESTAMP, FORMAT_REMOTE_INPUT, FORMAT_LONG})
     public @interface SliceType {
     }
 
@@ -111,7 +116,16 @@
     @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);
+        this(new Pair<Object, Slice>(intent, slice), format, subType, hints);
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    public SliceItem(Consumer<Uri> action, Slice slice, String format, String subType,
+            @Slice.SliceHint String[] hints) {
+        this(new Pair<Object, Slice>(action, slice), format, subType, hints);
     }
 
     /**
@@ -188,7 +202,20 @@
      * SliceItem
      */
     public PendingIntent getAction() {
-        return ((Pair<PendingIntent, Slice>) mObj).first;
+        return (PendingIntent) ((Pair<Object, Slice>) mObj).first;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public void fireAction(Context context, Intent i) throws PendingIntent.CanceledException {
+        Object action = ((Pair<Object, Slice>) mObj).first;
+        if (action instanceof PendingIntent) {
+            ((PendingIntent) action).send(context, 0, i, null, null);
+        } else {
+            ((Consumer<Uri>) action).accept(getSlice().getUri());
+        }
     }
 
     /**
@@ -215,15 +242,23 @@
      */
     public Slice getSlice() {
         if (FORMAT_ACTION.equals(getFormat())) {
-            return ((Pair<PendingIntent, Slice>) mObj).second;
+            return ((Pair<Object, Slice>) mObj).second;
         }
         return (Slice) mObj;
     }
 
     /**
-     * @return The timestamp held by this {@link android.app.slice.SliceItem#FORMAT_TIMESTAMP}
+     * @return The long held by this {@link android.app.slice.SliceItem#FORMAT_LONG}
      * SliceItem
      */
+    public long getLong() {
+        return (Long) mObj;
+    }
+
+    /**
+     * @deprecated TO BE REMOVED
+     */
+    @Deprecated
     public long getTimestamp() {
         return (Long) mObj;
     }
@@ -301,8 +336,8 @@
                 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());
+                dest.putParcelable(OBJ, (PendingIntent) ((Pair<Object, Slice>) obj).first);
+                dest.putBundle(OBJ_2, ((Pair<Object, Slice>) obj).second.toBundle());
                 break;
             case FORMAT_TEXT:
                 dest.putCharSequence(OBJ, (CharSequence) obj);
@@ -328,7 +363,7 @@
                 return in.getCharSequence(OBJ);
             case FORMAT_ACTION:
                 return new Pair<>(
-                        (PendingIntent) in.getParcelable(OBJ),
+                        in.getParcelable(OBJ),
                         new Slice(in.getBundle(OBJ_2)));
             case FORMAT_INT:
                 return in.getInt(OBJ);
diff --git a/slices/core/src/main/java/androidx/slice/SliceProvider.java b/slices/core/src/main/java/androidx/slice/SliceProvider.java
index 8dc3b99..7ec9232 100644
--- a/slices/core/src/main/java/androidx/slice/SliceProvider.java
+++ b/slices/core/src/main/java/androidx/slice/SliceProvider.java
@@ -15,22 +15,59 @@
  */
 package androidx.slice;
 
+import static android.app.slice.Slice.HINT_SHORTCUT;
+import static android.app.slice.Slice.HINT_TITLE;
+import static android.app.slice.SliceProvider.SLICE_TYPE;
+
+import static androidx.slice.compat.SliceProviderCompat.EXTRA_BIND_URI;
+import static androidx.slice.compat.SliceProviderCompat.EXTRA_INTENT;
+import static androidx.slice.compat.SliceProviderCompat.EXTRA_PKG;
+import static androidx.slice.compat.SliceProviderCompat.EXTRA_PROVIDER_PKG;
+import static androidx.slice.compat.SliceProviderCompat.EXTRA_SLICE;
+import static androidx.slice.compat.SliceProviderCompat.EXTRA_SLICE_DESCENDANTS;
+import static androidx.slice.compat.SliceProviderCompat.METHOD_GET_DESCENDANTS;
+import static androidx.slice.compat.SliceProviderCompat.METHOD_GET_PINNED_SPECS;
+import static androidx.slice.compat.SliceProviderCompat.METHOD_MAP_INTENT;
+import static androidx.slice.compat.SliceProviderCompat.METHOD_MAP_ONLY_INTENT;
+import static androidx.slice.compat.SliceProviderCompat.METHOD_PIN;
+import static androidx.slice.compat.SliceProviderCompat.METHOD_SLICE;
+import static androidx.slice.compat.SliceProviderCompat.METHOD_UNPIN;
+import static androidx.slice.compat.SliceProviderCompat.addSpecs;
+import static androidx.slice.compat.SliceProviderCompat.getSpecs;
+import static androidx.slice.core.SliceHints.HINT_PERMISSION_REQUEST;
+
+import android.app.PendingIntent;
+import android.content.ComponentName;
 import android.content.ContentProvider;
 import android.content.ContentResolver;
+import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.pm.ProviderInfo;
+import android.content.pm.PackageManager;
 import android.database.ContentObserver;
+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.Process;
+import android.os.StrictMode;
+import android.util.Log;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
+import androidx.core.app.CoreComponentFactory;
 import androidx.core.os.BuildCompat;
-import androidx.slice.compat.ContentProviderWrapper;
-import androidx.slice.compat.SliceProviderCompat;
+import androidx.slice.compat.CompatPinnedList;
 import androidx.slice.compat.SliceProviderWrapperContainer;
+import androidx.slice.core.R;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Set;
@@ -74,20 +111,21 @@
  *
  * @see android.app.slice.Slice
  */
-public abstract class SliceProvider extends ContentProviderWrapper {
+public abstract class SliceProvider extends ContentProvider implements
+        CoreComponentFactory.CompatWrapped {
 
     private static Set<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);
-    }
+    private static final String TAG = "SliceProvider";
+
+    private static final String DATA_PREFIX = "slice_data_";
+    private static final long SLICE_BIND_ANR = 2000;
+
+    private static final boolean DEBUG = false;
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
+    private CompatPinnedList mPinnedList;
+
+    private String mCallback;
 
     /**
      * Implement this to initialize your slice provider on startup.
@@ -106,6 +144,228 @@
      */
     public abstract boolean onCreateSliceProvider();
 
+    @Override
+    public Object getWrapper() {
+        if (BuildCompat.isAtLeastP()) {
+            return new SliceProviderWrapperContainer.SliceProviderWrapper(this);
+        }
+        return null;
+    }
+
+    @Override
+    public final boolean onCreate() {
+        mPinnedList = new CompatPinnedList(getContext(),
+                DATA_PREFIX + getClass().getName());
+        return onCreateSliceProvider();
+    }
+
+    @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, Binder.getCallingPid(),
+                        Binder.getCallingUid(),
+                        Intent.FLAG_GRANT_WRITE_URI_PERMISSION,
+                        "Slice binding requires write access to the uri");
+            }
+            Set<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)) {
+            Intent intent = extras.getParcelable(EXTRA_INTENT);
+            Uri uri = onMapIntentToUri(intent);
+            Bundle b = new Bundle();
+            if (uri != null) {
+                Set<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_MAP_ONLY_INTENT)) {
+            Intent intent = extras.getParcelable(EXTRA_INTENT);
+            Uri uri = onMapIntentToUri(intent);
+            Bundle b = new Bundle();
+            b.putParcelable(EXTRA_SLICE, uri);
+            return b;
+        } else if (method.equals(METHOD_PIN)) {
+            Uri uri = extras.getParcelable(EXTRA_BIND_URI);
+            Set<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;
+        } else if (method.equals(METHOD_GET_DESCENDANTS)) {
+            Uri uri = extras.getParcelable(EXTRA_BIND_URI);
+            Bundle b = new Bundle();
+            b.putParcelableArrayList(EXTRA_SLICE_DESCENDANTS,
+                    new ArrayList<>(handleGetDescendants(uri)));
+            return b;
+        }
+        return super.call(method, arg, extras);
+    }
+
+    private Collection<Uri> handleGetDescendants(Uri uri) {
+        mCallback = "onGetSliceDescendants";
+        mHandler.postDelayed(mAnr, SLICE_BIND_ANR);
+        try {
+            return onGetSliceDescendants(uri);
+        } finally {
+            mHandler.removeCallbacks(mAnr);
+        }
+    }
+
+    private void handleSlicePinned(final Uri sliceUri) {
+        mCallback = "onSlicePinned";
+        mHandler.postDelayed(mAnr, SLICE_BIND_ANR);
+        try {
+            onSlicePinned(sliceUri);
+        } finally {
+            mHandler.removeCallbacks(mAnr);
+        }
+    }
+
+    private void handleSliceUnpinned(final Uri sliceUri) {
+        mCallback = "onSliceUnpinned";
+        mHandler.postDelayed(mAnr, SLICE_BIND_ANR);
+        try {
+            onSliceUnpinned(sliceUri);
+        } finally {
+            mHandler.removeCallbacks(mAnr);
+        }
+    }
+
+    private Slice handleBindSlice(final Uri sliceUri, final Set<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);
+            }
+        }
+        return onBindSliceStrict(sliceUri, specs);
+    }
+
+    /**
+     * Generate a slice that contains a permission request.
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public static Slice createPermissionSlice(Context context, Uri sliceUri,
+            String callingPackage) {
+        Slice.Builder parent = new Slice.Builder(sliceUri);
+
+        Slice.Builder action = new Slice.Builder(parent)
+                .addHints(HINT_TITLE, HINT_SHORTCUT)
+                .addAction(createPermissionIntent(context, sliceUri, callingPackage),
+                        new Slice.Builder(parent).build(), null);
+
+        parent.addSubSlice(new Slice.Builder(sliceUri.buildUpon().appendPath("permission").build())
+                .addText(getPermissionString(context, callingPackage), null)
+                .addSubSlice(action.build())
+                .build());
+
+        return parent.addHints(HINT_PERMISSION_REQUEST).build();
+    }
+
+    /**
+     * Create a PendingIntent pointing at the permission dialog.
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public static PendingIntent createPermissionIntent(Context context, Uri sliceUri,
+            String callingPackage) {
+        Intent intent = new Intent();
+        intent.setComponent(new ComponentName(context.getPackageName(),
+                "androidx.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.
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    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, Set<SliceSpec> specs) {
+        StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
+        mCallback = "onBindSlice";
+        mHandler.postDelayed(mAnr, SLICE_BIND_ANR);
+        try {
+            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
+                    .detectAll()
+                    .penaltyDeath()
+                    .build());
+            SliceProvider.setSpecs(specs);
+            try {
+                return onBindSlice(sliceUri);
+            } finally {
+                SliceProvider.setSpecs(null);
+                mHandler.removeCallbacks(mAnr);
+            }
+        } finally {
+            StrictMode.setThreadPolicy(oldPolicy);
+        }
+    }
+
+    private final Runnable mAnr = new Runnable() {
+        @Override
+        public void run() {
+            Process.sendSignal(Process.myPid(), Process.SIGNAL_QUIT);
+            Log.wtf(TAG, "Timed out while handling slice callback " + mCallback);
+        }
+    };
+
     /**
      * Implemented to create a slice.
      * <p>
@@ -181,6 +441,61 @@
         return Collections.emptyList();
     }
 
+    @Nullable
+    @Override
+    public final Cursor query(@NonNull Uri uri, @Nullable String[] projection,
+            @Nullable String selection, @Nullable String[] selectionArgs,
+            @Nullable String sortOrder) {
+        return null;
+    }
+
+    @Nullable
+    @Override
+    @RequiresApi(28)
+    public final Cursor query(@NonNull Uri uri, @Nullable String[] projection,
+            @Nullable Bundle queryArgs, @Nullable CancellationSignal cancellationSignal) {
+        return null;
+    }
+
+    @Nullable
+    @Override
+    @RequiresApi(16)
+    public final Cursor query(@NonNull Uri uri, @Nullable String[] projection,
+            @Nullable String selection, @Nullable String[] selectionArgs,
+            @Nullable String sortOrder, @Nullable CancellationSignal cancellationSignal) {
+        return null;
+    }
+
+    @Nullable
+    @Override
+    public final Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
+        return null;
+    }
+
+    @Override
+    public final int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) {
+        return 0;
+    }
+
+    @Override
+    public final int delete(@NonNull Uri uri, @Nullable String selection,
+            @Nullable String[] selectionArgs) {
+        return 0;
+    }
+
+    @Override
+    public final int update(@NonNull Uri uri, @Nullable ContentValues values,
+            @Nullable String selection, @Nullable String[] selectionArgs) {
+        return 0;
+    }
+
+    @Nullable
+    @Override
+    @RequiresApi(19)
+    public final Uri canonicalize(@NonNull Uri url) {
+        return null;
+    }
+
     /**
      * @hide
      */
diff --git a/slices/core/src/main/java/androidx/slice/compat/ContentProviderWrapper.java b/slices/core/src/main/java/androidx/slice/compat/ContentProviderWrapper.java
deleted file mode 100644
index 45c6ffc..0000000
--- a/slices/core/src/main/java/androidx/slice/compat/ContentProviderWrapper.java
+++ /dev/null
@@ -1,123 +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 androidx.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 androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.annotation.RestrictTo;
-import androidx.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
-    @RequiresApi(16)
-    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
-    @RequiresApi(19)
-    public final Uri canonicalize(@NonNull Uri url) {
-        return mImpl.canonicalize(url);
-    }
-}
diff --git a/slices/core/src/main/java/androidx/slice/compat/SliceProviderCompat.java b/slices/core/src/main/java/androidx/slice/compat/SliceProviderCompat.java
index 57f070d..61bc65e 100644
--- a/slices/core/src/main/java/androidx/slice/compat/SliceProviderCompat.java
+++ b/slices/core/src/main/java/androidx/slice/compat/SliceProviderCompat.java
@@ -15,35 +15,19 @@
  */
 package androidx.slice.compat;
 
-import static android.app.slice.Slice.HINT_SHORTCUT;
-import static android.app.slice.Slice.HINT_TITLE;
 import static android.app.slice.SliceProvider.SLICE_TYPE;
 
-import static androidx.slice.core.SliceHints.HINT_PERMISSION_REQUEST;
-
-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.Build;
 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.util.Log;
 
 import androidx.annotation.NonNull;
@@ -52,9 +36,7 @@
 import androidx.collection.ArraySet;
 import androidx.core.util.Preconditions;
 import androidx.slice.Slice;
-import androidx.slice.SliceProvider;
 import androidx.slice.SliceSpec;
-import androidx.slice.core.R;
 import androidx.slice.core.SliceHints;
 
 import java.util.ArrayList;
@@ -67,9 +49,8 @@
  * @hide
  */
 @RestrictTo(Scope.LIBRARY)
-public class SliceProviderCompat extends ContentProvider {
-
-    private static final String TAG = "SliceProvider";
+public class SliceProviderCompat {
+    private static final String TAG = "SliceProviderCompat";
 
     public static final String EXTRA_BIND_URI = "slice_uri";
     public static final String METHOD_SLICE = "bind_slice";
@@ -87,254 +68,6 @@
     public static final String EXTRA_PKG = "pkg";
     public static final String EXTRA_PROVIDER_PKG = "provider_pkg";
     public static final String EXTRA_SLICE_DESCENDANTS = "slice_descendants";
-    private static final String DATA_PREFIX = "slice_data_";
-
-    private static final long SLICE_BIND_ANR = 2000;
-
-    private static final boolean DEBUG = false;
-    private final Handler mHandler = new Handler(Looper.getMainLooper());
-    private SliceProvider mSliceProvider;
-    private CompatPinnedList mPinnedList;
-
-    private String mCallback;
-
-    public SliceProviderCompat(SliceProvider provider) {
-        mSliceProvider = provider;
-    }
-
-    @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);
-            Set<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)) {
-            Intent intent = extras.getParcelable(EXTRA_INTENT);
-            Uri uri = mSliceProvider.onMapIntentToUri(intent);
-            Bundle b = new Bundle();
-            if (uri != null) {
-                Set<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_MAP_ONLY_INTENT)) {
-            Intent intent = extras.getParcelable(EXTRA_INTENT);
-            Uri uri = mSliceProvider.onMapIntentToUri(intent);
-            Bundle b = new Bundle();
-            b.putParcelable(EXTRA_SLICE, uri);
-            return b;
-        } else if (method.equals(METHOD_PIN)) {
-            Uri uri = extras.getParcelable(EXTRA_BIND_URI);
-            Set<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;
-        } else if (method.equals(METHOD_GET_DESCENDANTS)) {
-            Uri uri = extras.getParcelable(EXTRA_BIND_URI);
-            Bundle b = new Bundle();
-            b.putParcelableArrayList(EXTRA_SLICE_DESCENDANTS,
-                    new ArrayList<>(handleGetDescendants(uri)));
-            return b;
-        }
-        return super.call(method, arg, extras);
-    }
-
-    private Collection<Uri> handleGetDescendants(Uri uri) {
-        mCallback = "onGetSliceDescendants";
-        mHandler.postDelayed(mAnr, SLICE_BIND_ANR);
-        try {
-            return mSliceProvider.onGetSliceDescendants(uri);
-        } finally {
-            mHandler.removeCallbacks(mAnr);
-        }
-    }
-
-    private void handleSlicePinned(final Uri sliceUri) {
-        mCallback = "onSlicePinned";
-        mHandler.postDelayed(mAnr, SLICE_BIND_ANR);
-        try {
-            mSliceProvider.onSlicePinned(sliceUri);
-        } finally {
-            mHandler.removeCallbacks(mAnr);
-        }
-    }
-
-    private void handleSliceUnpinned(final Uri sliceUri) {
-        mCallback = "onSliceUnpinned";
-        mHandler.postDelayed(mAnr, SLICE_BIND_ANR);
-        try {
-            mSliceProvider.onSliceUnpinned(sliceUri);
-        } finally {
-            mHandler.removeCallbacks(mAnr);
-        }
-    }
-
-    private Slice handleBindSlice(final Uri sliceUri, final Set<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);
-            }
-        }
-        return onBindSliceStrict(sliceUri, specs);
-    }
-
-    /**
-     * Generate a slice that contains a permission request.
-     */
-    public static Slice createPermissionSlice(Context context, Uri sliceUri,
-            String callingPackage) {
-        Slice.Builder parent = new Slice.Builder(sliceUri);
-
-        Slice.Builder action = new Slice.Builder(parent)
-                .addHints(HINT_TITLE, HINT_SHORTCUT)
-                .addAction(createPermissionIntent(context, sliceUri, callingPackage),
-                        new Slice.Builder(parent).build(), null);
-
-        parent.addSubSlice(new Slice.Builder(sliceUri.buildUpon().appendPath("permission").build())
-                .addText(getPermissionString(context, callingPackage), null)
-                .addSubSlice(action.build())
-                .build());
-
-        return parent.addHints(HINT_PERMISSION_REQUEST).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.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, Set<SliceSpec> specs) {
-        ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
-        mCallback = "onBindSlice";
-        mHandler.postDelayed(mAnr, SLICE_BIND_ANR);
-        try {
-            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
-                    .detectAll()
-                    .penaltyDeath()
-                    .build());
-            SliceProvider.setSpecs(specs);
-            try {
-                return mSliceProvider.onBindSlice(sliceUri);
-            } finally {
-                SliceProvider.setSpecs(null);
-                mHandler.removeCallbacks(mAnr);
-            }
-        } finally {
-            StrictMode.setThreadPolicy(oldPolicy);
-        }
-    }
 
     /**
      * Compat version of {@link Slice#bindSlice}.
@@ -372,7 +105,10 @@
         }
     }
 
-    private static void addSpecs(Bundle extras, Set<SliceSpec> supportedSpecs) {
+    /**
+     * Compat way to push specs through the call.
+     */
+    public static void addSpecs(Bundle extras, Set<SliceSpec> supportedSpecs) {
         ArrayList<String> types = new ArrayList<>();
         ArrayList<Integer> revs = new ArrayList<>();
         for (SliceSpec spec : supportedSpecs) {
@@ -383,7 +119,10 @@
         extras.putIntegerArrayList(EXTRA_SUPPORTED_SPECS_REVS, revs);
     }
 
-    private static Set<SliceSpec> getSpecs(Bundle extras) {
+    /**
+     * Compat way to push specs through the call.
+     */
+    public static Set<SliceSpec> getSpecs(Bundle extras) {
         ArraySet<SliceSpec> specs = new ArraySet<>();
         ArrayList<String> types = extras.getStringArrayList(EXTRA_SUPPORTED_SPECS);
         ArrayList<Integer> revs = extras.getIntegerArrayList(EXTRA_SUPPORTED_SPECS_REVS);
@@ -580,11 +319,6 @@
         return Collections.emptyList();
     }
 
-    private final Runnable mAnr = new Runnable() {
-        @Override
-        public void run() {
-            Process.sendSignal(Process.myPid(), Process.SIGNAL_QUIT);
-            Log.wtf(TAG, "Timed out while handling slice callback " + mCallback);
-        }
-    };
+    private SliceProviderCompat() {
+    }
 }
diff --git a/slices/core/src/main/java/androidx/slice/compat/SliceProviderWrapperContainer.java b/slices/core/src/main/java/androidx/slice/compat/SliceProviderWrapperContainer.java
index 5118cc7..8641530 100644
--- a/slices/core/src/main/java/androidx/slice/compat/SliceProviderWrapperContainer.java
+++ b/slices/core/src/main/java/androidx/slice/compat/SliceProviderWrapperContainer.java
@@ -22,7 +22,9 @@
 import android.app.slice.Slice;
 import android.app.slice.SliceProvider;
 import android.app.slice.SliceSpec;
+import android.content.Context;
 import android.content.Intent;
+import android.content.pm.ProviderInfo;
 import android.net.Uri;
 
 import androidx.annotation.NonNull;
@@ -51,8 +53,14 @@
         }
 
         @Override
+        public void attachInfo(Context context, ProviderInfo info) {
+            mSliceProvider.attachInfo(context, info);
+            super.attachInfo(context, info);
+        }
+
+        @Override
         public boolean onCreate() {
-            return mSliceProvider.onCreateSliceProvider();
+            return true;
         }
 
         @Override
diff --git a/slices/core/src/main/java/androidx/slice/core/SliceActionImpl.java b/slices/core/src/main/java/androidx/slice/core/SliceActionImpl.java
index b5ca913..4fb81a6 100644
--- a/slices/core/src/main/java/androidx/slice/core/SliceActionImpl.java
+++ b/slices/core/src/main/java/androidx/slice/core/SliceActionImpl.java
@@ -27,7 +27,6 @@
 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 androidx.annotation.RestrictTo.Scope.LIBRARY;
@@ -64,6 +63,7 @@
     private boolean mIsChecked;
     private int mPriority = -1;
     private SliceItem mSliceItem;
+    private SliceItem mActionItem;
 
     /**
      * Construct a SliceAction representing a tappable icon.
@@ -147,40 +147,36 @@
     @RestrictTo(LIBRARY)
     public SliceActionImpl(SliceItem slice) {
         mSliceItem = slice;
-        if (slice.hasHint(HINT_SHORTCUT) && FORMAT_SLICE.equals(slice.getFormat())) {
-            SliceItem actionItem = SliceQuery.find(slice, FORMAT_ACTION);
-            if (actionItem == null) {
-                // Can't have action slice without action
-                return;
-            }
-            mAction = actionItem.getAction();
-            SliceItem iconItem = SliceQuery.find(actionItem.getSlice(), FORMAT_IMAGE);
-            if (iconItem != null) {
-                mIcon = iconItem.getIcon();
-                mImageMode = iconItem.hasHint(HINT_NO_TINT)
-                        ? iconItem.hasHint(HINT_LARGE) ? LARGE_IMAGE : SMALL_IMAGE
-                        : ICON_IMAGE;
-            }
-            SliceItem titleItem = SliceQuery.find(actionItem.getSlice(), FORMAT_TEXT, HINT_TITLE,
-                    null /* nonHints */);
-            if (titleItem != null) {
-                mTitle = titleItem.getText();
-            }
-            SliceItem cdItem = SliceQuery.findSubtype(actionItem.getSlice(), FORMAT_TEXT,
-                    SUBTYPE_CONTENT_DESCRIPTION);
-            if (cdItem != null) {
-                mContentDescription = cdItem.getText();
-            }
-            mIsToggle = SUBTYPE_TOGGLE.equals(actionItem.getSubType());
-            if (mIsToggle) {
-                mIsChecked = actionItem.hasHint(HINT_SELECTED);
-            }
-            SliceItem priority = SliceQuery.findSubtype(actionItem.getSlice(), FORMAT_INT,
-                    SUBTYPE_PRIORITY);
-            mPriority = priority != null ? priority.getInt() : -1;
-        } else if (FORMAT_ACTION.equals(slice.getFormat())) {
-            mAction = slice.getAction();
+        SliceItem actionItem = SliceQuery.find(slice, FORMAT_ACTION);
+        if (actionItem == null) {
+            // Can't have action slice without action
+            return;
         }
+        mActionItem = actionItem;
+        SliceItem iconItem = SliceQuery.find(actionItem.getSlice(), FORMAT_IMAGE);
+        if (iconItem != null) {
+            mIcon = iconItem.getIcon();
+            mImageMode = iconItem.hasHint(HINT_NO_TINT)
+                    ? iconItem.hasHint(HINT_LARGE) ? LARGE_IMAGE : SMALL_IMAGE
+                    : ICON_IMAGE;
+        }
+        SliceItem titleItem = SliceQuery.find(actionItem.getSlice(), FORMAT_TEXT, HINT_TITLE,
+                null /* nonHints */);
+        if (titleItem != null) {
+            mTitle = titleItem.getText();
+        }
+        SliceItem cdItem = SliceQuery.findSubtype(actionItem.getSlice(), FORMAT_TEXT,
+                SUBTYPE_CONTENT_DESCRIPTION);
+        if (cdItem != null) {
+            mContentDescription = cdItem.getText();
+        }
+        mIsToggle = SUBTYPE_TOGGLE.equals(actionItem.getSubType());
+        if (mIsToggle) {
+            mIsChecked = actionItem.hasHint(HINT_SELECTED);
+        }
+        SliceItem priority = SliceQuery.findSubtype(actionItem.getSlice(), FORMAT_INT,
+                SUBTYPE_PRIORITY);
+        mPriority = priority != null ? priority.getInt() : -1;
     }
 
     /**
@@ -218,7 +214,15 @@
     @NonNull
     @Override
     public PendingIntent getAction() {
-        return mAction;
+        return mAction != null ? mAction : mActionItem.getAction();
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY_GROUP)
+    public SliceItem getActionItem() {
+        return mActionItem;
     }
 
     /**
diff --git a/slices/core/src/main/java/androidx/slice/core/SliceHints.java b/slices/core/src/main/java/androidx/slice/core/SliceHints.java
index 588ff61..c29ad56 100644
--- a/slices/core/src/main/java/androidx/slice/core/SliceHints.java
+++ b/slices/core/src/main/java/androidx/slice/core/SliceHints.java
@@ -18,9 +18,13 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
 import androidx.annotation.IntDef;
 import androidx.annotation.RestrictTo;
 
+import java.lang.annotation.Retention;
+
 /**
  * Temporary class to contain hint constants for slices to be used.
  * @hide
@@ -69,6 +73,7 @@
     @IntDef({
             LARGE_IMAGE, SMALL_IMAGE, ICON_IMAGE, UNKNOWN_IMAGE
     })
+    @Retention(SOURCE)
     public @interface ImageMode{}
 
     /**
diff --git a/slices/core/src/main/res/values-as/strings.xml b/slices/core/src/main/res/values-as/strings.xml
new file mode 100644
index 0000000..95722b9
--- /dev/null
+++ b/slices/core/src/main/res/values-as/strings.xml
@@ -0,0 +1,27 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="abc_slices_permission_request" msgid="3604847235923472451">"<xliff:g id="APP_0">%1$s</xliff:g>এ <xliff:g id="APP_2">%2$s</xliff:g>ৰ অংশ দেখুওৱাব খুজিছে"</string>
+    <string name="abc_slice_permission_title" msgid="4175332421259324948">"<xliff:g id="APP_0">%1$s</xliff:g>ক <xliff:g id="APP_2">%2$s</xliff:g>ৰ অংশ দেখুওৱাবলৈ অনুমতি দিবনে?"</string>
+    <string name="abc_slice_permission_text_1" msgid="4525743640399572811">"- ই <xliff:g id="APP">%1$s</xliff:g>ৰ তথ্য পঢ়িব পাৰে"</string>
+    <string name="abc_slice_permission_text_2" msgid="7323565634860251794">"- ই <xliff:g id="APP">%1$s</xliff:g>ৰ ভিতৰত কাৰ্য কৰিব পাৰে"</string>
+    <string name="abc_slice_permission_checkbox" msgid="5696872682700058611">"<xliff:g id="APP">%1$s</xliff:g>ক যিকোনো এপৰ অংশ দেখুওৱাবলৈ অনুমতি দিয়ক"</string>
+    <string name="abc_slice_permission_allow" msgid="5024599872061409708">"অনুমতি দিয়ক"</string>
+    <string name="abc_slice_permission_deny" msgid="3819478292430407705">"অস্বীকাৰ কৰক"</string>
+</resources>
diff --git a/slices/core/src/main/res/values-be/strings.xml b/slices/core/src/main/res/values-be/strings.xml
index c9fc9a8..5fadc3f 100644
--- a/slices/core/src/main/res/values-be/strings.xml
+++ b/slices/core/src/main/res/values-be/strings.xml
@@ -17,11 +17,11 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="abc_slices_permission_request" msgid="3604847235923472451">"Праграма <xliff:g id="APP_0">%1$s</xliff:g> запытвае дазвол на паказ зрэзаў праграмы <xliff:g id="APP_2">%2$s</xliff:g>"</string>
-    <string name="abc_slice_permission_title" msgid="4175332421259324948">"Дазволіць праграме <xliff:g id="APP_0">%1$s</xliff:g> паказваць зрэзы праграмы <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
+    <string name="abc_slices_permission_request" msgid="3604847235923472451">"Праграма <xliff:g id="APP_0">%1$s</xliff:g> запытвае дазвол на паказ фрагментаў праграмы <xliff:g id="APP_2">%2$s</xliff:g>"</string>
+    <string name="abc_slice_permission_title" msgid="4175332421259324948">"Дазволіць праграме <xliff:g id="APP_0">%1$s</xliff:g> паказваць фрагменты праграмы <xliff:g id="APP_2">%2$s</xliff:g>?"</string>
     <string name="abc_slice_permission_text_1" msgid="4525743640399572811">"- Можа счытваць інфармацыю з праграмы <xliff:g id="APP">%1$s</xliff:g>"</string>
     <string name="abc_slice_permission_text_2" msgid="7323565634860251794">"- Можа выконваць дзеянні ў праграме <xliff:g id="APP">%1$s</xliff:g>"</string>
-    <string name="abc_slice_permission_checkbox" msgid="5696872682700058611">"Дазволіць праграме <xliff:g id="APP">%1$s</xliff:g> паказваць зрэзы іншых праграм"</string>
+    <string name="abc_slice_permission_checkbox" msgid="5696872682700058611">"Дазволіць праграме <xliff:g id="APP">%1$s</xliff:g> паказваць фрагменты іншых праграм"</string>
     <string name="abc_slice_permission_allow" msgid="5024599872061409708">"Дазволіць"</string>
     <string name="abc_slice_permission_deny" msgid="3819478292430407705">"Адмовіць"</string>
 </resources>
diff --git a/slices/core/src/main/res/values-ja/strings.xml b/slices/core/src/main/res/values-ja/strings.xml
index a04df0b..315326f 100644
--- a/slices/core/src/main/res/values-ja/strings.xml
+++ b/slices/core/src/main/res/values-ja/strings.xml
@@ -19,7 +19,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slices_permission_request" msgid="3604847235923472451">"<xliff:g id="APP_0">%1$s</xliff:g> が <xliff:g id="APP_2">%2$s</xliff:g> のスライスの表示をリクエストしています"</string>
     <string name="abc_slice_permission_title" msgid="4175332421259324948">"<xliff:g id="APP_2">%2$s</xliff:g> のスライスの表示を <xliff:g id="APP_0">%1$s</xliff:g> に許可しますか?"</string>
-    <string name="abc_slice_permission_text_1" msgid="4525743640399572811">"- <xliff:g id="APP">%1$s</xliff:g> からの情報を読み取ることがあります"</string>
+    <string name="abc_slice_permission_text_1" msgid="4525743640399572811">"- <xliff:g id="APP">%1$s</xliff:g> からの情報を読み取ることができます"</string>
     <string name="abc_slice_permission_text_2" msgid="7323565634860251794">"- <xliff:g id="APP">%1$s</xliff:g> 内部で操作することがあります"</string>
     <string name="abc_slice_permission_checkbox" msgid="5696872682700058611">"すべてのアプリのスライスを表示することを <xliff:g id="APP">%1$s</xliff:g> に許可する"</string>
     <string name="abc_slice_permission_allow" msgid="5024599872061409708">"許可"</string>
diff --git a/slices/core/src/main/res/values-or/strings.xml b/slices/core/src/main/res/values-or/strings.xml
new file mode 100644
index 0000000..f6b9443
--- /dev/null
+++ b/slices/core/src/main/res/values-or/strings.xml
@@ -0,0 +1,27 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="abc_slices_permission_request" msgid="3604847235923472451">"<xliff:g id="APP_0">%1$s</xliff:g>, <xliff:g id="APP_2">%2$s</xliff:g> ସ୍ଲାଇସ୍‌କୁ ଦେଖାଇବା ପାଇଁ ଚାହେଁ"</string>
+    <string name="abc_slice_permission_title" msgid="4175332421259324948">"<xliff:g id="APP_2">%2$s</xliff:g> ସ୍ଲାଇସ୍‌କୁ ଦେଖାଇବା ପାଇଁ <xliff:g id="APP_0">%1$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
+    <string name="abc_slice_permission_text_1" msgid="4525743640399572811">"- ଏହା <xliff:g id="APP">%1$s</xliff:g>ରୁ ସୂଚନାକୁ ପଢ଼ିପାରିବ"</string>
+    <string name="abc_slice_permission_text_2" msgid="7323565634860251794">"- ଏହା <xliff:g id="APP">%1$s</xliff:g> ଭିତରେ କାମ କରିପାରିବ"</string>
+    <string name="abc_slice_permission_checkbox" msgid="5696872682700058611">"ଯେକୌଣସି ଆପ୍‌ରେ ସ୍ଲାଇସ୍‌କୁ ଦେଖାଇବା ପାଇଁ <xliff:g id="APP">%1$s</xliff:g>କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="abc_slice_permission_allow" msgid="5024599872061409708">"ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="abc_slice_permission_deny" msgid="3819478292430407705">"ଅସ୍ଵୀକାର କରନ୍ତୁ"</string>
+</resources>
diff --git a/slices/view/api/current.txt b/slices/view/api/current.txt
index 04d4960..5a37826 100644
--- a/slices/view/api/current.txt
+++ b/slices/view/api/current.txt
@@ -43,8 +43,8 @@
     method public static deprecated int getLoadingState(androidx.slice.Slice);
     method public static deprecated java.util.List<androidx.slice.SliceItem> getSliceActions(androidx.slice.Slice);
     method public static deprecated java.util.List<java.lang.String> getSliceKeywords(androidx.slice.Slice);
-    method public static androidx.slice.Slice parseSlice(java.io.InputStream, java.lang.String) throws java.io.IOException;
-    method public static void serializeSlice(androidx.slice.Slice, android.content.Context, java.io.OutputStream, java.lang.String, androidx.slice.SliceUtils.SerializeOptions) throws java.io.IOException;
+    method public static androidx.slice.Slice parseSlice(android.content.Context, java.io.InputStream, java.lang.String, androidx.slice.SliceUtils.SliceActionListener) throws java.io.IOException, androidx.slice.SliceUtils.SliceParseException;
+    method public static void serializeSlice(androidx.slice.Slice, android.content.Context, java.io.OutputStream, java.lang.String, androidx.slice.SliceUtils.SerializeOptions) throws java.io.IOException, java.lang.IllegalArgumentException;
     field public static final deprecated int LOADING_ALL = 0; // 0x0
     field public static final deprecated int LOADING_COMPLETE = 2; // 0x2
     field public static final deprecated int LOADING_PARTIAL = 1; // 0x1
@@ -54,11 +54,20 @@
     ctor public SliceUtils.SerializeOptions();
     method public androidx.slice.SliceUtils.SerializeOptions setActionMode(int);
     method public androidx.slice.SliceUtils.SerializeOptions setImageMode(int);
-    field public static final int MODE_DISABLE = 2; // 0x2
+    method public androidx.slice.SliceUtils.SerializeOptions setMaxImageHeight(int);
+    method public androidx.slice.SliceUtils.SerializeOptions setMaxImageWidth(int);
+    field public static final int MODE_CONVERT = 2; // 0x2
     field public static final int MODE_REMOVE = 1; // 0x1
     field public static final int MODE_THROW = 0; // 0x0
   }
 
+  public static abstract interface SliceUtils.SliceActionListener {
+    method public abstract void onSliceAction(android.net.Uri);
+  }
+
+  public static class SliceUtils.SliceParseException extends java.lang.Exception {
+  }
+
 }
 
 package androidx.slice.widget {
diff --git a/slices/view/src/androidTest/java/androidx/slice/SliceMetadataTest.java b/slices/view/src/androidTest/java/androidx/slice/SliceMetadataTest.java
index 2662368..650114e 100644
--- a/slices/view/src/androidTest/java/androidx/slice/SliceMetadataTest.java
+++ b/slices/view/src/androidTest/java/androidx/slice/SliceMetadataTest.java
@@ -47,7 +47,6 @@
 import androidx.slice.builders.GridRowBuilder;
 import androidx.slice.builders.ListBuilder;
 import androidx.slice.builders.SliceAction;
-import androidx.slice.compat.SliceProviderCompat;
 import androidx.slice.core.SliceActionImpl;
 import androidx.slice.core.SliceHints;
 import androidx.slice.render.SliceRenderActivity;
@@ -597,7 +596,7 @@
     public void testIsPermissionSlice() {
         Uri uri = Uri.parse("content://pkg/slice");
         Slice permissionSlice =
-                SliceProviderCompat.createPermissionSlice(mContext, uri, mContext.getPackageName());
+                SliceProvider.createPermissionSlice(mContext, uri, mContext.getPackageName());
 
         SliceMetadata metadata = SliceMetadata.from(mContext, permissionSlice);
         assertEquals(true, metadata.isPermissionSlice());
diff --git a/slices/view/src/androidTest/java/androidx/slice/SliceXmlTest.java b/slices/view/src/androidTest/java/androidx/slice/SliceXmlTest.java
index 298d498..d1a647c 100644
--- a/slices/view/src/androidTest/java/androidx/slice/SliceXmlTest.java
+++ b/slices/view/src/androidTest/java/androidx/slice/SliceXmlTest.java
@@ -24,6 +24,11 @@
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertTrue;
 
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.app.PendingIntent;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -33,6 +38,8 @@
 import android.support.test.runner.AndroidJUnit4;
 
 import androidx.core.graphics.drawable.IconCompat;
+import androidx.slice.core.SliceQuery;
+import androidx.slice.view.R;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -51,7 +58,7 @@
     public void testThrowForAction() throws IOException {
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         Slice s = new Slice.Builder(Uri.parse("content://pkg/slice"))
-                .addAction(null, null, null)
+                .addAction((PendingIntent) null, null, null)
                 .build();
         SliceUtils.serializeSlice(s, mContext, outputStream, "UTF-8", new SliceUtils
                 .SerializeOptions());
@@ -81,7 +88,7 @@
     public void testNoThrowForAction() throws IOException {
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         Slice s = new Slice.Builder(Uri.parse("content://pkg/slice"))
-                .addAction(null, null, null)
+                .addAction((PendingIntent) null, null, null)
                 .build();
         SliceUtils.serializeSlice(s, mContext, outputStream, "UTF-8", new SliceUtils
                 .SerializeOptions().setActionMode(SliceUtils.SerializeOptions.MODE_REMOVE));
@@ -108,7 +115,7 @@
     }
 
     @Test
-    public void testSerialization() throws IOException {
+    public void testSerialization() throws Exception {
         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.
@@ -118,24 +125,32 @@
                         .build())
                 .addIcon(IconCompat.createWithBitmap(b), null)
                 .addText("Some text", null)
-                .addAction(null, new Slice.Builder(Uri.parse("content://pkg/slice/sub"))
+                .addAction((PendingIntent) null,
+                        new Slice.Builder(Uri.parse("content://pkg/slice/action"))
                         .addText("Action text", null)
                         .build(), null)
                 .addInt(0xff00ff00, "subtype")
+                .addIcon(IconCompat.createWithResource(mContext, R.drawable.abc_slice_see_more_bg),
+                        null)
                 .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));
+                        .setImageMode(SliceUtils.SerializeOptions.MODE_CONVERT)
+                        .setActionMode(SliceUtils.SerializeOptions.MODE_CONVERT));
 
         byte[] bytes = outputStream.toByteArray();
         ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
-        Slice after = SliceUtils.parseSlice(inputStream, "UTF-8");
+        SliceUtils.SliceActionListener listener = mock(SliceUtils.SliceActionListener.class);
+        Slice after = SliceUtils.parseSlice(mContext, inputStream, "UTF-8", listener);
 
         assertEquivalent(before, after);
+
+        SliceItem action = SliceQuery.find(after, FORMAT_ACTION);
+        action.fireAction(null, null);
+        verify(listener).onSliceAction(eq(Uri.parse("content://pkg/slice/action")));
     }
 
     private void assertEquivalent(Slice desired, Slice actual) {
diff --git a/slices/view/src/androidTest/java/androidx/slice/render/SliceCreator.java b/slices/view/src/androidTest/java/androidx/slice/render/SliceCreator.java
index f181617..2312b36 100644
--- a/slices/view/src/androidTest/java/androidx/slice/render/SliceCreator.java
+++ b/slices/view/src/androidTest/java/androidx/slice/render/SliceCreator.java
@@ -36,11 +36,11 @@
 
 import androidx.core.graphics.drawable.IconCompat;
 import androidx.slice.Slice;
+import androidx.slice.SliceProvider;
 import androidx.slice.builders.GridRowBuilder;
 import androidx.slice.builders.ListBuilder;
 import androidx.slice.builders.MessagingSliceBuilder;
 import androidx.slice.builders.SliceAction;
-import androidx.slice.compat.SliceProviderCompat;
 import androidx.slice.view.test.R;
 
 import java.util.Arrays;
@@ -513,7 +513,7 @@
     }
 
     private Slice createPermissionSlice(Uri uri) {
-        return SliceProviderCompat.createPermissionSlice(getContext(), uri,
+        return SliceProvider.createPermissionSlice(getContext(), uri,
                 getContext().getPackageName());
     }
 
diff --git a/slices/view/src/androidTest/java/androidx/slice/render/SliceRenderer.java b/slices/view/src/androidTest/java/androidx/slice/render/SliceRenderer.java
index 5625c34..0734edf 100644
--- a/slices/view/src/androidTest/java/androidx/slice/render/SliceRenderer.java
+++ b/slices/view/src/androidTest/java/androidx/slice/render/SliceRenderer.java
@@ -22,7 +22,7 @@
 import android.app.ProgressDialog;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
-import android.os.AsyncTask;
+import android.net.Uri;
 import android.os.Handler;
 import android.util.Log;
 import android.util.TypedValue;
@@ -30,24 +30,33 @@
 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.recyclerview.widget.RecyclerView;
 import androidx.slice.Slice;
 import androidx.slice.SliceProvider;
+import androidx.slice.SliceUtils;
 import androidx.slice.view.test.R;
 import androidx.slice.widget.SliceLiveData;
 import androidx.slice.widget.SliceView;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
 public class SliceRenderer {
 
     private static final String TAG = "SliceRenderer";
     public static final String SCREENSHOT_DIR = "slice-screenshots";
+
+    private static final int MAX_CONCURRENT = 5;
+
     private static File sScreenshotDirectory;
 
+    private final Object mRenderLock = new Object();
+
     private final Activity mContext;
     private final View mLayout;
     private final SliceView mSV1;
@@ -121,20 +130,46 @@
 
 
     private void doRender() {
-        File output = getScreenshotDirectory();
+        final 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)),
-                    true /* scrollable */);
+        mDoneLatch = new CountDownLatch(SliceCreator.URI_PATHS.length * 2 + 2);
+
+        ExecutorService executor = Executors.newFixedThreadPool(5);
+        for (final String slice : SliceCreator.URI_PATHS) {
+            final Slice s = mSliceCreator.onBindSlice(SliceCreator.getUri(slice, mContext));
+
+            executor.execute(new Runnable() {
+                @Override
+                public void run() {
+                    doRender(slice, s, new File(output, String.format("%s.png", slice)),
+                            true /* scrollable */);
+                }
+            });
+            final Slice serialized = serAndUnSer(s);
+            executor.execute(new Runnable() {
+                @Override
+                public void run() {
+                    doRender(slice + "-ser", serialized, new File(output, String.format(
+                            "%s-serialized.png", slice)), true /* scrollable */);
+                }
+            });
             if (slice.equals("wifi") || slice.equals("wifi2")) {
                 // Test scrolling
-                doRender(slice, new File(output, String.format("%s-no-scroll.png", slice)),
-                        false /* scrollable */);
+                executor.execute(new Runnable() {
+                    @Override
+                    public void run() {
+                        doRender(slice + "-ns", s, new File(output, String.format(
+                                "%s-no-scroll.png", slice)), false /* scrollable */);
+                    }
+                });
             }
         }
+        try {
+            mDoneLatch.await();
+        } catch (InterruptedException e) {
+        }
         Log.d(TAG, "Wrote render to " + output.getAbsolutePath());
         mContext.runOnUiThread(new Runnable() {
             @Override
@@ -142,71 +177,83 @@
                 ((ViewGroup) mParent.getParent()).removeView(mParent);
             }
         });
+    }
+
+    private Slice serAndUnSer(Slice s) {
         try {
-            mDoneLatch.await();
-        } catch (InterruptedException e) {
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+            SliceUtils.serializeSlice(s, mContext, outputStream, "UTF-8",
+                    new SliceUtils.SerializeOptions()
+                            .setImageMode(SliceUtils.SerializeOptions.MODE_CONVERT)
+                            .setActionMode(SliceUtils.SerializeOptions.MODE_CONVERT));
+
+            byte[] bytes = outputStream.toByteArray();
+            ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
+            return SliceUtils.parseSlice(mContext, inputStream, "UTF-8",
+                    new SliceUtils.SliceActionListener() {
+                        @Override
+                        public void onSliceAction(Uri actionUri) {
+                        }
+                    });
+        } catch (Exception e) {
+            throw new RuntimeException(e);
         }
     }
 
-    private void doRender(final String slice, final File file, final boolean scrollable) {
+    private void doRender(final String slice, final Slice s, final File file,
+            final boolean scrollable) {
         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);
-                mSV3.setScrollable(scrollable);
-                mSV1.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
+        try {
+            final CountDownLatch l = new CountDownLatch(1);
+            final Bitmap[] b = new Bitmap[1];
+            synchronized (mRenderLock) {
+                mContext.runOnUiThread(new Runnable() {
                     @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() {
+                    public void run() {
+                        mSV1.setSlice(s);
+                        mSV2.setSlice(s);
+                        mSV3.setSlice(s);
+                        mSV3.setScrollable(scrollable);
+                        mSV1.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
                             @Override
-                            public void run() {
-                                Log.d(TAG, "Drawing " + slice);
-                                Bitmap b = Bitmap.createBitmap(mLayout.getMeasuredWidth(),
-                                        mLayout.getMeasuredHeight(),
-                                        Bitmap.Config.ARGB_8888);
+                            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);
+                                        b[0] = 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();
+                                        mLayout.draw(new Canvas(b[0]));
+                                        l.countDown();
+                                    }
+                                }, 10);
                             }
-                        }, 10);
+                        });
                     }
                 });
+                l.await();
             }
-        });
-        try {
-            l.await();
-        } catch (InterruptedException e) {
+            doCompress(slice, b[0], new FileOutputStream(file));
+        } catch (Exception e) {
+            throw new RuntimeException(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");
-                }
+        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();
-            }
-        });
+        b.recycle();
+        mDoneLatch.countDown();
+        Log.d(TAG, "Done " + slice);
     }
 
     public void renderAll(final Runnable runnable) {
diff --git a/slices/view/src/main/java/androidx/slice/SliceManagerWrapper.java b/slices/view/src/main/java/androidx/slice/SliceManagerWrapper.java
index ac38e36..e0c0342 100644
--- a/slices/view/src/main/java/androidx/slice/SliceManagerWrapper.java
+++ b/slices/view/src/main/java/androidx/slice/SliceManagerWrapper.java
@@ -19,7 +19,6 @@
 import static androidx.slice.SliceConvert.unwrap;
 import static androidx.slice.widget.SliceLiveData.SUPPORTED_SPECS;
 
-import android.app.slice.SliceManager;
 import android.app.slice.SliceSpec;
 import android.content.Context;
 import android.content.Intent;
@@ -44,12 +43,6 @@
 
     private final android.app.slice.SliceManager mManager;
     private final List<SliceSpec> mSpecs;
-    private final SliceManager.SliceCallback mCallback = new SliceManager.SliceCallback() {
-        @Override
-        public void onSliceUpdated(@NonNull android.app.slice.Slice s) {
-
-        }
-    };
 
     SliceManagerWrapper(Context context) {
         this(context, context.getSystemService(android.app.slice.SliceManager.class));
@@ -63,12 +56,12 @@
 
     @Override
     public void pinSlice(@NonNull Uri uri) {
-        mManager.registerSliceCallback(uri, mSpecs, mCallback);
+        mManager.pinSlice(uri, mSpecs);
     }
 
     @Override
     public void unpinSlice(@NonNull Uri uri) {
-        mManager.unregisterSliceCallback(uri, mCallback);
+        mManager.unpinSlice(uri);
     }
 
     @Override
@@ -79,15 +72,13 @@
     @Nullable
     @Override
     public androidx.slice.Slice bindSlice(@NonNull Uri uri) {
-        return SliceConvert.wrap(android.app.slice.Slice.bindSlice(
-                mContext.getContentResolver(), uri, mSpecs));
+        return SliceConvert.wrap(mManager.bindSlice(uri, mSpecs));
     }
 
     @Nullable
     @Override
     public androidx.slice.Slice bindSlice(@NonNull Intent intent) {
-        return SliceConvert.wrap(android.app.slice.Slice.bindSlice(
-                mContext, intent, mSpecs));
+        return SliceConvert.wrap(mManager.bindSlice(intent, mSpecs));
     }
 
     @Override
@@ -98,8 +89,6 @@
     @Nullable
     @Override
     public Uri mapIntentToUri(@NonNull Intent intent) {
-        // TODO: Switch over to mapIntentToUri once it lands in prebuilt.
-        Slice slice = bindSlice(intent);
-        return slice != null ? slice.getUri() : null;
+        return mManager.mapIntentToUri(intent);
     }
 }
diff --git a/slices/view/src/main/java/androidx/slice/SliceUtils.java b/slices/view/src/main/java/androidx/slice/SliceUtils.java
index 93b149c..442b324 100644
--- a/slices/view/src/main/java/androidx/slice/SliceUtils.java
+++ b/slices/view/src/main/java/androidx/slice/SliceUtils.java
@@ -30,7 +30,10 @@
 import static androidx.slice.SliceMetadata.LOADED_PARTIAL;
 import static androidx.slice.core.SliceHints.HINT_KEYWORDS;
 
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
 import android.content.Context;
+import android.net.Uri;
 import android.text.TextUtils;
 
 import androidx.annotation.IntDef;
@@ -42,6 +45,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.lang.annotation.Retention;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -65,10 +69,11 @@
      * @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.
+     * @throws IllegalArgumentException if the slice cannot be serialized using the given options.
      */
     public static void serializeSlice(@NonNull Slice s, @NonNull Context context,
             @NonNull OutputStream output, @NonNull String encoding,
-            @NonNull SerializeOptions options) throws IOException {
+            @NonNull SerializeOptions options) throws IOException, IllegalArgumentException {
         SliceXml.serializeSlice(s, context, output, encoding, options);
     }
 
@@ -76,13 +81,18 @@
      * Parse a slice that has been previously serialized.
      * <p>
      * Parses a slice that was serialized with {@link #serializeSlice}.
+     * <p>
+     * Note: Slices returned by this cannot be passed to {@link SliceConvert#unwrap(Slice)}.
      *
      * @param input The input stream to read from.
      * @param encoding The encoding to read as.
+     * @param listener Listener used to handle actions when reconstructing the slice.
+     * @throws SliceParseException if the InputStream cannot be parsed.
      */
-    public static @NonNull Slice parseSlice(@NonNull InputStream input, @NonNull String encoding)
-            throws IOException {
-        return SliceXml.parseSlice(input, encoding);
+    public static @NonNull Slice parseSlice(@NonNull Context context, @NonNull InputStream input,
+            @NonNull String encoding, @NonNull SliceActionListener listener)
+            throws IOException, SliceParseException {
+        return SliceXml.parseSlice(context, input, encoding, listener);
     }
 
     /**
@@ -101,17 +111,22 @@
         /**
          * 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.
+         * For images this means they will be attempted to be serialized. For actions, the
+         * action will be removed but the content of the action will be serialized. The action
+         * may be triggered later on a de-serialized slice by binding the slice again and activating
+         * a pending-intent at the same location as the serialized action.
          */
-        public static final int MODE_DISABLE = 2;
+        public static final int MODE_CONVERT = 2;
 
-        @IntDef({MODE_THROW, MODE_REMOVE, MODE_DISABLE})
+        @IntDef({MODE_THROW, MODE_REMOVE, MODE_CONVERT})
+        @Retention(SOURCE)
         @interface FormatMode {
         }
 
         private int mActionMode = MODE_THROW;
         private int mImageMode = MODE_THROW;
+        private int mMaxWidth = 1000;
+        private int mMaxHeight = 1000;
 
         /**
          * @hide
@@ -149,6 +164,22 @@
         }
 
         /**
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        public int getMaxWidth() {
+            return mMaxWidth;
+        }
+
+        /**
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        public int getMaxHeight() {
+            return mMaxHeight;
+        }
+
+        /**
          * Sets how {@link android.app.slice.SliceItem#FORMAT_ACTION} items should be handled.
          *
          * The default mode is {@link #MODE_THROW}.
@@ -169,6 +200,30 @@
             mImageMode = mode;
             return this;
         }
+
+        /**
+         * Set the maximum width of an image to use when serializing.
+         * <p>
+         * Will only be used if the {@link #setImageMode(int)} is set to {@link #MODE_CONVERT}.
+         * Any images larger than the maximum size will be scaled down to fit within that size.
+         * The default value is 1000.
+         */
+        public SerializeOptions setMaxImageWidth(int width) {
+            mMaxWidth = width;
+            return this;
+        }
+
+        /**
+         * Set the maximum height of an image to use when serializing.
+         * <p>
+         * Will only be used if the {@link #setImageMode(int)} is set to {@link #MODE_CONVERT}.
+         * Any images larger than the maximum size will be scaled down to fit within that size.
+         * The default value is 1000.
+         */
+        public SerializeOptions setMaxImageHeight(int height) {
+            mMaxHeight = height;
+            return this;
+        }
     }
 
     /**
@@ -255,4 +310,39 @@
         }
         return null;
     }
+
+    /**
+     * A listener used to receive events on slices parsed with
+     * {@link #parseSlice(Context, InputStream, String, SliceActionListener)}.
+     */
+    public interface SliceActionListener {
+        /**
+         * Called when an action is triggered on a slice parsed with
+         * {@link #parseSlice(Context, InputStream, String, SliceActionListener)}.
+         * @param actionUri The uri of the action selected.
+         */
+        void onSliceAction(Uri actionUri);
+    }
+
+    /**
+     * Exception thrown during
+     * {@link #parseSlice(Context, InputStream, String, SliceActionListener)}.
+     */
+    public static class SliceParseException extends Exception {
+        /**
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        public SliceParseException(String s, Throwable e) {
+            super(s, e);
+        }
+
+        /**
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        public SliceParseException(String s) {
+            super(s);
+        }
+    }
 }
diff --git a/slices/view/src/main/java/androidx/slice/SliceXml.java b/slices/view/src/main/java/androidx/slice/SliceXml.java
index 65f1e7d..ba423ad 100644
--- a/slices/view/src/main/java/androidx/slice/SliceXml.java
+++ b/slices/view/src/main/java/androidx/slice/SliceXml.java
@@ -20,22 +20,31 @@
 import static org.xmlpull.v1.XmlPullParser.TEXT;
 
 import android.annotation.SuppressLint;
+import android.content.ContentResolver;
 import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
 import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
 import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
 import android.net.Uri;
 import android.text.Html;
 import android.text.Spanned;
 import android.text.TextUtils;
+import android.util.Base64;
 
 import androidx.annotation.RestrictTo;
 import androidx.core.graphics.drawable.IconCompat;
+import androidx.core.util.Consumer;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 import org.xmlpull.v1.XmlPullParserFactory;
 import org.xmlpull.v1.XmlSerializer;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -50,14 +59,24 @@
     private static final String NAMESPACE = null;
 
     private static final String TAG_SLICE = "slice";
+    private static final String TAG_ACTION = "action";
     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";
+    private static final String ATTR_ICON_TYPE = "iconType";
+    private static final String ATTR_ICON_PACKAGE = "pkg";
+    private static final String ATTR_ICON_RES_TYPE = "resType";
 
-    public static Slice parseSlice(InputStream input, String encoding) throws IOException {
+    private static final String ICON_TYPE_RES = "res";
+    private static final String ICON_TYPE_URI = "uri";
+    private static final String ICON_TYPE_DEFAULT = "def";
+
+    public static Slice parseSlice(Context context, InputStream input,
+            String encoding, SliceUtils.SliceActionListener listener)
+            throws IOException, SliceUtils.SliceParseException {
         try {
             XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
             parser.setInput(input, encoding);
@@ -70,7 +89,7 @@
                 if (type != START_TAG) {
                     continue;
                 }
-                s = parseSlice(parser);
+                s = parseSlice(context, parser, listener);
             }
             return s;
         } catch (XmlPullParserException e) {
@@ -79,9 +98,10 @@
     }
 
     @SuppressLint("WrongConstant")
-    private static Slice parseSlice(XmlPullParser parser)
-            throws IOException, XmlPullParserException {
-        if (!TAG_SLICE.equals(parser.getName())) {
+    private static Slice parseSlice(Context context, XmlPullParser parser,
+            SliceUtils.SliceActionListener listener)
+            throws IOException, XmlPullParserException, SliceUtils.SliceParseException {
+        if (!TAG_SLICE.equals(parser.getName()) && !TAG_ACTION.equals(parser.getName())) {
             throw new IOException("Unexpected tag " + parser.getName());
         }
         int outerDepth = parser.getDepth();
@@ -94,20 +114,24 @@
         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);
+                parseItem(context, b, parser, listener);
             }
         }
         return b.build();
     }
 
     @SuppressLint("WrongConstant")
-    private static void parseItem(Slice.Builder b, XmlPullParser parser)
-            throws IOException, XmlPullParserException {
+    private static void parseItem(Context context, Slice.Builder b,
+            XmlPullParser parser, final SliceUtils.SliceActionListener listener)
+            throws IOException, XmlPullParserException, SliceUtils.SliceParseException {
         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 iconType = parser.getAttributeValue(NAMESPACE, ATTR_ICON_TYPE);
+        String pkg = parser.getAttributeValue(NAMESPACE, ATTR_ICON_PACKAGE);
+        String resType = parser.getAttributeValue(NAMESPACE, ATTR_ICON_RES_TYPE);
         String[] hints = hints(hintStr);
         String v;
         while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -118,16 +142,37 @@
                         // 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);
+                        switch (iconType) {
+                            case ICON_TYPE_RES:
+                                String resName = parser.getText();
+                                try {
+                                    Resources r = context.getPackageManager()
+                                                .getResourcesForApplication(pkg);
+                                    int id = r.getIdentifier(resName, resType, pkg);
+                                    if (id != 0) {
+                                        b.addIcon(IconCompat.createWithResource(
+                                                context.createPackageContext(pkg, 0), id), subtype,
+                                                hints);
+                                    } else {
+                                        throw new SliceUtils.SliceParseException(
+                                                "Cannot find resource " + pkg + ":" + resType
+                                                        + "/" + resName);
+                                    }
+                                } catch (PackageManager.NameNotFoundException e) {
+                                    throw new SliceUtils.SliceParseException(
+                                            "Invalid icon package " + pkg, e);
+                                }
+                                break;
+                            case ICON_TYPE_URI:
+                                v = parser.getText();
+                                b.addIcon(IconCompat.createWithContentUri(v), subtype, hints);
+                                break;
+                            default:
+                                v = parser.getText();
+                                byte[] data = Base64.decode(v, Base64.NO_WRAP);
+                                Bitmap image = BitmapFactory.decodeByteArray(data, 0, data.length);
                                 b.addIcon(IconCompat.createWithBitmap(image), subtype, hints);
-                            }
+                                break;
                         }
                         break;
                     case android.app.slice.SliceItem.FORMAT_INT:
@@ -138,15 +183,22 @@
                         v = parser.getText();
                         b.addText(Html.fromHtml(v), subtype, hints);
                         break;
-                    case android.app.slice.SliceItem.FORMAT_TIMESTAMP:
+                    case android.app.slice.SliceItem.FORMAT_LONG:
                         v = parser.getText();
-                        b.addTimestamp(Long.parseLong(v), subtype, hints);
+                        b.addLong(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);
+                b.addSubSlice(parseSlice(context, parser, listener), subtype);
+            } else if (type == START_TAG && TAG_ACTION.equals(parser.getName())) {
+                b.addAction(new Consumer<Uri>() {
+                    @Override
+                    public void accept(Uri uri) {
+                        listener.onSliceAction(uri);
+                    }
+                }, parseSlice(context, parser, listener), subtype);
             }
         }
     }
@@ -162,7 +214,7 @@
             serializer.setOutput(output, encoding);
             serializer.startDocument(encoding, null);
 
-            serialize(s, context, options, serializer);
+            serialize(s, context, options, serializer, false, null);
 
             serializer.endDocument();
             serializer.flush();
@@ -172,9 +224,12 @@
     }
 
     private static void serialize(Slice s, Context context, SliceUtils.SerializeOptions options,
-            XmlSerializer serializer) throws IOException {
-        serializer.startTag(NAMESPACE, TAG_SLICE);
+            XmlSerializer serializer, boolean isAction, String subType) throws IOException {
+        serializer.startTag(NAMESPACE, isAction ? TAG_ACTION : TAG_SLICE);
         serializer.attribute(NAMESPACE, ATTR_URI, s.getUri().toString());
+        if (subType != null) {
+            serializer.attribute(NAMESPACE, ATTR_SUBTYPE, subType);
+        }
         if (!s.getHints().isEmpty()) {
             serializer.attribute(NAMESPACE, ATTR_HINTS, hintStr(s.getHints()));
         }
@@ -182,7 +237,7 @@
             serialize(item, context, options, serializer);
         }
 
-        serializer.endTag(NAMESPACE, TAG_SLICE);
+        serializer.endTag(NAMESPACE, isAction ? TAG_ACTION : TAG_SLICE);
     }
 
     private static void serialize(SliceItem item, Context context,
@@ -201,27 +256,45 @@
 
         switch (format) {
             case android.app.slice.SliceItem.FORMAT_ACTION:
-                if (options.getActionMode() == SliceUtils.SerializeOptions.MODE_DISABLE) {
-                    serialize(item.getSlice(), context, options, serializer);
+                if (options.getActionMode() == SliceUtils.SerializeOptions.MODE_CONVERT) {
+                    serialize(item.getSlice(), context, options, serializer, true,
+                            item.getSubType());
+                } else if (options.getActionMode() == SliceUtils.SerializeOptions.MODE_THROW) {
+                    throw new IllegalArgumentException("Slice contains an action " + item);
                 }
                 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()));
+                if (options.getImageMode() == SliceUtils.SerializeOptions.MODE_CONVERT) {
+                    IconCompat icon = item.getIcon();
+
+                    switch (icon.getType()) {
+                        case Icon.TYPE_RESOURCE:
+                            serializeResIcon(serializer, icon, context);
+                            break;
+                        case Icon.TYPE_URI:
+                            Uri uri = icon.getUri();
+                            if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {
+                                serializeFileIcon(serializer, icon, context);
+                            } else {
+                                serializeIcon(serializer, icon, context, options);
+                            }
+                            break;
+                        default:
+                            serializeIcon(serializer, icon, context, options);
+                            break;
                     }
+                } else if (options.getImageMode() == SliceUtils.SerializeOptions.MODE_THROW) {
+                    throw new IllegalArgumentException("Slice contains an image " + item);
                 }
                 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);
+                serialize(item.getSlice(), context, options, serializer, false, item.getSubType());
                 break;
             case android.app.slice.SliceItem.FORMAT_TEXT:
                 if (item.getText() instanceof Spanned) {
@@ -230,8 +303,8 @@
                     serializer.text(String.valueOf(item.getText()));
                 }
                 break;
-            case android.app.slice.SliceItem.FORMAT_TIMESTAMP:
-                serializer.text(String.valueOf(item.getTimestamp()));
+            case android.app.slice.SliceItem.FORMAT_LONG:
+                serializer.text(String.valueOf(item.getLong()));
                 break;
             default:
                 throw new IllegalArgumentException("Unrecognized format " + format);
@@ -239,6 +312,53 @@
         serializer.endTag(NAMESPACE, TAG_ITEM);
     }
 
+    private static void serializeResIcon(XmlSerializer serializer, IconCompat icon, Context context)
+            throws IOException {
+        try {
+            Resources res = context.getPackageManager().getResourcesForApplication(
+                    icon.getResPackage());
+            int id = icon.getResId();
+            serializer.attribute(NAMESPACE, ATTR_ICON_TYPE, ICON_TYPE_RES);
+            serializer.attribute(NAMESPACE, ATTR_ICON_PACKAGE, res.getResourcePackageName(id));
+            serializer.attribute(NAMESPACE, ATTR_ICON_RES_TYPE, res.getResourceTypeName(id));
+            serializer.text(res.getResourceEntryName(id));
+        } catch (PackageManager.NameNotFoundException e) {
+            throw new IllegalArgumentException("Slice contains invalid icon", e);
+        }
+    }
+
+    private static void serializeFileIcon(XmlSerializer serializer, IconCompat icon,
+            Context context) throws IOException {
+        serializer.attribute(NAMESPACE, ATTR_ICON_TYPE, ICON_TYPE_URI);
+        serializer.text(icon.getUri().toString());
+    }
+
+    private static void serializeIcon(XmlSerializer serializer, IconCompat icon,
+            Context context, SliceUtils.SerializeOptions options) throws IOException {
+        Drawable d = icon.loadDrawable(context);
+        int width = d.getIntrinsicWidth();
+        int height = d.getIntrinsicHeight();
+        if (width > options.getMaxWidth()) {
+            height = (int) (options.getMaxWidth() * height / (double) width);
+            width = options.getMaxWidth();
+        }
+        if (height > options.getMaxHeight()) {
+            width = (int) (options.getMaxHeight() * width / (double) height);
+            height = options.getMaxHeight();
+        }
+        Bitmap b = Bitmap.createBitmap(width, height,
+                Bitmap.Config.ARGB_8888);
+        Canvas c = new Canvas(b);
+        d.setBounds(0, 0, c.getWidth(), c.getHeight());
+        d.draw(c);
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        b.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
+        b.recycle();
+
+        serializer.attribute(NAMESPACE, ATTR_ICON_TYPE, ICON_TYPE_DEFAULT);
+        serializer.text(new String(Base64.encode(outputStream.toByteArray(), Base64.NO_WRAP)));
+    }
+
     private static String hintStr(List<String> hints) {
         return TextUtils.join(",", hints);
     }
diff --git a/slices/view/src/main/java/androidx/slice/widget/ActionRow.java b/slices/view/src/main/java/androidx/slice/widget/ActionRow.java
index bd6ad13..55bbca1 100644
--- a/slices/view/src/main/java/androidx/slice/widget/ActionRow.java
+++ b/slices/view/src/main/java/androidx/slice/widget/ActionRow.java
@@ -22,7 +22,6 @@
 
 import static androidx.slice.core.SliceHints.ICON_IMAGE;
 
-import android.app.PendingIntent;
 import android.app.PendingIntent.CanceledException;
 import android.app.RemoteInput;
 import android.app.slice.Slice;
@@ -132,7 +131,7 @@
             } else if (action.hasHint(Slice.HINT_SHORTCUT)) {
                 final SliceActionImpl ac = new SliceActionImpl(action);
                 IconCompat iconItem = ac.getIcon();
-                if (iconItem != null && ac.getAction() != null) {
+                if (iconItem != null && ac.getActionItem() != null) {
                     boolean tint = ac.getImageMode() == ICON_IMAGE;
                     addAction(iconItem, tint).setOnClickListener(
                             new OnClickListener() {
@@ -140,7 +139,7 @@
                                 public void onClick(View v) {
                                     try {
                                         // TODO - should log events here
-                                        ac.getAction().send();
+                                        ac.getActionItem().fireAction(null, null);
                                     } catch (CanceledException e) {
                                         e.printStackTrace();
                                     }
@@ -165,7 +164,7 @@
                     new OnClickListener() {
                         @Override
                         public void onClick(View v) {
-                            handleRemoteInputClick(v, action.getAction(),
+                            handleRemoteInputClick(v, action,
                                     input.getRemoteInput());
                         }
                     });
@@ -182,7 +181,7 @@
     }
 
     @RequiresApi(21)
-    private boolean handleRemoteInputClick(View view, PendingIntent pendingIntent,
+    private boolean handleRemoteInputClick(View view, SliceItem action,
             RemoteInput input) {
         if (input == null) {
             return false;
@@ -223,7 +222,7 @@
                 Math.max((w - cx) + cy, (w - cx) + (h - cy)));
 
         riv.setRevealParameters(cx, cy, r);
-        riv.setPendingIntent(pendingIntent);
+        riv.setAction(action);
         riv.setRemoteInput(new RemoteInput[] {
                 input
         }, input);
diff --git a/slices/view/src/main/java/androidx/slice/widget/GridRowView.java b/slices/view/src/main/java/androidx/slice/widget/GridRowView.java
index 1bb90e7..4b8078c 100644
--- a/slices/view/src/main/java/androidx/slice/widget/GridRowView.java
+++ b/slices/view/src/main/java/androidx/slice/widget/GridRowView.java
@@ -354,7 +354,7 @@
         final EventInfo info = tagItem.second;
         if (actionItem != null && FORMAT_ACTION.equals(actionItem.getFormat())) {
             try {
-                actionItem.getAction().send();
+                actionItem.fireAction(null, null);
                 if (mObserver != null) {
                     mObserver.onSliceAction(info, actionItem);
                 }
diff --git a/slices/view/src/main/java/androidx/slice/widget/LargeSliceAdapter.java b/slices/view/src/main/java/androidx/slice/widget/LargeSliceAdapter.java
index 9270353c..9e077ab 100644
--- a/slices/view/src/main/java/androidx/slice/widget/LargeSliceAdapter.java
+++ b/slices/view/src/main/java/androidx/slice/widget/LargeSliceAdapter.java
@@ -191,6 +191,8 @@
                         null);
                 break;
         }
+        int mode = mParent != null ? mParent.getMode() : MODE_LARGE;
+        ((SliceChildView) v).setMode(mode);
         return v;
     }
 
@@ -246,8 +248,6 @@
             mSliceChildView.setOnTouchListener(this);
 
             final boolean isHeader = position == HEADER_INDEX;
-            int mode = mParent != null ? mParent.getMode() : MODE_LARGE;
-            mSliceChildView.setMode(mode);
             mSliceChildView.setTint(mColor);
             mSliceChildView.setStyle(mAttrs, mDefStyleAttr, mDefStyleRes);
             mSliceChildView.setSliceItem(item, isHeader, position, mSliceObserver);
diff --git a/slices/view/src/main/java/androidx/slice/widget/RemoteInputView.java b/slices/view/src/main/java/androidx/slice/widget/RemoteInputView.java
index 1792f29..d4ff299 100644
--- a/slices/view/src/main/java/androidx/slice/widget/RemoteInputView.java
+++ b/slices/view/src/main/java/androidx/slice/widget/RemoteInputView.java
@@ -50,6 +50,7 @@
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.core.content.ContextCompat;
+import androidx.slice.SliceItem;
 import androidx.slice.view.R;
 
 /**
@@ -72,7 +73,7 @@
     private RemoteEditText mEditText;
     private ImageButton mSendButton;
     private ProgressBar mProgressBar;
-    private PendingIntent mPendingIntent;
+    private SliceItem mAction;
     private RemoteInput[] mRemoteInputs;
     private RemoteInput mRemoteInput;
 
@@ -139,11 +140,11 @@
         // 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(),
+        //        mAction.getCreatorPackage(),
         //        getContext().getUserId());
 
         try {
-            mPendingIntent.send(getContext(), 0, fillInIntent);
+            mAction.fireAction(getContext(), fillInIntent);
             reset();
         } catch (PendingIntent.CanceledException e) {
             Log.i(TAG, "Unable to send remote input result", e);
@@ -185,8 +186,8 @@
     /**
      * Set the pending intent for remote input.
      */
-    public void setPendingIntent(PendingIntent pendingIntent) {
-        mPendingIntent = pendingIntent;
+    public void setAction(SliceItem action) {
+        mAction = action;
     }
 
     /**
diff --git a/slices/view/src/main/java/androidx/slice/widget/RowContent.java b/slices/view/src/main/java/androidx/slice/widget/RowContent.java
index c600af5..bc3826f 100644
--- a/slices/view/src/main/java/androidx/slice/widget/RowContent.java
+++ b/slices/view/src/main/java/androidx/slice/widget/RowContent.java
@@ -155,23 +155,18 @@
             if (hasText(mSubtitleItem)) {
                 mLineCount++;
             }
-            // Special rules for end items: only one timestamp, can't be mixture of icons / actions
+            // Special rules for end items: only one timestamp
             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);
-                boolean isAction = FORMAT_SLICE.equals(item.getFormat())
-                        && item.hasHint(HINT_SHORTCUT);
+                boolean isAction = SliceQuery.find(item, FORMAT_ACTION) != null;
                 if (FORMAT_TIMESTAMP.equals(item.getFormat())) {
                     if (!hasTimestamp) {
                         hasTimestamp = true;
                         mEndItems.add(item);
                     }
-                } else if (desiredFormat == null) {
-                    desiredFormat = item.getFormat();
-                    processContent(item, isAction);
-                } else if (desiredFormat.equals(item.getFormat())) {
+                } else {
                     processContent(item, isAction);
                 }
             }
diff --git a/slices/view/src/main/java/androidx/slice/widget/RowView.java b/slices/view/src/main/java/androidx/slice/widget/RowView.java
index 4f25fed..2479d70 100644
--- a/slices/view/src/main/java/androidx/slice/widget/RowView.java
+++ b/slices/view/src/main/java/androidx/slice/widget/RowView.java
@@ -38,7 +38,6 @@
 import static androidx.slice.widget.EventInfo.ROW_TYPE_TOGGLE;
 import static androidx.slice.widget.SliceView.MODE_SMALL;
 
-import android.app.PendingIntent;
 import android.app.PendingIntent.CanceledException;
 import android.content.Context;
 import android.content.Intent;
@@ -291,15 +290,9 @@
 
         // If we're here we can can show end items; check for top level actions first
         List<SliceItem> endItems = mRowContent.getEndItems();
-        String desiredFormat = FORMAT_ACTION;
-        if (mHeaderActions != null && mHeaderActions.size() > 0) {
+        if (mIsHeader && mHeaderActions != null && mHeaderActions.size() > 0) {
             // Use these if we have them instead
             endItems = mHeaderActions;
-        } else if (!endItems.isEmpty()) {
-            // Prefer to show actions as end items if possible; fall back to the first format type.
-            SliceItem firstEndItem = endItems.get(0);
-            desiredFormat = mRowContent.endItemsContainAction()
-                    ? FORMAT_ACTION : firstEndItem.getSlice().getItems().get(0).getFormat();
         }
         boolean hasRowAction = mRowAction != null;
         if (endItems.isEmpty()) {
@@ -310,23 +303,14 @@
         // If we're here we might be able to show end items
         int itemCount = 0;
         boolean firstItemIsADefaultToggle = false;
+        boolean hasEndItemAction = false;
         for (int i = 0; i < endItems.size(); i++) {
             final SliceItem endItem = endItems.get(i);
-            final String endFormat = endItem.hasHint(HINT_SHORTCUT)
-                    ? FORMAT_ACTION
-                    : endItem.getSlice().getItems().get(0).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 (itemCount < MAX_END_ITEMS) {
                 if (addItem(endItem, mTintColor, false /* isStart */)) {
+                    if (FORMAT_ACTION.equals(endItem.getFormat())) {
+                        hasEndItemAction = true;
+                    }
                     itemCount++;
                     if (itemCount == 1) {
                         firstItemIsADefaultToggle = !mToggles.isEmpty()
@@ -336,7 +320,6 @@
             }
         }
 
-        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);
@@ -431,10 +414,9 @@
                 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                     progress += finalMinValue;
                     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);
+                        range.fireAction(getContext(),
+                                new Intent().putExtra(EXTRA_RANGE_VALUE, progress));
                     } catch (CanceledException e) { }
                 }
 
@@ -532,7 +514,7 @@
                                 EventInfo.ROW_TYPE_LIST, mRowIndex);
                         mObserver.onSliceAction(info, mRowContent.getSlice());
                     }
-                    mRowContent.getSlice().getAction().send();
+                    mRowContent.getSlice().fireAction(null, null);
                 } catch (CanceledException e) {
                     Log.e(TAG, "PendingIntent for slice cannot be sent", e);
                 }
@@ -547,10 +529,10 @@
 
     @Override
     public void onClick(View view) {
-        if (mRowAction != null && mRowAction.getAction() != null && !mRowAction.isToggle()) {
+        if (mRowAction != null && mRowAction.getActionItem() != null && !mRowAction.isToggle()) {
             // Check for a row action
             try {
-                mRowAction.getAction().send();
+                mRowAction.getActionItem().fireAction(null, null);
                 if (mObserver != null) {
                     EventInfo info = new EventInfo(getMode(), EventInfo.ACTION_TYPE_CONTENT,
                             EventInfo.ROW_TYPE_LIST, mRowIndex);
diff --git a/slices/view/src/main/java/androidx/slice/widget/ShortcutView.java b/slices/view/src/main/java/androidx/slice/widget/ShortcutView.java
index 6f02437..37ef17b 100644
--- a/slices/view/src/main/java/androidx/slice/widget/ShortcutView.java
+++ b/slices/view/src/main/java/androidx/slice/widget/ShortcutView.java
@@ -115,7 +115,7 @@
         if (!callOnClick()) {
             try {
                 if (mActionItem != null) {
-                    mActionItem.getAction().send();
+                    mActionItem.fireAction(null, null);
                 } else {
                     Intent intent = new Intent(Intent.ACTION_VIEW).setData(mUri);
                     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -195,7 +195,7 @@
                 if (mActionItem == null) {
                     mActionItem = new SliceItem(PendingIntent.getActivity(context, 0,
                             pm.getLaunchIntentForPackage(appInfo.packageName), 0),
-                            new Slice.Builder(slice.getUri()).build(), FORMAT_ACTION,
+                            new Slice.Builder(slice.getUri()).build(), FORMAT_SLICE,
                             null /* subtype */, null);
                 }
             }
diff --git a/slices/view/src/main/java/androidx/slice/widget/SliceActionView.java b/slices/view/src/main/java/androidx/slice/widget/SliceActionView.java
index 54da214..ffe4587 100644
--- a/slices/view/src/main/java/androidx/slice/widget/SliceActionView.java
+++ b/slices/view/src/main/java/androidx/slice/widget/SliceActionView.java
@@ -168,14 +168,14 @@
                 // Update the intent extra state
                 boolean isChecked = ((Checkable) mActionView).isChecked();
                 Intent i = new Intent().putExtra(EXTRA_TOGGLE_STATE, isChecked);
-                pi.send(getContext(), 0, i, null, null);
+                mSliceAction.getActionItem().fireAction(getContext(), i);
 
                 // Update event info state
                 if (mEventInfo != null) {
                     mEventInfo.state = isChecked ? EventInfo.STATE_ON : EventInfo.STATE_OFF;
                 }
             } else {
-                pi.send();
+                mSliceAction.getActionItem().fireAction(null, null); 
             }
             if (mObserver != null && mEventInfo != null) {
                 mObserver.onSliceAction(mEventInfo, mSliceAction.getSliceItem());
diff --git a/slices/view/src/main/java/androidx/slice/widget/SliceLiveData.java b/slices/view/src/main/java/androidx/slice/widget/SliceLiveData.java
index 2ffc02c..8639893 100644
--- a/slices/view/src/main/java/androidx/slice/widget/SliceLiveData.java
+++ b/slices/view/src/main/java/androidx/slice/widget/SliceLiveData.java
@@ -63,8 +63,7 @@
 
     /**
      * 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}).
+     * this method your app must have the permission to the slice Uri.
      */
     public static LiveData<Slice> fromUri(Context context, Uri uri) {
         return new SliceLiveDataImpl(context.getApplicationContext(), uri);
@@ -72,8 +71,7 @@
 
     /**
      * 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}).
+     * this method your app must have the permission to the slice Uri.
      */
     public static LiveData<Slice> fromIntent(@NonNull Context context, @NonNull Intent intent) {
         return new SliceLiveDataImpl(context.getApplicationContext(), intent);
diff --git a/slices/view/src/main/res/values-af/strings.xml b/slices/view/src/main/res/values-af/strings.xml
index ea5ab25..cfe8138 100644
--- a/slices/view/src/main/res/values-af/strings.xml
+++ b/slices/view/src/main/res/values-af/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Meer"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Wys meer"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Opgedateer om <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> min. gelede</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> min. gelede</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> jaar gelede</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> jaar gelede</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> dae gelede</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> dag gelede</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Kon nie koppel nie"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-am/strings.xml b/slices/view/src/main/res/values-am/strings.xml
index ea5ab25..da542e1 100644
--- a/slices/view/src/main/res/values-am/strings.xml
+++ b/slices/view/src/main/res/values-am/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"ተጨማሪ"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"ተጨማሪ አሳይ"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"የተዘመነው <xliff:g id="TIME">%1$s</xliff:g> ላይ"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> ደቂቃ በፊት</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ደቂቃ በፊት</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> ዓመት በፊት</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ዓመት በፊት</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> ቀናት በፊት</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ቀናት በፊት</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"መገናኘት አልተቻለም"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-ar/strings.xml b/slices/view/src/main/res/values-ar/strings.xml
index 21aa8a4..1e9ca94 100644
--- a/slices/view/src/main/res/values-ar/strings.xml
+++ b/slices/view/src/main/res/values-ar/strings.xml
@@ -18,4 +18,32 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"بالإضافة إلى <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"المزيد"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"عرض المزيد"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"وقت التحديث الأخير: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="zero">قبل <xliff:g id="ID_2">%d</xliff:g> دقيقة</item>
+      <item quantity="two">قبل دقيقتين (<xliff:g id="ID_2">%d</xliff:g>)</item>
+      <item quantity="few">قبل <xliff:g id="ID_2">%d</xliff:g> دقائق</item>
+      <item quantity="many">قبل <xliff:g id="ID_2">%d</xliff:g> دقيقة</item>
+      <item quantity="other">قبل <xliff:g id="ID_2">%d</xliff:g> دقيقة</item>
+      <item quantity="one">قبل <xliff:g id="ID_1">%d</xliff:g> دقيقة</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="zero">قبل <xliff:g id="ID_2">%d</xliff:g> سنة</item>
+      <item quantity="two">قبل سنتين (<xliff:g id="ID_2">%d</xliff:g>)</item>
+      <item quantity="few">قبل <xliff:g id="ID_2">%d</xliff:g> سنوات</item>
+      <item quantity="many">قبل <xliff:g id="ID_2">%d</xliff:g> سنة</item>
+      <item quantity="other">قبل <xliff:g id="ID_2">%d</xliff:g> سنة</item>
+      <item quantity="one">قبل <xliff:g id="ID_1">%d</xliff:g> سنة</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="zero">قبل <xliff:g id="ID_2">%d</xliff:g> يوم</item>
+      <item quantity="two">قبل يومين (<xliff:g id="ID_2">%d</xliff:g>)</item>
+      <item quantity="few">قبل <xliff:g id="ID_2">%d</xliff:g> أيام</item>
+      <item quantity="many">قبل <xliff:g id="ID_2">%d</xliff:g> يومًا</item>
+      <item quantity="other">قبل <xliff:g id="ID_2">%d</xliff:g> يوم</item>
+      <item quantity="one">قبل <xliff:g id="ID_1">%d</xliff:g> يوم</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"تعذّر الاتصال."</string>
 </resources>
diff --git a/slices/view/src/main/res/values-as/strings.xml b/slices/view/src/main/res/values-as/strings.xml
new file mode 100644
index 0000000..dbc598f
--- /dev/null
+++ b/slices/view/src/main/res/values-as/strings.xml
@@ -0,0 +1,37 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"অধিক"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"অধিক দেখুৱাওক"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g> আপডেট কৰা হৈছিল"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> মিনিট আগেয়ে</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> মিনিট আগেয়ে</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> বছৰ আগেয়ে</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> বছৰ আগেয়ে</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> দিন আগেয়ে</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g>দিন আগেয়ে</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"সংযোগ কৰিব পৰা নগ\'ল"</string>
+</resources>
diff --git a/slices/view/src/main/res/values-az/strings.xml b/slices/view/src/main/res/values-az/strings.xml
index ea5ab25..837f08c 100644
--- a/slices/view/src/main/res/values-az/strings.xml
+++ b/slices/view/src/main/res/values-az/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Digər"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Digərinə baxın"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g> tarixində yenilənib"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> dəq əvvəl</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> dəq əvvəl</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> il əvvəl</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> il əvvəl</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> gün əvvəl</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> gün əvvəl</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Qoşulmaq mümkün olmadı"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-b+sr+Latn/strings.xml b/slices/view/src/main/res/values-b+sr+Latn/strings.xml
index ffd9b9b..8deb17c 100644
--- a/slices/view/src/main/res/values-b+sr+Latn/strings.xml
+++ b/slices/view/src/main/res/values-b+sr+Latn/strings.xml
@@ -18,4 +18,23 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"i još <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Još"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Prikaži više"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Ažurirano <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one">pre <xliff:g id="ID_2">%d</xliff:g> min</item>
+      <item quantity="few">pre <xliff:g id="ID_2">%d</xliff:g> min</item>
+      <item quantity="other">pre <xliff:g id="ID_2">%d</xliff:g> min</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one">pre <xliff:g id="ID_2">%d</xliff:g> god</item>
+      <item quantity="few">pre <xliff:g id="ID_2">%d</xliff:g> god</item>
+      <item quantity="other">pre <xliff:g id="ID_2">%d</xliff:g> god</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one">pre <xliff:g id="ID_2">%d</xliff:g> dan</item>
+      <item quantity="few">pre <xliff:g id="ID_2">%d</xliff:g> dana</item>
+      <item quantity="other">pre <xliff:g id="ID_2">%d</xliff:g> dana</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Povezivanje nije uspelo"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-be/strings.xml b/slices/view/src/main/res/values-be/strings.xml
index df8e965..b03f283 100644
--- a/slices/view/src/main/res/values-be/strings.xml
+++ b/slices/view/src/main/res/values-be/strings.xml
@@ -18,4 +18,26 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"Яшчэ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Яшчэ"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Яшчэ"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Абноўлена <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> хвіліну таму</item>
+      <item quantity="few"><xliff:g id="ID_2">%d</xliff:g> хвіліны таму</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> хвілін таму</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> хвіліны таму</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> год таму</item>
+      <item quantity="few"><xliff:g id="ID_2">%d</xliff:g> гады таму</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> гадоў таму</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> года таму</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> дзень таму</item>
+      <item quantity="few"><xliff:g id="ID_2">%d</xliff:g> дні таму</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> дзён таму</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> дня таму</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Не атрымалася падключыцца"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-bg/strings.xml b/slices/view/src/main/res/values-bg/strings.xml
index ea5ab25..b019a46 100644
--- a/slices/view/src/main/res/values-bg/strings.xml
+++ b/slices/view/src/main/res/values-bg/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Още"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Показване на още"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Актуализирано <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other">Преди <xliff:g id="ID_2">%d</xliff:g> мин</item>
+      <item quantity="one">Преди <xliff:g id="ID_1">%d</xliff:g> мин</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other">Преди <xliff:g id="ID_2">%d</xliff:g> год</item>
+      <item quantity="one">Преди <xliff:g id="ID_1">%d</xliff:g> год</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other">Преди <xliff:g id="ID_2">%d</xliff:g> дни</item>
+      <item quantity="one">Преди <xliff:g id="ID_1">%d</xliff:g> ден</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Не можа да се установи връзка"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-bn/strings.xml b/slices/view/src/main/res/values-bn/strings.xml
index 8737d8c..bc5c45b 100644
--- a/slices/view/src/main/res/values-bn/strings.xml
+++ b/slices/view/src/main/res/values-bn/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>টি"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"আরও"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"আরও দেখুন"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g> আপডেট করা হয়েছে"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> মিনিট আগে</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> মিনিট আগে</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> বছর আগে</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> বছর আগে</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> দিন আগে</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> দিন আগে</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"কানেক্ট করা যায়নি"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-bs/strings.xml b/slices/view/src/main/res/values-bs/strings.xml
index ea5ab25..cb84c18 100644
--- a/slices/view/src/main/res/values-bs/strings.xml
+++ b/slices/view/src/main/res/values-bs/strings.xml
@@ -18,4 +18,23 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Više"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Prikaži više"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Ažurirano <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one">Prije <xliff:g id="ID_2">%d</xliff:g> min.</item>
+      <item quantity="few">Prije <xliff:g id="ID_2">%d</xliff:g> min.</item>
+      <item quantity="other">Prije <xliff:g id="ID_2">%d</xliff:g> min.</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one">Prije <xliff:g id="ID_2">%d</xliff:g> god.</item>
+      <item quantity="few">Prije <xliff:g id="ID_2">%d</xliff:g> god.</item>
+      <item quantity="other">Prije <xliff:g id="ID_2">%d</xliff:g> god.</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one">Prije <xliff:g id="ID_2">%d</xliff:g> dan</item>
+      <item quantity="few">Prije <xliff:g id="ID_2">%d</xliff:g> dana</item>
+      <item quantity="other">Prije <xliff:g id="ID_2">%d</xliff:g> dana</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Povezivanje nije uspjelo"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-ca/strings.xml b/slices/view/src/main/res/values-ca/strings.xml
index 8ae6f78..cc5dde0 100644
--- a/slices/view/src/main/res/values-ca/strings.xml
+++ b/slices/view/src/main/res/values-ca/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"<xliff:g id="NUMBER">%1$d</xliff:g> més"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Més"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Mostra\'n més"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"S\'ha actualitzat <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other">Fa <xliff:g id="ID_2">%d</xliff:g> min</item>
+      <item quantity="one">Fa <xliff:g id="ID_1">%d</xliff:g> min</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other">Fa <xliff:g id="ID_2">%d</xliff:g> anys</item>
+      <item quantity="one">Fa <xliff:g id="ID_1">%d</xliff:g> any</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other">Fa <xliff:g id="ID_2">%d</xliff:g> dies</item>
+      <item quantity="one">Fa <xliff:g id="ID_1">%d</xliff:g> dia</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"No s\'ha pogut connectar"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-cs/strings.xml b/slices/view/src/main/res/values-cs/strings.xml
index 1d39c0f..c4c1fce 100644
--- a/slices/view/src/main/res/values-cs/strings.xml
+++ b/slices/view/src/main/res/values-cs/strings.xml
@@ -18,4 +18,26 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"a ještě <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Více"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Zobrazit více"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Aktualizováno <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="few">před <xliff:g id="ID_2">%d</xliff:g> min</item>
+      <item quantity="many">před <xliff:g id="ID_2">%d</xliff:g> min</item>
+      <item quantity="other">před <xliff:g id="ID_2">%d</xliff:g> min</item>
+      <item quantity="one">před <xliff:g id="ID_1">%d</xliff:g> min</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="few">před <xliff:g id="ID_2">%d</xliff:g> lety</item>
+      <item quantity="many">před <xliff:g id="ID_2">%d</xliff:g> roku</item>
+      <item quantity="other">před <xliff:g id="ID_2">%d</xliff:g> lety</item>
+      <item quantity="one">před <xliff:g id="ID_1">%d</xliff:g> rokem</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="few">před <xliff:g id="ID_2">%d</xliff:g> dny</item>
+      <item quantity="many">před <xliff:g id="ID_2">%d</xliff:g> dne</item>
+      <item quantity="other">před <xliff:g id="ID_2">%d</xliff:g> dny</item>
+      <item quantity="one">před <xliff:g id="ID_1">%d</xliff:g> dnem</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Nelze se připojit"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-da/strings.xml b/slices/view/src/main/res/values-da/strings.xml
index 40de41d..c7c2850 100644
--- a/slices/view/src/main/res/values-da/strings.xml
+++ b/slices/view/src/main/res/values-da/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"<xliff:g id="NUMBER">%1$d</xliff:g> mere"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Mere"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Se mere"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Opdateret <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one">for <xliff:g id="ID_2">%d</xliff:g> min. siden</item>
+      <item quantity="other">for <xliff:g id="ID_2">%d</xliff:g> min. siden</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one">for <xliff:g id="ID_2">%d</xliff:g> år siden</item>
+      <item quantity="other">for <xliff:g id="ID_2">%d</xliff:g> år siden</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one">for <xliff:g id="ID_2">%d</xliff:g> dag siden</item>
+      <item quantity="other">for <xliff:g id="ID_2">%d</xliff:g> dage siden</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Der kunne ikke oprettes forbindelse"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-de/strings.xml b/slices/view/src/main/res/values-de/strings.xml
index 9d9bede..25dff37 100644
--- a/slices/view/src/main/res/values-de/strings.xml
+++ b/slices/view/src/main/res/values-de/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Mehr"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Mehr anzeigen"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Aktualisiert: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other">vor <xliff:g id="ID_2">%d</xliff:g> Min.</item>
+      <item quantity="one">vor <xliff:g id="ID_1">%d</xliff:g> Min.</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other">vor <xliff:g id="ID_2">%d</xliff:g> Jahren</item>
+      <item quantity="one">vor <xliff:g id="ID_1">%d</xliff:g> Jahr</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other">vor <xliff:g id="ID_2">%d</xliff:g> Tagen</item>
+      <item quantity="one">vor <xliff:g id="ID_1">%d</xliff:g> Tag</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Verbindung nicht möglich"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-el/strings.xml b/slices/view/src/main/res/values-el/strings.xml
index ea5ab25..31092af 100644
--- a/slices/view/src/main/res/values-el/strings.xml
+++ b/slices/view/src/main/res/values-el/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Περισσότ."</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Εμφάνιση περισσότερων"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Ενημερώθηκε <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> λεπ. πριν</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> λεπ. πριν</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> χρ. πριν</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> χρ. πριν</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ημ. πριν</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> ημ. πριν</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Αδυναμία σύνδεσης"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-en-rAU/strings.xml b/slices/view/src/main/res/values-en-rAU/strings.xml
index ea5ab25..8fa5b45 100644
--- a/slices/view/src/main/res/values-en-rAU/strings.xml
+++ b/slices/view/src/main/res/values-en-rAU/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"More"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Show more"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Updated <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> min ago</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> min ago</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> yr ago</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> yr ago</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> days ago</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> day ago</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Couldn\'t connect"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-en-rCA/strings.xml b/slices/view/src/main/res/values-en-rCA/strings.xml
index ea5ab25..8fa5b45 100644
--- a/slices/view/src/main/res/values-en-rCA/strings.xml
+++ b/slices/view/src/main/res/values-en-rCA/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"More"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Show more"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Updated <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> min ago</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> min ago</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> yr ago</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> yr ago</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> days ago</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> day ago</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Couldn\'t connect"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-en-rGB/strings.xml b/slices/view/src/main/res/values-en-rGB/strings.xml
index ea5ab25..8fa5b45 100644
--- a/slices/view/src/main/res/values-en-rGB/strings.xml
+++ b/slices/view/src/main/res/values-en-rGB/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"More"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Show more"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Updated <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> min ago</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> min ago</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> yr ago</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> yr ago</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> days ago</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> day ago</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Couldn\'t connect"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-en-rIN/strings.xml b/slices/view/src/main/res/values-en-rIN/strings.xml
index ea5ab25..8fa5b45 100644
--- a/slices/view/src/main/res/values-en-rIN/strings.xml
+++ b/slices/view/src/main/res/values-en-rIN/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"More"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Show more"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Updated <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> min ago</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> min ago</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> yr ago</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> yr ago</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> days ago</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> day ago</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Couldn\'t connect"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-en-rXC/strings.xml b/slices/view/src/main/res/values-en-rXC/strings.xml
index b793412..b24c1e6 100644
--- a/slices/view/src/main/res/values-en-rXC/strings.xml
+++ b/slices/view/src/main/res/values-en-rXC/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‎‎‏‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‏‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‎‏‏‎‏‏‏‏‎‏‎‏‏‎‏‏‎‎+ ‎‏‎‎‏‏‎<xliff:g id="NUMBER">%1$d</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‎‎‎‏‎‏‏‎‎‎‎‏‎‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‎‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‎‏‎More‎‏‎‎‏‎"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‎‎‏‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎Show more‎‏‎‎‏‎"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‏‏‏‎‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎Updated ‎‏‎‎‏‏‎<xliff:g id="TIME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‏‎‏‏‎‎‏‎‏‎‏‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="ID_2">%d</xliff:g>‎‏‎‎‏‏‏‎ min ago‎‏‎‎‏‎</item>
+      <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‏‎‏‏‎‎‏‎‏‎‏‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="ID_1">%d</xliff:g>‎‏‎‎‏‏‏‎ min ago‎‏‎‎‏‎</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‏‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="ID_2">%d</xliff:g>‎‏‎‎‏‏‏‎ yr ago‎‏‎‎‏‎</item>
+      <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‏‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="ID_1">%d</xliff:g>‎‏‎‎‏‏‏‎ yr ago‎‏‎‎‏‎</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‎‎‏‏‎‎‎‏‎‎‎‎‎‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="ID_2">%d</xliff:g>‎‏‎‎‏‏‏‎ days ago‎‏‎‎‏‎</item>
+      <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‎‎‏‏‎‎‎‏‎‎‎‎‎‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="ID_1">%d</xliff:g>‎‏‎‎‏‏‏‎ day ago‎‏‎‎‏‎</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‎‏‎‏‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‎‎‏‏‎‎‏‏‎‎‏‎‏‎‏‏‏‎‏‏‎‏‎‏‎‎‎‎Couldn\'t connect‎‏‎‎‏‎"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-es-rUS/strings.xml b/slices/view/src/main/res/values-es-rUS/strings.xml
index a445505..3125104 100644
--- a/slices/view/src/main/res/values-es-rUS/strings.xml
+++ b/slices/view/src/main/res/values-es-rUS/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"<xliff:g id="NUMBER">%1$d</xliff:g> más"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Más"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Mostrar más"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Última actualización: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other">Hace <xliff:g id="ID_2">%d</xliff:g> min</item>
+      <item quantity="one">Hace <xliff:g id="ID_1">%d</xliff:g> min</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other">Hace <xliff:g id="ID_2">%d</xliff:g> años</item>
+      <item quantity="one">Hace <xliff:g id="ID_1">%d</xliff:g> año</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other">Hace <xliff:g id="ID_2">%d</xliff:g> días</item>
+      <item quantity="one">Hace <xliff:g id="ID_1">%d</xliff:g> día</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"No se pudo establecer conexión"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-es/strings.xml b/slices/view/src/main/res/values-es/strings.xml
index dcdd33e..f6e42fc 100644
--- a/slices/view/src/main/res/values-es/strings.xml
+++ b/slices/view/src/main/res/values-es/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"<xliff:g id="NUMBER">%1$d</xliff:g> más"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Más"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Ver más"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Última actualización: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other">hace <xliff:g id="ID_2">%d</xliff:g> minutos</item>
+      <item quantity="one">hace <xliff:g id="ID_1">%d</xliff:g> minuto</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other">hace <xliff:g id="ID_2">%d</xliff:g> años</item>
+      <item quantity="one">hace <xliff:g id="ID_1">%d</xliff:g> año</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other">hace <xliff:g id="ID_2">%d</xliff:g> días</item>
+      <item quantity="one">hace <xliff:g id="ID_1">%d</xliff:g> día</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"No se ha podido establecer la conexión"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-et/strings.xml b/slices/view/src/main/res/values-et/strings.xml
index a1675ff..7e053e9 100644
--- a/slices/view/src/main/res/values-et/strings.xml
+++ b/slices/view/src/main/res/values-et/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"ja veel <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Rohkem"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Kuva rohkem"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Värskendatud kell <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> min tagasi</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> min tagasi</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> a tagasi</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> a tagasi</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> päeva tagasi</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> päev tagasi</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Ühendamine ebaõnnestus"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-eu/strings.xml b/slices/view/src/main/res/values-eu/strings.xml
index 1c79d4a..5e0642c 100644
--- a/slices/view/src/main/res/values-eu/strings.xml
+++ b/slices/view/src/main/res/values-eu/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"Beste <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Gehiago"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Erakutsi gehiago"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Azken eguneratzea: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other">Duela <xliff:g id="ID_2">%d</xliff:g> minutu</item>
+      <item quantity="one">Duela <xliff:g id="ID_1">%d</xliff:g> minutu</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other">Duela <xliff:g id="ID_2">%d</xliff:g> urte</item>
+      <item quantity="one">Duela <xliff:g id="ID_1">%d</xliff:g> urte</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other">Duela <xliff:g id="ID_2">%d</xliff:g> egun</item>
+      <item quantity="one">Duela <xliff:g id="ID_1">%d</xliff:g> egun</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Ezin izan da konektatu"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-fa/strings.xml b/slices/view/src/main/res/values-fa/strings.xml
index 2b2abd2..7832e8a 100644
--- a/slices/view/src/main/res/values-fa/strings.xml
+++ b/slices/view/src/main/res/values-fa/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"‎+ <xliff:g id="NUMBER">%1$d</xliff:g>‎"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"بیشتر"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"بیشتر ببینید"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"زمان به‌روزرسانی <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> دقیقه قبل</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> دقیقه قبل</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> سال قبل</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> سال قبل</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> روز قبل</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> روز قبل</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"متصل نشد"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-fi/strings.xml b/slices/view/src/main/res/values-fi/strings.xml
index ea5ab25..dbbe0cd 100644
--- a/slices/view/src/main/res/values-fi/strings.xml
+++ b/slices/view/src/main/res/values-fi/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Lisää"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Näytä lisää"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Päivitetty <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> min sitten</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> min sitten</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> vuotta sitten</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> vuosi sitten</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> päivää sitten</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> päivä sitten</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Ei yhteyttä"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-fr-rCA/strings.xml b/slices/view/src/main/res/values-fr-rCA/strings.xml
index ea5ab25..63c7fcd 100644
--- a/slices/view/src/main/res/values-fr-rCA/strings.xml
+++ b/slices/view/src/main/res/values-fr-rCA/strings.xml
@@ -17,5 +17,21 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Plus"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Plus"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Mise à jour : <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one">Il y a <xliff:g id="ID_2">%d</xliff:g> minute</item>
+      <item quantity="other">Il y a <xliff:g id="ID_2">%d</xliff:g> minutes</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one">Il y a <xliff:g id="ID_2">%d</xliff:g> an</item>
+      <item quantity="other">Il y a <xliff:g id="ID_2">%d</xliff:g> ans</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one">Il y a <xliff:g id="ID_2">%d</xliff:g> jour</item>
+      <item quantity="other">Il y a <xliff:g id="ID_2">%d</xliff:g> jours</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Impossible de se connecter"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-fr/strings.xml b/slices/view/src/main/res/values-fr/strings.xml
index 73685ce..47ff242 100644
--- a/slices/view/src/main/res/values-fr/strings.xml
+++ b/slices/view/src/main/res/values-fr/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"<xliff:g id="NUMBER">%1$d</xliff:g> autres"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Plus"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Afficher plus"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Dernière mise à jour : <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one">Il y a <xliff:g id="ID_2">%d</xliff:g> minute</item>
+      <item quantity="other">Il y a <xliff:g id="ID_2">%d</xliff:g> minutes</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one">Il y a <xliff:g id="ID_2">%d</xliff:g> an</item>
+      <item quantity="other">Il y a <xliff:g id="ID_2">%d</xliff:g> ans</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one">Il y a <xliff:g id="ID_2">%d</xliff:g> jour</item>
+      <item quantity="other">Il y a <xliff:g id="ID_2">%d</xliff:g> jours</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Impossible de se connecter"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-gl/strings.xml b/slices/view/src/main/res/values-gl/strings.xml
index 573eae9..fb3d1c2 100644
--- a/slices/view/src/main/res/values-gl/strings.xml
+++ b/slices/view/src/main/res/values-gl/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"<xliff:g id="NUMBER">%1$d</xliff:g> máis"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Máis"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Amosar máis"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Contido actualizado (<xliff:g id="TIME">%1$s</xliff:g>)"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other">hai <xliff:g id="ID_2">%d</xliff:g> min</item>
+      <item quantity="one">hai <xliff:g id="ID_1">%d</xliff:g> min</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other">hai <xliff:g id="ID_2">%d</xliff:g> anos</item>
+      <item quantity="one">hai <xliff:g id="ID_1">%d</xliff:g> ano</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other">hai <xliff:g id="ID_2">%d</xliff:g> días</item>
+      <item quantity="one">hai <xliff:g id="ID_1">%d</xliff:g> día</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Non se puido establecer conexión"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-gu/strings.xml b/slices/view/src/main/res/values-gu/strings.xml
index ea5ab25..4951f8c 100644
--- a/slices/view/src/main/res/values-gu/strings.xml
+++ b/slices/view/src/main/res/values-gu/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"વધુ"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"વધુ બતાવો"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g> અપડેટ થયું"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> મિનિટ પહેલાં</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> મિનિટ પહેલાં</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> વર્ષ પહેલાં</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> વર્ષ પહેલાં</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> દિવસ પહેલાં</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> દિવસ પહેલાં</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"કનેક્ટ કરી શકાયું નથી"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-hi/strings.xml b/slices/view/src/main/res/values-hi/strings.xml
index ea5ab25..79a64bb 100644
--- a/slices/view/src/main/res/values-hi/strings.xml
+++ b/slices/view/src/main/res/values-hi/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"ज़्यादा देखें"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"ज़्यादा देखें"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g> बजे अपडेट किया गया"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> मिनट पहले</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> मिनट पहले</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> साल पहले</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> साल पहले</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> दिन पहले</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> दिन पहले</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"कनेक्‍ट नहीं हो पाया"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-hr/strings.xml b/slices/view/src/main/res/values-hr/strings.xml
index 7ecedf6..f44b06c 100644
--- a/slices/view/src/main/res/values-hr/strings.xml
+++ b/slices/view/src/main/res/values-hr/strings.xml
@@ -18,4 +18,23 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"još <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Više"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Prikaži više"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Ažurirano <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one">Prije <xliff:g id="ID_2">%d</xliff:g> min</item>
+      <item quantity="few">Prije <xliff:g id="ID_2">%d</xliff:g> min</item>
+      <item quantity="other">Prije <xliff:g id="ID_2">%d</xliff:g> min</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one">Prije <xliff:g id="ID_2">%d</xliff:g> godinu</item>
+      <item quantity="few">Prije <xliff:g id="ID_2">%d</xliff:g> godine</item>
+      <item quantity="other">Prije <xliff:g id="ID_2">%d</xliff:g> godina</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one">Prije <xliff:g id="ID_2">%d</xliff:g> dan</item>
+      <item quantity="few">Prije <xliff:g id="ID_2">%d</xliff:g> dana</item>
+      <item quantity="other">Prije <xliff:g id="ID_2">%d</xliff:g> dana</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Povezivanje nije moguće"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-hu/strings.xml b/slices/view/src/main/res/values-hu/strings.xml
index ea5ab25..cf5ebdc 100644
--- a/slices/view/src/main/res/values-hu/strings.xml
+++ b/slices/view/src/main/res/values-hu/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Több"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Több megjelenítése"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Frissítve: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> perce</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> perce</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> éve</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> éve</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> napja</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> napja</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Nem sikerült kapcsolódni"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-hy/strings.xml b/slices/view/src/main/res/values-hy/strings.xml
index ea5ab25..fcf96af 100644
--- a/slices/view/src/main/res/values-hy/strings.xml
+++ b/slices/view/src/main/res/values-hy/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Ավելին"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Ցուցադրել ավելի շատ"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Թարմացվել է <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> րոպե առաջ</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> րոպե առաջ</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> տարի առաջ</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> տարի առաջ</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> օր առաջ</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> օր առաջ</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Չհաջողվեց միանալ"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-in/strings.xml b/slices/view/src/main/res/values-in/strings.xml
index ea5ab25..5641ebb 100644
--- a/slices/view/src/main/res/values-in/strings.xml
+++ b/slices/view/src/main/res/values-in/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Lainnya"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Tampilkan lainnya"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Diupdate <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> menit lalu</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> menit lalu</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> tahun lalu</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> tahun lalu</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> hari lalu</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> hari lalu</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Tidak dapat terhubung"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-is/strings.xml b/slices/view/src/main/res/values-is/strings.xml
index ea5ab25..855a858 100644
--- a/slices/view/src/main/res/values-is/strings.xml
+++ b/slices/view/src/main/res/values-is/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Meira"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Sýna meira"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Uppfært <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one">Fyrir <xliff:g id="ID_2">%d</xliff:g> mín.</item>
+      <item quantity="other">Fyrir <xliff:g id="ID_2">%d</xliff:g> mín.</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one">Fyrir <xliff:g id="ID_2">%d</xliff:g> ári</item>
+      <item quantity="other">Fyrir <xliff:g id="ID_2">%d</xliff:g> árum</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one">Fyrir <xliff:g id="ID_2">%d</xliff:g> degi</item>
+      <item quantity="other">Fyrir <xliff:g id="ID_2">%d</xliff:g> dögum</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Tenging mistókst"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-it/strings.xml b/slices/view/src/main/res/values-it/strings.xml
index ea5ab25..d2f7a39 100644
--- a/slices/view/src/main/res/values-it/strings.xml
+++ b/slices/view/src/main/res/values-it/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Altro"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Mostra altro"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Aggiornamento: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> min fa</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> min fa</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> anni fa</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> anno fa</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> gg fa</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> g fa</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Impossibile collegarsi"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-iw/strings.xml b/slices/view/src/main/res/values-iw/strings.xml
index ea5ab25..db052e3 100644
--- a/slices/view/src/main/res/values-iw/strings.xml
+++ b/slices/view/src/main/res/values-iw/strings.xml
@@ -18,4 +18,26 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"עוד"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"הצג יותר"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"עודכן ב-<xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="two">לפני <xliff:g id="ID_2">%d</xliff:g> דק’</item>
+      <item quantity="many">לפני <xliff:g id="ID_2">%d</xliff:g> דק’</item>
+      <item quantity="other">לפני <xliff:g id="ID_2">%d</xliff:g> דק’</item>
+      <item quantity="one">לפני <xliff:g id="ID_1">%d</xliff:g> דק’</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="two">לפני <xliff:g id="ID_2">%d</xliff:g> שנים</item>
+      <item quantity="many">לפני <xliff:g id="ID_2">%d</xliff:g> שנים</item>
+      <item quantity="other">לפני <xliff:g id="ID_2">%d</xliff:g> שנים</item>
+      <item quantity="one">לפני שנה (<xliff:g id="ID_1">%d</xliff:g>)</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="two">לפני <xliff:g id="ID_2">%d</xliff:g> ימים</item>
+      <item quantity="many">לפני <xliff:g id="ID_2">%d</xliff:g> ימים</item>
+      <item quantity="other">לפני <xliff:g id="ID_2">%d</xliff:g> ימים</item>
+      <item quantity="one">לפני יום אחד (<xliff:g id="ID_1">%d</xliff:g>)</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"לא ניתן היה להתחבר"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-ja/strings.xml b/slices/view/src/main/res/values-ja/strings.xml
index ed51803..4d21cdf 100644
--- a/slices/view/src/main/res/values-ja/strings.xml
+++ b/slices/view/src/main/res/values-ja/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"他 <xliff:g id="NUMBER">%1$d</xliff:g> 件"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"もっと見る"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"もっと見る"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"更新時刻: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> 分前</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> 分前</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> 年前</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> 年前</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> 日前</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> 日前</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"接続できませんでした"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-ka/strings.xml b/slices/view/src/main/res/values-ka/strings.xml
index ea5ab25..9b8558c 100644
--- a/slices/view/src/main/res/values-ka/strings.xml
+++ b/slices/view/src/main/res/values-ka/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"მეტი"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"მეტის ჩვენება"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"განახლების დრო: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> წუთის წინ</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> წუთის წინ</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> წლის წინ</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> წლის წინ</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> დღის წინ</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> დღის წინ</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"დაკავშირება ვერ მოხერხდა"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-kk/strings.xml b/slices/view/src/main/res/values-kk/strings.xml
index ea5ab25..72b0303 100644
--- a/slices/view/src/main/res/values-kk/strings.xml
+++ b/slices/view/src/main/res/values-kk/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Тағы"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Толығырақ көрсету"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Жаңартылған уақыты: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> минут бұрын</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> минут бұрын</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> жыл бұрын</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> жыл бұрын</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> күн бұрын</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> күн бұрын</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Байланыс орнатылмады"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-km/strings.xml b/slices/view/src/main/res/values-km/strings.xml
index ea5ab25..1e78acb 100644
--- a/slices/view/src/main/res/values-km/strings.xml
+++ b/slices/view/src/main/res/values-km/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"ច្រើន​ទៀត"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"បង្ហាញ​ច្រើនទៀត"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"បាន​ធ្វើ​បច្ចុប្បន្នភាព​កាលពី <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> នាទី​មុន</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> នាទី​មុន</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ឆ្នាំ​មុន</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> ឆ្នាំ​មុន</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ថ្ងៃ​មុន</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> ថ្ងៃ​មុន</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"មិន​អាចភ្ជាប់​បានទេ"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-kn/strings.xml b/slices/view/src/main/res/values-kn/strings.xml
index ea5ab25..ed7dcd6 100644
--- a/slices/view/src/main/res/values-kn/strings.xml
+++ b/slices/view/src/main/res/values-kn/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"ಇನ್ನಷ್ಟು"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"ಹೆಚ್ಚು ತೋರಿಸಿ"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g> ಅನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಲಾಗಿದೆ"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> ನಿಮಿಷದ ಹಿಂದೆ</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ನಿಮಿಷದ ಹಿಂದೆ</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> ವರ್ಷದ ಹಿಂದೆ</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ವರ್ಷದ ಹಿಂದೆ</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> ದಿನಗಳ ಹಿಂದೆ</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ದಿನಗಳ ಹಿಂದೆ</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-ko/strings.xml b/slices/view/src/main/res/values-ko/strings.xml
index 2dc0279..4dab983 100644
--- a/slices/view/src/main/res/values-ko/strings.xml
+++ b/slices/view/src/main/res/values-ko/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"<xliff:g id="NUMBER">%1$d</xliff:g>개 더보기"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"더보기"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"더보기"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g>에 업데이트됨"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g>분 전</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g>분 전</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g>년 전</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g>년 전</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g>일 전</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g>일 전</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"연결할 수 없음"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-ky/strings.xml b/slices/view/src/main/res/values-ky/strings.xml
index ea5ab25..63c7d13 100644
--- a/slices/view/src/main/res/values-ky/strings.xml
+++ b/slices/view/src/main/res/values-ky/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Дагы"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Дагы көрсөтүү"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g> жаңыртылды"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> мүн. мурун</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> мүн. мурун</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> жыл мурун</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> жыл мурун</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> күн мурун</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> күн мурун</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Туташпай койду"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-lo/strings.xml b/slices/view/src/main/res/values-lo/strings.xml
index ea5ab25..89c4291 100644
--- a/slices/view/src/main/res/values-lo/strings.xml
+++ b/slices/view/src/main/res/values-lo/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"ເພີ່ມເຕີມ"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"ສະແດງເພີ່ມເຕີມ"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"ອັບເດດເມື່ອ <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ນທ ກ່ອນ</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> ນທ ກ່ອນ</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ປີກ່ອນ</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> ປີກ່ອນ</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ມື້ກ່ອນ</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> ມື້ກ່ອນ</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"ບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-lt/strings.xml b/slices/view/src/main/res/values-lt/strings.xml
index bb6bcb3..e4094b4 100644
--- a/slices/view/src/main/res/values-lt/strings.xml
+++ b/slices/view/src/main/res/values-lt/strings.xml
@@ -18,4 +18,26 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"Dar <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Daugiau"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Rodyti daugiau"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Atnaujinta <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one">Prieš <xliff:g id="ID_2">%d</xliff:g> min.</item>
+      <item quantity="few">Prieš <xliff:g id="ID_2">%d</xliff:g> min.</item>
+      <item quantity="many">Prieš <xliff:g id="ID_2">%d</xliff:g> min.</item>
+      <item quantity="other">Prieš <xliff:g id="ID_2">%d</xliff:g> min.</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one">Prieš <xliff:g id="ID_2">%d</xliff:g> m.</item>
+      <item quantity="few">Prieš <xliff:g id="ID_2">%d</xliff:g> m.</item>
+      <item quantity="many">Prieš <xliff:g id="ID_2">%d</xliff:g> m.</item>
+      <item quantity="other">Prieš <xliff:g id="ID_2">%d</xliff:g> m.</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one">Prieš <xliff:g id="ID_2">%d</xliff:g> d.</item>
+      <item quantity="few">Prieš <xliff:g id="ID_2">%d</xliff:g> d.</item>
+      <item quantity="many">Prieš <xliff:g id="ID_2">%d</xliff:g> d.</item>
+      <item quantity="other">Prieš <xliff:g id="ID_2">%d</xliff:g> d.</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Prisijungti nepavyko"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-lv/strings.xml b/slices/view/src/main/res/values-lv/strings.xml
index 79ccb99..45be57c 100644
--- a/slices/view/src/main/res/values-lv/strings.xml
+++ b/slices/view/src/main/res/values-lv/strings.xml
@@ -18,4 +18,23 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"Vēl <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Vēl"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Rādīt vairāk"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Atjaunināts <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="zero">Pirms <xliff:g id="ID_2">%d</xliff:g> minūtēm</item>
+      <item quantity="one">Pirms <xliff:g id="ID_2">%d</xliff:g> minūtes</item>
+      <item quantity="other">Pirms <xliff:g id="ID_2">%d</xliff:g> minūtēm</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="zero">Pirms <xliff:g id="ID_2">%d</xliff:g> gadiem</item>
+      <item quantity="one">Pirms <xliff:g id="ID_2">%d</xliff:g> gada</item>
+      <item quantity="other">Pirms <xliff:g id="ID_2">%d</xliff:g> gadiem</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="zero">Pirms <xliff:g id="ID_2">%d</xliff:g> dienām</item>
+      <item quantity="one">Pirms <xliff:g id="ID_2">%d</xliff:g> dienas</item>
+      <item quantity="other">Pirms <xliff:g id="ID_2">%d</xliff:g> dienām</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Nevarēja izveidot savienojumu"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-mk/strings.xml b/slices/view/src/main/res/values-mk/strings.xml
index ea5ab25..ff88cd7 100644
--- a/slices/view/src/main/res/values-mk/strings.xml
+++ b/slices/view/src/main/res/values-mk/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Повеќе"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Прикажи повеќе"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Ажурирано <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one">Пред <xliff:g id="ID_2">%d</xliff:g> мин.</item>
+      <item quantity="other">Пред <xliff:g id="ID_2">%d</xliff:g> мин.</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one">Пред <xliff:g id="ID_2">%d</xliff:g> год.</item>
+      <item quantity="other">Пред <xliff:g id="ID_2">%d</xliff:g> год.</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one">Пред <xliff:g id="ID_2">%d</xliff:g> ден</item>
+      <item quantity="other">Пред <xliff:g id="ID_2">%d</xliff:g> дена</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Не може да се поврзе"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-ml/strings.xml b/slices/view/src/main/res/values-ml/strings.xml
index ea5ab25..b67ae80 100644
--- a/slices/view/src/main/res/values-ml/strings.xml
+++ b/slices/view/src/main/res/values-ml/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"കൂടുതൽ"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"കൂടുതൽ കാണിക്കുക"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g> അപ്‌ഡേറ്റ് ചെയ്‌തു"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> മിനിറ്റ് മുൻപ്</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> മിനിറ്റ് മുൻപ്</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> വർഷം മുൻപ്</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> വർഷം മുൻപ്</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ദിവസം മുൻപ്</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> ദിവസം മുൻപ്</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"കണക്റ്റ് ചെയ്യാനായില്ല"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-mn/strings.xml b/slices/view/src/main/res/values-mn/strings.xml
index ea5ab25..52a5d1a 100644
--- a/slices/view/src/main/res/values-mn/strings.xml
+++ b/slices/view/src/main/res/values-mn/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Бусад"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Дэлгэрэнгүй үзэх"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g> шинэчилсэн"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> минутын өмнө</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> минутын өмнө</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> жилийн өмнө</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> жилийн өмнө</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> өдрийн өмнө</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> өдрийн өмнө</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Холбогдож чадсангүй"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-mr/strings.xml b/slices/view/src/main/res/values-mr/strings.xml
index ea5ab25..80aa0a7 100644
--- a/slices/view/src/main/res/values-mr/strings.xml
+++ b/slices/view/src/main/res/values-mr/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"आणखी"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"आणखी दाखवा"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g> ला अपडेट केले"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> मिनिटापूर्वी</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> मिनिटांपूर्वी</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> वर्षापूर्वी</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> वर्षांपूर्वी</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> दिवसापूर्वी</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> दिवसांपूर्वी</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"कनेक्ट करता आले नाही"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-ms/strings.xml b/slices/view/src/main/res/values-ms/strings.xml
index ea5ab25..576b8df 100644
--- a/slices/view/src/main/res/values-ms/strings.xml
+++ b/slices/view/src/main/res/values-ms/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Lagi"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Tunjukkan lagi"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Dikemas kini pada <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> min yang lalu</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> min yang lalu</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> thn yang lalu</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> thn yang lalu</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> hari yang lalu</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> hari yang lalu</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Tidak dapat menyambung"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-my/strings.xml b/slices/view/src/main/res/values-my/strings.xml
index ea5ab25..4a3e3d4 100644
--- a/slices/view/src/main/res/values-my/strings.xml
+++ b/slices/view/src/main/res/values-my/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"နောက်ထပ်"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"နောက်ထပ် ပြပါ"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g> က အပ်ဒိတ်လုပ်ထားသည်"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other">ပြီးခဲ့သော<xliff:g id="ID_2">%d</xliff:g>မိနစ်</item>
+      <item quantity="one">ပြီးခဲ့သော<xliff:g id="ID_1">%d</xliff:g>မိနစ်</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other">ပြီးခဲ့သော <xliff:g id="ID_2">%d</xliff:g>နှစ်</item>
+      <item quantity="one">ပြီးခဲ့သော <xliff:g id="ID_1">%d</xliff:g>နှစ်</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other">ပြီးခဲ့သော <xliff:g id="ID_2">%d</xliff:g> ရက်</item>
+      <item quantity="one">ပြီးခဲ့သော <xliff:g id="ID_1">%d</xliff:g> ရက်</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"ချိတ်ဆက်၍ မရပါ"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-nb/strings.xml b/slices/view/src/main/res/values-nb/strings.xml
index ea5ab25..3fad9c4 100644
--- a/slices/view/src/main/res/values-nb/strings.xml
+++ b/slices/view/src/main/res/values-nb/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Mer"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Vis mer"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Oppdatert <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other">For <xliff:g id="ID_2">%d</xliff:g> min. siden</item>
+      <item quantity="one">For <xliff:g id="ID_1">%d</xliff:g> min. siden</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other">For <xliff:g id="ID_2">%d</xliff:g> år siden</item>
+      <item quantity="one">For <xliff:g id="ID_1">%d</xliff:g> år siden</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other">For <xliff:g id="ID_2">%d</xliff:g> dager siden</item>
+      <item quantity="one">For <xliff:g id="ID_1">%d</xliff:g> dag siden</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Kunne ikke koble til"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-ne/strings.xml b/slices/view/src/main/res/values-ne/strings.xml
index ea5ab25..beb8b31 100644
--- a/slices/view/src/main/res/values-ne/strings.xml
+++ b/slices/view/src/main/res/values-ne/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"थप"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"थप देखाउनुहोस्"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"अद्यावधिक गरिएको समय: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> मिनेटअघि</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> मिनेटअघि</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> वर्षअघि</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> वर्षअघि</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> दिनअघि</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> दिनअघि</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"जडान गर्न सकिएन"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-nl/strings.xml b/slices/view/src/main/res/values-nl/strings.xml
index ea5ab25..b5d2edc 100644
--- a/slices/view/src/main/res/values-nl/strings.xml
+++ b/slices/view/src/main/res/values-nl/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Meer"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Meer weergeven"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Geüpdatet: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> min geleden</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> min geleden</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> jaar geleden</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> jaar geleden</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> dagen geleden</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> dag geleden</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Kan geen verbinding maken"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-or/strings.xml b/slices/view/src/main/res/values-or/strings.xml
new file mode 100644
index 0000000..6bf6019
--- /dev/null
+++ b/slices/view/src/main/res/values-or/strings.xml
@@ -0,0 +1,37 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"ଅଧିକ"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"ଅଧିକ ଦେଖାନ୍ତୁ"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g>ରେ ଅପଡେଟ୍ ହୋଇଥିଲା"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ମିନିଟ୍ ପୂର୍ବେ</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> ମିନିଟ୍ ପୂର୍ବେ</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ବର୍ଷ ପୂର୍ବେ</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> ବର୍ଷ ପୂର୍ବେ</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ଦିନ ପୂର୍ବେ</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> ଦିନ ପୂର୍ବେ</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"କନେକ୍ଟ ହେଲାନାହିଁ"</string>
+</resources>
diff --git a/slices/view/src/main/res/values-pa/strings.xml b/slices/view/src/main/res/values-pa/strings.xml
index ea5ab25..e588aac 100644
--- a/slices/view/src/main/res/values-pa/strings.xml
+++ b/slices/view/src/main/res/values-pa/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"ਹੋਰ"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"ਹੋਰ ਦਿਖਾਓ"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g> ਅੱਪਡੇਟ ਕੀਤੀ ਗਈ"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> ਮਿੰਟ ਪਹਿਲਾਂ</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ਮਿੰਟ ਪਹਿਲਾਂ</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> ਸਾਲ ਪਹਿਲਾਂ</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ਸਾਲ ਪਹਿਲਾਂ</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> ਦਿਨ ਪਹਿਲਾਂ</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ਦਿਨ ਪਹਿਲਾਂ</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-pl/strings.xml b/slices/view/src/main/res/values-pl/strings.xml
index 9d9bede..c5300ca 100644
--- a/slices/view/src/main/res/values-pl/strings.xml
+++ b/slices/view/src/main/res/values-pl/strings.xml
@@ -18,4 +18,26 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Więcej"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Pokaż więcej"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Aktualizacja: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="few"><xliff:g id="ID_2">%d</xliff:g> min temu</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> min temu</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> min temu</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> min temu</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="few"><xliff:g id="ID_2">%d</xliff:g> lata temu</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> lat temu</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> roku temu</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> rok temu</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="few"><xliff:g id="ID_2">%d</xliff:g> dni temu</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> dni temu</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> dnia temu</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> dzień temu</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Nie udało się połączyć"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-pt-rBR/strings.xml b/slices/view/src/main/res/values-pt-rBR/strings.xml
index 629ba48..79cc7b7 100644
--- a/slices/view/src/main/res/values-pt-rBR/strings.xml
+++ b/slices/view/src/main/res/values-pt-rBR/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"Mais <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Mais"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Mostrar mais"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Atualizado às <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> min atrás</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> min atrás</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> ano atrás</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> anos atrás</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> dia atrás</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> dias atrás</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Não foi possível conectar"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-pt-rPT/strings.xml b/slices/view/src/main/res/values-pt-rPT/strings.xml
index ea5ab25..b81ec60 100644
--- a/slices/view/src/main/res/values-pt-rPT/strings.xml
+++ b/slices/view/src/main/res/values-pt-rPT/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Mais"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Mostrar mais"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Atualizado: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other">Há <xliff:g id="ID_2">%d</xliff:g> minutos.</item>
+      <item quantity="one">Há <xliff:g id="ID_1">%d</xliff:g> minuto.</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other">Há <xliff:g id="ID_2">%d</xliff:g> anos.</item>
+      <item quantity="one">Há <xliff:g id="ID_1">%d</xliff:g> ano.</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other">Há <xliff:g id="ID_2">%d</xliff:g> dias.</item>
+      <item quantity="one">Há <xliff:g id="ID_1">%d</xliff:g> dia.</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Não foi possível ligar."</string>
 </resources>
diff --git a/slices/view/src/main/res/values-pt/strings.xml b/slices/view/src/main/res/values-pt/strings.xml
index 629ba48..79cc7b7 100644
--- a/slices/view/src/main/res/values-pt/strings.xml
+++ b/slices/view/src/main/res/values-pt/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"Mais <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Mais"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Mostrar mais"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Atualizado às <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> min atrás</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> min atrás</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> ano atrás</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> anos atrás</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> dia atrás</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> dias atrás</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Não foi possível conectar"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-ro/strings.xml b/slices/view/src/main/res/values-ro/strings.xml
index ea5ab25..9ff89d0 100644
--- a/slices/view/src/main/res/values-ro/strings.xml
+++ b/slices/view/src/main/res/values-ro/strings.xml
@@ -18,4 +18,23 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Mai mult"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Vedeți mai multe"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Actualizat la <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="few">acum <xliff:g id="ID_2">%d</xliff:g> min.</item>
+      <item quantity="other">acum <xliff:g id="ID_2">%d</xliff:g> de min.</item>
+      <item quantity="one">acum <xliff:g id="ID_1">%d</xliff:g> min.</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="few">acum <xliff:g id="ID_2">%d</xliff:g> ani</item>
+      <item quantity="other">acum <xliff:g id="ID_2">%d</xliff:g> de ani</item>
+      <item quantity="one">acum <xliff:g id="ID_1">%d</xliff:g> an</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="few">acum <xliff:g id="ID_2">%d</xliff:g> zile</item>
+      <item quantity="other">acum <xliff:g id="ID_2">%d</xliff:g> de zile</item>
+      <item quantity="one">acum <xliff:g id="ID_1">%d</xliff:g> zi</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Nu s-a putut conecta"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-ru/strings.xml b/slices/view/src/main/res/values-ru/strings.xml
index 9d9bede..85953aa 100644
--- a/slices/view/src/main/res/values-ru/strings.xml
+++ b/slices/view/src/main/res/values-ru/strings.xml
@@ -18,4 +18,26 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Ещё"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Ещё"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Обновлено <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> мин. назад</item>
+      <item quantity="few"><xliff:g id="ID_2">%d</xliff:g> мин. назад</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> мин. назад</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> мин. назад</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> г. назад</item>
+      <item quantity="few"><xliff:g id="ID_2">%d</xliff:g> г. назад</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> лет назад</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> г. назад</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> дн. назад</item>
+      <item quantity="few"><xliff:g id="ID_2">%d</xliff:g> дн. назад</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> дн. назад</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> дн. назад</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Ошибка подключения"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-si/strings.xml b/slices/view/src/main/res/values-si/strings.xml
index ea5ab25..cfd7685 100644
--- a/slices/view/src/main/res/values-si/strings.xml
+++ b/slices/view/src/main/res/values-si/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"තව"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"තව පෙන්වන්න"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g> යාවත්කාලීන කරන ලදී"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one">මිනි <xliff:g id="ID_2">%d</xliff:g>කට පෙර</item>
+      <item quantity="other">මිනි <xliff:g id="ID_2">%d</xliff:g>කට පෙර</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one">වසර <xliff:g id="ID_2">%d</xliff:g>කට පෙර</item>
+      <item quantity="other">වසර <xliff:g id="ID_2">%d</xliff:g>කට පෙර</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one">දින <xliff:g id="ID_2">%d</xliff:g>කට පෙර</item>
+      <item quantity="other">දින <xliff:g id="ID_2">%d</xliff:g>කට පෙර</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"සම්බන්ධ වීමට නොහැකි විය"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-sk/strings.xml b/slices/view/src/main/res/values-sk/strings.xml
index ea5ab25..76bed58 100644
--- a/slices/view/src/main/res/values-sk/strings.xml
+++ b/slices/view/src/main/res/values-sk/strings.xml
@@ -18,4 +18,26 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Viac"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Zobraziť viac"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Aktualizované <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="few">pred <xliff:g id="ID_2">%d</xliff:g> min</item>
+      <item quantity="many">pred <xliff:g id="ID_2">%d</xliff:g> min</item>
+      <item quantity="other">pred <xliff:g id="ID_2">%d</xliff:g> min</item>
+      <item quantity="one">pred <xliff:g id="ID_1">%d</xliff:g> min</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="few">pred <xliff:g id="ID_2">%d</xliff:g> rokmi</item>
+      <item quantity="many">pred <xliff:g id="ID_2">%d</xliff:g> roka</item>
+      <item quantity="other">pred <xliff:g id="ID_2">%d</xliff:g> rokmi</item>
+      <item quantity="one">pred <xliff:g id="ID_1">%d</xliff:g> rokom</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="few">pred <xliff:g id="ID_2">%d</xliff:g> dňami</item>
+      <item quantity="many">pred <xliff:g id="ID_2">%d</xliff:g> dňa</item>
+      <item quantity="other">pred <xliff:g id="ID_2">%d</xliff:g> dňami</item>
+      <item quantity="one">pred <xliff:g id="ID_1">%d</xliff:g> dňom</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Nepodarilo sa pripojiť"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-sl/strings.xml b/slices/view/src/main/res/values-sl/strings.xml
index 59bf101..0389500 100644
--- a/slices/view/src/main/res/values-sl/strings.xml
+++ b/slices/view/src/main/res/values-sl/strings.xml
@@ -18,4 +18,26 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"in še <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Več"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Pokaži več"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Posodobljeno: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one">pred <xliff:g id="ID_2">%d</xliff:g> minuto</item>
+      <item quantity="two">pred <xliff:g id="ID_2">%d</xliff:g> minutama</item>
+      <item quantity="few">pred <xliff:g id="ID_2">%d</xliff:g> minutami</item>
+      <item quantity="other">pred <xliff:g id="ID_2">%d</xliff:g> minutami</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one">pred <xliff:g id="ID_2">%d</xliff:g> letom</item>
+      <item quantity="two">pred <xliff:g id="ID_2">%d</xliff:g> letoma</item>
+      <item quantity="few">pred <xliff:g id="ID_2">%d</xliff:g> leti</item>
+      <item quantity="other">pred <xliff:g id="ID_2">%d</xliff:g> leti</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one">pred <xliff:g id="ID_2">%d</xliff:g> dnem</item>
+      <item quantity="two">pred <xliff:g id="ID_2">%d</xliff:g> dnevoma</item>
+      <item quantity="few">pred <xliff:g id="ID_2">%d</xliff:g> dnevi</item>
+      <item quantity="other">pred <xliff:g id="ID_2">%d</xliff:g> dnevi</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Povezava ni mogoča"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-sq/strings.xml b/slices/view/src/main/res/values-sq/strings.xml
index ea5ab25..0359c86 100644
--- a/slices/view/src/main/res/values-sq/strings.xml
+++ b/slices/view/src/main/res/values-sq/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Më shumë"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Shfaq më shumë"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Përditësuar <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> minuta më parë</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> minutë më parë</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> vite më parë</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> vit më parë</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ditë më parë</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> ditë më parë</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Nuk mund të lidhej"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-sr/strings.xml b/slices/view/src/main/res/values-sr/strings.xml
index a66220a..718f3d7 100644
--- a/slices/view/src/main/res/values-sr/strings.xml
+++ b/slices/view/src/main/res/values-sr/strings.xml
@@ -18,4 +18,23 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"и још <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Још"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Прикажи више"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Ажурирано <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one">пре <xliff:g id="ID_2">%d</xliff:g> мин</item>
+      <item quantity="few">пре <xliff:g id="ID_2">%d</xliff:g> мин</item>
+      <item quantity="other">пре <xliff:g id="ID_2">%d</xliff:g> мин</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one">пре <xliff:g id="ID_2">%d</xliff:g> год</item>
+      <item quantity="few">пре <xliff:g id="ID_2">%d</xliff:g> год</item>
+      <item quantity="other">пре <xliff:g id="ID_2">%d</xliff:g> год</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one">пре <xliff:g id="ID_2">%d</xliff:g> дан</item>
+      <item quantity="few">пре <xliff:g id="ID_2">%d</xliff:g> дана</item>
+      <item quantity="other">пре <xliff:g id="ID_2">%d</xliff:g> дана</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Повезивање није успело"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-sv/strings.xml b/slices/view/src/main/res/values-sv/strings.xml
index cbcec4f..90caa1a 100644
--- a/slices/view/src/main/res/values-sv/strings.xml
+++ b/slices/view/src/main/res/values-sv/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"<xliff:g id="NUMBER">%1$d</xliff:g> till"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Mer"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Visa mer"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Uppdaterades <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> minuter sedan</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> minut sedan</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> år sedan</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> år sedan</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> dagar sedan</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> dag sedan</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Det gick inte att ansluta"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-sw/strings.xml b/slices/view/src/main/res/values-sw/strings.xml
index ea5ab25..609c51f 100644
--- a/slices/view/src/main/res/values-sw/strings.xml
+++ b/slices/view/src/main/res/values-sw/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Mengine"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Onyesha mengine"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Ilisasishwa <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other">Dakika <xliff:g id="ID_2">%d</xliff:g> zilizopita</item>
+      <item quantity="one">Dakika <xliff:g id="ID_1">%d</xliff:g> iliyopita</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other">Miaka <xliff:g id="ID_2">%d</xliff:g> iliyopita</item>
+      <item quantity="one">Mwaka <xliff:g id="ID_1">%d</xliff:g> uliopita</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other">Siku <xliff:g id="ID_2">%d</xliff:g> zilizopita</item>
+      <item quantity="one">Siku <xliff:g id="ID_1">%d</xliff:g> iliyopita</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Imeshindwa kuunganisha"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-ta/strings.xml b/slices/view/src/main/res/values-ta/strings.xml
index ea5ab25..778218e 100644
--- a/slices/view/src/main/res/values-ta/strings.xml
+++ b/slices/view/src/main/res/values-ta/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"மேலும்"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"மேலும் காட்டு"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"புதுப்பித்தது: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> நிமி. முன்</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> நிமி. முன்</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ஆண்டிற்கு முன்</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> ஆண்டிற்கு முன்</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> நாளுக்கு முன்</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> நாளுக்கு முன்</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"இணைக்க முடியவில்லை"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-te/strings.xml b/slices/view/src/main/res/values-te/strings.xml
index ea5ab25..82137b8 100644
--- a/slices/view/src/main/res/values-te/strings.xml
+++ b/slices/view/src/main/res/values-te/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"మరింత"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"మరింత చూపు"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"అప్‌డేట్ చేసిన సమయం <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> నిమి క్రితం</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> నిమి క్రితం</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> సం క్రితం</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> సం క్రితం</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> రోజుల క్రితం</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> రోజు క్రితం</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"కనెక్ట్ చేయడం సాధ్యపడలేదు"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-th/strings.xml b/slices/view/src/main/res/values-th/strings.xml
index ea5ab25..3ae19da 100644
--- a/slices/view/src/main/res/values-th/strings.xml
+++ b/slices/view/src/main/res/values-th/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"เพิ่มเติม"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"แสดงเพิ่ม"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"อัปเดตเมื่อ <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> นาทีที่แล้ว</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> นาทีที่แล้ว</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ปีที่แล้ว</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> ปีที่แล้ว</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> วันที่แล้ว</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> วันที่แล้ว</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"เชื่อมต่อไม่ได้"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-tl/strings.xml b/slices/view/src/main/res/values-tl/strings.xml
index ea5ab25..2e76a1a 100644
--- a/slices/view/src/main/res/values-tl/strings.xml
+++ b/slices/view/src/main/res/values-tl/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Higit pa"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Magpakita pa"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Na-update noong <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> min ang nakalipas</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> na min ang nakalipas</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> taon ang nakalipas</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> na taon ang nakalipas</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> araw ang nakalipas</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> na araw ang nakalipas</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Hindi makakonekta"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-tr/strings.xml b/slices/view/src/main/res/values-tr/strings.xml
index ea5ab25..84da5fb 100644
--- a/slices/view/src/main/res/values-tr/strings.xml
+++ b/slices/view/src/main/res/values-tr/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Diğer"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Daha fazla göster"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Güncellenme zamanı: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> dk. önce</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> dk. önce</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> yıl önce</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> yıl önce</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> gün önce</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> gün önce</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Bağlanılamadı"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-uk/strings.xml b/slices/view/src/main/res/values-uk/strings.xml
index ea5ab25..0706d80 100644
--- a/slices/view/src/main/res/values-uk/strings.xml
+++ b/slices/view/src/main/res/values-uk/strings.xml
@@ -18,4 +18,26 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Більше"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Показати більше"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Оновлено: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> хвилину тому</item>
+      <item quantity="few"><xliff:g id="ID_2">%d</xliff:g> хвилини тому</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> хвилин тому</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> хвилини тому</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> рік тому</item>
+      <item quantity="few"><xliff:g id="ID_2">%d</xliff:g> роки тому</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> років тому</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> року тому</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> день тому</item>
+      <item quantity="few"><xliff:g id="ID_2">%d</xliff:g> дні тому</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> днів тому</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> дня тому</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Не вдалося під’єднатися"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-ur/strings.xml b/slices/view/src/main/res/values-ur/strings.xml
index ce427c0..1fff81c 100644
--- a/slices/view/src/main/res/values-ur/strings.xml
+++ b/slices/view/src/main/res/values-ur/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"‎‎‎‎‎+ <xliff:g id="NUMBER">%1$d</xliff:g>‎‎"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"مزید"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"مزید دکھائیں"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"<xliff:g id="TIME">%1$s</xliff:g> اپ ڈیٹ کیا گیا"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> منٹ پہلے</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> منٹ پہلے</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> سال پہلے</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> سال پہلے</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> دن پہلے</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> دن پہلے</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"منسلک نہیں ہو سکا"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-uz/strings.xml b/slices/view/src/main/res/values-uz/strings.xml
index ea5ab25..0a973cd 100644
--- a/slices/view/src/main/res/values-uz/strings.xml
+++ b/slices/view/src/main/res/values-uz/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Yana"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Yana"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Yangilandi: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> daqiqa oldin</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> daqiqa oldin</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> yil oldin</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> yil oldin</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> kun oldin</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> kun oldin</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Ulanib bo‘lmadi"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-vi/strings.xml b/slices/view/src/main/res/values-vi/strings.xml
index ea5ab25..1e71db6 100644
--- a/slices/view/src/main/res/values-vi/strings.xml
+++ b/slices/view/src/main/res/values-vi/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Thêm"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Hiển thị thêm"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Đã cập nhật lúc <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> phút trước</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> phút trước</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> năm trước</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> năm trước</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> ngày trước</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> ngày trước</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Không thể kết nối"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-zh-rCN/strings.xml b/slices/view/src/main/res/values-zh-rCN/strings.xml
index ea5ab25..c018343 100644
--- a/slices/view/src/main/res/values-zh-rCN/strings.xml
+++ b/slices/view/src/main/res/values-zh-rCN/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"更多"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"显示更多"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"更新时间:<xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> 分钟前</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> 分钟前</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> 年前</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> 年前</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> 天前</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> 天前</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"无法连接"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-zh-rHK/strings.xml b/slices/view/src/main/res/values-zh-rHK/strings.xml
index ea5ab25..d1ac276 100644
--- a/slices/view/src/main/res/values-zh-rHK/strings.xml
+++ b/slices/view/src/main/res/values-zh-rHK/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"更多"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"顯示更多"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"更新時間:<xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> 分鐘前</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> 分鐘前</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> 年前</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> 年前</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> 天前</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> 天前</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"無法連線"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-zh-rTW/strings.xml b/slices/view/src/main/res/values-zh-rTW/strings.xml
index ea5ab25..d1ac276 100644
--- a/slices/view/src/main/res/values-zh-rTW/strings.xml
+++ b/slices/view/src/main/res/values-zh-rTW/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"更多"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"顯示更多"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"更新時間:<xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> 分鐘前</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> 分鐘前</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> 年前</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> 年前</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> 天前</item>
+      <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> 天前</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"無法連線"</string>
 </resources>
diff --git a/slices/view/src/main/res/values-zu/strings.xml b/slices/view/src/main/res/values-zu/strings.xml
index ea5ab25..966bb1b 100644
--- a/slices/view/src/main/res/values-zu/strings.xml
+++ b/slices/view/src/main/res/values-zu/strings.xml
@@ -18,4 +18,20 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
+    <string name="abc_slice_more" msgid="1983560225998630901">"Okuningi"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"Bonisa okuningi"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"Kubuyekezwe ngo-<xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> iminithi eledlule</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> iminithi eledlule</item>
+    </plurals>
+    <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> unyaka owedlule</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> unyaka owedlule</item>
+    </plurals>
+    <plurals name="abc_slice_duration_days" formatted="false" msgid="6241698511167107334">
+      <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> izinsuku ezedlule</item>
+      <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> izinsuku ezedlule</item>
+    </plurals>
+    <string name="abc_slice_error" msgid="4188371422904147368">"Ayikwazanga ukuxhuma"</string>
 </resources>
diff --git a/testutils-ktx/NO_DOCS b/testutils-ktx/NO_DOCS
new file mode 100644
index 0000000..4dad694
--- /dev/null
+++ b/testutils-ktx/NO_DOCS
@@ -0,0 +1,17 @@
+# 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.
+
+Having this file, named NO_DOCS, in a directory will prevent
+Android javadocs from being generated for java files under
+the directory. This is especially useful for test projects.
diff --git a/testutils-ktx/OWNERS b/testutils-ktx/OWNERS
new file mode 100644
index 0000000..e450f4c
--- /dev/null
+++ b/testutils-ktx/OWNERS
@@ -0,0 +1 @@
+jakew@google.com
diff --git a/testutils-ktx/build.gradle b/testutils-ktx/build.gradle
new file mode 100644
index 0000000..5f33da1
--- /dev/null
+++ b/testutils-ktx/build.gradle
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+    id("SupportKotlinLibraryPlugin")
+}
+
+dependencies {
+    compile(KOTLIN_STDLIB)
+    compile(TRUTH)
+}
diff --git a/testutils-ktx/src/main/java/androidx/testutils/assertions.kt b/testutils-ktx/src/main/java/androidx/testutils/assertions.kt
new file mode 100644
index 0000000..b67948a
--- /dev/null
+++ b/testutils-ktx/src/main/java/androidx/testutils/assertions.kt
@@ -0,0 +1,34 @@
+/*
+ * 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.testutils
+
+import com.google.common.truth.ThrowableSubject
+import com.google.common.truth.Truth.assertThat
+
+inline fun <reified T : Throwable> assertThrows(body: () -> Unit): ThrowableSubject {
+    try {
+        body()
+    } catch (e: Throwable) {
+        if (e is T) {
+            return assertThat(e)
+        }
+        throw e
+    }
+    throw AssertionError("Body completed successfully. Expected ${T::class.java.simpleName}.")
+}
+
+fun fail(message: String? = null): Nothing = throw AssertionError(message)
diff --git a/v7/appcompat/res/values-af/strings.xml b/v7/appcompat/res/values-af/strings.xml
index 15ed3b2..b7dd9bc 100644
--- a/v7/appcompat/res/values-af/strings.xml
+++ b/v7/appcompat/res/values-af/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"AAN"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"AF"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Soek"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Kieslys+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Simbool+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Funksie+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"spasiebalk"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-am/strings.xml b/v7/appcompat/res/values-am/strings.xml
index 42bbc06..485ffad 100644
--- a/v7/appcompat/res/values-am/strings.xml
+++ b/v7/appcompat/res/values-am/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"በርቷል"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ጠፍቷል"</string>
     <string name="search_menu_title" msgid="146198913615257606">"ፈልግ"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"ምናሌ+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"ሰርዝ"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ar/strings.xml b/v7/appcompat/res/values-ar/strings.xml
index 3278162..a7683ce 100644
--- a/v7/appcompat/res/values-ar/strings.xml
+++ b/v7/appcompat/res/values-ar/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"تشغيل"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"إيقاف"</string>
     <string name="search_menu_title" msgid="146198913615257606">"البحث"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"القائمة+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-as/strings.xml b/v7/appcompat/res/values-as/strings.xml
index 1f90618..a3574d7 100644
--- a/v7/appcompat/res/values-as/strings.xml
+++ b/v7/appcompat/res/values-as/strings.xml
@@ -29,13 +29,19 @@
     <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>
-    <!-- no translation found for abc_shareactionprovider_share_with_application (3300176832234831527) -->
-    <skip />
+    <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>
-    <!-- no translation found for abc_capital_on (3405795526292276155) -->
-    <skip />
-    <!-- no translation found for abc_capital_off (121134116657445385) -->
-    <skip />
-    <!-- no translation found for search_menu_title (146198913615257606) -->
-    <skip />
+    <string name="abc_capital_on" msgid="3405795526292276155">"অন কৰক"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"অফ কৰক"</string>
+    <string name="search_menu_title" msgid="146198913615257606">"অনুসন্ধান কৰক"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"মেনু+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"মেটা+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"CTRL+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"শ্বিফ্ট+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"ফাংশ্বন+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"স্পেচ"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"এণ্টাৰ"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"মচক"</string>
 </resources>
diff --git a/v7/appcompat/res/values-az/strings.xml b/v7/appcompat/res/values-az/strings.xml
index 29e00dd..aae3b94 100644
--- a/v7/appcompat/res/values-az/strings.xml
+++ b/v7/appcompat/res/values-az/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"AKTİV"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DEAKTİV"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Axtarış"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menyu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Funksiya+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"kosmos"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"daxil olun"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"silin"</string>
 </resources>
diff --git a/v7/appcompat/res/values-b+sr+Latn/strings.xml b/v7/appcompat/res/values-b+sr+Latn/strings.xml
index c3462f6..734525b 100644
--- a/v7/appcompat/res/values-b+sr+Latn/strings.xml
+++ b/v7/appcompat/res/values-b+sr+Latn/strings.xml
@@ -34,4 +34,14 @@
     <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>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"taster za razmak"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-be/strings.xml b/v7/appcompat/res/values-be/strings.xml
index 99ee19f..f04076a 100644
--- a/v7/appcompat/res/values-be/strings.xml
+++ b/v7/appcompat/res/values-be/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"УКЛ."</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ВЫКЛ."</string>
     <string name="search_menu_title" msgid="146198913615257606">"Пошук"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Меню +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Fn +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"Прабел"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-bg/strings.xml b/v7/appcompat/res/values-bg/strings.xml
index 1d37d0d..2c607a1 100644
--- a/v7/appcompat/res/values-bg/strings.xml
+++ b/v7/appcompat/res/values-bg/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ВКЛ."</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ИЗКЛ."</string>
     <string name="search_menu_title" msgid="146198913615257606">"Търсене"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"клавиша за интервал"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-bn/strings.xml b/v7/appcompat/res/values-bn/strings.xml
index 2ea7591..a6be993 100644
--- a/v7/appcompat/res/values-bn/strings.xml
+++ b/v7/appcompat/res/values-bn/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"চালু"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"বন্ধ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"খুঁজুন"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"মেনু+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"স্পেস"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"মুছুন"</string>
 </resources>
diff --git a/v7/appcompat/res/values-bs/strings.xml b/v7/appcompat/res/values-bs/strings.xml
index 07d1411..5100cbf 100644
--- a/v7/appcompat/res/values-bs/strings.xml
+++ b/v7/appcompat/res/values-bs/strings.xml
@@ -20,7 +20,7 @@
     <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Vrati se na početnu stranicu"</string>
     <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navigiraj prema gore"</string>
     <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Više opcija"</string>
-    <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Skupi"</string>
+    <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Suzi"</string>
     <string name="abc_searchview_description_search" msgid="8264924765203268293">"Traži"</string>
     <string name="abc_search_hint" msgid="7723749260725869598">"Pretraži..."</string>
     <string name="abc_searchview_description_query" msgid="2550479030709304392">"Pretraži upit"</string>
@@ -34,4 +34,14 @@
     <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>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"razmaknica"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ca/strings.xml b/v7/appcompat/res/values-ca/strings.xml
index 03ebec3..c4f3b4d 100644
--- a/v7/appcompat/res/values-ca/strings.xml
+++ b/v7/appcompat/res/values-ca/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAT"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVAT"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Cerca"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menú+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Maj+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Funció+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"Espai"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Retorn"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Supr"</string>
 </resources>
diff --git a/v7/appcompat/res/values-cs/strings.xml b/v7/appcompat/res/values-cs/strings.xml
index 05cd4e0..9111883 100644
--- a/v7/appcompat/res/values-cs/strings.xml
+++ b/v7/appcompat/res/values-cs/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ZAPNUTO"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"VYPNUTO"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Hledat"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Fn+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"mezerník"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-da/strings.xml b/v7/appcompat/res/values-da/strings.xml
index 813885a..f05e142 100644
--- a/v7/appcompat/res/values-da/strings.xml
+++ b/v7/appcompat/res/values-da/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"TIL"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"FRA"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Søg"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Fn+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"mellemrum"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-de/strings.xml b/v7/appcompat/res/values-de/strings.xml
index 0b57259..fb0dd6a 100644
--- a/v7/appcompat/res/values-de/strings.xml
+++ b/v7/appcompat/res/values-de/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"An"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"Aus"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Suchen"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menütaste +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta-Taste +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Strg +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Umschalttaste +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym-Taste +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Funktionstaste +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"Leertaste +"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Eingabetaste"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Löschen"</string>
 </resources>
diff --git a/v7/appcompat/res/values-el/strings.xml b/v7/appcompat/res/values-el/strings.xml
index ec7a666..b7da605 100644
--- a/v7/appcompat/res/values-el/strings.xml
+++ b/v7/appcompat/res/values-el/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Αναζήτηση"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"διάστημα"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-en-rAU/strings.xml b/v7/appcompat/res/values-en-rAU/strings.xml
index a4d048c..a315670 100644
--- a/v7/appcompat/res/values-en-rAU/strings.xml
+++ b/v7/appcompat/res/values-en-rAU/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Search"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-en-rCA/strings.xml b/v7/appcompat/res/values-en-rCA/strings.xml
index a4d048c..a315670 100644
--- a/v7/appcompat/res/values-en-rCA/strings.xml
+++ b/v7/appcompat/res/values-en-rCA/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Search"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-en-rGB/strings.xml b/v7/appcompat/res/values-en-rGB/strings.xml
index a4d048c..a315670 100644
--- a/v7/appcompat/res/values-en-rGB/strings.xml
+++ b/v7/appcompat/res/values-en-rGB/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Search"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-en-rIN/strings.xml b/v7/appcompat/res/values-en-rIN/strings.xml
index a4d048c..a315670 100644
--- a/v7/appcompat/res/values-en-rIN/strings.xml
+++ b/v7/appcompat/res/values-en-rIN/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Search"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-en-rXC/strings.xml b/v7/appcompat/res/values-en-rXC/strings.xml
index b1d5f93..2e8e581 100644
--- a/v7/appcompat/res/values-en-rXC/strings.xml
+++ b/v7/appcompat/res/values-en-rXC/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‎‎‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‎ON‎‏‎‎‏‎"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‎‎‏‏‎‎‎‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‎OFF‎‏‎‎‏‎"</string>
     <string name="search_menu_title" msgid="146198913615257606">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‏‏‎‎‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎‏‎‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‎‏‏‎‎Search‎‏‎‎‏‎"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‎‏‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‏‎‎‎‏‏‎‏‎Menu+‎‏‎‎‏‎"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‏‎‏‏‎‏‎‎‎‎‎‏‏‎‎‎‎‎‎‏‏‎‎‏‎‏‎‎‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‏‎Meta+‎‏‎‎‏‎"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‎‏‎‏‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‎‏‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‎‎‎‎Ctrl+‎‏‎‎‏‎"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‏‎‎‏‎‏‎‏‎‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‎Alt+‎‏‎‎‏‎"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‎‏‏‎‎‏‏‏‎‏‎‎‏‏‎‎‎‎‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‎‎‏‎‎‎‏‏‏‎‏‎‎‎Shift+‎‏‎‎‏‎"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‏‎‎‎‎‎‎‏‎Sym+‎‏‎‎‏‎"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‎‎‎‏‏‏‎‏‎‎‎‎‎‏‏‎‏‏‏‎‎‏‏‎‏‏‎‎‎‎‏‎‏‎‎‏‏‎Function+‎‏‎‎‏‎"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‎‎‎‏‎‎‏‎‎‏‏‏‏‎‏‏‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎space‎‏‎‎‏‎"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‏‏‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‏‏‎‎‎enter‎‏‎‎‏‎"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‎‎‏‎‎‎‎‏‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‎‎‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‎‎‎‎‎‏‏‎‎delete‎‏‎‎‏‎"</string>
 </resources>
diff --git a/v7/appcompat/res/values-es-rUS/strings.xml b/v7/appcompat/res/values-es-rUS/strings.xml
index 0cc8a70..5d58df0 100644
--- a/v7/appcompat/res/values-es-rUS/strings.xml
+++ b/v7/appcompat/res/values-es-rUS/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVADO"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVADO"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Buscar"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menú+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Mayúscula+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Función+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"espacio"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"intro"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"borrar"</string>
 </resources>
diff --git a/v7/appcompat/res/values-es/strings.xml b/v7/appcompat/res/values-es/strings.xml
index 3e0828b..5238229 100644
--- a/v7/appcompat/res/values-es/strings.xml
+++ b/v7/appcompat/res/values-es/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVADO"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVADO"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Buscar"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menú +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Mayús +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Función +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"Espacio"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Intro"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Eliminar"</string>
 </resources>
diff --git a/v7/appcompat/res/values-et/strings.xml b/v7/appcompat/res/values-et/strings.xml
index 3a3dcbf..b944f77 100644
--- a/v7/appcompat/res/values-et/strings.xml
+++ b/v7/appcompat/res/values-et/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"SEES"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"VÄLJAS"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Otsing"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menüü +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Tõstuklahv +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Funktsiooniklahv +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"tühik"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"sisestusklahv"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"kustutamisklahv"</string>
 </resources>
diff --git a/v7/appcompat/res/values-eu/strings.xml b/v7/appcompat/res/values-eu/strings.xml
index a651036..5a45e61 100644
--- a/v7/appcompat/res/values-eu/strings.xml
+++ b/v7/appcompat/res/values-eu/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"AKTIBATUTA"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESAKTIBATUTA"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Bilatu"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menua +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ktrl +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Maius +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Funtzioa +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"Zuriunea"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Sartu"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Ezabatu"</string>
 </resources>
diff --git a/v7/appcompat/res/values-fa/strings.xml b/v7/appcompat/res/values-fa/strings.xml
index 9b844b0..35e6596 100644
--- a/v7/appcompat/res/values-fa/strings.xml
+++ b/v7/appcompat/res/values-fa/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"روشن"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"خاموش"</string>
     <string name="search_menu_title" msgid="146198913615257606">"جستجو"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"منو+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"‎Meta+‎"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"‎Ctrl+‎"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"‎Alt+‎"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"‎Shift+‎"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"‎Sym+‎"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"‎Function+‎"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"کلید فاصله"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-fi/strings.xml b/v7/appcompat/res/values-fi/strings.xml
index e9bd952..829b6bb 100644
--- a/v7/appcompat/res/values-fi/strings.xml
+++ b/v7/appcompat/res/values-fi/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"KÄYTÖSSÄ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"POIS KÄYTÖSTÄ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Haku"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Valikko+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Vaihto+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Fn+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"välilyönti"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-fr-rCA/strings.xml b/v7/appcompat/res/values-fr-rCA/strings.xml
index a3e763b..9e83462 100644
--- a/v7/appcompat/res/values-fr-rCA/strings.xml
+++ b/v7/appcompat/res/values-fr-rCA/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVÉ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DÉSACTIVÉ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Rechercher"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Méta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Maj+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Fonction+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"espace"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"entrée"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"supprimer"</string>
 </resources>
diff --git a/v7/appcompat/res/values-fr/strings.xml b/v7/appcompat/res/values-fr/strings.xml
index 1e412ec..5df86b5 100644
--- a/v7/appcompat/res/values-fr/strings.xml
+++ b/v7/appcompat/res/values-fr/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVÉ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DÉSACTIVÉ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Rechercher"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Méta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Maj+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Fonction+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"espace"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"entrée"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"supprimer"</string>
 </resources>
diff --git a/v7/appcompat/res/values-gl/strings.xml b/v7/appcompat/res/values-gl/strings.xml
index 2af80a1..c500af5 100644
--- a/v7/appcompat/res/values-gl/strings.xml
+++ b/v7/appcompat/res/values-gl/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAR"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVAR"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Buscar"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menú +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Maiús +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sim +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Función +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"espazo"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Intro"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"eliminar"</string>
 </resources>
diff --git a/v7/appcompat/res/values-gu/strings.xml b/v7/appcompat/res/values-gu/strings.xml
index 7a243ed..390d59b 100644
--- a/v7/appcompat/res/values-gu/strings.xml
+++ b/v7/appcompat/res/values-gu/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>
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ચાલુ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"બંધ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"શોધો"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"મેનૂ+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"Spacebar"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"ડિલીટ કરો"</string>
 </resources>
diff --git a/v7/appcompat/res/values-hi/strings.xml b/v7/appcompat/res/values-hi/strings.xml
index a31ab90..8a29110 100644
--- a/v7/appcompat/res/values-hi/strings.xml
+++ b/v7/appcompat/res/values-hi/strings.xml
@@ -21,7 +21,7 @@
     <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>
+    <string name="abc_searchview_description_search" msgid="8264924765203268293">"खोजें"</string>
     <string name="abc_search_hint" msgid="7723749260725869598">"खोजा जा रहा है…"</string>
     <string name="abc_searchview_description_query" msgid="2550479030709304392">"सर्च क्वेरी"</string>
     <string name="abc_searchview_description_clear" msgid="3691816814315814921">"क्‍वेरी साफ़ करें"</string>
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"चालू"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"बंद"</string>
     <string name="search_menu_title" msgid="146198913615257606">"सर्च"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-hr/strings.xml b/v7/appcompat/res/values-hr/strings.xml
index 27a1c2e..9253fb9 100644
--- a/v7/appcompat/res/values-hr/strings.xml
+++ b/v7/appcompat/res/values-hr/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"UKLJUČENO"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ISKLJUČENO"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Pretraživanje"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"razmaknica"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-hu/strings.xml b/v7/appcompat/res/values-hu/strings.xml
index d3e413f..714ef47 100644
--- a/v7/appcompat/res/values-hu/strings.xml
+++ b/v7/appcompat/res/values-hu/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"BE"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"KI"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Keresés"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"Szóköz"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-hy/strings.xml b/v7/appcompat/res/values-hy/strings.xml
index 1c41ef6..59c9ee5 100644
--- a/v7/appcompat/res/values-hy/strings.xml
+++ b/v7/appcompat/res/values-hy/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ՄԻԱՑՎԱԾ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ԱՆՋԱՏՎԱԾ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Որոնել"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"բացատ"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-in/strings.xml b/v7/appcompat/res/values-in/strings.xml
index 2e9fbb7..1ae3f90 100644
--- a/v7/appcompat/res/values-in/strings.xml
+++ b/v7/appcompat/res/values-in/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"AKTIF"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"NONAKTIF"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Telusuri"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"spasi"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-is/strings.xml b/v7/appcompat/res/values-is/strings.xml
index 3f61d84..3ae59da 100644
--- a/v7/appcompat/res/values-is/strings.xml
+++ b/v7/appcompat/res/values-is/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"KVEIKT"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"SLÖKKT"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Leita"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Valmynd+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Aðgerðarlykill+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"bilslá"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-it/strings.xml b/v7/appcompat/res/values-it/strings.xml
index fbd2c58..04b64ce 100644
--- a/v7/appcompat/res/values-it/strings.xml
+++ b/v7/appcompat/res/values-it/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Ricerca"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"MENU +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"META +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"CTRL +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"ALT +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"MAIUSC +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"SYM +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"FUNZIONE +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"barra spaziatrice"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"INVIO"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"CANC"</string>
 </resources>
diff --git a/v7/appcompat/res/values-iw/strings.xml b/v7/appcompat/res/values-iw/strings.xml
index 0a7d0bb..d0f2211 100644
--- a/v7/appcompat/res/values-iw/strings.xml
+++ b/v7/appcompat/res/values-iw/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"פועל"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"כבוי"</string>
     <string name="search_menu_title" msgid="146198913615257606">"חיפוש"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"תפריט+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+‎"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"מקש רווח"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ja/strings.xml b/v7/appcompat/res/values-ja/strings.xml
index c4d0e20..db163f3 100644
--- a/v7/appcompat/res/values-ja/strings.xml
+++ b/v7/appcompat/res/values-ja/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
     <string name="search_menu_title" msgid="146198913615257606">"検索"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"Space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ka/strings.xml b/v7/appcompat/res/values-ka/strings.xml
index 3b077a3..6d9c08b 100644
--- a/v7/appcompat/res/values-ka/strings.xml
+++ b/v7/appcompat/res/values-ka/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ჩართულია"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"გამორთულია"</string>
     <string name="search_menu_title" msgid="146198913615257606">"ძიება"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"შეყვანა"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"წაშლა"</string>
 </resources>
diff --git a/v7/appcompat/res/values-kk/strings.xml b/v7/appcompat/res/values-kk/strings.xml
index c32045b..9d206bc 100644
--- a/v7/appcompat/res/values-kk/strings.xml
+++ b/v7/appcompat/res/values-kk/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ҚОСУЛЫ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ӨШІРУЛІ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Іздеу"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Mәзір+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"бос орын"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-km/strings.xml b/v7/appcompat/res/values-km/strings.xml
index ffe289a..f42da7a 100644
--- a/v7/appcompat/res/values-km/strings.xml
+++ b/v7/appcompat/res/values-km/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"បើក"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"បិទ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"ស្វែងរក"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-kn/strings.xml b/v7/appcompat/res/values-kn/strings.xml
index 4218bd6..ce28303 100644
--- a/v7/appcompat/res/values-kn/strings.xml
+++ b/v7/appcompat/res/values-kn/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ಆನ್"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ಆಫ್"</string>
     <string name="search_menu_title" msgid="146198913615257606">"ಹುಡುಕಿ"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ko/strings.xml b/v7/appcompat/res/values-ko/strings.xml
index 6c84a2a..db0903f 100644
--- a/v7/appcompat/res/values-ko/strings.xml
+++ b/v7/appcompat/res/values-ko/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"사용"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"사용 안함"</string>
     <string name="search_menu_title" msgid="146198913615257606">"검색"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"스페이스바"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"입력"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"삭제"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ky/strings.xml b/v7/appcompat/res/values-ky/strings.xml
index 66202f7..1aba4f0 100644
--- a/v7/appcompat/res/values-ky/strings.xml
+++ b/v7/appcompat/res/values-ky/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"КҮЙҮК"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ӨЧҮК"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Издөө"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"боштук"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-lo/strings.xml b/v7/appcompat/res/values-lo/strings.xml
index 1b92df0..c53a987 100644
--- a/v7/appcompat/res/values-lo/strings.xml
+++ b/v7/appcompat/res/values-lo/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ເປີດ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ປິດ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"ຊອກຫາ"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-lt/strings.xml b/v7/appcompat/res/values-lt/strings.xml
index 5793069..ab9f25c 100644
--- a/v7/appcompat/res/values-lt/strings.xml
+++ b/v7/appcompat/res/values-lt/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ĮJUNGTI"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"IŠJUNGTA"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Paieška"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"„Menu“ +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"„Meta“ +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"„Ctrl“ +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"„Alt“ +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"„Shift“ +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"„Sym“ +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"„Function“ +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"tarpo klavišas"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"„Enter“"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"„Delete“"</string>
 </resources>
diff --git a/v7/appcompat/res/values-lv/strings.xml b/v7/appcompat/res/values-lv/strings.xml
index 67e18d3..67904a1 100644
--- a/v7/appcompat/res/values-lv/strings.xml
+++ b/v7/appcompat/res/values-lv/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"IESLĒGTS"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"IZSLĒGTS"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Meklēt"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Poga Izvēlne +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta taustiņš +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Vadīšanas taustiņš +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alternēšanas taustiņš +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Pārslēgšanas taustiņš +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Simbolu taustiņš +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Funkcijas taustiņš +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"atstarpes taustiņš"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"ievadīšanas taustiņš"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"dzēšanas taustiņš"</string>
 </resources>
diff --git a/v7/appcompat/res/values-mk/strings.xml b/v7/appcompat/res/values-mk/strings.xml
index b12a235..408edb1 100644
--- a/v7/appcompat/res/values-mk/strings.xml
+++ b/v7/appcompat/res/values-mk/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ВКЛУЧЕНО"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ИСКЛУЧЕНО"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Пребарај"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Мени+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"копче Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"копче Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"копче Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"копче Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"копче Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"копче Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"вселена"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"копче enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"избриши"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ml/strings.xml b/v7/appcompat/res/values-ml/strings.xml
index 9033f8a..e880ebb 100644
--- a/v7/appcompat/res/values-ml/strings.xml
+++ b/v7/appcompat/res/values-ml/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ഓൺ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ഓഫ്"</string>
     <string name="search_menu_title" msgid="146198913615257606">"തിരയുക"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"മെനു+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"മെറ്റ+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"ഫംഗ്ഷന്‍+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"സ്‌പെയ്‌സ്"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"ഇല്ലാതാക്കുക"</string>
 </resources>
diff --git a/v7/appcompat/res/values-mn/strings.xml b/v7/appcompat/res/values-mn/strings.xml
index 56036ea..856e9f6 100644
--- a/v7/appcompat/res/values-mn/strings.xml
+++ b/v7/appcompat/res/values-mn/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ИДЭВХТЭЙ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ИДЭВХГҮЙ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Хайлт"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Цэс+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Мета+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Функц+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"зай"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"оруулах"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"устгах"</string>
 </resources>
diff --git a/v7/appcompat/res/values-mr/strings.xml b/v7/appcompat/res/values-mr/strings.xml
index 26ada80..ed3463c 100644
--- a/v7/appcompat/res/values-mr/strings.xml
+++ b/v7/appcompat/res/values-mr/strings.xml
@@ -30,8 +30,18 @@
     <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" 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>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"मेनू+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"spacebar"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"एंटर करा"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"हटवा"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ms/strings.xml b/v7/appcompat/res/values-ms/strings.xml
index 18f84ce..8af4c13 100644
--- a/v7/appcompat/res/values-ms/strings.xml
+++ b/v7/appcompat/res/values-ms/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"HIDUP"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"MATI"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Cari"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Fungsi+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"ruang"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"padam"</string>
 </resources>
diff --git a/v7/appcompat/res/values-my/strings.xml b/v7/appcompat/res/values-my/strings.xml
index cbc8791..cfd6625 100644
--- a/v7/appcompat/res/values-my/strings.xml
+++ b/v7/appcompat/res/values-my/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ဖွင့်"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ပိတ်"</string>
     <string name="search_menu_title" msgid="146198913615257606">"ရှာဖွေပါ"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-nb/strings.xml b/v7/appcompat/res/values-nb/strings.xml
index 6005234..f9fd80e 100644
--- a/v7/appcompat/res/values-nb/strings.xml
+++ b/v7/appcompat/res/values-nb/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"PÅ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"AV"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Søk"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Meny+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Funksjon+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"mellomrom"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ne/strings.xml b/v7/appcompat/res/values-ne/strings.xml
index 96b1042..0a0de14 100644
--- a/v7/appcompat/res/values-ne/strings.xml
+++ b/v7/appcompat/res/values-ne/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"सक्रिय गर्नुहोस्"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"निष्क्रिय पार्नुहोस्"</string>
     <string name="search_menu_title" msgid="146198913615257606">"खोज्नुहोस्"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-nl/strings.xml b/v7/appcompat/res/values-nl/strings.xml
index e0d2044..ffcb3d9 100644
--- a/v7/appcompat/res/values-nl/strings.xml
+++ b/v7/appcompat/res/values-nl/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"AAN"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"UIT"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Zoeken"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Functie +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"spatie"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"verwijderen"</string>
 </resources>
diff --git a/v7/appcompat/res/values-or/strings.xml b/v7/appcompat/res/values-or/strings.xml
index 4dc6eb4..86e4fb7 100644
--- a/v7/appcompat/res/values-or/strings.xml
+++ b/v7/appcompat/res/values-or/strings.xml
@@ -29,13 +29,19 @@
     <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>
-    <!-- no translation found for abc_shareactionprovider_share_with_application (3300176832234831527) -->
-    <skip />
+    <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>
-    <!-- no translation found for abc_capital_on (3405795526292276155) -->
-    <skip />
-    <!-- no translation found for abc_capital_off (121134116657445385) -->
-    <skip />
-    <!-- no translation found for search_menu_title (146198913615257606) -->
-    <skip />
+    <string name="abc_capital_on" msgid="3405795526292276155">"ଅନ୍"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ଅଫ୍"</string>
+    <string name="search_menu_title" msgid="146198913615257606">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"ମେନୁ"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"ସ୍ପେସ୍‍"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"ଏଣ୍ଟର୍"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"ଡିଲିଟ୍‍"</string>
 </resources>
diff --git a/v7/appcompat/res/values-pa/strings.xml b/v7/appcompat/res/values-pa/strings.xml
index 7f28ac8..fc1fdba 100644
--- a/v7/appcompat/res/values-pa/strings.xml
+++ b/v7/appcompat/res/values-pa/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ਤੇ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ਬੰਦ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"ਖੋਜੋ"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-pl/strings.xml b/v7/appcompat/res/values-pl/strings.xml
index d706241..af26367 100644
--- a/v7/appcompat/res/values-pl/strings.xml
+++ b/v7/appcompat/res/values-pl/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"WŁ."</string>
     <string name="abc_capital_off" msgid="121134116657445385">"WYŁ."</string>
     <string name="search_menu_title" msgid="146198913615257606">"Szukaj"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Funkcyjny+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"spacja"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-pt-rBR/strings.xml b/v7/appcompat/res/values-pt-rBR/strings.xml
index 90461ec..17d8593 100644
--- a/v7/appcompat/res/values-pt-rBR/strings.xml
+++ b/v7/appcompat/res/values-pt-rBR/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ATIVAR"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESATIVAR"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Pesquisar"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"espaço"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-pt-rPT/strings.xml b/v7/appcompat/res/values-pt-rPT/strings.xml
index 40f6499..f8c0fa7 100644
--- a/v7/appcompat/res/values-pt-rPT/strings.xml
+++ b/v7/appcompat/res/values-pt-rPT/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ATIVADO"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESATIVADO"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Pesquisar"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Função +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"espaço"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"eliminar"</string>
 </resources>
diff --git a/v7/appcompat/res/values-pt/strings.xml b/v7/appcompat/res/values-pt/strings.xml
index 90461ec..17d8593 100644
--- a/v7/appcompat/res/values-pt/strings.xml
+++ b/v7/appcompat/res/values-pt/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ATIVAR"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESATIVAR"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Pesquisar"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"espaço"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ro/strings.xml b/v7/appcompat/res/values-ro/strings.xml
index 6d04be9..86495fd 100644
--- a/v7/appcompat/res/values-ro/strings.xml
+++ b/v7/appcompat/res/values-ro/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAT"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DEZACTIVAȚI"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Căutați"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Meniu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Funcție+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"spațiu"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ru/strings.xml b/v7/appcompat/res/values-ru/strings.xml
index 2b28958..c505bf5 100644
--- a/v7/appcompat/res/values-ru/strings.xml
+++ b/v7/appcompat/res/values-ru/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ВКЛ."</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ОТКЛ."</string>
     <string name="search_menu_title" msgid="146198913615257606">"Поиск"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Меню +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Fn +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"Пробел"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Ввод"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-si/strings.xml b/v7/appcompat/res/values-si/strings.xml
index 7631288..c154686 100644
--- a/v7/appcompat/res/values-si/strings.xml
+++ b/v7/appcompat/res/values-si/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ක්‍රියාත්මකයි"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ක්‍රියාවිරහිතයි"</string>
     <string name="search_menu_title" msgid="146198913615257606">"සොයන්න"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"මකන්න"</string>
 </resources>
diff --git a/v7/appcompat/res/values-sk/strings.xml b/v7/appcompat/res/values-sk/strings.xml
index 03faf14..67184b0 100644
--- a/v7/appcompat/res/values-sk/strings.xml
+++ b/v7/appcompat/res/values-sk/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ZAPNUTÉ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"VYPNUTÉ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Vyhľadávanie"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"medzerník"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"odstrániť"</string>
 </resources>
diff --git a/v7/appcompat/res/values-sl/strings.xml b/v7/appcompat/res/values-sl/strings.xml
index 22b8bd4..e38e5ea 100644
--- a/v7/appcompat/res/values-sl/strings.xml
+++ b/v7/appcompat/res/values-sl/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"VKLOPLJENO"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"IZKLOPLJENO"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Iskanje"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Meni +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Fn +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"preslednica"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-sq/strings.xml b/v7/appcompat/res/values-sq/strings.xml
index 1a1f02e..8b958a2 100644
--- a/v7/appcompat/res/values-sq/strings.xml
+++ b/v7/appcompat/res/values-sq/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"AKTIV"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"JOAKTIV"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Kërko"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menyja+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Funksioni+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"hapësirë"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-sr/strings.xml b/v7/appcompat/res/values-sr/strings.xml
index 5678341..4c702bc 100644
--- a/v7/appcompat/res/values-sr/strings.xml
+++ b/v7/appcompat/res/values-sr/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"УКЉУЧИ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ИСКЉУЧИ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Претражи"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"тастер за размак"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-sv/strings.xml b/v7/appcompat/res/values-sv/strings.xml
index 62d470f..72b7f88 100644
--- a/v7/appcompat/res/values-sv/strings.xml
+++ b/v7/appcompat/res/values-sv/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"PÅ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"AV"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Sök"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Meny + "</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta + "</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl + "</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt + "</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Skift + "</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Symbol + "</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Funktion + "</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"blanksteg"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"retur"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-sw/strings.xml b/v7/appcompat/res/values-sw/strings.xml
index c575ae0..1c623b7 100644
--- a/v7/appcompat/res/values-sw/strings.xml
+++ b/v7/appcompat/res/values-sw/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"IMEWASHWA"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"IMEZIMWA"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Tafuta"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menyu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"nafasi"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"futa"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ta/strings.xml b/v7/appcompat/res/values-ta/strings.xml
index 971a3db..7aa031a 100644
--- a/v7/appcompat/res/values-ta/strings.xml
+++ b/v7/appcompat/res/values-ta/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ஆன்"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ஆஃப்"</string>
     <string name="search_menu_title" msgid="146198913615257606">"தேடு"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"மெனு மற்றும்"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"மெட்டா மற்றும்"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"கண்ட்ரோல் மற்றும்"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"ஆல்ட் மற்றும்"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"ஷிஃப்ட் மற்றும்"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"சிம்பல் மற்றும்"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"ஃபங்ஷன் மற்றும்"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"ஸ்பேஸ்"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"எண்டர்"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"டெலிட்"</string>
 </resources>
diff --git a/v7/appcompat/res/values-te/strings.xml b/v7/appcompat/res/values-te/strings.xml
index f7d7577..818f0e3 100644
--- a/v7/appcompat/res/values-te/strings.xml
+++ b/v7/appcompat/res/values-te/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"ఆన్ చేయి"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ఆఫ్ చేయి"</string>
     <string name="search_menu_title" msgid="146198913615257606">"వెతుకు"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"స్పేస్"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-th/strings.xml b/v7/appcompat/res/values-th/strings.xml
index f8ea1cd..5ecec86 100644
--- a/v7/appcompat/res/values-th/strings.xml
+++ b/v7/appcompat/res/values-th/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"เปิด"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ปิด"</string>
     <string name="search_menu_title" msgid="146198913615257606">"ค้นหา"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"เมนู+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"Space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-tl/strings.xml b/v7/appcompat/res/values-tl/strings.xml
index 1ad2689..3ef5df6 100644
--- a/v7/appcompat/res/values-tl/strings.xml
+++ b/v7/appcompat/res/values-tl/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"I-ON"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"I-OFF"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Maghanap"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-tr/strings.xml b/v7/appcompat/res/values-tr/strings.xml
index fae41d3..153e2c2 100644
--- a/v7/appcompat/res/values-tr/strings.xml
+++ b/v7/appcompat/res/values-tr/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"AÇ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"KAPAT"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Ara"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menü+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Üst Karakter+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"İşlev+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"boşluk"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"sil"</string>
 </resources>
diff --git a/v7/appcompat/res/values-uk/strings.xml b/v7/appcompat/res/values-uk/strings.xml
index afc74ff..7aed219 100644
--- a/v7/appcompat/res/values-uk/strings.xml
+++ b/v7/appcompat/res/values-uk/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"УВІМК."</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ВИМК."</string>
     <string name="search_menu_title" msgid="146198913615257606">"Пошук"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"пробіл"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ur/strings.xml b/v7/appcompat/res/values-ur/strings.xml
index 60ec34a..997d594 100644
--- a/v7/appcompat/res/values-ur/strings.xml
+++ b/v7/appcompat/res/values-ur/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"آن"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"آف"</string>
     <string name="search_menu_title" msgid="146198913615257606">"تلاش"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+‎"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+‎"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+‎"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+‎"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+‎"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+‎"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+‎"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-uz/strings.xml b/v7/appcompat/res/values-uz/strings.xml
index 0417cba..f925bd6 100644
--- a/v7/appcompat/res/values-uz/strings.xml
+++ b/v7/appcompat/res/values-uz/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"YONIQ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"O‘CHIQ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Qidirish"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menyu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Fn+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"Probel"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-vi/strings.xml b/v7/appcompat/res/values-vi/strings.xml
index 4560b4b..e07efed 100644
--- a/v7/appcompat/res/values-vi/strings.xml
+++ b/v7/appcompat/res/values-vi/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"BẬT"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"TẮT"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Tìm kiếm"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"phím cách"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"delete"</string>
 </resources>
diff --git a/v7/appcompat/res/values-zh-rCN/strings.xml b/v7/appcompat/res/values-zh-rCN/strings.xml
index 7b23457..6dc1ea2 100644
--- a/v7/appcompat/res/values-zh-rCN/strings.xml
+++ b/v7/appcompat/res/values-zh-rCN/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"开启"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"关闭"</string>
     <string name="search_menu_title" msgid="146198913615257606">"搜索"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Fn+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"空格键"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Enter 键"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Delete 键"</string>
 </resources>
diff --git a/v7/appcompat/res/values-zh-rHK/strings.xml b/v7/appcompat/res/values-zh-rHK/strings.xml
index fc32117..ce753fd 100644
--- a/v7/appcompat/res/values-zh-rHK/strings.xml
+++ b/v7/appcompat/res/values-zh-rHK/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"開啟"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"關閉"</string>
     <string name="search_menu_title" msgid="146198913615257606">"搜尋"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Fn +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"空白鍵"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Enter 鍵"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"刪除"</string>
 </resources>
diff --git a/v7/appcompat/res/values-zh-rTW/strings.xml b/v7/appcompat/res/values-zh-rTW/strings.xml
index 35be873..0f29b8e 100644
--- a/v7/appcompat/res/values-zh-rTW/strings.xml
+++ b/v7/appcompat/res/values-zh-rTW/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"開啟"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"關閉"</string>
     <string name="search_menu_title" msgid="146198913615257606">"搜尋"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Menu +"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta +"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl +"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt +"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift +"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym +"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Fn +"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"空格鍵"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"Enter 鍵"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"Delete 鍵"</string>
 </resources>
diff --git a/v7/appcompat/res/values-zu/strings.xml b/v7/appcompat/res/values-zu/strings.xml
index e84ba7a..e3032f1 100644
--- a/v7/appcompat/res/values-zu/strings.xml
+++ b/v7/appcompat/res/values-zu/strings.xml
@@ -34,4 +34,14 @@
     <string name="abc_capital_on" msgid="3405795526292276155">"VULIWE"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"VALIWE"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Sesha"</string>
+    <string name="abc_prepend_shortcut_label" msgid="1351762916121158029">"Imenyu+"</string>
+    <string name="abc_menu_meta_shortcut_label" msgid="7643535737296831317">"Meta+"</string>
+    <string name="abc_menu_ctrl_shortcut_label" msgid="1324831542140195728">"Ctrl+"</string>
+    <string name="abc_menu_alt_shortcut_label" msgid="1302280443949172191">"Alt+"</string>
+    <string name="abc_menu_shift_shortcut_label" msgid="8126296154200614004">"Shift+"</string>
+    <string name="abc_menu_sym_shortcut_label" msgid="9002602288060866689">"Sym+"</string>
+    <string name="abc_menu_function_shortcut_label" msgid="4792426091847145555">"Function+"</string>
+    <string name="abc_menu_space_shortcut_label" msgid="2378550843553983978">"space"</string>
+    <string name="abc_menu_enter_shortcut_label" msgid="8341180395196749340">"enter"</string>
+    <string name="abc_menu_delete_shortcut_label" msgid="8362206064229013510">"susa"</string>
 </resources>
diff --git a/v7/appcompat/res/values/bools.xml b/v7/appcompat/res/values/bools.xml
index c38c0ee..793719b 100644
--- a/v7/appcompat/res/values/bools.xml
+++ b/v7/appcompat/res/values/bools.xml
@@ -18,8 +18,6 @@
 
     <bool name="abc_action_bar_embed_tabs">true</bool>
 
-    <bool name="abc_config_showMenuShortcutsWhenKeyboardPresent">false</bool>
-
     <!-- Whether to allow vertically stacked button bars. This is disabled for
          configurations with a small (e.g. less than 320dp) screen height. -->
     <bool name="abc_allow_stacked_button_bar">false</bool>
diff --git a/v7/appcompat/src/main/java/androidx/appcompat/view/menu/MenuBuilder.java b/v7/appcompat/src/main/java/androidx/appcompat/view/menu/MenuBuilder.java
index a1a20e5..2b5e653 100644
--- a/v7/appcompat/src/main/java/androidx/appcompat/view/menu/MenuBuilder.java
+++ b/v7/appcompat/src/main/java/androidx/appcompat/view/menu/MenuBuilder.java
@@ -35,14 +35,15 @@
 import android.view.MenuItem;
 import android.view.SubMenu;
 import android.view.View;
+import android.view.ViewConfiguration;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
-import androidx.appcompat.R;
 import androidx.core.content.ContextCompat;
 import androidx.core.internal.view.SupportMenu;
 import androidx.core.internal.view.SupportMenuItem;
 import androidx.core.view.ActionProvider;
+import androidx.core.view.ViewConfigurationCompat;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
@@ -816,7 +817,8 @@
     private void setShortcutsVisibleInner(boolean shortcutsVisible) {
         mShortcutsVisible = shortcutsVisible
                 && mResources.getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS
-                && mResources.getBoolean(R.bool.abc_config_showMenuShortcutsWhenKeyboardPresent);
+                && ViewConfigurationCompat.shouldShowMenuShortcutsWhenKeyboardPresent(
+                        ViewConfiguration.get(mContext), mContext);
     }
 
     /**
diff --git a/wear/res/values-as/strings.xml b/wear/res/values-as/strings.xml
new file mode 100644
index 0000000..2a51efa
--- /dev/null
+++ b/wear/res/values-as/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"নেভিগেশ্বন ড্ৰৱাৰ"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"কাৰ্য ড্ৰৱাৰ"</string>
+</resources>
diff --git a/wear/res/values-or/strings.xml b/wear/res/values-or/strings.xml
new file mode 100644
index 0000000..53e75b3
--- /dev/null
+++ b/wear/res/values-or/strings.xml
@@ -0,0 +1,21 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"ନେଭିଗେଶନ୍ ପ୍ୟାନେଲ୍"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"କାର୍ଯ୍ୟକାରୀ ପ୍ୟାନେଲ୍"</string>
+</resources>
diff --git a/webkit/api/current.txt b/webkit/api/current.txt
new file mode 100644
index 0000000..08c6a55
--- /dev/null
+++ b/webkit/api/current.txt
@@ -0,0 +1,56 @@
+package androidx.webkit {
+
+  public abstract class ServiceWorkerClientCompat {
+    ctor public ServiceWorkerClientCompat();
+    method public abstract android.webkit.WebResourceResponse shouldInterceptRequest(android.webkit.WebResourceRequest);
+  }
+
+  public abstract class ServiceWorkerControllerCompat {
+    method public static androidx.webkit.ServiceWorkerControllerCompat getInstance();
+    method public abstract androidx.webkit.ServiceWorkerWebSettingsCompat getServiceWorkerWebSettings();
+    method public abstract void setServiceWorkerClient(androidx.webkit.ServiceWorkerClientCompat);
+  }
+
+  public abstract class ServiceWorkerWebSettingsCompat {
+    method public abstract boolean getAllowContentAccess();
+    method public abstract boolean getAllowFileAccess();
+    method public abstract boolean getBlockNetworkLoads();
+    method public abstract int getCacheMode();
+    method public abstract void setAllowContentAccess(boolean);
+    method public abstract void setAllowFileAccess(boolean);
+    method public abstract void setBlockNetworkLoads(boolean);
+    method public abstract void setCacheMode(int);
+  }
+
+  public class WebSettingsCompat {
+    method public static int getDisabledActionModeMenuItems(android.webkit.WebSettings);
+    method public static boolean getOffscreenPreRaster(android.webkit.WebSettings);
+    method public static boolean getSafeBrowsingEnabled(android.webkit.WebSettings);
+    method public static void setDisabledActionModeMenuItems(android.webkit.WebSettings, int);
+    method public static void setOffscreenPreRaster(android.webkit.WebSettings, boolean);
+    method public static void setSafeBrowsingEnabled(android.webkit.WebSettings, boolean);
+  }
+
+  public class WebViewClientCompat extends android.webkit.WebViewClient {
+    ctor public WebViewClientCompat();
+  }
+
+  public class WebViewCompat {
+    method public static android.content.pm.PackageInfo getCurrentWebViewPackage(android.content.Context);
+    method public static android.net.Uri getSafeBrowsingPrivacyPolicyUrl();
+    method public static void postVisualStateCallback(android.webkit.WebView, long, androidx.webkit.WebViewCompat.VisualStateCallback);
+    method public static void setSafeBrowsingWhitelist(java.util.List<java.lang.String>, android.webkit.ValueCallback<java.lang.Boolean>);
+    method public static void startSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>);
+  }
+
+  public static abstract interface WebViewCompat.VisualStateCallback {
+    method public abstract void onComplete(long);
+  }
+
+  public class WebViewFeature {
+    method public static boolean isFeatureSupported(java.lang.String);
+    field public static final java.lang.String VISUAL_STATE_CALLBACK = "VISUAL_STATE_CALLBACK";
+  }
+
+}
+
diff --git a/webkit/build.gradle b/webkit/build.gradle
index 06f3801..d610dad 100644
--- a/webkit/build.gradle
+++ b/webkit/build.gradle
@@ -38,14 +38,17 @@
         // Allow compiling the WebView support library boundary interfaces from this project.
         main.java.srcDirs += new File(webviewBoundaryInterfacesDir, "src").getAbsolutePath()
     }
+
+    buildTypes.all {
+        consumerProguardFiles new File(webviewBoundaryInterfacesDir, "proguard.flags")
+    }
 }
 
 supportLibrary {
     name = "WebView Support Library"
-    publish = false
+    publish = true
     mavenVersion = LibraryVersions.SUPPORT_LIBRARY
     mavenGroup = LibraryGroups.WEBKIT
     inceptionYear = "2017"
     description = "The WebView Support Library is a static library you can add to your Android application in order to use android.webkit APIs that are not available for older platform versions."
-    minSdkVersion = 21
 }
diff --git a/webkit/src/androidTest/java/androidx/webkit/PollingCheck.java b/webkit/src/androidTest/java/androidx/webkit/PollingCheck.java
new file mode 100644
index 0000000..4c59a3e
--- /dev/null
+++ b/webkit/src/androidTest/java/androidx/webkit/PollingCheck.java
@@ -0,0 +1,75 @@
+/*
+ * 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.webkit;
+
+import junit.framework.Assert;
+
+import java.util.concurrent.Callable;
+
+/**
+ * A class for checking a specific statement {@link #check()} through polling, either until the
+ * statement is true, or until timing out.
+ *
+ * Copy-pasted from CTS: com.android.compatibility.common.util.PollingCheck.
+ */
+public abstract class PollingCheck {
+    private static final long TIME_SLICE = 50;
+    private long mTimeout = 3000;
+
+    public PollingCheck(long timeout) {
+        mTimeout = timeout;
+    }
+
+    protected abstract boolean check();
+
+    public void run() {
+        if (check()) {
+            return;
+        }
+
+        long timeout = mTimeout;
+        while (timeout > 0) {
+            try {
+                Thread.sleep(TIME_SLICE);
+            } catch (InterruptedException e) {
+                Assert.fail("unexpected InterruptedException");
+            }
+
+            if (check()) {
+                return;
+            }
+
+            timeout -= TIME_SLICE;
+        }
+
+        Assert.fail("unexpected timeout");
+    }
+
+    public static void check(CharSequence message, long timeout, Callable<Boolean> condition)
+            throws Exception {
+        while (timeout > 0) {
+            if (condition.call()) {
+                return;
+            }
+
+            Thread.sleep(TIME_SLICE);
+            timeout -= TIME_SLICE;
+        }
+
+        Assert.fail(message.toString());
+    }
+}
diff --git a/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java b/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java
new file mode 100644
index 0000000..aecbc34
--- /dev/null
+++ b/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java
@@ -0,0 +1,206 @@
+/*
+ * 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.webkit;
+
+import static org.junit.Assert.assertEquals;
+
+import android.os.Build;
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.webkit.JavascriptInterface;
+import android.webkit.WebResourceRequest;
+import android.webkit.WebResourceResponse;
+import android.webkit.WebView;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class ServiceWorkerClientCompatTest {
+
+    // The BASE_URL does not matter since the tests will intercept the load, but it should be https
+    // for the Service Worker registration to succeed.
+    private static final String BASE_URL = "https://www.example.com/";
+    private static final String INDEX_URL = BASE_URL + "index.html";
+    private static final String SW_URL = BASE_URL + "sw.js";
+    private static final String FETCH_URL = BASE_URL + "fetch.html";
+
+    private static final String JS_INTERFACE_NAME = "Android";
+    private static final int POLLING_TIMEOUT = 10 * 1000;
+
+    // static HTML page always injected instead of the url loaded.
+    private static final String INDEX_RAW_HTML =
+            "<!DOCTYPE html>\n"
+                    + "<html>\n"
+                    + "  <body>\n"
+                    + "    <script>\n"
+                    + "      navigator.serviceWorker.register('sw.js').then(function(reg) {\n"
+                    + "         " + JS_INTERFACE_NAME + ".registrationSuccess();\n"
+                    + "      }).catch(function(err) {\n"
+                    + "         console.error(err);\n"
+                    + "      });\n"
+                    + "    </script>\n"
+                    + "  </body>\n"
+                    + "</html>\n";
+    private static final String SW_RAW_HTML = "fetch('fetch.html');";
+    private static final String SW_UNREGISTER_RAW_JS =
+            "navigator.serviceWorker.getRegistration().then(function(r) {"
+                    + "  r.unregister().then(function(success) {"
+                    + "    if (success) " + JS_INTERFACE_NAME + ".unregisterSuccess();"
+                    + "    else console.error('unregister() was not successful');"
+                    + "  });"
+                    + "}).catch(function(err) {"
+                    + "   console.error(err);"
+                    + "});";
+
+    private JavascriptStatusReceiver mJavascriptStatusReceiver;
+    private WebViewOnUiThread mOnUiThread;
+
+    // Both this test and WebViewOnUiThread need to override some of the methods on WebViewClient,
+    // so this test subclasses the WebViewClient from WebViewOnUiThread.
+    private static class InterceptClient extends WebViewOnUiThread.WaitForLoadedClient {
+
+        InterceptClient(WebViewOnUiThread webViewOnUiThread) throws Exception {
+            super(webViewOnUiThread);
+        }
+
+        @Override
+        public WebResourceResponse shouldInterceptRequest(WebView view,
+                WebResourceRequest request) {
+            // Only return content for INDEX_URL, deny all other requests.
+            try {
+                if (request.getUrl().toString().equals(INDEX_URL)) {
+                    return new WebResourceResponse("text/html", "utf-8",
+                            new ByteArrayInputStream(INDEX_RAW_HTML.getBytes("UTF-8")));
+                }
+            } catch (java.io.UnsupportedEncodingException e) { }
+            return new WebResourceResponse("text/html", "UTF-8", null);
+        }
+    }
+
+    public static class InterceptServiceWorkerClient extends ServiceWorkerClientCompat {
+        private List<WebResourceRequest> mInterceptedRequests = new ArrayList<WebResourceRequest>();
+
+        @Override
+        public WebResourceResponse shouldInterceptRequest(WebResourceRequest request) {
+            // Records intercepted requests and only return content for SW_URL.
+            mInterceptedRequests.add(request);
+            try {
+                if (request.getUrl().toString().equals(SW_URL)) {
+                    return new WebResourceResponse("application/javascript", "utf-8",
+                            new ByteArrayInputStream(SW_RAW_HTML.getBytes("UTF-8")));
+                }
+            } catch (java.io.UnsupportedEncodingException e) { }
+            return new WebResourceResponse("text/html", "UTF-8", null);
+        }
+
+        List<WebResourceRequest> getInterceptedRequests() {
+            return mInterceptedRequests;
+        }
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        mOnUiThread = new WebViewOnUiThread();
+        mOnUiThread.getSettings().setJavaScriptEnabled(true);
+
+        mJavascriptStatusReceiver = new JavascriptStatusReceiver();
+        mOnUiThread.addJavascriptInterface(mJavascriptStatusReceiver, JS_INTERFACE_NAME);
+        mOnUiThread.setWebViewClient(new InterceptClient(mOnUiThread));
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (mOnUiThread != null) {
+            mOnUiThread.cleanUp();
+        }
+    }
+
+    // Test correct invocation of shouldInterceptRequest for Service Workers.
+    @Test
+    public void testServiceWorkerClientInterceptCallback() throws Exception {
+        // TODO(gsennton) activate this test for pre-N devices when we can pre-install a WebView APK
+        // containing support for the WebView Support Library, see b/73454652.
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return;
+
+        final InterceptServiceWorkerClient mInterceptServiceWorkerClient =
+                new InterceptServiceWorkerClient();
+        ServiceWorkerControllerCompat swController = ServiceWorkerControllerCompat.getInstance();
+        swController.setServiceWorkerClient(mInterceptServiceWorkerClient);
+
+        mOnUiThread.loadUrlAndWaitForCompletion(INDEX_URL);
+
+        Callable<Boolean> registrationSuccess = new Callable<Boolean>() {
+            @Override
+            public Boolean call() {
+                return mJavascriptStatusReceiver.mRegistrationSuccess;
+            }
+        };
+        PollingCheck.check("JS could not register Service Worker", POLLING_TIMEOUT,
+                registrationSuccess);
+
+        Callable<Boolean> receivedRequest = new Callable<Boolean>() {
+            @Override
+            public Boolean call() {
+                return mInterceptServiceWorkerClient.getInterceptedRequests().size() >= 2;
+            }
+        };
+        PollingCheck.check("Service Worker intercept callbacks not invoked", POLLING_TIMEOUT,
+                receivedRequest);
+
+        List<WebResourceRequest> requests = mInterceptServiceWorkerClient.getInterceptedRequests();
+        assertEquals(2, requests.size());
+        assertEquals(SW_URL, requests.get(0).getUrl().toString());
+        assertEquals(FETCH_URL, requests.get(1).getUrl().toString());
+
+        // Clean-up, make sure to unregister the Service Worker.
+        mOnUiThread.evaluateJavascript(SW_UNREGISTER_RAW_JS, null);
+        Callable<Boolean> unregisterSuccess = new Callable<Boolean>() {
+            @Override
+            public Boolean call() {
+                return mJavascriptStatusReceiver.mUnregisterSuccess;
+            }
+        };
+        PollingCheck.check("JS could not unregister Service Worker", POLLING_TIMEOUT,
+                unregisterSuccess);
+    }
+
+    // Object added to the page via AddJavascriptInterface() that is used by the test Javascript to
+    // notify back to Java if the Service Worker registration was successful.
+    public static final class JavascriptStatusReceiver {
+        public volatile boolean mRegistrationSuccess = false;
+        public volatile boolean mUnregisterSuccess = false;
+
+        @JavascriptInterface
+        public void registrationSuccess() {
+            mRegistrationSuccess = true;
+        }
+
+        @JavascriptInterface
+        public void unregisterSuccess() {
+            mUnregisterSuccess = true;
+        }
+    }
+}
diff --git a/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java b/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java
index 3c64b9c..bd77fdb 100644
--- a/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java
+++ b/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java
@@ -19,6 +19,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -28,6 +29,7 @@
 import android.os.Looper;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.MediumTest;
+import android.support.test.filters.Suppress;
 import android.support.test.runner.AndroidJUnit4;
 import android.webkit.SafeBrowsingResponse;
 import android.webkit.ValueCallback;
@@ -83,6 +85,7 @@
         assertTrue(callbackLatch.await(TEST_TIMEOUT, TimeUnit.MILLISECONDS));
     }
 
+    @Suppress // TODO(gsennton) remove @Suppress when b/76202025 has been resolved
     @Test
     public void testCheckThread() {
         try {
@@ -235,4 +238,22 @@
             Assert.fail("The privacy policy URL should be a well-formed URL");
         }
     }
+
+    /**
+     * WebViewCompat.getCurrentWebViewPackage should be null on pre-L devices.
+     * On L+ devices WebViewCompat.getCurrentWebViewPackage should be null only in exceptional
+     * circumstances - like when the WebView APK is being updated, or for Wear devices. The L+
+     * devices used in support library testing should have a non-null WebView package.
+     */
+    @Test
+    public void testGetCurrentWebViewPackage() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+            assertNull(WebViewCompat.getCurrentWebViewPackage(
+                    InstrumentationRegistry.getTargetContext()));
+        } else {
+            assertNotNull(
+                    WebViewCompat.getCurrentWebViewPackage(
+                            InstrumentationRegistry.getTargetContext()));
+        }
+    }
 }
diff --git a/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java b/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
index 9b4c9e9..6e817c3 100644
--- a/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
+++ b/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
@@ -16,12 +16,42 @@
 
 package androidx.webkit;
 
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.graphics.Bitmap;
+import android.os.Looper;
+import android.os.SystemClock;
 import android.support.test.InstrumentationRegistry;
+import android.webkit.ValueCallback;
+import android.webkit.WebChromeClient;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 
-public class WebViewOnUiThread {
+import java.util.concurrent.Callable;
+
+class WebViewOnUiThread {
+    /**
+     * The maximum time, in milliseconds (10 seconds) to wait for a load
+     * to be triggered.
+     */
+    private static final long LOAD_TIMEOUT = 10000;
+
+    /**
+     * Set to true after onPageFinished is called.
+     */
+    private boolean mLoaded;
+
+    /**
+     * The progress, in percentage, of the page load. Valid values are between
+     * 0 and 100.
+     */
+    private int mProgress;
+
+    /**
+     * The WebView that calls will be made on.
+     */
     private WebView mWebView;
 
     public WebViewOnUiThread() {
@@ -29,6 +59,8 @@
             @Override
             public void run() {
                 mWebView = new WebView(InstrumentationRegistry.getTargetContext());
+                mWebView.setWebViewClient(new WaitForLoadedClient(WebViewOnUiThread.this));
+                mWebView.setWebChromeClient(new WaitForProgressClient(WebViewOnUiThread.this));
             }
         });
     }
@@ -70,10 +102,208 @@
         });
     }
 
-    public WebView getWebViewOnCurrentThread() {
+    public void addJavascriptInterface(final Object object, final String name) {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.addJavascriptInterface(object, name);
+            }
+        });
+    }
+
+    /**
+     * Called after a test is complete and the WebView should be disengaged from
+     * the tests.
+     */
+    public void cleanUp() {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.clearHistory();
+                mWebView.clearCache(true);
+                mWebView.setWebChromeClient(null);
+                mWebView.setWebViewClient(null);
+                mWebView.destroy();
+            }
+        });
+    }
+
+    WebView getWebViewOnCurrentThread() {
         return mWebView;
     }
 
+    /**
+     * Called from WaitForLoadedClient.
+     */
+    synchronized void onPageStarted() {}
+
+    /**
+     * Called from WaitForLoadedClient, this is used to indicate that
+     * the page is loaded, but not drawn yet.
+     */
+    synchronized void onPageFinished() {
+        mLoaded = true;
+        this.notifyAll();
+    }
+
+    /**
+     * Called from the WebChrome client, this sets the current progress
+     * for a page.
+     * @param progress The progress made so far between 0 and 100.
+     */
+    synchronized void onProgressChanged(int progress) {
+        mProgress = progress;
+        this.notifyAll();
+    }
+
+    /**
+     * Calls loadUrl on the WebView and then waits onPageFinished,
+     * onNewPicture and onProgressChange to reach 100.
+     * Test fails if the load timeout elapses.
+     * @param url The URL to load.
+     */
+    void loadUrlAndWaitForCompletion(final String url) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadUrl(url);
+            }
+        });
+    }
+
+    /**
+     * Use this only when JavaScript causes a page load to wait for the
+     * page load to complete. Otherwise use loadUrlAndWaitForCompletion or
+     * similar functions.
+     */
+    void waitForLoadCompletion() {
+        waitForCriteria(LOAD_TIMEOUT,
+                new Callable<Boolean>() {
+                    @Override
+                    public Boolean call() {
+                        return isLoaded();
+                    }
+                });
+        clearLoad();
+    }
+
+    private void waitForCriteria(long timeout, Callable<Boolean> doneCriteria) {
+        if (isUiThread()) {
+            waitOnUiThread(timeout, doneCriteria);
+        } else {
+            waitOnTestThread(timeout, doneCriteria);
+        }
+    }
+
+    void evaluateJavascript(final String script, final ValueCallback<String> result) {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.evaluateJavascript(script, result);
+            }
+        });
+    }
+
+    /**
+     * Returns true if the current thread is the UI thread based on the
+     * Looper.
+     */
+    private static boolean isUiThread() {
+        return (Looper.myLooper() == Looper.getMainLooper());
+    }
+
+    /**
+     * @return Whether or not the load has finished.
+     */
+    private synchronized boolean isLoaded() {
+        return mLoaded && mProgress == 100;
+    }
+
+    /**
+     * Makes a WebView call, waits for completion and then resets the
+     * load state in preparation for the next load call.
+     * @param call The call to make on the UI thread prior to waiting.
+     */
+    private void callAndWait(Runnable call) {
+        assertTrue("WebViewOnUiThread.load*AndWaitForCompletion calls "
+                        + "may not be mixed with load* calls directly on WebView "
+                        + "without calling waitForLoadCompletion after the load",
+                !isLoaded());
+        clearLoad(); // clear any extraneous signals from a previous load.
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(call);
+        waitForLoadCompletion();
+    }
+
+    /**
+     * Called whenever a load has been completed so that a subsequent call to
+     * waitForLoadCompletion doesn't return immediately.
+     */
+    private synchronized void clearLoad() {
+        mLoaded = false;
+        mProgress = 0;
+    }
+
+    /**
+     * Uses a polling mechanism, while pumping messages to check when the
+     * criteria is met.
+     */
+    private void waitOnUiThread(long timeout, final Callable<Boolean> doneCriteria) {
+        new PollingCheck(timeout) {
+            @Override
+            protected boolean check() {
+                pumpMessages();
+                try {
+                    return doneCriteria.call();
+                } catch (Exception e) {
+                    fail("Unexpected error while checking the criteria: " + e.getMessage());
+                    return true;
+                }
+            }
+        }.run();
+    }
+
+    /**
+     * Uses a wait/notify to check when the criteria is met.
+     */
+    private synchronized void waitOnTestThread(long timeout, Callable<Boolean> doneCriteria) {
+        try {
+            long waitEnd = SystemClock.uptimeMillis() + timeout;
+            long timeRemaining = timeout;
+            while (!doneCriteria.call() && timeRemaining > 0) {
+                this.wait(timeRemaining);
+                timeRemaining = waitEnd - SystemClock.uptimeMillis();
+            }
+            assertTrue("Action failed to complete before timeout", doneCriteria.call());
+        } catch (InterruptedException e) {
+            // We'll just drop out of the loop and fail
+        } catch (Exception e) {
+            fail("Unexpected error while checking the criteria: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Pumps all currently-queued messages in the UI thread and then exits.
+     * This is useful to force processing while running tests in the UI thread.
+     */
+    private void pumpMessages() {
+        class ExitLoopException extends RuntimeException {
+        }
+
+        // Force loop to exit when processing this. Loop.quit() doesn't
+        // work because this is the main Loop.
+        mWebView.getHandler().post(new Runnable() {
+            @Override
+            public void run() {
+                throw new ExitLoopException(); // exit loop!
+            }
+        });
+        try {
+            // Pump messages until our message gets through.
+            Looper.loop();
+        } catch (ExitLoopException e) {
+        }
+    }
+
     private <T> T getValue(ValueGetter<T> getter) {
         InstrumentationRegistry.getInstrumentation().runOnMainSync(getter);
         return getter.getValue();
@@ -93,4 +323,51 @@
             return mValue;
         }
     }
+
+    /**
+     * A WebChromeClient used to capture the onProgressChanged for use
+     * in waitFor functions. If a test must override the WebChromeClient,
+     * it can derive from this class or call onProgressChanged
+     * directly.
+     */
+    public static class WaitForProgressClient extends WebChromeClient {
+        private WebViewOnUiThread mOnUiThread;
+
+        WaitForProgressClient(WebViewOnUiThread onUiThread) {
+            mOnUiThread = onUiThread;
+        }
+
+        @Override
+        public void onProgressChanged(WebView view, int newProgress) {
+            super.onProgressChanged(view, newProgress);
+            mOnUiThread.onProgressChanged(newProgress);
+        }
+    }
+
+    /**
+     * A WebViewClient that captures the onPageFinished for use in
+     * waitFor functions. Using initializeWebView sets the WaitForLoadedClient
+     * into the WebView. If a test needs to set a specific WebViewClient and
+     * needs the waitForCompletion capability then it should derive from
+     * WaitForLoadedClient or call WebViewOnUiThread.onPageFinished.
+     */
+    public static class WaitForLoadedClient extends WebViewClient {
+        private WebViewOnUiThread mOnUiThread;
+
+        WaitForLoadedClient(WebViewOnUiThread onUiThread) {
+            mOnUiThread = onUiThread;
+        }
+
+        @Override
+        public void onPageFinished(WebView view, String url) {
+            super.onPageFinished(view, url);
+            mOnUiThread.onPageFinished();
+        }
+
+        @Override
+        public void onPageStarted(WebView view, String url, Bitmap favicon) {
+            super.onPageStarted(view, url, favicon);
+            mOnUiThread.onPageStarted();
+        }
+    }
 }
diff --git a/webkit/src/main/java/androidx/webkit/ServiceWorkerClientCompat.java b/webkit/src/main/java/androidx/webkit/ServiceWorkerClientCompat.java
new file mode 100644
index 0000000..19aab8c
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/ServiceWorkerClientCompat.java
@@ -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 androidx.webkit;
+
+import android.webkit.WebResourceRequest;
+import android.webkit.WebResourceResponse;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Base class for clients to capture Service Worker related callbacks,
+ * see {@link ServiceWorkerControllerCompat} for usage example.
+ */
+public abstract class ServiceWorkerClientCompat {
+    /**
+     *
+     * Notify the host application of a resource request and allow the
+     * application to return the data. If the return value is {@code null}, the
+     * Service Worker will continue to load the resource as usual.
+     * Otherwise, the return response and data will be used.
+     *
+     * <p class="note"><b>Note:</b> This method is called on a thread other than the UI thread so
+     * clients should exercise caution when accessing private data or the view system.
+     *
+     * @param request Object containing the details of the request.
+     * @return A {@link android.webkit.WebResourceResponse} containing the
+     * response information or {@code null} if the WebView should load the
+     * resource itself.
+     * @see android.webkit.WebViewClient#shouldInterceptRequest(android.webkit.WebView,
+     * WebResourceRequest)
+     *
+     */
+    public abstract WebResourceResponse shouldInterceptRequest(@NonNull WebResourceRequest request);
+}
diff --git a/webkit/src/main/java/androidx/webkit/ServiceWorkerControllerCompat.java b/webkit/src/main/java/androidx/webkit/ServiceWorkerControllerCompat.java
new file mode 100644
index 0000000..3eb55d2
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/ServiceWorkerControllerCompat.java
@@ -0,0 +1,108 @@
+/*
+ * 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.webkit;
+
+import android.os.Build;
+import android.webkit.ServiceWorkerController;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+import androidx.webkit.internal.FrameworkServiceWorkerController;
+import androidx.webkit.internal.ServiceWorkerControllerAdapter;
+import androidx.webkit.internal.WebViewGlueCommunicator;
+
+// TODO(gsennton) guard APIs with isFeatureSupported(String)
+
+/**
+ * Manages Service Workers used by WebView.
+ *
+ * <p>Example usage:
+ * <pre class="prettyprint">
+ * ServiceWorkerControllerCompat swController = ServiceWorkerControllerCompat.getInstance();
+ * swController.setServiceWorkerClient(new ServiceWorkerClientCompat() {
+ *   {@literal @}Override
+ *   public WebResourceResponse shouldInterceptRequest(WebResourceRequest request) {
+ *     // Capture request here and generate response or allow pass-through
+ *     // by returning null.
+ *     return null;
+ *   }
+ * });
+ * </pre>
+ */
+public abstract class ServiceWorkerControllerCompat {
+    /**
+     *
+     * @hide Don't allow apps to sub-class this class.
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public ServiceWorkerControllerCompat() {}
+
+    /**
+     * Returns the default ServiceWorkerController instance. At present there is
+     * only one ServiceWorkerController instance for all WebView instances,
+     * however this restriction may be relaxed in the future.
+     *
+     * @return the default ServiceWorkerController instance
+     */
+    @NonNull
+    public static ServiceWorkerControllerCompat getInstance() {
+        return LAZY_HOLDER.INSTANCE;
+    }
+
+    private static class LAZY_HOLDER {
+        static final ServiceWorkerControllerCompat INSTANCE =
+                Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
+                        ? getFrameworkControllerCompat() : getSupportLibraryControllerCompat();
+    }
+
+    /**
+     * Return a version of {@link ServiceWorkerControllerCompat} that only uses framework APIs.
+     */
+    @RequiresApi(Build.VERSION_CODES.N)
+    private static ServiceWorkerControllerCompat getFrameworkControllerCompat() {
+        return new FrameworkServiceWorkerController(
+                ServiceWorkerController.getInstance());
+    }
+
+    private static ServiceWorkerControllerCompat getSupportLibraryControllerCompat() {
+        return new ServiceWorkerControllerAdapter(
+                WebViewGlueCommunicator.getFactory().getServiceWorkerController());
+    }
+
+    /**
+     *
+     * Gets the settings for all service workers.
+     *
+     * @return the current {@link ServiceWorkerWebSettingsCompat}
+     *
+     */
+    @NonNull
+    public abstract ServiceWorkerWebSettingsCompat getServiceWorkerWebSettings();
+
+    /**
+     *
+     * Sets the client to capture service worker related callbacks.
+     *
+     * A {@link ServiceWorkerClientCompat} should be set before any service workers are
+     * active, e.g. a safe place is before any WebView instances are created or
+     * pages loaded.
+     *
+     */
+    public abstract void setServiceWorkerClient(@Nullable ServiceWorkerClientCompat client);
+}
diff --git a/webkit/src/main/java/androidx/webkit/ServiceWorkerWebSettingsCompat.java b/webkit/src/main/java/androidx/webkit/ServiceWorkerWebSettingsCompat.java
new file mode 100644
index 0000000..61c46c3
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/ServiceWorkerWebSettingsCompat.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.webkit;
+
+import android.webkit.WebSettings;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.RestrictTo;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Manages settings state for all Service Workers. These settings are not tied to
+ * the lifetime of any WebView because service workers can outlive WebView instances.
+ * The settings are similar to {@link WebSettings} but only settings relevant to
+ * Service Workers are supported.
+ */
+public abstract class ServiceWorkerWebSettingsCompat {
+    /**
+     * @hide Don't allow apps to sub-class this class.
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public ServiceWorkerWebSettingsCompat() {}
+
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @IntDef(value = {
+            WebSettings.LOAD_DEFAULT,
+            WebSettings.LOAD_CACHE_ELSE_NETWORK,
+            WebSettings.LOAD_NO_CACHE,
+            WebSettings.LOAD_CACHE_ONLY
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface CacheMode {}
+
+    /**
+     *
+     * Overrides the way the cache is used, see {@link WebSettings#setCacheMode}.
+     *
+     * @param mode the mode to use. One of {@link WebSettings#LOAD_DEFAULT},
+     * {@link WebSettings#LOAD_CACHE_ELSE_NETWORK}, {@link WebSettings#LOAD_NO_CACHE}
+     * or {@link WebSettings#LOAD_CACHE_ONLY}. The default value is
+     * {@link WebSettings#LOAD_DEFAULT}.
+     *
+     */
+    public abstract void setCacheMode(@CacheMode int mode);
+
+    /**
+     *
+     * Gets the current setting for overriding the cache mode.
+     *
+     * @return the current setting for overriding the cache mode
+     * @see #setCacheMode
+     *
+     */
+    public abstract @CacheMode int getCacheMode();
+
+    /**
+     *
+     * Enables or disables content URL access from Service Workers, see
+     * {@link WebSettings#setAllowContentAccess}.
+     *
+     */
+    public abstract void setAllowContentAccess(boolean allow);
+
+    /**
+     *
+     * Gets whether Service Workers support content URL access.
+     *
+     * @see #setAllowContentAccess
+     *
+     */
+    public abstract boolean getAllowContentAccess();
+
+    /**
+     *
+     * Enables or disables file access within Service Workers, see
+     * {@link WebSettings#setAllowFileAccess}.
+     *
+     */
+    public abstract void setAllowFileAccess(boolean allow);
+
+    /**
+     *
+     * Gets whether Service Workers support file access.
+     *
+     * @see #setAllowFileAccess
+     *
+     */
+    public abstract boolean getAllowFileAccess();
+
+    /**
+     *
+     * Sets whether Service Workers should not load resources from the network,
+     * see {@link WebSettings#setBlockNetworkLoads}.
+     *
+     * @param flag {@code true} means block network loads by the Service Workers
+     *
+     */
+    public abstract void setBlockNetworkLoads(boolean flag);
+
+    /**
+     *
+     * Gets whether Service Workers are prohibited from loading any resources from the network.
+     *
+     * @return {@code true} if the Service Workers are not allowed to load any resources from the
+     * network
+     * @see #setBlockNetworkLoads
+     *
+     */
+    public abstract boolean getBlockNetworkLoads();
+}
diff --git a/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java b/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java
index c73cda6..12d7e63 100644
--- a/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java
+++ b/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java
@@ -19,6 +19,13 @@
 import android.os.Build;
 import android.webkit.WebSettings;
 
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.RestrictTo;
 import androidx.webkit.internal.WebSettingsAdapter;
 import androidx.webkit.internal.WebViewGlueCommunicator;
 
@@ -102,10 +109,25 @@
     }
 
     /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @IntDef(flag = true, value = {
+            WebSettings.MENU_ITEM_NONE,
+            WebSettings.MENU_ITEM_SHARE,
+            WebSettings.MENU_ITEM_WEB_SEARCH,
+            WebSettings.MENU_ITEM_PROCESS_TEXT
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    @Target({ElementType.PARAMETER, ElementType.METHOD})
+    public @interface MenuItemFlags {}
+
+    /**
      * Disables the action mode menu items according to {@code menuItems} flag.
      * @param menuItems an integer field flag for the menu items to be disabled.
      */
-    public static void setDisabledActionModeMenuItems(WebSettings webSettings, int menuItems) {
+    public static void setDisabledActionModeMenuItems(WebSettings webSettings,
+            @MenuItemFlags int menuItems) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             webSettings.setDisabledActionModeMenuItems(menuItems);
         } else {
@@ -119,7 +141,7 @@
      *
      * @return all the disabled menu item flags combined with bitwise OR.
      */
-    public static int getDisabledActionModeMenuItems(WebSettings webSettings) {
+    public static @MenuItemFlags int getDisabledActionModeMenuItems(WebSettings webSettings) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             return webSettings.getDisabledActionModeMenuItems();
         } else {
diff --git a/webkit/src/main/java/androidx/webkit/WebViewClientCompat.java b/webkit/src/main/java/androidx/webkit/WebViewClientCompat.java
new file mode 100644
index 0000000..8c690f9
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/WebViewClientCompat.java
@@ -0,0 +1,103 @@
+/*
+ * 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.webkit;
+
+import android.os.Build;
+import android.webkit.WebResourceRequest;
+import android.webkit.WebResourceResponse;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+
+import org.chromium.support_lib_boundary.WebViewClientBoundaryInterface;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.InvocationHandler;
+
+/**
+ * Compatibility version of {@link android.webkit.WebViewClient}.
+ */
+// Note: some methods are marked as RequiresApi 21, because only an up-to-date WebView APK would
+// ever invoke these methods (and WebView can only be updated on Lollipop and above). The app can
+// still construct a WebViewClientCompat on a pre-Lollipop devices, and explicitly invoke these
+// methods, so each of these methods must also handle this case.
+public class WebViewClientCompat extends WebViewClient implements WebViewClientBoundaryInterface {
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @IntDef(value = {
+            WebViewClient.SAFE_BROWSING_THREAT_UNKNOWN,
+            WebViewClient.SAFE_BROWSING_THREAT_MALWARE,
+            WebViewClient.SAFE_BROWSING_THREAT_PHISHING,
+            WebViewClient.SAFE_BROWSING_THREAT_UNWANTED_SOFTWARE
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface SafeBrowsingThreat {}
+
+    @Override
+    public void onPageCommitVisible(@NonNull WebView view, @NonNull String url) {
+    }
+
+    /**
+     * Invoked by chromium for the {@code onReceivedError} event. Applications are not meant to
+     * override this, and should instead override the non-final {@code onReceivedError} method.
+     * TODO(ntfschr): link to that method once it's implemented.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @Override
+    public final void onReceivedError(@NonNull WebView view, @NonNull WebResourceRequest request,
+            /* WebResourceError */ @NonNull InvocationHandler error) {
+        // TODO(ntfschr): implement this (b/73151460).
+    }
+
+    @Override
+    public void onReceivedHttpError(@NonNull WebView view, @NonNull WebResourceRequest request,
+            @NonNull WebResourceResponse errorResponse) {
+    }
+
+    /**
+     * Invoked by chromium for the {@code onSafeBrowsingHit} event. Applications are not meant to
+     * override this, and should instead override the non-final {@code onSafeBrowsingHit} method.
+     * TODO(ntfschr): link to that method once it's implemented.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @Override
+    public final void onSafeBrowsingHit(@NonNull WebView view, @NonNull WebResourceRequest request,
+            @SafeBrowsingThreat int threatType,
+            /* SafeBrowsingResponse */ @NonNull InvocationHandler callback) {
+        // TODO(ntfschr): implement this (b/73151460).
+    }
+
+    // Default behavior in WebViewClient is to invoke the other (deprecated)
+    // shouldOverrideUrlLoading method.
+    @Override
+    @SuppressWarnings("deprecation")
+    @RequiresApi(21)
+    public boolean shouldOverrideUrlLoading(@NonNull WebView view,
+            @NonNull WebResourceRequest request) {
+        if (Build.VERSION.SDK_INT < 21) return false;
+        return shouldOverrideUrlLoading(view, request.getUrl().toString());
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/WebViewCompat.java b/webkit/src/main/java/androidx/webkit/WebViewCompat.java
index 6a48e35..88de335 100644
--- a/webkit/src/main/java/androidx/webkit/WebViewCompat.java
+++ b/webkit/src/main/java/androidx/webkit/WebViewCompat.java
@@ -17,6 +17,8 @@
 package androidx.webkit;
 
 import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Looper;
@@ -25,7 +27,9 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresFeature;
 import androidx.core.os.BuildCompat;
+import androidx.webkit.internal.WebViewFeatureInternal;
 import androidx.webkit.internal.WebViewGlueCommunicator;
 import androidx.webkit.internal.WebViewProviderAdapter;
 import androidx.webkit.internal.WebViewProviderFactoryAdapter;
@@ -104,13 +108,22 @@
      * {@link android.webkit.WebSettings#setOffscreenPreRaster} for more details and do consider its
      * caveats.
      *
+     * This method should only be called if
+     * {@link WebViewFeature#isFeatureSupported(String)}
+     * returns true for {@link WebViewFeature#VISUAL_STATE_CALLBACK}.
+     *
      * @param requestId An id that will be returned in the callback to allow callers to match
      *                  requests with callbacks.
      * @param callback  The callback to be invoked.
      */
+    @SuppressWarnings("NewApi")
+    @RequiresFeature(name = WebViewFeature.VISUAL_STATE_CALLBACK,
+            enforcement = "androidx.webkit.WebViewFeature#isFeatureSupported")
     public static void postVisualStateCallback(@NonNull WebView webview, long requestId,
             @NonNull final VisualStateCallback callback) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+        WebViewFeatureInternal webViewFeature =
+                WebViewFeatureInternal.getFeature(WebViewFeature.VISUAL_STATE_CALLBACK);
+        if (webViewFeature.isSupportedByFramework()) {
             webview.postVisualStateCallback(requestId,
                     new android.webkit.WebView.VisualStateCallback() {
                         @Override
@@ -118,10 +131,11 @@
                             callback.onComplete(l);
                         }
                     });
-        } else {
-            // TODO(gsennton): guard with if WebViewApk.hasFeature(POSTVISUALSTATECALLBACK)
+        } else if (webViewFeature.isSupportedByWebView()) {
             checkThread(webview);
             getProvider(webview).insertVisualStateCallback(requestId, callback);
+        } else {
+            WebViewFeatureInternal.throwUnsupportedOperationException("postVisualStateCallback");
         }
     }
 
@@ -198,6 +212,97 @@
         }
     }
 
+    /**
+     * If WebView has already been loaded into the current process this method will return the
+     * package that was used to load it. Otherwise, the package that would be used if the WebView
+     * was loaded right now will be returned; this does not cause WebView to be loaded, so this
+     * information may become outdated at any time.
+     * The WebView package changes either when the current WebView package is updated, disabled, or
+     * uninstalled. It can also be changed through a Developer Setting.
+     * If the WebView package changes, any app process that has loaded WebView will be killed. The
+     * next time the app starts and loads WebView it will use the new WebView package instead.
+     * @return the current WebView package, or {@code null} if there is none.
+     */
+    // Note that this API is not protected by a {@link androidx.webkit.WebViewFeature} since
+    // this feature is not dependent on the WebView APK.
+    @Nullable
+    public static PackageInfo getCurrentWebViewPackage(@NonNull Context context) {
+        // There was no WebView Package before Lollipop, the WebView code was part of the framework
+        // back then.
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+            return null;
+        }
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            return WebView.getCurrentWebViewPackage();
+        } else { // L-N
+            try {
+                PackageInfo loadedWebViewPackageInfo = getLoadedWebViewPackageInfo();
+                if (loadedWebViewPackageInfo != null) return loadedWebViewPackageInfo;
+            } catch (ClassNotFoundException | IllegalAccessException | InvocationTargetException
+                | NoSuchMethodException  e) {
+                return null;
+            }
+
+            // If WebViewFactory.getLoadedPackageInfo() returns null then WebView hasn't been loaded
+            // yet, in that case we need to fetch the name of the WebView package, and fetch the
+            // corresponding PackageInfo through the PackageManager
+            return getNotYetLoadedWebViewPackageInfo(context);
+        }
+    }
+
+    /**
+     * Return the PackageInfo of the currently loaded WebView APK. This method uses reflection and
+     * propagates any exceptions thrown, to the caller.
+     */
+    private static PackageInfo getLoadedWebViewPackageInfo()
+            throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException,
+            IllegalAccessException {
+        Class webViewFactoryClass = Class.forName("android.webkit.WebViewFactory");
+        PackageInfo webviewPackageInfo =
+                (PackageInfo) webViewFactoryClass.getMethod(
+                        "getLoadedPackageInfo").invoke(null);
+        return webviewPackageInfo;
+    }
+
+    /**
+     * Return the PackageInfo of the WebView APK that would have been used as WebView implementation
+     * if WebView was to be loaded right now.
+     */
+    private static PackageInfo getNotYetLoadedWebViewPackageInfo(Context context) {
+        String webviewPackageName = null;
+        try {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
+                    && Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
+                Class webViewFactoryClass = null;
+                webViewFactoryClass = Class.forName("android.webkit.WebViewFactory");
+
+                webviewPackageName = (String) webViewFactoryClass.getMethod(
+                        "getWebViewPackageName").invoke(null);
+            } else {
+                Class webviewUpdateServiceClass =
+                        Class.forName("android.webkit.WebViewUpdateService");
+                webviewPackageName = (String) webviewUpdateServiceClass.getMethod(
+                        "getCurrentWebViewPackageName").invoke(null);
+            }
+        } catch (ClassNotFoundException e) {
+            return null;
+        } catch (IllegalAccessException e) {
+            return null;
+        } catch (InvocationTargetException e) {
+            return null;
+        } catch (NoSuchMethodException e) {
+            return null;
+        }
+        if (webviewPackageName == null) return null;
+        PackageManager pm = context.getPackageManager();
+        try {
+            return pm.getPackageInfo(webviewPackageName, 0);
+        } catch (PackageManager.NameNotFoundException e) {
+            return null;
+        }
+    }
+
     private static WebViewProviderAdapter getProvider(WebView webview) {
         return new WebViewProviderAdapter(createProvider(webview));
     }
@@ -213,7 +318,7 @@
     @SuppressWarnings("NewApi")
     private static void checkThread(WebView webview) {
         if (BuildCompat.isAtLeastP()) {
-            if (webview.getLooper() != Looper.myLooper()) {
+            if (webview.getWebViewLooper() != Looper.myLooper()) {
                 throw new RuntimeException("A WebView method was called on thread '"
                         + Thread.currentThread().getName() + "'. "
                         + "All WebView methods must be called on the same thread. "
diff --git a/webkit/src/main/java/androidx/webkit/WebViewFeature.java b/webkit/src/main/java/androidx/webkit/WebViewFeature.java
new file mode 100644
index 0000000..d514477
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/WebViewFeature.java
@@ -0,0 +1,65 @@
+/*
+ * 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.webkit;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.StringDef;
+import androidx.webkit.internal.WebViewFeatureInternal;
+
+import org.chromium.support_lib_boundary.util.Features;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Utility class for checking which WebView Support Library features are supported on the device.
+ */
+public class WebViewFeature {
+
+    private WebViewFeature() {}
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @StringDef(value = {
+            VISUAL_STATE_CALLBACK,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    @Target({ElementType.PARAMETER, ElementType.METHOD})
+    public @interface WebViewSupportFeature {}
+
+    /**
+     * Feature for {@link #isFeatureSupported(String)}.
+     * This feature covers
+     * {@link androidx.webkit.WebViewCompat#postVisualStateCallback(android.webkit.WebView, long,
+     * WebViewCompat.VisualStateCallback)}.
+     */
+    public static final String VISUAL_STATE_CALLBACK = Features.VISUAL_STATE_CALLBACK;
+
+    /**
+     * Return whether a feature is supported at run-time. This depends on the Android version of the
+     * device and the WebView APK on the device.
+     */
+    public static boolean isFeatureSupported(@NonNull @WebViewSupportFeature String feature) {
+        WebViewFeatureInternal webviewFeature = WebViewFeatureInternal.getFeature(feature);
+        return webviewFeature.isSupportedByFramework() || webviewFeature.isSupportedByWebView();
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/FrameworkServiceWorkerClient.java b/webkit/src/main/java/androidx/webkit/internal/FrameworkServiceWorkerClient.java
new file mode 100644
index 0000000..c28346e
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/FrameworkServiceWorkerClient.java
@@ -0,0 +1,44 @@
+/*
+ * 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.webkit.internal;
+
+import android.os.Build;
+import android.webkit.ServiceWorkerClient;
+import android.webkit.WebResourceRequest;
+import android.webkit.WebResourceResponse;
+
+import androidx.annotation.RequiresApi;
+import androidx.webkit.ServiceWorkerClientCompat;
+
+/**
+ * A shim class that implements {@link ServiceWorkerClient} by delegating to a
+ * {@link ServiceWorkerClientCompat}.
+ * This class is used on up-to-date devices to avoid using reflection to call into WebView APK code.
+ */
+@RequiresApi(Build.VERSION_CODES.N)
+public class FrameworkServiceWorkerClient extends ServiceWorkerClient {
+    private final ServiceWorkerClientCompat mImpl;
+
+    public FrameworkServiceWorkerClient(ServiceWorkerClientCompat impl) {
+        mImpl = impl;
+    }
+
+    @Override
+    public WebResourceResponse shouldInterceptRequest(WebResourceRequest request) {
+        return mImpl.shouldInterceptRequest(request);
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/FrameworkServiceWorkerController.java b/webkit/src/main/java/androidx/webkit/internal/FrameworkServiceWorkerController.java
new file mode 100644
index 0000000..2e02777
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/FrameworkServiceWorkerController.java
@@ -0,0 +1,53 @@
+/*
+ * 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.webkit.internal;
+
+import android.os.Build;
+import android.webkit.ServiceWorkerController;
+
+import androidx.annotation.RequiresApi;
+import androidx.webkit.ServiceWorkerClientCompat;
+import androidx.webkit.ServiceWorkerControllerCompat;
+import androidx.webkit.ServiceWorkerWebSettingsCompat;
+
+/**
+ * Implementation of {@link ServiceWorkerControllerCompat} meant for use on up-to-date platforms.
+ * This class does not use reflection to bypass framework APIs - instead it uses android.webkit
+ * APIs.
+ */
+@RequiresApi(Build.VERSION_CODES.N)
+public class FrameworkServiceWorkerController extends ServiceWorkerControllerCompat {
+    private final ServiceWorkerController mImpl;
+    private ServiceWorkerWebSettingsCompat mSettings;
+
+    public FrameworkServiceWorkerController(ServiceWorkerController impl) {
+        mImpl = impl;
+    }
+
+    @Override
+    public ServiceWorkerWebSettingsCompat getServiceWorkerWebSettings() {
+        if (mSettings == null) {
+            mSettings = new FrameworksServiceWorkerWebSettings(mImpl.getServiceWorkerWebSettings());
+        }
+        return mSettings;
+    }
+
+    @Override
+    public void setServiceWorkerClient(ServiceWorkerClientCompat client) {
+        mImpl.setServiceWorkerClient(new FrameworkServiceWorkerClient(client));
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/FrameworksServiceWorkerWebSettings.java b/webkit/src/main/java/androidx/webkit/internal/FrameworksServiceWorkerWebSettings.java
new file mode 100644
index 0000000..4373756
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/FrameworksServiceWorkerWebSettings.java
@@ -0,0 +1,77 @@
+/*
+ * 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.webkit.internal;
+
+import android.os.Build;
+import android.webkit.ServiceWorkerWebSettings;
+
+import androidx.annotation.RequiresApi;
+import androidx.webkit.ServiceWorkerWebSettingsCompat;
+
+/**
+ * Implementation of {@link ServiceWorkerWebSettingsCompat} meant for use on up-to-date platforms.
+ * This class does not use reflection to bypass framework APIs - instead it uses android.webkit
+ * APIs.
+ */
+@RequiresApi(Build.VERSION_CODES.N)
+public class FrameworksServiceWorkerWebSettings extends ServiceWorkerWebSettingsCompat {
+    private final ServiceWorkerWebSettings mImpl;
+
+    public FrameworksServiceWorkerWebSettings(ServiceWorkerWebSettings impl) {
+        mImpl = impl;
+    }
+
+    @Override
+    public void setCacheMode(int mode) {
+        mImpl.setCacheMode(mode);
+    }
+
+    @Override
+    public int getCacheMode() {
+        return mImpl.getCacheMode();
+    }
+
+    @Override
+    public void setAllowContentAccess(boolean allow) {
+        mImpl.setAllowContentAccess(allow);
+    }
+
+    @Override
+    public boolean getAllowContentAccess() {
+        return mImpl.getAllowContentAccess();
+    }
+
+    @Override
+    public void setAllowFileAccess(boolean allow) {
+        mImpl.setAllowContentAccess(allow);
+    }
+
+    @Override
+    public boolean getAllowFileAccess() {
+        return mImpl.getAllowFileAccess();
+    }
+
+    @Override
+    public void setBlockNetworkLoads(boolean flag) {
+        mImpl.setAllowContentAccess(flag);
+    }
+
+    @Override
+    public boolean getBlockNetworkLoads() {
+        return mImpl.getBlockNetworkLoads();
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerClientAdapter.java b/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerClientAdapter.java
new file mode 100644
index 0000000..3ffeb83
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerClientAdapter.java
@@ -0,0 +1,42 @@
+/*
+ * 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.webkit.internal;
+
+import android.webkit.WebResourceRequest;
+import android.webkit.WebResourceResponse;
+
+import androidx.webkit.ServiceWorkerClientCompat;
+
+import org.chromium.support_lib_boundary.ServiceWorkerClientBoundaryInterface;
+
+/**
+ * Adapter between {@link ServiceWorkerClientCompat} and
+ * {@link ServiceWorkerClientBoundaryInterface} (the corresponding interface shared with the support
+ * library glue in the WebView APK).
+ */
+public class ServiceWorkerClientAdapter implements ServiceWorkerClientBoundaryInterface {
+    private final ServiceWorkerClientCompat mClient;
+
+    public ServiceWorkerClientAdapter(ServiceWorkerClientCompat client) {
+        mClient = client;
+    }
+
+    @Override
+    public WebResourceResponse shouldInterceptRequest(WebResourceRequest request) {
+        return mClient.shouldInterceptRequest(request);
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerControllerAdapter.java b/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerControllerAdapter.java
new file mode 100644
index 0000000..4baa3ea
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerControllerAdapter.java
@@ -0,0 +1,54 @@
+/*
+ * 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.webkit.internal;
+
+import androidx.webkit.ServiceWorkerClientCompat;
+import androidx.webkit.ServiceWorkerControllerCompat;
+import androidx.webkit.ServiceWorkerWebSettingsCompat;
+
+import org.chromium.support_lib_boundary.ServiceWorkerControllerBoundaryInterface;
+import org.chromium.support_lib_boundary.ServiceWorkerWebSettingsBoundaryInterface;
+import org.chromium.support_lib_boundary.util.BoundaryInterfaceReflectionUtil;
+
+/**
+ * Adapter between {@link ServiceWorkerControllerCompat} and
+ * {@link ServiceWorkerControllerBoundaryInterface} (the corresponding interface shared with the
+ * support library glue in the WebView APK).
+ */
+public class ServiceWorkerControllerAdapter extends ServiceWorkerControllerCompat {
+    private final ServiceWorkerControllerBoundaryInterface mImpl;
+    private final ServiceWorkerWebSettingsCompat mWebSettings;
+
+    public ServiceWorkerControllerAdapter(ServiceWorkerControllerBoundaryInterface impl) {
+        mImpl = impl;
+        mWebSettings = new ServiceWorkerWebSettingsAdapter(
+                BoundaryInterfaceReflectionUtil.castToSuppLibClass(
+                        ServiceWorkerWebSettingsBoundaryInterface.class,
+                        mImpl.getServiceWorkerWebSettings()));
+    }
+
+    @Override
+    public ServiceWorkerWebSettingsCompat getServiceWorkerWebSettings() {
+        return mWebSettings;
+    }
+
+    @Override
+    public void setServiceWorkerClient(ServiceWorkerClientCompat client) {
+        mImpl.setServiceWorkerClient(BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
+                new ServiceWorkerClientAdapter(client)));
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerWebSettingsAdapter.java b/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerWebSettingsAdapter.java
new file mode 100644
index 0000000..fd49396
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/ServiceWorkerWebSettingsAdapter.java
@@ -0,0 +1,74 @@
+/*
+ * 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.webkit.internal;
+
+import androidx.webkit.ServiceWorkerWebSettingsCompat;
+
+import org.chromium.support_lib_boundary.ServiceWorkerWebSettingsBoundaryInterface;
+
+/**
+ * Adapter between {@link ServiceWorkerWebSettingsCompat} and
+ * {@link ServiceWorkerWebSettingsBoundaryInterface} (the corresponding interface shared with the
+ * support library glue in the WebView APK).
+ */
+public class ServiceWorkerWebSettingsAdapter extends ServiceWorkerWebSettingsCompat {
+    private final ServiceWorkerWebSettingsBoundaryInterface mImpl;
+
+    public ServiceWorkerWebSettingsAdapter(ServiceWorkerWebSettingsBoundaryInterface impl) {
+        mImpl = impl;
+    }
+
+    @Override
+    public void setCacheMode(int mode) {
+        mImpl.setCacheMode(mode);
+    }
+
+    @Override
+    public int getCacheMode() {
+        return mImpl.getCacheMode();
+    }
+
+    @Override
+    public void setAllowContentAccess(boolean allow) {
+        mImpl.setAllowContentAccess(allow);
+    }
+
+    @Override
+    public boolean getAllowContentAccess() {
+        return mImpl.getAllowContentAccess();
+    }
+
+    @Override
+    public void setAllowFileAccess(boolean allow) {
+        mImpl.setAllowFileAccess(allow);
+    }
+
+    @Override
+    public boolean getAllowFileAccess() {
+        return mImpl.getAllowFileAccess();
+    }
+
+    @Override
+    public void setBlockNetworkLoads(boolean flag) {
+        mImpl.setBlockNetworkLoads(flag);
+    }
+
+    @Override
+    public boolean getBlockNetworkLoads() {
+        return mImpl.getBlockNetworkLoads();
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/SupportLibraryInfo.java b/webkit/src/main/java/androidx/webkit/internal/SupportLibraryInfo.java
new file mode 100644
index 0000000..da8a02c
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/SupportLibraryInfo.java
@@ -0,0 +1,38 @@
+/*
+ * 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.webkit.internal;
+
+import org.chromium.support_lib_boundary.SupportLibraryInfoBoundaryInterface;
+import org.chromium.support_lib_boundary.util.Features;
+
+/**
+ * Contains information about the Android Support Library part of the WebView Support Library - this
+ * information is passed to the WebView APK code with the first WebView Support Library call.
+ */
+public class SupportLibraryInfo implements SupportLibraryInfoBoundaryInterface {
+    // Features supported by the support library itself (regardless of what the WebView APK
+    // supports).
+    private static final String[] SUPPORTED_FEATURES =
+            new String[] {
+                    Features.VISUAL_STATE_CALLBACK
+            };
+
+    @Override
+    public String[] getSupportedFeatures() {
+        return SUPPORTED_FEATURES;
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java b/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
new file mode 100644
index 0000000..d16713c
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
@@ -0,0 +1,88 @@
+/*
+ * 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.webkit.internal;
+
+import android.os.Build;
+
+import androidx.webkit.WebViewFeature;
+import androidx.webkit.WebViewFeature.WebViewSupportFeature;
+
+/**
+ * Enum representing a WebView feature, this provides functionality for determining whether a
+ * feature is supported by the current framework and/or WebView APK.
+ */
+public enum WebViewFeatureInternal {
+    /**
+     * This feature covers
+     * {@link androidx.webkit.WebViewCompat#postVisualStateCallback(android.webkit.WebView, long,
+     * androidx.webkit.WebViewCompat.VisualStateCallback)}.
+     */
+    VISUAL_STATE_CALLBACK_FEATURE(WebViewFeature.VISUAL_STATE_CALLBACK, Build.VERSION_CODES.M);
+
+    private final String mFeatureValue;
+    private final int mOsVersion;
+
+    WebViewFeatureInternal(@WebViewSupportFeature String featureValue, int osVersion) {
+        mFeatureValue = featureValue;
+        mOsVersion = osVersion;
+    }
+
+    /**
+     * Return the {@link WebViewFeatureInternal} corresponding to {@param feature}.
+     */
+    public static WebViewFeatureInternal getFeature(@WebViewSupportFeature String feature) {
+        switch (feature) {
+            case WebViewFeature.VISUAL_STATE_CALLBACK:
+                return VISUAL_STATE_CALLBACK_FEATURE;
+            default:
+                throw new RuntimeException("Unknown feature " + feature);
+        }
+    }
+
+    /**
+     * Return whether this {@link WebViewFeature} is supported by the framework of the current
+     * device.
+     */
+    public boolean isSupportedByFramework() {
+        return Build.VERSION.SDK_INT >= mOsVersion;
+    }
+
+    /**
+     * Return whether this {@link WebViewFeature} is supported by the current WebView APK.
+     */
+    public boolean isSupportedByWebView() {
+        String[] webviewFeatures = LAZY_HOLDER.WEBVIEW_APK_FEATURES;
+        for (String webviewFeature : webviewFeatures) {
+            if (webviewFeature.equals(mFeatureValue)) return true;
+        }
+        return false;
+    }
+
+    private static class LAZY_HOLDER {
+        static final String[] WEBVIEW_APK_FEATURES =
+                WebViewGlueCommunicator.getFactory().getWebViewFeatures();
+    }
+
+    /**
+     * Utility method for throwing an exception explaining that the feature the app trying to use
+     * isn't supported.
+     */
+    public static void throwUnsupportedOperationException(String feature) {
+        throw new UnsupportedOperationException("Feature " + feature
+                + " is not supported by the current version of the framework and WebView APK");
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/WebViewGlueCommunicator.java b/webkit/src/main/java/androidx/webkit/internal/WebViewGlueCommunicator.java
index 1325ed0..33ac145 100644
--- a/webkit/src/main/java/androidx/webkit/internal/WebViewGlueCommunicator.java
+++ b/webkit/src/main/java/androidx/webkit/internal/WebViewGlueCommunicator.java
@@ -61,12 +61,21 @@
             Class<?> glueFactoryProviderFetcherClass = Class.forName(
                     GLUE_FACTORY_PROVIDER_FETCHER_CLASS, false, getWebViewClassLoader());
             Method createProviderFactoryMethod = glueFactoryProviderFetcherClass.getDeclaredMethod(
-                    GLUE_FACTORY_PROVIDER_FETCHER_METHOD);
-            return (InvocationHandler) createProviderFactoryMethod.invoke(null);
-        } catch (IllegalAccessException | InvocationTargetException | ClassNotFoundException
-                | NoSuchMethodException e) {
+                    GLUE_FACTORY_PROVIDER_FETCHER_METHOD, InvocationHandler.class);
+            return (InvocationHandler) createProviderFactoryMethod.invoke(null,
+                    BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
+                            new SupportLibraryInfo()));
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException(e);
+        } catch (InvocationTargetException e) {
+            throw new RuntimeException(e);
+        } catch (ClassNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (NoSuchMethodException e) {
             throw new RuntimeException(e);
         }
+        // TODO(gsennton) if the above happens we should avoid throwing an exception! And probably
+        // declare that the list of features supported by the WebView APK is empty.
     }
 
     private static WebViewProviderFactoryBoundaryInterface createGlueProviderFactory() {
diff --git a/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java b/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java
index 62ce41e..efe0e64 100644
--- a/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java
+++ b/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java
@@ -18,6 +18,7 @@
 
 import android.webkit.WebView;
 
+import org.chromium.support_lib_boundary.ServiceWorkerControllerBoundaryInterface;
 import org.chromium.support_lib_boundary.StaticsBoundaryInterface;
 import org.chromium.support_lib_boundary.WebViewProviderBoundaryInterface;
 import org.chromium.support_lib_boundary.WebViewProviderFactoryBoundaryInterface;
@@ -63,4 +64,20 @@
         return BoundaryInterfaceReflectionUtil.castToSuppLibClass(
                 StaticsBoundaryInterface.class, mImpl.getStatics());
     }
+
+    /**
+     * Adapter method for fetching the features supported by the current WebView APK.
+     */
+    public String[] getWebViewFeatures() {
+        return mImpl.getSupportedFeatures();
+    }
+
+    /**
+     * Adapter method for fetching the support library class representing
+     * {@link android.webkit.ServiceWorkerController}.
+     */
+    public ServiceWorkerControllerBoundaryInterface getServiceWorkerController() {
+        return BoundaryInterfaceReflectionUtil.castToSuppLibClass(
+                ServiceWorkerControllerBoundaryInterface.class, mImpl.getServiceWorkerController());
+    }
 }