[automerger skipped] Import translations. DO NOT MERGE
am: 4670d420c1 -s ours
am skip reason: subject contains skip directive

Change-Id: I1f3d91a8dd8071a88d35a01965141cc8c01657a9
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 6d06bcc..2564487 100755
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -10,16 +10,16 @@
     <uses-permission android:name="android.permission.SET_WALLPAPER_COMPONENT" />
 
     <application
+        tools:replace="android:icon,android:name"
         android:extractNativeLibs="false"
         android:hardwareAccelerated="true"
-        android:icon="@mipmap/product_logo_wallpapers_launcher_color_48"
+        android:icon="@drawable/ic_home"
         android:label="@string/app_name"
         android:requiredForAllUsers="true"
         android:restoreAnyVersion="true"
         android:supportsRtl="true"
         android:name="com.android.customization.picker.CustomizationPickerApplication"
-        android:theme="@style/CustomizationTheme"
-        tools:replace="android:name">
+        android:theme="@style/CustomizationTheme">
         <activity
             android:name="com.android.customization.picker.CustomizationPickerActivity"
             android:label="@string/app_name"
diff --git a/res/color/option_border_color.xml b/res/color/option_border_color.xml
index ea5f189..ec5ab97 100644
--- a/res/color/option_border_color.xml
+++ b/res/color/option_border_color.xml
@@ -23,5 +23,6 @@
         android:alpha="0.24"
         android:color="?android:colorAccent" />
     <item
-        android:color="@color/material_grey500"/>
+        android:alpha="0.05"
+        android:color="@color/option_border_default"/>
 </selector>
diff --git a/res/drawable/color_chip_hollow.xml b/res/drawable/color_chip_hollow.xml
index 76ab6b8..c0eab74 100644
--- a/res/drawable/color_chip_hollow.xml
+++ b/res/drawable/color_chip_hollow.xml
@@ -17,8 +17,8 @@
 -->
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
         android:shape="ring"
-        android:innerRadius="13dp"
-        android:thickness="8dp"
+        android:innerRadius="10dp"
+        android:thickness="6dp"
         android:useLevel="false">
     <solid android:color="@android:color/black"/>
 </shape>
diff --git a/res/drawable/ic_home.xml b/res/drawable/ic_home.xml
new file mode 100644
index 0000000..c1c8e56
--- /dev/null
+++ b/res/drawable/ic_home.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/icon_background" />
+    <foreground>
+        <inset android:inset="16.6%" android:drawable="@drawable/icon_foreground" />
+    </foreground>
+</adaptive-icon>
diff --git a/res/drawable/icon_foreground.xml b/res/drawable/icon_foreground.xml
new file mode 100644
index 0000000..1138c56
--- /dev/null
+++ b/res/drawable/icon_foreground.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector android:height="72dp" android:viewportHeight="512"
+    android:viewportWidth="512" android:width="72dp"
+    xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:pathData="M512.25,248.55l-118,-118 -4.86,-4.86c-1.72,-1.65 -3.47,-3.28 -5.26,-4.86 -33,-29.29 -78.25,-47.41 -128.1,-47.41 -100.59,0 -182.56,82 -182.56,182.56a181.9,181.9 0,0 0,50.09 125.42h0l0.14,0.14q3.39,3.58 7,7L254.16,512H512.25Z">
+        <aapt:attr name="android:fillColor">
+            <gradient android:endX="512.25" android:endY="292.69"
+                android:startX="73.44" android:startY="292.69" android:type="linear">
+                <item android:color="#331C3AA9" android:offset="0"/>
+                <item android:color="#051C3AA9" android:offset="1"/>
+            </gradient>
+        </aapt:attr>
+    </path>
+    <path android:fillAlpha="0.2" android:fillColor="#1a237e"
+        android:pathData="M256,438.51c-100.59,0 -182.56,-82 -182.56,-182.56S155.41,73.39 256,73.39s182.56,73.75 182.56,164.3A109.63,109.63 0,0 1,329 347.23L296.71,347.23a9,9 0,0 0,-9.13 9.12,9.65 9.65,0 0,0 2.38,6 46.46,46.46 0,0 1,11.68 30.49A45.66,45.66 0,0 1,256 438.51ZM155.59,274.2a27.38,27.38 0,1 0,-27.38 -27.38A27.38,27.38 0,0 0,155.59 274.2ZM210.36,201.2A27.39,27.39 0,1 0,183 173.8,27.38 27.38,0 0,0 210.36,201.18ZM301.64,201.2a27.39,27.39 0,1 0,-27.38 -27.38A27.38,27.38 0,0 0,301.64 201.18ZM356.41,274.2A27.38,27.38 0,1 0,329 246.82,27.38 27.38,0 0,0 356.41,274.2Z" android:strokeAlpha="0.2"/>
+    <path android:fillColor="#fff" android:pathData="M389.36,125.66l4.86,4.86C392.64,128.87 391,127.25 389.36,125.66Z"/>
+    <path android:fillColor="#eee" android:pathData="M256,438.51c-100.59,0 -182.56,-82 -182.56,-182.56S155.41,73.39 256,73.39s182.56,73.75 182.56,164.3A109.63,109.63 0,0 1,329 347.23L296.71,347.23a9,9 0,0 0,-9.13 9.12,9.65 9.65,0 0,0 2.38,6 46.46,46.46 0,0 1,11.68 30.49A45.66,45.66 0,0 1,256 438.51ZM155.59,274.2a27.38,27.38 0,1 0,-27.38 -27.38A27.38,27.38 0,0 0,155.59 274.2ZM210.36,201.2A27.39,27.39 0,1 0,183 173.8,27.38 27.38,0 0,0 210.36,201.18ZM301.64,201.2a27.39,27.39 0,1 0,-27.38 -27.38A27.38,27.38 0,0 0,301.64 201.18ZM356.41,274.2A27.38,27.38 0,1 0,329 246.82,27.38 27.38,0 0,0 356.41,274.2Z"/>
+    <path android:fillAlpha="0.4" android:fillColor="#fff" android:pathData="M256,75.39c100.24,0 182,73.24 182.55,163.36 0,-0.36 0,-0.71 0,-1.06 0,-90.55 -82,-164.3 -182.56,-164.3S73.44,155.36 73.44,256c0,0.33 0,0.66 0,1C74,156.82 155.74,75.39 256,75.39Z"/>
+    <path android:fillAlpha="0.1" android:fillColor="#212121" android:pathData="M329,345.23H296.71a9,9 0,0 0,-9.13 9.12,7.45 7.45,0 0,0 0.07,0.95 9,9 0,0 1,9.06 -8.07H329A109.63,109.63 0,0 0,438.56 237.69c0,-0.31 0,-0.63 0,-0.94A109.62,109.62 0,0 1,329 345.23Z"/>
+    <path android:fillAlpha="0.1" android:fillColor="#212121" android:pathData="M256,436.51C155.74,436.51 74,355.08 73.45,255c0,0.33 0,0.66 0,1 0,100.59 82,182.56 182.56,182.56a45.66,45.66 0,0 0,45.64 -45.64c0,-0.35 0,-0.69 0,-1A45.66,45.66 0,0 1,256 436.51Z"/>
+    <path android:fillAlpha="0.1" android:fillColor="#212121" android:pathData="M356.41,221.44a27.38,27.38 0,0 1,27.36 26.38c0,-0.33 0,-0.67 0,-1a27.39,27.39 0,0 0,-54.77 0c0,0.33 0,0.67 0,1A27.38,27.38 0,0 1,356.41 221.44Z"/>
+    <path android:fillAlpha="0.1" android:fillColor="#212121" android:pathData="M301.64,148.41A27.39,27.39 0,0 1,329 174.8c0,-0.34 0,-0.67 0,-1a27.38,27.38 0,1 0,-54.76 0c0,0.33 0,0.66 0,1A27.39,27.39 0,0 1,301.64 148.41Z"/>
+    <path android:fillColor="#8ab4f8" android:pathData="M155.59,246.82m-27.38,0a27.38,27.38 0,1 1,54.76 0a27.38,27.38 0,1 1,-54.76 0"/>
+    <path android:fillAlpha="0.6" android:fillColor="#8ab4f8"
+        android:pathData="M210.36,173.8m-27.38,0a27.38,27.38 0,1 1,54.76 0a27.38,27.38 0,1 1,-54.76 0" android:strokeAlpha="0.6"/>
+    <path android:fillAlpha="0.3" android:fillColor="#8ab4f8"
+        android:pathData="M301.64,173.8m-27.38,0a27.38,27.38 0,1 1,54.76 0a27.38,27.38 0,1 1,-54.76 0" android:strokeAlpha="0.3"/>
+    <path android:fillColor="#1a73e8" android:pathData="M356.41,246.82m-27.38,0a27.38,27.38 0,1 1,54.76 0a27.38,27.38 0,1 1,-54.76 0"/>
+    <path android:fillAlpha="0.1" android:fillColor="#212121" android:pathData="M155.59,274.2A27.38,27.38 0,0 0,183 246.82c0,-0.34 0,-0.67 0,-1a27.38,27.38 0,0 1,-54.72 0c0,0.33 0,0.66 0,1A27.38,27.38 0,0 0,155.59 274.2Z"/>
+    <path android:fillAlpha="0.24000001" android:fillColor="#fff"
+        android:pathData="M155.59,219.44a27.38,27.38 0,0 0,-27.38 27.38c0,0.33 0,0.67 0,1a27.38,27.38 0,0 1,54.72 0c0,-0.33 0,-0.67 0,-1A27.38,27.38 0,0 0,155.59 219.44Z" android:strokeAlpha="0.6"/>
+    <path android:fillAlpha="0.24000001" android:fillColor="#fff"
+        android:pathData="M210.36,146.41A27.38,27.38 0,0 0,183 173.8c0,0.33 0,0.66 0,1a27.38,27.38 0,0 1,54.72 0c0,-0.34 0,-0.67 0,-1A27.38,27.38 0,0 0,210.36 146.41Z" android:strokeAlpha="0.6"/>
+    <path android:fillAlpha="0.1" android:fillColor="#212121" android:pathData="M210.36,201.18a27.38,27.38 0,0 0,27.38 -27.38c0,-0.34 0,-0.67 0,-1a27.38,27.38 0,0 1,-54.72 0c0,0.33 0,0.66 0,1A27.38,27.38 0,0 0,210.36 201.18Z"/>
+    <path android:fillAlpha="0.1" android:fillColor="#212121" android:pathData="M301.64,199.18a27.38,27.38 0,0 1,-27.36 -26.38c0,0.33 0,0.66 0,1a27.38,27.38 0,0 0,54.76 0c0,-0.34 0,-0.67 0,-1A27.38,27.38 0,0 1,301.64 199.18Z"/>
+    <path android:fillAlpha="0.24000001" android:fillColor="#fff"
+        android:pathData="M301.64,148.41A27.39,27.39 0,0 1,329 174.8c0,-0.34 0,-0.67 0,-1a27.38,27.38 0,1 0,-54.76 0c0,0.33 0,0.66 0,1A27.39,27.39 0,0 1,301.64 148.41Z" android:strokeAlpha="0.6"/>
+    <path android:fillAlpha="0.24000001" android:fillColor="#fff"
+        android:pathData="M356.41,221.44a27.38,27.38 0,0 1,27.36 26.38c0,-0.33 0,-0.67 0,-1a27.39,27.39 0,0 0,-54.77 0c0,0.33 0,0.67 0,1A27.38,27.38 0,0 1,356.41 221.44Z" android:strokeAlpha="0.6"/>
+    <path android:fillAlpha="0.1" android:fillColor="#FF000000" android:pathData="M356.41,272.2a27.38,27.38 0,0 1,-27.36 -26.38c0,0.33 0,0.66 0,1a27.39,27.39 0,0 0,54.77 0c0,-0.34 0,-0.67 0,-1A27.38,27.38 0,0 1,356.41 272.2Z"/>
+    <path android:pathData="M0,0.07V512H512V0Z">
+        <aapt:attr name="android:fillColor">
+            <gradient android:centerX="16.842121"
+                android:centerY="53.77451"
+                android:gradientRadius="512.5738" android:type="radial">
+                <item android:color="#19FFFFFF" android:offset="0"/>
+                <item android:color="#00FFFFFF" android:offset="1"/>
+            </gradient>
+        </aapt:attr>
+    </path>
+</vector>
diff --git a/res/drawable/theme_cover_scrim.xml b/res/drawable/theme_cover_scrim.xml
index 029ea85..c75213c 100644
--- a/res/drawable/theme_cover_scrim.xml
+++ b/res/drawable/theme_cover_scrim.xml
@@ -17,10 +17,11 @@
 -->
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
-    <gradient
+   <gradient
         android:angle="90"
-        android:startColor="@android:color/transparent"
+        android:centerY="25%"
+        android:startColor="@color/black_38_alpha"
         android:centerColor="@android:color/transparent"
-        android:endColor="@color/translucent_black_darker"
+        android:endColor="@android:color/transparent"
         android:type="linear" />
 </shape>
\ No newline at end of file
diff --git a/res/drawable/theme_cover_scrim_custom.xml b/res/drawable/theme_cover_scrim_custom.xml
deleted file mode 100644
index de49be3..0000000
--- a/res/drawable/theme_cover_scrim_custom.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
-     Copyright (C) 2019 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<layer-list
-        xmlns:android="http://schemas.android.com/apk/res/android" >
-    <item android:drawable="@drawable/theme_cover_scrim"/>
-    <item>
-        <shape android:shape="rectangle">
-            <gradient
-                android:angle="90"
-                android:centerY="25%"
-                android:startColor="@color/black_67_alpha"
-                android:centerColor="@android:color/transparent"
-                android:endColor="@android:color/transparent"
-                android:type="linear" />
-        </shape>
-    </item>
-</layer-list>
\ No newline at end of file
diff --git a/res/layout-land/fragment_clock_picker.xml b/res/layout-land/fragment_clock_picker.xml
index a292876..b5044b7 100644
--- a/res/layout-land/fragment_clock_picker.xml
+++ b/res/layout-land/fragment_clock_picker.xml
@@ -23,46 +23,75 @@
     android:background="?android:colorPrimary">
     <include layout="@layout/section_header"/>
 
-    <LinearLayout
+    <FrameLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="horizontal">
-
-        <com.android.customization.widget.PreviewPager
-            android:id="@+id/clock_preview_pager"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:background="@color/secondary_color"
-            app:card_style="screen_aspect_ratio"/>
+        android:layout_height="match_parent">
 
         <LinearLayout
-            android:id="@+id/options_section"
-            android:layout_width="0dp"
+            android:id="@+id/content_section"
+            android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:paddingVertical="10dp"
-            android:orientation="vertical">
+            android:orientation="horizontal">
 
-            <androidx.recyclerview.widget.RecyclerView
-                android:id="@+id/options_container"
-                android:layout_width="match_parent"
-                android:layout_height="0dp"
-                android:layout_weight="1"/>
+            <com.android.customization.widget.PreviewPager
+                android:id="@+id/clock_preview_pager"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="@color/secondary_color"
+                app:card_style="screen_aspect_ratio"/>
 
-            <RelativeLayout
+            <LinearLayout
+                android:id="@+id/options_section"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:paddingVertical="10dp"
+                android:orientation="vertical">
+
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/options_container"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_weight="1"/>
+
+                <RelativeLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingHorizontal="10dp">
+                    <Button
+                        android:id="@+id/apply_button"
+                        style="@style/ActionPrimaryButton"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_alignParentEnd="true"
+                        android:text="@string/apply_btn"/>
+                </RelativeLayout>
+
+            </LinearLayout>
+        </LinearLayout>
+        <androidx.core.widget.ContentLoadingProgressBar
+            android:id="@+id/loading_indicator"
+            style="@android:style/Widget.DeviceDefault.ProgressBar"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="200dp"
+            android:layout_gravity="center_horizontal|top"
+            android:indeterminate="true"/>
+
+        <FrameLayout
+            android:id="@+id/error_section"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone">
+            <TextView
+                android:id="@+id/error_message"
+                style="@style/HeaderTextAppearance"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:paddingHorizontal="10dp">
-                <Button
-                    android:id="@+id/apply_button"
-                    style="@style/ActionPrimaryButton"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentEnd="true"
-                    android:text="@string/apply_btn"/>
-            </RelativeLayout>
-
-        </LinearLayout>
-    </LinearLayout>
+                android:layout_gravity="center"
+                android:gravity="center"
+                android:text="@string/something_went_wrong"/>
+        </FrameLayout>
+    </FrameLayout>
 </LinearLayout>
diff --git a/res/layout-land/fragment_grid_picker.xml b/res/layout-land/fragment_grid_picker.xml
index 20ee447..6fc5933 100644
--- a/res/layout-land/fragment_grid_picker.xml
+++ b/res/layout-land/fragment_grid_picker.xml
@@ -21,7 +21,13 @@
     android:orientation="vertical"
     android:background="?android:colorPrimary">
     <include layout="@layout/section_header"/>
-    <LinearLayout
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <LinearLayout
+        android:id="@+id/content_section"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:orientation="horizontal">
@@ -62,4 +68,28 @@
 
         </LinearLayout>
     </LinearLayout>
+        <androidx.core.widget.ContentLoadingProgressBar
+            android:id="@+id/loading_indicator"
+            style="@android:style/Widget.DeviceDefault.ProgressBar"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="200dp"
+            android:layout_gravity="center_horizontal|top"
+            android:indeterminate="true"/>
+
+        <FrameLayout
+            android:id="@+id/error_section"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone">
+            <TextView
+                android:id="@+id/error_message"
+                style="@style/HeaderTextAppearance"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:gravity="center"
+                android:text="@string/something_went_wrong"/>
+        </FrameLayout>
+    </FrameLayout>
 </LinearLayout>
diff --git a/res/layout-land/fragment_theme_picker.xml b/res/layout-land/fragment_theme_picker.xml
index 267ef0d..cd3cdbd 100644
--- a/res/layout-land/fragment_theme_picker.xml
+++ b/res/layout-land/fragment_theme_picker.xml
@@ -22,55 +22,88 @@
     android:background="?android:colorPrimary">
     <include layout="@layout/section_header"/>
 
-    <LinearLayout
+    <FrameLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="horizontal">
-
-        <com.android.customization.widget.PreviewPager
-            android:id="@+id/theme_preview_pager"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:background="@color/secondary_color"/>
-
+        android:layout_height="match_parent">
         <LinearLayout
-            android:id="@+id/options_section"
-            android:layout_width="0dp"
+            android:id="@+id/content_section"
+            android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:paddingVertical="10dp"
-            android:orientation="vertical">
+            android:orientation="horizontal">
 
-            <androidx.recyclerview.widget.RecyclerView
-                android:id="@+id/options_container"
-                android:layout_width="match_parent"
-                android:layout_height="0dp"
-                android:layout_weight="1"/>
+            <com.android.customization.widget.PreviewPager
+                android:id="@+id/theme_preview_pager"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="@color/secondary_color"/>
+            <View
+                android:layout_width="1dp"
+                android:layout_height="match_parent"
+                android:background="@color/divider_color"/>
+            <LinearLayout
+                android:id="@+id/options_section"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:paddingVertical="10dp"
+                android:orientation="vertical">
 
-            <RelativeLayout
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/options_container"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_weight="1"/>
+
+                <RelativeLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:background="@null"
+                    android:paddingHorizontal="10dp">
+                    <CheckBox
+                        android:id="@+id/use_my_wallpaper"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_alignParentStart="true"
+                        android:layout_centerVertical="true"
+                        android:layout_toStartOf="@+id/apply_button"
+                        android:ellipsize="end"
+                        android:paddingLeft="4dp"
+                        android:minHeight="@dimen/min_taptarget_height"
+                        android:text="@string/keep_my_wallpaper"/>
+                    <Button
+                        android:id="@+id/apply_button"
+                        style="@style/ActionPrimaryButton"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_alignParentEnd="true"
+                        android:text="@string/apply_theme_btn"/>
+                </RelativeLayout>
+            </LinearLayout>
+        </LinearLayout>
+
+        <androidx.core.widget.ContentLoadingProgressBar
+            android:id="@+id/loading_indicator"
+            style="@android:style/Widget.DeviceDefault.ProgressBar"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="200dp"
+            android:layout_gravity="center_horizontal|top"
+            android:indeterminate="true"/>
+
+        <FrameLayout
+            android:id="@+id/error_section"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone">
+            <TextView
+                android:id="@+id/error_message"
+                style="@style/HeaderTextAppearance"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:paddingHorizontal="10dp">
-                <CheckBox
-                    android:id="@+id/use_my_wallpaper"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentStart="true"
-                    android:layout_centerVertical="true"
-                    android:layout_toStartOf="@+id/apply_button"
-                    android:ellipsize="end"
-                    android:paddingLeft="4dp"
-                    android:minHeight="@dimen/min_taptarget_height"
-                    android:text="@string/keep_my_wallpaper"/>
-                <Button
-                    android:id="@+id/apply_button"
-                    style="@style/ActionPrimaryButton"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentEnd="true"
-                    android:text="@string/apply_theme_btn"/>
-            </RelativeLayout>
-        </LinearLayout>
-    </LinearLayout>
+                android:layout_gravity="center"
+                android:gravity="center"
+                android:text="@string/something_went_wrong"/>
+        </FrameLayout>
+    </FrameLayout>
 </LinearLayout>
diff --git a/res/layout/clock_option.xml b/res/layout/clock_option.xml
index 30aa14f..e65cb65 100644
--- a/res/layout/clock_option.xml
+++ b/res/layout/clock_option.xml
@@ -19,6 +19,8 @@
     android:layout_height="wrap_content"
     android:paddingRight="2dp"
     android:paddingBottom="@dimen/option_bottom_margin"
+    android:clipChildren="false"
+    android:clipToPadding="false"
     android:orientation="vertical">
 
     <TextView
diff --git a/res/layout/fragment_clock_picker.xml b/res/layout/fragment_clock_picker.xml
index da4f891..e7530f3 100644
--- a/res/layout/fragment_clock_picker.xml
+++ b/res/layout/fragment_clock_picker.xml
@@ -23,40 +23,89 @@
     android:background="?android:colorPrimary">
     <include layout="@layout/section_header"/>
 
-    <com.android.customization.widget.PreviewPager
-        android:id="@+id/clock_preview_pager"
+    <FrameLayout
         android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1"
-        android:background="@color/secondary_color"
-        app:card_style="screen_aspect_ratio"/>
+        android:layout_height="match_parent">
 
-    <LinearLayout
-        android:id="@+id/options_section"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:paddingVertical="10dp"
-        android:orientation="vertical">
-
-        <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/options_container"
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/content_section"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/options_container_height"
-            android:layout_gravity="center_horizontal"/>
+            android:layout_height="match_parent">
 
-        <RelativeLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:paddingHorizontal="10dp">
+            <com.android.customization.widget.PreviewPager
+                android:id="@+id/clock_preview_pager"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/preview_pager_background"
+                app:layout_constrainedHeight="true"
+                app:layout_constraintBottom_toTopOf="@id/options_container"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintHeight_max="@dimen/preview_pager_max_height"
+                app:layout_constraintHeight_min="@dimen/preview_pager_min_height"
+                app:layout_constraintVertical_bias="0.0"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintVertical_chainStyle="spread_inside"/>
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/options_container"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/options_container_height"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="10dp"
+                app:layout_constraintBottom_toTopOf="@id/placeholder"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@+id/clock_preview_pager"
+                app:layout_constraintVertical_bias="1.0"/>
+
+            <Space
+                android:id="@+id/placeholder"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/min_taptarget_height"
+                app:layout_constraintBottom_toTopOf="@id/apply_button"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintHeight_min="@dimen/min_taptarget_height"
+                app:layout_constraintHorizontal_bias="0.0"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/options_container"
+                app:layout_constraintVertical_bias="1.0"/>
+
             <Button
                 android:id="@+id/apply_button"
                 style="@style/ActionPrimaryButton"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_alignParentEnd="true"
-                android:text="@string/apply_btn"/>
-        </RelativeLayout>
+                android:layout_gravity="end"
+                android:layout_marginEnd="10dp"
+                android:layout_marginVertical="10dp"
+                android:layout_weight="1"
+                android:text="@string/apply_theme_btn"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"/>
+        </androidx.constraintlayout.widget.ConstraintLayout>
 
-    </LinearLayout>
-
+        <androidx.core.widget.ContentLoadingProgressBar
+            android:id="@+id/loading_indicator"
+            style="@android:style/Widget.DeviceDefault.ProgressBar"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="200dp"
+            android:layout_gravity="center_horizontal|top"
+            android:indeterminate="true"/>
+        <FrameLayout
+            android:id="@+id/error_section"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone">
+            <TextView
+                android:id="@+id/error_message"
+                style="@style/HeaderTextAppearance"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:gravity="center"
+                android:text="@string/something_went_wrong"/>
+        </FrameLayout>
+    </FrameLayout>
 </LinearLayout>
diff --git a/res/layout/fragment_custom_theme_component.xml b/res/layout/fragment_custom_theme_component.xml
index e9dd927..fb9c36c 100644
--- a/res/layout/fragment_custom_theme_component.xml
+++ b/res/layout/fragment_custom_theme_component.xml
@@ -16,54 +16,85 @@
 -->
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
     android:background="?android:colorPrimary">
     <include layout="@layout/section_header"/>
 
-    <FrameLayout
-        android:id="@+id/component_preview_container"
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1"
-        android:background="?android:colorPrimary">
-        <include
-            android:id="@+id/component_preview_content"
+        android:layout_height="match_parent">
+
+        <FrameLayout
+            android:id="@+id/component_preview_container"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_marginHorizontal="@dimen/preview_page_horizontal_margin"
-            android:layout_marginTop="@dimen/preview_page_top_margin"
-            android:layout_marginBottom="@dimen/component_preview_page_bottom_margin"
-            layout="@layout/theme_component_preview"/>
-    </FrameLayout>
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="1dp"
-        android:background="@color/divider_color"/>
-    <LinearLayout
-        android:id="@+id/options_section"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:paddingVertical="10dp"
-        android:clipToPadding="false"
-        android:orientation="vertical">
+            android:layout_height="0dp"
+            android:background="?android:colorPrimary"
+            app:layout_constrainedHeight="true"
+            app:layout_constraintBottom_toTopOf="@+id/guideline"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHeight_max="@dimen/preview_pager_max_height"
+            app:layout_constraintHorizontal_bias="0.5"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintVertical_bias="0.0">
+
+            <include
+                android:id="@+id/component_preview_content"
+                layout="@layout/theme_component_preview"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_gravity="center_vertical"
+                android:layout_marginHorizontal="@dimen/preview_page_horizontal_margin"
+                android:layout_marginTop="@dimen/preview_page_top_margin"/>
+        </FrameLayout>
+        <View
+            android:id="@+id/divider"
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="@color/divider_color"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/component_preview_container"/>
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            app:layout_constraintGuide_percent=".7"/>
+
 
         <TextView
             android:id="@+id/component_options_title"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            android:layout_margin="10dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginStart="10dp"
+            android:layout_marginEnd="10dp"
+            android:layout_marginBottom="10dp"
             android:textAlignment="center"
-            android:textAppearance="@style/HeaderTextAppearance"/>
+            android:textAppearance="@style/HeaderTextAppearance"
+            android:textSize="@dimen/component_options_title_size"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/component_preview_container"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintVertical_bias=".15"/>
 
         <androidx.recyclerview.widget.RecyclerView
             android:id="@+id/options_container"
             android:layout_width="match_parent"
             android:layout_height="@dimen/options_container_height"
-            android:layout_gravity="center_horizontal"/>
+            android:layout_gravity="center_horizontal"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.5"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/component_options_title"
+            app:layout_constraintVertical_bias=".25"/>
 
-    </LinearLayout>
-
+    </androidx.constraintlayout.widget.ConstraintLayout>
 </LinearLayout>
diff --git a/res/layout/fragment_custom_theme_name.xml b/res/layout/fragment_custom_theme_name.xml
index 98feb60..6a3d1ba 100644
--- a/res/layout/fragment_custom_theme_name.xml
+++ b/res/layout/fragment_custom_theme_name.xml
@@ -16,59 +16,80 @@
 -->
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:orientation="vertical"
     android:background="?android:colorPrimary">
     <include layout="@layout/section_header"/>
 
-    <FrameLayout
-        android:id="@+id/component_preview_container"
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1"
-        android:background="@color/secondary_color">
-        <include
-            android:id="@+id/component_preview_content"
+        android:layout_height="match_parent">
+
+        <FrameLayout
+            android:id="@+id/component_preview_container"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_marginHorizontal="@dimen/preview_page_horizontal_margin"
-            android:layout_marginTop="@dimen/preview_page_top_margin"
-            android:layout_marginBottom="@dimen/component_preview_page_bottom_margin"
-            layout="@layout/theme_preview_card"/>
-    </FrameLayout>
-    <LinearLayout
-        android:id="@+id/options_section"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:paddingVertical="10dp"
-        android:clipToPadding="false"
-        android:orientation="vertical">
+            android:layout_height="0dp"
+            android:background="@color/secondary_color"
+            app:layout_constrainedHeight="true"
+            app:layout_constraintBottom_toTopOf="@+id/guideline"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHeight_max="@dimen/preview_pager_max_height"
+            app:layout_constraintHorizontal_bias="0.5"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintVertical_bias="0.0">
+
+            <include
+                android:id="@+id/component_preview_content"
+                layout="@layout/theme_preview_card"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_marginHorizontal="@dimen/preview_page_horizontal_margin"
+                android:layout_marginTop="@dimen/preview_page_top_margin"
+                android:layout_marginBottom="@dimen/indicator_container_height"/>
+        </FrameLayout>
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            app:layout_constraintGuide_percent=".7"/>
 
         <TextView
             android:id="@+id/component_options_title"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            android:layout_margin="10dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginStart="10dp"
+            android:layout_marginEnd="10dp"
+            android:layout_marginBottom="10dp"
             android:textAlignment="center"
-            android:textAppearance="@style/HeaderTextAppearance"/>
+            android:textAppearance="@style/HeaderTextAppearance"
+            android:textSize="@dimen/component_options_title_size"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/component_preview_container"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintVertical_bias=".15"/>
 
-        <FrameLayout
-            android:layout_width="match_parent"
-            android:layout_height="@dimen/options_container_height"
-            android:layout_gravity="center">
+        <EditText
+            android:id="@+id/custom_theme_name"
+            style="@style/CustomThemeNameEditText"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:importantForAutofill="no"
+            android:minWidth="300dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.5"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/component_options_title"
+            app:layout_constraintVertical_bias=".25"/>
 
-            <EditText
-                style="@style/CustomThemeNameEditText"
-                android:id="@+id/custom_theme_name"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center"
-                android:minWidth="300dp"/>
-        </FrameLayout>
 
-    </LinearLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
 
 </LinearLayout>
diff --git a/res/layout/fragment_grid_picker.xml b/res/layout/fragment_grid_picker.xml
index d7618f3..182d795 100644
--- a/res/layout/fragment_grid_picker.xml
+++ b/res/layout/fragment_grid_picker.xml
@@ -16,46 +16,95 @@
 -->
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
-    android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_height="match_parent"
     android:orientation="vertical"
     android:background="?android:colorPrimary">
     <include layout="@layout/section_header"/>
 
-    <com.android.customization.widget.PreviewPager
-        android:id="@+id/grid_preview_pager"
+    <FrameLayout
         android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1"
-        android:background="@color/secondary_color"
-        app:card_style="screen_aspect_ratio"/>
+        android:layout_height="match_parent">
 
-    <LinearLayout
-        android:id="@+id/options_section"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:paddingVertical="10dp"
-        android:orientation="vertical">
-
-        <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/options_container"
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/content_section"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/options_container_height"
-            android:layout_gravity="center_horizontal"/>
+            android:layout_height="match_parent">
 
-        <RelativeLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:paddingHorizontal="10dp">
+            <com.android.customization.widget.PreviewPager
+                android:id="@+id/grid_preview_pager"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/preview_pager_background"
+                app:card_style="screen_aspect_ratio"
+                app:layout_constrainedHeight="true"
+                app:layout_constraintBottom_toTopOf="@id/options_container"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintHeight_max="@dimen/preview_pager_max_height"
+                app:layout_constraintHeight_min="@dimen/preview_pager_min_height"
+                app:layout_constraintVertical_bias="0.0"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintVertical_chainStyle="spread_inside"/>
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/options_container"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/options_container_height"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="10dp"
+                app:layout_constraintBottom_toTopOf="@id/placeholder"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@+id/grid_preview_pager"
+                app:layout_constraintVertical_bias="1.0"/>
+
+            <Space
+                android:id="@+id/placeholder"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/min_taptarget_height"
+                app:layout_constraintBottom_toTopOf="@id/apply_button"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/options_container"
+                app:layout_constraintVertical_bias="1.0"/>
+
             <Button
                 android:id="@+id/apply_button"
                 style="@style/ActionPrimaryButton"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_alignParentEnd="true"
-                android:text="@string/apply_btn"/>
-        </RelativeLayout>
+                android:layout_gravity="end"
+                android:layout_marginEnd="10dp"
+                android:layout_marginVertical="10dp"
+                android:layout_weight="1"
+                android:text="@string/apply_theme_btn"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"/>
 
-    </LinearLayout>
+        </androidx.constraintlayout.widget.ConstraintLayout>
 
+        <androidx.core.widget.ContentLoadingProgressBar
+            android:id="@+id/loading_indicator"
+            style="@android:style/Widget.DeviceDefault.ProgressBar"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="200dp"
+            android:layout_gravity="center_horizontal|top"
+            android:indeterminate="true"/>
+        <FrameLayout
+            android:id="@+id/error_section"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone">
+            <TextView
+                android:id="@+id/error_message"
+                style="@style/HeaderTextAppearance"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:gravity="center"
+                android:text="@string/something_went_wrong"/>
+        </FrameLayout>
+    </FrameLayout>
 </LinearLayout>
diff --git a/res/layout/fragment_theme_picker.xml b/res/layout/fragment_theme_picker.xml
index 2cfac1d..8272bde 100644
--- a/res/layout/fragment_theme_picker.xml
+++ b/res/layout/fragment_theme_picker.xml
@@ -16,56 +16,101 @@
 -->
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
     android:background="?android:colorPrimary">
     <include layout="@layout/section_header"/>
 
-    <com.android.customization.widget.PreviewPager
-        android:id="@+id/theme_preview_pager"
+    <FrameLayout
         android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1"
-        android:background="@color/secondary_color"/>
+        android:layout_height="match_parent">
 
-    <LinearLayout
-        android:id="@+id/options_section"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:paddingVertical="10dp"
-        android:orientation="vertical">
-
-        <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/options_container"
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/content_section"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/options_container_height"
-            android:layout_gravity="center_horizontal"/>
+            android:layout_height="match_parent">
 
-        <RelativeLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:paddingHorizontal="10dp">
+            <com.android.customization.widget.PreviewPager
+                android:id="@+id/theme_preview_pager"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/preview_pager_background"
+                app:layout_constrainedHeight="true"
+                app:layout_constraintBottom_toTopOf="@id/options_container"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintHeight_max="@dimen/preview_pager_max_height"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintVertical_bias="0.0"
+                app:layout_constraintVertical_chainStyle="spread_inside"/>
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/options_container"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/options_container_height"
+                android:layout_gravity="bottom|center_horizontal"
+                android:layout_marginTop="10dp"
+                android:layout_weight="1"
+                app:layout_constraintBottom_toTopOf="@id/use_my_wallpaper"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@+id/theme_preview_pager"
+                app:layout_constraintVertical_bias="1.0"/>
+
             <CheckBox
                 android:id="@+id/use_my_wallpaper"
                 android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_alignParentStart="true"
-                android:layout_centerVertical="true"
-                android:layout_toStartOf="@+id/apply_button"
+                android:layout_height="@dimen/min_taptarget_height"
+                android:layout_marginStart="10dp"
                 android:ellipsize="end"
+                android:gravity="start|center_vertical"
                 android:paddingLeft="4dp"
-                android:minHeight="@dimen/min_taptarget_height"
-                android:text="@string/keep_my_wallpaper"/>
+                android:text="@string/keep_my_wallpaper"
+                app:layout_constraintBottom_toTopOf="@id/apply_button"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintHeight_min="@dimen/min_taptarget_height"
+                app:layout_constraintHorizontal_bias="0.0"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/options_container"
+                app:layout_constraintVertical_bias="1.0"/>
+
             <Button
                 android:id="@+id/apply_button"
                 style="@style/ActionPrimaryButton"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_alignParentEnd="true"
-                android:text="@string/apply_theme_btn"/>
-        </RelativeLayout>
+                android:layout_gravity="end"
+                android:layout_marginEnd="10dp"
+                android:layout_marginBottom="10dp"
+                android:text="@string/apply_theme_btn"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"/>
+        </androidx.constraintlayout.widget.ConstraintLayout>
 
-    </LinearLayout>
+        <androidx.core.widget.ContentLoadingProgressBar
+            android:id="@+id/loading_indicator"
+            style="@android:style/Widget.DeviceDefault.ProgressBar"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="200dp"
+            android:layout_gravity="center_horizontal|top"
+            android:indeterminate="true"/>
 
+        <FrameLayout
+            android:id="@+id/error_section"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone">
+            <TextView
+                android:id="@+id/error_message"
+                style="@style/HeaderTextAppearance"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:gravity="center"
+                android:text="@string/something_went_wrong"/>
+        </FrameLayout>
+    </FrameLayout>
 </LinearLayout>
diff --git a/res/layout/grid_option.xml b/res/layout/grid_option.xml
index 5edcdc9..286c60b 100644
--- a/res/layout/grid_option.xml
+++ b/res/layout/grid_option.xml
@@ -19,6 +19,8 @@
     android:layout_height="wrap_content"
     android:paddingRight="2dp"
     android:paddingBottom="@dimen/option_bottom_margin"
+    android:clipChildren="false"
+    android:clipToPadding="false"
     android:orientation="vertical">
 
     <TextView
diff --git a/res/layout/preview_card_color_content.xml b/res/layout/preview_card_color_content.xml
index 8587652..1de2cd4 100644
--- a/res/layout/preview_card_color_content.xml
+++ b/res/layout/preview_card_color_content.xml
@@ -75,14 +75,13 @@
                 android:layout_width="@dimen/preview_theme_icon_size"
                 android:layout_height="@dimen/preview_theme_icon_size"
                 android:layout_gravity="center"
-                android:id="@+id/preview_color_qs_2_bg"
-                android:tint="@color/tile_disabled_background_color"/>
+                android:id="@+id/preview_color_qs_2_bg"/>
             <ImageView
                 android:layout_width="@dimen/preview_theme_tile_size"
                 android:layout_height="@dimen/preview_theme_tile_size"
                 android:layout_gravity="center"
                 android:id="@+id/preview_color_qs_2_icon"
-                android:color="@color/tile_disabled_icon_color"/>
+                android:color="@color/tile_enabled_icon_color"/>
         </FrameLayout>
     </LinearLayout>
     <Space
diff --git a/res/layout/preview_card_cover_content.xml b/res/layout/preview_card_cover_content.xml
index d052642..055a126 100644
--- a/res/layout/preview_card_cover_content.xml
+++ b/res/layout/preview_card_cover_content.xml
@@ -67,13 +67,12 @@
         <ImageView
             android:layout_width="@dimen/preview_theme_icon_size"
             android:layout_height="@dimen/preview_theme_icon_size"
-            android:id="@+id/preview_color_qs_2_bg"
-            android:tint="@color/tile_disabled_background_color"/>
+            android:id="@+id/preview_color_qs_2_bg"/>
         <ImageView
             android:layout_width="@dimen/preview_theme_tile_size"
             android:layout_height="@dimen/preview_theme_tile_size"
             android:id="@+id/preview_color_qs_2_icon"
-            android:color="@color/tile_disabled_icon_color"
+            android:tint="@color/tile_enabled_icon_color"
             android:layout_gravity="center"/>
     </FrameLayout>
 
diff --git a/res/layout/preview_card_font_content.xml b/res/layout/preview_card_font_content.xml
index 2a27b01..fb7879e 100644
--- a/res/layout/preview_card_font_content.xml
+++ b/res/layout/preview_card_font_content.xml
@@ -20,26 +20,39 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_gravity="center"
-    android:gravity="center_horizontal"
+    android:weightSum="7"
     android:orientation="vertical"
     tools:showIn="@layout/theme_preview_card">
     <TextView
         style="@style/FontCardTitleStyle"
         android:id="@+id/font_card_title"
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_height="16sp"
+        android:layout_weight="1.5"
+        android:layout_gravity="center"
         android:gravity="center_horizontal"
+        android:maxLines="1"
         android:text="@string/font_card_title"/>
+    <Space
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="0"/>
     <View
         android:id="@+id/font_card_divider"
         android:layout_width="15dp"
         android:layout_height="2dp"
-        android:layout_marginVertical="@dimen/font_preview_divider_gap"
+        android:layout_gravity="center"
         android:background="?android:colorAccent"/>
+    <Space
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"/>
     <TextView
         style="@style/FontCardBodyTextStyle"
         android:id="@+id/font_card_body"
-        android:layout_height="wrap_content"
+        android:layout_height="56sp"
+        android:layout_weight="2"
+        android:layout_gravity="bottom|center_horizontal"
         android:gravity="center_horizontal"
         android:text="@string/font_card_body"/>
 </LinearLayout>
\ No newline at end of file
diff --git a/res/layout/theme_color_option.xml b/res/layout/theme_color_option.xml
index 72acd8b..12fe623 100644
--- a/res/layout/theme_color_option.xml
+++ b/res/layout/theme_color_option.xml
@@ -18,7 +18,7 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_gravity="center"
-    android:padding="4dp">
+    android:padding="8dp">
 
     <ImageView
         android:id="@+id/option_tile"
diff --git a/res/layout/theme_component_preview.xml b/res/layout/theme_component_preview.xml
index a087c0d..fe2f691 100644
--- a/res/layout/theme_component_preview.xml
+++ b/res/layout/theme_component_preview.xml
@@ -14,55 +14,48 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<FrameLayout
-    xmlns:app="http://schemas.android.com/apk/res-auto"
+
+
+<androidx.constraintlayout.widget.ConstraintLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/theme_preview_card_background"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/theme_preview_card_background"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:focusable="true" tools:showIn="@layout/theme_preview_card">
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:paddingHorizontal="@dimen/preview_card_padding"
-        android:paddingTop="@dimen/preview_card_padding"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintHorizontal_bias="0.5"
-        app:layout_constraintStart_toStartOf="parent">
+    android:clipToPadding="false"
+    android:maxHeight="@dimen/preview_theme_max_height"
+    android:minHeight="@dimen/preview_theme_min_height"
+    android:paddingHorizontal="@dimen/preview_card_padding"
+    android:paddingTop="@dimen/preview_card_top_padding">
 
         <ViewStub
             android:id="@+id/theme_preview_top_bar"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout="@layout/theme_preview_topbar"
+            app:layout_constraintBottom_toTopOf="@+id/theme_preview_card_header"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.5"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"/>
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintVertical_chainStyle="spread_inside"/>
 
         <TextView
             android:id="@+id/theme_preview_card_header"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
-            android:layout_marginVertical="@dimen/card_header_top_margin"
-            android:drawablePadding="12dp"
+            android:drawablePadding="@dimen/theme_preview_header_drawable_padding"
             android:textAppearance="@style/CardTitleTextAppearance"
+            app:layout_constraintBottom_toTopOf="@id/theme_preview_card_body_container"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.5"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toBottomOf="@+id/theme_preview_top_bar"
-            app:layout_goneMarginTop="@dimen/card_header_top_margin"/>
-
-        <Space
-            android:id="@+id/theme_preview_content_spacer"
-            android:layout_width="0dp"
-            android:layout_height="0dp"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintHeight_max="48dp"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/theme_preview_card_header"/>
+            app:layout_goneMarginTop="@dimen/card_header_top_margin"
+            app:layout_constraintVertical_chainStyle="spread_inside"
+            tools:text="Default"/>
 
         <FrameLayout
             android:id="@+id/theme_preview_card_body_container"
@@ -76,23 +69,23 @@
             app:layout_constraintHeight_min="@dimen/preview_theme_content_min_height"
             app:layout_constraintHorizontal_bias="0.5"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/theme_preview_content_spacer">
-
-        </FrameLayout>
+            app:layout_constraintTop_toBottomOf="@+id/theme_preview_card_header"/>
 
         <androidx.constraintlayout.widget.Guideline
             android:id="@+id/guideline"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:orientation="horizontal"
-            app:layout_constraintGuide_end="40dp"
-        />
+            app:layout_constraintBottom_toTopOf="@+id/edit_label"
+            app:layout_constraintGuide_end="@dimen/preview_theme_content_bottom"
+            app:layout_constraintTop_toBottomOf="@+id/theme_preview_card_body_container"/>
 
         <TextView
             android:id="@+id/edit_label"
             style="@style/EditLabelStyle"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:minHeight="@dimen/min_taptarget_height"
             android:drawableStart="@drawable/ic_tune"
             android:drawablePadding="8dp"
             android:gravity="center"
@@ -102,8 +95,7 @@
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.5"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/theme_preview_card_body_container"
+            app:layout_constraintTop_toBottomOf="@+id/guideline"
             app:layout_constraintVertical_bias="0.5"/>
 
-    </androidx.constraintlayout.widget.ConstraintLayout>
-</FrameLayout>
\ No newline at end of file
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/theme_icon_option.xml b/res/layout/theme_icon_option.xml
index 4872ffc..62925ad 100644
--- a/res/layout/theme_icon_option.xml
+++ b/res/layout/theme_icon_option.xml
@@ -38,6 +38,7 @@
             android:id="@+id/option_icon"
             android:layout_width="@dimen/component_icon_thumb_size"
             android:layout_height="@dimen/component_icon_thumb_size"
-            android:layout_gravity="center"/>
+            android:layout_gravity="center"
+            android:tint="?android:colorForeground"/>
     </FrameLayout>
 </LinearLayout>
diff --git a/res/layout/theme_option.xml b/res/layout/theme_option.xml
index de81231..e103b69 100644
--- a/res/layout/theme_option.xml
+++ b/res/layout/theme_option.xml
@@ -19,6 +19,8 @@
     android:layout_height="wrap_content"
     android:paddingRight="2dp"
     android:paddingBottom="@dimen/option_bottom_margin"
+    android:clipChildren="false"
+    android:clipToPadding="false"
     android:orientation="vertical">
 
     <TextView
@@ -45,7 +47,8 @@
             android:layout_height="@dimen/theme_option_icon_sample_height"
             android:layout_alignParentTop="true"
             android:layout_alignParentLeft="true"
-            android:layout_margin="@dimen/theme_option_sample_padding"/>
+            android:layout_margin="@dimen/theme_option_sample_padding"
+            android:tint="?android:colorForeground"/>
         <ImageView
             android:id="@+id/theme_option_shape"
             android:layout_width="@dimen/theme_option_shape_sample_width"
diff --git a/res/layout/theme_preview_topbar.xml b/res/layout/theme_preview_topbar.xml
index 2422064..15b665d 100644
--- a/res/layout/theme_preview_topbar.xml
+++ b/res/layout/theme_preview_topbar.xml
@@ -20,13 +20,15 @@
     android:id="@+id/theme_preview_top_bar"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    tools:visibility="visible" tools:showIn="@layout/theme_preview_card">
+    tools:visibility="visible"
+    tools:showIn="@layout/theme_preview_card">
     <TextView
         android:id="@+id/theme_preview_clock"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="start|center_vertical"
         android:textColor="@color/icon_thumbnail_color"
+        android:textSize="@dimen/preview_theme_cover_topbar_clock_size"
         tools:text="8:10"/>
     <LinearLayout
         android:id="@+id/theme_preview_top_bar_icons"
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 9ec9fbb..63c127b 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Gebruik <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Nee, dankie"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g>-horlosievoorskou"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Oeps! Iets het skeefgeloop."</string>
 </resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index b28e5c4..ae13d48 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>ን ይጠቀሙ"</string>
     <string name="no_thanks" msgid="7286616980115687627">"አይ፣ አመሰግናለሁ"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"የ<xliff:g id="ID_1">%1$s</xliff:g> ሰዓት ቅድመ-እይታ"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"ውይ! የሆነ ችግር ተፈጥሯል።"</string>
 </resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 4ba6689..39173b0 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"استخدام <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"لا، شكرًا"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"معاينة الساعة <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"عفوًا! حدث خطأ ما."</string>
 </resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 74d907b..fc322f4 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> ব্যৱহাৰ কৰক"</string>
     <string name="no_thanks" msgid="7286616980115687627">"নালাগে, ধন্যবাদ"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ঘড়ীৰ পূৰ্বদৰ্শন"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"দুঃখিত! কিবা ভুল হ’ল।"</string>
 </resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index e8de0e2..e1001c9 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> istifadə edin"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Xeyr, təşəkkürlər"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g>, saatın önizlənməsi"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ups! Xəta baş verdi."</string>
 </resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 48bd436..cb4becd 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Koristi <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Ne, hvala"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Pregled sata <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ups! Došlo je do greške."</string>
 </resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index e48b7bc..a1b4262 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Выкарыстоўваць <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Не, дзякуй"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Папярэдні прагляд гадзінніка <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Памылка! Нешта пайшло не так."</string>
 </resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index d6599d0..ebd909a 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Използване на „<xliff:g id="ID_1">%1$s</xliff:g>“"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Не, благодаря"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Визуализация на циферблата <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ами сега! Нещо се обърка."</string>
 </resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index fc5f9f7..9d45e49 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> ব্যবহার করুন"</string>
     <string name="no_thanks" msgid="7286616980115687627">"না, থাক"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ঘড়ির প্রিভিউ"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"উপস! কিছু সমস্যা হয়েছে।"</string>
 </resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 68f3928..c09fdef 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Koristi stil <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Ne, hvala"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Pregled sata <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ups! Nešto nije uredu"</string>
 </resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index f9cc32c..9ba191e 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Utilitza l\'estil <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"No, gràcies"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Previsualització de rellotge <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Vaja! S\'ha produït un error."</string>
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 5c5f492..77ce470 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Použít styl <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Ne, děkuji"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Náhled ciferníku <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Jejda. Něco se pokazilo."</string>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 552ea19..848709b 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Brug <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Nej tak"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Forhåndsvisning af urskiven <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ups! Noget gik galt."</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index c4b44ad..681350f 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> verwenden"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Nein danke"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Vorschau für Zifferblatt <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Hoppla, ein Fehler ist aufgetreten."</string>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index fbab553..fae57a5 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Χρήση <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Όχι, ευχαριστώ"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Προεπισκόπηση ρολογιού <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Δυστυχώς, παρουσιάστηκε κάποιο πρόβλημα."</string>
 </resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 2208e8a..756ad00 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Use <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"No thanks"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> clock preview"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Oops! Something went wrong."</string>
 </resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 2208e8a..756ad00 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Use <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"No thanks"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> clock preview"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Oops! Something went wrong."</string>
 </resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 2208e8a..756ad00 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Use <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"No thanks"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> clock preview"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Oops! Something went wrong."</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 4dfe37a..7c372ae 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Usar <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"No, gracias"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Vista previa del reloj <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Se produjo un error."</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index bc5b565..47b3b8b 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Utilizar <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"No, gracias"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Vista previa del reloj <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"¡Vaya! Se ha producido un error."</string>
 </resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 59308e2..d6230af 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Kasuta teemat <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Tänan, ei"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Kella <xliff:g id="ID_1">%1$s</xliff:g> eelvaade"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Vabandust! Midagi läks valesti."</string>
 </resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index df84512..e461865 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Erabili <xliff:g id="ID_1">%1$s</xliff:g> estiloa"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Ez"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> erlojuaren aurrebista"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Arazoren bat izan da."</string>
 </resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 9af1cdb..5ffd461 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"استفاده از <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"نه، متشکرم"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> پیش‌نمایش ساعت"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"متأسفم! مشکلی رخ داد."</string>
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index d2fd65b..696b5d3 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Valitse <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Ei kiitos"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Kellon esikatselu: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Hups! Jokin meni vikaan."</string>
 </resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 9ab562b..c4b0224 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Utiliser <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Non, merci"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Aperçu de l\'horloge <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Oups! Une erreur s\'est produite."</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 417eebd..e28b35e 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Utiliser <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Non, merci"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> aperçu d\'horloge"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Petit problème… Une erreur s\'est produite."</string>
 </resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 73b4ce1..2cdb267 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Utilizar <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Non, grazas"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Vista previa do reloxo <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ai! Produciuse un erro."</string>
 </resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index d344bdd..d94c671 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>નો ઉપયોગ કરો"</string>
     <string name="no_thanks" msgid="7286616980115687627">"ના, આભાર"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ઘડિયાળનું પ્રીવ્યૂ"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"અરેરે! કંઈક ખોટું થયું."</string>
 </resources>
diff --git a/res/values-h740dp/dimens.xml b/res/values-h740dp/dimens.xml
new file mode 100644
index 0000000..a752b6b
--- /dev/null
+++ b/res/values-h740dp/dimens.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+     Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+    <dimen name="preview_theme_content_margin">12dp</dimen>
+
+    <dimen name="preview_theme_icon_size">40dp</dimen>
+    <dimen name="preview_theme_tile_size">20dp</dimen>
+    <dimen name="preview_theme_shape_size">52dp</dimen>
+    <dimen name="preview_theme_cover_content_extra_margin">8dp</dimen>
+
+    <dimen name="preview_theme_content_min_height">152dp</dimen>
+
+    <dimen name="theme_preview_header_drawable_padding">12dp</dimen>
+
+    <dimen name="card_header_top_margin">16dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 7e349c9..50e26a8 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> इस्तेमाल करें"</string>
     <string name="no_thanks" msgid="7286616980115687627">"रहने दें"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> घड़ी की झलक"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"ओह हो! कुछ गड़बड़ी हुई."</string>
 </resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index fd3990f..b3166b1 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Koristi <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Ne, hvala"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Pregled sata <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ups! Došlo je do pogreške."</string>
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 3425778..ee4df61 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> használata"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Nem, köszönöm"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> – óra előnézete"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Hoppá! Valami hiba történt."</string>
 </resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 4d0e281..94f4d1c 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Օգտագործել <xliff:g id="ID_1">%1$s</xliff:g> ոճը"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Ոչ"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ժամացույցի նախադիտում"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Սխալ առաջացավ։"</string>
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 1002084..67721f8 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Gunakan <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Lain kali"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Pratinjau jam <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ups! Ada yang tidak beres."</string>
 </resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 02d46c7..8474c87 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Nota „<xliff:g id="ID_1">%1$s</xliff:g>“"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Nei, takk"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> forskoðun klukku"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Úbbs! Eitthvað fór úrskeiðis."</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 3fd0c72..1a46542 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Usa <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"No, grazie"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Anteprima dell\'orologio <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Spiacenti. Si è verificato un problema."</string>
 </resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 5137153..f8d444b 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"שימוש בעיצוב <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"לא תודה"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"תצוגה מקדימה של שעון <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"אופס! משהו השתבש."</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index b792418..f95c696 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> を使用"</string>
     <string name="no_thanks" msgid="7286616980115687627">"いいえ"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> クロックのプレビュー"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"問題が発生しました。"</string>
 </resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 4bc9afb..5e6cab0 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>-ის გამოყენება"</string>
     <string name="no_thanks" msgid="7286616980115687627">"არა, გმადლობთ"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> საათის გადახედვა"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"უკაცრავად! წარმოიქმნა შეფერხება."</string>
 </resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index a7e5291..c8aa174 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> пайдалану"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Жоқ, рақмет"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> сағатын алдын ала қарау"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Қап! Бірдеңе дұрыс болмады."</string>
 </resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 2a7e623..1bc2e7f 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"ប្រើ <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"ទេ អរគុណ"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"ការមើល​នាឡិកា <xliff:g id="ID_1">%1$s</xliff:g> សាកល្បង"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"អូ៎! មានអ្វីមួយខុសប្រក្រតី។"</string>
 </resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 272d91e..0bffb94 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> ಅನ್ನು ಬಳಸಿ"</string>
     <string name="no_thanks" msgid="7286616980115687627">"ಬೇಡ"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ಗಡಿಯಾರ ಪೂರ್ವವೀಕ್ಷಣೆ"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"ಓಹ್! ಯಾವುದೋ ತಪ್ಪು ಸಂಭವಿಸಿದೆ."</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 80a24c0..2cdd6a8 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> 사용"</string>
     <string name="no_thanks" msgid="7286616980115687627">"아니요"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> 시계 미리보기"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"죄송합니다. 문제가 발생했습니다."</string>
 </resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index f13c07d..bcd7cea 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> колдонулсун"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Жок, рахмат"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> саатын алдын ала көрүү"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ой! Бир жерден ката кетти."</string>
 </resources>
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index 4b16b5e..985987f 100644
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -17,22 +17,31 @@
 -->
 <resources>
     <dimen name="card_title_text_size">12sp</dimen>
-    <dimen name="card_cover_title_text_size">16sp</dimen>
-    <dimen name="card_header_top_margin">8dp</dimen>
+    <dimen name="card_cover_title_text_size">14sp</dimen>
+    <dimen name="card_header_icon_size">24dp</dimen>
+    <dimen name="card_header_top_margin">6dp</dimen>
     <dimen name="preview_card_padding">8dp</dimen>
-    <dimen name="preview_page_gap">93dp</dimen>
+    <dimen name="preview_card_top_padding">6dp</dimen>
+    <dimen name="preview_page_gap">60dp</dimen>
     <dimen name="preview_page_horizontal_margin">92dp</dimen>
-    <dimen name="preview_theme_content_margin">18dp</dimen>
+    <dimen name="preview_theme_content_margin">8dp</dimen>
     <dimen name="preview_theme_content_max_height">140dp</dimen>
     <dimen name="preview_theme_content_min_height">100dp</dimen>
-    <dimen name="preview_theme_cover_topbar_icon_size">14dp</dimen>
-    <dimen name="preview_theme_icon_size">28dp</dimen>
+    <dimen name="preview_theme_cover_topbar_clock_size">12sp</dimen>
+    <dimen name="preview_theme_cover_topbar_icon_size">12dp</dimen>
+    <dimen name="preview_theme_icon_size">26dp</dimen>
     <dimen name="preview_theme_tile_size">14dp</dimen>
-    <dimen name="preview_theme_shape_size">32dp</dimen>
+    <dimen name="preview_theme_shape_size">30dp</dimen>
     <dimen name="preview_theme_cover_content_extra_margin">0dp</dimen>
+    <dimen name="preview_theme_content_bottom">8dp</dimen>
+    <dimen name="preview_theme_cover_content_bottom">36dp</dimen>
 
     <dimen name="font_preview_divider_gap">12dp</dimen>
 
     <dimen name="options_container_width">400dp</dimen>
     <dimen name="option_bottom_margin">8dp</dimen>
+    <dimen name="option_tile_width">62dp</dimen>
+    <dimen name="option_tile_padding_horizontal">7dp</dimen>
+    <dimen name="option_tile_padding_vertical">8dp</dimen>
+
 </resources>
\ No newline at end of file
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 1ad275c..3b9dd17 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"ໃຊ້ <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"ບໍ່, ຂອບໃຈ"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"ຕົວຢ່າງໂມງ <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"ຂໍອະໄພ! ເກີດບາງຢ່າງຜິດພາດຂຶ້ນ."</string>
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 997608e..07984e6 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Naudoti „<xliff:g id="ID_1">%1$s</xliff:g>“"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Ne, ačiū"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Ciferblato „<xliff:g id="ID_1">%1$s</xliff:g>“ peržiūra"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Oi, kažkas nepavyko."</string>
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index a325e15..c671560 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Izmantojiet <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Nē, paldies"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g>: pulksteņa priekšskatījums"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Diemžēl radās problēma."</string>
 </resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 19b3c23..cf58de7 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Користи <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Не, фала"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Преглед на часовник <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Оф леле! Нешто тргна наопаку."</string>
 </resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index f1b8451..ea0488a 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> ഉപയോഗിക്കുക"</string>
     <string name="no_thanks" msgid="7286616980115687627">"വേണ്ട"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ക്ലോക്ക് പ്രിവ്യൂ"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"ക്ഷമിക്കണം! എന്തോ കുഴപ്പമുണ്ടായി."</string>
 </resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 5084797..136afb1 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>-г ашиглах"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Үгүй, баярлалаа"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> цагийг урьдчилан үзэх"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Өө! Алдаа гарлаа."</string>
 </resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index b8bf7ce..a5e0550 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> वापरा"</string>
     <string name="no_thanks" msgid="7286616980115687627">"नाही, नको"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> घड्याळाचे पूर्वावलोकन"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"अरेरे! काहीतरी चूक झाली."</string>
 </resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 8afa281..87d6f6d 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Gunakan <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Tidak perlu"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> pratonton jam"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Op! Berlaku kesilapan."</string>
 </resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 4c280e7..a0f8435 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> သုံးရန်"</string>
     <string name="no_thanks" msgid="7286616980115687627">"မလိုပါ"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> နာရီ အစမ်းကြည့်ခြင်း"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"သည်းခံပါ။ တစ်ခုခု မှားသွားသည်။"</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 534c219..062a98b 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Bruk <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Nei takk"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Forhåndsvisning av <xliff:g id="ID_1">%1$s</xliff:g>-klokke"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Beklager, men noe gikk galt."</string>
 </resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 6d55db8..5b3c636 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> प्रयोग गर्नु…"</string>
     <string name="no_thanks" msgid="7286616980115687627">"पर्दैन, धन्यवाद"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> घडीको पूर्वावलोकन"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"हत्तेरिका! केही चिज गडबड भयो।"</string>
 </resources>
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
index 6a79445..b567d0d 100644
--- a/res/values-night/colors.xml
+++ b/res/values-night/colors.xml
@@ -18,7 +18,7 @@
 <resources>
     <color name="theme_preview_icon_color">@color/white_70_alpha</color>
 
-    <color name="icon_thumbnail_color">@color/white_70_alpha</color>
+    <color name="icon_thumbnail_color">@color/white_88_alpha</color>
 
     <color name="control_grey">#b3b3b3</color>
     <color name="switch_track_tint">#171717</color>
@@ -28,6 +28,8 @@
     <color name="tile_disabled_icon_color">@color/light_grey</color>
     <color name="tile_disabled_background_color">#353535</color>
 
+    <color name="shape_option_tile_foreground_color">@color/edit_background_base</color>
+
     <color name="tip_dot_color">#81C995</color>
     <color name="tip_dot_line_color">#000000</color>
 
@@ -35,9 +37,12 @@
     <color name="selected_check_background_color">#81C995</color>
 
     <color name="toolbar_icon_color">@color/text_color_light</color>
-    <color name="toolbar_color">#000000</color>
 
     <color name="divider_color">@color/white_14_alpha</color>
 
     <color name="edit_background_base">@color/material_white_100</color>
+
+    <color name="cover_title_color">@color/white_88_alpha</color>
+
+    <color name="preview_pager_background">@color/google_grey900</color>
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 256faab..71f7f24 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> gebruiken"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Nee, bedankt"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Voorbeeld van <xliff:g id="ID_1">%1$s</xliff:g>-klok bekijken"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Er is iets misgegaan."</string>
 </resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 07905b8..071664a 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="no_thanks" msgid="7286616980115687627">"ନାହିଁ, ଥାଉ"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ଘଣ୍ଟାର ପୂର୍ବାବଲୋକନ"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"ଓହୋଃ, କିଛି ଭୁଲ ହୋଇଗଲା।"</string>
 </resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 07c67ef..61d89a0 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> ਵਰਤੋ"</string>
     <string name="no_thanks" msgid="7286616980115687627">"ਨਹੀਂ, ਧੰਨਵਾਦ"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ਘੜੀ ਦੀ ਪੂਰਵ-ਝਲਕ"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"ਓਹੋ! ਕੋਈ ਗੜਬੜ ਹੋਈ।"</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 7903977..7b94f32 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Użyj motywu <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Nie, dziękuję"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Podgląd zegara <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ups. Coś poszło nie tak."</string>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 132119c..73dc198 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Utilizar <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Não, obrigado"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Pré-visualização do relógio <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ups! Ocorreu um erro."</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 1bf6795..417280b 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Usar <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Não"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Visualização do relógio <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ops! Algo deu errado."</string>
 </resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 2a18739..04e1a3f 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Folosiți <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Nu, mulțumesc"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Previzualizarea ceasului <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Hopa! Ceva nu a funcționat cum trebuie."</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index fac53b9..0b356fc 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>: использовать"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Нет"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g>: предварительный просмотр циферблата"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Произошла ошибка."</string>
 </resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 7b4a6db..b9e20a3 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> භාවිතා කරන්න"</string>
     <string name="no_thanks" msgid="7286616980115687627">"එපා, ස්තූතියි"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ඔරලෝසු පෙරදසුන"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"අපොයි! යමක් වැරදී ගියේය."</string>
 </resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index c836aca..336c221 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Použiť <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Nie, ďakujem"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Ukážka ciferníka <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ojoj! Niečo sa pokazilo."</string>
 </resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 38be787..b2415a6 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Uporabi slog <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Ne, hvala"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Predogled ure <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ojoj, prišlo je do napake."</string>
 </resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 8b199d9..b6b9c45 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Përdor <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Jo, faleminderit"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Pamja paraprake e orës <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Mos! Ndodhi një gabim."</string>
 </resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 3b6bf6d..afe91b4 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Користи <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Не, хвала"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Преглед сата <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Упс! Дошло је до грешке."</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index ea1e7f0..d124728 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Använd <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Nej tack"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Förhandsvisning av urtavlan <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Hoppsan! Något gick fel."</string>
 </resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 049a4e1..db157ae 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Tumia <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Hapana, asante"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Onyesho la kukagua saa ya <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Lo! Hitilafu imetokea."</string>
 </resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index e9609b0..a539944 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>ஐப் பயன்படுத்து"</string>
     <string name="no_thanks" msgid="7286616980115687627">"வேண்டாம்"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> கடிகார மாதிரிக்காட்சி"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"அச்சச்சோ! ஏதோ தவறாகிவிட்டது."</string>
 </resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index bbf4026..12dd69d 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>ని ఉపయోగించు"</string>
     <string name="no_thanks" msgid="7286616980115687627">"వద్దు, ధన్యవాదం"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> గడియార ప్రివ్యూ"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"అయ్యో, ఏదో తప్పు జరిగింది."</string>
 </resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index cae0802..d061f5e 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"ใช้ <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"ไม่เป็นไร"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"ตัวอย่างนาฬิกา <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"อ๊ะ! มีบางอย่างผิดปกติ"</string>
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index b6d174f..cdc7de1 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Gamitin ang <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Hindi, salamat"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> preview ng orasan"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Oops! May maling nangyari."</string>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index ca6089f..575f052 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> stilini kullan"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Hayır"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> saat önizleme"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Hay aksi! Bir hata oluştu."</string>
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 812a78b..9e04c90 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Вибрати стиль \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
     <string name="no_thanks" msgid="7286616980115687627">"Ні, дякую"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Попередній перегляд годинника \"<xliff:g id="ID_1">%1$s</xliff:g>\""</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Сталася помилка."</string>
 </resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index cce806c..e3b6823 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> استعمال کریں"</string>
     <string name="no_thanks" msgid="7286616980115687627">"نہیں، شکریہ"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> گھڑی کا پیش منظر"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"افوہ! کچھ غلط ہوگیا۔"</string>
 </resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 88cd360..1d0c62b 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g> ishlatish"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Kerak emas"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> soatiga razm solish"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Ana xolos! Xatolik yuz berdi."</string>
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 2fc7c83..f688d90 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Sử dụng <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Không, cảm ơn"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"Bản xem trước đồng hồ <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Rất tiếc! Đã xảy ra lỗi."</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index f907108..52a0bda 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"使用<xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"不用了"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g>时钟预览"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"糟糕!遇到了问题。"</string>
 </resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 34ddf83..91ed965 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"使用「<xliff:g id="ID_1">%1$s</xliff:g>」"</string>
     <string name="no_thanks" msgid="7286616980115687627">"不用了,謝謝"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"「<xliff:g id="ID_1">%1$s</xliff:g>」時鐘預覽"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"糟糕!發生錯誤。"</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index b0d12a0..de8381a 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"使用「<xliff:g id="ID_1">%1$s</xliff:g>」"</string>
     <string name="no_thanks" msgid="7286616980115687627">"不用了,謝謝"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"「<xliff:g id="ID_1">%1$s</xliff:g>」時鐘預覽畫面"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"糟糕!發生錯誤。"</string>
 </resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 8bf2d53..2ead0b0 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -65,4 +65,5 @@
     <string name="use_style_button" msgid="1754493078383627019">"Sebenzisa i-<xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="no_thanks" msgid="7286616980115687627">"Cha, ngiyabonga"</string>
     <string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> ukubuka kuqala iwashi"</string>
+    <string name="something_went_wrong" msgid="529840112449799117">"Hawu! Kukhona okungahambile kahle."</string>
 </resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index bc27623..3d646f9 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -16,9 +16,11 @@
      limitations under the License.
 -->
 <resources>
+    <color name="icon_background">#FF4285f4</color>
     <color name="black_14_alpha">#24000000</color>
     <color name="white_14_alpha">#24FFFFFF</color>
     <color name="google_grey700">#5f6368</color>
+    <color name="google_grey900">#202124</color>
 
     <color name="status_bar_color">#ffffffff</color>
 
@@ -26,7 +28,9 @@
     <color name="system_navigation_bar_divider">#1f000000</color>
 
     <color name="shape_thumbnail_color">#b2b2b2</color>
-    <color name="icon_thumbnail_color">@color/white_70_alpha</color>
+    <color name="icon_thumbnail_color">@color/black_87_alpha</color>
+
+    <color name="option_border_default">@color/edit_background_base</color>
 
     <color name="clockface_preview_background">@android:color/black</color>
 
@@ -45,7 +49,7 @@
     <color name="tile_disabled_icon_color">#2d2d2d</color>
     <color name="tile_disabled_background_color">@color/light_grey</color>
 
-    <color name="shape_option_tile_foreground_color">#f8f9fa</color>
+    <color name="shape_option_tile_foreground_color">@color/edit_background_base</color>
 
     <color name="tip_dot_color">#34A853</color>
     <color name="tip_dot_line_color">#FFFFFF</color>
@@ -58,4 +62,8 @@
     <color name="divider_color">@color/black_14_alpha</color>
 
     <color name="edit_background_base">@color/google_grey700</color>
+
+    <color name="cover_title_color">@color/black_87_alpha</color>
+
+    <color name="preview_pager_background">@color/secondary_color</color>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index ed05ee5..b6aac0b 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -23,7 +23,7 @@
     <dimen name="tip_dot_line_width">2dp</dimen>
 
     <dimen name="check_size">20dp</dimen>
-    <dimen name="check_offset">4dp</dimen>
+    <dimen name="check_offset">-4dp</dimen>
 
     <dimen name="preview_indicator_width">16dp</dimen>
     <dimen name="preview_indicator_height">8dp</dimen>
@@ -39,7 +39,7 @@
     <dimen name="component_preview_page_bottom_margin">16dp</dimen>
 
     <!-- Dimensions for the customization option tiles -->
-    <dimen name="options_container_height">100dp</dimen>
+    <dimen name="options_container_height">104dp</dimen>
     <dimen name="options_container_width">0dp</dimen>
     <dimen name="option_tile_width">72dp</dimen>
     <dimen name="theme_option_icon_sample_height">18dp</dimen>
@@ -58,25 +58,35 @@
     <dimen name="theme_option_font_text_size">16dp</dimen>
     <dimen name="theme_option_title_font_text_size">12sp</dimen>
 
-    <dimen name="option_tile_margin_horizontal">2dp</dimen>
+    <dimen name="option_tile_margin_horizontal">6dp</dimen>
     <dimen name="theme_option_label_margin">4dp</dimen>
 
     <dimen name="preview_card_padding">20dp</dimen>
+    <dimen name="preview_card_top_padding">@dimen/preview_card_padding</dimen>
 
     <dimen name="card_title_text_size">16sp</dimen>
     <dimen name="card_cover_title_text_size">24sp</dimen>
-    <dimen name="card_header_top_margin">16dp</dimen>
-    <dimen name="preview_theme_content_margin">40dp</dimen>
+    <dimen name="card_header_icon_size">32dp</dimen>
+    <dimen name="card_header_top_margin">0dp</dimen>
+    <dimen name="preview_pager_max_height">450dp</dimen>
+    <dimen name="preview_pager_min_height">350dp</dimen>
+    <dimen name="preview_theme_max_height">400dp</dimen>
+    <dimen name="preview_theme_min_height">180dp</dimen>
+    <dimen name="theme_preview_header_drawable_padding">8dp</dimen>
+    <dimen name="preview_theme_content_margin">18dp</dimen>
     <dimen name="preview_theme_content_max_height">192dp</dimen>
-    <dimen name="preview_theme_content_min_height">152dp</dimen>
-    <dimen name="preview_theme_icon_size">40dp</dimen>
-    <dimen name="preview_theme_tile_size">20dp</dimen>
-    <dimen name="preview_theme_shape_size">52dp</dimen>
-    <dimen name="preview_theme_cover_topbar_icon_size">20dp</dimen>
-    <dimen name="preview_theme_cover_content_extra_margin">8dp</dimen>
+    <dimen name="preview_theme_content_min_height">120dp</dimen>
+    <dimen name="preview_theme_icon_size">30dp</dimen>
+    <dimen name="preview_theme_tile_size">16dp</dimen>
+    <dimen name="preview_theme_shape_size">36dp</dimen>
+    <dimen name="preview_theme_cover_topbar_clock_size">14sp</dimen>
+    <dimen name="preview_theme_cover_topbar_icon_size">16dp</dimen>
+    <dimen name="preview_theme_cover_content_extra_margin">16dp</dimen>
+    <dimen name="preview_theme_content_bottom">@dimen/min_taptarget_height</dimen>
+    <dimen name="preview_theme_cover_content_bottom">@dimen/preview_theme_content_bottom</dimen>
 
     <dimen name="font_preview_body_width">200dp</dimen>
-    <dimen name="font_preview_divider_gap">30dp</dimen>
+    <dimen name="font_preview_divider_gap">24dp</dimen>
 
     <dimen name="custom_theme_nav_height">56dp</dimen>
 
@@ -85,14 +95,16 @@
 
     <dimen name="component_icon_thumb_size">40dp</dimen>
 
-    <dimen name="component_color_chip_size">42dp</dimen>
+    <dimen name="component_color_chip_size">32dp</dimen>
 
     <dimen name="component_shape_thumb_size">72dp</dimen>
     <dimen name="option_border_width">2dp</dimen>
     <dimen name="option_selected_border_width">3dp</dimen>
+    <dimen name="component_options_title_size">18sp</dimen>
 
     <!-- For a corner radius of this size or larger, we'll preview a rounded qsb widget. -->
     <dimen name="roundCornerThreshold">16dp</dimen>
 
     <dimen name="min_taptarget_height">48dp</dimen>
+
 </resources>
diff --git a/res/values/override.xml b/res/values/override.xml
index 818f357..a01507e 100644
--- a/res/values/override.xml
+++ b/res/values/override.xml
@@ -31,10 +31,10 @@
         typically GMS apps so they should be available in GMS devices. -->
     <array name="icon_shape_preview_packages">
         <item>com.google.android.gm</item>
-        <item>com.google.android.apps.maps</item>
+        <item>com.google.android.googlequicksearchbox</item>
         <item>com.google.android.apps.photos</item>
         <item>com.google.android.apps.docs</item>
         <item>com.google.android.youtube</item>
         <item>com.android.vending</item>
     </array>
-</resources>
\ No newline at end of file
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 46de146..f571b6b 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -187,4 +187,7 @@
 
     <!-- Content description for a screen showing the preview of a clock face. [CHAR_LIMIT=NONE] -->
     <string name="clock_preview_content_description"><xliff:g name="clock_name">%1$s</xliff:g> clock preview</string>
+
+    <!-- Generic error message [CHAR_LIMIT=NONE] -->
+    <string name="something_went_wrong">Oops! Something went wrong.</string>
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 800e99a..1289a87 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -15,6 +15,8 @@
      limitations under the License.
 -->
 <resources>
+
+    <!-- Main themes -->
     <style name="CustomizationTheme" parent="@android:style/Theme.DeviceDefault.Settings">
         <item name="colorPrimary">?android:colorPrimary</item>
 
@@ -30,6 +32,7 @@
         <item name="actionButtonStyle">?android:actionButtonStyle</item>
         <item name="actionMenuTextColor">?android:actionMenuTextColor</item>
     </style>
+
     <style name="CustomizationTheme.NoActionBar">
         <item name="android:windowActionBar">false</item>
         <item name="android:windowNoTitle">true</item>
@@ -37,10 +40,11 @@
         <item name="android:windowDrawsSystemBarBackgrounds">true</item>
     </style>
 
+    <!-- Bottom nav -->
     <style name="BottomNavStyle">
         <item name="itemIconTint">@color/bottom_nav_item_color</item>
         <item name="itemTextColor">@color/bottom_nav_item_color</item>
-        <item name="itemTextAppearanceActive">@style/BottomNavTextAppearance</item>
+        <item name="itemTextAppearanceActive">@style/BottomNavTextAppearanceActive</item>
         <item name="itemTextAppearanceInactive">@style/BottomNavTextAppearance</item>
         <item name="itemBackground">?android:attr/selectableItemBackgroundBorderless</item>
         <item name="android:background">?android:colorPrimary</item>
@@ -49,27 +53,26 @@
     <style name="BottomNavTextAppearance" parent="HeaderTextAppearance">
         <item name="android:textSize">@dimen/bottom_navbar_font_text_size</item>
     </style>
-    <style name="RegularToolbarStyle" parent="@android:style/Widget.DeviceDefault.Light.ActionBar.Solid">
-        <item name="android:background">@color/toolbar_color</item>
-        <item name="android:elevation">0dp</item>
-        <item name="android:theme">@style/WallpaperTheme</item>
+
+    <style name="BottomNavTextAppearanceActive" parent="BottomNavTextAppearance">
+        <item name="android:textStyle">bold</item>
     </style>
 
-    <style name="HeaderTextAppearance" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
-        <item name="android:textFontWeight">400</item>
-    </style>
+    <!-- Common components and widgets -->
+    <style name="HeaderTextAppearance" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"/>
 
     <style name="ActionPrimaryButton" parent="android:Widget.DeviceDefault.Button.Colored"/>
 
     <style name="ActionSecondaryButton" parent="android:Widget.DeviceDefault.Button.Borderless.Colored"/>
 
+    <!-- Option tiles -->
     <style name="OptionTitleTextAppearance" parent="HeaderTextAppearance">
         <item name="android:textColor">@color/option_title_color</item>
         <item name="android:textAlignment">center</item>
         <item name="android:textSize">@dimen/theme_option_title_font_text_size</item>
     </style>
 
-
+    <!-- Preview cards -->
     <style name="PreviewCard" parent="CardView">
         <item name="cardCornerRadius">?android:dialogCornerRadius</item>
         <item name="android:clipChildren">true</item>
@@ -90,7 +93,7 @@
 
     <style name="CoverTitleTextAppearance" parent="CardTitleTextAppearance">
         <item name="android:textSize">@dimen/card_cover_title_text_size</item>
-        <item name="android:textColor">@color/white_70_alpha</item>
+        <item name="android:textColor">@color/cover_title_color</item>
     </style>
 
     <style name="FontCardTitleStyle" parent="HeaderTextAppearance">
@@ -104,9 +107,11 @@
         <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault</item>
     </style>
 
+    <!-- Custom theme editor -->
     <style name="EditLabelStyle">
-        <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault</item>
+        <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Widget.Button</item>
         <item name="android:textColor">@color/material_white_100</item>
+        <item name="android:textAllCaps">false</item>
     </style>
 
     <style name="CustomThemeNameEditText" parent="@android:style/Widget.DeviceDefault.EditText">
diff --git a/src/com/android/customization/model/CustomizationManager.java b/src/com/android/customization/model/CustomizationManager.java
index 3296ca1..7b9f463 100644
--- a/src/com/android/customization/model/CustomizationManager.java
+++ b/src/com/android/customization/model/CustomizationManager.java
@@ -15,6 +15,9 @@
  */
 package com.android.customization.model;
 
+import android.util.Log;
+import android.widget.Toast;
+
 import androidx.annotation.Nullable;
 
 import java.util.List;
@@ -49,6 +52,15 @@
          * Called when the options have been retrieved.
          */
         void onOptionsLoaded(List<T> options);
+
+        /**
+         * Called if there was an error loading grid options
+         */
+        default void onError(@Nullable Throwable throwable) {
+            if (throwable != null) {
+                Log.e("OptionsFecthedListener", "Error loading options", throwable);
+            }
+        }
     }
 
     /**
diff --git a/src/com/android/customization/model/ResourceConstants.java b/src/com/android/customization/model/ResourceConstants.java
index be3b548..0b1dec2 100644
--- a/src/com/android/customization/model/ResourceConstants.java
+++ b/src/com/android/customization/model/ResourceConstants.java
@@ -83,7 +83,9 @@
             "ic_qs_dnd",
             "ic_qs_flashlight",
             "ic_qs_auto_rotate",
-            "ic_qs_airplane"
+            "ic_qs_airplane",
+            "ic_signal_cellular_3_4_bar",
+            "ic_battery_80_24dp"
     };
 
     ArrayList<String> sTargetPackages = new ArrayList<>();
diff --git a/src/com/android/customization/model/clock/ClockManager.java b/src/com/android/customization/model/clock/ClockManager.java
index 3744317..4e77a49 100644
--- a/src/com/android/customization/model/clock/ClockManager.java
+++ b/src/com/android/customization/model/clock/ClockManager.java
@@ -17,9 +17,13 @@
 
 import android.content.ContentResolver;
 import android.provider.Settings.Secure;
+import android.text.TextUtils;
 
 import com.android.customization.module.ThemesUserEventLogger;
 
+import org.json.JSONException;
+import org.json.JSONObject;
+
 /**
  * {@link CustomizationManager} for clock faces that implements apply by writing to secure settings.
  */
@@ -27,6 +31,8 @@
 
     // TODO: use constant from Settings.Secure
     static final String CLOCK_FACE_SETTING = "lock_screen_custom_clock_face";
+    private static final String CLOCK_FIELD = "clock";
+    private static final String TIMESTAMP_FIELD = "_applied_timestamp";
     private final ContentResolver mContentResolver;
     private final ThemesUserEventLogger mEventLogger;
 
@@ -39,7 +45,15 @@
 
     @Override
     protected void handleApply(Clockface option, Callback callback) {
-        boolean stored = Secure.putString(mContentResolver, CLOCK_FACE_SETTING, option.getId());
+        boolean stored;
+        try {
+            final JSONObject json = new JSONObject();
+            json.put(CLOCK_FIELD, option.getId());
+            json.put(TIMESTAMP_FIELD, System.currentTimeMillis());
+            stored = Secure.putString(mContentResolver, CLOCK_FACE_SETTING, json.toString());
+        } catch (JSONException ex) {
+            stored = false;
+        }
         if (stored) {
             mEventLogger.logClockApplied(option);
             callback.onSuccess();
@@ -50,6 +64,15 @@
 
     @Override
     protected String lookUpCurrentClock() {
-        return Secure.getString(mContentResolver, CLOCK_FACE_SETTING);
+        final String value = Secure.getString(mContentResolver, CLOCK_FACE_SETTING);
+        if (TextUtils.isEmpty(value)) {
+            return value;
+        }
+        try {
+            final JSONObject json = new JSONObject(value);
+            return json.getString(CLOCK_FIELD);
+        } catch (JSONException ex) {
+            return value;
+        }
     }
 }
diff --git a/src/com/android/customization/model/clock/ContentProviderClockProvider.java b/src/com/android/customization/model/clock/ContentProviderClockProvider.java
index 375f3c1..ad60ddc 100644
--- a/src/com/android/customization/model/clock/ContentProviderClockProvider.java
+++ b/src/com/android/customization/model/clock/ContentProviderClockProvider.java
@@ -37,27 +37,35 @@
 
     @Override
     public boolean isAvailable() {
-        return mProviderInfo != null;
+        return mProviderInfo != null && (mClocks == null || !mClocks.isEmpty());
     }
 
     @Override
     public void fetch(OptionsFetchedListener<Clockface> callback, boolean reload) {
         if (!isAvailable()) {
             if (callback != null) {
-                callback.onOptionsLoaded(null);
+                callback.onError(null);
             }
             return;
         }
         if (mClocks != null && !reload) {
             if (callback != null) {
-                callback.onOptionsLoaded(mClocks);
+                if (!mClocks.isEmpty()) {
+                    callback.onOptionsLoaded(mClocks);
+                } else {
+                    callback.onError(null);
+                }
             }
             return;
         }
         new ClocksFetchTask(mContext, mProviderInfo, options -> {
             mClocks = options;
             if (callback != null) {
-                callback.onOptionsLoaded(mClocks);
+                if (!mClocks.isEmpty()) {
+                    callback.onOptionsLoaded(mClocks);
+                } else {
+                    callback.onError(null);
+                }
             }
         }).execute();
     }
diff --git a/src/com/android/customization/model/grid/GridOptionsManager.java b/src/com/android/customization/model/grid/GridOptionsManager.java
index ba5968e..1599dde 100644
--- a/src/com/android/customization/model/grid/GridOptionsManager.java
+++ b/src/com/android/customization/model/grid/GridOptionsManager.java
@@ -78,8 +78,19 @@
         @Override
         protected void onPostExecute(List<GridOption> gridOptions) {
             if (mCallback != null) {
-                mCallback.onOptionsLoaded(gridOptions != null ? gridOptions
-                        : Collections.emptyList());
+                if (gridOptions != null && !gridOptions.isEmpty()) {
+                    mCallback.onOptionsLoaded(gridOptions);
+                } else {
+                    mCallback.onError(null);
+                }
+            }
+        }
+
+        @Override
+        protected void onCancelled() {
+            super.onCancelled();
+            if (mCallback != null) {
+                mCallback.onError(null);
             }
         }
     }
diff --git a/src/com/android/customization/model/theme/DefaultThemeProvider.java b/src/com/android/customization/model/theme/DefaultThemeProvider.java
index 58b6daf..ce12d35 100644
--- a/src/com/android/customization/model/theme/DefaultThemeProvider.java
+++ b/src/com/android/customization/model/theme/DefaultThemeProvider.java
@@ -15,6 +15,8 @@
  */
 package com.android.customization.model.theme;
 
+import static android.content.res.Resources.ID_NULL;
+
 import static com.android.customization.model.ResourceConstants.ANDROID_PACKAGE;
 import static com.android.customization.model.ResourceConstants.ICONS_FOR_PREVIEW;
 import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_COLOR;
@@ -50,6 +52,7 @@
 import com.android.wallpaper.model.LiveWallpaperInfo;
 
 import com.bumptech.glide.request.RequestOptions;
+import com.google.android.apps.wallpaper.asset.ThemeBundleThumbAsset;
 
 import org.json.JSONArray;
 import org.json.JSONException;
@@ -83,12 +86,17 @@
     private static final String WALLPAPER_PREFIX = "theme_wallpaper_";
     private static final String WALLPAPER_TITLE_PREFIX = "theme_wallpaper_title_";
     private static final String WALLPAPER_ATTRIBUTION_PREFIX = "theme_wallpaper_attribution_";
+    private static final String WALLPAPER_THUMB_PREFIX = "theme_wallpaper_thumbnail_";
     private static final String WALLPAPER_ACTION_PREFIX = "theme_wallpaper_action_";
+    private static final String WALLPAPER_OPTIONS_PREFIX = "theme_wallpaper_options_";
 
     private static final String DEFAULT_THEME_NAME= "default";
     private static final String THEME_TITLE_FIELD = "_theme_title";
     private static final String THEME_ID_FIELD = "_theme_id";
 
+    // Maximum number of themes allowed (including default, pre-bundled and custom)
+    private static final int MAX_TOTAL_THEMES = 10;
+
     private final OverlayThemeExtractor mOverlayProvider;
     private List<ThemeBundle> mThemes;
     private final CustomizationPreferences mCustomizationPreferences;
@@ -181,7 +189,11 @@
             String wallpaperResName = WALLPAPER_PREFIX + themeName;
             int wallpaperResId = mStubApkResources.getIdentifier(wallpaperResName,
                     "drawable", mStubPackageName);
-            if (wallpaperResId > 0) {
+            // Check in case the theme has a separate thumbnail for the wallpaper
+            String wallpaperThumbnailResName = WALLPAPER_THUMB_PREFIX + themeName;
+            int wallpaperThumbnailResId = mStubApkResources.getIdentifier(wallpaperThumbnailResName,
+                    "drawable", mStubPackageName);
+            if (wallpaperResId != ID_NULL) {
                 builder.setWallpaperInfo(mStubPackageName, wallpaperResName,
                         themeName, wallpaperResId,
                         mStubApkResources.getIdentifier(WALLPAPER_TITLE_PREFIX + themeName,
@@ -191,19 +203,26 @@
                                 mStubPackageName),
                         mStubApkResources.getIdentifier(WALLPAPER_ACTION_PREFIX + themeName,
                                 "string", mStubPackageName))
-                        .setWallpaperAsset(
-                                getDrawableResourceAsset(WALLPAPER_PREFIX, themeName));
+                        .setWallpaperAsset(wallpaperThumbnailResId != ID_NULL ?
+                                getThumbAsset(WALLPAPER_THUMB_PREFIX, themeName)
+                                : getDrawableResourceAsset(WALLPAPER_PREFIX, themeName));
             } else {
                 // Try to see if it's a live wallpaper reference
                 wallpaperResId = mStubApkResources.getIdentifier(wallpaperResName,
                         "string", mStubPackageName);
-                if (wallpaperResId > 0) {
+                if (wallpaperResId != ID_NULL) {
                     String wpComponent = mStubApkResources.getString(wallpaperResId);
+
+                    int wallpaperOptionsResId = mStubApkResources.getIdentifier(
+                            WALLPAPER_OPTIONS_PREFIX + themeName, "string", mStubPackageName);
+                    String wallpaperOptions = wallpaperOptionsResId != ID_NULL
+                            ? mStubApkResources.getString(wallpaperOptionsResId) : null;
+
                     String[] componentParts = wpComponent.split("/");
                     Intent liveWpIntent =  new Intent(WallpaperService.SERVICE_INTERFACE);
                     liveWpIntent.setComponent(
-                            new ComponentName(componentParts[0],
-                                    componentParts[0] + componentParts[1]));
+                            new ComponentName(componentParts[0], componentParts[1]));
+
                     Context appContext = mContext.getApplicationContext();
                     PackageManager pm = appContext.getPackageManager();
                     ResolveInfo resolveInfo =
@@ -213,8 +232,11 @@
                         try {
                             wallpaperInfo = new android.app.WallpaperInfo(appContext, resolveInfo);
                             LiveWallpaperInfo liveInfo = new LiveWallpaperInfo(wallpaperInfo);
-                            builder.setLiveWallpaperInfo(liveInfo)
-                                    .setWallpaperAsset(liveInfo.getThumbAsset(mContext));
+                            builder.setLiveWallpaperInfo(liveInfo).setWallpaperAsset(
+                                    wallpaperThumbnailResId != ID_NULL ?
+                                            getThumbAsset(WALLPAPER_THUMB_PREFIX, themeName)
+                                        : liveInfo.getThumbAsset(mContext))
+                                    .setWallpaperOptions(wallpaperOptions);
                         } catch (XmlPullParserException | IOException e) {
                             Log.w(TAG, "Skipping wallpaper " + resolveInfo.serviceInfo, e);
                         }
@@ -327,7 +349,7 @@
     }
 
     private void addThemeBundleToArray(JSONArray themesArray, ThemeBundle themeBundle) {
-        JSONObject jsonPackages = themeBundle.getJsonPackages();
+        JSONObject jsonPackages = themeBundle.getJsonPackages(false);
         try {
             jsonPackages.put(THEME_TITLE_FIELD, themeBundle.getTitle());
             if (themeBundle instanceof CustomTheme) {
@@ -384,9 +406,11 @@
             }
         }
 
-        // Add an empty one at the end.
-        mThemes.add(new CustomTheme(CustomTheme.newId(), mContext.getString(
-                R.string.custom_theme_title, customThemesCount + 1), new HashMap<>(), null));
+        if (mThemes.size() < MAX_TOTAL_THEMES) {
+            // Add an empty one at the end.
+            mThemes.add(new CustomTheme(CustomTheme.newId(), mContext.getString(
+                    R.string.custom_theme_title, customThemesCount + 1), new HashMap<>(), null));
+        }
 
     }
 
@@ -460,4 +484,11 @@
         return drawableResId == 0 ? null : new ResourceAsset(mStubApkResources, drawableResId,
                 RequestOptions.fitCenterTransform());
     }
+
+    private ThemeBundleThumbAsset getThumbAsset(String prefix, String themeName) {
+        int drawableResId = mStubApkResources.getIdentifier(prefix + themeName,
+                "drawable", mStubPackageName);
+        return drawableResId == 0 ? null : new ThemeBundleThumbAsset(mStubApkResources,
+                drawableResId);
+    }
 }
diff --git a/src/com/android/customization/model/theme/ThemeBundle.java b/src/com/android/customization/model/theme/ThemeBundle.java
index 12ec32c..2fc5d90 100644
--- a/src/com/android/customization/model/theme/ThemeBundle.java
+++ b/src/com/android/customization/model/theme/ThemeBundle.java
@@ -31,7 +31,9 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.ShapeDrawable;
 import android.graphics.drawable.shapes.PathShape;
+import android.icu.text.SimpleDateFormat;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.TextView;
@@ -52,14 +54,17 @@
 import com.android.wallpaper.model.LiveWallpaperInfo;
 import com.android.wallpaper.model.WallpaperInfo;
 
+import org.json.JSONException;
 import org.json.JSONObject;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
@@ -70,22 +75,28 @@
  */
 public class ThemeBundle implements CustomizationOption<ThemeBundle> {
 
+    private static final String TAG = "ThemeBundle";
+    private final static String EMPTY_JSON = "{}";
+    private final static String TIMESTAMP_FIELD = "_applied_timestamp";
+
     private final String mTitle;
     private final PreviewInfo mPreviewInfo;
     private final boolean mIsDefault;
     protected final Map<String, String> mPackagesByCategory;
     @Nullable private final WallpaperInfo mWallpaperInfo;
+    @Nullable private final String mWallpaperOptions;
     private WallpaperInfo mOverrideWallpaper;
     private Asset mOverrideWallpaperAsset;
     private CharSequence mContentDescription;
 
     protected ThemeBundle(String title, Map<String, String> overlayPackages,
             boolean isDefault, @Nullable WallpaperInfo wallpaperInfo,
-            PreviewInfo previewInfo) {
+            @Nullable String wallpaperOptions, PreviewInfo previewInfo) {
         mTitle = title;
         mIsDefault = isDefault;
         mPreviewInfo = previewInfo;
         mWallpaperInfo = wallpaperInfo;
+        mWallpaperOptions = wallpaperOptions;
         mPackagesByCategory = Collections.unmodifiableMap(overlayPackages);
     }
 
@@ -118,10 +129,10 @@
     @Override
     public boolean isActive(CustomizationManager<ThemeBundle> manager) {
         ThemeManager themeManager = (ThemeManager) manager;
-        String serializedOverlays = themeManager.getStoredOverlays();
 
         if (mIsDefault) {
-            return TextUtils.isEmpty(serializedOverlays);
+            String serializedOverlays = themeManager.getStoredOverlays();
+            return TextUtils.isEmpty(serializedOverlays) || EMPTY_JSON.equals(serializedOverlays);
         } else {
             Map<String, String> currentOverlays = themeManager.getCurrentOverlays();
             return mPackagesByCategory.equals(currentOverlays);
@@ -142,7 +153,8 @@
             return false;
         }
         if (mIsDefault) {
-            return other.isDefault() || TextUtils.isEmpty(other.getSerializedPackages());
+            return other.isDefault() || TextUtils.isEmpty(other.getSerializedPackages())
+                    || EMPTY_JSON.equals(other.getSerializedPackages());
         }
         // Map#equals ensures keys and values are compared.
         return mPackagesByCategory.equals(other.mPackagesByCategory);
@@ -179,6 +191,11 @@
         return mWallpaperInfo;
     }
 
+    @Nullable
+    public String getWallpaperOptions() {
+        return mWallpaperOptions;
+    }
+
     boolean isDefault() {
         return mIsDefault;
     }
@@ -188,19 +205,27 @@
     }
 
     public String getSerializedPackages() {
-        if (isDefault()) {
-            return "";
-        }
-        return getJsonPackages().toString();
+        return getJsonPackages(false).toString();
     }
 
-    JSONObject getJsonPackages() {
+    public String getSerializedPackagesWithTimestamp() {
+        return getJsonPackages(true).toString();
+    }
+
+    JSONObject getJsonPackages(boolean insertTimestamp) {
         if (isDefault()) {
             return new JSONObject();
         }
         JSONObject json = new JSONObject(mPackagesByCategory);
         // Remove items with null values to avoid deserialization issues.
         removeNullValues(json);
+        if (insertTimestamp) {
+            try {
+                json.put(TIMESTAMP_FIELD, System.currentTimeMillis());
+            } catch (JSONException e) {
+                Log.e(TAG, "Couldn't add timestamp to serialized themebundle");
+            }
+        }
         return json;
     }
 
@@ -300,11 +325,12 @@
         @Dimension private int mCornerRadius;
         private Asset mWallpaperAsset;
         private WallpaperInfo mWallpaperInfo;
+        private String mWallpaperOptions;
         protected Map<String, String> mPackages = new HashMap<>();
         private List<Drawable> mAppIcons = new ArrayList<>();
 
         public ThemeBundle build(Context context) {
-            return new ThemeBundle(mTitle, mPackages, mIsDefault, mWallpaperInfo,
+            return new ThemeBundle(mTitle, mPackages, mIsDefault, mWallpaperInfo, mWallpaperOptions,
                     createPreviewInfo(context));
         }
 
@@ -409,6 +435,11 @@
             return this;
         }
 
+        public Builder setWallpaperOptions(String wallpaperOptions) {
+            mWallpaperOptions = wallpaperOptions;
+            return this;
+        }
+
         public Builder asDefault() {
             mIsDefault = true;
             return this;
diff --git a/src/com/android/customization/model/theme/ThemeManager.java b/src/com/android/customization/model/theme/ThemeManager.java
index f7bbd00..e4981b0 100644
--- a/src/com/android/customization/model/theme/ThemeManager.java
+++ b/src/com/android/customization/model/theme/ThemeManager.java
@@ -23,11 +23,10 @@
 import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_ICON_SYSUI;
 import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_ICON_THEMEPICKER;
 import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_SHAPE;
-
 import android.graphics.Point;
 import android.provider.Settings;
-
 import android.text.TextUtils;
+
 import androidx.annotation.Nullable;
 import androidx.fragment.app.FragmentActivity;
 
@@ -37,11 +36,11 @@
 import com.android.customization.module.ThemesUserEventLogger;
 import com.android.wallpaper.R;
 import com.android.wallpaper.asset.Asset;
-import com.android.wallpaper.module.WallpaperPersister;
+import com.android.wallpaper.model.LiveWallpaperInfo;
 import com.android.wallpaper.module.WallpaperPersister.SetWallpaperCallback;
 import com.android.wallpaper.module.WallpaperSetter;
-import com.android.wallpaper.picker.SetWallpaperDialogFragment.Listener;
 import com.android.wallpaper.util.WallpaperCropUtils;
+
 import org.json.JSONObject;
 
 import java.util.HashSet;
@@ -67,7 +66,7 @@
     private final OverlayManagerCompat mOverlayManagerCompat;
 
     private final WallpaperSetter mWallpaperSetter;
-    private final FragmentActivity mActivity;
+    protected final FragmentActivity mActivity;
     private final ThemesUserEventLogger mEventLogger;
 
     private Map<String, String> mCurrentOverlays;
@@ -92,26 +91,12 @@
         // Set wallpaper
         if (theme.shouldUseThemeWallpaper()) {
             mWallpaperSetter.requestDestination(mActivity, mActivity.getSupportFragmentManager(),
-                    R.string.set_theme_wallpaper_dialog_message, theme.getWallpaperInfo(),
-                    new Listener() {
-                        @Override
-                        public void onSetHomeScreen() {
-                            applyWallpaper(theme, WallpaperPersister.DEST_HOME_SCREEN,
-                                    createSetWallpaperCallback(theme, callback));
-                        }
-
-                        @Override
-                        public void onSetLockScreen() {
-                            applyWallpaper(theme, WallpaperPersister.DEST_LOCK_SCREEN,
-                                    createSetWallpaperCallback(theme, callback));
-                        }
-
-                        @Override
-                        public void onSetBoth() {
-                            applyWallpaper(theme, WallpaperPersister.DEST_BOTH,
-                                    createSetWallpaperCallback(theme, callback));
-                        }
-                    });
+                    R.string.set_theme_wallpaper_dialog_message,
+                    destination -> applyWallpaper(
+                            theme,
+                            destination,
+                            createSetWallpaperCallback(theme, callback)),
+                    theme.getWallpaperInfo() instanceof LiveWallpaperInfo);
 
         } else {
             applyOverlays(theme, callback);
@@ -122,6 +107,7 @@
         return new SetWallpaperCallback() {
             @Override
             public void onSuccess() {
+                applyWallpaperOptions(theme);
                 applyOverlays(theme, callback);
             }
 
@@ -132,6 +118,10 @@
         };
     }
 
+    protected void applyWallpaperOptions(ThemeBundle theme) {
+        //Do nothing.
+    }
+
     private void applyWallpaper(ThemeBundle theme, int destination,
             SetWallpaperCallback callback) {
         Point defaultCropSurfaceSize = WallpaperCropUtils.getDefaultCropSurfaceSize(
@@ -163,7 +153,7 @@
 
     private void applyOverlays(ThemeBundle theme, Callback callback) {
         boolean allApplied = Settings.Secure.putString(mActivity.getContentResolver(),
-                ResourceConstants.THEME_SETTING, theme.getSerializedPackages());
+                ResourceConstants.THEME_SETTING, theme.getSerializedPackagesWithTimestamp());
         if (theme instanceof CustomTheme) {
             storeCustomTheme((CustomTheme) theme);
         }
diff --git a/src/com/android/customization/model/theme/custom/ColorOptionsProvider.java b/src/com/android/customization/model/theme/custom/ColorOptionsProvider.java
index 020e3ef..a37f250 100644
--- a/src/com/android/customization/model/theme/custom/ColorOptionsProvider.java
+++ b/src/com/android/customization/model/theme/custom/ColorOptionsProvider.java
@@ -81,9 +81,6 @@
         }
         for (String iconName : ICONS_FOR_PREVIEW) {
             try {
-                if (previewIcons.size() == COLOR_TILES_ICON_IDS.length) {
-                    break;
-                }
                 previewIcons.add(loadIconPreviewDrawable(iconName, iconPackage));
             } catch (NameNotFoundException | NotFoundException e) {
                 Log.w(TAG, String.format("Couldn't load icon in %s for color preview, will skip it",
diff --git a/src/com/android/customization/model/theme/custom/CustomTheme.java b/src/com/android/customization/model/theme/custom/CustomTheme.java
index 97a1876..8a7ca05 100644
--- a/src/com/android/customization/model/theme/custom/CustomTheme.java
+++ b/src/com/android/customization/model/theme/custom/CustomTheme.java
@@ -41,7 +41,7 @@
 
     public CustomTheme(@NonNull String id, String title, Map<String, String> overlayPackages,
             @Nullable PreviewInfo previewInfo) {
-        super(title, overlayPackages, false, null, previewInfo);
+        super(title, overlayPackages, false, null, null, previewInfo);
         mId = id;
     }
 
diff --git a/src/com/android/customization/model/theme/custom/IconOptionsProvider.java b/src/com/android/customization/model/theme/custom/IconOptionsProvider.java
index 73a4a22..f7b669b 100644
--- a/src/com/android/customization/model/theme/custom/IconOptionsProvider.java
+++ b/src/com/android/customization/model/theme/custom/IconOptionsProvider.java
@@ -86,7 +86,7 @@
         }
 
         for (String overlayPackage : mSysUiIconsOverlayPackages) {
-            addOrUpdateOption(optionsByPrefix, overlayPackage,  OVERLAY_CATEGORY_ICON_SYSUI);
+            addOrUpdateOption(optionsByPrefix, overlayPackage, OVERLAY_CATEGORY_ICON_SYSUI);
         }
 
         for (String overlayPackage : mSettingsIconsOverlayPackages) {
@@ -142,6 +142,11 @@
         } catch (NameNotFoundException | NotFoundException e) {
             Log.w(TAG, "Didn't find SystemUi package icons, will skip option", e);
         }
+        option.addOverlayPackage(OVERLAY_CATEGORY_ICON_ANDROID, null);
+        option.addOverlayPackage(OVERLAY_CATEGORY_ICON_SYSUI, null);
+        option.addOverlayPackage(OVERLAY_CATEGORY_ICON_SETTINGS, null);
+        option.addOverlayPackage(OVERLAY_CATEGORY_ICON_LAUNCHER, null);
+        option.addOverlayPackage(OVERLAY_CATEGORY_ICON_THEMEPICKER, null);
         mOptions.add(option);
     }
 
diff --git a/src/com/android/customization/model/theme/custom/ThemeComponentOption.java b/src/com/android/customization/model/theme/custom/ThemeComponentOption.java
index 994b5f3..f918d8e 100644
--- a/src/com/android/customization/model/theme/custom/ThemeComponentOption.java
+++ b/src/com/android/customization/model/theme/custom/ThemeComponentOption.java
@@ -29,12 +29,12 @@
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.content.res.Resources.Theme;
+import android.content.res.TypedArray;
 import android.graphics.Path;
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.LayerDrawable;
 import android.graphics.drawable.ShapeDrawable;
-import android.text.TextUtils;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -47,7 +47,10 @@
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.Dimension;
+import androidx.annotation.DrawableRes;
 import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+import androidx.core.graphics.ColorUtils;
 
 import com.android.customization.model.CustomizationManager;
 import com.android.customization.model.CustomizationOption;
@@ -59,7 +62,6 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Objects;
 
 /**
@@ -90,11 +92,7 @@
     public abstract void bindPreview(ViewGroup container);
 
     public Builder buildStep(Builder builder) {
-        getOverlayPackages().forEach((category, packageName) -> {
-            if (!TextUtils.isEmpty(packageName)) {
-                builder.addOverlayPackage(category, packageName);
-            }
-        });
+        getOverlayPackages().forEach(builder::addOverlayPackage);
         return builder;
     }
 
@@ -138,9 +136,7 @@
 
         @Override
         public void bindPreview(ViewGroup container) {
-            TextView header = container.findViewById(R.id.theme_preview_card_header);
-            header.setText(R.string.preview_name_font);
-            header.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_font, 0, 0);
+            bindPreviewHeader(container, R.string.preview_name_font, R.drawable.ic_font);
 
             ViewGroup cardBody = container.findViewById(R.id.theme_preview_card_body_container);
             if (cardBody.getChildCount() == 0) {
@@ -152,6 +148,8 @@
             title.setTypeface(mHeadlineFont);
             TextView bodyText = container.findViewById(R.id.font_card_body);
             bodyText.setTypeface(mBodyFont);
+            container.findViewById(R.id.font_card_divider).setBackgroundColor(
+                    title.getCurrentTextColor());
         }
 
         @Override
@@ -161,6 +159,21 @@
         }
     }
 
+    void bindPreviewHeader(ViewGroup container, @StringRes int headerTextResId,
+            @DrawableRes int headerIcon) {
+        TextView header = container.findViewById(R.id.theme_preview_card_header);
+        header.setText(headerTextResId);
+
+        Context context = container.getContext();
+        Drawable icon = context.getResources().getDrawable(headerIcon, context.getTheme());
+        int size = context.getResources().getDimensionPixelSize(R.dimen.card_header_icon_size);
+        icon.setBounds(0, 0, size, size);
+
+        header.setCompoundDrawables(null, icon, null, null);
+        header.setCompoundDrawableTintList(ColorStateList.valueOf(
+                header.getCurrentTextColor()));
+    }
+
     public static class IconOption extends ThemeComponentOption {
 
         public static final int THUMBNAIL_ICON_POSITION = 0;
@@ -210,9 +223,7 @@
 
         @Override
         public void bindPreview(ViewGroup container) {
-            TextView header = container.findViewById(R.id.theme_preview_card_header);
-            header.setText(R.string.preview_name_icon);
-            header.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_wifi_24px, 0, 0);
+            bindPreviewHeader(container, R.string.preview_name_icon, R.drawable.ic_wifi_24px);
 
             ViewGroup cardBody = container.findViewById(R.id.theme_preview_card_body_container);
             if (cardBody.getChildCount() == 0) {
@@ -258,9 +269,15 @@
         private static int[] COLOR_TILE_IDS = {
                 R.id.preview_color_qs_0_bg, R.id.preview_color_qs_1_bg, R.id.preview_color_qs_2_bg
         };
-        static int[] COLOR_TILES_ICON_IDS = {
-                R.id.preview_color_qs_0_icon, R.id.preview_color_qs_1_icon,
-                R.id.preview_color_qs_2_icon
+
+        /**
+         * Ids of the views for the foreground of the icon, mapping to the corresponding index of
+         * the actual icon drawable.
+         */
+        static int[][] COLOR_TILES_ICON_IDS = {
+                new int[]{ R.id.preview_color_qs_0_icon, 0},
+                new int[]{ R.id.preview_color_qs_1_icon, 1},
+                new int[] { R.id.preview_color_qs_2_icon, 3}
         };
 
         /**
@@ -296,11 +313,13 @@
 
         @Override
         public void bindThumbnailTile(View view) {
-            int color = resolveColor(view.getResources());
-            ((ImageView) view.findViewById(R.id.option_tile)).getDrawable().setTint(color);
+            @ColorInt int color = resolveColor(view.getResources());
+            ((ImageView) view.findViewById(R.id.option_tile)).setImageTintList(
+                    ColorStateList.valueOf(color));
             view.setContentDescription(mLabel);
         }
 
+        @ColorInt
         private int resolveColor(Resources res) {
             Configuration configuration = res.getConfiguration();
             return (configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK)
@@ -321,9 +340,7 @@
 
         @Override
         public void bindPreview(ViewGroup container) {
-            TextView header = container.findViewById(R.id.theme_preview_card_header);
-            header.setText(R.string.preview_name_color);
-            header.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_colorize_24px, 0, 0);
+            bindPreviewHeader(container, R.string.preview_name_color, R.drawable.ic_colorize_24px);
 
             ViewGroup cardBody = container.findViewById(R.id.theme_preview_card_body_container);
             if (cardBody.getChildCount() == 0) {
@@ -364,14 +381,15 @@
             seekbar.setOnTouchListener((view, motionEvent) -> true);
             if (!mIcons.isEmpty() && mShapeDrawable != null) {
                 for (int i = 0; i < COLOR_TILE_IDS.length; i++) {
-                    Drawable icon = mIcons.get(i).getConstantState().newDrawable();
+                    Drawable icon = mIcons.get(COLOR_TILES_ICON_IDS[i][1]).getConstantState()
+                            .newDrawable();
                     //TODO: load and set the shape.
                     Drawable bgShape = mShapeDrawable.getConstantState().newDrawable();
                     bgShape.setTint(accentColor);
 
                     ImageView bg = container.findViewById(COLOR_TILE_IDS[i]);
                     bg.setImageDrawable(bgShape);
-                    ImageView fg = container.findViewById(COLOR_TILES_ICON_IDS[i]);
+                    ImageView fg = container.findViewById(COLOR_TILES_ICON_IDS[i][0]);
                     fg.setImageDrawable(icon);
                 }
             }
@@ -433,7 +451,13 @@
 
             foreground.setIntrinsicHeight(background.getIntrinsicHeight() - borderWidth);
             foreground.setIntrinsicWidth(background.getIntrinsicWidth() - borderWidth);
-            foreground.setTint(res.getColor(R.color.shape_option_tile_foreground_color, theme));
+            TypedArray ta = view.getContext().obtainStyledAttributes(
+                    new int[]{android.R.attr.colorPrimary});
+            int primaryColor = ta.getColor(0, 0);
+            ta.recycle();
+            int foregroundColor = res.getColor(R.color.shape_option_tile_foreground_color, theme);
+
+            foreground.setTint(ColorUtils.blendARGB(primaryColor, foregroundColor, .05f));
 
             thumb.setImageDrawable(mShape);
             view.setContentDescription(mLabel);
@@ -453,9 +477,7 @@
 
         @Override
         public void bindPreview(ViewGroup container) {
-            TextView header = container.findViewById(R.id.theme_preview_card_header);
-            header.setText(R.string.preview_name_shape);
-            header.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_shapes_24px, 0, 0);
+            bindPreviewHeader(container, R.string.preview_name_shape, R.drawable.ic_shapes_24px);
 
             ViewGroup cardBody = container.findViewById(R.id.theme_preview_card_body_container);
             if (cardBody.getChildCount() == 0) {
diff --git a/src/com/android/customization/module/CustomizationInjector.java b/src/com/android/customization/module/CustomizationInjector.java
index 90333f0..d25f925 100644
--- a/src/com/android/customization/module/CustomizationInjector.java
+++ b/src/com/android/customization/module/CustomizationInjector.java
@@ -17,9 +17,19 @@
 
 import android.content.Context;
 
+import androidx.fragment.app.FragmentActivity;
+
+import com.android.customization.model.theme.OverlayManagerCompat;
+import com.android.customization.model.theme.ThemeBundleProvider;
+import com.android.customization.model.theme.ThemeManager;
 import com.android.wallpaper.module.Injector;
+import com.android.wallpaper.module.WallpaperSetter;
 
 public interface CustomizationInjector extends Injector {
 
     CustomizationPreferences getCustomizationPreferences(Context context);
+
+    ThemeManager getThemeManager(ThemeBundleProvider provider, FragmentActivity activity,
+            WallpaperSetter wallpaperSetter, OverlayManagerCompat overlayManagerCompat,
+            ThemesUserEventLogger logger);
 }
diff --git a/src/com/android/customization/module/DefaultCustomizationInjector.java b/src/com/android/customization/module/DefaultCustomizationInjector.java
index 7af90a3..a0d435b 100644
--- a/src/com/android/customization/module/DefaultCustomizationInjector.java
+++ b/src/com/android/customization/module/DefaultCustomizationInjector.java
@@ -18,16 +18,19 @@
 import android.content.Context;
 
 import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
 
+import com.android.customization.model.theme.OverlayManagerCompat;
+import com.android.customization.model.theme.ThemeBundleProvider;
+import com.android.customization.model.theme.ThemeManager;
 import com.android.wallpaper.model.CategoryProvider;
 import com.android.wallpaper.model.WallpaperInfo;
 import com.android.wallpaper.module.BaseWallpaperInjector;
 import com.android.wallpaper.module.DefaultCategoryProvider;
 import com.android.wallpaper.module.LoggingOptInStatusProvider;
-import com.android.wallpaper.module.NoOpUserEventLogger;
-import com.android.wallpaper.module.UserEventLogger;
 import com.android.wallpaper.module.WallpaperPreferences;
 import com.android.wallpaper.module.WallpaperRotationRefresher;
+import com.android.wallpaper.module.WallpaperSetter;
 import com.android.wallpaper.monitor.PerformanceMonitor;
 import com.android.wallpaper.picker.PreviewFragment;
 
@@ -85,6 +88,7 @@
 
     @Override
     public Fragment getPreviewFragment(
+            Context context,
             WallpaperInfo wallpaperInfo,
             int mode,
             boolean testingModeEnabled) {
@@ -109,4 +113,11 @@
         return null;
     }
 
+    @Override
+    public ThemeManager getThemeManager(ThemeBundleProvider provider, FragmentActivity activity,
+            WallpaperSetter wallpaperSetter, OverlayManagerCompat overlayManagerCompat,
+            ThemesUserEventLogger logger) {
+        return new ThemeManager(provider, activity, wallpaperSetter, overlayManagerCompat, logger);
+    }
+
 }
diff --git a/src/com/android/customization/module/StatsLogUserEventLogger.java b/src/com/android/customization/module/StatsLogUserEventLogger.java
index 8762b20..b77d7dc 100644
--- a/src/com/android/customization/module/StatsLogUserEventLogger.java
+++ b/src/com/android/customization/module/StatsLogUserEventLogger.java
@@ -20,6 +20,7 @@
 
 import androidx.annotation.Nullable;
 
+import com.android.systemui.shared.system.StatsLogCompat;
 import com.android.customization.model.clock.Clockface;
 import com.android.customization.model.grid.GridOption;
 import com.android.customization.model.theme.ThemeBundle;
@@ -40,71 +41,41 @@
     private static final String TAG = "StatsLogUserEventLogger";
 
     @Override
-    public void logResumed() {
-        Log.d(TAG, String.format("logResumed: %d, %d, %d, %d, %d, %d, %d, %d",
-                StyleEnums.ONRESUME,
-                0, 0, 0, 0, 0, 0, 0));
-//        StatsLogCompat.write(StyleEnums.ONRESUME,
-//                0, 0, 0, 0, 0, 0, 0);
+    public void logResumed(boolean provisioned, boolean wallpaper) {
+        StatsLogCompat.write(StyleEnums.ONRESUME, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
     public void logStopped() {
-        Log.d(TAG, String.format("logStopped: %d, %d, %d, %d, %d, %d, %d, %d",
-                StyleEnums.ONSTOP,
-                0, 0, 0, 0, 0, 0, 0));
-//        StatsLogCompat.write(StyleEnums.ONSTOP,
-//                0, 0, 0, 0, 0, 0, 0);
+        StatsLogCompat.write(StyleEnums.ONSTOP, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
     public void logActionClicked(String collectionId, int actionLabelResId) {
-        Log.d(TAG, String.format("logActionClicked: %d, %d, %d, %d, %d, %d, %d, %d",
-                StyleEnums.WALLPAPER_EXPLORE,
-                0, 0, 0, 0, 0,
-                collectionId.hashCode(),
-                0));
-//        StatsLogCompat.write(StyleEnums.WALLPAPER_EXPLORE,
-//                0, 0, 0, 0, 0,
-//                collectionId.hashCode(),
-//                0));
+        StatsLogCompat.write(StyleEnums.WALLPAPER_EXPLORE, 0, 0, 0, 0, 0, collectionId.hashCode(),
+                0, 0, 0);
     }
 
     @Override
     public void logIndividualWallpaperSelected(String collectionId) {
-        Log.d(TAG, String.format("logIndividualWallpaperSelected: %d, %d, %d, %d, %d, %d, %d, %d",
-                StyleEnums.WALLPAPER_SELECT,
-                0, 0, 0, 0, 0, 0,
-                collectionId.hashCode()));
-//        StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT,
-//                0, 0, 0, 0, 0, 0,
-//                collectionId.hashCode());
+        StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT, 0, 0, 0, 0, 0, 0,
+                collectionId.hashCode(), 0, 0);
     }
 
     @Override
     public void logCategorySelected(String collectionId) {
-        Log.d(TAG, String.format("logCategorySelected: %d, %d, %d, %d, %d, %d, %d, %d",
-                StyleEnums.WALLPAPER_SELECT,
+        StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT,
                 0, 0, 0, 0, 0,
                 collectionId.hashCode(),
-                0));
-//        StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT,
-//                0, 0, 0, 0, 0,
-//                collectionId.hashCode(),
-//                0);
+                0, 0, 0);
     }
 
     @Override
     public void logWallpaperSet(String collectionId, @Nullable String wallpaperId) {
-        Log.d(TAG, String.format("logWallpaperSet: %d, %d, %d, %d, %d, %d, %d, %d",
-                StyleEnums.WALLPAPER_APPLIED,
+        StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT,
                 0, 0, 0, 0, 0,
                 collectionId.hashCode(),
-                Objects.hashCode(wallpaperId)));
-//        StatsLogCompat.write(StyleEnums.WALLPAPER_SELECT,
-//                0, 0, 0, 0, 0,
-//                collectionId.hashCode(),
-//                0);
+                0, 0, 0);
     }
 
     @Nullable
@@ -115,83 +86,51 @@
 
     @Override
     public void logThemeSelected(ThemeBundle theme, boolean isCustomTheme) {
-        Log.d(TAG, String.format("logThemeSelected: %d, %d, %d, %d, %d, %d, %d, %d",
-                StyleEnums.PICKER_SELECT,
+        StatsLogCompat.write(StyleEnums.PICKER_SELECT,
                 Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR)),
                 Objects.hashCode(getThemePackage(theme,OVERLAY_CATEGORY_FONT)),
                 Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE)),
-                0, 0, 0, 0));
-//        StatsLogCompat.write(StyleEnums.PICKER_SELECT,
-//                Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR)),
-//                Objects.hashCode(getThemePackage(theme,OVERLAY_CATEGORY_FONT)),
-//                Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE)),
-//                0, 0, 0, 0);
+                0, 0, 0, 0, 0, 0);
     }
 
     @Override
     public void logThemeApplied(ThemeBundle theme, boolean isCustomTheme) {
-        Log.d(TAG, String.format("logThemeApplied: %d, %d, %d, %d, %d, %d, %d, %d",
-                StyleEnums.PICKER_APPLIED,
+        StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
                 Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR)),
                 Objects.hashCode(getThemePackage(theme,OVERLAY_CATEGORY_FONT)),
                 Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE)),
-                0, 0, 0, 0));
-//        StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
-//        Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR)),
-//        Objects.hashCode(getThemePackage(theme,OVERLAY_CATEGORY_FONT)),
-//        Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE)),
-//                0, 0, 0, 0);
+                0, 0, 0, 0, 0, 0);
     }
 
     @Override
     public void logClockSelected(Clockface clock) {
-        Log.d(TAG, String.format("logClockSelected: %d, %d, %d, %d, %d, %d, %d, %d",
-                StyleEnums.PICKER_SELECT,
+        StatsLogCompat.write(StyleEnums.PICKER_SELECT,
                 0, 0, 0,
                 Objects.hashCode(clock.getId()),
-                0, 0, 0));
-//        StatsLogCompat.write(StyleEnums.PICKER_SELECT,
-//        0, 0, 0,
-//        Objects.hashCode(clock.getId()),
-//        0, 0, 0));
+                0, 0, 0, 0, 0);
     }
 
     @Override
     public void logClockApplied(Clockface clock) {
-        Log.d(TAG, String.format("logClockApplied: %d, %d, %d, %d, %d, %d, %d, %d",
-                StyleEnums.PICKER_APPLIED,
+        StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
                 0, 0, 0,
                 Objects.hashCode(clock.getId()),
-                0, 0, 0));
-//        StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
-//        0, 0, 0,
-//        Objects.hashCode(clock.getId()),
-//        0, 0, 0));
+                0, 0, 0, 0, 0);
     }
 
     @Override
     public void logGridSelected(GridOption grid) {
-        Log.d(TAG, String.format("logGridSelected: %d, %d, %d, %d, %d, %d, %d, %d",
-                StyleEnums.PICKER_SELECT,
+        StatsLogCompat.write(StyleEnums.PICKER_SELECT,
                 0, 0, 0, 0,
                 grid.cols,
-                0, 0));
-//        StatsLogCompat.write(StyleEnums.PICKER_SELECT,
-//        0, 0, 0, 0,
-//        Objects.hashCode(clock.getId()),
-//        0, 0));
+                0, 0, 0, 0);
     }
 
     @Override
     public void logGridApplied(GridOption grid) {
-        Log.d(TAG, String.format("logGridApplied: %d, %d, %d, %d, %d, %d, %d, %d",
-                StyleEnums.PICKER_APPLIED,
+        StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
                 0, 0, 0, 0,
                 grid.cols,
-                0, 0));
-//        StatsLogCompat.write(StyleEnums.PICKER_APPLIED,
-//        0, 0, 0, 0,
-//        Objects.hashCode(clock.getId()),
-//        0, 0));
+                0, 0, 0, 0);
     }
 }
diff --git a/src/com/android/customization/picker/BasePreviewAdapter.java b/src/com/android/customization/picker/BasePreviewAdapter.java
index e87fb71..53f750a 100644
--- a/src/com/android/customization/picker/BasePreviewAdapter.java
+++ b/src/com/android/customization/picker/BasePreviewAdapter.java
@@ -88,7 +88,11 @@
     @Override
     public void destroyItem(@NonNull ViewGroup container, int position,
             @NonNull Object object) {
-        ((T) object).card = null;
+        View card = ((PreviewPage) object).card;
+        ((PreviewPage) object).card = null;
+        if (card.getParent() == container) {
+            container.removeView(card);
+        }
     }
 
     /**
diff --git a/src/com/android/customization/picker/ClockFacePickerActivity.java b/src/com/android/customization/picker/ClockFacePickerActivity.java
index 261f794..5065aef 100644
--- a/src/com/android/customization/picker/ClockFacePickerActivity.java
+++ b/src/com/android/customization/picker/ClockFacePickerActivity.java
@@ -56,6 +56,7 @@
                 result.putExtra(EXTRA_CLOCK_FACE_NAME, option.getId());
                 setResult(RESULT_OK, result);
                 callback.onSuccess();
+                finish();
             }
 
             @Override
@@ -63,12 +64,16 @@
                 return getIntent().getStringExtra(EXTRA_CLOCK_FACE_NAME);
             }
         };
-
-        final FragmentManager fm = getSupportFragmentManager();
-        final FragmentTransaction fragmentTransaction = fm.beginTransaction();
-        final ClockFragment clockFragment = ClockFragment.newInstance(getString(R.string.clock_title));
-        fragmentTransaction.replace(R.id.fragment_container, clockFragment);
-        fragmentTransaction.commitNow();
+        if (!mClockManager.isAvailable()) {
+            finish();
+        } else {
+            final FragmentManager fm = getSupportFragmentManager();
+            final FragmentTransaction fragmentTransaction = fm.beginTransaction();
+            final ClockFragment clockFragment = ClockFragment.newInstance(
+                    getString(R.string.clock_title));
+            fragmentTransaction.replace(R.id.fragment_container, clockFragment);
+            fragmentTransaction.commitNow();
+        }
     }
 
     @Override
diff --git a/src/com/android/customization/picker/CustomizationPickerActivity.java b/src/com/android/customization/picker/CustomizationPickerActivity.java
index b85948d..80cd7d9 100644
--- a/src/com/android/customization/picker/CustomizationPickerActivity.java
+++ b/src/com/android/customization/picker/CustomizationPickerActivity.java
@@ -19,14 +19,15 @@
 import android.content.Intent;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.LayerDrawable;
-import android.os.Build;
 import android.os.Bundle;
+import android.provider.Settings;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.Menu;
 import android.view.MenuItem;
 
 import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
@@ -138,7 +139,12 @@
     @Override
     protected void onResume() {
         super.onResume();
-        mUserEventLogger.logResumed();
+        boolean wallpaperOnly =
+                WALLPAPER_ONLY.equals(getIntent().getStringExtra(WALLPAPER_FLAVOR_EXTRA));
+        boolean provisioned = Settings.Global.getInt(getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 0) != 0;
+
+        mUserEventLogger.logResumed(provisioned, wallpaperOnly);
         // refresh the sections as the preview may have changed
         initSections();
         if (mBottomNav == null) {
@@ -159,6 +165,7 @@
     protected void onNewIntent(Intent intent) {
         super.onNewIntent(intent);
         if (WALLPAPER_ONLY.equals(intent.getStringExtra(WALLPAPER_FLAVOR_EXTRA))) {
+            Log.d(TAG, "WALLPAPER_ONLY intent, reverting to Wallpaper Picker");
             skipToWallpaperPicker();
         }
     }
@@ -177,15 +184,11 @@
     private void initSections() {
         mSections.clear();
         if (!BuildCompat.isAtLeastQ()) {
-            return;
-        }
-        //if (!BuildCompat.isAtLeastQ()) {
-        //    return;
-        //}
-        if (Build.TYPE.equals("user")) {
+            Log.d(TAG, "Build version < Q detected");
             return;
         }
         if (WALLPAPER_ONLY.equals(getIntent().getStringExtra(WALLPAPER_FLAVOR_EXTRA))) {
+            Log.d(TAG, "WALLPAPER_ONLY intent");
             return;
         }
         //Theme
@@ -194,18 +197,22 @@
                 injector.getPreferences(this), mUserEventLogger, false);
         ThemesUserEventLogger eventLogger = (ThemesUserEventLogger) injector.getUserEventLogger(
                 this);
-        ThemeManager themeManager = new ThemeManager(
+        ThemeManager themeManager = injector.getThemeManager(
                 new DefaultThemeProvider(this, injector.getCustomizationPreferences(this)),
                 this,
                 mWallpaperSetter, new OverlayManagerCompat(this), eventLogger);
         if (themeManager.isAvailable()) {
             mSections.put(R.id.nav_theme, new ThemeSection(R.id.nav_theme, themeManager));
+        } else {
+            Log.d(TAG, "ThemeManager not available, removing Style section");
         }
         //Clock
         ClockManager clockManager = new ClockManager(getContentResolver(),
                 new ContentProviderClockProvider(this), eventLogger);
         if (clockManager.isAvailable()) {
             mSections.put(R.id.nav_clock, new ClockSection(R.id.nav_clock, clockManager));
+        } else {
+            Log.d(TAG, "ClockManager not available, removing Clock section");
         }
         //Grid
         GridOptionsManager gridManager = new GridOptionsManager(
@@ -214,9 +221,10 @@
                 eventLogger);
         if (gridManager.isAvailable()) {
             mSections.put(R.id.nav_grid, new GridSection(R.id.nav_grid, gridManager));
+        } else {
+            Log.d(TAG, "GridOptionsManager not available, removing Grid section");
         }
         mSections.put(R.id.nav_wallpaper, new WallpaperSection(R.id.nav_wallpaper));
-        //TODO (santie): add other sections if supported by the device
     }
 
     private void setUpBottomNavView() {
@@ -347,6 +355,12 @@
     }
 
     @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+            @NonNull int[] grantResults) {
+        mDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);
+    }
+
+    @Override
     public MyPhotosStarter getMyPhotosStarter() {
         return mDelegate;
     }
diff --git a/src/com/android/customization/picker/TimeTicker.java b/src/com/android/customization/picker/TimeTicker.java
new file mode 100644
index 0000000..2cf5dbf
--- /dev/null
+++ b/src/com/android/customization/picker/TimeTicker.java
@@ -0,0 +1,41 @@
+package com.android.customization.picker;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import androidx.annotation.Nullable;
+
+/**
+ * BroadcastReceiver that can notify a listener when the system time (minutes) changes.
+ * Use {@link #registerNewReceiver(Context, TimeListener)} to create a new instance that will be
+ * automatically registered using the given Context.
+ */
+public class TimeTicker extends BroadcastReceiver {
+
+    public interface TimeListener {
+        void onCurrentTimeChanged();
+    }
+
+    public static TimeTicker registerNewReceiver(Context context, TimeListener listener) {
+        TimeTicker receiver = new TimeTicker(listener);
+        // Register broadcast receiver for time tick
+        final IntentFilter filter = new IntentFilter(Intent.ACTION_TIME_TICK);
+        context.registerReceiver(receiver, filter);
+        return receiver;
+    }
+
+    @Nullable private TimeListener mListener;
+
+    private TimeTicker(TimeListener listener) {
+        mListener = listener;
+    }
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (mListener != null) {
+            mListener.onCurrentTimeChanged();
+        }
+    }
+}
diff --git a/src/com/android/customization/picker/clock/ClockFragment.java b/src/com/android/customization/picker/clock/ClockFragment.java
index c3e1c97..14dbc16 100644
--- a/src/com/android/customization/picker/clock/ClockFragment.java
+++ b/src/com/android/customization/picker/clock/ClockFragment.java
@@ -18,6 +18,7 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.os.Bundle;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -26,9 +27,11 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.core.widget.ContentLoadingProgressBar;
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.customization.model.CustomizationManager.Callback;
+import com.android.customization.model.CustomizationManager.OptionsFetchedListener;
 import com.android.customization.model.clock.BaseClockManager;
 import com.android.customization.model.clock.Clockface;
 import com.android.customization.module.ThemesUserEventLogger;
@@ -41,11 +44,15 @@
 import com.android.wallpaper.module.InjectorProvider;
 import com.android.wallpaper.picker.ToolbarFragment;
 
+import java.util.List;
+
 /**
  * Fragment that contains the main UI for selecting and applying a Clockface.
  */
 public class ClockFragment extends ToolbarFragment {
 
+    private static final String TAG = "ClockFragment";
+
     /**
      * Interface to be implemented by an Activity hosting a {@link ClockFragment}
      */
@@ -64,6 +71,9 @@
     private Clockface mSelectedOption;
     private BaseClockManager mClockManager;
     private PreviewPager mPreviewPager;
+    private ContentLoadingProgressBar mLoading;
+    private View mContent;
+    private View mError;
     private ThemesUserEventLogger mEventLogger;
 
     @Override
@@ -81,8 +91,11 @@
         View view = inflater.inflate(
                 R.layout.fragment_clock_picker, container, /* attachToRoot */ false);
         setUpToolbar(view);
+        mContent = view.findViewById(R.id.content_section);
         mPreviewPager = view.findViewById(R.id.clock_preview_pager);
         mOptionsContainer = view.findViewById(R.id.options_container);
+        mLoading = view.findViewById(R.id.loading_indicator);
+        mError = view.findViewById(R.id.error_section);
         setUpOptions();
         view.findViewById(R.id.apply_button).setOnClickListener(v -> {
             mClockManager.apply(mSelectedOption, new Callback() {
@@ -95,6 +108,9 @@
 
                 @Override
                 public void onError(@Nullable Throwable throwable) {
+                    if (throwable != null) {
+                        Log.e(TAG, "Error loading clockfaces", throwable);
+                    }
                     //TODO(santie): handle
                 }
             });
@@ -108,26 +124,50 @@
     }
 
     private void setUpOptions() {
-        mClockManager.fetchOptions(options -> {
-            mOptionsController = new OptionSelectorController<>(mOptionsContainer, options);
+        hideError();
+        mLoading.show();
+        mClockManager.fetchOptions(new OptionsFetchedListener<Clockface>() {
+           @Override
+           public void onOptionsLoaded(List<Clockface> options) {
+               mLoading.hide();
+               mOptionsController = new OptionSelectorController<>(mOptionsContainer, options);
 
-            mOptionsController.addListener(selected -> {
-                mSelectedOption = (Clockface) selected;
-                mEventLogger.logClockSelected(mSelectedOption);
-                createAdapter();
-            });
-            mOptionsController.initOptions(mClockManager);
-            for (Clockface option : options) {
-                if (option.isActive(mClockManager)) {
-                    mSelectedOption = option;
+               mOptionsController.addListener(selected -> {
+                   mSelectedOption = (Clockface) selected;
+                   mEventLogger.logClockSelected(mSelectedOption);
+                   createAdapter();
+               });
+               mOptionsController.initOptions(mClockManager);
+               for (Clockface option : options) {
+                   if (option.isActive(mClockManager)) {
+                       mSelectedOption = option;
+                   }
+               }
+               // For development only, as there should always be a grid set.
+               if (mSelectedOption == null) {
+                   mSelectedOption = options.get(0);
+               }
+               createAdapter();
+           }
+           @Override
+            public void onError(@Nullable Throwable throwable) {
+                if (throwable != null) {
+                   Log.e(TAG, "Error loading clockfaces", throwable);
                 }
+                showError();
             }
-            // For development only, as there should always be a grid set.
-            if (mSelectedOption == null) {
-                mSelectedOption = options.get(0);
-            }
-            createAdapter();
-        }, false);
+       }, false);
+    }
+
+    private void hideError() {
+        mContent.setVisibility(View.VISIBLE);
+        mError.setVisibility(View.GONE);
+    }
+
+    private void showError() {
+        mLoading.hide();
+        mContent.setVisibility(View.GONE);
+        mError.setVisibility(View.VISIBLE);
     }
 
     private static class ClockfacePreviewPage extends PreviewPage {
diff --git a/src/com/android/customization/picker/grid/GridFragment.java b/src/com/android/customization/picker/grid/GridFragment.java
index d50c7a8..3c395a1 100644
--- a/src/com/android/customization/picker/grid/GridFragment.java
+++ b/src/com/android/customization/picker/grid/GridFragment.java
@@ -22,6 +22,7 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.util.DisplayMetrics;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnLayoutChangeListener;
@@ -31,9 +32,11 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.cardview.widget.CardView;
+import androidx.core.widget.ContentLoadingProgressBar;
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.customization.model.CustomizationManager.Callback;
+import com.android.customization.model.CustomizationManager.OptionsFetchedListener;
 import com.android.customization.model.grid.GridOption;
 import com.android.customization.model.grid.GridOptionsManager;
 import com.android.customization.module.ThemesUserEventLogger;
@@ -51,6 +54,8 @@
 
 import com.bumptech.glide.request.RequestOptions;
 
+import java.util.List;
+
 /**
  * Fragment that contains the UI for selecting and applying a GridOption.
  */
@@ -58,6 +63,8 @@
 
     private static final int PREVIEW_FADE_DURATION_MS = 100;
 
+    private static final String TAG = "GridFragment";
+
     /**
      * Interface to be implemented by an Activity hosting a {@link GridFragment}
      */
@@ -82,6 +89,9 @@
     private GridOptionsManager mGridManager;
     private GridOption mSelectedOption;
     private PreviewPager mPreviewPager;
+    private ContentLoadingProgressBar mLoading;
+    private View mContent;
+    private View mError;
     private ThemesUserEventLogger mEventLogger;
 
     @Override
@@ -99,8 +109,11 @@
         View view = inflater.inflate(
                 R.layout.fragment_grid_picker, container, /* attachToRoot */ false);
         setUpToolbar(view);
+        mContent = view.findViewById(R.id.content_section);
         mPreviewPager = view.findViewById(R.id.grid_preview_pager);
         mOptionsContainer = view.findViewById(R.id.options_container);
+        mLoading = view.findViewById(R.id.loading_indicator);
+        mError = view.findViewById(R.id.error_section);
         final Resources res = getResources();
         DisplayMetrics dm = res.getDisplayMetrics();
         mScreenAspectRatio = (float) dm.heightPixels / dm.widthPixels;
@@ -161,28 +174,53 @@
     }
 
     private void setUpOptions() {
-        mGridManager.fetchOptions(options -> {
-            mOptionsController = new OptionSelectorController<>(mOptionsContainer, options);
+        hideError();
+        mLoading.show();
+        mGridManager.fetchOptions(new OptionsFetchedListener<GridOption>() {
+            @Override
+            public void onOptionsLoaded(List<GridOption> options) {
+                mLoading.hide();
+                mOptionsController = new OptionSelectorController<>(mOptionsContainer, options);
 
-            mOptionsController.addListener(selected -> {
-                mSelectedOption = (GridOption) selected;
-                mEventLogger.logGridSelected(mSelectedOption);
-                createAdapter();
-            });
-            mOptionsController.initOptions(mGridManager);
-            for (GridOption option : options) {
-                if (option.isActive(mGridManager)) {
-                    mSelectedOption = option;
+                mOptionsController.addListener(selected -> {
+                    mSelectedOption = (GridOption) selected;
+                    mEventLogger.logGridSelected(mSelectedOption);
+                    createAdapter();
+                });
+                mOptionsController.initOptions(mGridManager);
+                for (GridOption option : options) {
+                    if (option.isActive(mGridManager)) {
+                        mSelectedOption = option;
+                    }
                 }
+                // For development only, as there should always be a grid set.
+                if (mSelectedOption == null) {
+                    mSelectedOption = options.get(0);
+                }
+                createAdapter();
             }
-            // For development only, as there should always be a grid set.
-            if (mSelectedOption == null) {
-                mSelectedOption = options.get(0);
+
+            @Override
+            public void onError(@Nullable Throwable throwable) {
+                if (throwable != null) {
+                    Log.e(TAG, "Error loading grid options", throwable);
+                }
+                showError();
             }
-            createAdapter();
         }, false);
     }
 
+    private void hideError() {
+        mContent.setVisibility(View.VISIBLE);
+        mError.setVisibility(View.GONE);
+    }
+
+    private void showError() {
+        mLoading.hide();
+        mContent.setVisibility(View.GONE);
+        mError.setVisibility(View.VISIBLE);
+    }
+
     private class GridPreviewPage extends PreviewPage {
         private final int mPageId;
         private final Asset mPreviewAsset;
diff --git a/src/com/android/customization/picker/theme/CustomThemeActivity.java b/src/com/android/customization/picker/theme/CustomThemeActivity.java
index 2bc371d..fe537ba 100644
--- a/src/com/android/customization/picker/theme/CustomThemeActivity.java
+++ b/src/com/android/customization/picker/theme/CustomThemeActivity.java
@@ -15,7 +15,6 @@
  */
 package com.android.customization.picker.theme;
 
-import android.app.AlertDialog;
 import android.app.AlertDialog.Builder;
 import android.content.Intent;
 import android.os.Bundle;
@@ -104,7 +103,7 @@
             }
         }
 
-        mThemeManager = new ThemeManager(
+        mThemeManager = injector.getThemeManager(
                 new DefaultThemeProvider(this, injector.getCustomizationPreferences(this)),
                 this,
                 new WallpaperSetter(injector.getWallpaperPersister(this),
diff --git a/src/com/android/customization/picker/theme/CustomThemeNameFragment.java b/src/com/android/customization/picker/theme/CustomThemeNameFragment.java
index 04aac7d..e21fc80 100644
--- a/src/com/android/customization/picker/theme/CustomThemeNameFragment.java
+++ b/src/com/android/customization/picker/theme/CustomThemeNameFragment.java
@@ -20,7 +20,6 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
 import android.os.Bundle;
 import android.text.Editable;
 import android.text.TextWatcher;
@@ -36,6 +35,7 @@
 import androidx.cardview.widget.CardView;
 
 import com.android.customization.model.theme.ThemeBundle.PreviewInfo;
+import com.android.customization.picker.TimeTicker;
 import com.android.customization.picker.theme.ThemePreviewPage.ThemeCoverPage;
 import com.android.wallpaper.R;
 import com.android.wallpaper.asset.Asset;
@@ -63,8 +63,10 @@
     private int[] mColorTileIds = {
             R.id.preview_color_qs_0_bg, R.id.preview_color_qs_1_bg, R.id.preview_color_qs_2_bg
     };
-    private int[] mColorTileIconIds = {
-            R.id.preview_color_qs_0_icon, R.id.preview_color_qs_1_icon, R.id.preview_color_qs_2_icon
+    private int[][] mColorTileIconIds = {
+            new int[]{ R.id.preview_color_qs_0_icon, 0},
+            new int[]{ R.id.preview_color_qs_1_icon, 1},
+            new int[] { R.id.preview_color_qs_2_icon, 3}
     };
 
     private int[] mShapeIconIds = {
@@ -74,7 +76,7 @@
 
     private Asset mWallpaperAsset;
     private ThemeCoverPage mCoverPage;
-
+    private TimeTicker mTicker;
     private EditText mNameEditor;
 
     @Override
@@ -106,6 +108,27 @@
         return view;
     }
 
+    @Override
+    public void onResume() {
+        super.onResume();
+        mTicker = TimeTicker.registerNewReceiver(getContext(), this::updateTime);
+        updateTime();
+    }
+
+    private void updateTime() {
+        if (mCoverPage != null) {
+            mCoverPage.updateTime();
+        }
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        if (getContext() != null) {
+            getContext().unregisterReceiver(mTicker);
+        }
+    }
+
     private void bindCover(CardView card) {
         Context context = getContext();
         PreviewInfo previewInfo = mCustomThemeManager.buildCustomThemePreviewInfo(context);
@@ -114,7 +137,7 @@
                 previewInfo.headlineFontFamily, previewInfo.bottomSheeetCornerRadius,
                 previewInfo.shapeDrawable, previewInfo.shapeAppIcons, null,
                 mColorButtonIds, mColorTileIds, mColorTileIconIds, mShapeIconIds,
-                new WallpaperLayoutListener(context));
+                new WallpaperLayoutListener());
         mCoverPage.setCard(card);
         mCoverPage.bindPreviewContent();
         mNameEditor.addTextChangedListener(new TextWatcher() {
@@ -136,12 +159,7 @@
     }
 
     private class WallpaperLayoutListener implements OnLayoutChangeListener {
-        private final Drawable mScrim;
 
-        WallpaperLayoutListener(Context context) {
-            mScrim = context.getResources()
-                    .getDrawable(R.drawable.theme_cover_scrim, context.getTheme());
-        }
         @Override
         public void onLayoutChange(View view, int left, int top, int right,
                 int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
@@ -160,9 +178,8 @@
         private void setWallpaperBitmap(View view, Bitmap bitmap) {
             Resources res = view.getContext().getResources();
             Drawable background = new BitmapDrawable(res, bitmap);
-            if (mScrim != null) {
-                background = new LayerDrawable(new Drawable[]{background, mScrim});
-            }
+            background.setAlpha(ThemeCoverPage.COVER_PAGE_WALLPAPER_ALPHA);
+
             view.findViewById(R.id.theme_preview_card_background).setBackground(background);
         }
     }
diff --git a/src/com/android/customization/picker/theme/ThemeFragment.java b/src/com/android/customization/picker/theme/ThemeFragment.java
index 22fa1d4..f584dec 100644
--- a/src/com/android/customization/picker/theme/ThemeFragment.java
+++ b/src/com/android/customization/picker/theme/ThemeFragment.java
@@ -22,6 +22,7 @@
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.LayerDrawable;
@@ -42,16 +43,20 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.core.widget.ContentLoadingProgressBar;
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.customization.model.CustomizationManager.Callback;
+import com.android.customization.model.CustomizationManager.OptionsFetchedListener;
 import com.android.customization.model.theme.ThemeBundle;
 import com.android.customization.model.theme.ThemeBundle.PreviewInfo;
 import com.android.customization.model.theme.ThemeManager;
 import com.android.customization.model.theme.custom.CustomTheme;
 import com.android.customization.module.ThemesUserEventLogger;
 import com.android.customization.picker.BasePreviewAdapter;
+import com.android.customization.picker.TimeTicker;
 import com.android.customization.picker.theme.ThemePreviewPage.ThemeCoverPage;
+import com.android.customization.picker.theme.ThemePreviewPage.TimeContainer;
 import com.android.customization.widget.OptionSelectorController;
 import com.android.customization.widget.PreviewPager;
 import com.android.wallpaper.R;
@@ -91,9 +96,13 @@
     private ThemeBundle mSelectedTheme;
     private ThemePreviewAdapter mAdapter;
     private PreviewPager mPreviewPager;
+    private ContentLoadingProgressBar mLoading;
+    private View mContent;
+    private View mError;
     private boolean mUseMyWallpaper;
     private WallpaperInfo mCurrentHomeWallpaper;
     private CurrentWallpaperInfoFactory mCurrentWallpaperFactory;
+    private TimeTicker mTicker;
 
     @Override
     public void onAttach(Context context) {
@@ -111,6 +120,9 @@
                 R.layout.fragment_theme_picker, container, /* attachToRoot */ false);
         setUpToolbar(view);
 
+        mContent = view.findViewById(R.id.content_section);
+        mLoading = view.findViewById(R.id.loading_indicator);
+        mError = view.findViewById(R.id.error_section);
         mCurrentWallpaperFactory = InjectorProvider.getInjector()
                 .getCurrentWallpaperFactory(getActivity().getApplicationContext());
         mPreviewPager = view.findViewById(R.id.theme_preview_pager);
@@ -120,7 +132,6 @@
         });
         mUseMyWallpaperButton = view.findViewById(R.id.use_my_wallpaper);
         mUseMyWallpaperButton.setOnCheckedChangeListener(this::onUseMyWallpaperCheckChanged);
-
         setUpOptions(savedInstanceState);
 
         return view;
@@ -148,7 +159,23 @@
     @Override
     public void onResume() {
         super.onResume();
+        mTicker = TimeTicker.registerNewReceiver(getContext(), this::updateTime);
         reloadWallpaper();
+        updateTime();
+    }
+
+    private void updateTime() {
+        if (mAdapter != null) {
+            mAdapter.updateTime();
+        }
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        if (getContext() != null) {
+            getContext().unregisterReceiver(mTicker);
+        }
     }
 
     @Override
@@ -215,48 +242,73 @@
 
     private void updateButtonsVisibility() {
         mUseMyWallpaperButton.setVisibility(mSelectedTheme instanceof CustomTheme
-                ? View.GONE : View.VISIBLE);
+                ? View.INVISIBLE : View.VISIBLE);
+    }
+
+    private void hideError() {
+        mContent.setVisibility(View.VISIBLE);
+        mError.setVisibility(View.GONE);
+    }
+
+    private void showError() {
+        mLoading.hide();
+        mContent.setVisibility(View.GONE);
+        mError.setVisibility(View.VISIBLE);
     }
 
     private void setUpOptions(@Nullable Bundle savedInstanceState) {
-        mThemeManager.fetchOptions(options -> {
-            mOptionsController = new OptionSelectorController<>(mOptionsContainer, options);
-            mOptionsController.addListener(selected -> {
-                if (selected instanceof CustomTheme && !((CustomTheme) selected).isDefined()) {
-                    navigateToCustomTheme((CustomTheme) selected);
-                } else {
-                    mSelectedTheme = (ThemeBundle) selected;
-                    if (mUseMyWallpaper || mSelectedTheme instanceof CustomTheme) {
-                        mSelectedTheme.setOverrideThemeWallpaper(mCurrentHomeWallpaper);
+        hideError();
+        mLoading.show();
+        mThemeManager.fetchOptions(new OptionsFetchedListener<ThemeBundle>() {
+            @Override
+            public void onOptionsLoaded(List<ThemeBundle> options) {
+                mOptionsController = new OptionSelectorController<>(mOptionsContainer, options);
+                mOptionsController.addListener(selected -> {
+                    mLoading.hide();
+                    if (selected instanceof CustomTheme && !((CustomTheme) selected).isDefined()) {
+                        navigateToCustomTheme((CustomTheme) selected);
                     } else {
-                        mSelectedTheme.setOverrideThemeWallpaper(null);
+                        mSelectedTheme = (ThemeBundle) selected;
+                        if (mUseMyWallpaper || mSelectedTheme instanceof CustomTheme) {
+                            mSelectedTheme.setOverrideThemeWallpaper(mCurrentHomeWallpaper);
+                        } else {
+                            mSelectedTheme.setOverrideThemeWallpaper(null);
+                        }
+                        mEventLogger.logThemeSelected(mSelectedTheme,
+                                selected instanceof CustomTheme);
+                        createAdapter(options);
+                        updateButtonsVisibility();
                     }
-                    mEventLogger.logThemeSelected(mSelectedTheme, selected instanceof CustomTheme);
-                    createAdapter(options);
-                    updateButtonsVisibility();
+                });
+                mOptionsController.initOptions(mThemeManager);
+                String previouslySelected = savedInstanceState != null
+                        ? savedInstanceState.getString(KEY_SELECTED_THEME) : null;
+                for (ThemeBundle theme : options) {
+                    if (previouslySelected != null
+                            && previouslySelected.equals(theme.getSerializedPackages())) {
+                        mSelectedTheme = theme;
+                    } else if (theme.isActive(mThemeManager)) {
+                        mSelectedTheme = theme;
+                        break;
+                    }
                 }
-            });
-            mOptionsController.initOptions(mThemeManager);
-            String previouslySelected = savedInstanceState != null
-                    ? savedInstanceState.getString(KEY_SELECTED_THEME) : null;
-            for (ThemeBundle theme : options) {
-                if (previouslySelected != null
-                        && previouslySelected.equals(theme.getSerializedPackages())) {
-                    mSelectedTheme = theme;
-                } else if (theme.isActive(mThemeManager)) {
-                    mSelectedTheme = theme;
-                    break;
+                if (mSelectedTheme == null) {
+                    // Select the default theme if there is no matching custom enabled theme
+                    // TODO(b/124796742): default to custom if there is no matching theme bundle
+                    mSelectedTheme = options.get(0);
+                } else {
+                    // Only show show checkmark if we found a matching theme
+                    mOptionsController.setAppliedOption(mSelectedTheme);
                 }
+                mOptionsController.setSelectedOption(mSelectedTheme);
             }
-            if (mSelectedTheme == null) {
-                // Select the default theme if there is no matching custom enabled theme
-                // TODO(b/124796742): default to custom if there is no matching theme bundle
-                mSelectedTheme = options.get(0);
-            } else {
-                // Only show show checkmark if we found a matching theme
-                mOptionsController.setAppliedOption(mSelectedTheme);
+            @Override
+            public void onError(@Nullable Throwable throwable) {
+                if (throwable != null) {
+                    Log.e(TAG, "Error loading theme bundles", throwable);
+                }
+                showError();
             }
-            mOptionsController.setSelectedOption(mSelectedTheme);
         }, false);
     }
 
@@ -307,8 +359,10 @@
         private int[] mColorTileIds = {
             R.id.preview_color_qs_0_bg, R.id.preview_color_qs_1_bg, R.id.preview_color_qs_2_bg
         };
-        private int[] mColorTileIconIds = {
-            R.id.preview_color_qs_0_icon, R.id.preview_color_qs_1_icon, R.id.preview_color_qs_2_icon
+        private int[][] mColorTileIconIds = {
+                new int[]{ R.id.preview_color_qs_0_icon, 0},
+                new int[]{ R.id.preview_color_qs_1_icon, 1},
+                new int[] { R.id.preview_color_qs_2_icon, 3}
         };
 
         private int[] mShapeIconIds = {
@@ -322,16 +376,20 @@
             super(activity, R.layout.theme_preview_card);
             final Resources res = activity.getResources();
             final PreviewInfo previewInfo = theme.getPreviewInfo();
+
             Drawable coverScrim = theme instanceof CustomTheme
-                    ? res.getDrawable(R.drawable.theme_cover_scrim_custom, activity.getTheme())
-                    : res.getDrawable(R.drawable.theme_cover_scrim, activity.getTheme());
+                    ? res.getDrawable(R.drawable.theme_cover_scrim, activity.getTheme())
+                    : null;
+
+            WallpaperPreviewLayoutListener wallpaperListener = new WallpaperPreviewLayoutListener(
+                    theme, previewInfo, coverScrim, true);
 
             addPage(new ThemeCoverPage(activity, theme.getTitle(),
                     previewInfo.resolveAccentColor(res), previewInfo.icons,
                     previewInfo.headlineFontFamily, previewInfo.bottomSheeetCornerRadius,
                     previewInfo.shapeDrawable, previewInfo.shapeAppIcons, editClickListener,
                     mColorButtonIds, mColorTileIds, mColorTileIconIds, mShapeIconIds,
-                    new WallpaperPreviewLayoutListener(theme, previewInfo, coverScrim)));
+                    wallpaperListener, coverCardLayoutListener));
             addPage(new ThemePreviewPage(activity, R.string.preview_name_font, R.drawable.ic_font,
                     R.layout.preview_card_font_content,
                     previewInfo.resolveAccentColor(res)) {
@@ -397,7 +455,7 @@
 
                         for (int i = 0; i < mColorTileIds.length && i < previewInfo.icons.size();
                                 i++) {
-                            Drawable icon = previewInfo.icons.get(i)
+                            Drawable icon = previewInfo.icons.get(mColorTileIconIds[i][1])
                                     .getConstantState().newDrawable().mutate();
                             Drawable bgShape =
                                     previewInfo.shapeDrawable.getConstantState().newDrawable();
@@ -405,7 +463,7 @@
 
                             ImageView bg = card.findViewById(mColorTileIds[i]);
                             bg.setImageDrawable(bgShape);
-                            ImageView fg = card.findViewById(mColorTileIconIds[i]);
+                            ImageView fg = card.findViewById(mColorTileIconIds[i][0]);
                             fg.setImageDrawable(icon);
                         }
                     }
@@ -432,7 +490,7 @@
                         previewInfo.resolveAccentColor(res)) {
 
                     private final WallpaperPreviewLayoutListener mListener =
-                            new WallpaperPreviewLayoutListener(theme, previewInfo, null);
+                            new WallpaperPreviewLayoutListener(theme, previewInfo, null, false);
 
                     @Override
                     protected boolean containsWallpaper() {
@@ -461,16 +519,26 @@
             }
         }
 
+        public void updateTime() {
+            for (ThemePreviewPage page : mPages) {
+                if (page instanceof TimeContainer) {
+                    ((TimeContainer)page).updateTime();
+                }
+            }
+        }
+
         private static class WallpaperPreviewLayoutListener implements OnLayoutChangeListener {
             private final ThemeBundle mTheme;
             private final PreviewInfo mPreviewInfo;
             private final Drawable mScrim;
+            private final boolean mIsTranslucent;
 
             public WallpaperPreviewLayoutListener(ThemeBundle theme, PreviewInfo previewInfo,
-                    Drawable scrim) {
+                    Drawable scrim, boolean translucent) {
                 mTheme = theme;
                 mPreviewInfo = previewInfo;
                 mScrim = scrim;
+                mIsTranslucent = translucent;
             }
 
             @Override
@@ -493,12 +561,23 @@
             private void setWallpaperBitmap(View view, Bitmap bitmap) {
                 Resources res = view.getContext().getResources();
                 Drawable background = new BitmapDrawable(res, bitmap);
+                if (mIsTranslucent) {
+                    background.setAlpha(ThemeCoverPage.COVER_PAGE_WALLPAPER_ALPHA);
+                }
                 if (mScrim != null) {
                     background = new LayerDrawable(new Drawable[]{background, mScrim});
                 }
                 view.findViewById(R.id.theme_preview_card_background).setBackground(background);
-                if (mScrim == null) {
+                if (mScrim == null && !mIsTranslucent) {
+                    boolean shouldRecycle = false;
+                    if (bitmap.getConfig() == Config.HARDWARE) {
+                        bitmap = bitmap.copy(Config.ARGB_8888, false);
+                        shouldRecycle = true;
+                    }
                     int colorsHint = WallpaperColors.fromBitmap(bitmap).getColorHints();
+                    if (shouldRecycle) {
+                        bitmap.recycle();
+                    }
                     TextView header = view.findViewById(R.id.theme_preview_card_header);
                     if ((colorsHint & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) == 0) {
                         int colorLight = res.getColor(R.color.text_color_light, null);
diff --git a/src/com/android/customization/picker/theme/ThemePreviewPage.java b/src/com/android/customization/picker/theme/ThemePreviewPage.java
index 3c58079..0543b24 100644
--- a/src/com/android/customization/picker/theme/ThemePreviewPage.java
+++ b/src/com/android/customization/picker/theme/ThemePreviewPage.java
@@ -20,6 +20,7 @@
 import androidx.annotation.DrawableRes;
 import androidx.annotation.LayoutRes;
 import androidx.annotation.StringRes;
+import androidx.constraintlayout.widget.Guideline;
 
 import com.android.customization.picker.BasePreviewAdapter.PreviewPage;
 import com.android.wallpaper.R;
@@ -30,10 +31,14 @@
 import java.util.TimeZone;
 
 abstract class ThemePreviewPage extends PreviewPage {
+
+    public interface TimeContainer {
+        void updateTime();
+    }
+
     @StringRes
     final int nameResId;
-    @DrawableRes
-    final int iconSrc;
+    final Drawable icon;
     @LayoutRes
     final int contentLayoutRes;
     @ColorInt
@@ -45,7 +50,13 @@
             @ColorInt int accentColor) {
         super(null);
         this.nameResId = titleResId;
-        this.iconSrc = iconSrc;
+        if (iconSrc != Resources.ID_NULL) {
+            this.icon = context.getResources().getDrawable(iconSrc, context.getTheme());
+            int size = context.getResources().getDimensionPixelSize(R.dimen.card_header_icon_size);
+            icon.setBounds(0, 0, size, size);
+        } else {
+            this.icon = null;
+        }
         this.contentLayoutRes = contentLayoutRes;
         this.accentColor = accentColor;
         this.inflater = LayoutInflater.from(context);
@@ -55,7 +66,7 @@
     public void bindPreviewContent() {
         TextView header = card.findViewById(R.id.theme_preview_card_header);
         header.setText(nameResId);
-        header.setCompoundDrawablesWithIntrinsicBounds(0, iconSrc, 0, 0);
+        header.setCompoundDrawables(null, icon, null, null);
         header.setCompoundDrawableTintList(ColorStateList.valueOf(accentColor));
         card.findViewById(R.id.theme_preview_top_bar).setVisibility(View.GONE);
         card.findViewById(R.id.edit_label).setVisibility(View.GONE);
@@ -71,7 +82,14 @@
 
     protected abstract void bindBody(boolean forceRebind);
 
-    static class ThemeCoverPage extends ThemePreviewPage {
+    static class ThemeCoverPage extends ThemePreviewPage implements TimeContainer {
+
+        public static final int COVER_PAGE_WALLPAPER_ALPHA = 0x66;
+        /**
+         * Maps which icon from ResourceConstants#ICONS_FOR_PREVIEW to use for each icon in the
+         * top bar (fake "status bar") of the cover page.
+         */
+        private static final int [] sTopBarIconToPreviewIcon = new int [] { 0, 6, 7 };
 
         private final Typeface mHeadlineFont;
         private final List<Drawable> mIcons;
@@ -79,12 +97,12 @@
         private Drawable mShapeDrawable;
         private final int[] mColorButtonIds;
         private final int[] mColorTileIds;
-        private final int[] mColorTileIconIds;
+        private final int[][] mColorTileIconIds;
         private final int[] mShapeIconIds;
         private final Resources mRes;
         private String mTitle;
         private OnClickListener mEditClickListener;
-        private final OnLayoutChangeListener mListener;
+        private final OnLayoutChangeListener[] mListeners;
         private final int mCornerRadius;
         private final ColorStateList mTintList;
 
@@ -93,8 +111,8 @@
                 Drawable shapeDrawable,
                 List<Drawable> shapeAppIcons,
                 OnClickListener editClickListener,
-                int[] colorButtonIds, int[] colorTileIds, int[] colorTileIconIds,
-                int[] shapeIconIds, OnLayoutChangeListener wallpaperListener) {
+                int[] colorButtonIds, int[] colorTileIds, int[][] colorTileIconIds,
+                int[] shapeIconIds, OnLayoutChangeListener... wallpaperListeners) {
             super(context, 0, 0, R.layout.preview_card_cover_content, accentColor);
             mRes = context.getResources();
             mTitle = title;
@@ -108,7 +126,7 @@
             mColorTileIds = colorTileIds;
             mColorTileIconIds = colorTileIconIds;
             mShapeIconIds = shapeIconIds;
-            mListener = wallpaperListener;
+            mListeners = wallpaperListeners;
             // Color QS icons:
             int controlGreyColor = mRes.getColor(R.color.control_grey, null);
             mTintList = new ColorStateList(
@@ -130,8 +148,14 @@
             if (card == null) {
                 return;
             }
+            if (mListeners != null) {
+                for (OnLayoutChangeListener listener : mListeners) {
+                    if (listener != null) {
+                        card.addOnLayoutChangeListener(listener);
+                    }
+                }
+            }
 
-            card.addOnLayoutChangeListener(mListener);
             if (forceRebind) {
                 card.requestLayout();
             }
@@ -143,14 +167,14 @@
                 }
             }
             for (int i = 0; i < 3 && i < mIcons.size(); i++) {
-                Drawable icon =
-                        mIcons.get(i).getConstantState().newDrawable().mutate();
+                Drawable icon = mIcons.get(mColorTileIconIds[i][1]).getConstantState()
+                        .newDrawable().mutate();
                 Drawable bgShape = mShapeDrawable.getConstantState().newDrawable();
                 bgShape.setTint(accentColor);
 
                 ImageView bg = card.findViewById(mColorTileIds[i]);
                 bg.setImageDrawable(bgShape);
-                ImageView fg = card.findViewById(mColorTileIconIds[i]);
+                ImageView fg = card.findViewById(mColorTileIconIds[i][0]);
                 fg.setImageDrawable(icon);
             }
 
@@ -176,9 +200,15 @@
 
             ViewGroup iconsContainer = card.findViewById(R.id.theme_preview_top_bar_icons);
 
-            for (int i = 0; i < iconsContainer.getChildCount() && i < mIcons.size(); i++) {
-                ((ImageView) iconsContainer.getChildAt(i))
-                        .setImageDrawable(mIcons.get(i).getConstantState().newDrawable().mutate());
+            for (int i = 0; i < iconsContainer.getChildCount(); i++) {
+                int iconIndex = sTopBarIconToPreviewIcon[i];
+                if (iconIndex < mIcons.size()) {
+                    ((ImageView) iconsContainer.getChildAt(i))
+                            .setImageDrawable(mIcons.get(iconIndex).getConstantState()
+                                    .newDrawable().mutate());
+                } else {
+                    iconsContainer.getChildAt(i).setVisibility(View.GONE);
+                }
             }
 
             ViewGroup body = card.findViewById(R.id.theme_preview_card_body_container);
@@ -204,6 +234,20 @@
                             cornerRadius, cornerRadius, cornerRadius, cornerRadius});
                 }
             }
+
+            Guideline guideline = card.findViewById(R.id.guideline);
+            if (guideline != null) {
+                guideline.setGuidelineEnd(card.getResources().getDimensionPixelOffset(
+                        R.dimen.preview_theme_cover_content_bottom));
+            }
+        }
+
+        @Override
+        public void updateTime() {
+            if (card != null) {
+                ((TextView) card.findViewById(R.id.theme_preview_clock)).setText(
+                        getFormattedTime());
+            }
         }
 
         private boolean useRoundedQSB(int cornerRadius) {
diff --git a/src/com/android/customization/widget/OptionSelectorController.java b/src/com/android/customization/widget/OptionSelectorController.java
index b2a81aa..9c92079 100644
--- a/src/com/android/customization/widget/OptionSelectorController.java
+++ b/src/com/android/customization/widget/OptionSelectorController.java
@@ -15,17 +15,17 @@
  */
 package com.android.customization.widget;
 
+import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.LayerDrawable;
+import android.text.TextUtils;
 import android.util.DisplayMetrics;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.ViewGroup.MarginLayoutParams;
 import android.view.WindowManager;
-import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
@@ -35,7 +35,6 @@
 
 import com.android.customization.model.CustomizationManager;
 import com.android.customization.model.CustomizationOption;
-import com.android.customization.model.theme.custom.ThemeComponentOption;
 import com.android.wallpaper.R;
 
 import java.util.HashSet;
@@ -130,28 +129,24 @@
 
             if (holder instanceof TileViewHolder) {
                 TileViewHolder tileHolder = (TileViewHolder) holder;
-                if (tileHolder.labelView != null) {
-                    if (isActivated) {
-                        if (option == mAppliedOption) {
-                            CharSequence cd = mContainer.getContext().getString(
-                                    R.string.option_applied_previewed_description,
-                                    option.getTitle());
-                            tileHolder.labelView.setContentDescription(cd);
-                        } else {
-                            CharSequence cd = mContainer.getContext().getString(
-                                    R.string.option_previewed_description, option.getTitle());
-                            tileHolder.labelView.setContentDescription(cd);
-                        }
-                    } else if (option == mAppliedOption) {
-                        CharSequence cd = mContainer.getContext().getString(
-                                R.string.option_applied_description, option.getTitle());
-                        tileHolder.labelView.setContentDescription(cd);
+                if (isActivated) {
+                    if (option == mAppliedOption && mShowCheckmark) {
+                        tileHolder.setContentDescription(mContainer.getContext(), option,
+                            R.string.option_applied_previewed_description);
                     } else {
-                        // Remove content description
-                        tileHolder.labelView.setContentDescription(null);
+                        tileHolder.setContentDescription(mContainer.getContext(), option,
+                            R.string.option_previewed_description);
                     }
+                } else if (option == mAppliedOption && mShowCheckmark) {
+                    tileHolder.setContentDescription(mContainer.getContext(), option,
+                        R.string.option_applied_description);
+                } else {
+                    tileHolder.resetContentDescription();
                 }
             }
+        } else {
+            // Item is not visible, make sure the item is re-bound when it becomes visible
+            mAdapter.notifyItemChanged(index);
         }
     }
 
@@ -191,7 +186,7 @@
                 if (mShowCheckmark && option.equals(mAppliedOption)) {
                     Resources res = mContainer.getContext().getResources();
                     Drawable checkmark = res.getDrawable(R.drawable.ic_check_circle_filled_24px);
-                    Drawable frame = holder.itemView.getForeground();
+                    Drawable frame = holder.tileView.getForeground();
                     Drawable[] layers = {frame, checkmark};
                     if (frame == null) {
                         layers = new Drawable[]{checkmark};
@@ -201,20 +196,23 @@
                     // Position at lower right
                     int idx = layers.length - 1;
                     int checkSize = (int) res.getDimension(R.dimen.check_size);
-                    int checkOffset = (int) res.getDimension(R.dimen.check_offset);
+                    int checkOffset = (int) res.getDimensionPixelOffset(R.dimen.check_offset);
                     checkedFrame.setLayerGravity(idx, Gravity.BOTTOM | Gravity.RIGHT);
                     checkedFrame.setLayerWidth(idx, checkSize);
                     checkedFrame.setLayerHeight(idx, checkSize);
                     checkedFrame.setLayerInsetBottom(idx, checkOffset);
-                    checkedFrame.setLayerInsetLeft(idx, checkOffset);
-                    holder.itemView.setForeground(checkedFrame);
+                    checkedFrame.setLayerInsetRight(idx, checkOffset);
+                    holder.tileView.setForeground(checkedFrame);
 
                     // Initialize the currently applied option
-                    CharSequence cd = mContainer.getContext().getString(
-                            R.string.option_applied_previewed_description, option.getTitle());
-                    holder.labelView.setContentDescription(cd);
+                    holder.setContentDescription(mContainer.getContext(), option,
+                        R.string.option_applied_previewed_description);
+                } else if (option.equals(mAppliedOption)) {
+                    // Initialize with "previewed" description if we don't show checkmark
+                    holder.setContentDescription(mContainer.getContext(), option,
+                        R.string.option_previewed_description);
                 } else if (mShowCheckmark) {
-                    holder.itemView.setForeground(null);
+                    holder.tileView.setForeground(null);
                 }
             }
 
@@ -287,11 +285,44 @@
     private static class TileViewHolder extends RecyclerView.ViewHolder {
         TextView labelView;
         View tileView;
+        CharSequence title;
 
         TileViewHolder(@NonNull View itemView) {
             super(itemView);
             labelView = itemView.findViewById(R.id.option_label);
             tileView = itemView.findViewById(R.id.option_tile);
+            title = null;
+        }
+
+        /**
+         * Set the content description for this holder using the given string id.
+         * If the option does not have a label, the description will be set on the tile view.
+         * @param context The view's context
+         * @param option The customization option
+         * @param id Resource ID of the string to use for the content description
+         */
+        public void setContentDescription(Context context, CustomizationOption option, int id) {
+            title = option.getTitle();
+            if (TextUtils.isEmpty(title) && tileView != null) {
+                title = tileView.getContentDescription();
+            }
+
+            CharSequence cd = context.getString(id, title);
+            if (labelView != null && !TextUtils.isEmpty(labelView.getText())) {
+                labelView.setContentDescription(cd);
+            } else if (tileView != null) {
+                tileView.setAccessibilityPaneTitle(cd);
+                tileView.setContentDescription(cd);
+            }
+        }
+
+        public void resetContentDescription() {
+            if (labelView != null && !TextUtils.isEmpty(labelView.getText())) {
+                labelView.setContentDescription(title);
+            } else if (tileView != null) {
+                tileView.setAccessibilityPaneTitle(title);
+                tileView.setContentDescription(title);
+            }
         }
     }
 }
diff --git a/src/com/android/customization/widget/PageIndicator.java b/src/com/android/customization/widget/PageIndicator.java
index b80f558..dd636ad 100644
--- a/src/com/android/customization/widget/PageIndicator.java
+++ b/src/com/android/customization/widget/PageIndicator.java
@@ -205,7 +205,11 @@
     }
 
     private void playAnimation(ImageView imageView, int res) {
-        final AnimatedVectorDrawable avd = (AnimatedVectorDrawable) getContext().getDrawable(res);
+        Drawable drawable = getContext().getDrawable(res);
+        if (!(drawable instanceof AnimatedVectorDrawable)) {
+            return;
+        }
+        final AnimatedVectorDrawable avd = (AnimatedVectorDrawable) drawable;
         imageView.setImageDrawable(avd);
         try {
             forceAnimationOnUI(avd);
diff --git a/src/com/android/customization/widget/PreviewPager.java b/src/com/android/customization/widget/PreviewPager.java
index 9bf7651..73a5554 100644
--- a/src/com/android/customization/widget/PreviewPager.java
+++ b/src/com/android/customization/widget/PreviewPager.java
@@ -117,7 +117,7 @@
 
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        if (mPageStyle == STYLE_ASPECT_RATIO && mViewPager.getMeasuredWidth() == 0) {
+        if (mPageStyle == STYLE_ASPECT_RATIO) {
             int availableWidth = MeasureSpec.getSize(widthMeasureSpec);
             int availableHeight = MeasureSpec.getSize(heightMeasureSpec);
             int indicatorHeight = mPageIndicator.getVisibility() == VISIBLE
diff --git a/src/com/google/android/apps/wallpaper/asset/ThemeBundleThumbAsset.java b/src/com/google/android/apps/wallpaper/asset/ThemeBundleThumbAsset.java
new file mode 100644
index 0000000..bc5f309
--- /dev/null
+++ b/src/com/google/android/apps/wallpaper/asset/ThemeBundleThumbAsset.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.apps.wallpaper.asset;
+
+import android.app.Activity;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+import android.os.AsyncTask;
+
+import androidx.annotation.Nullable;
+
+import com.android.wallpaper.asset.Asset;
+import com.android.wallpaper.module.DrawableLayerResolver;
+import com.android.wallpaper.module.InjectorProvider;
+
+public class ThemeBundleThumbAsset extends Asset {
+    private final Resources mRes;
+    private final int mResId;
+    private final DrawableLayerResolver mLayerResolver;
+
+    public ThemeBundleThumbAsset(Resources res, int resId) {
+        mRes = res;
+        mResId = resId;
+        mLayerResolver = InjectorProvider.getInjector().getDrawableLayerResolver();
+    }
+
+    @Override
+    public void decodeBitmap(int targetWidth, int targetHeight, BitmapReceiver receiver) {
+        // No scaling is needed, as the thumbnail is already a thumbnail.
+        LoadThumbnailTask task = new LoadThumbnailTask(mRes, mResId, mLayerResolver, receiver);
+        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+    }
+
+    @Override
+    public void decodeBitmapRegion(Rect rect, int targetWidth, int targetHeight,
+            BitmapReceiver receiver) {
+
+    }
+
+    @Override
+    public void decodeRawDimensions(@Nullable Activity activity, DimensionsReceiver receiver) {
+
+    }
+
+    @Override
+    public boolean supportsTiling() {
+        return false;
+    }
+
+    /**
+     * AsyncTask subclass which loads the live wallpaper's thumbnail bitmap off the main UI thread.
+     * Resolves with null if live wallpaper thumbnail is not a bitmap.
+     */
+    private static class LoadThumbnailTask extends AsyncTask<Void, Void, Bitmap> {
+        private final DrawableLayerResolver mLayerResolver;
+        private final Resources mResources;
+        private final int mResId;
+        private BitmapReceiver mReceiver;
+
+        public LoadThumbnailTask(Resources res, int resId, DrawableLayerResolver resolver,
+                BitmapReceiver receiver) {
+            mLayerResolver = resolver;
+            mReceiver = receiver;
+            mResources = res;
+            mResId = resId;
+        }
+
+        @Override
+        protected Bitmap doInBackground(Void... unused) {
+            Drawable thumb = mResources.getDrawable(mResId, null);
+
+            // Live wallpaper components may or may not specify a thumbnail drawable.
+            if (thumb instanceof BitmapDrawable) {
+                return ((BitmapDrawable) thumb).getBitmap();
+            } else if (thumb instanceof LayerDrawable) {
+                Drawable layer = mLayerResolver.resolveLayer((LayerDrawable) thumb);
+                if (layer instanceof BitmapDrawable) {
+                    return ((BitmapDrawable) layer).getBitmap();
+                }
+            }
+
+            // If no thumbnail was specified, return a null bitmap.
+            return null;
+        }
+
+        @Override
+        protected void onPostExecute(Bitmap bitmap) {
+            mReceiver.onBitmapDecoded(bitmap);
+        }
+    }
+}
diff --git a/src_override/com/android/wallpaper/module/WallpapersInjector.java b/src_override/com/android/wallpaper/module/WallpapersInjector.java
index 67b07fd..1ffca80 100755
--- a/src_override/com/android/wallpaper/module/WallpapersInjector.java
+++ b/src_override/com/android/wallpaper/module/WallpapersInjector.java
@@ -65,6 +65,7 @@
 
     @Override
     public Fragment getPreviewFragment(
+        Context context,
         WallpaperInfo wallpaperInfo,
         int mode,
         boolean testingModeEnabled) {