Fix crash when workspace preview arrives later than expected. am: 0c26b0e979

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/WallpaperPicker2/+/15048682

Change-Id: I1172a78e8a306d61388959308359d7fc99f4754e
diff --git a/Android.bp b/Android.bp
index 1776e05..871e193 100644
--- a/Android.bp
+++ b/Android.bp
@@ -82,6 +82,13 @@
        + "$(location soong_zip) -o $(out) -C $$RES_DIR -D $$RES_DIR"
 }
 
+filegroup {
+    name: "WallpaperPicker2_Manifest",
+    srcs: [
+        "AndroidManifest.xml",
+    ],
+}
+
 java_defaults {
     name: "WallpaperPicker2_defaults",
 
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d2d81ec..5c020af 100755
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -61,11 +61,18 @@
          android:label="@string/app_name"
          android:theme="@style/WallpaperTheme.NoBackground"
          android:resizeableActivity="false"
-         android:exported="true">
-      <intent-filter>
-        <action android:name="android.intent.action.SET_WALLPAPER"/>
-        <category android:name="android.intent.category.DEFAULT"/>
-      </intent-filter>
+         android:exported="false">
+    </activity>
+
+    <activity android:name="com.android.wallpaper.picker.CustomizationPickerActivity"
+        android:label="@string/app_name"
+        android:resizeableActivity="false"
+        android:theme="@style/WallpaperTheme.NoBackground"
+        android:exported="true">
+        <intent-filter>
+            <action android:name="android.intent.action.SET_WALLPAPER"/>
+            <category android:name="android.intent.category.DEFAULT"/>
+        </intent-filter>
     </activity>
 
     <activity android:name="com.android.wallpaper.picker.DeepLinkActivity"
diff --git a/res/drawable/btn_transparent_background.xml b/res/drawable/btn_transparent_background.xml
index 7ddff6b..f71b9d8 100644
--- a/res/drawable/btn_transparent_background.xml
+++ b/res/drawable/btn_transparent_background.xml
@@ -17,11 +17,10 @@
 -->
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
     android:color="?android:colorControlHighlight">
-
     <item android:id="@android:id/mask">
         <shape android:shape="rectangle">
             <solid android:color="@android:color/white"/>
-            <corners android:radius="?android:attr/buttonCornerRadius"/>
+            <corners android:radius="@dimen/bottom_action_button_radius" />
         </shape>
     </item>
 </ripple>
diff --git a/res/drawable/section_divider.xml b/res/drawable/section_divider.xml
new file mode 100644
index 0000000..b37ec1b
--- /dev/null
+++ b/res/drawable/section_divider.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+     Copyright (C) 2021 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@android:color/transparent"/>
+    <size android:height="8dp" android:width="1dp" />
+</shape>
\ No newline at end of file
diff --git a/res/font/clock.xml b/res/font/clock.xml
new file mode 100644
index 0000000..8ef49bd
--- /dev/null
+++ b/res/font/clock.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+     Copyright (C) 2021 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<font-family xmlns:android="http://schemas.android.com/apk/res/android">
+    <font android:typeface="monospace"/>
+</font-family>
\ No newline at end of file
diff --git a/res/layout/activity_customization_picker.xml b/res/layout/activity_customization_picker.xml
new file mode 100755
index 0000000..ae70d61
--- /dev/null
+++ b/res/layout/activity_customization_picker.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2021 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <FrameLayout
+        android:id="@+id/fragment_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="?android:colorBackground" />
+
+    <include layout="@layout/bottom_action_bar" />
+
+</FrameLayout>
diff --git a/res/layout/bottom_actions_layout.xml b/res/layout/bottom_actions_layout.xml
index 2d317a9..91e8f1d 100644
--- a/res/layout/bottom_actions_layout.xml
+++ b/res/layout/bottom_actions_layout.xml
@@ -154,8 +154,22 @@
             android:visibility="gone"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@id/action_apply_text_button"
+            app:layout_constraintStart_toEndOf="@id/action_progress"/>
+
+        <Button
+            android:id="@+id/action_apply_text_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:background="@drawable/btn_transparent_background"
+            android:textColor="?android:attr/colorAccent"
+            android:text="@string/bottom_action_bar_apply"
+            android:visibility="gone"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toEndOf="@id/action_progress" />
+            app:layout_constraintStart_toEndOf="@id/action_apply"/>
 
     </androidx.constraintlayout.widget.ConstraintLayout>
 </RelativeLayout>
diff --git a/res/layout/fragment_customization_picker.xml b/res/layout/fragment_customization_picker.xml
new file mode 100755
index 0000000..17a8f80
--- /dev/null
+++ b/res/layout/fragment_customization_picker.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2021 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<androidx.core.widget.NestedScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/scroll_container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@android:color/transparent">
+    <LinearLayout
+        android:id="@+id/section_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginVertical="@dimen/section_container_vertical_margin"
+        android:divider="@drawable/section_divider"
+        android:showDividers="middle"
+        android:orientation="vertical" />
+</androidx.core.widget.NestedScrollView>
diff --git a/res/layout/fragment_image_preview_v2.xml b/res/layout/fragment_image_preview_v2.xml
index 63fd1f2..ead02b9 100644
--- a/res/layout/fragment_image_preview_v2.xml
+++ b/res/layout/fragment_image_preview_v2.xml
@@ -22,89 +22,60 @@
     android:background="?android:colorBackground">
 
     <FrameLayout
+        android:id="@+id/pill_tabs_container"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="wrap_content"
+        android:layout_gravity="bottom"
+        android:layout_marginBottom="@dimen/bottom_actions_height"
+        android:paddingHorizontal="@dimen/pill_tabs_horizontal_margin">
+        <include layout="@layout/pill_tabs" />
+    </FrameLayout>
 
-        <FrameLayout
-            android:id="@+id/pill_tabs_container"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_gravity="bottom"
-            android:layout_marginBottom="@dimen/bottom_actions_height"
-            android:paddingHorizontal="@dimen/pill_tabs_horizontal_margin">
-            <include layout="@layout/pill_tabs" />
-        </FrameLayout>
+    <FrameLayout
+        android:id="@+id/screen_preview_layout"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginTop="?android:attr/actionBarSize"
+        android:layout_marginBottom="@dimen/bottom_actions_plus_pill_tabs">
 
-        <FrameLayout
-            android:id="@+id/screen_preview_layout"
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/container"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_marginTop="?android:attr/actionBarSize"
-            android:layout_marginBottom="@dimen/bottom_actions_plus_pill_tabs">
+            android:layout_gravity="center"
+            android:clipChildren="false"
+            android:clipToPadding="false"
+            android:paddingVertical="@dimen/full_preview_page_default_padding_top">
 
-            <FrameLayout
-                android:layout_width="match_parent"
-                android:layout_height="match_parent">
+            <com.android.wallpaper.picker.TouchForwardingLayout
+                android:id="@+id/touch_forwarding_layout"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:background="@android:color/transparent"
+                app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintRight_toRightOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent">
+                <include layout="@layout/wallpaper_preview_card" />
+            </com.android.wallpaper.picker.TouchForwardingLayout>
+        </androidx.constraintlayout.widget.ConstraintLayout>
+    </FrameLayout>
 
-                <ImageView
-                    android:id="@+id/low_res_image"
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:scaleType="centerCrop"
-                    android:background="@android:color/black" />
+    <FrameLayout
+        android:id="@+id/section_header_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+        <include layout="@layout/section_header" android:id="@+id/toolbar_container"/>
+    </FrameLayout>
 
-                <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
-                    android:id="@+id/full_res_image"
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent" />
-
-                <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_gravity="center"
-                    android:indeterminate="true"/>
-            </FrameLayout>
-
-            <androidx.constraintlayout.widget.ConstraintLayout
-                android:id="@+id/container"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:paddingVertical="@dimen/full_preview_page_default_padding_top"
-                android:clipChildren="false"
-                android:clipToPadding="false">
-
-                <com.android.wallpaper.picker.TouchForwardingLayout
-                    android:id="@+id/touch_forwarding_layout"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    app:layout_constraintLeft_toLeftOf="parent"
-                    app:layout_constraintRight_toRightOf="parent"
-                    app:layout_constraintTop_toTopOf="parent"
-                    app:layout_constraintBottom_toBottomOf="parent">
-                    <include layout="@layout/wallpaper_preview_card" />
-                </com.android.wallpaper.picker.TouchForwardingLayout>
-            </androidx.constraintlayout.widget.ConstraintLayout>
-        </FrameLayout>
-
-        <FrameLayout
-            android:id="@+id/section_header_container"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content">
-            <include layout="@layout/section_header" android:id="@+id/toolbar_container"/>
-        </FrameLayout>
-
-        <FrameLayout
-            android:id="@+id/fullscreen_buttons_container"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_gravity="bottom|center"
-            android:layout_marginBottom="@dimen/fullscreen_preview_button_margin"
-            android:paddingHorizontal="@dimen/pill_tabs_horizontal_margin">
-            <include layout="@layout/fullscreen_buttons" />
-        </FrameLayout>
-
+    <FrameLayout
+        android:id="@+id/fullscreen_buttons_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="bottom|center"
+        android:layout_marginBottom="@dimen/fullscreen_preview_button_margin"
+        android:paddingHorizontal="@dimen/pill_tabs_horizontal_margin">
+        <include layout="@layout/fullscreen_buttons" />
     </FrameLayout>
 
     <FrameLayout
diff --git a/res/layout/fragment_live_preview_v2.xml b/res/layout/fragment_live_preview_v2.xml
index 71a44f4..81c49f4 100644
--- a/res/layout/fragment_live_preview_v2.xml
+++ b/res/layout/fragment_live_preview_v2.xml
@@ -22,84 +22,64 @@
     android:background="?android:colorBackground">
 
     <FrameLayout
+        android:id="@+id/pill_tabs_container"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="wrap_content"
+        android:layout_gravity="bottom"
+        android:layout_marginBottom="@dimen/bottom_actions_height"
+        android:paddingHorizontal="@dimen/pill_tabs_horizontal_margin">
+        <include layout="@layout/pill_tabs" />
+    </FrameLayout>
 
-        <FrameLayout
-            android:id="@+id/pill_tabs_container"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_gravity="bottom"
-            android:layout_marginBottom="@dimen/bottom_actions_height"
-            android:paddingHorizontal="@dimen/pill_tabs_horizontal_margin">
-            <include layout="@layout/pill_tabs" />
-        </FrameLayout>
+    <FrameLayout
+        android:id="@+id/screen_preview_layout"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginTop="?android:attr/actionBarSize"
+        android:layout_marginBottom="@dimen/bottom_actions_plus_pill_tabs">
 
-        <FrameLayout
-            android:id="@+id/screen_preview_layout"
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/live_wallpaper_preview"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_marginTop="?android:attr/actionBarSize"
-            android:layout_marginBottom="@dimen/bottom_actions_plus_pill_tabs">
+            android:layout_gravity="center"
+            android:clipChildren="false"
+            android:clipToPadding="false"
+            android:paddingVertical="@dimen/full_preview_page_default_padding_top">
 
-            <androidx.constraintlayout.widget.ConstraintLayout
-                android:id="@+id/live_wallpaper_preview"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:layout_gravity="center"
-                android:clipChildren="false"
-                android:clipToPadding="false"
-                android:paddingVertical="@dimen/full_preview_page_default_padding_top">
+            <com.android.wallpaper.picker.TouchForwardingLayout
+                android:id="@+id/touch_forwarding_layout"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:background="@android:color/transparent"
+                app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintRight_toRightOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent">
 
-                <com.android.wallpaper.picker.TouchForwardingLayout
-                    android:id="@+id/touch_forwarding_layout"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    app:layout_constraintLeft_toLeftOf="parent"
-                    app:layout_constraintRight_toRightOf="parent"
-                    app:layout_constraintTop_toTopOf="parent"
-                    app:layout_constraintBottom_toBottomOf="parent">
-
-                    <include
-                        android:id="@+id/wallpaper_full_preview_card"
-                        layout="@layout/wallpaper_preview_card" />
-                </com.android.wallpaper.picker.TouchForwardingLayout>
-            </androidx.constraintlayout.widget.ConstraintLayout>
-
-        </FrameLayout>
-
-        <FrameLayout
-            android:id="@+id/section_header_container"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content">
-            <include layout="@layout/section_header" android:id="@+id/toolbar_container"/>
-        </FrameLayout>
-
-        <FrameLayout
-            android:id="@+id/fullscreen_buttons_container"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_gravity="bottom|center"
-            android:layout_marginBottom="@dimen/fullscreen_preview_button_margin"
-            android:paddingHorizontal="@dimen/pill_tabs_horizontal_margin">
-            <include layout="@layout/fullscreen_buttons" />
-        </FrameLayout>
+                <include
+                    android:id="@+id/wallpaper_full_preview_card"
+                    layout="@layout/wallpaper_preview_card" />
+            </com.android.wallpaper.picker.TouchForwardingLayout>
+        </androidx.constraintlayout.widget.ConstraintLayout>
 
     </FrameLayout>
 
     <FrameLayout
-        android:id="@+id/loading"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:forceHasOverlappingRendering="false">
+        android:id="@+id/section_header_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+        <include layout="@layout/section_header" android:id="@+id/toolbar_container"/>
+    </FrameLayout>
 
-        <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_gravity="center"
-            android:indeterminate="true" />
+    <FrameLayout
+        android:id="@+id/fullscreen_buttons_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="bottom|center"
+        android:layout_marginBottom="@dimen/fullscreen_preview_button_margin"
+        android:paddingHorizontal="@dimen/pill_tabs_horizontal_margin">
+        <include layout="@layout/fullscreen_buttons" />
     </FrameLayout>
 
     <FrameLayout
diff --git a/res/layout/fullscreen_wallpaper_preview.xml b/res/layout/fullscreen_wallpaper_preview.xml
index 3dc9bc0..21b087f 100644
--- a/res/layout/fullscreen_wallpaper_preview.xml
+++ b/res/layout/fullscreen_wallpaper_preview.xml
@@ -23,7 +23,7 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:scaleType="centerCrop"
-        android:background="?android:colorSecondary" />
+        android:background="?android:colorBackground" />
 
     <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
         android:id="@+id/full_res_image"
diff --git a/res/layout/lock_screen_preview.xml b/res/layout/lock_screen_preview.xml
index d50b012..8c90877 100644
--- a/res/layout/lock_screen_preview.xml
+++ b/res/layout/lock_screen_preview.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?><!--
-     Copyright (C) 2020 The Android Open Source Project
+     Copyright (C) 2021 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -13,48 +13,50 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<androidx.constraintlayout.widget.ConstraintLayout
+<FrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/lock_overlay"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/lock_screen_scrim_color">
 
-    <ImageView
-        android:id="@+id/lock_icon"
-        android:layout_width="@dimen/lock_screen_preview_lock_icon_size"
-        android:layout_height="@dimen/lock_screen_preview_lock_icon_size"
-        android:src="@drawable/ic_lock_outline_24px"
-        android:tint="@color/lock_screen_text_color"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintVertical_bias="0.1" />
-
-    <TextView
-        android:id="@+id/lock_time"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:textAppearance="?android:textAppearanceListItemSmall"
-        android:textColor="@color/lock_screen_text_color"
-        android:textSize="@dimen/lock_screen_preview_time_text_size"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintVertical_bias="0.3" />
-
     <TextView
         android:id="@+id/lock_date"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:textAppearance="?android:textAppearanceListItemSmall"
+        android:layout_marginStart="32dp"
+        android:layout_marginTop="84dp"
+        android:paddingVertical="16dp"
+        android:gravity="center"
+        android:fontFamily="@*android:string/config_headlineFontFamily"
         android:textColor="@color/lock_screen_text_color"
         android:textSize="@dimen/lock_screen_preview_date_text_size"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/lock_time" />
+        android:lineHeight="@dimen/lock_screen_preview_date_line_height" />
 
-</androidx.constraintlayout.widget.ConstraintLayout>
+    <!-- Not going to depend on dp but ratio to keep clock always at the same position. -->
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+        <!-- Must specify android.widget.TextView to make android:fontVariationSettings work. -->
+        <android.widget.TextView
+            android:id="@+id/lock_time"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:gravity="center_horizontal"
+            android:fontFamily="@font/clock"
+            android:textColor="?androidprv:attr/colorAccentPrimary"
+            android:typeface="monospace"
+            android:textSize="@dimen/lock_screen_preview_time_text_size"
+            android:lineSpacingMultiplier="0.7"
+            android:elegantTextHeight="false"
+            android:fontVariationSettings="'wght' 300"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintVertical_bias="0.57"/>
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/lock_screen_preview2.xml b/res/layout/lock_screen_preview2.xml
deleted file mode 100644
index f738d15..0000000
--- a/res/layout/lock_screen_preview2.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-     Copyright (C) 2021 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<androidx.constraintlayout.widget.ConstraintLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
-    android:id="@+id/lock_overlay"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingHorizontal="24dp"
-    android:background="@color/lock_screen_scrim_color">
-
-    <TextView
-        android:id="@+id/lock_date"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:textAppearance="?android:textAppearanceListItemSmall"
-        android:textColor="@color/lock_screen_text_color"
-        android:textSize="@dimen/lock_screen_preview2_date_text_size"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintVertical_bias="0.2" />
-
-    <TextView
-        android:id="@+id/lock_time"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:textSize="@dimen/lock_screen_preview2_time_text_size"
-        android:fontFamily="@*android:string/config_headlineFontFamily"
-        android:textColor="?androidprv:attr/colorAccentPrimary"
-        android:elegantTextHeight="false"
-        android:lineSpacingMultiplier="0.75"
-        android:letterSpacing="-0.05"
-        android:includeFontPadding="false"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/lock_date" />
-
-</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/wallpaper_preview_card.xml b/res/layout/wallpaper_preview_card.xml
index 2385ba0..229b26b 100644
--- a/res/layout/wallpaper_preview_card.xml
+++ b/res/layout/wallpaper_preview_card.xml
@@ -17,14 +17,9 @@
     style="@style/FullContentPreviewCard"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:clipChildren="true"
     android:contentDescription="@string/wallpaper_preview_card_content_description">
 
-    <ImageView
-        android:id="@+id/wallpaper_preview_image"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:background="?android:colorPrimary" />
-
     <SurfaceView
         android:id="@+id/wallpaper_surface"
         android:layout_width="match_parent"
@@ -42,16 +37,10 @@
         android:layout_height="match_parent"
         android:importantForAccessibility="noHideDescendants" />
 
-    <View
-        android:id="@+id/fade_cover"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:alpha="0"
-        android:background="?android:colorSecondary" />
-
     <androidx.core.widget.ContentLoadingProgressBar
         android:id="@+id/wallpaper_preview_spinner"
         style="?android:progressBarStyleLarge"
+        android:background="@android:color/transparent"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center"
diff --git a/res/layout/wallpaper_section_view.xml b/res/layout/wallpaper_section_view.xml
index e963b3a..54fd6d8 100644
--- a/res/layout/wallpaper_section_view.xml
+++ b/res/layout/wallpaper_section_view.xml
@@ -68,6 +68,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginVertical="@dimen/wallpaper_picker_entry_margin_vertical"
+            android:paddingHorizontal="@dimen/wallpaper_picker_entry_horizontal_padding"
             android:background="@drawable/btn_transparent_background"
             android:textColor="?android:attr/colorAccent"
             android:drawablePadding="@dimen/wallpaper_picker_entry_drawable_padding"
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index f883d34..37c70df 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Muurpapier"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Muurpapiervoorskou"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Die versameling bestaan nie"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Versteek UI-voorskou"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Wys UI-voorskou"</string>
 </resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index aed7c2c..11c6662 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"ልጣፍ"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"የልጣፍ ቅድመ-እይታ"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"ስብስቡ የለም"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"የዩአይ ቅድመ-ዕይታን ደብቅ"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"የዩአይ ቅድመ-ዕይታን አሳይ"</string>
 </resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 68693aa..10b0666 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"الخلفية"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"معاينة عرض الشرائح"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"المجموعة غير متوفرة."</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"إخفاء معاينة واجهة المستخدم"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"عرض معاينة واجهة المستخدم"</string>
 </resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 1649415..ba49311 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"ৱালপেপাৰ"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"ৱালপেপাৰৰ পূৰ্বদৰ্শন"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"এই সংগ্ৰহটোৰ অস্তিত্ব নাই"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UIৰ পূৰ্বদৰ্শন লুকুৱাওক"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UIৰ পূৰ্বদৰ্শন দেখুৱাওক"</string>
 </resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 6e510ba..4e334f6 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Divar kağızı"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Divar Kağızı önizləməsi"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Kolleksiya mövcud deyil"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI Önizləməsini gizlədin"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI Önizləməsini göstərin"</string>
 </resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index d40bda5..ed43ea2 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Pozadina"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Pregled pozadine"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Kolekcija ne postoji"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Sakrij korisnički interfejs"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Prikaži korisnički interfejs"</string>
 </resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 73a6fbd..e218462 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Шпалеры"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Перадпрагляд шпалер"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Калекцыя не існуе"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Схаваць перадпрагляд UI"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Паказаць перадпрагляд UI"</string>
 </resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 9bdb277..1e087e5 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Тапет"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Визуализация на тапета"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Колекцията не съществува"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Скриване на визуал. на ПИ"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Показване на визуал. на ПИ"</string>
 </resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 3c8a345..c0fd9b6 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"ওয়ালপেপার"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"ওয়ালপেপার প্রিভিউ করুন"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"কালেকশন উপলভ্য নেই"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI প্রিভিউ লুকান"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI প্রিভিউ দেখুন"</string>
 </resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 882428a..5d8ff9f 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Pozadinska slika"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Pregled pozadinske slike"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Kolekcija ne postoji"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Sakrij pregled UI-a"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Prikaži pregled UI-a"</string>
 </resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 607c71f..5c1139a 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Fons de pantalla"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Previsualitz. fons de pantalla"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"La col·lecció no existeix"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Amaga la previsualització de IU"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Mostra la previsualització de IU"</string>
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 814a0f3..81e606f 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Tapeta"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Náhled prezentace"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Sbírka neexistuje"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Skrýt náhled rozhraní"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Zobrazit náhled rozhraní"</string>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 0efa961..0efbc9b 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Baggrund"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Forhåndsvisning af baggrund"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Samlingen eksisterer ikke"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Skjul forhåndsvisning af brugerflade"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Vis forhåndsvisning af brugerflade"</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index f0bca06..4bdd8f2 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Hintergrund"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Hintergrundvorschau"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Die Sammlung existiert nicht"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI-Vorschau ausblenden"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI-Vorschau einblenden"</string>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 5b9dda0..cf1df9e 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Ταπετσαρία"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Προεπισκόπηση ταπετσαρίας"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Η συλλογή δεν υπάρχει."</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Απόκρυψη προεπ/σης διεπ.χρήστη"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Εμφάνιση προεπ/σης διεπ.χρήστη"</string>
 </resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 750a2d0..d96b025 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Wallpaper"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Wallpaper preview"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"The collection doesn\'t exist"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Hide UI preview"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Show UI preview"</string>
 </resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 750a2d0..d96b025 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Wallpaper"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Wallpaper preview"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"The collection doesn\'t exist"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Hide UI preview"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Show UI preview"</string>
 </resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 750a2d0..d96b025 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Wallpaper"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Wallpaper preview"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"The collection doesn\'t exist"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Hide UI preview"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Show UI preview"</string>
 </resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 750a2d0..d96b025 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Wallpaper"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Wallpaper preview"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"The collection doesn\'t exist"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Hide UI preview"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Show UI preview"</string>
 </resources>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index ff487a5..961db68 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‎‎‏‎‏‎‎‏‏‏‎‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‎‎‏‎‏‎‏‎‎‎Wallpaper‎‏‎‎‏‎"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‎‏‎‏‏‎‎‎‎Wallpaper preview‎‏‎‎‏‎"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎‏‏‏‎‏‏‏‏‎‏‎‎‏‏‎‎‏‏‎‏‎‎‎‎‏‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‎‎‏‎‏‎‎The collection doesn\'t exist‎‏‎‎‏‎"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‏‎‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‎‏‎‏‏‎‏‎‎‎‏‏‏‎Hide UI Preview‎‏‎‎‏‎"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‎‏‎‏‏‏‎‏‎‎‎‏‏‎‎‎‏‏‎‏‎‎‏‎‎‎‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‎Show UI Preview‎‏‎‎‏‎"</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index b81d3a7..249a162 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -30,11 +30,11 @@
     <string name="rotating_wallpaper_presentation_mode_message" msgid="3361676041605733288">"Fondo de pantalla diario"</string>
     <string name="wallpaper_destination_both" msgid="1124197176741944063">"Pantalla principal y de bloqueo"</string>
     <string name="home_screen_message" msgid="106444102822522813">"Pantalla principal"</string>
-    <string name="lock_screen_message" msgid="1534506081955058013">"Pantalla de bloqueo"</string>
+    <string name="lock_screen_message" msgid="1534506081955058013">"Pantalla bloqueada"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Pantalla principal y bloqueada"</string>
     <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Establecer como fondo de pantalla en"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Pantalla principal"</string>
-    <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Pantalla de bloqueo"</string>
+    <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Pantalla bloqueada"</string>
     <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Página principal y bloqueada"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Fondo de pantalla rotatorio con imágenes"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Para mostrar el fondo de pantalla actual aquí, <xliff:g id="APP_NAME">%1$s</xliff:g> necesita acceso al almacenamiento de tu dispositivo."</string>
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Fondo de pantalla"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Vista previa del fondo"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"La colección no existe"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Ocultar vista previa de la IU"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Mostrar vista previa de la IU"</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 01bec6a..3eabae8 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Fondo de pantalla"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Vista previa de fondo"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"La colección no existe"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Ocultar vista previa de UI"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Mostrar vista previa de UI"</string>
 </resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 9c92c68..012ce9d 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Taustapilt"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Taustapildi eelvaade"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Kogu pole olemas"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Peida kasutajaliidese eelvaade"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Kuva kasutajaliidese eelvaade"</string>
 </resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 2bfc243..f3349af 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Horma-papera"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Horma-paperaren aurrebista"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Ez dago bildumarik"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Ezkutatu EIaren aurrebista"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Erakutsi EIaren aurrebista"</string>
 </resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 620edaa..b995635 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"کاغذدیواری"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"پیش‌نمای کاغذدیواری"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"مجموعه وجود ندارد"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"پنهان کردن پیش‌نمای رابط کاربری"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"نمایش دادن پیش‌نمای رابط کاربری"</string>
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 5c1e9c9..4d9c0a0 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Taustakuva"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Taustakuvan esikatselu"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Kyseistä kokoelmaa ei ole olemassa"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Piilota UI:n esikatselu"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Näytä UI:n esikatselu"</string>
 </resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 795294c..576714c 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Fond d\'écran"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Aperçu du fond d\'écran"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"La collection n\'existe pas"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Masquer l\'aperçu de l\'IU"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Afficher l\'aperçu de l\'IU"</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 8664237..ffe0f76 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Fond d\'écran"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Aperçu du fond d\'écran"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Cette collection n\'existe pas"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Masquer l\'aperçu de l\'UI"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Afficher l\'aperçu de l\'UI"</string>
 </resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 2c431cc..2600075 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Fondo de pantalla"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Vista previa do fondo"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"A colección non existe"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Ocultar vista previa da IU"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Mostrar vista previa da IU"</string>
 </resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 8eabd24..491df07 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"વૉલપેપર"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"વૉલપેપરનો પ્રીવ્યૂ કરો"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"સંગ્રહ અસ્તિત્વમાં નથી"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UIનો પ્રીવ્યૂ છુપાવો"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UIનો પ્રીવ્યૂ બતાવો"</string>
 </resources>
diff --git a/res/values-h700dp/dimens.xml b/res/values-h700dp/dimens.xml
new file mode 100644
index 0000000..b4daf92
--- /dev/null
+++ b/res/values-h700dp/dimens.xml
@@ -0,0 +1,20 @@
+<!--
+  ~ Copyright (C) 2021 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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>
+    <!-- Lock screen clock maximum font size (dp is intentional, to prevent any further scaling) -->
+    <dimen name="lock_screen_preview_time_text_size">170dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/res/values-h800dp/dimens.xml b/res/values-h800dp/dimens.xml
new file mode 100644
index 0000000..92ddfbf
--- /dev/null
+++ b/res/values-h800dp/dimens.xml
@@ -0,0 +1,20 @@
+<!--
+  ~ Copyright (C) 2021 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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>
+    <!-- Lock screen clock maximum font size (dp is intentional, to prevent any further scaling) -->
+    <dimen name="lock_screen_preview_time_text_size">200dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 8877c1c..6c0f15a 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"वॉलपेपर"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"वॉलपेपर की झलक देखें"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"वॉलपेपर का संग्रह मौजूद नहीं है"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"यूज़र इंटरफ़ेस की झलक छिपाएं"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"यूज़र इंटरफ़ेस की झलक दिखाएं"</string>
 </resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 31052b9..ea8ff24 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Pozadina"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Pregled pozadine"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Zbirka ne postoji"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Sakrij pregled koris. sučelja"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Prikaži pregled koris. sučelja"</string>
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 50ca3fa..742efba 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Háttérkép"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Háttérkép előnézete"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Nincs ilyen gyűjtemény"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI előnézetének elrejtése"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI előnézetének megjelenítése"</string>
 </resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index ae654bf..e3d2a07 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Պաստառ"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Պաստառի նախադիտում"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Հավաքածուն գոյություն չունի"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Թաքցնել նախադիտման էկրանը"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Ցուցադրել նախադիտման էկրանը"</string>
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index b7dd161..70150cb 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Wallpaper"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Pratinjau wallpaper"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Koleksi tidak ada"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Sembunyikan Pratinjau UI"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Tampilkan Pratinjau UI"</string>
 </resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 9f80b25..04031ef 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Veggfóður"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Forskoðun veggfóðurs"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Safnið er ekki til"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Fela forskoðun notendaviðmóts"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Sýna forskoðun notendaviðmóts"</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index a1d73c9..8b5ce43 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Sfondo"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Anteprima sfondo"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"La raccolta non esiste"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Nascondi UI Anteprima"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Mostra UI Anteprima"</string>
 </resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index c85ab18..d5d97e5 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"טפט"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"תצוגה מקדימה של הטפט"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"האוסף לא קיים"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"ללא תצוגה מקדימה בממשק המשתמש"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"עם תצוגה מקדימה בממשק המשתמש"</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 9d884b4..a73f2ee 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"壁紙"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"壁紙のプレビュー"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"コレクションは存在しません"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI プレビューを非表示"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI プレビューを表示"</string>
 </resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 408a26b..09cf8ce 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"ფონი"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"ფონის გადახედვა"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"კოლექცია არ არსებობს"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI გადახედვის დამალვა"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI გადახედვის გამოჩენა"</string>
 </resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 8da40a4..2e8e6dc 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Тұсқағаз"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Тұсқағазды алдын ала қарау"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Жинақ жоқ."</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Алдын ала қарау экранын жасыру"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Алдын ала қарау экранын көрсету"</string>
 </resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 4ec72a8..aac84ab 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"ផ្ទាំងរូបភាព"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"ការមើលផ្ទាំង​រូបភាពសាកល្បង"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"បណ្ដុំមិនមានទេ"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"លាក់ការមើល UI សាកល្បង"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"បង្ហាញការមើល UI សាកល្បង"</string>
 </resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 9d3638c..d247d76 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"ವಾಲ್‌ಪೇಪರ್‌"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"ವಾಲ್‌ಪೇಪರ್ ಪೂರ್ವವೀಕ್ಷಣೆ"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"ಸಂಗ್ರಹಣೆ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI ಪೂರ್ವವೀಕ್ಷಣೆಯನ್ನು ಮರೆಮಾಡಿ"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI ಪೂರ್ವವೀಕ್ಷಣೆಯನ್ನು ತೋರಿಸಿ"</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 15e9008..8650033 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"배경화면"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"배경화면 미리보기"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"컬렉션이 없습니다."</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI 미리보기 숨기기"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI 미리보기 표시"</string>
 </resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 6701529..060bf09 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Тушкагаз"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Тушкагазды алдын ала көрүү"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Мындай жыйнак жок"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Алдын ала көрүү экранын жашыруу"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Алдын ала көрүү экранын көрсөтүү"</string>
 </resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 3ab17f6..1d885fa 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"ຮູບພື້ນຫຼັງ"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"ຕົວຢ່າງຮູບພື້ນຫຼັງ"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"ບໍ່ມິຄໍເລັກຊັນ"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"ເຊື່ອງຕົວຢ່າງສ່ວນຕິດຕໍ່ຜູ້ໃຊ້"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"ສະແດງຕົວຢ່າງສ່ວນຕິດຕໍ່ຜູ້ໃຊ້"</string>
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 9c17903..def2202 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Ekrano fonas"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Ekrano fono peržiūra"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Rinkinio nėra"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Slėpti NS peržiūrą"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Rodyti NS peržiūrą"</string>
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 741b792..16dab29 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Fona tapete"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Fona tapetes priekšskatījums"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Kolekcija nepastāv"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Paslēpt saskarnes priekšskatījumu"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Rādīt saskarnes priekšskatījumu"</string>
 </resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 9f63cfc..63df2c1 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Тапет"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Преглед на тапет"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Збирката не постои"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Сокриј го прегледот на UI"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Прикажи го прегледот на UI"</string>
 </resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 562c761..99a2ff7 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"വാൾപേപ്പർ"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"വാൾപേപ്പർ പ്രിവ്യൂ"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"ശേഖരം നിലവിലില്ല"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI പ്രിവ്യൂ മറയ്‌ക്കുക"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI പ്രിവ്യൂ കാണിക്കുക"</string>
 </resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index e02cae6..680faa6 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Дэлгэцийн зураг"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Дэлгэцийн зургийг урьдчилан үзэх"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Ийм цуглуулга байхгүй"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI урьдчилан үзэлтийг нуух"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI урьдчилан үзэлтийг харуулах"</string>
 </resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index bf7ea38..4ae38e8 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"वॉलपेपर"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"वॉलपेपर पूर्वावलोकन"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"संग्रह अस्तित्वात नाही"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI पूर्वावलोकन लपवा"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI पूर्वावलोकन दाखवा"</string>
 </resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 7b9d14e..484e4cf 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Kertas dinding"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Pratonton kertas dinding"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Koleksi tersebut tidak wujud"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Sembunyikan Pratontotn UI"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Tunjukkan Pratonton UI"</string>
 </resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index fbb2076..b220147 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"နောက်ခံ"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"နောက်ခံပုံ အစမ်းကြည့်ရှုခြင်း"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"ဤစုစည်းမှု မရှိပါ"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI အစမ်းကြည့်ခြင်းကို ဝှက်ရန်"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI အစမ်းကြည့်ခြင်းကို ပြရန်"</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 950cf23..3b23d21 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Bakgrunn"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Forhåndsvisning av bakgrunn"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Samlingen eksisterer ikke"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Skjul UI-forhåndsvisning"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Vis UI-forhåndsvisning"</string>
 </resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index d964ec9..f5b3081 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -94,8 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"वालपेपर"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"वालपेपरको प्रिभ्यु"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"यो सङ्ग्रह छैन"</string>
-    <!-- no translation found for hide_ui_preview_text (6766076482511252295) -->
-    <skip />
-    <!-- no translation found for show_ui_preview_text (5993063062417070806) -->
-    <skip />
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 0f0740e..3b15f2d 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Achtergrond"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Achtergrondvoorbeeld"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"De collectie bestaat niet"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Voorbeeld van UI verbergen"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Voorbeeld van UI tonen"</string>
 </resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 555bb64..f707023 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"ୱାଲପେପର୍"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"ୱାଲପେପରର ପ୍ରିଭ୍ୟୁ"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"ସଂଗ୍ରହ ଉପଲବ୍ଧ ନାହିଁ"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI ପ୍ରିଭ୍ୟୁକୁ ଲୁଚାନ୍ତୁ"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI ପ୍ରିଭ୍ୟୁ ଦେଖାନ୍ତୁ"</string>
 </resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index c5a6864..9f82470 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"ਵਾਲਪੇਪਰ"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"ਵਾਲਪੇਪਰ ਦੀ ਪੂਰਵ-ਝਲਕ"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"ਸੰਗ੍ਰਹਿ ਮੌਜੂਦ ਨਹੀਂ ਹੈ"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI ਦੀ ਪੂਰਵ-ਝਲਕ ਲੁਕਾਓ"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI ਦੀ ਪੂਰਵ-ਝਲਕ ਦਿਖਾਓ"</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index ad7fd31..ed50411 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Tapeta"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Podgląd tapety"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Taka kolekcja nie istnieje"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Ukryj podgląd UI"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Pokaż podgląd UI"</string>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 3eab136..060f60d 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Imagem de fundo"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Pré-visual. da imagem de fundo"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"A coleção não existe."</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Ocultar pré-visualização da IU"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Mostrar pré-visualização da IU"</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 8b27103..df1d052 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Plano de fundo"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Visualização do plano de fundo"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"A coleção não existe"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Ocultar visualização da IU"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Mostrar visualização da IU"</string>
 </resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index ae2b870..eaaf4c0 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Imagine de fundal"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Previzualizarea imaginii de fundal"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Colecția nu există"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Ascunde previzualizarea IU"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Afișează previzualizarea IU"</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index e333566..62d17ba 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Обои"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Предварительный просмотр обоев"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Такой подборки не существует."</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Скрыть экран предпросмотра"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Предпросмотр интерфейса"</string>
 </resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 1c3f458..bf81b00 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"වෝල්පේපරය"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"වෝල්පේපර පෙරදසුන"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"එකතුව නොපවතී"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI පෙරදසුන සඟවන්න"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI පෙරදසුන පෙන්වන්න"</string>
 </resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index e8b5d8d..89b45d4 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Tapeta"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Ukážka tapety"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Zbierka neexistuje"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Skryť ukážku použ. rozhrania"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Zobr. ukážku použ. rozhrania"</string>
 </resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 898e4c5..2c90b21 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Zaslonsko ozadje"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Predogled zaslonskih ozadij"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Zbirka ne obstaja"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Skrij predogled upor. vmesnika"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Pokaži predogled upo. vmesnika"</string>
 </resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 4820403..ff4a9d9 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Imazhi i sfondit"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Pamja paraprake e imazhit të sfondit"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Koleksioni nuk ekziston"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Fshih pamjen paraprake të ndërfaqes së përdoruesit"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Shfaq pamjen paraprake të ndërfaqes së përdoruesit"</string>
 </resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 8d5adda..ecd2f51 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Позадина"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Преглед позадине"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Колекција не постоји"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Сакриј кориснички интерфејс"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Прикажи кориснички интерфејс"</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 8eb236f..7bc5221 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -44,7 +44,7 @@
     <string name="daily_refresh_tile_title" msgid="3270456074558525091">"Dagens bakgrund"</string>
     <string name="daily_refresh_tile_subtitle" msgid="3976682014885446443">"Tryck för att aktivera"</string>
     <string name="start_rotation_dialog_body_live_wallpaper_needed" msgid="5132580257563846082">"Bakgrunden ändras automatiskt varje dag. Slutför konfigurationen genom att trycka på &lt;strong&gt;Använd som bakgrund&lt;/strong&gt; på nästa skärm."</string>
-    <string name="start_rotation_dialog_wifi_only_option_message" msgid="3126269859713666225">"Ladda bara ned bakgrunder via wifi i framtiden"</string>
+    <string name="start_rotation_dialog_wifi_only_option_message" msgid="3126269859713666225">"Ladda bara ned bakgrunder via Wi-Fi i framtiden"</string>
     <string name="start_rotation_dialog_continue" msgid="276678987852274872">"Fortsätt"</string>
     <string name="start_rotation_progress_message" msgid="7872623873682262083">"Den första bakgrunden laddas ned …"</string>
     <string name="start_rotation_error_message" msgid="3053799836719618972">"Det gick inte att ladda ned den första bakgrunden. Kontrollera nätverksinställningarna och försök igen."</string>
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Bakgrund"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Förhandsgranska bakgrunden"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Samlingen finns inte"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Dölj förhandsgranskning av UI"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Visa förhandsgranskning av UI"</string>
 </resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 685d17e..8ca6e68 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Mandhari"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Onyesho la kukagua mandhari"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Mkusanyiko huu haupo"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Ficha Onyesho la Kukagua Kiolesura"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Onyesha Onyesho la Kukagua Kiolesura"</string>
 </resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index e515c4c..4a5b096 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"வால்பேப்பர்"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"வால்பேப்பர் மாதிரிக்காட்சி"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"இந்தத் தொகுப்பு இல்லை"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI மாதிரிக்காட்சியை மறை"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI மாதிரிக்காட்சியைக் காட்டு"</string>
 </resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index a43d84c..e8b2d1c 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"వాల్‌పేపర్"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"వాల్‌పేపర్ ప్రివ్యూ"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"ఈ సేకరణ అందుబాటులో లేదు"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"UI ప్రివ్యూని దాచిపెట్టు"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"UI ప్రివ్యూని చూపించు"</string>
 </resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 340031e..a027d64 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"วอลเปเปอร์"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"พรีวิววอลเปเปอร์"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"ไม่มีคอลเล็กชัน"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"ซ่อนตัวอย่าง UI"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"แสดงตัวอย่าง UI"</string>
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 8345260..3cabd22 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Wallpaper"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Preview ng wallpaper"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Wala ang koleksyon"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Itago ang Preview ng UI"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Ipakita ang Preview ng UI"</string>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index ea8a3dd..008de95 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Duvar kağıdı"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Duvar kağıdı ön izleme"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Koleksiyon mevcut değil"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Arayüz Önizlemesini Gizle"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Arayüz Önizlemesini Göster"</string>
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 978c09b..9021401 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Фоновий малюнок"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Перегляд фонового малюнка"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Колекція не існує"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Сховати інтерфейс перегляду"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Показати інтерфейс перегляду"</string>
 </resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 57dacea..c95c1d5 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"وال پیپر"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"وال پیپر کا پیش منظر"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"مجموعہ موجود نہیں ہے"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"‏UI کا پیش منظر چھپائیں"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"‏UI کا پیش منظر دکھائیں"</string>
 </resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 7165716..2fb79b0 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Fon rasmi"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Fon rasmiga razm solish"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Bunday terma mavjud emas"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Interfeys namunasini berkitish"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Interfeys namunasini chiqarish"</string>
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 3b29b08..1c072d5 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Hình nền"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Xem trước hình nền"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Bộ sưu tập không tồn tại"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Ẩn giao diện người dùng xem trước"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Hiện giao diện người dùng xem trước"</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 02e1df2..24d4bf7 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"壁纸"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"壁纸预览"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"该集合不存在"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"隐藏界面预览"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"显示界面预览"</string>
 </resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index dcad964..6e2f7f7 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"桌布"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"預覽桌布"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"桌布集不存在"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"隱藏使用者介面預覽"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"顯示使用者介面預覽"</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index c2b99ad..8ce3524 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -29,11 +29,11 @@
     <string name="static_wallpaper_presentation_mode_message" msgid="417940227049360906">"目前設定的桌布"</string>
     <string name="rotating_wallpaper_presentation_mode_message" msgid="3361676041605733288">"每日桌布"</string>
     <string name="wallpaper_destination_both" msgid="1124197176741944063">"主螢幕和螢幕鎖定"</string>
-    <string name="home_screen_message" msgid="106444102822522813">"主畫面"</string>
+    <string name="home_screen_message" msgid="106444102822522813">"主螢幕"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"螢幕鎖定"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"主螢幕和螢幕鎖定"</string>
     <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"設定以下畫面的桌布:"</string>
-    <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"主畫面"</string>
+    <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"主螢幕"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"螢幕鎖定"</string>
     <string name="set_wallpaper_both_destination" msgid="233216830256235288">"主畫面和螢幕鎖定畫面"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"輪播圖片桌布"</string>
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"桌布"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"桌布預覽"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"這個系列不存在"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"隱藏使用者介面預覽畫面"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"顯示使用者介面預覽畫面"</string>
 </resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 890b986..3d693f5 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -94,6 +94,4 @@
     <string name="wallpaper_title" msgid="6754214682228331092">"Isithombe sangemuva"</string>
     <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Ukubuka kuqala kwesithombe sangemuva"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"Uqoqo alutholakali"</string>
-    <string name="hide_ui_preview_text" msgid="6766076482511252295">"Fihla ukuhlola kuqala kwe-UI"</string>
-    <string name="show_ui_preview_text" msgid="5993063062417070806">"Bonisa ukuhlola kuqala kwe-UI"</string>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 34c327d..a09f46c 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -185,14 +185,10 @@
     <dimen name="fullscreen_preview_button_margin_bottom">28dp</dimen>
 
     <!-- The size of lock screen widget on the full screen. -->
-    <dimen name="lock_screen_preview_lock_icon_size">42dp</dimen>
-    <dimen name="lock_screen_preview_time_text_size">54dp</dimen>
-    <dimen name="lock_screen_preview_date_text_size">18dp</dimen>
     <dimen name="smartspace_preview_key_ambient_shadow_blur">1.5dp</dimen>
-
-    <!-- The size of lock screen preview 2 on the full screen. -->
-    <dimen name="lock_screen_preview2_date_text_size">20dp</dimen>
-    <dimen name="lock_screen_preview2_time_text_size">170dp</dimen>
+    <dimen name="lock_screen_preview_date_text_size">20dp</dimen>
+    <dimen name="lock_screen_preview_date_line_height">24dp</dimen>
+    <dimen name="lock_screen_preview_time_text_size">150dp</dimen>
 
     <!-- Common dimensions for option sections -->
     <dimen name="section_container_vertical_margin">24dp</dimen>
@@ -204,5 +200,6 @@
     <!-- For the wallpaper section -->
     <dimen name="wallpaper_preview_margin_top">24dp</dimen>
     <dimen name="wallpaper_picker_entry_drawable_padding">8dp</dimen>
+    <dimen name="wallpaper_picker_entry_horizontal_padding">16dp</dimen>
     <dimen name="wallpaper_picker_entry_margin_vertical">18dp</dimen>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4f3d62e..f370463 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -321,7 +321,7 @@
     <!-- Content description of "slideshow wallpaper" button on the bottom action bar. [CHAR LIMIT=50] -->
     <string name="bottom_action_bar_slideshow_wallpaper">Slideshow Wallpaper</string>
 
-    <!-- Content description of apply button on the bottom action bar. [CHAR LIMIT=30] -->
+    <!-- Apply button on the bottom action bar. [CHAR LIMIT=30] -->
     <string name="bottom_action_bar_apply">Apply</string>
 
     <!-- Accessibility label for paging indicator in theme picker preview [CHAR LIMIT=NONE] -->
diff --git a/src/com/android/wallpaper/asset/Asset.java b/src/com/android/wallpaper/asset/Asset.java
index f600e84..0b87084 100755
--- a/src/com/android/wallpaper/asset/Asset.java
+++ b/src/com/android/wallpaper/asset/Asset.java
@@ -32,6 +32,7 @@
 import android.widget.ImageView;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.WorkerThread;
 
 import com.android.wallpaper.module.BitmapCropper;
 import com.android.wallpaper.module.InjectorProvider;
@@ -127,6 +128,17 @@
     }
 
     /**
+     * Returns a Bitmap from the separate low resolution data source (if there is one) or
+     * {@code null} otherwise.
+     * This could be an I/O operation so DO NOT CALL ON UI THREAD
+     */
+    @WorkerThread
+    @Nullable
+    public Bitmap getLowResBitmap(Context context) {
+        return null;
+    }
+
+    /**
      * Returns whether the asset supports rendering tile regions at varying pixel densities.
      */
     public abstract boolean supportsTiling();
diff --git a/src/com/android/wallpaper/asset/CurrentWallpaperAssetVN.java b/src/com/android/wallpaper/asset/CurrentWallpaperAssetVN.java
index d7460d6..8f30cae 100755
--- a/src/com/android/wallpaper/asset/CurrentWallpaperAssetVN.java
+++ b/src/com/android/wallpaper/asset/CurrentWallpaperAssetVN.java
@@ -15,26 +15,35 @@
  */
 package com.android.wallpaper.asset;
 
+import android.app.Activity;
 import android.app.WallpaperManager;
 import android.content.Context;
+import android.graphics.Bitmap;
 import android.graphics.Point;
 import android.graphics.Rect;
+import android.graphics.drawable.ColorDrawable;
 import android.os.ParcelFileDescriptor;
 import android.os.ParcelFileDescriptor.AutoCloseInputStream;
 import android.util.Log;
 import android.widget.ImageView;
 
+import androidx.annotation.WorkerThread;
+
 import com.android.wallpaper.compat.WallpaperManagerCompat;
 import com.android.wallpaper.compat.WallpaperManagerCompat.WallpaperLocation;
 import com.android.wallpaper.util.WallpaperCropUtils;
 
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.load.Key;
+import com.bumptech.glide.load.MultiTransformation;
+import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
+import com.bumptech.glide.load.resource.bitmap.FitCenter;
 import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
 import com.bumptech.glide.request.RequestOptions;
 
 import java.io.InputStream;
 import java.security.MessageDigest;
+import java.util.concurrent.ExecutionException;
 
 /**
  * Asset representing the currently-set image wallpaper on N+ devices, including when daily rotation
@@ -88,6 +97,35 @@
         return false;
     }
 
+
+    @Override
+    public void loadLowResDrawable(Activity activity, ImageView imageView, int placeholderColor,
+            BitmapTransformation transformation) {
+        MultiTransformation<Bitmap> multiTransformation =
+                new MultiTransformation<>(new FitCenter(), transformation);
+        Glide.with(activity)
+                .asDrawable()
+                .load(this)
+                .apply(RequestOptions.bitmapTransform(multiTransformation)
+                        .placeholder(new ColorDrawable(placeholderColor)))
+                .into(imageView);
+    }
+
+    @Override
+    @WorkerThread
+    public Bitmap getLowResBitmap(Context context) {
+        try {
+            return Glide.with(context)
+                    .asBitmap()
+                    .load(this)
+                    .submit()
+                    .get();
+        } catch (InterruptedException | ExecutionException e) {
+            Log.w(TAG, "Couldn't obtain low res bitmap", e);
+        }
+        return null;
+    }
+
     @Override
     public void loadDrawable(Context context, ImageView imageView,
                              int unusedPlaceholderColor) {
diff --git a/src/com/android/wallpaper/asset/ExifInterfaceCompat.java b/src/com/android/wallpaper/asset/ExifInterfaceCompat.java
index 6b2938e..30e2a44 100644
--- a/src/com/android/wallpaper/asset/ExifInterfaceCompat.java
+++ b/src/com/android/wallpaper/asset/ExifInterfaceCompat.java
@@ -1,12 +1,12 @@
 package com.android.wallpaper.asset;
 
-import com.android.wallpaper.compat.BuildCompat;
+import android.os.Build;
+
+import androidx.exifinterface.media.ExifInterface;
 
 import java.io.IOException;
 import java.io.InputStream;
 
-import androidx.exifinterface.media.ExifInterface;
-
 /**
  * Provides access to basic ExifInterface APIs using {@link android.media.ExifInterface} in OMR1+
  * SDK or SupportLibrary's {@link ExifInterface} for earlier SDK versions.
@@ -29,7 +29,7 @@
     public ExifInterfaceCompat(InputStream inputStream) throws IOException {
         // O-MR1 added support for more formats (HEIF), which Support Library cannot implement,
         // so use the framework version for SDK 27+
-        if (BuildCompat.isAtLeastOMR1()) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
             mFrameworkExifInterface = new android.media.ExifInterface(inputStream);
         } else {
             mSupportExifInterface = new ExifInterface(inputStream);
diff --git a/src/com/android/wallpaper/asset/LiveWallpaperThumbAsset.java b/src/com/android/wallpaper/asset/LiveWallpaperThumbAsset.java
index 3d59d1c..227f8b8 100755
--- a/src/com/android/wallpaper/asset/LiveWallpaperThumbAsset.java
+++ b/src/com/android/wallpaper/asset/LiveWallpaperThumbAsset.java
@@ -21,6 +21,7 @@
 import android.content.res.AssetFileDescriptor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
 import android.graphics.Rect;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.ColorDrawable;
@@ -30,9 +31,12 @@
 import android.util.Log;
 import android.widget.ImageView;
 
+import androidx.annotation.WorkerThread;
+
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.load.Key;
 import com.bumptech.glide.load.MultiTransformation;
+import com.bumptech.glide.load.Transformation;
 import com.bumptech.glide.load.engine.DiskCacheStrategy;
 import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
 import com.bumptech.glide.load.resource.bitmap.FitCenter;
@@ -41,18 +45,22 @@
 
 import java.io.IOException;
 import java.security.MessageDigest;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 /**
  * Asset wrapping a drawable for a live wallpaper thumbnail.
  */
 public class LiveWallpaperThumbAsset extends Asset {
     private static final String TAG = "LiveWallpaperThumbAsset";
+    private static final int LOW_RES_THUMB_TIMEOUT_SECONDS = 2;
 
     protected final Context mContext;
     protected final android.app.WallpaperInfo mInfo;
     // The content Uri of thumbnail
     protected Uri mUri;
-    private BitmapDrawable mThumbnailDrawable;
+    private Drawable mThumbnailDrawable;
 
     public LiveWallpaperThumbAsset(Context context, android.app.WallpaperInfo info) {
         mContext = context.getApplicationContext();
@@ -112,16 +120,53 @@
     @Override
     public void loadLowResDrawable(Activity activity, ImageView imageView, int placeholderColor,
             BitmapTransformation transformation) {
-        MultiTransformation multiTransformation =
-                new MultiTransformation(new FitCenter(), transformation);
+        Transformation<Bitmap> finalTransformation = (transformation == null)
+                ? new FitCenter()
+                : new MultiTransformation<>(new FitCenter(), transformation);
         Glide.with(activity)
                 .asDrawable()
                 .load(LiveWallpaperThumbAsset.this)
-                .apply(RequestOptions.bitmapTransform(multiTransformation)
+                .apply(RequestOptions.bitmapTransform(finalTransformation)
                         .placeholder(new ColorDrawable(placeholderColor)))
                 .into(imageView);
     }
 
+    @Override
+    @WorkerThread
+    public Bitmap getLowResBitmap(Context context) {
+        try {
+            Drawable drawable = Glide.with(context)
+                    .asDrawable()
+                    .load(this)
+                    .submit()
+                    .get(LOW_RES_THUMB_TIMEOUT_SECONDS, TimeUnit.SECONDS);
+
+            if (drawable instanceof BitmapDrawable) {
+                BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
+                Bitmap bitmap = bitmapDrawable.getBitmap();
+                if (bitmap != null) {
+                    return bitmap;
+                }
+            }
+            Bitmap bitmap;
+            // If not a bitmap, draw the drawable into a bitmap
+            if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
+                return null;
+            } else {
+                bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
+                        drawable.getIntrinsicHeight(), Bitmap.Config.RGB_565);
+            }
+
+            Canvas canvas = new Canvas(bitmap);
+            drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+            drawable.draw(canvas);
+            return bitmap;
+        } catch (InterruptedException | ExecutionException | TimeoutException e) {
+            Log.w(TAG, "Couldn't obtain low res bitmap", e);
+        }
+        return null;
+    }
+
     /**
      * Returns a Glide cache key.
      */
@@ -134,10 +179,10 @@
      * the main UI thread.
      */
     protected Drawable getThumbnailDrawable() {
+        if (mThumbnailDrawable != null) {
+            return mThumbnailDrawable;
+        }
         if (mUri != null) {
-            if (mThumbnailDrawable != null) {
-                return mThumbnailDrawable;
-            }
             try (AssetFileDescriptor assetFileDescriptor =
                          mContext.getContentResolver().openAssetFileDescriptor(mUri, "r")) {
                 if (assetFileDescriptor != null) {
@@ -149,7 +194,8 @@
                 Log.w(TAG, "Not found thumbnail from URI.");
             }
         }
-        return mInfo.loadThumbnail(mContext.getPackageManager());
+        mThumbnailDrawable = mInfo.loadThumbnail(mContext.getPackageManager());
+        return mThumbnailDrawable;
     }
 
     /**
diff --git a/src/com/android/wallpaper/backup/MissingHashCodeGenerator.java b/src/com/android/wallpaper/backup/MissingHashCodeGenerator.java
index f934fe7..0c16572 100755
--- a/src/com/android/wallpaper/backup/MissingHashCodeGenerator.java
+++ b/src/com/android/wallpaper/backup/MissingHashCodeGenerator.java
@@ -20,8 +20,8 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.os.Build;
 
-import com.android.wallpaper.compat.BuildCompat;
 import com.android.wallpaper.module.Injector;
 import com.android.wallpaper.module.InjectorProvider;
 import com.android.wallpaper.module.WallpaperPreferences;
@@ -42,7 +42,7 @@
         // This receiver is a no-op on pre-N Android and should only respond to a MY_PACKAGE_REPLACED
         // intent.
         if (!intent.getAction().equals(Intent.ACTION_MY_PACKAGE_REPLACED)
-                || !BuildCompat.isAtLeastN()) {
+                || Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
             return;
         }
 
diff --git a/src/com/android/wallpaper/compat/BuildCompat.java b/src/com/android/wallpaper/compat/BuildCompat.java
deleted file mode 100755
index fd1a1c5..0000000
--- a/src/com/android/wallpaper/compat/BuildCompat.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.wallpaper.compat;
-
-import android.os.Build;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
-
-/**
- * Provides the SDK version in a manner that can be stubbed out in a test environment.
- */
-public class BuildCompat {
-    public static final int JB_MR2_SDK_VERSION = VERSION_CODES.JELLY_BEAN_MR2;
-    public static final int L_SDK_VERSION = VERSION_CODES.LOLLIPOP;
-    public static final int N_SDK_VERSION = Build.VERSION_CODES.N;
-    public static final int N_MR1_SDK_VERSION = Build.VERSION_CODES.N_MR1;
-
-    private static int sSdk = Build.VERSION.SDK_INT;
-
-    /**
-     * Returns whether the framework on the current Android device is JellyBean MR2 (API 18) or
-     * higher. Used to determine if it's safe to use APIs added in that API version such as
-     * HandlerThread#quitSafely.
-     */
-    public static boolean isAtLeastJBMR2() {
-        return sSdk >= JB_MR2_SDK_VERSION;
-    }
-
-    /**
-     * Returns whether the framework on the current Android device is L (API 21) or higher. Used to
-     * determine whether framework classes introduced in L such as JobScheduler can be used on this
-     * device.
-     */
-    public static boolean isAtLeastL() {
-        return sSdk >= L_SDK_VERSION;
-    }
-
-    /**
-     * Returns whether the framework on the current Android device is N or higher. Used to determine
-     * whether new N-specific wallpaper APIs are available.
-     */
-    public static boolean isAtLeastN() {
-        return sSdk >= N_SDK_VERSION;
-    }
-
-    /**
-     * Returns whether the framework on the current Android device is N-MR1 or higher. Used to
-     * determine whether new N-MR1-specific wallpaper APIs are available.
-     */
-    public static boolean isAtLeastNMR1() {
-        return sSdk >= N_MR1_SDK_VERSION;
-    }
-
-    /**
-     * Returns whether the framework on the current Android device is N-MR2 or higher. Used to
-     * determine if new N-MR2 specific API behavior is present on the device.
-     */
-    public static boolean isAtLeastNMR2() {
-        return sSdk > N_MR1_SDK_VERSION
-                || (sSdk == N_MR1_SDK_VERSION && VERSION.RELEASE.equals("7.1.2"));
-    }
-
-    /**
-     * Returns whether the framework on the current Android device is O or higher.
-     */
-    public static boolean isAtLeastO() {
-        return sSdk >= Build.VERSION_CODES.O;
-    }
-
-    /**
-     * Returns whether the framework on the current Android device is O-MR1 or higher.
-     */
-    public static boolean isAtLeastOMR1() {
-        return sSdk >= VERSION_CODES.O_MR1;
-    }
-
-    /**
-     * Sets the SDK version that BuildCompat will consider the current device to be on. Used for
-     * testing only.
-     */
-    public static void setSdkVersionForTesting(int sdk) {
-        sSdk = sdk;
-    }
-
-    public static boolean isAtLeastQ() {
-        return sSdk >= VERSION_CODES.Q;
-    }
-
-    /**
-     * Returns whether the framework on the current Android device is S or higher.
-     */
-    public static boolean isAtLeastS() {
-        return sSdk >= VERSION_CODES.S
-                || "S".equals(VERSION.CODENAME); // TODO: remove once build version for S is updated
-    }
-}
diff --git a/src/com/android/wallpaper/compat/WallpaperManagerCompat.java b/src/com/android/wallpaper/compat/WallpaperManagerCompat.java
index ef834a1..c0b6a9e 100755
--- a/src/com/android/wallpaper/compat/WallpaperManagerCompat.java
+++ b/src/com/android/wallpaper/compat/WallpaperManagerCompat.java
@@ -20,13 +20,14 @@
 import android.graphics.Bitmap;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
+import android.os.Build;
 import android.os.ParcelFileDescriptor;
 
+import androidx.annotation.IntDef;
+
 import java.io.IOException;
 import java.io.InputStream;
 
-import androidx.annotation.IntDef;
-
 /**
  * An abstraction over WallpaperManager to allow for the transitional state in which the N SDK
  * is not yet ready but we need to use new N API methods. Provides wrapper methods for the new
@@ -41,7 +42,7 @@
     public static WallpaperManagerCompat getInstance(Context context) {
         synchronized (sInstanceLock) {
             if (sInstance == null) {
-                if (BuildCompat.isAtLeastN()) {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                     sInstance = new WallpaperManagerCompatVN(context.getApplicationContext());
                 } else {
                     sInstance = new WallpaperManagerCompatV16(context.getApplicationContext());
diff --git a/src/com/android/wallpaper/model/AppResourceWallpaperInfo.java b/src/com/android/wallpaper/model/AppResourceWallpaperInfo.java
index 20d0f2b..59f39c9 100755
--- a/src/com/android/wallpaper/model/AppResourceWallpaperInfo.java
+++ b/src/com/android/wallpaper/model/AppResourceWallpaperInfo.java
@@ -65,6 +65,7 @@
     }
 
     private AppResourceWallpaperInfo(Parcel in) {
+        super(in);
         mPackageName = in.readString();
         mThumbRes = in.readInt();
         mFullRes = in.readInt();
@@ -181,6 +182,7 @@
 
     @Override
     public void writeToParcel(Parcel parcel, int i) {
+        super.writeToParcel(parcel, i);
         parcel.writeString(mPackageName);
         parcel.writeInt(mThumbRes);
         parcel.writeInt(mFullRes);
diff --git a/src/com/android/wallpaper/model/CategoryProvider.java b/src/com/android/wallpaper/model/CategoryProvider.java
index 78899d8..93158a3 100755
--- a/src/com/android/wallpaper/model/CategoryProvider.java
+++ b/src/com/android/wallpaper/model/CategoryProvider.java
@@ -62,8 +62,10 @@
 
     /**
      * Resets the fetched categories if needed.
+     *
+     * @return {@code true} if the fetched categories are reset; {@code false} otherwise.
      */
-    void resetIfNeeded();
+    boolean resetIfNeeded();
 
     /**
      * Checks if featured collection available.
diff --git a/src/com/android/wallpaper/model/CurrentWallpaperInfoVN.java b/src/com/android/wallpaper/model/CurrentWallpaperInfoVN.java
index bf54bfd..cc2677a 100755
--- a/src/com/android/wallpaper/model/CurrentWallpaperInfoVN.java
+++ b/src/com/android/wallpaper/model/CurrentWallpaperInfoVN.java
@@ -83,6 +83,7 @@
     }
 
     private CurrentWallpaperInfoVN(Parcel in) {
+        super(in);
         mAttributions = new ArrayList<>();
         in.readStringList(mAttributions);
         //noinspection ResourceType
@@ -164,6 +165,7 @@
 
     @Override
     public void writeToParcel(Parcel parcel, int flags) {
+        super.writeToParcel(parcel, flags);
         parcel.writeStringList(mAttributions);
         parcel.writeInt(mWallpaperManagerFlag);
         parcel.writeString(mActionUrl);
diff --git a/src/com/android/wallpaper/model/HubSectionController.java b/src/com/android/wallpaper/model/CustomizationSectionController.java
similarity index 70%
rename from src/com/android/wallpaper/model/HubSectionController.java
rename to src/com/android/wallpaper/model/CustomizationSectionController.java
index e271254..b01f098 100644
--- a/src/com/android/wallpaper/model/HubSectionController.java
+++ b/src/com/android/wallpaper/model/CustomizationSectionController.java
@@ -24,25 +24,19 @@
 import com.android.wallpaper.picker.SectionView;
 
 /**
- * The interface for the behavior of section in the Customization hub.
+ * The interface for the behavior of section in the customization picker.
  *
  * @param <T> the {@link SectionView} to create for the section
  */
-public interface HubSectionController<T extends SectionView> {
+public interface CustomizationSectionController<T extends SectionView> {
 
-    /** Interface for Customization hub section navigation. */
-    interface HubSectionNavigationController {
+    /** Interface for customization section navigation. */
+    interface CustomizationSectionNavigationController {
         /** Navigates to the given {@code fragment}. */
         void navigateTo(Fragment fragment);
     }
 
-    /** Interface for Customization hub section's dark mode responding to battery saver. */
-    interface HubSectionBatterySaverListener {
-        /** Callback when battery saver's state changed with given {@code isEnabled}. */
-        void onBatterySaverStateChanged(boolean isEnabled);
-    }
-
-    /** Returns {@code true} if the Customization hub section is available. */
+    /** Returns {@code true} if the customization section is available. */
     boolean isAvailable(@Nullable Context context);
 
     /**
@@ -57,4 +51,7 @@
 
     /** Releases the controller. */
     default void release() {}
+
+    /** Gets called when the section gets transitioned out. */
+    default void onTransitionOut() {}
 }
diff --git a/src/com/android/wallpaper/model/DefaultWallpaperInfo.java b/src/com/android/wallpaper/model/DefaultWallpaperInfo.java
index 78f1575..6ed0eeb 100755
--- a/src/com/android/wallpaper/model/DefaultWallpaperInfo.java
+++ b/src/com/android/wallpaper/model/DefaultWallpaperInfo.java
@@ -37,7 +37,7 @@
             new Creator<DefaultWallpaperInfo>() {
                 @Override
                 public DefaultWallpaperInfo createFromParcel(Parcel in) {
-                    return new DefaultWallpaperInfo();
+                    return new DefaultWallpaperInfo(in);
                 }
 
                 @Override
@@ -47,6 +47,12 @@
             };
     private Asset mAsset;
 
+    public DefaultWallpaperInfo() {}
+
+    private DefaultWallpaperInfo(Parcel in) {
+        super(in);
+    }
+
     @Override
     public List<String> getAttributions(Context context) {
         return Arrays.asList(context.getResources().getString(R.string.fallback_wallpaper_title));
@@ -100,5 +106,6 @@
 
     @Override
     public void writeToParcel(Parcel parcel, int i) {
+        super.writeToParcel(parcel, i);
     }
 }
diff --git a/src/com/android/wallpaper/model/ImageWallpaperInfo.java b/src/com/android/wallpaper/model/ImageWallpaperInfo.java
index e4e96ae..8449edf 100755
--- a/src/com/android/wallpaper/model/ImageWallpaperInfo.java
+++ b/src/com/android/wallpaper/model/ImageWallpaperInfo.java
@@ -73,6 +73,7 @@
     }
 
     protected ImageWallpaperInfo(Parcel in) {
+        super(in);
         mUri = Uri.parse(in.readString());
     }
 
@@ -174,6 +175,7 @@
 
     @Override
     public void writeToParcel(Parcel parcel, int i) {
+        super.writeToParcel(parcel, i);
         parcel.writeString(mUri.toString());
     }
 }
diff --git a/src/com/android/wallpaper/model/LegacyPartnerWallpaperInfo.java b/src/com/android/wallpaper/model/LegacyPartnerWallpaperInfo.java
index 6eda554..c3bf44b 100755
--- a/src/com/android/wallpaper/model/LegacyPartnerWallpaperInfo.java
+++ b/src/com/android/wallpaper/model/LegacyPartnerWallpaperInfo.java
@@ -63,6 +63,7 @@
     }
 
     private LegacyPartnerWallpaperInfo(Parcel in) {
+        super(in);
         mThumbName = in.readString();
         mFullName = in.readString();
     }
@@ -178,6 +179,7 @@
 
     @Override
     public void writeToParcel(Parcel parcel, int i) {
+        super.writeToParcel(parcel, i);
         parcel.writeString(mThumbName);
         parcel.writeString(mFullName);
     }
diff --git a/src/com/android/wallpaper/model/LiveWallpaperInfo.java b/src/com/android/wallpaper/model/LiveWallpaperInfo.java
index 0bc467f..bfa1318 100755
--- a/src/com/android/wallpaper/model/LiveWallpaperInfo.java
+++ b/src/com/android/wallpaper/model/LiveWallpaperInfo.java
@@ -24,6 +24,7 @@
 import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Parcel;
 import android.service.wallpaper.WallpaperService;
 import android.text.TextUtils;
@@ -35,7 +36,6 @@
 import com.android.wallpaper.R;
 import com.android.wallpaper.asset.Asset;
 import com.android.wallpaper.asset.LiveWallpaperThumbAsset;
-import com.android.wallpaper.compat.BuildCompat;
 import com.android.wallpaper.module.InjectorProvider;
 import com.android.wallpaper.module.LiveWallpaperInfoFactory;
 import com.android.wallpaper.util.ActivityUtils;
@@ -154,7 +154,8 @@
         mCollectionId = collectionId;
     }
 
-    LiveWallpaperInfo(Parcel in) {
+    protected LiveWallpaperInfo(Parcel in) {
+        super(in);
         mInfo = in.readParcelable(android.app.WallpaperInfo.class.getClassLoader());
         mVisibleTitle = in.readInt() == 1;
         mCollectionId = in.readString();
@@ -354,7 +355,7 @@
 
     @Override
     public String getActionUrl(Context context) {
-        if (BuildCompat.isAtLeastNMR1()) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
             try {
                 Uri wallpaperContextUri = mInfo.loadContextUri(context.getPackageManager());
                 if (wallpaperContextUri != null) {
@@ -408,6 +409,7 @@
 
     @Override
     public void writeToParcel(Parcel parcel, int i) {
+        super.writeToParcel(parcel, i);
         parcel.writeParcelable(mInfo, 0 /* flags */);
         parcel.writeInt(mVisibleTitle ? 1 : 0);
         parcel.writeString(mCollectionId);
diff --git a/src/com/android/wallpaper/model/PartnerWallpaperInfo.java b/src/com/android/wallpaper/model/PartnerWallpaperInfo.java
index 513e3fe..63f9326 100755
--- a/src/com/android/wallpaper/model/PartnerWallpaperInfo.java
+++ b/src/com/android/wallpaper/model/PartnerWallpaperInfo.java
@@ -60,6 +60,7 @@
     }
 
     private PartnerWallpaperInfo(Parcel in) {
+        super(in);
         mThumbRes = in.readInt();
         mFullRes = in.readInt();
     }
@@ -158,6 +159,7 @@
 
     @Override
     public void writeToParcel(Parcel parcel, int i) {
+        super.writeToParcel(parcel, i);
         parcel.writeInt(mThumbRes);
         parcel.writeInt(mFullRes);
     }
diff --git a/src/com/android/wallpaper/model/SystemStaticWallpaperInfo.java b/src/com/android/wallpaper/model/SystemStaticWallpaperInfo.java
index db34abb..e892956 100755
--- a/src/com/android/wallpaper/model/SystemStaticWallpaperInfo.java
+++ b/src/com/android/wallpaper/model/SystemStaticWallpaperInfo.java
@@ -184,6 +184,7 @@
     }
 
     private SystemStaticWallpaperInfo(Parcel in) {
+        super(in);
         mPackageName = in.readString();
         mWallpaperId = in.readString();
         mCollectionId = in.readString();
@@ -292,6 +293,7 @@
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
+        super.writeToParcel(dest, flags);
         dest.writeString(mPackageName);
         dest.writeString(mWallpaperId);
         dest.writeString(mCollectionId);
diff --git a/src/com/android/wallpaper/model/WallpaperInfo.java b/src/com/android/wallpaper/model/WallpaperInfo.java
index 9f657af..c88c602 100755
--- a/src/com/android/wallpaper/model/WallpaperInfo.java
+++ b/src/com/android/wallpaper/model/WallpaperInfo.java
@@ -16,9 +16,13 @@
 package com.android.wallpaper.model;
 
 import android.app.Activity;
+import android.app.WallpaperColors;
 import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Color;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
+import android.os.Parcel;
 import android.os.Parcelable;
 
 import androidx.annotation.DrawableRes;
@@ -29,12 +33,31 @@
 import com.android.wallpaper.asset.Asset;
 
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
 
 /**
  * Interface for wallpaper info model.
  */
 public abstract class WallpaperInfo implements Parcelable {
 
+    private static final ExecutorService sExecutor = Executors.newCachedThreadPool();
+
+    private int mPlaceholderColor = Color.TRANSPARENT;
+
+    public WallpaperInfo() {}
+
+    protected WallpaperInfo(Parcel in) {
+        mPlaceholderColor = in.readInt();
+    }
+
+    @Override
+    public void writeToParcel(Parcel parcel, int flags) {
+        parcel.writeInt(mPlaceholderColor);
+    }
+
     @DrawableRes
     public static int getDefaultActionIcon() {
         return R.drawable.ic_explore_24px;
@@ -180,6 +203,36 @@
     public abstract void showPreview(Activity srcActivity, InlinePreviewIntentFactory factory,
                                      int requestCode);
 
+
+    /**
+     * Returns a Future to obtain a placeholder color calculated in a background thread for this
+     * wallpaper's thumbnail.
+     * If it's already available, the Future will return the color immediately.
+     * This is intended to be a "best effort" attempt and might not obtain a color if no low res
+     * thumbnail is available.
+     */
+    public Future<Integer> computePlaceholderColor(Context context) {
+        if (mPlaceholderColor != Color.TRANSPARENT) {
+            return CompletableFuture.completedFuture(mPlaceholderColor);
+        }
+        final Context appContext = context.getApplicationContext();
+        return sExecutor.submit(() -> {
+            synchronized (WallpaperInfo.this) {
+                if (mPlaceholderColor != Color.TRANSPARENT) {
+                    return mPlaceholderColor;
+                }
+                Asset thumbAsset = getThumbAsset(appContext);
+                Bitmap lowResBitmap = thumbAsset.getLowResBitmap(appContext);
+                if (lowResBitmap == null) {
+                    return Color.TRANSPARENT;
+                }
+                mPlaceholderColor = WallpaperColors.fromBitmap(
+                        lowResBitmap).getPrimaryColor().toArgb();
+                return mPlaceholderColor;
+            }
+        });
+    }
+
     /**
      * Whether backup is allowed for this type of wallpaper.
      */
diff --git a/src/com/android/wallpaper/model/WallpaperSectionController.java b/src/com/android/wallpaper/model/WallpaperSectionController.java
index 07f1eb4..f8bd2f3 100644
--- a/src/com/android/wallpaper/model/WallpaperSectionController.java
+++ b/src/com/android/wallpaper/model/WallpaperSectionController.java
@@ -61,10 +61,11 @@
 import com.android.wallpaper.util.ResourceUtils;
 import com.android.wallpaper.util.WallpaperConnection;
 import com.android.wallpaper.util.WallpaperSurfaceCallback;
-import com.android.wallpaper.widget.LockScreenPreviewer2;
+import com.android.wallpaper.widget.LockScreenPreviewer;
 
 /** The class to control the wallpaper section view. */
-public class WallpaperSectionController implements HubSectionController<WallpaperSectionView>,
+public class WallpaperSectionController implements
+        CustomizationSectionController<WallpaperSectionView>,
         LifecycleObserver {
 
     private static final String PERMISSION_READ_WALLPAPER_INTERNAL =
@@ -89,7 +90,7 @@
     // The wallpaper information which is currently shown on the lock preview.
     private WallpaperInfo mLockPreviewWallpaperInfo;
 
-    private LockScreenPreviewer2 mLockScreenPreviewer;
+    private LockScreenPreviewer mLockScreenPreviewer;
 
     private final Activity mActivity;
     private final Context mAppContext;
@@ -97,14 +98,14 @@
     private final PermissionRequester mPermissionRequester;
     private final WallpaperColorsViewModel mWallpaperColorsViewModel;
     private final WorkspaceViewModel mWorkspaceViewModel;
-    private final HubSectionNavigationController mHubSectionNavigationController;
+    private final CustomizationSectionNavigationController mSectionNavigationController;
     private final WallpaperPreviewNavigator mWallpaperPreviewNavigator;
     private final Bundle mSavedInstanceState;
 
     public WallpaperSectionController(Activity activity, LifecycleOwner lifecycleOwner,
             PermissionRequester permissionRequester, WallpaperColorsViewModel colorsViewModel,
             WorkspaceViewModel workspaceViewModel,
-            HubSectionNavigationController hubSectionNavigationController,
+            CustomizationSectionNavigationController sectionNavigationController,
             WallpaperPreviewNavigator wallpaperPreviewNavigator,
             Bundle savedInstanceState) {
         mActivity = activity;
@@ -113,7 +114,7 @@
         mAppContext = mActivity.getApplicationContext();
         mWallpaperColorsViewModel = colorsViewModel;
         mWorkspaceViewModel = workspaceViewModel;
-        mHubSectionNavigationController = hubSectionNavigationController;
+        mSectionNavigationController = sectionNavigationController;
         mWallpaperPreviewNavigator = wallpaperPreviewNavigator;
         mSavedInstanceState = savedInstanceState;
     }
@@ -154,8 +155,6 @@
         WallpaperSectionView wallpaperSectionView = (WallpaperSectionView) LayoutInflater.from(
                 context).inflate(R.layout.wallpaper_section_view, /* root= */ null);
         mHomePreviewCard = wallpaperSectionView.findViewById(R.id.home_preview);
-        // TODO(santie) completely remove wallpaper_preview_image once we get rid of the old ui
-        mHomePreviewCard.findViewById(R.id.wallpaper_preview_image).setVisibility(View.GONE);
         mHomePreviewCard.setContentDescription(mAppContext.getString(
                 R.string.wallpaper_preview_card_content_description));
         mWorkspaceSurface = mHomePreviewCard.findViewById(R.id.workspace_surface);
@@ -175,7 +174,6 @@
                 R.string.lockscreen_wallpaper_preview_card_content_description));
         mLockscreenPreviewProgress = mLockscreenPreviewCard.findViewById(
                 R.id.wallpaper_preview_spinner);
-        mLockscreenPreviewCard.findViewById(R.id.wallpaper_preview_image).setVisibility(View.GONE);
         mLockscreenPreviewCard.findViewById(R.id.workspace_surface).setVisibility(View.GONE);
         mLockWallpaperSurface = mLockscreenPreviewCard.findViewById(R.id.wallpaper_surface);
         mLockWallpaperSurfaceCallback = new WallpaperSurfaceCallback(mActivity,
@@ -187,7 +185,7 @@
         mLockPreviewContainer = mLockscreenPreviewCard.findViewById(
                 R.id.lock_screen_preview_container);
         mLockPreviewContainer.setVisibility(View.INVISIBLE);
-        mLockScreenPreviewer = new LockScreenPreviewer2(mLifecycleOwner.getLifecycle(), context,
+        mLockScreenPreviewer = new LockScreenPreviewer(mLifecycleOwner.getLifecycle(), context,
                 mLockPreviewContainer);
 
         setupCurrentWallpaperPreview(wallpaperSectionView);
@@ -199,7 +197,7 @@
         updateWorkspaceSurface();
 
         wallpaperSectionView.findViewById(R.id.wallpaper_picker_entry).setOnClickListener(
-                v -> mHubSectionNavigationController.navigateTo(new CategorySelectorFragment()));
+                v -> mSectionNavigationController.navigateTo(new CategorySelectorFragment()));
 
         mWorkspaceViewModel.getUpdateWorkspace().observe(mLifecycleOwner, update ->
                 updateWorkspacePreview(mWorkspaceSurface, mWorkspaceSurfaceCallback,
@@ -338,6 +336,10 @@
                     mLockPreviewWallpaperInfo =
                             lockWallpaper == null ? homeWallpaper : lockWallpaper;
 
+                    mHomePreviewWallpaperInfo.computePlaceholderColor(mAppContext);
+                    if (lockWallpaper != null) {
+                        lockWallpaper.computePlaceholderColor(mAppContext);
+                    }
                     updatePreview(mHomePreviewWallpaperInfo, true);
                     updatePreview(mLockPreviewWallpaperInfo, false);
 
@@ -372,7 +374,7 @@
                 ? mHomeWallpaperSurfaceCallback : mLockWallpaperSurfaceCallback;
         // Load thumb regardless of live wallpaper to make sure we have a placeholder while
         // the live wallpaper initializes in that case.
-        Asset thumbAsset = maybeLoadThumbnail(wallpaperInfo, surfaceCallback);
+        maybeLoadThumbnail(wallpaperInfo, surfaceCallback);
 
         if (isHomeWallpaper) {
             if (mWallpaperConnection != null) {
@@ -530,4 +532,23 @@
             mLockPreviewContainer.setVisibility(visibility);
         }
     }
+
+    @Override
+    public void onTransitionOut() {
+        if (mHomeWallpaperSurface != null) {
+            mHomeWallpaperSurface.setUseAlpha();
+            mHomeWallpaperSurface.setAlpha(0f);
+        }
+        if (mLockWallpaperSurface != null) {
+            mLockWallpaperSurface.setUseAlpha();
+            mLockWallpaperSurface.setAlpha(0f);
+        }
+        if (mWorkspaceSurface != null) {
+            mWorkspaceSurface.setUseAlpha();
+            mWorkspaceSurface.setAlpha(0f);
+        }
+        if (mLockPreviewContainer != null) {
+            mLockPreviewContainer.setAlpha(0f);
+        }
+    }
 }
diff --git a/src/com/android/wallpaper/module/BaseWallpaperInjector.java b/src/com/android/wallpaper/module/BaseWallpaperInjector.java
index de9ddb1..0dc5578 100755
--- a/src/com/android/wallpaper/module/BaseWallpaperInjector.java
+++ b/src/com/android/wallpaper/module/BaseWallpaperInjector.java
@@ -42,6 +42,7 @@
     private PackageStatusNotifier mPackageStatusNotifier;
     private LiveWallpaperInfoFactory mLiveWallpaperInfoFactory;
     private DrawableLayerResolver mDrawableLayerResolver;
+    private CustomizationSections mCustomizationSections;
 
     @Override
     public synchronized BitmapCropper getBitmapCropper() {
@@ -177,4 +178,12 @@
         }
         return mDrawableLayerResolver;
     }
+
+    @Override
+    public CustomizationSections getCustomizationSections() {
+        if (mCustomizationSections == null) {
+            mCustomizationSections = new WallpaperPickerSections();
+        }
+        return mCustomizationSections;
+    }
 }
diff --git a/src/com/android/wallpaper/module/CustomizationSections.java b/src/com/android/wallpaper/module/CustomizationSections.java
new file mode 100644
index 0000000..c611d50
--- /dev/null
+++ b/src/com/android/wallpaper/module/CustomizationSections.java
@@ -0,0 +1,37 @@
+package com.android.wallpaper.module;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.lifecycle.LifecycleOwner;
+
+import com.android.wallpaper.model.CustomizationSectionController;
+import com.android.wallpaper.model.CustomizationSectionController.CustomizationSectionNavigationController;
+import com.android.wallpaper.model.PermissionRequester;
+import com.android.wallpaper.model.WallpaperColorsViewModel;
+import com.android.wallpaper.model.WallpaperPreviewNavigator;
+import com.android.wallpaper.model.WorkspaceViewModel;
+
+import java.util.List;
+
+/** Interface for carry {@link CustomizationSectionController}s. */
+public interface CustomizationSections {
+
+    /**
+     * Gets a new instance of the section controller list.
+     *
+     * Note that the section views will be displayed by the list ordering.
+     *
+     * <p>Don't keep the section controllers as singleton since they contain views.
+     */
+    List<CustomizationSectionController<?>> getAllSectionControllers(
+            Activity activity,
+            LifecycleOwner lifecycleOwner,
+            WallpaperColorsViewModel wallpaperColorsViewModel,
+            WorkspaceViewModel workspaceViewModel,
+            PermissionRequester permissionRequester,
+            WallpaperPreviewNavigator wallpaperPreviewNavigator,
+            CustomizationSectionNavigationController sectionNavigationController,
+            @Nullable Bundle savedInstanceState);
+}
diff --git a/src/com/android/wallpaper/module/DailyLoggingAlarmScheduler.java b/src/com/android/wallpaper/module/DailyLoggingAlarmScheduler.java
index e3d7b06..dd3a013 100755
--- a/src/com/android/wallpaper/module/DailyLoggingAlarmScheduler.java
+++ b/src/com/android/wallpaper/module/DailyLoggingAlarmScheduler.java
@@ -15,6 +15,8 @@
  */
 package com.android.wallpaper.module;
 
+import static android.app.PendingIntent.FLAG_IMMUTABLE;
+
 import android.app.AlarmManager;
 import android.app.PendingIntent;
 import android.content.Context;
@@ -30,7 +32,6 @@
 public class DailyLoggingAlarmScheduler {
 
     private static final int UNUSED_REQUEST_CODE = 0;
-    private static final int UNUSED_REQUEST_FLAGS = 0;
 
     /**
      * Sets a new alarm to fire approximately 24 hours after the last one, or immediately if it has
@@ -79,7 +80,7 @@
     private static PendingIntent createAlarmReceiverPendingIntent(Context appContext) {
         Intent intent = new Intent(appContext, DailyLoggingAlarmReceiver.class);
         return PendingIntent.getBroadcast(
-                appContext, UNUSED_REQUEST_CODE, intent, UNUSED_REQUEST_FLAGS);
+                appContext, UNUSED_REQUEST_CODE, intent, FLAG_IMMUTABLE);
     }
 
 }
diff --git a/src/com/android/wallpaper/module/DefaultCategoryProvider.java b/src/com/android/wallpaper/module/DefaultCategoryProvider.java
index dc9b227..e82045d 100755
--- a/src/com/android/wallpaper/module/DefaultCategoryProvider.java
+++ b/src/com/android/wallpaper/module/DefaultCategoryProvider.java
@@ -142,12 +142,14 @@
     }
 
     @Override
-    public void resetIfNeeded() {
+    public boolean resetIfNeeded() {
         if (mNetworkStatus != mNetworkStatusNotifier.getNetworkStatus()
                 || mLocale != getLocale()) {
             mCategories.clear();
             mFetchedCategories = false;
+            return true;
         }
+        return false;
     }
 
     @Override
diff --git a/src/com/android/wallpaper/module/DefaultWallpaperPersister.java b/src/com/android/wallpaper/module/DefaultWallpaperPersister.java
index bf86585..52b86aa 100755
--- a/src/com/android/wallpaper/module/DefaultWallpaperPersister.java
+++ b/src/com/android/wallpaper/module/DefaultWallpaperPersister.java
@@ -28,6 +28,7 @@
 import android.graphics.Rect;
 import android.graphics.drawable.BitmapDrawable;
 import android.os.AsyncTask;
+import android.os.Build;
 import android.os.ParcelFileDescriptor;
 import android.util.Log;
 import android.view.Display;
@@ -41,7 +42,6 @@
 import com.android.wallpaper.asset.BitmapUtils;
 import com.android.wallpaper.asset.StreamableAsset;
 import com.android.wallpaper.asset.StreamableAsset.StreamReceiver;
-import com.android.wallpaper.compat.BuildCompat;
 import com.android.wallpaper.compat.WallpaperManagerCompat;
 import com.android.wallpaper.model.WallpaperInfo;
 import com.android.wallpaper.module.BitmapCropper.Callback;
@@ -695,7 +695,7 @@
                         && mWallpaperPreferences.getWallpaperPresentationMode()
                         == WallpaperPreferences.PRESENTATION_MODE_ROTATING
                         && !wasLockWallpaperSet
-                        && BuildCompat.isAtLeastN()) {
+                        && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                     copyRotatingWallpaperToLock();
                 }
                 setImageWallpaperMetadata(mDestination, wallpaperId);
@@ -785,7 +785,7 @@
         }
 
         private void setImageWallpaperHomeMetadata(int homeWallpaperId) {
-            if (BuildCompat.isAtLeastN()) {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                 mWallpaperPreferences.setHomeWallpaperManagerId(homeWallpaperId);
             }
 
diff --git a/src/com/android/wallpaper/module/DefaultWallpaperRefresher.java b/src/com/android/wallpaper/module/DefaultWallpaperRefresher.java
index d85e04e..5a43af1 100755
--- a/src/com/android/wallpaper/module/DefaultWallpaperRefresher.java
+++ b/src/com/android/wallpaper/module/DefaultWallpaperRefresher.java
@@ -22,12 +22,12 @@
 import android.graphics.BitmapFactory;
 import android.graphics.drawable.BitmapDrawable;
 import android.os.AsyncTask;
+import android.os.Build;
 import android.os.ParcelFileDescriptor;
 import android.util.Log;
 
 import com.android.wallpaper.R;
 import com.android.wallpaper.asset.BitmapUtils;
-import com.android.wallpaper.compat.BuildCompat;
 import com.android.wallpaper.compat.WallpaperManagerCompat;
 import com.android.wallpaper.model.WallpaperMetadata;
 
@@ -101,7 +101,9 @@
             boolean isLockScreenWallpaperCurrentlySet = LockWallpaperStatusChecker
                     .isLockWallpaperSet(mAppContext);
 
-            if (!BuildCompat.isAtLeastN() || !isLockScreenWallpaperCurrentlySet) {
+            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N
+                    || !isLockScreenWallpaperCurrentlySet) {
+
                 // Return only home metadata if pre-N device or lock screen wallpaper is not explicitly set.
                 wallpaperMetadatas.add(new WallpaperMetadata(
                         mWallpaperPreferences.getHomeWallpaperAttributions(),
@@ -164,7 +166,7 @@
                         Arrays.asList(mAppContext.getResources().getString(R.string.fallback_wallpaper_title)));
 
                 // Set wallpaper ID if at least N or set a hash code if an earlier version of Android.
-                if (BuildCompat.isAtLeastN()) {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                     mWallpaperPreferences.setHomeWallpaperManagerId(mWallpaperManagerCompat.getWallpaperId(
                             WallpaperManagerCompat.FLAG_SYSTEM));
                 } else {
@@ -277,7 +279,7 @@
             // Use WallpaperManager IDs to check same-ness of image wallpaper on N+ versions of Android
             // only when there is no saved bitmap hash code (which could be leftover from a previous build
             // of the app that did not use wallpaper IDs).
-            if (BuildCompat.isAtLeastN() && savedBitmapHash == 0) {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && savedBitmapHash == 0) {
                 return mWallpaperPreferences.getHomeWallpaperManagerId()
                         == mWallpaperManagerCompat.getWallpaperId(WallpaperManagerCompat.FLAG_SYSTEM);
             }
diff --git a/src/com/android/wallpaper/module/Injector.java b/src/com/android/wallpaper/module/Injector.java
index b85c279..1c40e93 100755
--- a/src/com/android/wallpaper/module/Injector.java
+++ b/src/com/android/wallpaper/module/Injector.java
@@ -88,4 +88,6 @@
     Intent getDeepLinkRedirectIntent(Context context, Uri uri);
 
     String getDownloadableIntentAction();
+
+    CustomizationSections getCustomizationSections();
 }
diff --git a/src/com/android/wallpaper/module/LockWallpaperStatusChecker.java b/src/com/android/wallpaper/module/LockWallpaperStatusChecker.java
index 2ae93b0..754c95a 100755
--- a/src/com/android/wallpaper/module/LockWallpaperStatusChecker.java
+++ b/src/com/android/wallpaper/module/LockWallpaperStatusChecker.java
@@ -16,10 +16,10 @@
 package com.android.wallpaper.module;
 
 import android.content.Context;
+import android.os.Build;
 import android.os.ParcelFileDescriptor;
 import android.util.Log;
 
-import com.android.wallpaper.compat.BuildCompat;
 import com.android.wallpaper.compat.WallpaperManagerCompat;
 
 import java.io.IOException;
@@ -37,7 +37,7 @@
      */
     public static boolean isLockWallpaperSet(Context context) {
         // Lock screen wallpapers are not supported until Android N.
-        if (!BuildCompat.isAtLeastN()) {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
             return false;
         }
 
diff --git a/src/com/android/wallpaper/module/RotationWallpaperUpdateReceiver.java b/src/com/android/wallpaper/module/RotationWallpaperUpdateReceiver.java
index 4fbc20d..c372d25 100644
--- a/src/com/android/wallpaper/module/RotationWallpaperUpdateReceiver.java
+++ b/src/com/android/wallpaper/module/RotationWallpaperUpdateReceiver.java
@@ -20,8 +20,8 @@
 import android.content.Intent;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
+import android.os.Build;
 
-import com.android.wallpaper.compat.BuildCompat;
 import com.android.wallpaper.util.DiskBasedLogger;
 import com.android.wallpaper.util.FileMover;
 
@@ -46,7 +46,7 @@
         if (intent.getAction() == null
                 || !(intent.getAction().equals(Intent.ACTION_MY_PACKAGE_REPLACED)
                 || intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
-                || !BuildCompat.isAtLeastN()) {
+                || Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
             DiskBasedLogger.e(
                     TAG,
                     "Unexpected action or Android version!",
diff --git a/src/com/android/wallpaper/module/WallpaperPickerSections.java b/src/com/android/wallpaper/module/WallpaperPickerSections.java
new file mode 100644
index 0000000..b5e8d17
--- /dev/null
+++ b/src/com/android/wallpaper/module/WallpaperPickerSections.java
@@ -0,0 +1,39 @@
+package com.android.wallpaper.module;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.lifecycle.LifecycleOwner;
+
+import com.android.wallpaper.model.CustomizationSectionController;
+import com.android.wallpaper.model.CustomizationSectionController.CustomizationSectionNavigationController;
+import com.android.wallpaper.model.PermissionRequester;
+import com.android.wallpaper.model.WallpaperColorsViewModel;
+import com.android.wallpaper.model.WallpaperPreviewNavigator;
+import com.android.wallpaper.model.WallpaperSectionController;
+import com.android.wallpaper.model.WorkspaceViewModel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** {@link CustomizationSections} for the wallpaper picker. */
+public final class WallpaperPickerSections implements CustomizationSections {
+
+    @Override
+    public List<CustomizationSectionController<?>> getAllSectionControllers(Activity activity,
+            LifecycleOwner lifecycleOwner, WallpaperColorsViewModel wallpaperColorsViewModel,
+            WorkspaceViewModel workspaceViewModel, PermissionRequester permissionRequester,
+            WallpaperPreviewNavigator wallpaperPreviewNavigator,
+            CustomizationSectionNavigationController sectionNavigationController,
+            @Nullable Bundle savedInstanceState) {
+        List<CustomizationSectionController<?>> sectionControllers = new ArrayList<>();
+
+        sectionControllers.add(new WallpaperSectionController(
+                activity, lifecycleOwner, permissionRequester, wallpaperColorsViewModel,
+                workspaceViewModel, sectionNavigationController, wallpaperPreviewNavigator,
+                savedInstanceState));
+
+        return sectionControllers;
+    }
+}
diff --git a/src/com/android/wallpaper/picker/BasePreviewActivity.java b/src/com/android/wallpaper/picker/BasePreviewActivity.java
index 361a095..2195909 100755
--- a/src/com/android/wallpaper/picker/BasePreviewActivity.java
+++ b/src/com/android/wallpaper/picker/BasePreviewActivity.java
@@ -33,7 +33,7 @@
 public abstract class BasePreviewActivity extends BaseActivity {
     public static final String EXTRA_WALLPAPER_INFO =
             "com.android.wallpaper.picker.wallpaper_info";
-    public static final String EXTRA_VIEW_AS_HODE =
+    public static final String EXTRA_VIEW_AS_HOME =
             "com.android.wallpaper.picker.view_as_home";
     public static final String EXTRA_TESTING_MODE_ENABLED =
             "com.android.wallpaper.picker.testing_mode_enabled";
diff --git a/src/com/android/wallpaper/picker/BottomActionBarFragment.java b/src/com/android/wallpaper/picker/BottomActionBarFragment.java
index 24aa3ea..6802b76 100644
--- a/src/com/android/wallpaper/picker/BottomActionBarFragment.java
+++ b/src/com/android/wallpaper/picker/BottomActionBarFragment.java
@@ -54,10 +54,6 @@
 
     /** Returns {@code true} if the fragment would handle the event. */
     public boolean onBackPressed() {
-        if (mBottomActionBar != null && mBottomActionBar.isVisible()) {
-            mBottomActionBar.hide();
-            return true;
-        }
         return false;
     }
 
diff --git a/src/com/android/wallpaper/picker/CategoryFragment.java b/src/com/android/wallpaper/picker/CategoryFragment.java
index cb3b2d7..4cbde9d 100755
--- a/src/com/android/wallpaper/picker/CategoryFragment.java
+++ b/src/com/android/wallpaper/picker/CategoryFragment.java
@@ -68,7 +68,7 @@
 import com.android.wallpaper.util.WallpaperConnection;
 import com.android.wallpaper.util.WallpaperConnection.WallpaperConnectionListener;
 import com.android.wallpaper.util.WallpaperSurfaceCallback;
-import com.android.wallpaper.widget.LockScreenPreviewer2;
+import com.android.wallpaper.widget.LockScreenPreviewer;
 import com.android.wallpaper.widget.PreviewPager;
 import com.android.wallpaper.widget.WallpaperColorsLoader;
 import com.android.wallpaper.widget.WallpaperPickerRecyclerViewAccessibilityDelegate;
@@ -121,12 +121,10 @@
     private static final String PERMISSION_READ_WALLPAPER_INTERNAL =
             "android.permission.READ_WALLPAPER_INTERNAL";
 
-    private ImageView mHomePreview;
     private SurfaceView mWorkspaceSurface;
     private WorkspaceSurfaceHolderCallback mWorkspaceSurfaceCallback;
     private SurfaceView mWallpaperSurface;
     private WallpaperSurfaceCallback mWallpaperSurfaceCallback;
-    private ImageView mLockscreenPreview;
     private PreviewPager mPreviewPager;
     private List<View> mWallPaperPreviews;
     private WallpaperConnection mWallpaperConnection;
@@ -142,7 +140,7 @@
     // The wallpaper information which is currently shown on the lock preview.
     private WallpaperInfo mLockPreviewWallpaperInfo;
 
-    private LockScreenPreviewer2 mLockScreenPreviewer;
+    private LockScreenPreviewer mLockScreenPreviewer;
     private View mRootContainer;
 
     private final Rect mPreviewLocalRect = new Rect();
@@ -162,24 +160,22 @@
         mWallPaperPreviews = new ArrayList<>();
         CardView homePreviewCard = (CardView) inflater.inflate(
                 R.layout.wallpaper_preview_card, null);
-        mHomePreview = homePreviewCard.findViewById(R.id.wallpaper_preview_image);
         mWorkspaceSurface = homePreviewCard.findViewById(R.id.workspace_surface);
         mWorkspaceSurfaceCallback = new WorkspaceSurfaceHolderCallback(
                 mWorkspaceSurface, getContext());
         mWallpaperSurface = homePreviewCard.findViewById(R.id.wallpaper_surface);
-        mWallpaperSurfaceCallback = new WallpaperSurfaceCallback(getContext(), mHomePreview,
+        mWallpaperSurfaceCallback = new WallpaperSurfaceCallback(getContext(), homePreviewCard,
                 mWallpaperSurface);
         mWallPaperPreviews.add(homePreviewCard);
 
         CardView lockscreenPreviewCard = (CardView) inflater.inflate(
                 R.layout.wallpaper_preview_card, null);
-        mLockscreenPreview = lockscreenPreviewCard.findViewById(R.id.wallpaper_preview_image);
         lockscreenPreviewCard.findViewById(R.id.workspace_surface).setVisibility(View.GONE);
         lockscreenPreviewCard.findViewById(R.id.wallpaper_surface).setVisibility(View.GONE);
         ViewGroup lockPreviewContainer = lockscreenPreviewCard.findViewById(
                 R.id.lock_screen_preview_container);
         lockPreviewContainer.setVisibility(View.VISIBLE);
-        mLockScreenPreviewer = new LockScreenPreviewer2(getLifecycle(), getContext(),
+        mLockScreenPreviewer = new LockScreenPreviewer(getLifecycle(), getContext(),
                 lockPreviewContainer);
         mWallPaperPreviews.add(lockscreenPreviewCard);
 
@@ -245,13 +241,12 @@
                 int minimumHeight = mRootContainer.getHeight() - mPreviewPager.getMeasuredHeight();
                 mBottomSheetBehavior.setPeekHeight(minimumHeight);
                 containerView.setMinimumHeight(minimumHeight);
-                ((CardView) mHomePreview.getParent())
-                        .setRadius(SizeCalculator.getPreviewCornerRadius(
+                homePreviewCard.setRadius(SizeCalculator.getPreviewCornerRadius(
                                 getActivity(), homePreviewCard.getMeasuredWidth()));
-                if (mLockscreenPreview != null) {
-                    ((CardView) mLockscreenPreview.getParent())
+                if (lockscreenPreviewCard != null) {
+                    lockscreenPreviewCard
                             .setRadius(SizeCalculator.getPreviewCornerRadius(
-                                    getActivity(), mLockscreenPreview.getMeasuredWidth()));
+                                    getActivity(), lockPreviewContainer.getMeasuredWidth()));
                 }
             }});
         fragmentContainer.setOnApplyWindowInsetsListener((v, windowInsets) -> {
@@ -456,8 +451,8 @@
 
             mHomePreviewWallpaperInfo = wallpaperInfo;
             mLockPreviewWallpaperInfo = wallpaperInfo;
-            updateThumbnail(mHomePreviewWallpaperInfo, mHomePreview, true);
-            updateThumbnail(mLockPreviewWallpaperInfo, mLockscreenPreview, false);
+            updateThumbnail(mHomePreviewWallpaperInfo,
+                    mWallpaperSurfaceCallback.getHomeImageWallpaper(), true);
             mShowSelectedWallpaper = true;
         });
     }
@@ -621,8 +616,8 @@
                         mHomePreviewWallpaperInfo = homeWallpaper;
                         mLockPreviewWallpaperInfo =
                                 lockWallpaper == null ? homeWallpaper : lockWallpaper;
-                        updateThumbnail(mHomePreviewWallpaperInfo, mHomePreview, true);
-                        updateThumbnail(mLockPreviewWallpaperInfo, mLockscreenPreview, false);
+                        updateThumbnail(mHomePreviewWallpaperInfo,
+                                mWallpaperSurfaceCallback.getHomeImageWallpaper(), true);
                     }
                 });
             }
@@ -639,7 +634,7 @@
         }
 
         if (WallpaperConnection.isPreviewAvailable()) {
-            ImageView previewView = mWallpaperIndex == 0 ? mHomePreview : mLockscreenPreview;
+            ImageView previewView = mWallpaperSurfaceCallback.getHomeImageWallpaper();
             mWallpaperConnection = new WallpaperConnection(
                     getWallpaperIntent(homeWallpaper.getWallpaperComponent()), activity,
                     new WallpaperConnectionListener() {
diff --git a/src/com/android/wallpaper/picker/CustomizationPickerActivity.java b/src/com/android/wallpaper/picker/CustomizationPickerActivity.java
new file mode 100644
index 0000000..16bfffe
--- /dev/null
+++ b/src/com/android/wallpaper/picker/CustomizationPickerActivity.java
@@ -0,0 +1,384 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.android.wallpaper.picker;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.view.WindowCompat;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+
+import com.android.wallpaper.R;
+import com.android.wallpaper.model.Category;
+import com.android.wallpaper.model.PermissionRequester;
+import com.android.wallpaper.model.WallpaperCategory;
+import com.android.wallpaper.model.WallpaperInfo;
+import com.android.wallpaper.model.WallpaperPreviewNavigator;
+import com.android.wallpaper.module.DailyLoggingAlarmScheduler;
+import com.android.wallpaper.module.Injector;
+import com.android.wallpaper.module.InjectorProvider;
+import com.android.wallpaper.module.NetworkStatusNotifier;
+import com.android.wallpaper.module.NetworkStatusNotifier.NetworkStatus;
+import com.android.wallpaper.module.UserEventLogger;
+import com.android.wallpaper.picker.AppbarFragment.AppbarFragmentHost;
+import com.android.wallpaper.picker.CategoryFragment.CategoryFragmentHost;
+import com.android.wallpaper.picker.CategorySelectorFragment.CategorySelectorFragmentHost;
+import com.android.wallpaper.picker.MyPhotosStarter.PermissionChangedListener;
+import com.android.wallpaper.picker.individual.IndividualPickerFragment.IndividualPickerFragmentHost;
+import com.android.wallpaper.util.DeepLinkUtils;
+import com.android.wallpaper.util.LaunchUtils;
+import com.android.wallpaper.widget.BottomActionBar;
+import com.android.wallpaper.widget.BottomActionBar.BottomActionBarHost;
+
+/**
+ *  Main Activity allowing containing view sections for the user to switch between the different
+ *  Fragments providing customization options.
+ */
+public class CustomizationPickerActivity extends FragmentActivity implements AppbarFragmentHost,
+        WallpapersUiContainer, CategoryFragmentHost, BottomActionBarHost,
+        FragmentTransactionChecker, PermissionRequester, CategorySelectorFragmentHost,
+        IndividualPickerFragmentHost, WallpaperPreviewNavigator {
+
+    public static final String WALLPAPER_FLAVOR_EXTRA =
+            "com.android.launcher3.WALLPAPER_FLAVOR";
+    public static final String WALLPAPER_FOCUS = "focus_wallpaper";
+
+    private static final String TAG = "CustomizationPickerActivity";
+    private static final String WALLPAPER_ONLY = "wallpaper_only";
+
+    private WallpaperPickerDelegate mDelegate;
+    private UserEventLogger mUserEventLogger;
+    private NetworkStatusNotifier mNetworkStatusNotifier;
+    private NetworkStatusNotifier.Listener mNetworkStatusListener;
+    @NetworkStatus private int mNetworkStatus;
+
+    private BottomActionBar mBottomActionBar;
+    private boolean mIsSafeToCommitFragmentTransaction;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        Injector injector = InjectorProvider.getInjector();
+        mDelegate = new WallpaperPickerDelegate(this, this, injector);
+        mUserEventLogger = injector.getUserEventLogger(this);
+        mNetworkStatusNotifier = injector.getNetworkStatusNotifier(this);
+        mNetworkStatus = mNetworkStatusNotifier.getNetworkStatus();
+
+        // Restore this Activity's state before restoring contained Fragments state.
+        super.onCreate(savedInstanceState);
+        if (WALLPAPER_ONLY.equals(getIntent().getStringExtra(WALLPAPER_FLAVOR_EXTRA))
+                || !supportCustomizationSections()) {
+            skipToWallpaperPicker();
+            return;
+        }
+
+        setContentView(R.layout.activity_customization_picker);
+        mBottomActionBar = findViewById(R.id.bottom_actionbar);
+
+        // See go/pdr-edge-to-edge-guide.
+        WindowCompat.setDecorFitsSystemWindows(getWindow(), /* decorFitsSystemWindows= */ false);
+
+        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
+        if (fragment == null) {
+            // App launch specific logic: log the "app launch source" event.
+            if (getIntent() != null) {
+                mUserEventLogger.logAppLaunched(getIntent());
+            }
+            injector.getPreferences(this).incrementAppLaunched();
+            DailyLoggingAlarmScheduler.setAlarm(getApplicationContext());
+
+            // Switch to the customization picker fragment.
+            switchFragment(CustomizationPickerFragment.newInstance(getString(R.string.app_name)));
+        }
+
+        // Deep link case
+        Intent intent = getIntent();
+        String deepLinkCollectionId = DeepLinkUtils.getCollectionId(intent);
+        if (!TextUtils.isEmpty(deepLinkCollectionId)) {
+            switchFragmentWithBackStack(new CategorySelectorFragment());
+            switchFragmentWithBackStack(InjectorProvider.getInjector().getIndividualPickerFragment(
+                    deepLinkCollectionId));
+            intent.setData(null);
+        }
+        mDelegate.prefetchCategories();
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        if (mNetworkStatusListener == null) {
+            mNetworkStatusListener = status -> {
+                if (status == mNetworkStatus) {
+                    return;
+                }
+                Log.i(TAG, "Network status changes, refresh wallpaper categories.");
+                mNetworkStatus = status;
+                mDelegate.initialize(/* forceCategoryRefresh= */ true);
+            };
+            // Upon registering a listener, the onNetworkChanged method is immediately called with
+            // the initial network status.
+            mNetworkStatusNotifier.registerListener(mNetworkStatusListener);
+        }
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mIsSafeToCommitFragmentTransaction = true;
+        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);
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mIsSafeToCommitFragmentTransaction = false;
+    }
+
+    @Override
+    protected void onStop() {
+        mUserEventLogger.logStopped();
+        if (mNetworkStatusListener != null) {
+            mNetworkStatusNotifier.unregisterListener(mNetworkStatusListener);
+            mNetworkStatusListener = null;
+        }
+        super.onStop();
+    }
+
+    @Override
+    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();
+        }
+    }
+
+    private void skipToWallpaperPicker() {
+        Intent intent = new Intent(this, TopLevelPickerActivity.class);
+
+        if (getIntent() != null && getIntent().getExtras() != null) {
+            intent.putExtras(getIntent().getExtras());
+        }
+
+        if (DeepLinkUtils.isDeepLink(getIntent())) {
+            intent.setData(getIntent().getData());
+        }
+        startActivity(intent);
+        finish();
+    }
+
+    private boolean supportCustomizationSections() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
+                || "S".equals(Build.VERSION.CODENAME)) {
+            return true;
+        }
+        Log.d(TAG, "Build version < S, customization sections feature is not supported");
+        return false;
+    }
+
+    @Override
+    public void onBackPressed() {
+        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
+        if (fragment instanceof BottomActionBarFragment
+                && ((BottomActionBarFragment) fragment).onBackPressed()) {
+            return;
+        }
+
+        if (getSupportFragmentManager().popBackStackImmediate()) {
+            return;
+        }
+        if (moveTaskToBack(false)) {
+            return;
+        }
+        super.onBackPressed();
+    }
+
+    private void switchFragment(Fragment fragment) {
+        getSupportFragmentManager()
+                .beginTransaction()
+                .replace(R.id.fragment_container, fragment)
+                .commitNow();
+    }
+
+    private void switchFragmentWithBackStack(Fragment fragment) {
+        getSupportFragmentManager()
+                .beginTransaction()
+                .replace(R.id.fragment_container, fragment)
+                .addToBackStack(null)
+                .commit();
+        getSupportFragmentManager().executePendingTransactions();
+    }
+
+
+    @Override
+    public void requestExternalStoragePermission(PermissionChangedListener listener) {
+        mDelegate.requestExternalStoragePermission(listener);
+    }
+
+    @Override
+    public boolean isReadExternalStoragePermissionGranted() {
+        return mDelegate.isReadExternalStoragePermissionGranted();
+    }
+
+    @Override
+    public void showViewOnlyPreview(WallpaperInfo wallpaperInfo, boolean isViewAsHome) {
+        mDelegate.showViewOnlyPreview(wallpaperInfo, isViewAsHome);
+    }
+
+    @Override
+    public void show(String collectionId) {
+        mDelegate.show(collectionId);
+    }
+
+    @Override
+    public void requestCustomPhotoPicker(PermissionChangedListener listener) {
+        mDelegate.requestCustomPhotoPicker(listener);
+    }
+
+    @Override
+    public void show(Category category) {
+        if (!(category instanceof WallpaperCategory)) {
+            show(category.getCollectionId());
+            return;
+        }
+        switchFragmentWithBackStack(InjectorProvider.getInjector().getIndividualPickerFragment(
+                category.getCollectionId()));
+    }
+
+    @Override
+    public boolean isHostToolbarShown() {
+        return false;
+    }
+
+    @Override
+    public void setToolbarTitle(CharSequence title) {
+
+    }
+
+    @Override
+    public void setToolbarMenu(int menuResId) {
+
+    }
+
+    @Override
+    public void removeToolbarMenu() {
+
+    }
+
+    @Override
+    public void moveToPreviousFragment() {
+        getSupportFragmentManager().popBackStack();
+    }
+
+    @Override
+    public void fetchCategories() {
+        mDelegate.initialize(!mDelegate.getCategoryProvider().isCategoriesFetched());
+    }
+
+    @Override
+    public void cleanUp() {
+        mDelegate.cleanUp();
+    }
+
+    @Override
+    public void onWallpapersReady() {
+
+    }
+
+    @Nullable
+    @Override
+    public CategorySelectorFragment getCategorySelectorFragment() {
+        FragmentManager fm = getSupportFragmentManager();
+        Fragment fragment = fm.findFragmentById(R.id.fragment_container);
+        if (fragment instanceof CategorySelectorFragment) {
+            return (CategorySelectorFragment) fragment;
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+    }
+
+    @Override
+    public void doneFetchingCategories() {
+
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+            @NonNull int[] grantResults) {
+        mDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);
+    }
+
+    @Override
+    public MyPhotosStarter getMyPhotosStarter() {
+        return mDelegate;
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (mDelegate.handleActivityResult(requestCode, resultCode, data)) {
+            finishActivityWithResultOk();
+        }
+    }
+
+    private void finishActivityWithResultOk() {
+        overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
+        setResult(Activity.RESULT_OK);
+        finish();
+
+        // Go back to launcher home
+        LaunchUtils.launchHome(this);
+    }
+
+    @Override
+    public BottomActionBar getBottomActionBar() {
+        return mBottomActionBar;
+    }
+
+    @Override
+    public boolean isSafeToCommitFragmentTransaction() {
+        return mIsSafeToCommitFragmentTransaction;
+    }
+
+    @Override
+    public void onUpArrowPressed() {
+        // TODO(b/189166781): Remove interface AppbarFragmentHost#onUpArrowPressed.
+        onBackPressed();
+    }
+
+    @Override
+    public boolean isUpArrowSupported() {
+        return true;
+    }
+}
diff --git a/src/com/android/wallpaper/picker/CustomizationPickerFragment.java b/src/com/android/wallpaper/picker/CustomizationPickerFragment.java
new file mode 100644
index 0000000..75f1b46
--- /dev/null
+++ b/src/com/android/wallpaper/picker/CustomizationPickerFragment.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.android.wallpaper.picker;
+
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.Nullable;
+import androidx.core.widget.NestedScrollView;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.lifecycle.ViewModelProvider;
+
+import com.android.wallpaper.R;
+import com.android.wallpaper.model.CustomizationSectionController;
+import com.android.wallpaper.model.CustomizationSectionController.CustomizationSectionNavigationController;
+import com.android.wallpaper.model.PermissionRequester;
+import com.android.wallpaper.model.WallpaperColorsViewModel;
+import com.android.wallpaper.model.WallpaperPreviewNavigator;
+import com.android.wallpaper.model.WorkspaceViewModel;
+import com.android.wallpaper.module.CustomizationSections;
+import com.android.wallpaper.module.InjectorProvider;
+import com.android.wallpaper.util.ActivityUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/** The Fragment UI for customization sections. */
+public class CustomizationPickerFragment extends AppbarFragment implements
+        CustomizationSectionNavigationController {
+
+    private static final String TAG = "CustomizationPickerFragment";
+    private static final String SCROLL_POSITION_Y = "SCROLL_POSITION_Y";
+
+    // Note that the section views will be displayed by the list ordering.
+    private final List<CustomizationSectionController<?>> mSectionControllers = new ArrayList<>();
+    private NestedScrollView mNestedScrollView;
+
+    /** Initiates CustomizationPickerFragment instance. */
+    public static CustomizationPickerFragment newInstance(CharSequence title) {
+        CustomizationPickerFragment fragment = new CustomizationPickerFragment();
+        fragment.setArguments(AppbarFragment.createArguments(title));
+        return fragment;
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        final View view = inflater.inflate(R.layout.collapsing_toolbar_base_layout,
+                container, /* attachToRoot= */ false);
+        setContentView(view, R.layout.fragment_customization_picker);
+        setUpToolbar(view, ActivityUtils.isLaunchedFromSettingsRelated(getActivity().getIntent()));
+
+        ViewGroup sectionContainer = view.findViewById(R.id.section_container);
+        sectionContainer.setOnApplyWindowInsetsListener((v, windowInsets) -> {
+            v.setPadding(
+                    v.getPaddingLeft(),
+                    v.getPaddingTop(),
+                    v.getPaddingRight(),
+                    windowInsets.getSystemWindowInsetBottom());
+            return windowInsets.consumeSystemWindowInsets();
+        });
+        mNestedScrollView = view.findViewById(R.id.scroll_container);
+
+        initSections(savedInstanceState);
+        mSectionControllers.forEach(controller ->
+                sectionContainer.addView(controller.createView(getContext())));
+        restoreViewState(savedInstanceState);
+        return view;
+    }
+
+    private void setContentView(View view, int layoutResId) {
+        final ViewGroup parent = view.findViewById(R.id.content_frame);
+        if (parent != null) {
+            parent.removeAllViews();
+        }
+        LayoutInflater.from(view.getContext()).inflate(layoutResId, parent);
+    }
+
+    private void restoreViewState(@Nullable Bundle savedInstanceState) {
+        if (savedInstanceState != null) {
+            mNestedScrollView.post(() ->
+                    mNestedScrollView.setScrollY(savedInstanceState.getInt(SCROLL_POSITION_Y)));
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle savedInstanceState) {
+        if (mNestedScrollView != null) {
+            savedInstanceState.putInt(SCROLL_POSITION_Y, mNestedScrollView.getScrollY());
+        }
+        mSectionControllers.forEach(c -> c.onSaveInstanceState(savedInstanceState));
+        super.onSaveInstanceState(savedInstanceState);
+    }
+
+    @Override
+    protected int getToolbarId() {
+        return R.id.action_bar;
+    }
+
+    @Override
+    public boolean onBackPressed() {
+        // TODO(b/191120122) Improve glitchy animation in Settings.
+        if (ActivityUtils.isLaunchedFromSettingsSearch(getActivity().getIntent())) {
+            mSectionControllers.forEach(CustomizationSectionController::onTransitionOut);
+        }
+        return super.onBackPressed();
+    }
+
+    @Override
+    public void onDestroyView() {
+        mSectionControllers.forEach(CustomizationSectionController::release);
+        mSectionControllers.clear();
+        super.onDestroyView();
+    }
+
+    @Override
+    public void navigateTo(Fragment fragment) {
+        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
+        fragmentManager
+                .beginTransaction()
+                .replace(R.id.fragment_container, fragment)
+                .addToBackStack(null)
+                .commit();
+        fragmentManager.executePendingTransactions();
+    }
+
+    private void initSections(@Nullable Bundle savedInstanceState) {
+        // Release and clear if any.
+        mSectionControllers.forEach(CustomizationSectionController::release);
+        mSectionControllers.clear();
+
+        WallpaperColorsViewModel wcViewModel = new ViewModelProvider(getActivity())
+                .get(WallpaperColorsViewModel.class);
+        WorkspaceViewModel workspaceViewModel = new ViewModelProvider(getActivity())
+                .get(WorkspaceViewModel.class);
+
+        CustomizationSections sections = InjectorProvider.getInjector().getCustomizationSections();
+        List<CustomizationSectionController<?>> allSectionControllers =
+                sections.getAllSectionControllers(getActivity(), getViewLifecycleOwner(),
+                        wcViewModel, workspaceViewModel, getPermissionRequester(),
+                        getWallpaperPreviewNavigator(), this, savedInstanceState);
+
+        mSectionControllers.addAll(getAvailableSections(allSectionControllers));
+    }
+
+    private List<CustomizationSectionController<?>> getAvailableSections (
+            List<CustomizationSectionController<?>> controllers) {
+        return controllers.stream()
+                .filter(controller -> {
+                    if(controller.isAvailable(getContext())) {
+                        return true;
+                    } else {
+                        controller.release();
+                        Log.d(TAG, "Section is not available: " + controller);
+                        return false;
+                    }})
+                .collect(Collectors.toList());
+    }
+
+    private PermissionRequester getPermissionRequester() {
+        return (PermissionRequester) getActivity();
+    }
+
+    private WallpaperPreviewNavigator getWallpaperPreviewNavigator() {
+        return (WallpaperPreviewNavigator) getActivity();
+    }
+}
diff --git a/src/com/android/wallpaper/picker/ImagePreviewFragment.java b/src/com/android/wallpaper/picker/ImagePreviewFragment.java
index b0a5a4f..feb3699 100755
--- a/src/com/android/wallpaper/picker/ImagePreviewFragment.java
+++ b/src/com/android/wallpaper/picker/ImagePreviewFragment.java
@@ -69,7 +69,7 @@
 import com.android.wallpaper.util.WallpaperCropUtils;
 import com.android.wallpaper.widget.BottomActionBar;
 import com.android.wallpaper.widget.BottomActionBar.AccessibilityCallback;
-import com.android.wallpaper.widget.LockScreenPreviewer2;
+import com.android.wallpaper.widget.LockScreenPreviewer;
 import com.android.wallpaper.widget.WallpaperInfoView;
 
 import com.bumptech.glide.Glide;
@@ -78,6 +78,8 @@
 import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
 
 import java.util.Locale;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
@@ -106,12 +108,14 @@
     protected SurfaceView mWorkspaceSurface;
     protected WorkspaceSurfaceHolderCallback mWorkspaceSurfaceCallback;
     protected ViewGroup mLockPreviewContainer;
-    protected LockScreenPreviewer2 mLockScreenPreviewer;
+    protected LockScreenPreviewer mLockScreenPreviewer;
+    private Future<Integer> mPlaceholderColorFuture;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mWallpaperAsset = mWallpaper.getAsset(requireContext().getApplicationContext());
+        mPlaceholderColorFuture = mWallpaper.computePlaceholderColor(requireContext());
     }
 
     @Override
@@ -120,11 +124,6 @@
     }
 
     @Override
-    protected int getLoadingIndicatorResId() {
-        return R.id.loading_indicator;
-    }
-
-    @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
         View view = super.onCreateView(inflater, container, savedInstanceState);
@@ -133,10 +132,6 @@
         mScreenSize = ScreenSizeCalculator.getInstance().getScreenSize(
                 activity.getWindowManager().getDefaultDisplay());
 
-        // TODO: Consider moving some part of this to the base class when live preview is ready.
-        view.findViewById(R.id.low_res_image).setVisibility(View.GONE);
-        view.findViewById(R.id.full_res_image).setVisibility(View.GONE);
-        mLoadingProgressBar.hide();
         mContainer = view.findViewById(R.id.container);
         mTouchForwardingLayout = mContainer.findViewById(R.id.touch_forwarding_layout);
         mTouchForwardingLayout.setForwardingEnabled(true);
@@ -152,9 +147,14 @@
         mWorkspaceSurfaceCallback = createWorkspaceSurfaceCallback(mWorkspaceSurface);
         mWallpaperSurface = mContainer.findViewById(R.id.wallpaper_surface);
         mLockPreviewContainer = mContainer.findViewById(R.id.lock_screen_preview_container);
-        mLockScreenPreviewer = new LockScreenPreviewer2(getLifecycle(), getContext(),
+        int placeHolderColor = ResourceUtils.getColorAttr(getContext(),
+                android.R.attr.colorBackground);
+        mWorkspaceSurface.setResizeBackgroundColor(placeHolderColor);
+        mLockScreenPreviewer = new LockScreenPreviewer(getLifecycle(), getContext(),
                 mLockPreviewContainer);
-
+        mLockScreenPreviewer.setDateViewVisibility(!mFullScreenAnimation.isFullScreen());
+        mFullScreenAnimation.setFullScreenStatusListener(
+                isFullScreen -> mLockScreenPreviewer.setDateViewVisibility(!isFullScreen));
         setUpTabs(view.findViewById(R.id.pill_tabs));
 
         view.measure(makeMeasureSpec(mScreenSize.x, EXACTLY),
@@ -168,7 +168,6 @@
 
         // Trim some memory from Glide to make room for the full-size image in this fragment.
         Glide.get(activity).setMemoryCategory(MemoryCategory.LOW);
-        setUpLoadingIndicator();
 
         return view;
     }
@@ -176,27 +175,6 @@
     @Override
     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        mWallpaperAsset.decodeRawDimensions(getActivity(), dimensions -> {
-            // Don't continue loading the wallpaper if the Fragment is detached.
-            if (getActivity() == null) {
-                return;
-            }
-
-            // Return early and show a dialog if dimensions are null (signaling a decoding error).
-            if (dimensions == null) {
-                showLoadWallpaperErrorDialog();
-                return;
-            }
-
-            // To avoid applying the wallpaper when it's not parsed. Now it's parsed, enable the
-            // bottom action bar to allow applying the wallpaper.
-            if (mBottomActionBar != null) {
-                mBottomActionBar.enableActions();
-            }
-
-            mRawWallpaperSize = dimensions;
-            initFullResView();
-        });
     }
 
     protected void onWallpaperColorsChanged(@Nullable WallpaperColors colors) {
@@ -228,14 +206,15 @@
     @Override
     public void onDestroy() {
         super.onDestroy();
-        if (mLoadingProgressBar != null) {
-            mLoadingProgressBar.hide();
-        }
 
         if (mFullResImageView != null) {
             mFullResImageView.recycle();
         }
 
+        if (mLockScreenPreviewer != null) {
+            mLockScreenPreviewer.release();
+        }
+
         mWallpaperSurfaceCallback.cleanUp();
         mWorkspaceSurfaceCallback.cleanUp();
     }
@@ -297,14 +276,6 @@
         // disallow user to pan outside the view we show the wallpaper in.
         mFullResImageView.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_INSIDE);
 
-        // Set a solid black "page bitmap" so MosaicView draws a black background while waiting
-        // for the image to load or a transparent one if a thumbnail already loaded.
-        Bitmap backgroundBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
-        int preColor = ResourceUtils.getColorAttr(getActivity(), android.R.attr.colorSecondary);
-        int color = (mLowResImageView.getDrawable() == null) ? preColor : Color.TRANSPARENT;
-        backgroundBitmap.setPixel(0, 0, color);
-        mFullResImageView.setImage(ImageSource.bitmap(backgroundBitmap));
-
         // Then set a fallback "page bitmap" to cover the whole MosaicView, which is an actual
         // (lower res) version of the image to be displayed.
         Point targetPageBitmapSize = new Point(mRawWallpaperSize);
@@ -315,17 +286,15 @@
                         return;
                     }
 
-                    // Some of these may be null depending on if the Fragment is paused, stopped,
-                    // or destroyed.
-                    if (mLoadingProgressBar != null) {
-                        mLoadingProgressBar.hide();
-                    }
                     // The page bitmap may be null if there was a decoding error, so show an
                     // error dialog.
                     if (pageBitmap == null) {
                         showLoadWallpaperErrorDialog();
                         return;
                     }
+                    // Some of these may be null depending on if the Fragment is paused, stopped,
+                    // or destroyed.
+                    mWallpaperSurface.setBackgroundColor(Color.TRANSPARENT);
                     if (mFullResImageView != null) {
                         // Set page bitmap.
                         mFullResImageView.setImage(ImageSource.bitmap(pageBitmap));
@@ -418,6 +387,7 @@
         mFullResImageView.setAlpha(0f);
         mFullResImageView.animate()
                 .alpha(1f)
+                .setInterpolator(ALPHA_OUT)
                 .setDuration(shortAnimationDuration)
                 .setListener(new AnimatorListenerAdapter() {
                     @Override
@@ -429,18 +399,6 @@
                         }
                     }
                 });
-
-        mLoadingProgressBar.animate()
-                .alpha(0f)
-                .setDuration(shortAnimationDuration)
-                .setListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(Animator animation) {
-                        if (mLoadingProgressBar != null) {
-                            mLoadingProgressBar.hide();
-                        }
-                    }
-                });
     }
 
     /**
@@ -506,9 +464,8 @@
         Resources res = appContext.getResources();
         Point cropSurfaceSize = WallpaperCropUtils.calculateCropSurfaceSize(res, maxCrop, minCrop);
 
-        Rect cropRect = WallpaperCropUtils.calculateCropRect(appContext, hostViewSize,
+        return WallpaperCropUtils.calculateCropRect(appContext, hostViewSize,
                 cropSurfaceSize, mRawWallpaperSize, visibleFileRect, wallpaperZoom);
-        return cropRect;
     }
 
     @Override
@@ -553,7 +510,28 @@
                         R.layout.fullscreen_wallpaper_preview, null);
                 mFullResImageView = wallpaperPreviewContainer.findViewById(R.id.full_res_image);
                 mLowResImageView = wallpaperPreviewContainer.findViewById(R.id.low_res_image);
-                initFullResView();
+                mWallpaperAsset.decodeRawDimensions(getActivity(), dimensions -> {
+                    // Don't continue loading the wallpaper if the Fragment is detached.
+                    if (getActivity() == null) {
+                        return;
+                    }
+
+                    // Return early and show a dialog if dimensions are null (signaling a decoding
+                    // error).
+                    if (dimensions == null) {
+                        showLoadWallpaperErrorDialog();
+                        return;
+                    }
+
+                    // To avoid applying the wallpaper when it's not parsed. Now it's parsed, enable
+                    // the bottom action bar to allow applying the wallpaper.
+                    if (mBottomActionBar != null) {
+                        mBottomActionBar.enableActions();
+                    }
+
+                    mRawWallpaperSize = dimensions;
+                    initFullResView();
+                });
                 // Scale the mWallpaperSurface based on system zoom's scale so that the wallpaper is
                 // rendered in a larger surface than what preview shows, simulating the behavior of
                 // the actual wallpaper surface.
@@ -579,12 +557,23 @@
 
                 // Load a low-res placeholder image if there's a thumbnail available from the asset
                 // that can be shown to the user more quickly than the full-sized image.
-                if (mWallpaperAsset.hasLowResDataSource()) {
-                    Activity activity = requireActivity();
-                    mWallpaperAsset.loadLowResDrawable(activity, mLowResImageView, Color.BLACK,
-                            new WallpaperPreviewBitmapTransformation(
-                                    activity.getApplicationContext(), isRtl()));
+                Activity activity = requireActivity();
+                int placeHolderColor = ResourceUtils.getColorAttr(activity,
+                        android.R.attr.colorBackground);
+                if (mPlaceholderColorFuture.isDone()) {
+                    try {
+                        placeHolderColor = mWallpaper.computePlaceholderColor(context).get();
+                    } catch (InterruptedException | ExecutionException e) {
+                        // Do nothing
+                    }
                 }
+                mWallpaperSurface.setResizeBackgroundColor(placeHolderColor);
+                mWallpaperSurface.setBackgroundColor(placeHolderColor);
+
+                mWallpaperAsset.loadLowResDrawable(activity, mLowResImageView, placeHolderColor,
+                        new WallpaperPreviewBitmapTransformation(
+                                activity.getApplicationContext(), isRtl()));
+
                 wallpaperPreviewContainer.measure(
                         makeMeasureSpec(width, EXACTLY),
                         makeMeasureSpec(height, EXACTLY));
diff --git a/src/com/android/wallpaper/picker/LivePreviewFragment.java b/src/com/android/wallpaper/picker/LivePreviewFragment.java
index a7b45fa..27223cc 100644
--- a/src/com/android/wallpaper/picker/LivePreviewFragment.java
+++ b/src/com/android/wallpaper/picker/LivePreviewFragment.java
@@ -37,9 +37,8 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ServiceInfo;
 import android.graphics.Point;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.RemoteException;
 import android.service.wallpaper.IWallpaperConnection;
@@ -52,7 +51,6 @@
 import android.view.SurfaceView;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.animation.AnimationUtils;
 import android.widget.ImageView;
 
 import androidx.annotation.NonNull;
@@ -66,7 +64,6 @@
 import androidx.slice.widget.SliceView;
 
 import com.android.wallpaper.R;
-import com.android.wallpaper.compat.BuildCompat;
 import com.android.wallpaper.module.WallpaperPersister.SetWallpaperCallback;
 import com.android.wallpaper.util.FullScreenAnimation;
 import com.android.wallpaper.util.ResourceUtils;
@@ -76,11 +73,15 @@
 import com.android.wallpaper.util.WallpaperSurfaceCallback;
 import com.android.wallpaper.widget.BottomActionBar;
 import com.android.wallpaper.widget.BottomActionBar.AccessibilityCallback;
-import com.android.wallpaper.widget.LockScreenPreviewer2;
+import com.android.wallpaper.widget.LockScreenPreviewer;
 import com.android.wallpaper.widget.WallpaperColorsLoader;
 import com.android.wallpaper.widget.WallpaperInfoView;
 
 import java.util.Locale;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 /**
  * Fragment which displays the UI for previewing an individual live wallpaper, its attribution
@@ -102,27 +103,28 @@
     protected WallpaperConnection mWallpaperConnection;
     protected WallpaperInfoView mWallpaperInfoView;
     protected CardView mHomePreviewCard;
-    protected ImageView mHomePreview;
     protected SurfaceView mWorkspaceSurface;
     protected WallpaperSurfaceCallback mWallpaperSurfaceCallback;
     protected WorkspaceSurfaceHolderCallback mWorkspaceSurfaceCallback;
     protected ViewGroup mLockPreviewContainer;
-    protected LockScreenPreviewer2 mLockScreenPreviewer;
+    protected LockScreenPreviewer mLockScreenPreviewer;
 
     private Intent mDeleteIntent;
     private Intent mSettingsIntent;
     private SliceView mSettingsSliceView;
     private LiveData<Slice> mSettingsLiveData;
-    private View mLoadingScrim;
     private Point mScreenSize;
     private ViewGroup mPreviewContainer;
     private TouchForwardingLayout mTouchForwardingLayout;
     private SurfaceView mWallpaperSurface;
+    private WallpaperPreviewBitmapTransformation mPreviewBitmapTransformation;
+    private Future<Integer> mPlaceholderColorFuture;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         android.app.WallpaperInfo info = mWallpaper.getWallpaperComponent();
+        mPlaceholderColorFuture = mWallpaper.computePlaceholderColor(getContext());
 
         String deleteAction = getDeleteAction(info);
         if (!TextUtils.isEmpty(deleteAction)) {
@@ -130,7 +132,8 @@
             mDeleteIntent.setPackage(info.getPackageName());
             mDeleteIntent.putExtra(EXTRA_LIVE_WALLPAPER_INFO, info);
         }
-
+        mPreviewBitmapTransformation = new WallpaperPreviewBitmapTransformation(
+                requireContext().getApplicationContext(), isRtl());
         String settingsActivity = getSettingsActivity(info);
         if (settingsActivity != null) {
             mSettingsIntent = new Intent();
@@ -161,10 +164,6 @@
             Bundle savedInstanceState) {
         View view = super.onCreateView(inflater, container, savedInstanceState);
 
-        mLoadingScrim = view.findViewById(R.id.loading);
-        mLoadingProgressBar.hide();
-        setUpLoadingIndicator();
-
         Activity activity = requireActivity();
         mScreenSize = ScreenSizeCalculator.getInstance().getScreenSize(
                 activity.getWindowManager().getDefaultDisplay());
@@ -189,18 +188,20 @@
         set.applyTo((ConstraintLayout) mPreviewContainer);
 
         mHomePreviewCard = mPreviewContainer.findViewById(R.id.wallpaper_full_preview_card);
-        mHomePreview = mHomePreviewCard.findViewById(R.id.wallpaper_preview_image);
-        mTouchForwardingLayout.setTargetView(mHomePreview);
-        mTouchForwardingLayout.setForwardingEnabled(true);
         mLockPreviewContainer = mPreviewContainer.findViewById(R.id.lock_screen_preview_container);
-        mLockScreenPreviewer = new LockScreenPreviewer2(getLifecycle(), getContext(),
+        mLockScreenPreviewer = new LockScreenPreviewer(getLifecycle(), getContext(),
                 mLockPreviewContainer);
+        mLockScreenPreviewer.setDateViewVisibility(!mFullScreenAnimation.isFullScreen());
+        mFullScreenAnimation.setFullScreenStatusListener(
+                isFullScreen -> mLockScreenPreviewer.setDateViewVisibility(!isFullScreen));
         mWallpaperSurface = mHomePreviewCard.findViewById(R.id.wallpaper_surface);
+        mTouchForwardingLayout.setTargetView(mHomePreviewCard);
+        mTouchForwardingLayout.setForwardingEnabled(true);
         mWorkspaceSurface = mHomePreviewCard.findViewById(R.id.workspace_surface);
 
         mWorkspaceSurfaceCallback = createWorkspaceSurfaceCallback(mWorkspaceSurface);
         mWallpaperSurfaceCallback = new WallpaperSurfaceCallback(getContext(),
-                mHomePreview, mWallpaperSurface);
+                mHomePreviewCard, mWallpaperSurface, mPlaceholderColorFuture, null);
 
         setUpTabs(view.findViewById(R.id.pill_tabs));
 
@@ -242,7 +243,7 @@
     }
 
     private void setupCurrentWallpaperPreview() {
-        mHomePreview.setOnTouchListener((v, ev) -> {
+        mHomePreviewCard.setOnTouchListener((v, ev) -> {
             if (mWallpaperConnection != null && mWallpaperConnection.getEngine() != null) {
                 float scaleRatio =
                         (float) mTouchForwardingLayout.getWidth() / (float) mScreenSize.x;
@@ -283,6 +284,9 @@
             mWallpaperConnection.disconnect();
             mWallpaperConnection = null;
         }
+        if (mLockScreenPreviewer != null) {
+            mLockScreenPreviewer.release();
+        }
         mWorkspaceSurfaceCallback.cleanUp();
         mWorkspaceSurface.getHolder().removeCallback(mWorkspaceSurfaceCallback);
         mWallpaperSurfaceCallback.cleanUp();
@@ -290,30 +294,33 @@
     }
 
     protected void previewLiveWallpaper(ImageView thumbnailView) {
-        thumbnailView.post(() -> {
+        mWallpaperSurface.post(() -> {
             Activity activity = getActivity();
             if (activity == null) {
                 return;
             }
             if (mWallpaperSurfaceCallback.getHomeImageWallpaper() != null) {
+                Integer placeholderColor = null;
+                try {
+                    placeholderColor = mPlaceholderColorFuture.get(50, TimeUnit.MILLISECONDS);
+                } catch (InterruptedException | ExecutionException | TimeoutException e) {
+                    Log.i(TAG, "Couldn't obtain placeholder color", e);
+                }
                 mWallpaper.getThumbAsset(activity.getApplicationContext())
                         .loadLowResDrawable(activity,
                                 mWallpaperSurfaceCallback.getHomeImageWallpaper(),
-                                ResourceUtils.getColorAttr(getActivity(),
-                                        android.R.attr.colorSecondary),
-                                new WallpaperPreviewBitmapTransformation(
-                                        activity.getApplicationContext(), isRtl()));
+                                placeholderColor != null
+                                        ? placeholderColor
+                                        : ResourceUtils.getColorAttr(activity,
+                                                android.R.attr.colorBackground),
+                                mPreviewBitmapTransformation);
             }
-
-            setUpLiveWallpaperPreview(mWallpaper, thumbnailView,
-                    new ColorDrawable(ResourceUtils.getColorAttr(getActivity(),
-                            android.R.attr.colorSecondary)));
+            setUpLiveWallpaperPreview(mWallpaper);
         });
     }
 
     protected void setUpLiveWallpaperPreview(
-            com.android.wallpaper.model.WallpaperInfo homeWallpaper, ImageView previewView,
-            Drawable thumbnail) {
+            com.android.wallpaper.model.WallpaperInfo homeWallpaper) {
         Activity activity = getActivity();
         if (activity == null || activity.isFinishing()) {
             return;
@@ -321,10 +328,6 @@
         if (mWallpaperConnection != null) {
             mWallpaperConnection.disconnect();
         }
-        if (thumbnail != null) {
-            thumbnail.setBounds(previewView.getLeft(), previewView.getTop(), previewView.getRight(),
-                    previewView.getBottom());
-        }
 
         if (WallpaperConnection.isPreviewAvailable()) {
             mWallpaperConnection = new WallpaperConnection(
@@ -340,17 +343,9 @@
                     homeWallpaper.getThumbAsset(activity),
                     mLockScreenPreviewer::setColor);
         }
-        mLoadingScrim.post(() -> mLoadingScrim.animate()
-                .alpha(0f)
-                .setStartDelay(50)
-                .setDuration(250)
-                .setInterpolator(AnimationUtils.loadInterpolator(getContext(),
-                        android.R.interpolator.fast_out_linear_in))
-                .withEndAction(() -> {
-                    if (mWallpaperConnection != null && !mWallpaperConnection.connect()) {
-                        mWallpaperConnection = null;
-                    }
-                }));
+        if (mWallpaperConnection != null && !mWallpaperConnection.connect()) {
+            mWallpaperConnection = null;
+        }
     }
 
     private void renderWorkspaceSurface() {
@@ -424,27 +419,11 @@
         if (activity == null) {
             return;
         }
-
-        mLoadingScrim.post(() -> mLoadingScrim.animate()
-                .alpha(0f)
+        mWallpaperSurfaceCallback.getHomeImageWallpaper().animate()
+                .setStartDelay(250)
                 .setDuration(250)
-                .setStartDelay(200)
-                .setInterpolator(AnimationUtils.loadInterpolator(activity,
-                        android.R.interpolator.fast_out_linear_in))
-                .withEndAction(() -> {
-                    mLoadingScrim.setVisibility(View.GONE);
-                }));
-        final Drawable placeholder = mHomePreview.getDrawable() == null
-                ? new ColorDrawable(ResourceUtils.getColorAttr(getActivity(),
-                android.R.attr.colorSecondary))
-                : mHomePreview.getDrawable();
-        mHomePreview.animate()
-                .setStartDelay(0)
-                .setDuration(150)
-                .setInterpolator(AnimationUtils.loadInterpolator(activity,
-                        android.R.interpolator.fast_out_linear_in))
-                .setUpdateListener(value -> placeholder.setAlpha(
-                        (int) (255 * (1 - value.getAnimatedFraction()))))
+                .alpha(0f)
+                .setInterpolator(ALPHA_OUT)
                 .start();
 
         if (mBottomActionBar != null) {
@@ -470,7 +449,7 @@
 
     @SuppressLint("NewApi") //Already checking with isAtLeastQ
     protected Uri getSettingsSliceUri(android.app.WallpaperInfo info) {
-        if (BuildCompat.isAtLeastQ()) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
             return info.getSettingsSliceUri();
         }
         return null;
@@ -482,11 +461,6 @@
     }
 
     @Override
-    protected int getLoadingIndicatorResId() {
-        return R.id.loading_indicator;
-    }
-
-    @Override
     protected void setCurrentWallpaper(int destination) {
         mWallpaperSetter.setCurrentWallpaper(getActivity(), mWallpaper, null,
                 destination, 0, null, new SetWallpaperCallback() {
@@ -528,7 +502,7 @@
     @Override
     public void onStart() {
         super.onStart();
-        previewLiveWallpaper(mHomePreview);
+        previewLiveWallpaper(null);
     }
 
     @Override
diff --git a/src/com/android/wallpaper/picker/PreviewActivity.java b/src/com/android/wallpaper/picker/PreviewActivity.java
index 3f571c3..31db5e8 100755
--- a/src/com/android/wallpaper/picker/PreviewActivity.java
+++ b/src/com/android/wallpaper/picker/PreviewActivity.java
@@ -57,7 +57,7 @@
         if (fragment == null) {
             Intent intent = getIntent();
             WallpaperInfo wallpaper = intent.getParcelableExtra(EXTRA_WALLPAPER_INFO);
-            boolean viewAsHome = intent.getBooleanExtra(EXTRA_VIEW_AS_HODE, true);
+            boolean viewAsHome = intent.getBooleanExtra(EXTRA_VIEW_AS_HOME, true);
             boolean testingModeEnabled = intent.getBooleanExtra(EXTRA_TESTING_MODE_ENABLED, false);
             fragment = InjectorProvider.getInjector().getPreviewFragment(
                     /* context */ this,
diff --git a/src/com/android/wallpaper/picker/PreviewFragment.java b/src/com/android/wallpaper/picker/PreviewFragment.java
index 72d656f..1249a61 100755
--- a/src/com/android/wallpaper/picker/PreviewFragment.java
+++ b/src/com/android/wallpaper/picker/PreviewFragment.java
@@ -21,26 +21,23 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
-import android.content.res.ColorStateList;
 import android.content.res.Resources.NotFoundException;
-import android.content.res.TypedArray;
 import android.os.Bundle;
 import android.util.Log;
-import android.view.ContextThemeWrapper;
 import android.view.LayoutInflater;
 import android.view.SurfaceView;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.animation.Interpolator;
+import android.view.animation.PathInterpolator;
 import android.widget.Button;
 import android.widget.Toast;
 
 import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.CallSuper;
-import androidx.annotation.IdRes;
 import androidx.annotation.IntDef;
 import androidx.annotation.LayoutRes;
 import androidx.annotation.Nullable;
-import androidx.core.widget.ContentLoadingProgressBar;
 import androidx.fragment.app.FragmentActivity;
 
 import com.android.wallpaper.R;
@@ -68,6 +65,8 @@
         SetWallpaperDialogFragment.Listener, SetWallpaperErrorDialogFragment.Listener,
         LoadWallpaperErrorDialogFragment.Listener {
 
+    public static final Interpolator ALPHA_OUT = new PathInterpolator(0f, 0f, 0.8f, 1f);
+
     /**
      * User can view wallpaper and attributions in full screen, but "Set wallpaper" button is
      * hidden.
@@ -136,7 +135,6 @@
     protected WallpaperSetter mWallpaperSetter;
     protected UserEventLogger mUserEventLogger;
     protected BottomActionBar mBottomActionBar;
-    protected ContentLoadingProgressBar mLoadingProgressBar;
 
     protected Intent mExploreIntent;
     protected CharSequence mActionLabel;
@@ -152,13 +150,6 @@
     protected View mRootView;
     protected FullScreenAnimation mFullScreenAnimation;
 
-    protected static int getAttrColor(Context context, int attr) {
-        TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
-        int colorAccent = ta.getColor(0, 0);
-        ta.recycle();
-        return colorAccent;
-    }
-
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -180,7 +171,6 @@
         if (attributions.size() > 0 && attributions.get(0) != null) {
             activity.setTitle(attributions.get(0));
         }
-        setRetainInstance(true);
     }
 
     @Override
@@ -190,9 +180,6 @@
         View view = inflater.inflate(getLayoutResId(), container, false);
         setUpToolbar(view);
 
-        mLoadingProgressBar = view.findViewById(getLoadingIndicatorResId());
-        mLoadingProgressBar.show();
-
         mRootView = view;
         mFullScreenAnimation = new FullScreenAnimation(view);
 
@@ -273,13 +260,6 @@
     @LayoutRes
     protected abstract int getLayoutResId();
 
-    @IdRes
-    protected abstract int getLoadingIndicatorResId();
-
-    protected int getDeviceDefaultTheme() {
-        return android.R.style.Theme_DeviceDefault;
-    }
-
     protected WorkspaceSurfaceHolderCallback createWorkspaceSurfaceCallback(
             SurfaceView workspaceSurface) {
         return new WorkspaceSurfaceHolderCallback(workspaceSurface, getContext());
@@ -325,16 +305,6 @@
         );
     }
 
-    /**
-     * Configure loading indicator with a MaterialProgressDrawable.
-     */
-    protected void setUpLoadingIndicator() {
-        mLoadingProgressBar.setProgressTintList(ColorStateList.valueOf(getAttrColor(
-                new ContextThemeWrapper(requireContext(), getDeviceDefaultTheme()),
-                android.R.attr.colorAccent)));
-        mLoadingProgressBar.show();
-    }
-
     protected abstract boolean isLoaded();
 
     @Override
diff --git a/src/com/android/wallpaper/picker/SectionView.java b/src/com/android/wallpaper/picker/SectionView.java
index 31a2014..46b4a68 100644
--- a/src/com/android/wallpaper/picker/SectionView.java
+++ b/src/com/android/wallpaper/picker/SectionView.java
@@ -21,10 +21,7 @@
 
 import androidx.annotation.Nullable;
 
-/**
- * The SectionView base for views hosting in the {@link
- * com.android.customization.picker.hub.HubFragment}.
- */
+/** The SectionView base for views hosting in the {@link CustomizationPickerFragment}. */
 public abstract class SectionView extends LinearLayout {
 
     /** The callback for the section view updates. */
diff --git a/src/com/android/wallpaper/picker/StandalonePreviewActivity.java b/src/com/android/wallpaper/picker/StandalonePreviewActivity.java
index 43c92e2..8651df6 100755
--- a/src/com/android/wallpaper/picker/StandalonePreviewActivity.java
+++ b/src/com/android/wallpaper/picker/StandalonePreviewActivity.java
@@ -22,11 +22,9 @@
 import android.os.Binder;
 import android.os.Bundle;
 import android.util.Log;
-import android.view.Window;
 import android.view.WindowManager;
 
 import androidx.annotation.NonNull;
-import androidx.core.view.WindowCompat;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 
diff --git a/src/com/android/wallpaper/picker/TopLevelPickerActivity.java b/src/com/android/wallpaper/picker/TopLevelPickerActivity.java
index f55a2f3..191a39f 100755
--- a/src/com/android/wallpaper/picker/TopLevelPickerActivity.java
+++ b/src/com/android/wallpaper/picker/TopLevelPickerActivity.java
@@ -48,7 +48,6 @@
 
 import com.android.wallpaper.R;
 import com.android.wallpaper.asset.Asset;
-import com.android.wallpaper.compat.BuildCompat;
 import com.android.wallpaper.compat.ButtonDrawableSetterCompat;
 import com.android.wallpaper.config.Flags;
 import com.android.wallpaper.model.Category;
@@ -275,7 +274,7 @@
                     view.getPaddingRight(), view.getPaddingBottom());
             // Consume only the top inset (status bar), to let other content in the Activity consume
             // the nav bar (ie, by using "fitSystemWindows")
-            if (BuildCompat.isAtLeastQ()) {
+            if (VERSION.SDK_INT >= VERSION_CODES.Q) {
                 WindowInsets.Builder builder = new WindowInsets.Builder(windowInsets);
                 builder.setSystemWindowInsets(Insets.of(windowInsets.getSystemWindowInsetLeft(),
                         0, windowInsets.getStableInsetRight(),
@@ -425,7 +424,7 @@
         // tab for a category not yet repopulated.
         mLastSelectedCategoryTabIndex = -1;
 
-        mDelegate.populateCategories(true /* forceCategoryRefresh */);
+        mDelegate.populateCategories(/* forceRefresh= */ true);
 
         setDesktopLoading(false);
         setCurrentWallpapersExpanded(false);
diff --git a/src/com/android/wallpaper/picker/ViewOnlyPreviewActivity.java b/src/com/android/wallpaper/picker/ViewOnlyPreviewActivity.java
index 5e7e01d..67bb943 100755
--- a/src/com/android/wallpaper/picker/ViewOnlyPreviewActivity.java
+++ b/src/com/android/wallpaper/picker/ViewOnlyPreviewActivity.java
@@ -44,7 +44,7 @@
 
     protected static Intent newIntent(Context context, WallpaperInfo wallpaper,
             boolean isVewAsHome) {
-        return newIntent(context, wallpaper).putExtra(EXTRA_VIEW_AS_HODE, isVewAsHome);
+        return newIntent(context, wallpaper).putExtra(EXTRA_VIEW_AS_HOME, isVewAsHome);
     }
 
     @Override
@@ -61,7 +61,7 @@
             Intent intent = getIntent();
             WallpaperInfo wallpaper = intent.getParcelableExtra(EXTRA_WALLPAPER_INFO);
             boolean testingModeEnabled = intent.getBooleanExtra(EXTRA_TESTING_MODE_ENABLED, false);
-            boolean viewAsHome = intent.getBooleanExtra(EXTRA_VIEW_AS_HODE, true);
+            boolean viewAsHome = intent.getBooleanExtra(EXTRA_VIEW_AS_HOME, true);
             fragment = InjectorProvider.getInjector().getPreviewFragment(
                     /* context */ this,
                     wallpaper,
diff --git a/src/com/android/wallpaper/picker/WallpaperPickerDelegate.java b/src/com/android/wallpaper/picker/WallpaperPickerDelegate.java
index 273f0a6..adb9e54 100644
--- a/src/com/android/wallpaper/picker/WallpaperPickerDelegate.java
+++ b/src/com/android/wallpaper/picker/WallpaperPickerDelegate.java
@@ -117,7 +117,7 @@
         if (mDownloadableIntentAction != null) {
             mDownloadableWallpaperStatusListener = (packageName, status) -> {
                 if (status != PackageStatusNotifier.PackageStatus.REMOVED) {
-                    populateCategories(true);
+                    populateCategories(/* forceRefresh= */ true);
                 }
             };
             mPackageStatusNotifier.addListener(
@@ -206,7 +206,7 @@
             }
         } else {
             // CHANGED package, let's reload all categories as we could have more or fewer now
-            populateCategories(true);
+            populateCategories(/* forceRefresh= */ true);
         }
     }
 
@@ -263,7 +263,7 @@
      * they're cached when loading later.
      */
     public void prefetchCategories() {
-        mCategoryProvider.resetIfNeeded();
+        boolean forceRefresh = mCategoryProvider.resetIfNeeded();
         mCategoryProvider.fetchCategories(new CategoryReceiver() {
             @Override
             public void onCategoryReceived(Category category) {
@@ -274,7 +274,7 @@
             public void doneFetchingCategories() {
                 // Do nothing
             }
-        }, false);
+        }, forceRefresh);
     }
 
     /**
@@ -487,13 +487,14 @@
                 imageWallpaper.showPreview(mActivity, getPreviewIntentFactory(),
                         PREVIEW_WALLPAPER_REQUEST_CODE);
                 return false;
+            case PREVIEW_LIVE_WALLPAPER_REQUEST_CODE:
+                mWallpaperPersister.onLiveWallpaperSet();
+                populateCategories(/* forceRefresh= */ true);
+                // Fall through.
             case VIEW_ONLY_PREVIEW_WALLPAPER_REQUEST_CODE:
                 // Fall through.
             case PREVIEW_WALLPAPER_REQUEST_CODE:
-                // Fall through.
-            case PREVIEW_LIVE_WALLPAPER_REQUEST_CODE:
                 // User previewed and selected a wallpaper, so finish this activity.
-                mWallpaperPersister.onLiveWallpaperSet();
                 return true;
             default:
                 return false;
diff --git a/src/com/android/wallpaper/picker/WallpaperPreviewBitmapTransformation.java b/src/com/android/wallpaper/picker/WallpaperPreviewBitmapTransformation.java
index b8c51b9..fa5dea5 100755
--- a/src/com/android/wallpaper/picker/WallpaperPreviewBitmapTransformation.java
+++ b/src/com/android/wallpaper/picker/WallpaperPreviewBitmapTransformation.java
@@ -18,6 +18,7 @@
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Point;
+import android.graphics.Rect;
 import android.view.WindowManager;
 
 import androidx.annotation.NonNull;
@@ -56,16 +57,25 @@
         float scale = WallpaperCropUtils.calculateMinZoom(
                 new Point(toTransform.getWidth(), toTransform.getHeight()),
                 mScreenSize);
+        Rect originalSize = new Rect(0, 0, toTransform.getWidth(),
+                toTransform.getHeight());
         Point scaledThumbnailSize = new Point(Math.round(toTransform.getWidth() * scale),
                 Math.round(toTransform.getHeight() * scale));
         Point scaledThumbnailToScreenSize = WallpaperCropUtils.calculateCenterPosition(
                 scaledThumbnailSize, mScreenSize, false /* alignStart */, mIsRtl);
 
-        Bitmap cropped = Bitmap.createBitmap(toTransform,
-                Math.round(scaledThumbnailToScreenSize.x / scale),
-                Math.round(scaledThumbnailToScreenSize.y / scale),
-                Math.round(mScreenSize.x / scale),
-                Math.round(mScreenSize.y / scale));
+        int x = Math.round(scaledThumbnailToScreenSize.x / scale);
+        int y = Math.round(scaledThumbnailToScreenSize.y / scale);
+        Rect cropSize = new Rect(x, y, x + Math.round(mScreenSize.x / scale),
+                y + Math.round(mScreenSize.y / scale));
+        Bitmap cropped;
+        if (!originalSize.contains(cropSize)) {
+            // If crop size is not smaller than original, then use the original bitmap
+            cropped = toTransform;
+        } else {
+            cropped = Bitmap.createBitmap(toTransform, cropSize.left, cropSize.top,
+                    cropSize.width(), cropSize.height());
+        }
 
         return BitmapProcessor.blur(mContext, cropped, cropped.getWidth(), cropped.getHeight());
     }
diff --git a/src/com/android/wallpaper/picker/WallpaperSectionView.java b/src/com/android/wallpaper/picker/WallpaperSectionView.java
index 1d20e08..ad97570 100644
--- a/src/com/android/wallpaper/picker/WallpaperSectionView.java
+++ b/src/com/android/wallpaper/picker/WallpaperSectionView.java
@@ -22,14 +22,11 @@
 
 import androidx.cardview.widget.CardView;
 
-import com.android.wallpaper.picker.SectionView;
 import com.android.wallpaper.R;
 import com.android.wallpaper.util.ScreenSizeCalculator;
 import com.android.wallpaper.util.SizeCalculator;
 
-/**
- * The wallpaper section view in the Customization Hub fragment.
- */
+/** The wallpaper section view in the customization picker fragment. */
 public final class WallpaperSectionView extends SectionView {
 
     private CardView mHomePreviewCard;
diff --git a/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java b/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java
index 989d7a5..97c2eaa 100755
--- a/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java
+++ b/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java
@@ -120,6 +120,8 @@
     static final int SPECIAL_FIXED_TILE_ADAPTER_POSITION = 0;
     static final String ARG_CATEGORY_COLLECTION_ID = "category_collection_id";
 
+    protected static final int MAX_CAPACITY_IN_FEWER_COLUMN_LAYOUT = 8;
+
     private static final String TAG = "IndividualPickerFrgmnt";
     private static final int UNUSED_REQUEST_CODE = 1;
     private static final String TAG_START_ROTATION_DIALOG = "start_rotation_dialog";
@@ -129,7 +131,6 @@
     private static final String TAG_SET_WALLPAPER_ERROR_DIALOG_FRAGMENT =
             "individual_set_wallpaper_error_dialog";
     private static final String KEY_NIGHT_MODE = "IndividualPickerFragment.NIGHT_MODE";
-    private static final int MAX_CAPACITY_IN_FEWER_COLUMN_LAYOUT = 8;
 
     /**
      * An interface for updating the thumbnail with the specific wallpaper.
@@ -581,10 +582,23 @@
         if (mCategory == null) {
             return;
         }
-        // Skip if the adapter was already created
-        if (mAdapter != null) {
+
+        // Wallpaper count could change, so we may need to change the layout(2 or 3 columns layout)
+        GridLayoutManager gridLayoutManager = (GridLayoutManager) mImageGrid.getLayoutManager();
+        boolean needUpdateLayout =
+                gridLayoutManager != null && gridLayoutManager.getSpanCount() != getNumColumns();
+
+        // Skip if the adapter was already created and don't need to change the layout
+        if (mAdapter != null && !needUpdateLayout) {
             return;
         }
+
+        // Clear the old decoration
+        int decorationCount = mImageGrid.getItemDecorationCount();
+        for (int i = 0; i < decorationCount; i++) {
+            mImageGrid.removeItemDecorationAt(i);
+        }
+
         mImageGrid.addItemDecoration(new GridPaddingDecoration(getGridItemPaddingHorizontal(),
                 getGridItemPaddingBottom()));
         int edgePadding = getEdgePadding();
@@ -1417,6 +1431,7 @@
             int wallpaperIndex = (shouldShowRotationTile() || mCategory.supportsCustomPhotos())
                     ? position - 1 : position;
             WallpaperInfo wallpaper = mWallpapers.get(wallpaperIndex);
+            wallpaper.computePlaceholderColor(holder.itemView.getContext());
             ((IndividualHolder) holder).bindWallpaper(wallpaper);
             boolean isWallpaperApplied = mAppliedWallpaperIds.contains(wallpaper.getWallpaperId());
 
diff --git a/src/com/android/wallpaper/util/ActivityUtils.java b/src/com/android/wallpaper/util/ActivityUtils.java
index c4d49f8..eb2adb2 100755
--- a/src/com/android/wallpaper/util/ActivityUtils.java
+++ b/src/com/android/wallpaper/util/ActivityUtils.java
@@ -83,7 +83,7 @@
      *
      * @param intent activity intent.
      */
-    private static boolean isLaunchedFromSettingsSearch(Intent intent) {
+    public static boolean isLaunchedFromSettingsSearch(Intent intent) {
         return (intent != null && intent.hasExtra(LAUNCH_SETTINGS_SEARCH));
     }
 
diff --git a/src/com/android/wallpaper/util/DiskBasedLogger.java b/src/com/android/wallpaper/util/DiskBasedLogger.java
index 5111376..350aaff 100755
--- a/src/com/android/wallpaper/util/DiskBasedLogger.java
+++ b/src/com/android/wallpaper/util/DiskBasedLogger.java
@@ -24,7 +24,8 @@
 import android.os.Process;
 import android.util.Log;
 
-import com.android.wallpaper.compat.BuildCompat;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
 
 import java.io.BufferedReader;
 import java.io.Closeable;
@@ -41,9 +42,6 @@
 import java.util.Locale;
 import java.util.concurrent.TimeUnit;
 
-import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
-
 /**
  * Logs messages to logcat and for debuggable build types ("eng" or "userdebug") also mirrors logs
  * to a disk-based log buffer.
@@ -72,7 +70,8 @@
             if (sLoggerThread != null && sLoggerThread.isAlive()) {
 
                 // HandlerThread#quitSafely was added in JB-MR2, so prefer to use that instead of #quit.
-                boolean isQuitSuccessful = BuildCompat.isAtLeastJBMR2()
+                boolean isQuitSuccessful =
+                        Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2
                         ? sLoggerThread.quitSafely()
                         : sLoggerThread.quit();
 
diff --git a/src/com/android/wallpaper/util/FullScreenAnimation.java b/src/com/android/wallpaper/util/FullScreenAnimation.java
index 3ce12ef..b3dd69e 100644
--- a/src/com/android/wallpaper/util/FullScreenAnimation.java
+++ b/src/com/android/wallpaper/util/FullScreenAnimation.java
@@ -16,6 +16,7 @@
 
 package com.android.wallpaper.util;
 
+import android.animation.Animator;
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.animation.ValueAnimator;
@@ -63,6 +64,7 @@
     private float mPillButtonsTranslation;
     private int mStatusBarHeight;
     private int mNavigationBarHeight;
+    private FullScreenStatusListener mFullScreenStatusListener;
 
     private static final float HIDE_ICONS_TOP_RATIO = 0.2f;
 
@@ -86,6 +88,12 @@
     FullScreenTextColor mFullScreenTextColor = FullScreenTextColor.DEFAULT;
     private int mCurrentTextColor;
 
+    /** Callback for full screen status. */
+    public interface FullScreenStatusListener {
+        /** Gets called at animation end when full screen status gets changed. */
+        void onFullScreenStatusChange(boolean isFullScreen);
+    }
+
     /**
      * Constructor.
      *
@@ -151,6 +159,11 @@
         mView.findViewById(viewId).setLayoutParams(layoutParams);
     }
 
+    /** Sets a {@param listener} to listen full screen state changes. */
+    public void setFullScreenStatusListener(FullScreenStatusListener listener) {
+        mFullScreenStatusListener = listener;
+    }
+
     /**
      * Informs the {@code FullScreenAnimation} object about the window insets of the current
      * window.
@@ -427,6 +440,23 @@
                 animationRounding,
                 animationHide
         );
+        animatorSet.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationCancel(Animator animator) {}
+
+            @Override
+            public void onAnimationEnd(Animator animator) {
+                if (mFullScreenStatusListener != null) {
+                    mFullScreenStatusListener.onFullScreenStatusChange(toFullScreen);
+                }
+            }
+
+            @Override
+            public void onAnimationRepeat(Animator animator) {}
+
+            @Override
+            public void onAnimationStart(Animator animator) {}
+        });
         animatorSet.start();
 
         animateColor(toFullScreen);
diff --git a/src/com/android/wallpaper/util/LaunchUtils.java b/src/com/android/wallpaper/util/LaunchUtils.java
new file mode 100644
index 0000000..1f4dd6e
--- /dev/null
+++ b/src/com/android/wallpaper/util/LaunchUtils.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.android.wallpaper.util;
+
+import android.content.Context;
+import android.content.Intent;
+
+/** Util class for launching activity. */
+public class LaunchUtils {
+
+    /** Goes to Launcher's Home. */
+    public static void launchHome(Context context) {
+        Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
+        launcherIntent.addCategory(Intent.CATEGORY_HOME);
+        launcherIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+        context.startActivity(launcherIntent);
+    }
+}
diff --git a/src/com/android/wallpaper/util/WallpaperSurfaceCallback.java b/src/com/android/wallpaper/util/WallpaperSurfaceCallback.java
index 9855b21..e043051 100644
--- a/src/com/android/wallpaper/util/WallpaperSurfaceCallback.java
+++ b/src/com/android/wallpaper/util/WallpaperSurfaceCallback.java
@@ -33,6 +33,9 @@
 import com.android.wallpaper.module.InjectorProvider;
 import com.android.wallpaper.module.PackageStatusNotifier;
 
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
 /**
  * Default implementation of {@link SurfaceHolder.Callback} to render a static wallpaper when the
  * surface has been created.
@@ -59,13 +62,16 @@
     private final SurfaceView mWallpaperSurface;
     @Nullable
     private final SurfaceListener mListener;
+    @Nullable
+    private final Future<Integer> mPlaceholderColor;
     private boolean mSurfaceCreated;
 
     private PackageStatusNotifier.Listener mAppStatusListener;
     private PackageStatusNotifier mPackageStatusNotifier;
 
     public WallpaperSurfaceCallback(Context context, View containerView,
-            SurfaceView wallpaperSurface, @Nullable SurfaceListener listener) {
+            SurfaceView wallpaperSurface, @Nullable Future<Integer> placeholderColor,
+            @Nullable SurfaceListener listener) {
         mContext = context.getApplicationContext();
         mContainerView = containerView;
         mWallpaperSurface = wallpaperSurface;
@@ -82,6 +88,12 @@
         };
         mPackageStatusNotifier.addListener(mAppStatusListener,
                 WallpaperService.SERVICE_INTERFACE);
+        mPlaceholderColor = placeholderColor;
+    }
+
+    public WallpaperSurfaceCallback(Context context, View containerView,
+            SurfaceView wallpaperSurface, @Nullable SurfaceListener listener) {
+        this(context, containerView, wallpaperSurface, null, listener);
     }
 
     public WallpaperSurfaceCallback(Context context, View containerView,
@@ -143,8 +155,16 @@
 
     private void setupSurfaceWallpaper(boolean forceClean) {
         mHomeImageWallpaper = new ImageView(mContext);
-        mHomeImageWallpaper.setBackgroundColor(
-                ResourceUtils.getColorAttr(mContext, android.R.attr.colorPrimary));
+        Integer placeholder = null;
+        if (mPlaceholderColor != null && mPlaceholderColor.isDone()) {
+            try {
+                placeholder = mPlaceholderColor.get();
+            } catch (InterruptedException | ExecutionException e) {
+                // Ignore
+            }
+        }
+        mHomeImageWallpaper.setBackgroundColor((placeholder != null) ? placeholder
+                : ResourceUtils.getColorAttr(mContext, android.R.attr.colorSecondary));
         mHomeImageWallpaper.measure(makeMeasureSpec(mContainerView.getWidth(), EXACTLY),
                 makeMeasureSpec(mContainerView.getHeight(), EXACTLY));
         mHomeImageWallpaper.layout(0, 0, mContainerView.getWidth(),
diff --git a/src/com/android/wallpaper/widget/BottomActionBar.java b/src/com/android/wallpaper/widget/BottomActionBar.java
index 76415bb..fda4c8b 100644
--- a/src/com/android/wallpaper/widget/BottomActionBar.java
+++ b/src/com/android/wallpaper/widget/BottomActionBar.java
@@ -95,7 +95,7 @@
     // TODO(b/154299462): Separate downloadable related actions from WallpaperPicker.
     /** The action items in the bottom action bar. */
     public enum BottomAction {
-        ROTATION, DELETE, INFORMATION, EDIT, CUSTOMIZE, DOWNLOAD, PROGRESS, APPLY
+        ROTATION, DELETE, INFORMATION, EDIT, CUSTOMIZE, DOWNLOAD, PROGRESS, APPLY, APPLY_TEXT
     }
 
     private final Map<BottomAction, View> mActionMap = new EnumMap<>(BottomAction.class);
@@ -123,6 +123,7 @@
         mActionMap.put(BottomAction.DOWNLOAD, findViewById(R.id.action_download));
         mActionMap.put(BottomAction.PROGRESS, findViewById(R.id.action_progress));
         mActionMap.put(BottomAction.APPLY, findViewById(R.id.action_apply));
+        mActionMap.put(BottomAction.APPLY_TEXT, findViewById(R.id.action_apply_text_button));
 
         mBottomSheetView = findViewById(R.id.action_bottom_sheet);
         SizeCalculator.adjustBackgroundCornerRadius(mBottomSheetView);
diff --git a/src/com/android/wallpaper/widget/LockScreenPreviewer.java b/src/com/android/wallpaper/widget/LockScreenPreviewer.java
index 17ca99a..282a899 100644
--- a/src/com/android/wallpaper/widget/LockScreenPreviewer.java
+++ b/src/com/android/wallpaper/widget/LockScreenPreviewer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,7 +20,6 @@
 
 import android.app.WallpaperColors;
 import android.content.Context;
-import android.content.res.ColorStateList;
 import android.content.res.Configuration;
 import android.graphics.Point;
 import android.text.format.DateFormat;
@@ -29,7 +28,6 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowManager;
-import android.widget.ImageView;
 import android.widget.TextView;
 
 import androidx.annotation.MainThread;
@@ -46,24 +44,27 @@
 import java.util.Calendar;
 import java.util.Locale;
 import java.util.TimeZone;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
-/** A class to load the custom lockscreen view to the preview screen. */
+/** A class to load the new custom lockscreen view to the preview screen. */
 public class LockScreenPreviewer implements LifecycleObserver {
 
     private static final String DEFAULT_DATE_PATTERN = "EEE, MMM d";
+    private static final ExecutorService sExecutorService = Executors.newSingleThreadExecutor();
 
-    private Context mContext;
-    private String mDatePattern;
+    private final Lifecycle mLifecycle;
+    private final Context mContext;
+    private final String mDatePattern;
+    private final TextView mLockTime;
+    private final TextView mLockDate;
     private TimeTicker mTicker;
-    private ImageView mLockIcon;
-    private TextView mLockTime;
-    private TextView mLockDate;
 
     public LockScreenPreviewer(Lifecycle lifecycle, Context context, ViewGroup previewContainer) {
+        mLifecycle = lifecycle;
         mContext = context;
         View contentView = LayoutInflater.from(mContext).inflate(
                 R.layout.lock_screen_preview, /* root= */ null);
-        mLockIcon = contentView.findViewById(R.id.lock_icon);
         mLockTime = contentView.findViewById(R.id.lock_time);
         mLockDate = contentView.findViewById(R.id.lock_date);
         mDatePattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), DEFAULT_DATE_PATTERN);
@@ -72,13 +73,13 @@
         Point screenSize = ScreenSizeCalculator.getInstance().getScreenSize(defaultDisplay);
 
         Configuration config = mContext.getResources().getConfiguration();
-        final boolean directionLTR = config.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR;
+        boolean directionLTR = config.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR;
 
         View rootView = previewContainer.getRootView();
         rootView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
             @Override
             public void onLayoutChange(View view, int left, int top, int right, int bottom,
-                                       int oldLeft, int oldTop, int oldRight, int oldBottom) {
+                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
                 int cardHeight = previewContainer.getMeasuredHeight();
                 int cardWidth = previewContainer.getMeasuredWidth();
 
@@ -105,22 +106,27 @@
                 rootView.removeOnLayoutChangeListener(this);
             }
         });
-        lifecycle.addObserver(this);
+        mLifecycle.addObserver(this);
     }
 
     @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
     @MainThread
     public void onResume() {
-        mTicker = TimeTicker.registerNewReceiver(mContext, this::updateDateTime);
+        if (mTicker == null) {
+            sExecutorService.submit(() -> {
+                if (mContext != null && mLifecycle.getCurrentState().isAtLeast(
+                        Lifecycle.State.RESUMED)) {
+                    mTicker = TimeTicker.registerNewReceiver(mContext, this::updateDateTime);
+                }
+            });
+        }
         updateDateTime();
     }
 
     @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
     @MainThread
     public void onPause() {
-        if (mContext != null) {
-            mContext.unregisterReceiver(mTicker);
-        }
+        unregisterReceiver();
     }
 
     /**
@@ -133,31 +139,45 @@
         boolean useLightTextColor = colors == null
                 || (colors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) == 0;
         int color = mContext.getColor(useLightTextColor
-                ? android.R.color.white : android.R.color.black);
+                ? R.color.text_color_light : R.color.text_color_dark);
         int textShadowColor = mContext.getColor(useLightTextColor
-                ? android.R.color.tertiary_text_dark
-                : android.R.color.transparent);
-        mLockIcon.setImageTintList(ColorStateList.valueOf(color));
+                ? R.color.smartspace_preview_shadow_color_dark
+                : R.color.smartspace_preview_shadow_color_transparent);
         mLockDate.setTextColor(color);
-        mLockTime.setTextColor(color);
-
         mLockDate.setShadowLayer(
                 mContext.getResources().getDimension(
                         R.dimen.smartspace_preview_key_ambient_shadow_blur),
                 /* dx = */ 0,
                 /* dy = */ 0,
                 textShadowColor);
-        mLockTime.setShadowLayer(
-                mContext.getResources().getDimension(
-                        R.dimen.smartspace_preview_key_ambient_shadow_blur),
-                /* dx = */ 0,
-                /* dy = */ 0,
-                textShadowColor);
     }
 
+    /** Sets visibility for date view. */
+    public void setDateViewVisibility(boolean visible) {
+        mLockDate.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
+    }
+
+    public void release() {
+        mLifecycle.removeObserver(this);
+        unregisterReceiver();
+    }
+
+    private void unregisterReceiver() {
+        if (mTicker == null) {
+            return;
+        }
+
+        sExecutorService.submit(() -> {
+            if (mContext != null && mTicker != null) {
+                mContext.unregisterReceiver(mTicker);
+                mTicker = null;
+            }
+        });
+    }
+
     private void updateDateTime() {
         Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
-        mLockTime.setText(TimeUtils.getFormattedTime(mContext, calendar));
         mLockDate.setText(DateFormat.format(mDatePattern, calendar));
+        mLockTime.setText(TimeUtils.getDoubleLineFormattedTime(mLockTime.getContext(), calendar));
     }
 }
diff --git a/src/com/android/wallpaper/widget/LockScreenPreviewer2.java b/src/com/android/wallpaper/widget/LockScreenPreviewer2.java
deleted file mode 100644
index 360b6fd..0000000
--- a/src/com/android/wallpaper/widget/LockScreenPreviewer2.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.android.wallpaper.widget;
-
-import static android.view.View.MeasureSpec.EXACTLY;
-import static android.view.View.MeasureSpec.makeMeasureSpec;
-
-import android.app.WallpaperColors;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Point;
-import android.text.SpannableString;
-import android.text.format.DateFormat;
-import android.text.style.ReplacementSpan;
-import android.view.Display;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.widget.TextView;
-
-import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.OnLifecycleEvent;
-
-import com.android.wallpaper.R;
-import com.android.wallpaper.util.ScreenSizeCalculator;
-import com.android.wallpaper.util.TimeUtils;
-import com.android.wallpaper.util.TimeUtils.TimeTicker;
-
-import java.util.Calendar;
-import java.util.Locale;
-import java.util.TimeZone;
-import java.util.concurrent.Executors;
-
-/** A class to load the new custom lockscreen view to the preview screen. */
-public class LockScreenPreviewer2 implements LifecycleObserver {
-
-    private static final String DEFAULT_DATE_PATTERN = "EEE, MMM d";
-
-    private final Lifecycle mLifecycle;
-    private final Context mContext;
-    private final String mDatePattern;
-    private final TextView mLockTime;
-    private final TextView mLockDate;
-    private TimeTicker mTicker;
-
-    public LockScreenPreviewer2(Lifecycle lifecycle, Context context, ViewGroup previewContainer) {
-        mLifecycle = lifecycle;
-        mContext = context;
-        View contentView = LayoutInflater.from(mContext).inflate(
-                R.layout.lock_screen_preview2, /* root= */ null);
-        mLockTime = contentView.findViewById(R.id.lock_time);
-        mLockDate = contentView.findViewById(R.id.lock_date);
-        mDatePattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), DEFAULT_DATE_PATTERN);
-
-        Display defaultDisplay = mContext.getSystemService(WindowManager.class).getDefaultDisplay();
-        Point screenSize = ScreenSizeCalculator.getInstance().getScreenSize(defaultDisplay);
-
-        Configuration config = mContext.getResources().getConfiguration();
-        boolean directionLTR = config.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR;
-
-        View rootView = previewContainer.getRootView();
-        rootView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
-            @Override
-            public void onLayoutChange(View view, int left, int top, int right, int bottom,
-                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
-                int cardHeight = previewContainer.getMeasuredHeight();
-                int cardWidth = previewContainer.getMeasuredWidth();
-
-                // Relayout the content view to match full screen size.
-                contentView.measure(
-                        makeMeasureSpec(screenSize.x, EXACTLY),
-                        makeMeasureSpec(screenSize.y, EXACTLY));
-                contentView.layout(0, 0, screenSize.x, screenSize.y);
-
-                // Scale the content view from full screen size to the container(card) size.
-                float scale = cardHeight > 0 ? (float) cardHeight / screenSize.y
-                        : (float) cardWidth / screenSize.x;
-                contentView.setScaleX(scale);
-                contentView.setScaleY(scale);
-                // The pivot point is centered by default, set to (0, 0).
-                contentView.setPivotX(directionLTR ? 0f : contentView.getMeasuredWidth());
-                contentView.setPivotY(0f);
-
-                previewContainer.removeAllViews();
-                previewContainer.addView(
-                        contentView,
-                        contentView.getMeasuredWidth(),
-                        contentView.getMeasuredHeight());
-                rootView.removeOnLayoutChangeListener(this);
-            }
-        });
-        mLifecycle.addObserver(this);
-    }
-
-    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
-    @MainThread
-    public void onResume() {
-        if (mContext != null) {
-            Executors.newSingleThreadExecutor().submit(() -> {
-                if (mContext != null && mLifecycle.getCurrentState().isAtLeast(
-                        Lifecycle.State.RESUMED)) {
-                    mTicker = TimeTicker.registerNewReceiver(mContext, this::updateDateTime);
-                }
-            });
-
-            updateDateTime();
-        }
-    }
-
-    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
-    @MainThread
-    public void onPause() {
-        if (mContext != null && mTicker != null) {
-            mContext.unregisterReceiver(mTicker);
-        }
-    }
-
-    /**
-     * Sets the content's color based on the wallpaper's {@link WallpaperColors}.
-     *
-     * @param colors the {@link WallpaperColors} of the wallpaper which the lock screen overlay
-     *               will attach to, or {@code null} to use light color as default
-     */
-    public void setColor(@Nullable WallpaperColors colors) {
-        boolean useLightTextColor = colors == null
-                || (colors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) == 0;
-        int color = mContext.getColor(useLightTextColor
-                ? R.color.text_color_light : R.color.text_color_dark);
-        int textShadowColor = mContext.getColor(useLightTextColor
-                ? R.color.smartspace_preview_shadow_color_dark
-                : R.color.smartspace_preview_shadow_color_transparent);
-        mLockDate.setTextColor(color);
-        mLockDate.setShadowLayer(
-                mContext.getResources().getDimension(
-                        R.dimen.smartspace_preview_key_ambient_shadow_blur),
-                /* dx = */ 0,
-                /* dy = */ 0,
-                textShadowColor);
-    }
-
-    public void release() {
-        mLifecycle.removeObserver(this);
-    }
-
-    private void updateDateTime() {
-        Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
-        mLockDate.setText(DateFormat.format(mDatePattern, calendar));
-        SpannableString timeWithMonospaceText = new SpannableString(
-                TimeUtils.getDoubleLineFormattedTime(mContext, calendar));
-        timeWithMonospaceText.setSpan(new MonospaceSpan(), /* start= */ 0,
-                timeWithMonospaceText.length(), /* flag= */ 0);
-        mLockTime.setText(timeWithMonospaceText);
-    }
-
-    /** Make text monospace without overriding the text fontFamily. */
-    private static class MonospaceSpan extends ReplacementSpan {
-
-        @Override
-        public int getSize(@NonNull Paint paint, @NonNull CharSequence text, int start, int end,
-                @Nullable Paint.FontMetricsInt fontMetricsInt) {
-            if (fontMetricsInt != null) {
-                paint.getFontMetricsInt(fontMetricsInt);
-            }
-            int count = end - start;
-            if (text.charAt(start) == '\n') {
-                count--;
-            }
-            if (text.charAt(end - 1) == '\n') {
-                count--;
-            }
-            return getMaxCharWidth(paint, text, /* start= */ 0, text.length())
-                    * Math.max(count, 0);
-        }
-
-        @Override
-        public void draw(@NonNull Canvas canvas, @NonNull CharSequence text, int start, int end,
-                float x, int top, int y, int bottom, @NonNull Paint paint) {
-            float[] widths = new float[end - start];
-            paint.getTextWidths(text, start, end, widths);
-            int maxCharWidth = getMaxCharWidth(paint, text, /* start= */ 0, text.length());
-            for (int i = 0; i < end - start; ++i) {
-                canvas.drawText(text, start + i, start + i + 1,
-                        x + maxCharWidth * i + (maxCharWidth - widths[i]) / 2, y, paint);
-            }
-        }
-
-        private int getMaxCharWidth(Paint paint, CharSequence text, int start, int end) {
-            float[] widths = new float[end - start];
-            paint.getTextWidths(text, start, end, widths);
-            float max = 0;
-            for (float w : widths) {
-                if (max < w) {
-                    max = w;
-                }
-            }
-            return Math.round(max);
-        }
-    }
-}
diff --git a/src/com/android/wallpaper/widget/PreviewPager.java b/src/com/android/wallpaper/widget/PreviewPager.java
index 6b0d07d..231392c 100644
--- a/src/com/android/wallpaper/widget/PreviewPager.java
+++ b/src/com/android/wallpaper/widget/PreviewPager.java
@@ -107,10 +107,6 @@
                 // offset in (origin, rightBoundary)
                 alpha = (float) Math.abs(offset - origin) / Math.abs(rightBoundary - origin);
             }
-            View cover = view.findViewById(R.id.fade_cover);
-            if (cover != null) {
-                view.findViewById(R.id.fade_cover).setAlpha(alpha);
-            }
         }, LAYER_TYPE_NONE);
         mViewPager.setPageMargin(res.getDimensionPixelOffset(R.dimen.preview_page_gap));
         mViewPager.setClipToPadding(false);
diff --git a/tests/src/com/android/wallpaper/testing/TestCategoryProvider.java b/tests/src/com/android/wallpaper/testing/TestCategoryProvider.java
index d43a8a0..d6fa979 100644
--- a/tests/src/com/android/wallpaper/testing/TestCategoryProvider.java
+++ b/tests/src/com/android/wallpaper/testing/TestCategoryProvider.java
@@ -93,8 +93,9 @@
     }
 
     @Override
-    public void resetIfNeeded() {
+    public boolean resetIfNeeded() {
         mCategories.clear();
+        return true;
     }
 
     @Override
diff --git a/tests/src/com/android/wallpaper/testing/TestCurrentWallpaperInfoFactory.java b/tests/src/com/android/wallpaper/testing/TestCurrentWallpaperInfoFactory.java
index 3e8c665..63cdf29 100644
--- a/tests/src/com/android/wallpaper/testing/TestCurrentWallpaperInfoFactory.java
+++ b/tests/src/com/android/wallpaper/testing/TestCurrentWallpaperInfoFactory.java
@@ -16,8 +16,8 @@
 package com.android.wallpaper.testing;
 
 import android.content.Context;
+import android.os.Build;
 
-import com.android.wallpaper.compat.BuildCompat;
 import com.android.wallpaper.model.WallpaperInfo;
 import com.android.wallpaper.module.CurrentWallpaperInfoFactory;
 import com.android.wallpaper.module.InjectorProvider;
@@ -48,7 +48,7 @@
                     homeWallpaperMetadata.getCollectionId());
 
             WallpaperInfo lockWallpaper = null;
-            if (lockWallpaperMetadata != null && BuildCompat.isAtLeastN()) {
+            if (lockWallpaperMetadata != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                 lockWallpaper = createTestWallpaperInfo(
                         lockWallpaperMetadata.getAttributions(),
                         lockWallpaperMetadata.getActionUrl(),
diff --git a/tests/src/com/android/wallpaper/testing/TestInjector.java b/tests/src/com/android/wallpaper/testing/TestInjector.java
index cdc9a59..fd9f68a 100644
--- a/tests/src/com/android/wallpaper/testing/TestInjector.java
+++ b/tests/src/com/android/wallpaper/testing/TestInjector.java
@@ -31,6 +31,7 @@
 import com.android.wallpaper.module.DrawableLayerResolver;
 import com.android.wallpaper.module.ExploreIntentChecker;
 import com.android.wallpaper.module.FormFactorChecker;
+import com.android.wallpaper.module.CustomizationSections;
 import com.android.wallpaper.module.Injector;
 import com.android.wallpaper.module.LiveWallpaperInfoFactory;
 import com.android.wallpaper.module.LoggingOptInStatusProvider;
@@ -254,4 +255,9 @@
         }
         return mPerformanceMonitor;
     }
+
+    @Override
+    public CustomizationSections getCustomizationSections() {
+        return null;
+    }
 }
diff --git a/tests/src/com/android/wallpaper/testing/TestWallpaperInfo.java b/tests/src/com/android/wallpaper/testing/TestWallpaperInfo.java
index c0ccee6..c4328c5 100644
--- a/tests/src/com/android/wallpaper/testing/TestWallpaperInfo.java
+++ b/tests/src/com/android/wallpaper/testing/TestWallpaperInfo.java
@@ -73,6 +73,7 @@
     }
 
     private TestWallpaperInfo(Parcel in) {
+        super(in);
         mPixelColor = in.readInt();
         mAttributions = in.createStringArrayList();
         mActionUrl = in.readString();
@@ -200,6 +201,7 @@
 
     @Override
     public void writeToParcel(Parcel parcel, int i) {
+        super.writeToParcel(parcel, i);
         parcel.writeInt(mPixelColor);
         parcel.writeStringList(mAttributions);
         parcel.writeString(mActionUrl);
diff --git a/tests/src/com/android/wallpaper/testing/TestWallpaperRefresher.java b/tests/src/com/android/wallpaper/testing/TestWallpaperRefresher.java
index 97961fe..558c3cb 100644
--- a/tests/src/com/android/wallpaper/testing/TestWallpaperRefresher.java
+++ b/tests/src/com/android/wallpaper/testing/TestWallpaperRefresher.java
@@ -18,8 +18,8 @@
 
 import android.app.WallpaperManager;
 import android.content.Context;
+import android.os.Build;
 
-import com.android.wallpaper.compat.BuildCompat;
 import com.android.wallpaper.model.WallpaperMetadata;
 import com.android.wallpaper.module.InjectorProvider;
 import com.android.wallpaper.module.WallpaperPreferences;
@@ -45,7 +45,7 @@
 
         WallpaperPreferences prefs = InjectorProvider.getInjector().getPreferences(mAppContext);
 
-        if (BuildCompat.isAtLeastN() && prefs.getLockWallpaperId() > 0) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && prefs.getLockWallpaperId() > 0) {
             listener.onRefreshed(
                     new WallpaperMetadata(
                             prefs.getHomeWallpaperAttributions(),