Merge Android 12

Bug: 202323961
Merged-In: I5cd8ed57adca2a94eafd78a73a82e3c495846a29
Change-Id: I76f7416e711e5164143de4f0573b6b682d9f4161
diff --git a/Android.bp b/Android.bp
new file mode 100644
index 0000000..7e55969
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,131 @@
+//
+// 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.
+//
+
+//
+// Build rule for WallpaperPicker2 dependencies lib.
+//
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+android_library {
+    name: "wallpaper-common-deps",
+
+    static_libs: [
+        "androidx.appcompat_appcompat",
+        "androidx.cardview_cardview",
+        "androidx-constraintlayout_constraintlayout",
+        "androidx.exifinterface_exifinterface",
+        "androidx.lifecycle_lifecycle-runtime-ktx",
+        "androidx.recyclerview_recyclerview",
+        "androidx.slice_slice-view",
+        "androidx.viewpager2_viewpager2",
+        "com.google.android.material_material",
+        "glide-prebuilt",
+        "kotlinx-coroutines-android",
+        "kotlinx-coroutines-core",
+        "libbackup",
+        "SettingsLibCollapsingToolbarBaseActivity",
+        "subsampling-scale-image-view",
+        "SystemUISharedLib",
+        "volley",
+    ],
+
+    resource_dirs: ["res"],
+
+    optimize: {
+        enabled: false,
+    },
+
+    kotlincflags: ["-Xjvm-default=enable"],
+
+    sdk_version: "current",
+
+    manifest: "AndroidManifest-empty.xml",
+
+    visibility: [
+        ":__subpackages__",
+        "//packages/apps/ThemePicker",
+        "//vendor:__subpackages__",
+    ],
+}
+
+filegroup {
+    name: "WallpaperPicker2_srcs",
+    srcs: [
+        "src/**/*.java",
+        "src/**/*.kt",
+    ],
+}
+
+genrule {
+   name: "WallpaperPicker2_res",
+   tools: ["soong_zip"],
+   srcs: [
+       "res/**/*"
+   ],
+   out: ["wallpaperpicker2_res.zip"],
+   cmd: "INPUTS=($(in)) && "
+       + "RES_DIR=$$(dirname $$(dirname $${INPUTS[0]})) && "
+       + "$(location soong_zip) -o $(out) -C $$RES_DIR -D $$RES_DIR"
+}
+
+filegroup {
+    name: "WallpaperPicker2_Manifest",
+    srcs: [
+        "AndroidManifest.xml",
+    ],
+}
+
+java_defaults {
+    name: "WallpaperPicker2_defaults",
+
+    static_libs: [
+        "wallpaper-common-deps",
+    ],
+
+    srcs: [
+        ":WallpaperPicker2_srcs",
+        "src_override/**/*.java",
+        "src_override/**/*.kt",
+    ],
+    resource_zips: [":WallpaperPicker2_res"],
+
+    certificate: "",
+
+    optimize: {
+        enabled: false,
+    },
+
+    kotlincflags: ["-Xjvm-default=enable"],
+    privileged: true,
+    system_ext_specific: true,
+
+    use_embedded_native_libs: true,
+
+    manifest: "AndroidManifest.xml",
+}
+
+//
+// Build app code.
+//
+android_app {
+    name: "WallpaperPicker2",
+
+    defaults: ["WallpaperPicker2_defaults"],
+
+    platform_apis: true,
+}
diff --git a/Android.mk b/Android.mk
deleted file mode 100755
index c39c91b..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,148 +0,0 @@
-#
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_MODULE := wallpaper2-glide-target
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := ../../../prebuilts/maven_repo/bumptech/com/github/bumptech/glide/glide/SNAPSHOT/glide-SNAPSHOT$(COMMON_JAVA_PACKAGE_SUFFIX)
-LOCAL_UNINSTALLABLE_MODULE := true
-LOCAL_JETIFIER_ENABLED := true
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_MODULE := wallpaper2-disklrucache-target
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := ../../../prebuilts/maven_repo/bumptech/com/github/bumptech/glide/disklrucache/SNAPSHOT/disklrucache-SNAPSHOT$(COMMON_JAVA_PACKAGE_SUFFIX)
-LOCAL_UNINSTALLABLE_MODULE := true
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_MODULE := wallpaper2-gifdecoder-target
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := ../../../prebuilts/maven_repo/bumptech/com/github/bumptech/glide/gifdecoder/SNAPSHOT/gifdecoder-SNAPSHOT$(COMMON_JAVA_PACKAGE_SUFFIX)
-LOCAL_UNINSTALLABLE_MODULE := true
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_AAPT2_ONLY := true
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_STATIC_ANDROID_LIBRARIES := android-support-exifinterface
-LOCAL_SRC_FILES := $(call all-java-files-under, ../../../external/subsampling-scale-image-view/library/src)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/../../../external/subsampling-scale-image-view/library/src/main/res
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_SDK_VERSION := current
-LOCAL_MIN_SDK_VERSION := 26
-LOCAL_MODULE := wallpaper-subsampling-scale-image-view
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_MANIFEST_FILE := ../../../external/subsampling-scale-image-view/library/src/main/AndroidManifest.xml
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-
-#
-# Build rule for WallpaperPicker2 dependencies lib.
-#
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_STATIC_ANDROID_LIBRARIES := \
-    androidx.appcompat_appcompat \
-    androidx.cardview_cardview \
-    androidx.recyclerview_recyclerview \
-    androidx.slice_slice-view \
-    androidx-constraintlayout_constraintlayout \
-    com.google.android.material_material \
-    androidx.exifinterface_exifinterface \
-    wallpaper-subsampling-scale-image-view
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
-    wallpaper2-glide-target \
-    wallpaper2-disklrucache-target \
-    wallpaper2-gifdecoder-target \
-    volley \
-    libbackup \
-    SystemUISharedLib
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_PROGUARD_ENABLED := disabled
-LOCAL_MANIFEST_FILE := AndroidManifest.xml
-
-ifneq (,$(wildcard frameworks/base))
-    LOCAL_PRIVATE_PLATFORM_APIS := true
-else
-    LOCAL_SDK_VERSION := current
-endif
-LOCAL_MODULE := WallpaperPicker2CommonDepsLib
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_PRIVILEGED_MODULE := true
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-#
-# Build app code.
-#
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_USE_AAPT2 := true
-
-LOCAL_STATIC_ANDROID_LIBRARIES := WallpaperPicker2CommonDepsLib
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src) \
-    $(call all-java-files-under, src_override)
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_PROGUARD_FLAG_FILES := proguard.flags
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_PRIVILEGED_MODULE := true
-
-ifneq (,$(wildcard frameworks/base))
-  LOCAL_PRIVATE_PLATFORM_APIS := true
-else
-  LOCAL_SDK_VERSION := system_current
-  LOCAL_STATIC_JAVA_LIBRARIES += libSharedWallpaper
-endif
-
-LOCAL_PACKAGE_NAME := WallpaperPicker2
-LOCAL_JETIFIER_ENABLED := true
-
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-include $(BUILD_PACKAGE)
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/AndroidManifest-empty.xml b/AndroidManifest-empty.xml
new file mode 100644
index 0000000..519f01d
--- /dev/null
+++ b/AndroidManifest-empty.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Empty manifest used as base for merging our library dependencies -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="com.android.wallpaper">
+        <application
+            tools:replace="android:appComponentFactory"
+            android:appComponentFactory="androidx.core.app.CoreComponentFactory"/>
+</manifest>
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f0f7024..72d721d 100755
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1,60 +1,83 @@
 <?xml version="1.0" encoding="utf-8"?>
+
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    package="com.android.wallpaper">
+     xmlns:tools="http://schemas.android.com/tools"
+     package="com.android.wallpaper">
 
   <!-- Custom permission to enforce that only this app can notify the running live wallpaper that
-       the rotating wallpaper image data changed. -->
-  <permission
-      android:name="com.android.wallpaper.NOTIFY_ROTATING_WALLPAPER_CHANGED"
-      android:protectionLevel="signature"/>
+             the rotating wallpaper image data changed. -->
+  <permission android:name="com.android.wallpaper.NOTIFY_ROTATING_WALLPAPER_CHANGED"
+       android:protectionLevel="signature"/>
 
-  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-  <uses-permission android:name="android.permission.INTERNET" />
-  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-  <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
-  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
-  <uses-permission android:name="android.permission.SET_WALLPAPER" />
-  <uses-permission android:name="android.permission.WAKE_LOCK" />
-  <uses-permission
-      android:name="com.android.wallpaper.NOTIFY_ROTATING_WALLPAPER_CHANGED" />
+  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+  <uses-permission android:name="android.permission.INTERNET"/>
+  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+  <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
+  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
+  <uses-permission android:name="android.permission.SET_WALLPAPER"/>
+  <uses-permission android:name="android.permission.WAKE_LOCK"/>
+  <uses-permission android:name="com.android.wallpaper.NOTIFY_ROTATING_WALLPAPER_CHANGED"/>
 
   <queries>
-    <intent>
-      <action android:name="com.android.launcher3.action.PARTNER_CUSTOMIZATION"/>
-    </intent>
-    <intent>
-      <action android:name="android.service.wallpaper.WallpaperService"/>
-    </intent>
+      <!-- Specific intents Wallpaper picker query for -->
+      <!-- Intent filter with action SET_WALLPAPER -->
+      <intent>
+          <action android:name="android.intent.action.SET_WALLPAPER" />
+      </intent>
+      <!-- Intent filter with action GET_CONTENT and data's mimeType as "image/*" -->
+      <intent>
+          <action android:name="android.intent.action.GET_CONTENT" />
+          <data android:mimeType="image/*" />
+      </intent>
+      <!-- Intent filter with action VIEW -->
+      <intent>
+          <action android:name="android.intent.action.VIEW" />
+      </intent>
+      <!-- Intent filter with action WallpaperService (live wallpaper interface) -->
+      <intent>
+          <action android:name="android.service.wallpaper.WallpaperService" />
+      </intent>
+      <!-- Intent filter with action used to discover partner -->
+      <intent>
+          <action android:name="com.android.launcher3.action.PARTNER_CUSTOMIZATION" />
+      </intent>
   </queries>
 
   <application
-      tools:replace="android:icon,android:name"
+      tools:replace="android:icon,android:name,android:appComponentFactory"
+      android:appComponentFactory="androidx.core.app.CoreComponentFactory"
       android:allowBackup="true"
       android:icon="@mipmap/product_logo_wallpapers_launcher_color_48"
       android:label="@string/app_name"
       android:name="com.android.wallpaper.picker.WallpapersApplication"
       android:requiredForAllUsers="true"
       android:restoreAnyVersion="true"
-      android:supportsRtl="true"
-      android:extractNativeLibs="false">
+      android:supportsRtl="true">
 
-    <meta-data
-        android:name="com.android.wallpaper.asset.WallpaperGlideModule"
-        android:value="GlideModule" />
+    <meta-data android:name="com.android.wallpaper.asset.WallpaperGlideModule"
+         android:value="GlideModule"/>
 
     <activity android:name="com.android.wallpaper.picker.TopLevelPickerActivity"
+         android:label="@string/app_name"
+         android:theme="@style/WallpaperTheme.NoBackground"
+         android:resizeableActivity="false"
+         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:resizeableActivity="false">
-      <intent-filter>
-        <action android:name="android.intent.action.SET_WALLPAPER"/>
-        <category android:name="android.intent.category.DEFAULT"/>
-      </intent-filter>
+        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"
-        android:theme="@style/WallpaperTheme.NoBackground">
+        android:theme="@style/WallpaperTheme.NoBackground"
+        android:exported="true">
         <intent-filter android:autoVerify="true">
             <action android:name="android.intent.action.VIEW" />
             <category android:name="android.intent.category.DEFAULT" />
@@ -68,8 +91,9 @@
 
     <activity-alias
         android:name="com.android.wallpaper.picker.CategoryPickerActivity"
-        android:targetActivity="com.android.wallpaper.picker.TopLevelPickerActivity"
-        android:label="@string/app_name">
+        android:targetActivity="com.android.wallpaper.picker.CustomizationPickerActivity"
+        android:label="@string/app_name"
+        android:exported="true">
       <intent-filter>
         <action android:name="android.intent.action.MAIN"/>
       </intent-filter>
@@ -83,38 +107,25 @@
     </activity>
 
     <activity android:name="com.android.wallpaper.picker.PreviewActivity"
-        android:resizeableActivity="false"
-        android:theme="@style/WallpaperTheme.Preview">
+         android:resizeableActivity="false"
+         android:theme="@style/WallpaperTheme.Preview">
     </activity>
 
     <activity android:name="com.android.wallpaper.picker.StandalonePreviewActivity"
-        android:resizeableActivity="false"
-        android:theme="@style/WallpaperTheme.Preview">
+         android:resizeableActivity="false"
+         android:theme="@style/WallpaperTheme.Preview"
+         android:exported="true">
       <intent-filter>
-        <action android:name="android.service.wallpaper.CROP_AND_SET_WALLPAPER" />
-        <category android:name="android.intent.category.DEFAULT" />
-        <data android:mimeType="image/*" />
+        <action android:name="android.service.wallpaper.CROP_AND_SET_WALLPAPER"/>
+        <category android:name="android.intent.category.DEFAULT"/>
+        <data android:mimeType="image/*"/>
       </intent-filter>
     </activity>
 
     <activity android:name="com.android.wallpaper.picker.ViewOnlyPreviewActivity"
-        android:resizeableActivity="false"
-        android:theme="@style/WallpaperTheme.Preview">
+         android:resizeableActivity="false"
+         android:theme="@style/WallpaperTheme.Preview">
     </activity>
-
-    <service
-        android:name="com.android.wallpaper.module.NoBackupImageWallpaper"
-        android:enabled="@bool/enable_no_backup_image_wallpaper"
-        android:label="@string/no_backup_image_wallpaper_label"
-        android:permission="android.permission.BIND_WALLPAPER"
-        android:process=":live_wallpaper">
-      <intent-filter>
-        <action android:name="android.service.wallpaper.WallpaperService" />
-      </intent-filter>
-      <meta-data
-          android:name="android.service.wallpaper"
-          android:resource="@xml/no_backup_image_wallpaper" />
-    </service>
   </application>
 
 </manifest>
diff --git a/res/color/indicator_arrow_color.xml b/res/color-night/separated_tabs_indicator_color.xml
similarity index 71%
copy from res/color/indicator_arrow_color.xml
copy to res/color-night/separated_tabs_indicator_color.xml
index 198d002..7313a16 100644
--- a/res/color/indicator_arrow_color.xml
+++ b/res/color-night/separated_tabs_indicator_color.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-     Copyright (C) 2019 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.
@@ -14,11 +14,7 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:state_enabled="false"
-        android:color="@color/preview_pager_arrow_disabled" />
-    <item
-        android:state_enabled="true"
-        android:color="?android:attr/colorAccent" />
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+    <item android:color="?androidprv:attr/colorAccentSecondary" />
 </selector>
diff --git a/res/color/indicator_arrow_color.xml b/res/color-night/separated_tabs_text_color.xml
similarity index 70%
copy from res/color/indicator_arrow_color.xml
copy to res/color-night/separated_tabs_text_color.xml
index 198d002..8fb9488 100644
--- a/res/color/indicator_arrow_color.xml
+++ b/res/color-night/separated_tabs_text_color.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-     Copyright (C) 2019 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.
@@ -15,10 +15,7 @@
      limitations under the License.
 -->
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:state_enabled="false"
-        android:color="@color/preview_pager_arrow_disabled" />
-    <item
-        android:state_enabled="true"
-        android:color="?android:attr/colorAccent" />
-</selector>
+    <item android:state_selected="true" android:color="?android:textColorPrimaryInverse"/>
+    <item android:state_enabled="false" android:color="?android:textColorTertiary"/>
+    <item android:color="?android:textColorSecondary"/>
+</selector>
\ No newline at end of file
diff --git a/res/color/bottom_action_button_color_tint.xml b/res/color/bottom_action_button_color_tint.xml
index 26f91df..8381c2f 100644
--- a/res/color/bottom_action_button_color_tint.xml
+++ b/res/color/bottom_action_button_color_tint.xml
@@ -14,11 +14,12 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
     <item
         android:state_selected="false"
-        android:color="@color/bottom_bar_icon_unchecked_color" />
+        android:color="?android:textColorTertiary" />
     <item
         android:state_selected="true"
-        android:color="?android:colorAccent" />
+        android:color="?androidprv:attr/textColorOnAccent" />
 </selector>
\ No newline at end of file
diff --git a/res/color/indicator_arrow_color.xml b/res/color/lock_screen_scrim_color.xml
similarity index 73%
rename from res/color/indicator_arrow_color.xml
rename to res/color/lock_screen_scrim_color.xml
index 198d002..73ee8ad 100644
--- a/res/color/indicator_arrow_color.xml
+++ b/res/color/lock_screen_scrim_color.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-     Copyright (C) 2019 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.
@@ -16,9 +16,6 @@
 -->
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item
-        android:state_enabled="false"
-        android:color="@color/preview_pager_arrow_disabled" />
-    <item
-        android:state_enabled="true"
-        android:color="?android:attr/colorAccent" />
+        android:alpha="0.24"
+        android:color="@android:color/black"/>
 </selector>
diff --git a/res/color/indicator_arrow_color.xml b/res/color/lock_screen_text_color.xml
similarity index 73%
copy from res/color/indicator_arrow_color.xml
copy to res/color/lock_screen_text_color.xml
index 198d002..23afbdc 100644
--- a/res/color/indicator_arrow_color.xml
+++ b/res/color/lock_screen_text_color.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-     Copyright (C) 2019 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.
@@ -16,9 +16,6 @@
 -->
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item
-        android:state_enabled="false"
-        android:color="@color/preview_pager_arrow_disabled" />
-    <item
-        android:state_enabled="true"
-        android:color="?android:attr/colorAccent" />
+        android:alpha="0.88"
+        android:color="@android:color/white"/>
 </selector>
diff --git a/res/color/option_border_color.xml b/res/color/option_border_color.xml
index ec5ab97..bdf26bb 100644
--- a/res/color/option_border_color.xml
+++ b/res/color/option_border_color.xml
@@ -24,5 +24,5 @@
         android:color="?android:colorAccent" />
     <item
         android:alpha="0.05"
-        android:color="@color/option_border_default"/>
+        android:color="?android:textColorPrimary"/>
 </selector>
diff --git a/res/color/option_title_color.xml b/res/color/option_title_color.xml
index 2809247..3241d8e 100644
--- a/res/color/option_title_color.xml
+++ b/res/color/option_title_color.xml
@@ -17,11 +17,10 @@
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item
         android:state_activated="true"
-        android:color="?android:colorAccent" />
+        android:color="?android:textColorPrimary" />
     <item
         android:state_activated="false"
-        android:alpha="0.54"
-        android:color="?android:colorForeground" />
+        android:color="?android:textColorSecondary" />
     <item
-        android:color="?android:colorForeground"/>
+        android:color="?android:textColorSecondary"/>
 </selector>
diff --git a/res/color/indicator_arrow_color.xml b/res/color/separated_tabs_indicator_color.xml
similarity index 71%
copy from res/color/indicator_arrow_color.xml
copy to res/color/separated_tabs_indicator_color.xml
index 198d002..cbce7d0 100644
--- a/res/color/indicator_arrow_color.xml
+++ b/res/color/separated_tabs_indicator_color.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-     Copyright (C) 2019 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.
@@ -14,11 +14,7 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:state_enabled="false"
-        android:color="@color/preview_pager_arrow_disabled" />
-    <item
-        android:state_enabled="true"
-        android:color="?android:attr/colorAccent" />
-</selector>
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+    <item android:color="?androidprv:attr/colorAccentPrimary" />
+</selector>
\ No newline at end of file
diff --git a/res/color/indicator_arrow_color.xml b/res/color/separated_tabs_text_color.xml
similarity index 71%
copy from res/color/indicator_arrow_color.xml
copy to res/color/separated_tabs_text_color.xml
index 198d002..96f3193 100644
--- a/res/color/indicator_arrow_color.xml
+++ b/res/color/separated_tabs_text_color.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-     Copyright (C) 2019 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.
@@ -15,10 +15,7 @@
      limitations under the License.
 -->
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:state_enabled="false"
-        android:color="@color/preview_pager_arrow_disabled" />
-    <item
-        android:state_enabled="true"
-        android:color="?android:attr/colorAccent" />
-</selector>
+    <item android:state_selected="true" android:color="?android:textColorPrimary"/>
+    <item android:state_enabled="false" android:color="?android:textColorTertiary"/>
+    <item android:color="?android:textColorSecondary"/>
+</selector>
\ No newline at end of file
diff --git a/res/drawable/button_over_thumbnail_background.xml b/res/color/toolbar_icon_tint.xml
similarity index 80%
copy from res/drawable/button_over_thumbnail_background.xml
copy to res/color/toolbar_icon_tint.xml
index 50a4510..3243b5c 100644
--- a/res/drawable/button_over_thumbnail_background.xml
+++ b/res/color/toolbar_icon_tint.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-
      Copyright (C) 2019 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,7 +14,6 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-       android:shape="oval">
-    <solid android:color="@color/black_38_alpha" />
-</shape>
\ No newline at end of file
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="?android:textColorPrimary"/>
+</selector>
diff --git a/res/drawable-hdpi/material_ic_check_circle_white_24.png b/res/drawable-hdpi/material_ic_check_circle_white_24.png
deleted file mode 100755
index e190a5c..0000000
--- a/res/drawable-hdpi/material_ic_check_circle_white_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/material_ic_keyboard_arrow_down_black_24.png b/res/drawable-hdpi/material_ic_keyboard_arrow_down_black_24.png
deleted file mode 100755
index ce5c909..0000000
--- a/res/drawable-hdpi/material_ic_keyboard_arrow_down_black_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/material_ic_keyboard_arrow_up_black_24.png b/res/drawable-hdpi/material_ic_keyboard_arrow_up_black_24.png
deleted file mode 100755
index 2886c1b..0000000
--- a/res/drawable-hdpi/material_ic_keyboard_arrow_up_black_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/material_ic_wallpaper_white_48.png b/res/drawable-hdpi/material_ic_wallpaper_white_48.png
deleted file mode 100755
index 87fc61e..0000000
--- a/res/drawable-hdpi/material_ic_wallpaper_white_48.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/material_ic_check_circle_white_24.png b/res/drawable-mdpi/material_ic_check_circle_white_24.png
deleted file mode 100755
index bc77b2e..0000000
--- a/res/drawable-mdpi/material_ic_check_circle_white_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/material_ic_keyboard_arrow_down_black_24.png b/res/drawable-mdpi/material_ic_keyboard_arrow_down_black_24.png
deleted file mode 100755
index 6318c50..0000000
--- a/res/drawable-mdpi/material_ic_keyboard_arrow_down_black_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/material_ic_keyboard_arrow_up_black_24.png b/res/drawable-mdpi/material_ic_keyboard_arrow_up_black_24.png
deleted file mode 100755
index 31ddbb6..0000000
--- a/res/drawable-mdpi/material_ic_keyboard_arrow_up_black_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/material_ic_wallpaper_white_48.png b/res/drawable-mdpi/material_ic_wallpaper_white_48.png
deleted file mode 100755
index 2595f7a..0000000
--- a/res/drawable-mdpi/material_ic_wallpaper_white_48.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/material_ic_check_circle_white_24.png b/res/drawable-xhdpi/material_ic_check_circle_white_24.png
deleted file mode 100755
index d36d696..0000000
--- a/res/drawable-xhdpi/material_ic_check_circle_white_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/material_ic_keyboard_arrow_down_black_24.png b/res/drawable-xhdpi/material_ic_keyboard_arrow_down_black_24.png
deleted file mode 100755
index 1b0acc2..0000000
--- a/res/drawable-xhdpi/material_ic_keyboard_arrow_down_black_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/material_ic_keyboard_arrow_up_black_24.png b/res/drawable-xhdpi/material_ic_keyboard_arrow_up_black_24.png
deleted file mode 100755
index 016eabd..0000000
--- a/res/drawable-xhdpi/material_ic_keyboard_arrow_up_black_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/material_ic_wallpaper_white_48.png b/res/drawable-xhdpi/material_ic_wallpaper_white_48.png
deleted file mode 100755
index 07ba529..0000000
--- a/res/drawable-xhdpi/material_ic_wallpaper_white_48.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/material_ic_check_circle_white_24.png b/res/drawable-xxhdpi/material_ic_check_circle_white_24.png
deleted file mode 100755
index 4f96745..0000000
--- a/res/drawable-xxhdpi/material_ic_check_circle_white_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/material_ic_keyboard_arrow_down_black_24.png b/res/drawable-xxhdpi/material_ic_keyboard_arrow_down_black_24.png
deleted file mode 100755
index d7b706e..0000000
--- a/res/drawable-xxhdpi/material_ic_keyboard_arrow_down_black_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/material_ic_keyboard_arrow_up_black_24.png b/res/drawable-xxhdpi/material_ic_keyboard_arrow_up_black_24.png
deleted file mode 100755
index ba836b8..0000000
--- a/res/drawable-xxhdpi/material_ic_keyboard_arrow_up_black_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/material_ic_wallpaper_white_48.png b/res/drawable-xxhdpi/material_ic_wallpaper_white_48.png
deleted file mode 100755
index 4275a45..0000000
--- a/res/drawable-xxhdpi/material_ic_wallpaper_white_48.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/material_ic_check_circle_white_24.png b/res/drawable-xxxhdpi/material_ic_check_circle_white_24.png
deleted file mode 100755
index 2c6e474..0000000
--- a/res/drawable-xxxhdpi/material_ic_check_circle_white_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/material_ic_keyboard_arrow_down_black_24.png b/res/drawable-xxxhdpi/material_ic_keyboard_arrow_down_black_24.png
deleted file mode 100755
index 5b055c2..0000000
--- a/res/drawable-xxxhdpi/material_ic_keyboard_arrow_down_black_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/material_ic_keyboard_arrow_up_black_24.png b/res/drawable-xxxhdpi/material_ic_keyboard_arrow_up_black_24.png
deleted file mode 100755
index c0ce888..0000000
--- a/res/drawable-xxxhdpi/material_ic_keyboard_arrow_up_black_24.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/material_ic_wallpaper_white_48.png b/res/drawable-xxxhdpi/material_ic_wallpaper_white_48.png
deleted file mode 100755
index 6687162..0000000
--- a/res/drawable-xxxhdpi/material_ic_wallpaper_white_48.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/bottom_action_button_background.xml b/res/drawable/bottom_action_button_background.xml
new file mode 100644
index 0000000..e1b3554
--- /dev/null
+++ b/res/drawable/bottom_action_button_background.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:color="?android:colorControlHighlight">
+    <item>
+        <selector>
+            <item android:state_selected="false">
+                <shape>
+                    <solid android:color="?android:colorBackground" />
+                    <corners android:radius="@dimen/bottom_action_button_radius" />
+                </shape>
+            </item>
+            <item android:state_selected="true">
+                <shape>
+                    <solid android:color="?androidprv:attr/colorAccentPrimary" />
+                    <corners android:radius="@dimen/bottom_action_button_radius" />
+                </shape>
+            </item>
+        </selector>
+    </item>
+</ripple>
\ No newline at end of file
diff --git a/res/drawable/bottom_sheet_background.xml b/res/drawable/bottom_sheet_background.xml
index 7a09584..c0c3668 100644
--- a/res/drawable/bottom_sheet_background.xml
+++ b/res/drawable/bottom_sheet_background.xml
@@ -16,11 +16,8 @@
      limitations under the License.
 -->
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
-        android:shape="rectangle">
-    <solid android:color="@color/bottom_bar_background_color"/>
-    <corners
-        android:bottomLeftRadius="0dp"
-        android:bottomRightRadius="0dp"
-        android:topLeftRadius="@dimen/preview_bottom_sheet_corner_radius"
-        android:topRightRadius="@dimen/preview_bottom_sheet_corner_radius"/>
-</shape>
\ No newline at end of file
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:shape="rectangle">
+    <solid android:color="?androidprv:attr/colorSurface"/>
+    <corners android:radius="@dimen/preview_bottom_sheet_corner_radius"/>
+</shape>
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/option_border.xml b/res/drawable/dialog_option_background.xml
similarity index 60%
copy from res/drawable/option_border.xml
copy to res/drawable/dialog_option_background.xml
index ff03ed0..efb5891 100644
--- a/res/drawable/option_border.xml
+++ b/res/drawable/dialog_option_background.xml
@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-     Copyright (C) 2019 The Android Open Source Project
+<?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.
@@ -14,12 +15,12 @@
      limitations under the License.
 -->
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="?android:attr/colorControlHighlight">
-    <item android:id="@android:id/mask">
-        <shape android:shape="rectangle">
-            <solid android:color="@android:color/white"/>
-            <corners android:radius="?android:dialogCornerRadius" />
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:color="?android:colorControlHighlight">
+    <item android:id="@android:id/background">
+        <shape>
+            <solid android:color="?androidprv:attr/colorAccentPrimary" />
+            <corners android:radius="@dimen/set_wallpaper_dialog_item_inner_corner_radius"/>
         </shape>
     </item>
-    <item android:drawable="@drawable/option_border_edge" />
-</ripple>
+</ripple>
\ No newline at end of file
diff --git a/res/drawable/button_over_thumbnail_background.xml b/res/drawable/dialog_round_background.xml
similarity index 74%
copy from res/drawable/button_over_thumbnail_background.xml
copy to res/drawable/dialog_round_background.xml
index 50a4510..4dccbc4 100644
--- a/res/drawable/button_over_thumbnail_background.xml
+++ b/res/drawable/dialog_round_background.xml
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-
-     Copyright (C) 2019 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.
@@ -15,7 +14,7 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-       android:shape="oval">
-    <solid android:color="@color/black_38_alpha" />
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="@dimen/set_wallpaper_dialog_item_outer_corner_radius"/>
+    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
 </shape>
\ No newline at end of file
diff --git a/res/drawable/button_over_thumbnail_background.xml b/res/drawable/divider_4dp.xml
similarity index 82%
rename from res/drawable/button_over_thumbnail_background.xml
rename to res/drawable/divider_4dp.xml
index 50a4510..29481c3 100644
--- a/res/drawable/button_over_thumbnail_background.xml
+++ b/res/drawable/divider_4dp.xml
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-
-     Copyright (C) 2019 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.
@@ -15,7 +14,8 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-       android:shape="oval">
-    <solid android:color="@color/black_38_alpha" />
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <size
+        android:height="4dp"
+        android:width="0dp" />
 </shape>
\ No newline at end of file
diff --git a/res/drawable/option_border.xml b/res/drawable/fullscreen_button_background.xml
similarity index 65%
rename from res/drawable/option_border.xml
rename to res/drawable/fullscreen_button_background.xml
index ff03ed0..87a3e1e 100644
--- a/res/drawable/option_border.xml
+++ b/res/drawable/fullscreen_button_background.xml
@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-     Copyright (C) 2019 The Android Open Source Project
+<?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.
@@ -14,12 +15,12 @@
      limitations under the License.
 -->
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="?android:attr/colorControlHighlight">
-    <item android:id="@android:id/mask">
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:color="?android:colorControlHighlight">
+    <item>
         <shape android:shape="rectangle">
-            <solid android:color="@android:color/white"/>
-            <corners android:radius="?android:dialogCornerRadius" />
+            <solid android:color="?androidprv:attr/colorAccentPrimary" />
+            <corners android:radius="@dimen/separated_tabs_corner_radius" />
         </shape>
     </item>
-    <item android:drawable="@drawable/option_border_edge" />
-</ripple>
+</ripple>
\ No newline at end of file
diff --git a/res/drawable/ic_baseline_wallpaper_24.xml b/res/drawable/ic_baseline_wallpaper_24.xml
new file mode 100644
index 0000000..6b7eb35
--- /dev/null
+++ b/res/drawable/ic_baseline_wallpaper_24.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M4,4h7L11,2L4,2c-1.1,0 -2,0.9 -2,2v7h2L4,4zM10,13l-4,5h12l-3,-4 -2.03,2.71L10,13zM17,8.5c0,-0.83 -0.67,-1.5 -1.5,-1.5S14,7.67 14,8.5s0.67,1.5 1.5,1.5S17,9.33 17,8.5zM20,2h-7v2h7v7h2L22,4c0,-1.1 -0.9,-2 -2,-2zM20,20h-7v2h7c1.1,0 2,-0.9 2,-2v-7h-2v7zM4,13L2,13v7c0,1.1 0.9,2 2,2h7v-2L4,20v-7z"/>
+</vector>
diff --git a/res/drawable/ic_check_24dp.xml b/res/drawable/ic_check_24dp.xml
index 826d34a..63c2a0c 100644
--- a/res/drawable/ic_check_24dp.xml
+++ b/res/drawable/ic_check_24dp.xml
@@ -4,6 +4,6 @@
     android:viewportWidth="24"
     android:viewportHeight="24">
   <path
-      android:fillColor="@color/selected_check_color"
+      android:fillColor="?android:textColorPrimaryInverse"
       android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41L9,16.17z"/>
 </vector>
diff --git a/res/drawable/ic_check_wallpaper_24dp.xml b/res/drawable/ic_check_wallpaper_24dp.xml
new file mode 100644
index 0000000..eeee07e
--- /dev/null
+++ b/res/drawable/ic_check_wallpaper_24dp.xml
@@ -0,0 +1,25 @@
+<!--
+     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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="?androidprv:attr/textColorOnAccent"
+      android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41L9,16.17z"/>
+</vector>
diff --git a/res/drawable/ic_download_badge.xml b/res/drawable/ic_download_badge.xml
new file mode 100644
index 0000000..85e09aa
--- /dev/null
+++ b/res/drawable/ic_download_badge.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+    <item>
+        <shape android:shape="oval">
+            <size
+                android:width="@dimen/grid_item_badge_size"
+                android:height="@dimen/grid_item_badge_size" />
+            <solid android:color="?androidprv:attr/colorSurfaceVariant" />
+        </shape>
+    </item>
+    <item
+        android:width="@dimen/grid_item_badge_indicator_size"
+        android:height="@dimen/grid_item_badge_indicator_size"
+        android:drawable="@drawable/ic_file_download_gm2_24px"
+        android:gravity="center" />
+</layer-list>
\ No newline at end of file
diff --git a/res/drawable/ic_explore_18px.xml b/res/drawable/ic_explore_18px.xml
deleted file mode 100644
index a02b439..0000000
--- a/res/drawable/ic_explore_18px.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="18dp"
-    android:height="18dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-  <path
-      android:fillColor="#FF000000"
-      android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,6.48 17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8c0,-4.41 3.59,-8 8,-8s8,3.59 8,8C20,16.41 16.41,20 12,20z"/>
-  <path
-      android:fillColor="#FF000000"
-      android:pathData="M6.5,17.5l7.51,-3.49L17.5,6.5L9.99,9.99L6.5,17.5zM12,10.9c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1s-1.1,-0.49 -1.1,-1.1S11.39,10.9 12,10.9z"/>
-</vector>
diff --git a/res/drawable/ic_file_download_gm2_24px.xml b/res/drawable/ic_file_download_gm2_24px.xml
index fc93746..036c5d0 100644
--- a/res/drawable/ic_file_download_gm2_24px.xml
+++ b/res/drawable/ic_file_download_gm2_24px.xml
@@ -4,6 +4,6 @@
     android:viewportWidth="24"
     android:viewportHeight="24">
   <path
-      android:fillColor="#FF000000"
+      android:fillColor="?android:textColorPrimary"
       android:pathData="M4,15h2v3h12v-3h2v3c0,1.1 -0.9,2 -2,2H6c-1.1,0 -2,-0.9 -2,-2m11.59,-8.41L13,12.17V4h-2v8.17L8.41,9.59 7,11l5,5 5,-5 -1.41,-1.41z"/>
 </vector>
diff --git a/res/drawable/ic_home_24px.xml b/res/drawable/ic_home_24px.xml
deleted file mode 100644
index 5f4c42e..0000000
--- a/res/drawable/ic_home_24px.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-  <path
-      android:fillColor="#FF000000"
-      android:pathData="M12,3L4,9v12h16V9L12,3zM18,19h-3v-6H9v6H6v-9l6,-4.5l6,4.5V19z"/>
-</vector>
diff --git a/res/drawable/ic_nav_wallpaper.xml b/res/drawable/ic_nav_wallpaper.xml
new file mode 100644
index 0000000..c935666
--- /dev/null
+++ b/res/drawable/ic_nav_wallpaper.xml
@@ -0,0 +1,25 @@
+<!--
+     Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<!-- Represents the wallpaper icon (a "landscape" shape in a box) -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M9,12.71l2.14,2.58l3,-3.87L18,16.57H6L9,12.71zM5,5h6V3H5C3.9,3 3,3.9 3,5v6h2V5zM19,19h-6v2h6c1.1,0 2,-0.9 2,-2v-6h-2V19zM5,19v-6H3v6c0,1.1 0.9,2 2,2h6v-2H5zM19,5v6h2V5c0,-1.1 -0.9,-2 -2,-2h-6v2H19zM16,9c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1c-0.55,0 -1,0.45 -1,1S15.45,9 16,9z"/>
+</vector>
diff --git a/res/drawable/ic_refresh_24px.xml b/res/drawable/ic_refresh_24px.xml
deleted file mode 100644
index f1d6330..0000000
--- a/res/drawable/ic_refresh_24px.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-  <path
-      android:fillColor="#FF000000"
-      android:pathData="M13,9v2h7V4h-2v2.74C16.53,5.07 14.4,4 12,4C9.79,4 7.79,4.9 6.34,6.34S4,9.79 4,12c0,4.42 3.58,8 8,8c2.21,0 4.21,-0.9 5.66,-2.34l-1.42,-1.42C15.15,17.33 13.65,18 12,18c-3.31,0 -6,-2.69 -6,-6c0,-1.65 0.67,-3.15 1.76,-4.24C8.85,6.67 10.35,6 12,6c2.21,0 4.15,1.21 5.19,3L13,9z"/>
-</vector>
diff --git a/res/drawable/ic_settings.xml b/res/drawable/ic_settings.xml
deleted file mode 100644
index f24a0a8..0000000
--- a/res/drawable/ic_settings.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-
-     Copyright (C) 2019 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24.0dp"
-    android:viewportHeight="24.0"
-    android:viewportWidth="24.0"
-    android:width="24.0dp" >
-
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zM12 15.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z" />
-
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_smartphone_24px.xml b/res/drawable/ic_smartphone_24px.xml
deleted file mode 100644
index d97cef1..0000000
--- a/res/drawable/ic_smartphone_24px.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-  <path
-      android:fillColor="#FF000000"
-      android:pathData="M17,1.01L7,1C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3C19,1.9 18.1,1.01 17,1.01zM17,21H7l0,-1h10V21zM17,18H7V6h10V18zM7,4V3h10v1H7z"/>
-</vector>
diff --git a/res/drawable/option_border_edge.xml b/res/drawable/option_border_edge.xml
deleted file mode 100644
index 6d633c3..0000000
--- a/res/drawable/option_border_edge.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2019 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_activated="true">
-        <shape android:shape="rectangle">
-            <stroke
-                android:color="@color/option_border_color"
-                android:width="@dimen/option_selected_border_width" />
-            <corners android:radius="?android:dialogCornerRadius" />
-        </shape>
-    </item>
-    <item android:state_activated="false">
-        <shape android:shape="rectangle">
-            <stroke
-                android:color="@color/option_border_color"
-                android:width="@dimen/option_border_width" />
-            <corners android:radius="?android:dialogCornerRadius" />
-        </shape>
-    </item>
-</selector>
diff --git a/res/drawable/permission_needed_bg.xml b/res/drawable/permission_needed_bg.xml
index 635c08e..d86102f 100755
--- a/res/drawable/permission_needed_bg.xml
+++ b/res/drawable/permission_needed_bg.xml
@@ -15,6 +15,6 @@
 -->
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
-    <solid android:color="@color/accent_color" />
+    <solid android:color="?android:colorAccent" />
     <corners android:radius="2dp" />
 </shape>
diff --git a/res/drawable/presentation_mode_content_protection.xml b/res/drawable/presentation_mode_content_protection.xml
deleted file mode 100644
index bd5296b..0000000
--- a/res/drawable/presentation_mode_content_protection.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
-     Copyright (C) 2019 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <gradient
-        android:angle="90"
-        android:startColor="@color/material_black_100"
-        android:endColor="@android:color/transparent"
-        android:type="linear" />
-</shape>
\ No newline at end of file
diff --git a/res/drawable/preview_bottom_sheet_background.xml b/res/drawable/preview_bottom_sheet_background.xml
deleted file mode 100644
index 847cbf3..0000000
--- a/res/drawable/preview_bottom_sheet_background.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
-     Copyright (C) 2019 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-        android:shape="rectangle">
-    <solid android:color="@color/translucent_black"/>
-    <corners android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp" android:topLeftRadius="@dimen/preview_bottom_sheet_corner_radius" android:topRightRadius="@dimen/preview_bottom_sheet_corner_radius"/>
-</shape>
\ No newline at end of file
diff --git a/res/drawable/button_over_thumbnail_background.xml b/res/drawable/section_divider.xml
similarity index 75%
copy from res/drawable/button_over_thumbnail_background.xml
copy to res/drawable/section_divider.xml
index 50a4510..b37ec1b 100644
--- a/res/drawable/button_over_thumbnail_background.xml
+++ b/res/drawable/section_divider.xml
@@ -1,7 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
-     Copyright (C) 2019 The Android Open Source Project
+<?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.
@@ -15,7 +13,7 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-       android:shape="oval">
-    <solid android:color="@color/black_38_alpha" />
+<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/drawable/separated_tabs_background.xml b/res/drawable/separated_tabs_background.xml
new file mode 100644
index 0000000..546c568
--- /dev/null
+++ b/res/drawable/separated_tabs_background.xml
@@ -0,0 +1,24 @@
+<?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.
+-->
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:insetLeft="@dimen/separated_tabs_inset_horizontal"
+    android:insetRight="@dimen/separated_tabs_inset_horizontal">
+    <shape android:shape="rectangle">
+        <solid android:color="?androidprv:attr/colorSurface" />
+        <corners android:radius="@dimen/separated_tabs_corner_radius" />
+    </shape>
+</inset>
diff --git a/res/drawable/separated_tabs_indicator_background.xml b/res/drawable/separated_tabs_indicator_background.xml
new file mode 100644
index 0000000..05e52e5
--- /dev/null
+++ b/res/drawable/separated_tabs_indicator_background.xml
@@ -0,0 +1,24 @@
+<?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.
+-->
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
+    android:insetLeft="@dimen/separated_tabs_inset_horizontal"
+    android:insetRight="@dimen/separated_tabs_inset_horizontal">
+    <shape android:shape="rectangle">
+        <solid android:color="@color/separated_tabs_indicator_color" />
+        <corners android:radius="@dimen/separated_tabs_corner_radius" />
+    </shape>
+</inset>
diff --git a/res/drawable/separated_tabs_ripple_mask.xml b/res/drawable/separated_tabs_ripple_mask.xml
new file mode 100644
index 0000000..ad39a50
--- /dev/null
+++ b/res/drawable/separated_tabs_ripple_mask.xml
@@ -0,0 +1,28 @@
+<?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.
+-->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="?android:colorControlHighlight">
+    <item android:id="@android:id/mask">
+        <inset
+            android:insetLeft="@dimen/separated_tabs_inset_horizontal"
+            android:insetRight="@dimen/separated_tabs_inset_horizontal">
+            <shape android:shape="rectangle">
+                <corners android:radius="@dimen/separated_tabs_corner_radius" />
+                <solid android:color="?android:colorControlHighlight" />
+            </shape>
+        </inset>
+    </item>
+</ripple>
diff --git a/res/drawable/wallpaper_check_circle_24dp.xml b/res/drawable/wallpaper_check_circle_24dp.xml
new file mode 100644
index 0000000..1249111
--- /dev/null
+++ b/res/drawable/wallpaper_check_circle_24dp.xml
@@ -0,0 +1,29 @@
+<!--
+     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.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+    <item>
+        <shape android:shape="oval">
+            <size android:width="24dp" android:height="24dp" />
+            <solid android:color="?androidprv:attr/colorAccentPrimary" />
+        </shape>
+    </item>
+    <item
+        android:width="@dimen/grid_item_badge_indicator_size"
+        android:height="@dimen/grid_item_badge_indicator_size"
+        android:drawable="@drawable/ic_check_wallpaper_24dp"
+        android:gravity="center" />
+</layer-list>
diff --git a/res/drawable/gradient_background.xml b/res/drawable/wallpaper_section_background.xml
similarity index 72%
rename from res/drawable/gradient_background.xml
rename to res/drawable/wallpaper_section_background.xml
index 78f013a..208f543 100644
--- a/res/drawable/gradient_background.xml
+++ b/res/drawable/wallpaper_section_background.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?><!--
-
-     Copyright (C) 2019 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.
@@ -14,10 +13,9 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <gradient android:angle="270"
-        android:startColor="@color/translucent_black_lighter"
-
-        android:endColor="@android:color/transparent"
-        />
-</shape>
\ No newline at end of file
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:shape="rectangle">
+    <corners android:radius="28dp" />
+    <solid android:color="?androidprv:attr/colorSurface" />
+</shape>
diff --git a/res/values/config.xml b/res/font/clock.xml
old mode 100755
new mode 100644
similarity index 76%
rename from res/values/config.xml
rename to res/font/clock.xml
index 9aad85b..8ef49bd
--- a/res/values/config.xml
+++ b/res/font/clock.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?><!--
-     Copyright (C) 2017 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,6 +13,6 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<resources>
-    <bool name="enable_no_backup_image_wallpaper">true</bool>
-</resources>
+<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/activity_individual_picker.xml b/res/layout/activity_individual_picker.xml
index c79b06d..222c7cb 100755
--- a/res/layout/activity_individual_picker.xml
+++ b/res/layout/activity_individual_picker.xml
@@ -14,6 +14,7 @@
      limitations under the License.
 -->
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical">
@@ -24,10 +25,10 @@
         android:elevation="8dp">
 
         <androidx.appcompat.widget.Toolbar
-            style="@style/Widget.AppCompat.Toolbar"
             android:id="@+id/toolbar"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"/>
+            android:layout_height="wrap_content"
+            app:theme="?android:attr/actionBarTheme"/>
 
     </com.google.android.material.appbar.AppBarLayout>
 
@@ -40,7 +41,7 @@
             android:id="@+id/fragment_container"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_marginBottom="@dimen/bottom_navbar_height"/>
+            android:layout_marginBottom="@dimen/bottom_actions_height"/>
 
         <include layout="@layout/bottom_action_bar" />
     </FrameLayout>
diff --git a/res/layout/activity_top_level_desktop.xml b/res/layout/activity_top_level_desktop.xml
index 784d606..08ad790 100755
--- a/res/layout/activity_top_level_desktop.xml
+++ b/res/layout/activity_top_level_desktop.xml
@@ -19,7 +19,7 @@
     android:layout_height="match_parent"
     android:fitsSystemWindows="false">
 
-    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:orientation="vertical">
@@ -47,20 +47,19 @@
                 android:layout_height="@dimen/tile_desktop_progress_bar_size"
                 android:layout_gravity="center"
                 android:indeterminate="true"
-                android:indeterminateTint="@color/accent_color" />
+                android:indeterminateTint="?android:colorAccent" />
 
         </FrameLayout>
 
     </LinearLayout>
 
-    <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
+    <androidx.coordinatorlayout.widget.CoordinatorLayout
         android:id="@+id/coordinator_layout"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_gravity="bottom">
 
-        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        <LinearLayout
             xmlns:app="http://schemas.android.com/apk/res-auto"
             android:id="@+id/bottom_sheet"
             android:layout_width="match_parent"
@@ -105,7 +104,7 @@
                             android:layout_marginLeft="@dimen/current_wallpaper_bottom_sheet_margin_sides"
                             android:layout_marginStart="@dimen/current_wallpaper_bottom_sheet_margin_sides"
                             android:layout_marginTop="@dimen/current_wallpaper_bottom_sheet_presentation_mode_margin_top"
-                            android:textColor="@color/accent_color"
+                            android:textColor="?android:colorAccent"
                             android:textSize="@dimen/current_wallpaper_bottom_sheet_presentation_mode_text_size"
                             android:textStyle="bold" />
 
@@ -153,7 +152,7 @@
                                 android:drawablePadding="@dimen/explore_button_drawable_padding"
                                 android:focusable="true"
                                 android:text="@string/explore"
-                                android:textColor="@color/accent_color"
+                                android:textColor="?android:colorAccent"
                                 android:textSize="@dimen/current_wallpaper_bottom_sheet_explore_button_text_size"
                                 android:visibility="gone" />
 
@@ -168,7 +167,7 @@
                                 android:drawablePadding="@dimen/explore_button_drawable_padding"
                                 android:focusable="true"
                                 android:text="@string/next_wallpaper"
-                                android:textColor="@color/accent_color"
+                                android:textColor="?android:colorAccent"
                                 android:textSize="@dimen/current_wallpaper_bottom_sheet_explore_button_text_size"
                                 android:visibility="gone" />
 
diff --git a/res/layout/activity_top_level_picker.xml b/res/layout/activity_top_level_picker.xml
index 101cee1..9f8ba68 100755
--- a/res/layout/activity_top_level_picker.xml
+++ b/res/layout/activity_top_level_picker.xml
@@ -14,14 +14,13 @@
      limitations under the License.
 -->
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/fragment_main"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:background="?android:colorPrimary">
+    android:background="?android:colorBackground">
 
     <FrameLayout
         android:id="@+id/fragment_container"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
-
-    <include layout="@layout/bottom_action_bar" />
 </FrameLayout>
diff --git a/res/layout/bottom_action_bar.xml b/res/layout/bottom_action_bar.xml
index fa8d2ea..c927d1e 100644
--- a/res/layout/bottom_action_bar.xml
+++ b/res/layout/bottom_action_bar.xml
@@ -18,6 +18,4 @@
     android:id="@+id/bottom_actionbar"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:layout_gravity="bottom"
-    android:elevation="@dimen/bottom_action_bar_elevation"
     android:visibility="gone" />
diff --git a/res/layout/bottom_actions_layout.xml b/res/layout/bottom_actions_layout.xml
index e499f13..9102086 100644
--- a/res/layout/bottom_actions_layout.xml
+++ b/res/layout/bottom_actions_layout.xml
@@ -13,6 +13,7 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
+<!-- Updates layout's color and background in {@code BottomActionBar} -->
 <RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
@@ -24,18 +25,16 @@
     <androidx.coordinatorlayout.widget.CoordinatorLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_above="@id/action_tabs"
-        android:elevation="@dimen/bottom_action_bar_elevation">
+        android:layout_above="@id/action_tabs">
         <!-- Bottom sheet view should be a child view of CoordinatorLayout -->
         <FrameLayout
             android:id="@+id/action_bottom_sheet"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:background="@drawable/bottom_sheet_background"
+            android:layout_marginHorizontal="@dimen/bottom_sheet_margin"
             android:theme="@style/WallpaperPicker.BottomPaneStyle"
             android:clickable="true"
-            android:elevation="@dimen/bottom_action_bar_elevation"
-            app:behavior_peekHeight="@dimen/preview_attribution_pane_collapsed_height"
+            app:behavior_peekHeight="0dp"
             app:layout_behavior="com.android.wallpaper.widget.BottomActionBar$QueueStateBottomSheetBehavior" />
     </androidx.coordinatorlayout.widget.CoordinatorLayout>
 
@@ -43,137 +42,131 @@
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/action_tabs"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/bottom_navbar_height"
-        android:paddingTop="@dimen/bottom_action_bar_padding_top"
-        android:paddingHorizontal="@dimen/bottom_action_bar_padding_horizontal"
-        android:clickable="true"
-        android:elevation="@dimen/bottom_action_bar_elevation"
-        android:background="@color/bottom_bar_background_color"
+        android:layout_height="@dimen/bottom_actions_height"
+        android:paddingTop="@dimen/bottom_actions_top_padding"
+        android:paddingBottom="@dimen/bottom_actions_bottom_padding"
         android:theme="@style/BottomActionItemStyle"
         android:layout_alignParentBottom="true"
         android:layoutDirection="locale">
 
         <ImageView
             android:id="@+id/action_back"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
+            android:layout_width="@dimen/bottom_action_button_width"
+            android:layout_height="@dimen/bottom_action_button_height"
             android:src="@drawable/ic_close_gm2_24px"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
             android:contentDescription="@string/bottom_action_bar_back"
-            android:tint="@color/bottom_action_button_color_tint"
+            android:visibility="gone"
             app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toStartOf="@id/action_rotation"
             app:layout_constraintHorizontal_chainStyle="spread_inside"
             app:layout_constraintStart_toStartOf="parent" />
 
         <ImageView
             android:id="@+id/action_rotation"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
+            android:layout_width="@dimen/bottom_action_button_width"
+            android:layout_height="@dimen/bottom_action_button_height"
             android:src="@drawable/ic_slideshow_24dp"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
             android:contentDescription="@string/bottom_action_bar_slideshow_wallpaper"
-            android:tint="@color/bottom_action_button_color_tint"
             android:visibility="gone"
             app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toStartOf="@id/action_delete"
             app:layout_constraintStart_toEndOf="@id/action_back" />
 
         <ImageView
             android:id="@+id/action_delete"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
-            android:src="@drawable/ic_delete_24px"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
+            android:layout_width="@dimen/bottom_action_button_width"
+            android:layout_height="@dimen/bottom_action_button_height"
             android:contentDescription="@string/delete_live_wallpaper"
-            android:tint="@color/bottom_action_button_color_tint"
+            android:src="@drawable/ic_delete_24px"
             android:visibility="gone"
             app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toStartOf="@id/action_information"
             app:layout_constraintStart_toEndOf="@id/action_rotation" />
 
         <ImageView
             android:id="@+id/action_information"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
+            android:layout_width="@dimen/bottom_action_button_width"
+            android:layout_height="@dimen/bottom_action_button_height"
             android:src="@drawable/ic_info_gm2_24px"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
             android:contentDescription="@string/tab_info"
-            android:tint="@color/bottom_action_button_color_tint"
             android:visibility="gone"
             app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toStartOf="@id/action_edit"
             app:layout_constraintStart_toEndOf="@id/action_delete" />
 
         <ImageView
             android:id="@+id/action_edit"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
+            android:layout_width="@dimen/bottom_action_button_width"
+            android:layout_height="@dimen/bottom_action_button_height"
             android:src="@drawable/ic_pan_zoom_24dp"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
             android:contentDescription="@string/bottom_action_bar_edit"
-            android:tint="@color/bottom_action_button_color_tint"
             android:visibility="gone"
             app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toStartOf="@id/action_customize"
             app:layout_constraintStart_toEndOf="@id/action_information" />
 
         <ImageView
             android:id="@+id/action_customize"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
+            android:layout_width="@dimen/bottom_action_button_width"
+            android:layout_height="@dimen/bottom_action_button_height"
             android:src="@drawable/ic_tune_black_24dp"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
             android:contentDescription="@string/tab_customize"
-            android:tint="@color/bottom_action_button_color_tint"
             android:visibility="gone"
             app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toStartOf="@id/action_download"
             app:layout_constraintStart_toEndOf="@id/action_edit" />
 
         <ImageView
             android:id="@+id/action_download"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
+            android:layout_width="@dimen/bottom_action_button_width"
+            android:layout_height="@dimen/bottom_action_button_height"
             android:src="@drawable/ic_file_download_gm2_24px"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
             android:contentDescription="@string/bottom_action_bar_download"
-            android:tint="@color/bottom_action_button_color_tint"
             android:visibility="gone"
             app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toStartOf="@id/action_progress"
             app:layout_constraintStart_toEndOf="@id/action_customize" />
 
         <ProgressBar
             android:id="@+id/action_progress"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
+            android:layout_width="@dimen/bottom_action_button_width"
+            android:layout_height="@dimen/bottom_action_button_height"
             android:visibility="gone"
             app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toStartOf="@id/action_apply"
             app:layout_constraintStart_toEndOf="@id/action_download" />
 
         <ImageView
             android:id="@+id/action_apply"
-            android:layout_width="@dimen/bottom_action_button_size"
-            android:layout_height="@dimen/bottom_action_button_size"
-            android:padding="@dimen/bottom_action_button_padding"
+            android:layout_width="@dimen/bottom_action_button_width"
+            android:layout_height="@dimen/bottom_action_button_height"
             android:src="@drawable/ic_done_gm2_24px"
-            android:background="?android:attr/selectableItemBackgroundBorderless"
             android:contentDescription="@string/bottom_action_bar_apply"
-            android:tint="@color/bottom_action_button_color_tint"
             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: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/dialog_set_wallpaper.xml b/res/layout/dialog_set_wallpaper.xml
index fe30c83..f1102bd 100755
--- a/res/layout/dialog_set_wallpaper.xml
+++ b/res/layout/dialog_set_wallpaper.xml
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?><!--
+<?xml version="1.0" encoding="utf-8"?>
+<!--
      Copyright (C) 2017 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,32 +14,47 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
-    android:paddingBottom="@dimen/set_wallpaper_dialog_padding_bottom"
-    android:paddingTop="@dimen/set_wallpaper_dialog_padding_top">
+    android:layout_height="match_parent"
+    android:background="?androidprv:attr/colorSurface"
+    android:padding="@dimen/set_wallpaper_dialog_padding">
 
-    <Button
-        android:id="@+id/set_home_wallpaper_button"
-        style="@style/set_wallpaper_destination_item"
+    <LinearLayout
+        android:id="@+id/dialog_set_wallpaper_options"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:text="@string/set_wallpaper_home_screen_destination" />
+        android:orientation="vertical"
+        android:divider="@drawable/divider_4dp"
+        android:showDividers="middle"
+        android:background="@drawable/dialog_round_background">
 
-    <Button
-        android:id="@+id/set_lock_wallpaper_button"
-        style="@style/set_wallpaper_destination_item"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/set_wallpaper_lock_screen_destination" />
+        <Button
+            android:id="@+id/set_home_wallpaper_button"
+            style="@style/set_wallpaper_destination_item"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/set_wallpaper_home_screen_destination"
+            android:textColor="?androidprv:attr/textColorOnAccent" />
 
-    <Button
-        android:id="@+id/set_both_wallpaper_button"
-        style="@style/set_wallpaper_destination_item"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/set_wallpaper_both_destination" />
+        <Button
+            android:id="@+id/set_lock_wallpaper_button"
+            style="@style/set_wallpaper_destination_item"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/set_wallpaper_lock_screen_destination"
+            android:textColor="?androidprv:attr/textColorOnAccent" />
 
-</LinearLayout>
+        <Button
+            android:id="@+id/set_both_wallpaper_button"
+            style="@style/set_wallpaper_destination_item"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/set_wallpaper_both_destination"
+            android:textColor="?androidprv:attr/textColorOnAccent" />
+
+    </LinearLayout>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/dialog_set_wallpaper_title.xml b/res/layout/dialog_set_wallpaper_title.xml
new file mode 100755
index 0000000..3267939
--- /dev/null
+++ b/res/layout/dialog_set_wallpaper_title.xml
@@ -0,0 +1,52 @@
+<?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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="?androidprv:attr/colorSurface"
+    android:orientation="vertical">
+
+    <Space
+        android:layout_height="24dp"
+        android:layout_width="wrap_content" />
+
+    <ImageView
+        android:layout_width="@dimen/set_wallpaper_dialog_icon_size"
+        android:layout_height="@dimen/set_wallpaper_dialog_icon_size"
+        android:layout_gravity="center"
+        android:src="@drawable/ic_baseline_wallpaper_24"
+        android:tint="?android:attr/colorAccent" />
+
+    <Space
+        android:layout_height="16dp"
+        android:layout_width="wrap_content" />
+
+    <TextView
+        android:id="@+id/dialog_set_wallpaper_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:fontFamily="@*android:string/config_headlineFontFamily"
+        android:minHeight="32dp"
+        android:textColor="?android:attr/textColorPrimary"
+        android:textSize="24sp"
+        android:gravity="center" />
+
+    <Space
+        android:layout_height="8dp"
+        android:layout_width="wrap_content" />
+
+</LinearLayout>
diff --git a/res/layout/dialog_start_rotation.xml b/res/layout/dialog_start_rotation.xml
index 3775100..6f5b504 100755
--- a/res/layout/dialog_start_rotation.xml
+++ b/res/layout/dialog_start_rotation.xml
@@ -16,8 +16,7 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:theme="@style/Theme.AppCompat.DayNight.NoActionBar">
+    android:orientation="vertical">
 
     <TextView
         android:id="@+id/start_rotation_dialog_subhead"
@@ -49,6 +48,7 @@
             android:layout_marginEnd="@dimen/start_rotation_dialog_checkbox_margin_right"
             android:layout_marginRight="@dimen/start_rotation_dialog_checkbox_margin_right"
             android:minHeight="@dimen/start_rotation_dialog_checkbox_min_height"
+            android:buttonTint="?android:attr/colorAccent"
             android:text="@string/start_rotation_dialog_wifi_only_option_message"
             android:textSize="@dimen/abc_text_size_body_1_material"/>
 
diff --git a/res/layout/fragment_category_picker.xml b/res/layout/fragment_category_picker.xml
index 8da7e2f..a1b62b6 100755
--- a/res/layout/fragment_category_picker.xml
+++ b/res/layout/fragment_category_picker.xml
@@ -17,7 +17,6 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:background="?android:colorPrimary"
     android:orientation="vertical">
 
     <include layout="@layout/section_header" />
@@ -32,7 +31,6 @@
             android:id="@+id/wallpaper_preview_pager"
             android:layout_width="match_parent"
             android:layout_height="0dp"
-            android:background="@color/preview_pager_background"
             app:card_style="screen_aspect_ratio"
             app:layout_constrainedHeight="true"
             app:layout_constraintEnd_toEndOf="parent"
@@ -43,7 +41,7 @@
 
         <include
             android:id="@+id/permission_needed"
-            layout="@layout/grid_item_permission_needed"
+            layout="@layout/permission_needed_layout"
             android:layout_width="match_parent"
             android:layout_height="0dp"
             android:visibility="gone"
@@ -67,7 +65,7 @@
                 android:id="@+id/category_fragment_container"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:background="?android:colorPrimary"
+                android:background="?android:colorBackground"
                 app:layout_behavior="@string/bottom_sheet_behavior" />
         </androidx.coordinatorlayout.widget.CoordinatorLayout>
     </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/fragment_category_selector.xml b/res/layout/fragment_category_selector.xml
index 4fed92f..98e94ae 100644
--- a/res/layout/fragment_category_selector.xml
+++ b/res/layout/fragment_category_selector.xml
@@ -13,17 +13,24 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/category_grid"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:clipToPadding="false"
-    android:paddingTop="@dimen/category_grid_padding_top"
-    android:paddingBottom="@dimen/category_grid_padding_bottom"
-    android:paddingHorizontal="@dimen/grid_edge_space"
-    android:scrollbarSize="@dimen/grid_padding"
-    android:scrollbarStyle="outsideOverlay"
-    android:scrollbarThumbVertical="@color/scrollbar_thumb_color_dark"
-    android:scrollbars="vertical"
-    app:layout_behavior="@string/bottom_sheet_behavior" />
+    android:orientation="vertical">
+
+    <include
+        android:id="@+id/header_bar"
+        layout="@layout/section_header" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/category_grid"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:clipToPadding="false"
+        android:paddingTop="@dimen/category_grid_padding_top"
+        android:paddingHorizontal="@dimen/category_grid_edge_space"
+        android:scrollbarSize="@dimen/grid_padding"
+        android:scrollbarStyle="outsideOverlay"
+        android:scrollbarThumbVertical="?android:attr/textColorSecondary"
+        android:scrollbars="vertical" />
+</LinearLayout>
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_disabled_by_admin.xml b/res/layout/fragment_disabled_by_admin.xml
index 8078888..94fba5b 100755
--- a/res/layout/fragment_disabled_by_admin.xml
+++ b/res/layout/fragment_disabled_by_admin.xml
@@ -16,9 +16,9 @@
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:background="@color/material_grey200">
+    android:background="?android:colorSecondary">
 
-    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    <LinearLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center"
@@ -40,7 +40,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
             android:gravity="center"
-            android:textColor="@color/black_38_alpha"
+            android:textColor="?android:textColorTertiary"
             android:textSize="@dimen/abc_text_size_subhead_material" />
 
     </LinearLayout>
diff --git a/res/layout/fragment_image_preview.xml b/res/layout/fragment_image_preview.xml
new file mode 100644
index 0000000..46b4b88
--- /dev/null
+++ b/res/layout/fragment_image_preview.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="?android:colorBackground">
+
+    <FrameLayout
+        android:id="@+id/separated_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/separated_tabs_horizontal_margin">
+        <include layout="@layout/separated_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_separated_tabs">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/container"
+            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">
+                <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/fullscreen_preview_buttons_horizontal_margin">
+        <include layout="@layout/fullscreen_buttons" />
+    </FrameLayout>
+
+    <FrameLayout
+        android:id="@+id/bottom_action_bar_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="bottom">
+        <include layout="@layout/bottom_action_bar" />
+    </FrameLayout>
+</FrameLayout>
diff --git a/res/layout/fragment_image_preview_v2.xml b/res/layout/fragment_image_preview_v2.xml
deleted file mode 100644
index 7f6b81c..0000000
--- a/res/layout/fragment_image_preview_v2.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2020 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="?android:colorPrimary">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_marginBottom="@dimen/bottom_navbar_height"
-        android:orientation="vertical">
-
-        <include layout="@layout/section_header" />
-
-        <FrameLayout
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="1"
-            android:orientation="vertical">
-
-            <FrameLayout
-                android:layout_width="match_parent"
-                android:layout_height="match_parent">
-
-                <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" />
-
-                <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"
-                android:background="@color/fullscreen_preview_background">
-
-                <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>
-    </LinearLayout>
-
-    <include layout="@layout/bottom_action_bar" />
-
-</FrameLayout>
diff --git a/res/layout/fragment_individual_picker.xml b/res/layout/fragment_individual_picker.xml
index e0875c2..dc21308 100755
--- a/res/layout/fragment_individual_picker.xml
+++ b/res/layout/fragment_individual_picker.xml
@@ -19,23 +19,24 @@
     android:layout_height="match_parent"
     android:fitsSystemWindows="false">
 
-    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:background="@color/individual_picker_background_color"
         android:orientation="vertical">
 
+        <include
+            android:id="@+id/header_bar"
+            layout="@layout/section_header" />
+
         <androidx.recyclerview.widget.RecyclerView
             android:id="@+id/wallpaper_grid"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:clipToPadding="false"
-            android:paddingHorizontal="@dimen/grid_edge_space"
             android:paddingTop="@dimen/wallpaper_grid_padding_top"
-            android:paddingBottom="@dimen/wallpaper_grid_padding_bottom"
             android:scrollbarSize="@dimen/grid_padding"
             android:scrollbarStyle="outsideOverlay"
-            android:scrollbarThumbVertical="@color/scrollbar_thumb_color_dark"
+            android:scrollbarThumbVertical="?android:textColorTertiary"
             android:scrollbars="vertical" />
 
     </LinearLayout>
diff --git a/res/layout/fragment_live_preview.xml b/res/layout/fragment_live_preview.xml
new file mode 100644
index 0000000..dc8273c
--- /dev/null
+++ b/res/layout/fragment_live_preview.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="?android:colorBackground">
+
+    <FrameLayout
+        android:id="@+id/separated_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/separated_tabs_horizontal_margin">
+        <include layout="@layout/separated_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_separated_tabs">
+
+        <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">
+
+                <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/fullscreen_preview_buttons_horizontal_margin">
+        <include layout="@layout/fullscreen_buttons" />
+    </FrameLayout>
+
+    <FrameLayout
+        android:id="@+id/bottom_action_bar_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="bottom">
+        <include layout="@layout/bottom_action_bar" />
+    </FrameLayout>
+</FrameLayout>
diff --git a/res/layout/fragment_live_preview_v2.xml b/res/layout/fragment_live_preview_v2.xml
deleted file mode 100644
index 6011ddd..0000000
--- a/res/layout/fragment_live_preview_v2.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2020 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="?android:colorPrimary">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_marginBottom="@dimen/bottom_navbar_height"
-        android:orientation="vertical">
-
-        <include layout="@layout/section_header" />
-
-        <androidx.constraintlayout.widget.ConstraintLayout
-            android:id="@+id/live_wallpaper_preview"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="1"
-            android:layout_gravity="center"
-            android:clipChildren="false"
-            android:clipToPadding="false"
-            android:background="@color/fullscreen_preview_background"
-            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"
-                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>
-
-    </LinearLayout>
-
-    <FrameLayout
-        android:id="@+id/loading"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:forceHasOverlappingRendering="false">
-
-        <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>
-
-    <include layout="@layout/bottom_action_bar" />
-</FrameLayout>
diff --git a/res/layout/fragment_offline_desktop.xml b/res/layout/fragment_offline_desktop.xml
index a50df69..4b8412e 100755
--- a/res/layout/fragment_offline_desktop.xml
+++ b/res/layout/fragment_offline_desktop.xml
@@ -17,7 +17,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    <LinearLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center"
diff --git a/res/layout/full_preview_tabs.xml b/res/layout/full_preview_tabs.xml
deleted file mode 100644
index 2dd72d3..0000000
--- a/res/layout/full_preview_tabs.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2020 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<com.google.android.material.tabs.TabLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/full_preview_tabs"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    app:tabIndicatorColor="?android:colorAccent"
-    app:tabIndicatorFullWidth="false"
-    app:tabRippleColor="?android:colorControlHighlight"
-    app:tabSelectedTextColor="?android:colorAccent"
-    app:tabTextAppearance="@android:style/TextAppearance.Material.Body2"
-    app:tabTextColor="@color/full_preview_tab_unselected_text_color"
-    app:tabUnboundedRipple="true">
-
-    <com.google.android.material.tabs.TabItem
-        android:id="@+id/home"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/home_screen_message" />
-
-    <com.google.android.material.tabs.TabItem
-        android:id="@+id/lock"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/lock_screen_message" />
-</com.google.android.material.tabs.TabLayout>
diff --git a/res/layout/fullscreen_buttons.xml b/res/layout/fullscreen_buttons.xml
new file mode 100644
index 0000000..e6a0387
--- /dev/null
+++ b/res/layout/fullscreen_buttons.xml
@@ -0,0 +1,56 @@
+<?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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:layout_height="@dimen/separated_tabs_height"
+    android:layout_width="match_parent"
+    android:orientation="horizontal"
+    android:weightSum="2">
+
+    <Button
+        android:id="@+id/hide_ui_preview_button"
+        android:layout_height="match_parent"
+        android:layout_width="match_parent"
+        android:layout_gravity="center"
+        android:layout_marginEnd="@dimen/fullscreen_preview_button_margin_between"
+        android:layout_weight="1"
+        android:background="@drawable/fullscreen_button_background"
+        android:gravity="center"
+        android:text="@string/hide_ui_preview_text"
+        android:textAlignment="center"
+        android:textAppearance="@style/SeparatedTabsTextAppearance"
+        android:textColor="?androidprv:attr/textColorOnAccent"
+        android:visibility="visible">
+    </Button>
+
+    <Button
+        android:id="@+id/set_as_wallpaper_button"
+        android:layout_height="match_parent"
+        android:layout_width="match_parent"
+        android:layout_gravity="center"
+        android:layout_marginStart="@dimen/fullscreen_preview_button_margin_between"
+        android:layout_weight="1"
+        android:background="@drawable/fullscreen_button_background"
+        android:gravity="center"
+        android:text="@string/set_wallpaper_button_text"
+        android:textAlignment="center"
+        android:textAppearance="@style/SeparatedTabsTextAppearance"
+        android:textColor="?androidprv:attr/textColorOnAccent"
+        android:visibility="visible">
+    </Button>
+</LinearLayout>
diff --git a/res/layout/fullscreen_wallpaper_preview.xml b/res/layout/fullscreen_wallpaper_preview.xml
index 3f430f8..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="@color/fullscreen_preview_background" />
+        android:background="?android:colorBackground" />
 
     <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
         android:id="@+id/full_res_image"
diff --git a/res/layout/grid_item_both_metadata.xml b/res/layout/grid_item_both_metadata.xml
deleted file mode 100755
index 81a9d08..0000000
--- a/res/layout/grid_item_both_metadata.xml
+++ /dev/null
@@ -1,297 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-     Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              xmlns:app="http://schemas.android.com/apk/res-auto"
-              android:id="@+id/metadata"
-              android:layout_width="match_parent"
-              android:layout_height="wrap_content"
-              android:orientation="horizontal">
-
-    <androidx.cardview.widget.CardView
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:layout_marginHorizontal="4dp"
-        app:cardCornerRadius="?android:dialogCornerRadius"
-        app:cardElevation="@dimen/single_metadata_card_elevation"
-        app:cardMaxElevation="@dimen/single_metadata_card_elevation"
-        app:cardPreventCornerOverlap="false"
-        app:cardUseCompatPadding="true"
-        app:contentPadding="0dp">
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="vertical">
-
-            <!-- Wraps the image and the "lock screen" label overlapping it. -->
-            <FrameLayout
-                android:id="@+id/lock_wallpaper_section"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content">
-
-                <com.android.wallpaper.widget.WallpaperThumbnailView
-                    android:id="@+id/lock_wallpaper_image"
-                    android:layout_width="match_parent"
-                    android:layout_height="@dimen/both_metadata_thumb_height"
-                    android:layout_gravity="top"
-                    android:clickable="true"
-                    android:contentDescription="@string/currently_set_lock_wallpaper_thumbnail"
-                    android:focusable="true"
-                    android:foreground="?attr/selectableItemBackground"
-                    android:nextFocusForward="@+id/lock_wallpaper_attribution_section" />
-
-                <ImageButton
-                    style="?attr/borderlessButtonStyle"
-                    android:id="@+id/lock_wallpaper_explore_button"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_margin="@dimen/single_metadata_explore_button_margin"
-                    android:layout_gravity="top|end"
-                    android:background="@drawable/button_over_thumbnail_background"
-                    android:clickable="true"
-                    android:contentDescription="@string/explore"
-                    android:focusable="true"
-                    android:padding="@dimen/single_metadata_explore_section_button_padding"
-                    android:src="@drawable/ic_explore_24px"
-                    android:visibility="gone" />
-            </FrameLayout>
-
-            <!-- Wraps the attribution section. -->
-            <RelativeLayout
-                android:id="@id/lock_wallpaper_attribution_section"
-                android:layout_width="match_parent"
-                android:layout_height="@dimen/both_metadata_attribution_section_height"
-                android:layout_marginEnd="@dimen/single_metadata_pane_attributions_margin_right"
-                android:layout_marginStart="@dimen/single_metadata_pane_attributions_margin_left"
-                android:paddingBottom="@dimen/single_metadata_pane_wallpaper_subtitle_margin_bottom"
-                android:focusable="true">
-
-
-
-                <TextView
-                    android:id="@+id/lock_wallpaper_label"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_gravity="start|top"
-                    android:layout_alignParentTop="true"
-                    android:layout_alignParentStart="true"
-                    android:layout_marginTop="@dimen/single_metadata_pane_wallpaper_label_margin_top"
-                    android:gravity="top"
-                    android:text="@string/lock_screen_message"
-                    android:textAppearance="@style/TitleTextAppearance"
-                    android:textColor="@color/currently_set_presentation_mode_text_color"
-                    android:maxLines="2"
-                    android:ellipsize="end"
-                    android:textSize="@dimen/abc_text_size_subhead_material"
-                    android:textStyle="bold" />
-
-                <TextView
-                    android:id="@+id/lock_wallpaper_title"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_above="@+id/lock_wallpaper_subtitle1"
-                    android:layout_alignParentStart="true"
-                    android:ellipsize="end"
-                    android:maxLines="1"
-                    android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
-                    android:textColor="@color/currently_set_both_attribution_title_text_color"
-                    android:textSize="@dimen/both_metadata_title_text_size"
-                    android:textStyle="bold" />
-
-                <TextView
-                    android:id="@+id/lock_wallpaper_subtitle1"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_above="@+id/lock_wallpaper_subtitle2"
-                    android:layout_alignParentStart="true"
-                    android:ellipsize="end"
-                    android:maxLines="1"
-                    android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
-                    android:textColor="@color/currently_set_both_attribution_subtitle_text_color"
-                    android:textSize="@dimen/abc_text_size_caption_material" />
-
-                <TextView
-                    android:id="@+id/lock_wallpaper_subtitle2"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentBottom="true"
-                    android:layout_alignParentStart="true"
-                    android:ellipsize="end"
-                    android:maxLines="1"
-                    android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
-                    android:textColor="@color/currently_set_both_attribution_subtitle_text_color"
-                    android:textSize="@dimen/abc_text_size_caption_material" />
-
-            </RelativeLayout>
-
-        </LinearLayout>
-    </androidx.cardview.widget.CardView>
-
-    <androidx.cardview.widget.CardView
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:layout_marginHorizontal="4dp"
-        app:cardCornerRadius="?android:dialogCornerRadius"
-        app:cardElevation="@dimen/single_metadata_card_elevation"
-        app:cardMaxElevation="@dimen/single_metadata_card_elevation"
-        app:cardPreventCornerOverlap="false"
-        app:cardUseCompatPadding="true"
-        app:contentPadding="0dp">
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="vertical">
-
-            <!-- Wraps the image and the "home screen" label overlapping it. -->
-            <FrameLayout
-                android:id="@+id/home_wallpaper_section"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content">
-
-                <com.android.wallpaper.widget.WallpaperThumbnailView
-                    android:id="@+id/home_wallpaper_image"
-                    android:layout_width="match_parent"
-                    android:layout_height="@dimen/both_metadata_thumb_height"
-                    android:layout_gravity="top"
-                    android:clickable="true"
-                    android:contentDescription="@string/currently_set_home_wallpaper_thumbnail"
-                    android:focusable="true"
-                    android:foreground="?attr/selectableItemBackground"
-                    android:nextFocusForward="@+id/home_wallpaper_attribution_section" />
-
-                <ImageButton
-                    style="?attr/borderlessButtonStyle"
-                    android:id="@+id/home_wallpaper_explore_button"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_margin="@dimen/single_metadata_explore_button_margin"
-                    android:layout_gravity="top|end"
-                    android:background="@drawable/button_over_thumbnail_background"
-                    android:clickable="true"
-                    android:contentDescription="@string/explore_home_screen"
-                    android:focusable="true"
-                    android:padding="@dimen/single_metadata_explore_section_button_padding"
-                    android:src="@drawable/ic_explore_24px"
-                    android:visibility="gone" />
-
-                <FrameLayout
-                    android:id="@+id/home_wallpaper_presentation_section"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_gravity="bottom"
-                    android:padding="@dimen/both_metadata_scrim_content_bottom_margin"
-                    android:background="@drawable/presentation_mode_content_protection"
-                    android:visibility="gone">
-                    <TextView
-                        android:id="@+id/home_wallpaper_presentation_mode"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_gravity="center_vertical|start"
-                        android:gravity="start"
-                        android:textColor="@color/material_white_100"
-                        android:textSize="@dimen/abc_text_size_body_2_material"/>
-
-                    <ImageButton
-                        style="?attr/borderlessButtonStyle"
-                        android:id="@+id/skip_home_wallpaper"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_marginEnd="0dp"
-                        android:layout_gravity="center_vertical|end"
-                        android:background="@android:color/transparent"
-                        android:clickable="true"
-                        android:contentDescription="@string/refresh_daily_wallpaper_home_content_description"
-                        android:focusable="true"
-                        android:nextFocusForward="@id/home_wallpaper_image"
-                        android:padding="@dimen/single_metadata_explore_section_button_padding"
-                        android:src="@drawable/ic_refresh_24px"
-                        android:visibility="gone" />
-                </FrameLayout>
-            </FrameLayout>
-
-            <!-- Wraps the attribution section. -->
-            <RelativeLayout
-                android:id="@id/home_wallpaper_attribution_section"
-                android:layout_width="match_parent"
-                android:layout_height="@dimen/both_metadata_attribution_section_height"
-                android:layout_marginEnd="@dimen/single_metadata_pane_attributions_margin_right"
-                android:layout_marginStart="@dimen/single_metadata_pane_attributions_margin_left"
-                android:paddingBottom="@dimen/single_metadata_pane_wallpaper_subtitle_margin_bottom"
-                android:focusable="true">
-                <TextView
-                    android:id="@+id/home_wallpaper_label"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_gravity="start|top"
-                    android:gravity="top"
-                    android:layout_alignParentTop="true"
-                    android:layout_alignParentStart="true"
-                    android:layout_marginTop="@dimen/single_metadata_pane_wallpaper_label_margin_top"
-                    android:text="@string/home_screen_message"
-                    android:textAppearance="@style/TitleTextAppearance"
-                    android:textColor="@color/currently_set_presentation_mode_text_color"
-                    android:textSize="@dimen/abc_text_size_subhead_material"
-                    android:maxLines="2"
-                    android:ellipsize="end"
-                    android:textStyle="bold" />
-
-                <TextView
-                    android:id="@+id/home_wallpaper_title"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_above="@+id/home_wallpaper_subtitle1"
-                    android:layout_alignParentStart="true"
-                    android:ellipsize="end"
-                    android:maxLines="1"
-                    android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
-                    android:textColor="@color/currently_set_both_attribution_title_text_color"
-                    android:textSize="@dimen/both_metadata_title_text_size"
-                    android:textStyle="bold" />
-
-                <TextView
-                    android:id="@+id/home_wallpaper_subtitle1"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_above="@+id/home_wallpaper_subtitle2"
-                    android:layout_alignParentStart="true"
-                    android:ellipsize="end"
-                    android:maxLines="1"
-                    android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
-                    android:textColor="@color/currently_set_both_attribution_subtitle_text_color"
-                    android:textSize="@dimen/abc_text_size_caption_material" />
-
-                <TextView
-                    android:id="@+id/home_wallpaper_subtitle2"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentBottom="true"
-                    android:layout_alignParentStart="true"
-                    android:ellipsize="end"
-                    android:maxLines="1"
-                    android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
-                    android:textColor="@color/currently_set_both_attribution_subtitle_text_color"
-                    android:textSize="@dimen/abc_text_size_caption_material" />
-
-            </RelativeLayout>
-
-        </LinearLayout>
-    </androidx.cardview.widget.CardView>
-
-</LinearLayout>
diff --git a/res/layout/grid_item_category.xml b/res/layout/grid_item_category.xml
index 3953153..3aa6110 100755
--- a/res/layout/grid_item_category.xml
+++ b/res/layout/grid_item_category.xml
@@ -23,20 +23,6 @@
     android:focusable="true"
     android:orientation="vertical">
 
-    <TextView
-        android:id="@+id/category_title"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/grid_item_category_label_padding_top"
-        android:layout_marginBottom="@dimen/grid_item_category_label_padding_bottom"
-        android:background="@color/category_title_scrim_color"
-        android:ellipsize="end"
-        android:gravity="center"
-        android:maxLines="1"
-        android:minHeight="@dimen/grid_item_category_label_minimum_height"
-        android:textAppearance="@style/OptionTitleTextAppearance"
-        tools:text="Wallpaper category" />
-
     <androidx.cardview.widget.CardView
         android:id="@+id/category"
         android:layout_width="match_parent"
@@ -49,7 +35,7 @@
             android:id="@+id/image"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:background="@color/secondary_color"
+            android:background="?android:textColorSecondary"
             android:scaleType="centerCrop" />
 
         <ImageView
@@ -58,4 +44,16 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center" />
     </androidx.cardview.widget.CardView>
+
+    <TextView
+        android:id="@+id/category_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/grid_item_category_label_padding_top"
+        android:ellipsize="end"
+        android:gravity="center"
+        android:maxLines="1"
+        android:minHeight="@dimen/grid_item_category_label_minimum_height"
+        android:textAppearance="@style/OptionTitleTextAppearance"
+        tools:text="Wallpaper category" />
 </LinearLayout>
diff --git a/res/layout/grid_item_image.xml b/res/layout/grid_item_image.xml
index 45a327c..b4e2b1e 100755
--- a/res/layout/grid_item_image.xml
+++ b/res/layout/grid_item_image.xml
@@ -19,23 +19,7 @@
     android:id="@+id/tile"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:orientation="vertical"
-    android:paddingTop="@dimen/grid_item_individual_padding_top">
-
-    <TextView
-        android:id="@+id/title"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/grid_item_individual_label_padding_top"
-        android:layout_marginBottom="@dimen/grid_item_individual_label_padding_bottom"
-        android:background="@color/category_title_scrim_color"
-        android:ellipsize="end"
-        android:gravity="center"
-        android:maxLines="1"
-        android:minHeight="@dimen/grid_item_category_label_minimum_height"
-        android:textAppearance="@style/OptionTitleTextAppearance"
-        android:visibility="gone"
-        tools:text="Wallpaper" />
+    android:orientation="vertical">
 
     <androidx.cardview.widget.CardView
         android:id="@+id/wallpaper_container"
@@ -43,6 +27,7 @@
         android:layout_height="match_parent"
         android:contentDescription="@string/wallpaper_thumbnail"
         app:cardCornerRadius="?android:dialogCornerRadius"
+        app:cardBackgroundColor="@android:color/transparent"
         app:cardElevation="0dp">
 
         <RelativeLayout
@@ -54,7 +39,6 @@
                 android:id="@+id/thumbnail"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:background="@color/secondary_color"
                 android:scaleType="centerCrop" />
 
             <ImageView
@@ -63,11 +47,18 @@
                 android:layout_height="wrap_content"
                 android:layout_centerInParent="true" />
 
+            <ImageView
+                android:id="@+id/indicator_icon"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentBottom="true"
+                android:layout_alignParentEnd="true"
+                android:visibility="gone" />
+
             <FrameLayout
                 android:id="@+id/loading_indicator_container"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:background="@color/black_67_alpha"
                 android:visibility="gone">
 
                 <ProgressBar
@@ -76,20 +67,24 @@
                     android:layout_height="@dimen/tile_desktop_progress_bar_size"
                     android:layout_gravity="center"
                     android:indeterminate="true"
-                    android:indeterminateTint="@color/accent_color" />
+                    android:indeterminateTint="?android:colorAccent" />
 
             </FrameLayout>
         </RelativeLayout>
 
-        <ImageView
-            android:id="@+id/check_circle"
-            android:layout_width="@dimen/grid_item_individual_wallpaper_check_circle_size"
-            android:layout_height="@dimen/grid_item_individual_wallpaper_check_circle_size"
-            android:layout_gravity="bottom|right"
-            android:layout_marginEnd="@dimen/grid_item_individual_wallpaper_check_circle_offset"
-            android:layout_marginBottom="@dimen/grid_item_individual_wallpaper_check_circle_offset"
-            android:src="@drawable/check_circle_accent_24dp"
-            android:visibility="gone" />
-
     </androidx.cardview.widget.CardView>
+
+    <TextView
+        android:id="@+id/title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/grid_item_individual_label_padding_top"
+        android:layout_marginBottom="@dimen/grid_item_individual_label_padding_bottom"
+        android:ellipsize="end"
+        android:gravity="center"
+        android:maxLines="1"
+        android:minHeight="@dimen/grid_item_category_label_minimum_height"
+        android:textAppearance="@style/OptionTitleTextAppearance"
+        android:visibility="gone"
+        tools:text="Wallpaper" />
 </LinearLayout>
diff --git a/res/layout/grid_item_my_photos.xml b/res/layout/grid_item_my_photos.xml
index b2f93dd..e88b21e 100755
--- a/res/layout/grid_item_my_photos.xml
+++ b/res/layout/grid_item_my_photos.xml
@@ -18,11 +18,11 @@
     android:layout_height="match_parent"
     android:contentDescription="@string/wallpaper_thumbnail">
 
-    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    <RelativeLayout
         android:id="@+id/tile"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:background="@color/light_grey"
+        android:background="?android:colorSecondary"
         android:clickable="true"
         android:focusable="true"
         android:foreground="?attr/selectableItemBackground">
@@ -31,7 +31,6 @@
             android:id="@+id/thumbnail"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:background="@color/secondary_color"
             android:scaleType="centerCrop" />
 
         <ImageView
@@ -44,14 +43,14 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
-            android:background="@color/translucent_black_90_alpha"
+            android:background="?android:colorForeground"
             android:padding="@dimen/rotation_tile_desktop_label_padding">
 
             <TextView
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="@string/my_photos_category_title"
-                android:textColor="@color/material_white_100"
+                android:textColor="?android:attr/textColorPrimary"
                 android:textSize="@dimen/rotation_tile_desktop_label_text_size" />
 
         </FrameLayout>
diff --git a/res/layout/grid_item_rotation_desktop.xml b/res/layout/grid_item_rotation_desktop.xml
index 6e6df84..85a6902 100755
--- a/res/layout/grid_item_rotation_desktop.xml
+++ b/res/layout/grid_item_rotation_desktop.xml
@@ -18,7 +18,7 @@
     android:layout_height="match_parent"
     android:contentDescription="@string/wallpaper_thumbnail">
 
-    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    <FrameLayout
         android:id="@+id/tile"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
@@ -31,7 +31,6 @@
             android:id="@+id/thumbnail"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:background="@color/secondary_color"
             android:scaleType="centerCrop" />
 
         <FrameLayout
@@ -63,19 +62,10 @@
                 android:layout_height="@dimen/tile_desktop_progress_bar_size"
                 android:layout_gravity="center"
                 android:indeterminate="true"
-                android:indeterminateTint="@color/accent_color" />
+                android:indeterminateTint="?android:colorAccent" />
 
         </FrameLayout>
 
     </FrameLayout>
 
-    <ImageView
-        android:id="@+id/check_circle"
-        android:layout_width="@dimen/grid_item_individual_wallpaper_check_circle_size"
-        android:layout_height="@dimen/grid_item_individual_wallpaper_check_circle_size"
-        android:layout_marginStart="@dimen/grid_item_individual_wallpaper_check_circle_offset"
-        android:layout_marginTop="@dimen/grid_item_individual_wallpaper_check_circle_offset"
-        android:src="@drawable/check_circle_accent_24dp"
-        android:visibility="gone" />
-
 </FrameLayout>
diff --git a/res/layout/grid_item_select_wallpaper_header.xml b/res/layout/grid_item_select_wallpaper_header.xml
deleted file mode 100755
index faa3dbf..0000000
--- a/res/layout/grid_item_select_wallpaper_header.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-     Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/select_wallpaper_header"
-    android:layout_width="match_parent"
-    android:layout_height="@dimen/select_wallpaper_header_height"
-    android:layout_marginLeft="@dimen/select_wallpaper_header_margin_left"
-    android:layout_marginStart="@dimen/select_wallpaper_header_margin_left"
-    android:contentDescription="@string/select_wallpaper_label"
-    android:gravity="start|center_vertical"
-    android:text="@string/select_wallpaper_label"
-    android:textAlignment="viewStart"
-    android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"
-    android:textColor="@color/select_wallpaper_header_text_color"
-    android:textSize="@dimen/abc_text_size_subhead_material"/>
diff --git a/res/layout/grid_item_single_metadata.xml b/res/layout/grid_item_single_metadata.xml
deleted file mode 100755
index e6e970c..0000000
--- a/res/layout/grid_item_single_metadata.xml
+++ /dev/null
@@ -1,168 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-     Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/metadata"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_marginBottom="@dimen/single_metadata_pane_bottom_offset"
-    android:layout_marginEnd="@dimen/single_metadata_pane_horizontal_offset"
-    android:layout_marginLeft="@dimen/single_metadata_pane_horizontal_offset"
-    android:layout_marginRight="@dimen/single_metadata_pane_horizontal_offset"
-    android:layout_marginStart="@dimen/single_metadata_pane_horizontal_offset"
-    android:layout_marginTop="@dimen/single_metadata_pane_vertical_offset">
-
-    <androidx.cardview.widget.CardView
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/single_metadata_card_layout_height"
-        app:cardCornerRadius="?android:dialogCornerRadius"
-        app:cardElevation="@dimen/single_metadata_card_elevation"
-        app:cardMaxElevation="@dimen/single_metadata_card_elevation"
-        app:cardPreventCornerOverlap="false"
-        app:cardUseCompatPadding="true"
-        app:contentPadding="0dp">
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="horizontal">
-
-            <FrameLayout
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent">
-                <com.android.wallpaper.widget.WallpaperThumbnailView
-                    android:id="@+id/wallpaper_image"
-                    android:layout_width="@dimen/single_metadata_pane_thumb_width"
-                    android:layout_height="match_parent"
-                    android:clickable="true"
-                    android:contentDescription="@string/currently_set_wallpaper_thumbnail"
-                    android:focusable="true"
-                    android:foreground="?attr/selectableItemBackground" />
-                <ImageButton
-                    style="?attr/borderlessButtonStyle"
-                    android:id="@+id/wallpaper_explore_button_notext"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_margin="@dimen/single_metadata_explore_button_margin"
-                    android:layout_gravity="top|end"
-                    android:background="@drawable/button_over_thumbnail_background"
-                    android:clickable="true"
-                    android:contentDescription="@string/explore"
-                    android:focusable="true"
-                    android:padding="@dimen/single_metadata_explore_section_button_padding"
-                    android:src="@drawable/ic_explore_24px"
-                    android:visibility="gone" />
-            </FrameLayout>
-
-            <RelativeLayout
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:layout_marginEnd="@dimen/single_metadata_pane_attributions_margin_right"
-                android:layout_marginStart="@dimen/single_metadata_pane_attributions_margin_left"
-                android:focusable="true">
-
-                <TextView
-                    android:id="@+id/wallpaper_presentation_mode"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentTop="true"
-                    android:layout_alignParentStart="true"
-                    android:layout_marginTop="@dimen/single_metadata_pane_wallpaper_label_margin_top"
-                    android:textColor="@color/currently_set_presentation_mode_text_color"
-                    android:textSize="@dimen/abc_text_size_subhead_material"
-                    android:textAppearance="@style/TitleTextAppearance"
-                    android:textStyle="bold"
-                    android:textAlignment="viewStart"
-                    android:ellipsize="end"
-                    android:text="@string/wallpaper_destination_both"/>
-                <TextView
-                    android:id="@+id/wallpaper_presentation_mode_subtitle"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentStart="true"
-                    android:layout_below="@+id/wallpaper_presentation_mode"
-                    android:textColor="@color/currently_set_presentation_mode_text_color"
-                    android:textAlignment="viewStart"
-                    android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle"
-                    android:textStyle="italic" />
-                <ImageButton
-                    style="?attr/borderlessButtonStyle"
-                    android:id="@+id/skip_wallpaper_button"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentTop="true"
-                    android:layout_alignParentEnd="true"
-                    android:layout_marginEnd="0dp"
-                    android:layout_marginStart="@dimen/single_metadata_skip_button_margin"
-                    android:layout_marginVertical="@dimen/single_metadata_skip_button_margin"
-                    android:background="@android:color/transparent"
-                    android:clickable="true"
-                    android:contentDescription="@string/refresh_daily_wallpaper_content_description"
-                    android:focusable="true"
-                    android:padding="@dimen/single_metadata_explore_section_button_padding"
-                    android:src="@drawable/ic_refresh_24px"
-                    android:tint="@color/currently_set_presentation_mode_text_color"
-                    android:visibility="gone" />
-
-                <TextView
-                    android:id="@+id/wallpaper_title"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentStart="true"
-                    android:layout_above="@+id/wallpaper_subtitle"
-                    android:layout_marginTop="@dimen/single_metadata_pane_wallpaper_title_margin_top"
-                    android:ellipsize="end"
-                    android:maxLines="2"
-                    android:textAlignment="viewStart"
-                    android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.TextView" />
-
-                <TextView
-                    android:id="@+id/wallpaper_subtitle"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentStart="true"
-                    android:layout_above="@+id/wallpaper_subtitle2"
-                    android:layout_marginTop="@dimen/single_metadata_pane_wallpaper_subtitle_margin_top"
-                    android:ellipsize="end"
-                    android:maxLines="1"
-                    android:textAlignment="viewStart"
-                    android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
-                    android:textColor="@color/currently_set_subtitle_text_color"
-                    android:textSize="@dimen/single_metadata_pane_wallpaper_subtitle_text_size" />
-
-                <TextView
-                    android:id="@+id/wallpaper_subtitle2"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentBottom="true"
-                    android:layout_alignParentStart="true"
-                    android:layout_marginTop="@dimen/single_metadata_pane_wallpaper_subtitle_margin_top"
-                    android:layout_marginBottom="@dimen/single_metadata_pane_wallpaper_subtitle_margin_bottom"
-                    android:ellipsize="end"
-                    android:maxLines="1"
-                    android:textAlignment="viewStart"
-                    android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
-                    android:textColor="@color/currently_set_subtitle_text_color"
-                    android:textSize="@dimen/single_metadata_pane_wallpaper_subtitle_text_size" />
-
-
-            </RelativeLayout>
-
-        </LinearLayout>
-
-    </androidx.cardview.widget.CardView>
-
-</FrameLayout>
diff --git a/res/layout/lock_screen_preview.xml b/res/layout/lock_screen_preview.xml
index f625883..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/black_24_alpha">
-
-    <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/white_88_alpha"
-        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/white_88_alpha"
-        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" />
+    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/white_88_alpha"
+        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/grid_item_permission_needed.xml b/res/layout/permission_needed_layout.xml
similarity index 93%
rename from res/layout/grid_item_permission_needed.xml
rename to res/layout/permission_needed_layout.xml
index 77db88f..2a650e0 100755
--- a/res/layout/grid_item_permission_needed.xml
+++ b/res/layout/permission_needed_layout.xml
@@ -19,7 +19,7 @@
     android:background="@drawable/permission_needed_bg"
     android:orientation="vertical">
 
-    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginTop="@dimen/permissions_needed_metadata_content_margin_top"
@@ -40,7 +40,7 @@
             android:layout_marginEnd="@dimen/permissions_needed_metadata_description_margin_end"
             android:layout_marginRight="@dimen/permissions_needed_metadata_description_margin_end"
             android:text="@string/permission_needed_explanation"
-            android:textColor="@color/material_white_100"
+            android:textColor="?android:attr/textColorPrimary"
             android:textSize="@dimen/abc_text_size_body_1_material" />
     </LinearLayout>
 
@@ -54,6 +54,6 @@
         android:layout_marginRight="@dimen/permissions_needed_metadata_allow_access_button_margin_end"
         android:layout_marginTop="@dimen/permissions_needed_metadata_allow_access_button_margin_top"
         android:text="@string/permission_needed_allow_access_button_label"
-        android:textColor="@color/material_white_100" />
+        android:textColor="?android:attr/textColorPrimary" />
 
 </LinearLayout>
diff --git a/res/layout/preview_action.xml b/res/layout/preview_action.xml
deleted file mode 100644
index 9f5cc6d..0000000
--- a/res/layout/preview_action.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!-- Copyright (C) 2019 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<CheckBox
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    style="@style/ActionBarCheckboxStyle"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent"
-    android:background="?android:attr/selectableItemBackgroundBorderless"
-    android:text="@string/preview"
-    android:textAllCaps="false"
-    android:textAppearance="?android:attr/actionMenuTextAppearance"
-    android:theme="@style/PreviewCheckboxDeviceTheme"/>
\ No newline at end of file
diff --git a/res/layout/preview_customize_settings.xml b/res/layout/preview_customize_settings.xml
index 2a11495..9373705 100644
--- a/res/layout/preview_customize_settings.xml
+++ b/res/layout/preview_customize_settings.xml
@@ -23,6 +23,7 @@
     android:paddingHorizontal="@dimen/preview_attribution_pane_horizontal_padding"
     android:theme="@style/WallpaperPicker.CustomizationPaneStyle">
 
+    <!-- TODO(b/179127651): Figure out where these slices are generated to update them -->
     <androidx.slice.widget.SliceView
         android:id="@+id/settings_slice"
         android:layout_width="match_parent"
diff --git a/res/layout/preview_page_info.xml b/res/layout/preview_page_info.xml
deleted file mode 100644
index f0e4954..0000000
--- a/res/layout/preview_page_info.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
-     Copyright (C) 2019 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/page_info"
-    android:layout_height="wrap_content"
-    android:layout_width="match_parent"
-    android:orientation="vertical"
-    android:paddingHorizontal="@dimen/preview_attribution_pane_horizontal_padding"
-    android:theme="@style/WallpaperPicker.BottomPaneStyle">
-
-    <Space
-        android:id="@+id/preview_attribution_pane_title_spacer"
-        android:layout_width="0dp"
-        android:layout_height="@dimen/preview_attribution_pane_inner_spacer_height"/>
-
-    <TextView
-        android:id="@+id/preview_attribution_pane_title"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:minHeight="@dimen/preview_attribution_pane_title_height"
-        android:ellipsize="end"
-        android:forceHasOverlappingRendering="false"
-        android:gravity="center"
-        android:singleLine="true"
-        android:textAppearance="@style/TitleTextAppearance"
-        android:textColor="@color/material_white_100"/>
-
-    <TextView
-        android:id="@+id/preview_attribution_pane_subtitle1"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:minHeight="@dimen/preview_attribution_pane_author_height"
-        android:layout_marginTop="@dimen/preview_attribution_pane_author_top_margin"
-        android:forceHasOverlappingRendering="false"
-        android:gravity="center"
-        android:textAppearance="@style/SubtitleTextAppearance"
-        android:textColor="@color/material_white_100"
-        android:visibility="gone"/>
-
-    <TextView
-        android:id="@+id/preview_attribution_pane_subtitle2"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:minHeight="@dimen/preview_attribution_pane_description_height"
-        android:forceHasOverlappingRendering="false"
-        android:gravity="center_horizontal"
-        android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
-        android:textSize="12dp"
-        android:textColor="@color/material_white_100"
-        android:visibility="gone"/>
-
-    <Space
-        android:id="@+id/preview_attribution_pane_spacer"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:layout_marginTop="@dimen/preview_attribution_pane_inner_spacer_height"
-        android:layout_weight="1"/>
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="@dimen/preview_attribution_pane_button_bottom_margin"
-        android:gravity="center"
-        android:orientation="horizontal">
-
-        <Button
-            style="@style/OutlinedButtonStyle"
-            android:id="@+id/preview_attribution_pane_explore_button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="@string/explore"
-            android:visibility="gone"/>
-
-        <Space
-            android:id="@+id/spacer"
-            android:layout_width="0dp"
-            android:layout_height="0dp"
-            android:layout_weight="1"
-            android:visibility="gone"/>
-
-        <Button
-            style="@style/ButtonStyle"
-            android:id="@+id/preview_attribution_pane_set_wallpaper_button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="@string/set_wallpaper_button_text"
-            android:visibility="gone"/>
-
-    </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/preview_page_settings.xml b/res/layout/preview_page_settings.xml
deleted file mode 100644
index 4faebb6..0000000
--- a/res/layout/preview_page_settings.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!-- Copyright (C) 2019 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:gravity="center_horizontal"
-    android:layout_height="wrap_content"
-    android:layout_width="match_parent"
-    android:orientation="vertical"
-    android:paddingHorizontal="@dimen/preview_attribution_pane_horizontal_padding"
-    android:theme="@style/WallpaperPicker.BottomPaneStyle">
-
-    <androidx.slice.widget.SliceView
-        android:id="@+id/settings_slice"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"/>
-
-    <Space
-        android:id="@+id/preview_attribution_pane_spacer"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:layout_weight="1"/>
-
-    <Button
-        style="@style/ButtonStyle"
-        android:id="@+id/preview_settings_pane_set_wallpaper_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/set_wallpaper_button_text"/>
-
-</LinearLayout>
diff --git a/res/layout/preview_pager.xml b/res/layout/preview_pager.xml
index 563445d..1cffa93 100644
--- a/res/layout/preview_pager.xml
+++ b/res/layout/preview_pager.xml
@@ -26,7 +26,8 @@
         android:id="@+id/preview_viewpager"
         android:layout_width="match_parent"
         android:layout_height="0dp"
-        android:layout_weight="1"/>
+        android:layout_weight="1"
+        android:overScrollMode="never"/>
 
     <FrameLayout
         android:id="@+id/indicator_container"
@@ -56,7 +57,7 @@
                 android:layout_height="@dimen/indicator_arrow_size"
                 android:layout_gravity="center"
                 android:contentDescription="@null"
-                android:tint="@color/indicator_arrow_color"
+                android:tint="?android:attr/colorAccent"
                 android:src="@drawable/ic_arrow_back_24px" />
         </FrameLayout>
 
@@ -76,7 +77,7 @@
                 android:layout_height="@dimen/indicator_arrow_size"
                 android:layout_gravity="center"
                 android:contentDescription="@null"
-                android:tint="@color/indicator_arrow_color"
+                android:tint="?android:attr/colorAccent"
                 android:src="@drawable/ic_arrow_forward_24px" />
         </FrameLayout>
     </FrameLayout>
diff --git a/res/layout/section_header.xml b/res/layout/section_header.xml
index a0943d0..49dccbd 100644
--- a/res/layout/section_header.xml
+++ b/res/layout/section_header.xml
@@ -15,29 +15,24 @@
      limitations under the License.
 -->
 
-<com.google.android.material.appbar.AppBarLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
+<com.google.android.material.appbar.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:elevation="8dp">
+    android:background="@null"
+    app:elevation="0dp">
 
-    <androidx.appcompat.widget.Toolbar
-        style="@style/RegularToolbarStyle"
+    <Toolbar
         android:id="@+id/toolbar"
         android:layout_width="match_parent"
         android:layout_height="?android:attr/actionBarSize"
+        android:theme="?android:attr/actionBarTheme"
         android:layout_gravity="top">
         <TextView
             android:id="@+id/custom_toolbar_title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_gravity="center_horizontal"
-            android:textAppearance="@style/TitleTextAppearance"/>
-    </androidx.appcompat.widget.Toolbar>
+            android:textAppearance="@style/CollapsingToolbarTitle.Collapsed"/>
+    </Toolbar>
 
-    <FrameLayout
-        android:id="@+id/toolbar_tabs_container"
-        android:layout_height="wrap_content"
-        android:layout_width="match_parent" />
-
-</com.google.android.material.appbar.AppBarLayout>
\ No newline at end of file
+</com.google.android.material.appbar.AppBarLayout>
diff --git a/res/layout/separated_tabs.xml b/res/layout/separated_tabs.xml
new file mode 100644
index 0000000..12603e0
--- /dev/null
+++ b/res/layout/separated_tabs.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.
+-->
+<com.android.wallpaper.widget.SeparatedTabLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/separated_tabs"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/separated_tabs_height"
+    app:tabBackground="@drawable/separated_tabs_background"
+    app:tabIndicatorAnimationDuration="0"
+    app:tabIndicator="@drawable/separated_tabs_indicator_background"
+    app:tabIndicatorColor="@color/separated_tabs_indicator_color"
+    app:tabIndicatorFullWidth="true"
+    app:tabIndicatorGravity="stretch"
+    app:tabGravity="fill"
+    app:tabTextColor="@color/separated_tabs_text_color"
+    app:tabTextAppearance="@style/SeparatedTabsTextAppearance" />
diff --git a/res/layout/set_wallpaper_action.xml b/res/layout/set_wallpaper_action.xml
deleted file mode 100755
index 7e727aa..0000000
--- a/res/layout/set_wallpaper_action.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-     Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<Button xmlns:android="http://schemas.android.com/apk/res/android"
-    style="?android:attr/actionButtonStyle"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent"
-    android:textAppearance="?android:attr/actionMenuTextAppearance" />
diff --git a/res/layout/wallpaper_info_view.xml b/res/layout/wallpaper_info_view.xml
index 66b72e5..bb62ed2 100644
--- a/res/layout/wallpaper_info_view.xml
+++ b/res/layout/wallpaper_info_view.xml
@@ -18,23 +18,17 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:gravity="center_horizontal"
     android:orientation="vertical"
-    android:paddingHorizontal="@dimen/wallpaper_info_pane_horizontal_padding"
-    android:paddingTop="@dimen/wallpaper_info_pane_top_padding"
-    android:paddingBottom="@dimen/wallpaper_info_pane_bottom_padding"
+    android:padding="@dimen/wallpaper_info_pane_padding"
     android:theme="@style/WallpaperPicker.BottomPaneStyle">
 
     <TextView
         android:id="@+id/wallpaper_info_title"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:ellipsize="end"
-        android:gravity="center"
         android:lineHeight="24dp"
-        android:singleLine="true"
         android:textAppearance="@style/TitleTextAppearance"
-        android:textColor="@color/action_bar_bottom_sheet_text_color" />
+        android:textColor="?android:textColorPrimary" />
 
     <TextView
         android:id="@+id/wallpaper_info_subtitle1"
@@ -42,9 +36,8 @@
         android:layout_height="wrap_content"
         android:layout_marginTop="@dimen/wallpaper_info_pane_subtitle1_top_margin"
         android:lineHeight="20dp"
-        android:gravity="center"
-        android:textColor="@color/action_bar_bottom_sheet_text_color"
-        android:textSize="16sp"
+        android:textColor="?android:textColorTertiary"
+        android:textSize="14sp"
         android:visibility="gone" />
 
     <TextView
@@ -52,18 +45,17 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginTop="@dimen/wallpaper_info_pane_subtitle2_top_margin"
-        android:lineHeight="16dp"
-        android:gravity="center"
-        android:textColor="@color/action_bar_bottom_sheet_subtitle2_text_color"
+        android:lineHeight="20dp"
+        android:textColor="?android:textColorTertiary"
         android:textSize="14sp"
         android:visibility="gone" />
 
     <Button
         android:id="@+id/wallpaper_info_explore_button"
-        style="@style/OutlinedButtonStyle"
+        style="@style/ExploreButtonStyle"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="@dimen/wallpaper_info_pane_explore_button_top_margin"
         android:text="@string/explore"
         android:visibility="gone" />
-</com.android.wallpaper.widget.WallpaperInfoView>
\ No newline at end of file
+</com.android.wallpaper.widget.WallpaperInfoView>
diff --git a/res/layout/wallpaper_preview_card.xml b/res/layout/wallpaper_preview_card.xml
index 67bd04d..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="@color/primary_color" />
-
     <SurfaceView
         android:id="@+id/wallpaper_surface"
         android:layout_width="match_parent"
@@ -42,10 +37,12 @@
         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="@color/preview_pager_background" />
-</androidx.cardview.widget.CardView>
\ No newline at end of file
+    <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"
+        android:visibility="gone" />
+</androidx.cardview.widget.CardView>
diff --git a/res/layout/wallpaper_section_view.xml b/res/layout/wallpaper_section_view.xml
new file mode 100644
index 0000000..54fd6d8
--- /dev/null
+++ b/res/layout/wallpaper_section_view.xml
@@ -0,0 +1,84 @@
+<?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.
+-->
+<com.android.wallpaper.picker.WallpaperSectionView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingBottom="@dimen/section_bottom_padding"
+    android:paddingHorizontal="@dimen/section_horizontal_padding"
+    android:orientation="vertical">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@drawable/wallpaper_section_background"
+        android:contentDescription="@string/wallpaper_preview_card_content_description">
+
+        <!-- Width percent = 146(preview width in spec) / 364(parent width in spec) = 0.4 -->
+        <!-- The height will be determined programmatically -->
+        <include
+            android:id="@+id/lock_preview"
+            layout="@layout/wallpaper_preview_card"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_marginTop="@dimen/wallpaper_preview_margin_top"
+            app:layout_constraintEnd_toStartOf="@id/home_preview"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintWidth_percent="0.4" />
+
+        <include
+            android:id="@+id/home_preview"
+            layout="@layout/wallpaper_preview_card"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_marginTop="@dimen/wallpaper_preview_margin_top"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@id/lock_preview"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintWidth_percent="0.4" />
+
+        <include
+            android:id="@+id/permission_needed"
+            layout="@layout/permission_needed_layout"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:visibility="gone"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/home_preview" />
+
+        <Button
+            android:id="@+id/wallpaper_picker_entry"
+            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"
+            android:drawableStart="@drawable/ic_nav_wallpaper"
+            android:drawableTint="?android:attr/colorAccent"
+            android:text="@string/wallpaper_picker_entry_title"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/permission_needed" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</com.android.wallpaper.picker.WallpaperSectionView>
diff --git a/res/color/indicator_arrow_color.xml b/res/menu/individual_picker_menu.xml
similarity index 61%
copy from res/color/indicator_arrow_color.xml
copy to res/menu/individual_picker_menu.xml
index 198d002..5f4415c 100644
--- a/res/color/indicator_arrow_color.xml
+++ b/res/menu/individual_picker_menu.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-     Copyright (C) 2019 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.
@@ -14,11 +14,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
     <item
-        android:state_enabled="false"
-        android:color="@color/preview_pager_arrow_disabled" />
-    <item
-        android:state_enabled="true"
-        android:color="?android:attr/colorAccent" />
-</selector>
+        android:id="@+id/daily_rotation"
+        android:title="@string/bottom_action_bar_slideshow_wallpaper"
+        android:icon="@drawable/ic_slideshow_24dp"
+        android:iconTint="?android:textColorPrimary"
+        android:showAsAction="always"/>
+</menu>
\ No newline at end of file
diff --git a/res/menu/preview_menu.xml b/res/menu/preview_menu.xml
deleted file mode 100755
index f83560e..0000000
--- a/res/menu/preview_menu.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-     Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
-    <item android:id="@+id/preview"
-          android:checkable="true"
-          app:actionLayout="@layout/preview_action"
-          app:showAsAction="always|withText"
-          android:title="@string/preview"/>
-
-    <item
-        android:id="@+id/configure"
-        android:icon="@drawable/ic_settings"
-        app:showAsAction="ifRoom"
-        android:title="@string/configure_wallpaper"
-        android:visible="false"/>
-
-    <item
-        android:id="@+id/delete_wallpaper"
-        android:icon="@drawable/ic_delete_24px"
-        app:showAsAction="ifRoom"
-        android:title="@string/delete_live_wallpaper"
-        android:visible="false"/>
-</menu>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 34efae7..37c70df 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Tuisskerm"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Sluitskerm"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Tuis- en sluitskerm"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Stel muurpapier"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Stel as muurpapier"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Tuisskerm"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Sluitskerm"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Tuisskerm en sluitskerm"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Tuisskerm en sluitskerm"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Muurpapier met afwisselende prent"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"<xliff:g id="APP_NAME">%1$s</xliff:g> moet toegang tot jou toestel se berging hê om die huidige muurpapier hier te wys."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Muurpapiere moet toegang tot jou toestel se berging hê om die huidige muurpapier hier te wys.\n\nGaan na die Toestemmings-gedeelte van Muurpapiere se programinligting om hierdie instelling te verander."</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 1b0e681..11c6662 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"ልጣፍ አዘጋጅ"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"እንደ ልጣፍ ያቀናብሩ"</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="6967226064958263939">"መነሻ ገጽ እና ማያ ገጽ ቁልፍ"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"መነሻ እና መቆለፊያ ገጽ"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"የምስል ልጣፍን በማሽከርከር ላይ"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"የአሁኑን ልጣፍ ለማሳየት <xliff:g id="APP_NAME">%1$s</xliff:g> የመሣሪያዎ ማከማቻ መዳረሻ ያስፈልገዋል።"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"የአሁኑን ልጣፍ እዚህ ለማሳየት ልጣፎች የመሣሪያዎን ማከማቻ መድረስ አለባቸው።\n\nይህን ቅንብር ለመቀየር ወደ የልጣፎች መተግበሪያ መረጃው የፈቃዶች አካባቢ ይሂዱ።"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 166a289..10b0666 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -21,7 +21,7 @@
     <!-- no translation found for app_name (8773648973927541493) -->
     <skip />
     <string name="select_wallpaper_label" msgid="6989581259339646085">"فئات الخلفيات"</string>
-    <string name="set_wallpaper_button_text" msgid="4426286890442731310">"تعيين كخلفية"</string>
+    <string name="set_wallpaper_button_text" msgid="4426286890442731310">"ضبط كصورة خلفية"</string>
     <string name="set_wallpaper_progress_message" msgid="7986528287618716715">"جارٍ تعيين الخلفية…"</string>
     <string name="try_again" msgid="8278874823700921234">"إعادة المحاولة"</string>
     <string name="set_wallpaper_error_message" msgid="6819986999041085130">"يتعذّر تعيين الخلفية."</string>
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"تعيين كخلفية"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"ضبط كخلفية"</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="6967226064958263939">"الشاشة الرئيسية وشاشة القفل"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"الشاشة الرئيسية وشاشة القفل"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"خلفية الصور التي يتم عرضها بالتناوب"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"لعرض الخلفية الحالية هنا، يحتاج تطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> إلى الوصول إلى مساحة تخزين الجهاز."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"لعرض الخلفية الحالية هنا، يحتاج تطبيق \"الخلفيات\" إلى الدخول إلى مساحة تخزين جهازك.\n\nلتغيير هذا الإعداد، انتقل إلى \"منطقة الأذونات\" في المعلومات التي يقدّمها تطبيق \"الخلفيات\"."</string>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 29e044e..ba49311 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"ৱালপেপাৰ ছেট কৰক"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"ইয়াত ৱালপেপাৰ ছেট কৰক"</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="6967226064958263939">"গৃহ স্ক্ৰীণ আৰু লক স্ক্ৰীণ"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"গৃহ স্ক্ৰীন আৰু লক স্ক্ৰীন"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"আৱৰ্তিত প্ৰতিচ্ছবিৰ ৱালপেপাৰ"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"ইয়াত বর্তমানৰ ৱালপেপাৰখন দেখুওৱাবলৈ <xliff:g id="APP_NAME">%1$s</xliff:g>ক আপোনাৰ ডিভাইচৰ সঞ্চয়াগাৰ ব্যৱহাৰ কৰাৰ অনুমতিৰ দৰকাৰ।"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"ইয়াত বর্তমানৰ ৱালপেপাৰখন দেখুওৱাবলৈ ৱালপেপাৰ-এ আপোনাৰ ডিভাইচৰ সঞ্চয়াগাৰ ব্যৱহাৰ কৰা দৰকাৰ।\n\nএই ছেটিংটো সলনি কৰিবলৈ ৱালপেপাৰ এপৰ তথ্যৰ অন্তৰ্গত অনুমতি ক্ষেত্ৰলৈ যাওক।"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index bfb4432..4e334f6 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Əsas ekran"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Ekran kilidi"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Əsas səhifə və Kilid"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Divar kağı ayarlayın"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Divar kağızını aktiv edin"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Əsas ekran"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Ekran kilidi"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Əsas səhifə ekranı və kilid ekranı"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Əsas səhifə və kilid ekranı"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Firlanan Şəkilli Divar Kağızları"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Burada cari divar kağızını göstərmək üçün, <xliff:g id="APP_NAME">%1$s</xliff:g> cihaz yaddaşına giriş tələb edir."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Cari divar kağızını burada göstərmək üçün Divarkağızı cihaz yaddaşına giriş tələb edir.\n\nBu ayarı dəyişmək üçün Divarkağızı tətbiqində İcazələr bölməsinə daxil olun."</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 96fbf05..ed43ea2 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Početni ekran"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Zaključan ekran"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Početni i zaključani ekran"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Podesite pozadinu"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Podesite pozadinu na"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Početni ekran"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Zaključan ekran"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Početni ekran i zaključani ekran"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Početni i zaključani ekran"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Rotirajuća pozadina sa slikom"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Da bi se aktuelna pozadina prikazivala ovde, aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> treba da ima pristup memorijskom prostoru na uređaju."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Da bi se aktuelna pozadina prikazivala ovde, aplikacija Pozadine mora da ima pristup memorijskom prostoru na uređaju.\n\nDa biste promenili ovo podešavanje, idite u odeljak Dozvole u informacijama o aplikaciji Pozadine."</string>
@@ -44,7 +44,7 @@
     <string name="daily_refresh_tile_title" msgid="3270456074558525091">"Dnevna pozadina"</string>
     <string name="daily_refresh_tile_subtitle" msgid="3976682014885446443">"Dodirnite da biste uključili"</string>
     <string name="start_rotation_dialog_body_live_wallpaper_needed" msgid="5132580257563846082">"Pozadina se automatski menja svaki dan. Da biste dovršili podešavanje, dodirnite &lt;strong&gt;Podesi pozadinu&lt;/strong&gt; na sledećem ekranu."</string>
-    <string name="start_rotation_dialog_wifi_only_option_message" msgid="3126269859713666225">"Preuzimaj buduće pozadine samo preko Wi-Fi mreže"</string>
+    <string name="start_rotation_dialog_wifi_only_option_message" msgid="3126269859713666225">"Preuzimaj buduće pozadine samo preko WiFi mreže"</string>
     <string name="start_rotation_dialog_continue" msgid="276678987852274872">"Nastavi"</string>
     <string name="start_rotation_progress_message" msgid="7872623873682262083">"Preuzima se prva pozadina…"</string>
     <string name="start_rotation_error_message" msgid="3053799836719618972">"Preuzimanje prve pozadine nije uspelo. Proverite podešavanja mreže i probajte ponovo."</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 99af4c8..e218462 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"Усталяваць як шпалеры"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Задаць у якасці шпалер"</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="6967226064958263939">"Галоўны экран і экран блакіроўкі"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Галоўны экран і экран блакіроўкі"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Рэгулярная змена шпалер"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Каб паглядзець бягучыя шпалеры тут, дайце праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ да сховішча прылады."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Каб паглядзець бягучыя шпалеры тут, дайце праграме \"Шпалеры\" доступ да сховішча прылады.\n\nЗакрыць доступ можна, перайшоўшы ў \"Налады &gt; Праграмы &gt; Шпалеры &gt; Дазволы\"."</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 97c6ee3..1e087e5 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"Задаване на тапет"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Задаване на тапет на"</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="6967226064958263939">"Начален и заключен екран"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Начален и заключен екран"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Тапет с редуващи се изображения"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"За да се покаже тук текущият тапет, <xliff:g id="APP_NAME">%1$s</xliff:g> се нуждае от достъп до хранилището на устройството ви."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"За да се покаже тук текущият тапет, приложението Google Wallpapers се нуждае от достъп до хранилището на устройството ви.\n\nЗа да промените тази настройка, отворете областта с разрешения от информацията за приложението."</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 15f19e3..c0fd9b6 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"ওয়ালপেপার সেট করুন"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"ওয়ালপেপার সেট করুন"</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="6967226064958263939">"হোম স্ক্রিন ও লক স্ক্রিন"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"হোম ও লক স্ক্রিন"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"নির্দিষ্ট সময় অন্তর একই ছবি দেখানোর ওয়ালপেপার"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"বর্তমানে বেছে নেওয়া ওয়ালপেপারটি এখানে ডিসপ্লে করার জন্য <xliff:g id="APP_NAME">%1$s</xliff:g>-কে আপনার ডিভাইসের স্টোরেজে অ্যাক্সেস দিতে হবে।"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"বর্তমান ওয়ালপেপারটি এখানে দেখাতে হলে ওয়ালপেপার অ্যাপটিকে আপনার ডিভাইসের স্টোরেজে অ্যাক্সেস দিতে হবে।\n\nএই সেটিংটি পরিবর্তন করতে ওয়ালপেপার অ্যাপের তথ্যের পৃষ্ঠায় \'অনুমতি\' বিভাগে যান।"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index c813e77..5d8ff9f 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Početni ekran"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Zaključavanje ekrana"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Početni i zaključani ekran"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Postavi pozadinsku sliku"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Postavite pozadinsku sliku na"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Početni ekran"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Zaključavanje ekrana"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Početni ekran i zaključavanje ekrana"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Početni i zaključani ekran"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Smjenjivanje pozadinskih slika"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Da ovdje prikažete trenutne pozadinske slike, aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> treba pristup pohrani na vašem uređaju."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Da ovdje prikažete trenutne pozadinske slike, aplikaciji Pozadinske slike treba pristup pohrani na vašem uređaju.\n\nZa promjenu postavke, u informacijama o aplikaciji Pozadinske slike idite u odjeljak Odobrenja."</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 6518a87..5c1139a 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Pantalla d\'inici"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Pantalla de bloqueig"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Pantalla d\'inici i de bloqueig"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Estableix el fons de pantalla"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Estableix un fons de pantalla a"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Pantalla d\'inici"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Pantalla de bloqueig"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Pantalla d\'inici i pantalla de bloqueig"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Pantalla d\'inici i de bloqueig"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Fons de pantalla amb una imatge rotativa"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Per mostrar el fons de pantalla actual, <xliff:g id="APP_NAME">%1$s</xliff:g> necessita accedir a l\'emmagatzematge del teu dispositiu."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Per mostrar el fons de pantalla actual, l\'aplicació Fons de pantalla necessita accedir a l\'emmagatzematge del dispositiu.\n\nPots canviar aquesta opció de configuració a l\'apartat Permisos de la informació de l\'aplicació."</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 1dbf0f8..81e606f 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Plocha"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Obrazovka uzamčení"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Plocha a uzamknutí"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Nastavení tapety"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Nastavení tapety"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Plocha"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Obrazovka uzamčení"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Plocha a obrazovka uzamčení"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Plocha a obrazovka uzamčení"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Střídající se obrázková tapeta"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Chcete-li zde zobrazit aktuální tapetu, aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> potřebuje přístup k úložišti v zařízení."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Aby aplikace Tapety mohla zobrazit aktuální tapetu, potřebuje přístup k úložišti v zařízení.\n\nChcete-li toto nastavení změnit, v informacích o aplikaci Tapety přejděte do sekce Oprávnění."</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 6b3b32a..0efbc9b 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Startskærm"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Låseskærm"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Start- og låseskærm"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Angiv baggrund"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Angiv som baggrund på"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Startskærm"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Låseskærm"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Startskærm og låseskærm"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Start- og låseskærm"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Baggrund med skiftende billeder"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"<xliff:g id="APP_NAME">%1$s</xliff:g> have adgang til enhedens lager for at kunne vise den aktuelle baggrund her."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Baggrunde skal have adgang til din enheds lager for at vise den aktuelle baggrund her.\n\nDu kan ændre denne indstilling ved at gå til Tilladelser under oplysninger om appen Baggrunde."</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 40aa64a..4bdd8f2 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Startbildschirm"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Sperrbildschirm"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Startbildschirm &amp; Sperrbildschirm"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Als Hintergrund festlegen"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Als Hintergrund festlegen"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Startbildschirm"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Sperrbildschirm"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Start- und Sperrbildschirm"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Start- und Sperrbildschirm"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Hintergrund mit rotierenden Bildern"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Um den aktuellen Hintergrund hier einzublenden, benötigt <xliff:g id="APP_NAME">%1$s</xliff:g> Zugriff auf den Speicher deines Geräts."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Um den aktuellen Hintergrund hier anzuzeigen, benötigt die App \"Hintergründe\" Zugriff zu deinem Gerätespeicher.\n\nGehe auf der Seite \"Informationen zur App\" zum Bereich \"Berechtigungen\", um diese Einstellung zu ändern."</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 98a3468..cf1df9e 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"Ορισμός ταπετσαρίας"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Ρύθμιση ταπετσαρίας σε"</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="6967226064958263939">"Αρχική οθόνη και κλείδωμα οθόνης"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Αρχική οθόνη και οθόνη κλειδώματος"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Ταπετσαρία περιστρεφόμενης εικόνας"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Προκειμένου να εμφανιστεί η τρέχουσα ταπετσαρία εδώ, η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> θα πρέπει να έχει πρόσβαση στον αποθηκευτικό χώρο της συσκευής σας."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Προκειμένου να εμφανιστεί η τρέχουσα ταπετσαρία εδώ, η εφαρμογή \"Ταπετσαρίες\" θα πρέπει να έχει πρόσβαση στον αποθηκευτικό χώρο της συσκευής σας.\n\nΓια να αλλάξετε αυτήν τη ρύθμιση, μεταβείτε στην περιοχή \"Άδειες\" της εφαρμογής \"Ταπετσαρίες\"."</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 4313b9f..d96b025 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Home screen"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Lock screen"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Home &amp; Lock"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Set wallpaper"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Set wallpaper on"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Home screen"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Lock screen"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Home screen and lock screen"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Home and lock screen"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Rotating Image Wallpaper"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"To display the current wallpaper here, <xliff:g id="APP_NAME">%1$s</xliff:g> needs access to your device\'s storage."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"To display the current wallpaper here, Wallpapers needs access to your device’s storage.\n\nTo change this setting, go to the Permissions area of the Wallpapers’ app info."</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 4313b9f..d96b025 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Home screen"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Lock screen"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Home &amp; Lock"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Set wallpaper"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Set wallpaper on"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Home screen"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Lock screen"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Home screen and lock screen"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Home and lock screen"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Rotating Image Wallpaper"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"To display the current wallpaper here, <xliff:g id="APP_NAME">%1$s</xliff:g> needs access to your device\'s storage."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"To display the current wallpaper here, Wallpapers needs access to your device’s storage.\n\nTo change this setting, go to the Permissions area of the Wallpapers’ app info."</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 4313b9f..d96b025 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Home screen"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Lock screen"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Home &amp; Lock"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Set wallpaper"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Set wallpaper on"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Home screen"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Lock screen"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Home screen and lock screen"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Home and lock screen"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Rotating Image Wallpaper"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"To display the current wallpaper here, <xliff:g id="APP_NAME">%1$s</xliff:g> needs access to your device\'s storage."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"To display the current wallpaper here, Wallpapers needs access to your device’s storage.\n\nTo change this setting, go to the Permissions area of the Wallpapers’ app info."</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 4313b9f..d96b025 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Home screen"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Lock screen"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Home &amp; Lock"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Set wallpaper"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Set wallpaper on"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Home screen"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Lock screen"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Home screen and lock screen"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Home and lock screen"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Rotating Image Wallpaper"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"To display the current wallpaper here, <xliff:g id="APP_NAME">%1$s</xliff:g> needs access to your device\'s storage."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"To display the current wallpaper here, Wallpapers needs access to your device’s storage.\n\nTo change this setting, go to the Permissions area of the Wallpapers’ app info."</string>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index 2144ec1..961db68 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‏‎‏‏‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‎Home screen‎‏‎‎‏‎"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‏‎‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‏‏‎‏‏‎‎‎‎‎‎‏‎‎‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‎‏‎Lock screen‎‏‎‎‏‎"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‎‎‏‎‏‏‎‎‏‏‎‎‏‎‏‎‏‏‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎Home &amp; Lock‎‏‎‎‏‎"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‎‏‎‏‎‏‏‏‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‏‎‎‏‎‏‏‎‏‏‎‏‎‏‏‏‏‎‎‏‎Set wallpaper‎‏‎‎‏‎"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‏‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎‏‎‏‎‏‎‎‎Set wallpaper on‎‏‎‎‏‎"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‏‎‏‎‏‎‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‏‎‏‎‏‎‎Home screen‎‏‎‎‏‎"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‎‎‏‎‏‎‎‎‎‏‏‎‏‎‎‎‏‎‎‏‎‏‎‏‎‏‎‏‎‎‎‏‎‎‏‏‎‏‎‏‎‎‏‎‎‏‎‏‏‎‎‏‎Lock screen‎‏‎‎‏‎"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‎‎‎‎‏‎‎‎‏‏‏‏‎‎‏‏‎‎‎‏‎‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‏‎‎‎‎‎‏‏‎Home screen and lock screen‎‏‎‎‏‎"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‎‎‏‏‎‎‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎‎‎‎Home and lock screen‎‏‎‎‏‎"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‏‎‏‏‎‏‏‎‎‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‎‏‏‎‏‎‏‎‎‎‎‏‎‏‏‏‎‎‏‏‎Rotating Image Wallpaper‎‏‎‎‏‎"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‏‏‏‎‎‎‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‏‎‏‎‏‏‎‏‎‎‎‎‏‏‏‎To display the current wallpaper here, ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ needs access to your device\'s storage.‎‏‎‎‏‎"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‏‎‎‏‏‎‏‎‎‎‎‎‏‎‏‏‎‎‎‎‎‎‏‎‎‎‏‎‎‏‎‎‎‏‏‎‏‎‎‏‎‎‎‎‏‎‎‏‏‏‎‎‏‎To display the current wallpaper here, Wallpapers needs access to your device’s storage.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎To change this setting, go to the Permissions area of Wallpapers’ app info.‎‏‎‎‏‎"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index bb14b25..249a162 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Pantalla principal"</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="6114951028768599417">"Definir como fondo de pantalla"</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 bloqueada"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Pantalla principal y 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>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Para mostrar el fondo de pantalla actual aquí, Fondos de pantalla necesita acceso al almacenamiento de tu dispositivo.\n\nPara cambiar esta configuración, ve al área de Permisos en la información de la app de Fondos de pantalla."</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index e343d82..3eabae8 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Pantalla de inicio"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Pantalla de bloqueo"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Inicio y bloqueo"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Establecer fondo de pantalla"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Elegir fondo de pantalla"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Pantalla de inicio"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Pantalla de bloqueo"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Pantalla de inicio y de bloqueo"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Pantallas de inicio y de bloqueo"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Fondo de pantalla de imagen cambiante"</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 acceder al almacenamiento de tu dispositivo."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Para mostrar el fondo de pantalla actual, la aplicación Fondos de pantalla necesita acceder al almacenamiento del dispositivo.\n\nPara cambiar esta opción, accede al área Permisos de la información de la aplicación."</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 7ed36e7..012ce9d 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Avaekraan"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Lukustuskuva"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Avaekraan ja lukustuskuva"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Taustapildi määramine"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Määra taustapildiks:"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Avaekraan"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Lukustuskuva"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Avaekraan ja lukustuskuva"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Ava- ja lukustuskuva"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Vahelduva kujutisega taustapilt"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Kui soovite praeguse taustapildi kuvada siin, vajab rakendus <xliff:g id="APP_NAME">%1$s</xliff:g> juurdepääsu teie seadme salvestusruumile."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Kui soovite praeguse taustapildi kuvada siin, vajab rakendus Taustapildid juurdepääsu teie seadme salvestusruumile.\n\nSelle seade muutmiseks avage rakenduse Taustapildid teabe juures jaotis Load."</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 2f41165..f3349af 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -32,13 +32,13 @@
     <string name="home_screen_message" msgid="106444102822522813">"Hasierako pantaila"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Pantaila blokeatua"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Hasieran + pantaila blokeatuan"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Ezarri horma-papera"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Ezarri horma-papera"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Hasierako pantaila"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Pantaila blokeatua"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Hasierako pantaila eta pantaila blokeatua"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Hasierako pantaila eta pantaila blokeatua"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Txandakako irudidun horma-papera"</string>
-    <string name="permission_needed_explanation" msgid="139166837541426823">"Uneko horma-papera hemen bistaratzeko, zure gailuaren memoria atzitu behar du <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak."</string>
-    <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Uneko horma-papera hemen ager dadin, gailuaren memoriarako sarbidea behar du Horma-paperak aplikazioak.\n\nEzarpena aldatzeko, joan Horma-paperak aplikazioaren informazioko Baimenak atalera."</string>
+    <string name="permission_needed_explanation" msgid="139166837541426823">"Oraingo horma-papera hemen bistaratzeko, zure gailuaren memoria atzitu behar du <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak."</string>
+    <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Oraingo horma-papera hemen ager dadin, gailuaren memoriarako sarbidea behar du Horma-paperak aplikazioak.\n\nEzarpena aldatzeko, joan Horma-paperak aplikazioaren informazioko Baimenak atalera."</string>
     <string name="permission_needed_allow_access_button_label" msgid="1943133660612924306">"Eman baimena"</string>
     <string name="no_backup_image_wallpaper_description" msgid="8303268619408738057">"Txandakako irudietarako horma-paper dinamikoen zerbitzua"</string>
     <string name="daily_refresh_tile_title" msgid="3270456074558525091">"Eguneko horma-papera"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index a2ad653..b995635 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"تنظیم کاغذدیواری"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"تنظیم کاغذدیواری برای"</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="6967226064958263939">"صفحه اصلی و صفحه قفل"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"صفحه اصلی و صفحه قفل"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"کاغذ‌دیواری با تصویر چرخشی"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"برای نمایش کاغذدیواری فعلی در اینجا، <xliff:g id="APP_NAME">%1$s</xliff:g> باید به حافظه دستگاهتان دسترسی داشته باشد."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"‏برای اینکه کاغذدیواری کنونی اینجا نمایش داده شود، Wallpapers باید به حافظه دستگاهتان دسترسی داشته باشد.\n\nبرای تغییر این تنظیم، به بخش «مجوزها»ی اطلاعات برنامه Wallpapers بروید."</string>
@@ -43,7 +43,7 @@
     <string name="no_backup_image_wallpaper_description" msgid="8303268619408738057">"سرویس کاغذ‌دیواری پویا برای کاغذدیواری‌های چرخشی"</string>
     <string name="daily_refresh_tile_title" msgid="3270456074558525091">"کاغذ‌دیواری روزانه"</string>
     <string name="daily_refresh_tile_subtitle" msgid="3976682014885446443">"برای روشن کردن، ضربه بزنید"</string>
-    <string name="start_rotation_dialog_body_live_wallpaper_needed" msgid="5132580257563846082">"‏کاغذ‌دیواری هر روز به‌طور خودکار تغییر خواهد کرد. برای اتمام راه‌اندازی، روی &lt;strong&gt;تنظیم کاغذدیواری &lt;/strong&gt; در صفحه بعدی ضربه بزنید."</string>
+    <string name="start_rotation_dialog_body_live_wallpaper_needed" msgid="5132580257563846082">"‏کاغذ‌دیواری هر روز به‌طور خودکار تغییر خواهد کرد. برای اتمام راه‌اندازی، روی &lt;strong&gt;تنظیم کاغذدیواری &lt;/strong&gt; در صفحه بعد ضربه بزنید."</string>
     <string name="start_rotation_dialog_wifi_only_option_message" msgid="3126269859713666225">"‏کاغذ‌دیواری‌های بعدی فقط ازطریق Wi-Fi بارگیری شود"</string>
     <string name="start_rotation_dialog_continue" msgid="276678987852274872">"ادامه"</string>
     <string name="start_rotation_progress_message" msgid="7872623873682262083">"درحال بارگیری اولین کاغذ‌دیواری..."</string>
@@ -92,6 +92,6 @@
     <string name="next_page_content_description" msgid="6268461446679584152">"بعدی"</string>
     <string name="previous_page_content_description" msgid="1138597031571078429">"قبلی"</string>
     <string name="wallpaper_title" msgid="6754214682228331092">"کاغذدیواری"</string>
-    <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"پیش‌نمایش کاغذدیواری"</string>
+    <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"پیش‌نمای کاغذدیواری"</string>
     <string name="collection_not_exist_msg" msgid="3504852962885064842">"مجموعه وجود ندارد"</string>
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index ad8bd1d..4d9c0a0 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Aloitusnäyttö"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Lukitusnäyttö"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Aloitus- ja lukitusnäyttö"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Aseta taustakuva"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Ota taustakuva käyttöön"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Aloitusnäyttö"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Lukitusnäyttö"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Aloitusnäyttö ja lukitusnäyttö"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Aloitusnäyttö ja lukitusnäyttö"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Vaihtuva taustakuva"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"<xliff:g id="APP_NAME">%1$s</xliff:g> tarvitsee laitteen tallennustilan käyttöoikeuden, jotta nykyinen taustakuva voidaan näyttää tässä."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Jotta Taustakuvat voi näyttää nykyisen taustakuvan tässä, se tarvitsee laitteesi tallennustilan käyttöoikeuden.\n\nVoit muokata tätä asetusta Taustakuvien sovellustiedoissa olevassa käyttöoikeusosiossa."</string>
@@ -70,8 +70,8 @@
     <string name="on_device_wallpapers_category_title_desktop" msgid="316919420410065369">"Laitteella"</string>
     <string name="on_device_wallpaper_title" msgid="5262564748034629524">"Android-taustakuva"</string>
     <string name="live_wallpapers_category_title" msgid="1814374812192366349">"Live-taustakuvat"</string>
-    <string name="my_photos_category_title" msgid="4294567122144565273">"Omat valokuvat"</string>
-    <string name="my_photos_generic_wallpaper_title" msgid="7002867526154631172">"Oma valokuva"</string>
+    <string name="my_photos_category_title" msgid="4294567122144565273">"Omat kuvat"</string>
+    <string name="my_photos_generic_wallpaper_title" msgid="7002867526154631172">"Oma kuva"</string>
     <string name="fallback_wallpaper_title" msgid="6154655421012506001">"Taustakuva"</string>
     <string name="app_not_found" msgid="4431461707854088231">"Sovellusta ei ole asennettu."</string>
     <string name="center_wallpaper_position" msgid="4166894762352288883">"Keskusta"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index fd32602..576714c 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Écran d\'accueil"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Écran de verrouillage"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Écr. d\'accueil et de verrouill."</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Sélectionner"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Définir comme fond d\'écran"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Écran d\'accueil"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Écran de verrouillage"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Écran d\'accueil et écran de verrouillage"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Écran d\'accueil et écran de verrouillage"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Rotation de l\'image de fond d\'écran"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Pour afficher le fond d\'écran actuel ici, <xliff:g id="APP_NAME">%1$s</xliff:g> a besoin d\'accéder au répertoire de stockage de votre appareil."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Pour afficher le fond d\'écran actuel ici, l\'application Fonds d\'écran doit pouvoir accéder au répertoire de stockage de l\'appareil.\n\nPour modifier ce réglage, accédez à la section Autorisations de l\'application."</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index fa92a24..ffe0f76 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Écran d\'accueil"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Écran de verrouillage"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Accueil et verrouillage"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Définir comme fond d\'écran"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Définir comme fond d\'écran"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Écran d\'accueil"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Écran de verrouillage"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Écran d\'accueil et écran de verrouillage"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Écrans d\'accueil et de verrouillage"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Fond d\'écran avec rotation d\'images"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Pour afficher le fond d\'écran actuel ici, <xliff:g id="APP_NAME">%1$s</xliff:g> doit accéder à l\'espace de stockage de votre appareil."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Pour afficher le fond d\'écran actuel, l\'application Wallpapers doit pouvoir accéder à l\'espace de stockage de votre appareil.\n\nPour modifier ce paramètre, accédez à la section \"Autorisations\" des informations sur l\'application Wallpapers."</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index a61b3cb..2600075 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Pantalla de inicio"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Pantalla de bloqueo"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Pantallas de inicio e bloqueo"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Establecer fondo de pantalla"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Definir como fondo de pantalla en:"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Pantalla de inicio"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Pantalla de bloqueo"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Pantalla de inicio e pantalla de bloqueo"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Pantalla de inicio e pantalla de bloqueo"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Fondo de pantalla con imaxes que rotan"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Para mostrar aquí o fondo de pantalla actual, <xliff:g id="APP_NAME">%1$s</xliff:g> necesita acceso ao almacenamento do dispositivo."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Para mostrar aquí o fondo de pantalla actual, a aplicación Fondos de pantalla necesita acceso ao almacenamento do dispositivo.\n\nPara cambiar esta opción de configuración, accede á área de permisos de información da aplicación Fondos de pantalla."</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index b7e3791..491df07 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"વૉલપેપર સેટ કરો"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"આના પર વૉલપેપર સેટ કરો"</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="6967226064958263939">"હોમ સ્ક્રીન અને લૉક સ્ક્રીન"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"હોમ સ્ક્રીન અને લૉક સ્ક્રીન"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"સતત બદલાતા રહેતા છબી વૉલપેપર"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"વર્તમાન વૉલપેપરને અહીં પ્રદર્શિત કરવા માટે, <xliff:g id="APP_NAME">%1$s</xliff:g>ને તમારા ઉપકરણના સ્ટોરેજનો ઍક્સેસ જરૂરી છે."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"વર્તમાન વૉલપેપરને અહીં પ્રદર્શિત કરવા માટે, વૉલપેપરને તમારા ઉપકરણના સ્ટોરેજનો ઍક્સેસ જરૂરી છે.\n\nઆ સેટિંગ બદલવા માટે, વૉલપેપર ઍપની માહિતીના પરવાનગીઓ વિભાગમાં જાઓ."</string>
@@ -43,12 +43,12 @@
     <string name="no_backup_image_wallpaper_description" msgid="8303268619408738057">"સતત બદલાતા રહેતા વૉલપેપર માટે લાઇવ વૉલપેપર સેવા"</string>
     <string name="daily_refresh_tile_title" msgid="3270456074558525091">"દૈનિક વૉલપેપર"</string>
     <string name="daily_refresh_tile_subtitle" msgid="3976682014885446443">"ચાલુ કરવા માટે ટૅપ કરો"</string>
-    <string name="start_rotation_dialog_body_live_wallpaper_needed" msgid="5132580257563846082">"વૉલપેપર દરરોજ આપમેળે બદલાશે. સેટઅપ પૂર્ણ કરવા માટે, આગલી સ્ક્રીન પર &lt;strong&gt;વૉલપેપર સેટ કરો&lt;/strong&gt; પર ટૅપ કરો."</string>
+    <string name="start_rotation_dialog_body_live_wallpaper_needed" msgid="5132580257563846082">"વૉલપેપર દરરોજ ઑટોમૅટિક રીતે બદલાશે. સેટઅપ પૂર્ણ કરવા માટે, આગલી સ્ક્રીન પર &lt;strong&gt;વૉલપેપર સેટ કરો&lt;/strong&gt; પર ટૅપ કરો."</string>
     <string name="start_rotation_dialog_wifi_only_option_message" msgid="3126269859713666225">"ભવિષ્યમાં માત્ર વાઇ-ફાઇ પર વૉલપેપર ડાઉનલોડ કરજો"</string>
     <string name="start_rotation_dialog_continue" msgid="276678987852274872">"આગળ વધો"</string>
     <string name="start_rotation_progress_message" msgid="7872623873682262083">"પ્રથમ વૉલપેપર ડાઉનલોડ કરી રહ્યાં છીએ…"</string>
     <string name="start_rotation_error_message" msgid="3053799836719618972">"પ્રથમ વૉલપેપર ડાઉનલોડ કરવામાં અસમર્થ રહ્યાં. કૃપા કરીને તમારી નેટવર્ક સેટિંગ ચેક કરો અને ફરી પ્રયાસ કરો."</string>
-    <string name="start_rotation_dialog_body" msgid="7903554799046364916">"વૉલપેપર દરરોજ આપમેળે બદલાશે"</string>
+    <string name="start_rotation_dialog_body" msgid="7903554799046364916">"વૉલપેપર દરરોજ ઑટોમૅટિક રીતે બદલાશે"</string>
     <string name="settings_button_label" msgid="8724734130079207955">"સેટિંગ"</string>
     <string name="explore" msgid="7468719504199497281">"શોધખોળ કરો"</string>
     <string name="next_wallpaper" msgid="3911873152952596232">"આગલું વૉલપેપર"</string>
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 dda9af5..6c0f15a 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"वॉलपेपर सेट करें"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"वॉलपेपर सेट करें"</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="6967226064958263939">"होम स्क्रीन और लॉक स्क्रीन"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"होम और लॉक स्क्रीन"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"तय समय के बाद बदलने वाला इमेज वॉलपेपर"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"यहां पर मौजूदा वॉलपेपर दिखाने के लिए, <xliff:g id="APP_NAME">%1$s</xliff:g> को आपके डिवाइस की मेमोरी का ऐक्सेस चाहिए."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"यहां पर मौजूदा वॉलपेपर दिखाने के लिए, वॉलपेपर को आपके डिवाइस की मेमोरी का ऐक्सेस चाहिए. \n\nवॉलपेपर ऐप्लिकेशन की जानकारी के मंज़ूरी वाले विकल्प पर जाकर आप यह सेटिंग बदल सकते हैं."</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 7fc8820..ea8ff24 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Početni zaslon"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Zaključan zaslon"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Početni i zaključan zaslon"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Postavljanje pozadine"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Postavljanje pozadine"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Početni zaslon"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Zaključan zaslon"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Početni zaslon i zaključan zaslon"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Početni i zaključani zaslon"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Pozadina s izmjenom slika"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Da bi se ovdje prikazala trenutačna pozadina, <xliff:g id="APP_NAME">%1$s</xliff:g> treba pristup pohrani vašeg uređaja."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Da bi se ovdje prikazala trenutačna pozadina, Pozadine moraju imati pristup pohrani uređaja.\n\nDa biste promijenili tu postavku, otvorite područje Dopuštenja u informacijama o aplikaciji Pozadine."</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 668f13d..742efba 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Kezdőképernyő"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Lezárási képernyő"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Kezdő- és lezárási képernyő"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Háttérkép beállítása"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Háttérkép beállítása"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Kezdőképernyő"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Lezárási képernyő"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Kezdőképernyő és lezárási képernyő"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Kezdőképernyő és lezárási képernyő"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Háttér váltakozó képpel"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Az aktuális háttérkép megjelenítéséhez a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazásnak hozzáférésre van szüksége az eszköz tárhelyéhez."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Ahhoz, hogy megjeleníthesse itt a jelenlegi háttérképet, a Háttérképek alkalmazásnak hozzá kell férnie az eszköz tárhelyéhez.\n\nA beállítás módosításához lépjen a Háttérképek alkalmazás Engedélyek szakaszához."</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 6c042bb..e3d2a07 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"Օգտագործել որպես պաստառ"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Դնել պաստառ՝"</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="6967226064958263939">"Հիմնական էկրան և կողպէկրան"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Հիմնական էկրան և կողպէկրան"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Փոխվող պատկերներով պաստառ"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Ընթացիկ պաստառն այստեղ տեսնելու համար թույլատրեք «<xliff:g id="APP_NAME">%1$s</xliff:g>» հավելվածին օգտագործել սարքի հիշողությունը։"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Ընթացիկ պաստառն այստեղ տեսնելու համար թույլատրեք «Պաստառներ» հավելվածին օգտագործել սարքի հիշողությունը:\n\nԱյս կարգավորումը փոխելու համար անցեք Կարգավորումներ &gt; Հավելվածներ &gt; Պաստառներ &gt; Թույլտվություններ։"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 1a51734..70150cb 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Layar utama"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Layar kunci"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Beranda &amp; Layar Kunci"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Setel wallpaper"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Setel wallpaper"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Layar utama"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Layar kunci"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Layar Utama dan layar kunci"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Layar utama dan layar kunci"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Memutar Wallpaper Gambar"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Untuk menampilkan wallpaper yang dipilih di sini, <xliff:g id="APP_NAME">%1$s</xliff:g> perlu akses ke penyimpanan perangkat."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Untuk menampilkan wallpaper yang saat ini digunakan di sini, Wallpaper memerlukan akses ke penyimpanan perangkat.\n\nUntuk mengubah setelan ini, buka bagian Izin pada info aplikasi Wallpaper."</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 876517d..04031ef 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Heimaskjár"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Lásskjár"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Heima- og lásskjár"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Velja veggfóður"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Velja veggfóður á"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Heimaskjár"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Lásskjár"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Heimaskjár og lásskjár"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Heima- og lásskjár"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Breytilegt veggfóður"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Til að birta núverandi veggfóður hér þarf <xliff:g id="APP_NAME">%1$s</xliff:g> aðgang að geymslu tækisins."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Veggfóður þarf að fá aðgang að geymslu tækisins þíns til að birta þetta veggfóður hér.\n\nTil að breyta þessari stillingu skaltu opna heimildir í forritsupplýsingum Veggfóðurs."</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index c838a98..8b5ce43 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Schermata Home"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Schermata di blocco"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Schermate Home e di blocco"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Imposta sfondo"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Imposta sfondo su"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Schermata Home"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Schermata di blocco"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Schermata Home e schermata di blocco"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Schermate Home e di blocco"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Sfondo di immagini a rotazione"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Per visualizzare qui lo sfondo corrente, <xliff:g id="APP_NAME">%1$s</xliff:g> deve avere accesso allo spazio di archiviazione del dispositivo."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Per visualizzare qui lo sfondo corrente, l\'app Sfondi deve avere accesso allo spazio di archiviazione del dispositivo.\n\nPer modificare questa impostazione, vai all\'area Autorizzazioni nella sezione Informazioni app di Sfondi."</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index ef79aec..d5d97e5 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"הגדרת טפט"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"הגדרת טפט עבור"</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="6967226064958263939">"מסך הבית ומסך נעילה"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"מסך הבית ומסך הנעילה"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"טפט של סבב תמונות"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"כדי להציג כאן את הטפט הנוכחי, האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> צריכה לגשת לאחסון של המכשיר."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"צריך להעניק לאפליקציית הטפטים גישה לאחסון של המכשיר כדי להציג כאן את הטפט הנוכחי.\n\nכדי לשנות את ההגדרה הזו, ניתן לעבור לקטע \'הרשאות\' בפרטים של אפליקציית הטפטים."</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 9f83264..a73f2ee 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"壁紙の設定"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"壁紙の設定"</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="6967226064958263939">"ホーム画面とロック画面"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"ホーム画面とロック画面"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"画像が切り替わる壁紙"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"現在の壁紙をここに表示するには、<xliff:g id="APP_NAME">%1$s</xliff:g>にデバイスのストレージへのアクセスを許可する必要があります。"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"現在の壁紙をここに表示するには、壁紙にデバイスのストレージへのアクセス権限を許可する必要があります。\n\nこの設定を変更するには、壁紙のアプリ情報の [権限] に移動してください。"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index b527549..09cf8ce 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"ფონის დაყენება"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"ფონის დაყენება"</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="6967226064958263939">"მთავარი ეკრანი და ჩაკეტილი ეკრანი"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"მთავარი და ჩაკეტილი ეკრანი"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"ფონი ცვალებადი სურათებით"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"ამჟამინდელი ფონის აქ საჩვენებლად <xliff:g id="APP_NAME">%1$s</xliff:g> საჭიროებს წვდომას თქვენი მოწყობილობის მეხსიერებაზე."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"ამჟამინდელი ფონის აქ საჩვენებლად Wallpapers საჭიროებს წვდომას თქვენი მოწყობილობის მეხსიერებაზე.\n\nამ პარამეტრის შესაცვლელად გადადით Wallpapers-ის აპის ინფორმაციის ნებართვების არეზე."</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 48d0911..2e8e6dc 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"Тұсқағаз етіп орнату"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Тұсқағаз ретінде орнату"</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="6967226064958263939">"Негізгі экран және құлыпталған экран"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Негізгі экран мен құлып экраны"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Тұсқағазды ауыстырып тұру"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Ағымдағы тұсқағазды көрсету үшін <xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына құрылғының жадына кіру рұқсаты қажет."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Ағымдағы тұсқағаз осы жерге шығуы үшін, \"Тұсқағаздар\" қолданбасына құрылғы жадына кіру рұқсаты қажет.\n\nБұл параметрді осы қолданба ақпаратындағы \"Рұқсаттар\" бөлімінен өзгертуге болады."</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 25debf9..aac84ab 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"កំណត់​ផ្ទាំង​រូបភាព"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"កំណត់​ផ្ទាំងរូបភាព​នៅលើ"</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="6967226064958263939">"អេក្រង់ដើម និង​អេក្រង់​ចាក់សោ"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"អេក្រង់ដើម និង​អេក្រង់​ចាក់សោ"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"បង្វិលផ្ទាំងរូបភាពបែបរូបភាព"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"ដើម្បី​បង្ហាញ​ផ្ទាំងរូបភាព​បច្ចុប្បន្ន​នៅទីនេះ <xliff:g id="APP_NAME">%1$s</xliff:g> ត្រូវការ​សិទ្ធិចូលប្រើ​ទំហំ​ផ្ទុកឧបករណ៍​របស់អ្នក។"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"ដើម្បី​បង្ហាញ​ផ្ទាំងរូបភាព​បច្ចុប្បន្ននៅទីនេះ កម្មវិធី Wallpapers ត្រូវការសិទ្ធិចូលប្រើ​ទំហំផ្ទុក​របស់ឧបករណ៍អ្នក។\n\nដើម្បី​ផ្លាស់ប្តូរការកំណត់នេះ សូមចូលទៅកាន់ផ្នែកការអនុញ្ញាតនៃព័ត៌មានរបស់កម្មវិធី Wallpapers ។"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 232641c..d247d76 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"ವಾಲ್‌ಪೇಪರ್ ಹೊಂದಿಸಿ"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"ವಾಲ್‌ಪೇಪರ್ ಅನ್ನು ಆನ್‌ಗೆ ಹೊಂದಿಸಿ"</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="6967226064958263939">"ಮುಖಪುಟದ ಪರದೆ ಮತ್ತು ಲಾಕ್ ಪರದೆ"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"ಹೋಮ್ ಮತ್ತು ಲಾಕ್ ಸ್ಕ್ರೀನ್"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"ತಿರುಗುವ ಚಿತ್ರದ ವಾಲ್‌ಪೇಪರ್"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"ಪ್ರಸ್ತುತ ವಾಲ್ಪೇಪರ್ ಅನ್ನು ಇಲ್ಲಿ ಪ್ರದರ್ಶಿಸಲು, <xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ನಿಮ್ಮ ಸಾಧನದ ಸಂಗ್ರಹಣೆಯ ಪ್ರವೇಶದ ಅಗತ್ಯವಿದೆ."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"ಪ್ರಸ್ತುತ ಅನ್ನು ಇಲ್ಲಿ ಪ್ರದರ್ಶಿಸಲು, ವಾಲ್ಪೇಪರ್‌ಗಳಿಗೆ ನಿಮ್ಮ ಸಾಧನದ ಸಂಗ್ರಹಣೆ ಪ್ರವೇಶದ ಅಗತ್ಯವಿದೆ. \n\nಈ ಸೆಟ್ಟಿಂಗ್‌ ಅನ್ನು ಬದಯಾಯಿಸಲು, ವಾಲ್ಪೇಪರ್‌ಗಳ ಅಪ್ಲಿಕೇಶನ್‌ನ ಮಾಹಿತಿಯ ಅನುಮತಿ ಪ್ರದೇಶಕ್ಕೆ ಹೋಗಿ."</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 2be0992..8650033 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"배경화면 설정"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"배경화면으로 설정"</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="6967226064958263939">"홈 화면 및 잠금 화면"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"홈 및 잠금 화면"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"회전 이미지 배경화면"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"현재 배경화면을 여기에 표시하려면 <xliff:g id="APP_NAME">%1$s</xliff:g>에서 기기의 저장용량에 액세스할 수 있어야 합니다."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"여기에 현재 배경화면을 표시하려면 배경화면 앱에서 기기의 저장소에 액세스할 수 있어야 합니다.\n\n이 설정을 변경하려면 배경화면 앱 정보의 권한 섹션으로 이동하세요."</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 8e02782..060bf09 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"Тушкагаз орнотуу"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Тушкагазды төмөнкүгө коюу:"</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="6967226064958263939">"Башкы экран жана кулпуланган экран"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Башкы экран жана кулпуланган экран"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Алмаштырма тушкагаз сүрөтү"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Учурдагы тушкагазды бул жерден көрсөтүү үчүн <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна түзмөгүңүздүн сактагычын колдонуу мүмкүнчүлүгү керек."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Учурдагы тушкагазды бул жерден көрсөтүү үчүн Тушкагаздар колдонмосу түзмөгүңүздүн сактагычын колдонуу мүмкүнчүлүгүн алышы керек.\n\nБул жөндөөнү өзгөртүү үчүн Тушкагаздар колдонмосу жөнүндө маалыматтын \"Уруксаттар\" бөлүмүнө өтүңүз."</string>
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index 8914a12..438d4b2 100755
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -14,8 +14,6 @@
      limitations under the License.
 -->
 <resources>
-    <dimen name="metadata_tile_thumb_height">164dp</dimen>
-    <dimen name="metadata_tile_attribution_section_height">80dp</dimen>
 
     <!-- Dimensions for "permissions needed" tile. -->
     <dimen name="permissions_needed_metadata_warning_icon_margin_top">0dp</dimen>
@@ -27,5 +25,4 @@
     <dimen name="preview_page_gap">60dp</dimen>
     <dimen name="preview_page_horizontal_margin">92dp</dimen>
     <dimen name="preview_card_padding">8dp</dimen>
-    <dimen name="preview_pager_height">150dp</dimen>
 </resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index f3cbe2b..1d885fa 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"ຕັ້ງເປັນຮູບພື້ນຫຼັງ"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"ຕັ້ງຮູບພື້ນຫຼັງ"</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="6967226064958263939">"ໜ້າຈໍຫຼັກ ແລະ ໜ້າຈໍລັອກ"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"ໂຮມສະກຣີນ ແລະ ໜ້າຈໍລັອກ"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"ໝຸນຮູບພື້ນຫຼັງ"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"ເພື່ອສະແດງພາບພື້ນຫຼັງປັດຈຸບັນຢູ່ບ່ອນນີ້, <xliff:g id="APP_NAME">%1$s</xliff:g> ຕ້ອງການສິດເຂົ້າເຖິງບ່ອນຈັດເກັບຂໍ້ມູນອຸປະກອນຂອງທ່ານ."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"ເພື່ອສະແດງຮູບພື້ນຫຼັງປັດຈຸບັນຢູ່ບ່ອນນີ້, ແອັບ Wallpapers ຈະຕ້ອງໃຊ້ສິດອະນຸຍາດເຂົ້າເຖິງບ່ອນຈັດເກັບຂໍ້ມູນອຸປະກອນຂອງທ່ານກ່ອນ.\n\nເພື່ອປ່ຽນການຕັ້ງຄ່ານີ້, ໃຫ້ໄປທີ່ພື້ນທີ່ສິດອະນຸຍາດຂອງຂໍ້ມູນແອັບຂອງ Wallpapers."</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index a03226e..def2202 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Pagrindinis ekranas"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Užrakinimo ekranas"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Pagrindinis ir užrakinimo ekr."</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Nustatyti ekrano foną"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Nustatyti ekrano foną"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Pagrindinis ekranas"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Užrakinimo ekranas"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Pagrindinis ekranas ir užrakinimo ekranas"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Pagrindinis ekranas ir užrakinimo ekranas"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Kaitaliojamų vaizdų ekrano fonas"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Jei norite čia rodyti dabartinį ekrano foną, programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“ reikia galimybės pasiekti įrenginio saugyklą."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Kad galėtumėte čia rodyti dabartinį ekrano foną, programai „Ekrano fonai“ reikia galimybės pasiekti įrenginio saugyklą.\n\nJei norite pakeisti šį nustatymą, eikite į ekrano fonų programos informacijos leidimų sritį."</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index f7778a9..16dab29 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Sākuma ekrāns"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Bloķēšanas ekrāns"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Sākuma un bloķēšanas ekrāns"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Fona tapetes iestatīšana"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Fona tapetes iestatīšana:"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Sākuma ekrāns"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Bloķēšanas ekrāns"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Sākuma ekrāns un bloķēšanas ekrāns"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Sākuma ekrāns un bloķēšanas ekrāns"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Mainīgs fona tapetes attēls"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Lai šeit attēlotu pašreizējo fona tapeti, lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g> ir nepieciešama piekļuve jūsu ierīces krātuvei."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Lai šeit attēlotu pašreizējo fona tapeti, lietotnei “Fona tapetes” ir nepieciešama piekļuve jūsu ierīces krātuvei.\n\nLai mainītu šo iestatījumu, pārejiet uz lietotnes “Fona tapetes” informācijas sadaļu “Atļaujas”."</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index c4dea2f..63df2c1 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -26,16 +26,16 @@
     <string name="try_again" msgid="8278874823700921234">"Обиди се пак"</string>
     <string name="set_wallpaper_error_message" msgid="6819986999041085130">"Тапетот не може да се постави."</string>
     <string name="load_wallpaper_error_message" msgid="7913278480467707374">"Тапетот не може да се вчита. Сликата е оштетена или недостапна."</string>
-    <string name="static_wallpaper_presentation_mode_message" msgid="417940227049360906">"Моментално поставен"</string>
+    <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="lock_screen_message" msgid="1534506081955058013">"Заклучен екран"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Почетен и заклучен екран"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Поставете го тапетот"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Постави тапет"</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="6967226064958263939">"Почетен и заклучен екран"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Почетен и заклучен екран"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Тапет со ротирачки слики"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"За да го прикаже тековниот тапет тука, <xliff:g id="APP_NAME">%1$s</xliff:g> бара пристап до меморијата на уредот."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"За да го прикаже тековниот тапет тука, Wallpapers бара пристап до меморијата на уредот.\n\nЗа да ја промените поставкава, одете во областа „Дозволи“ во информациите за апликацијата Wallpapers."</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index ffef7b2..99a2ff7 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"വാൾപേപ്പർ സജ്ജീകരിക്കൂ"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"വാൾപേപ്പർ ആയി സജ്ജീകരിക്കുക"</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="6967226064958263939">"ഹോം സ്ക്രീനും ലോക്ക് സ്ക്രീനും"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"ഹോം സ്ക്രീനും ലോക്ക് സ്ക്രീനും"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"ചിത്ര വാൾപേപ്പർ തിരിക്കുന്നു"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"നിലവിലെ വാൾപേപ്പർ ഇവിടെ പ്രദർശിപ്പിക്കുന്നതിന്, <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന് നിങ്ങളുടെ ഉപകരണത്തിന്‍റെ സ്‌റ്റോറേജിലേക്ക് ആക്‌സസ് ആവശ്യമാണ്."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"നിലവിലെ വാൾപേപ്പർ ഇവിടെ പ്രദർശിപ്പിക്കുന്നതിന്, Wallpapers-ന് നിങ്ങളുടെ ഉപകരണത്തിന്റെ സ്റ്റോറേജിലേക്ക് ആക്സസ് ആവശ്യമാണ്.\n\nഈ ക്രമീകരണം മാറ്റുന്നതിന്, Wallpapers ആപ്പ് വിവരങ്ങളുടെ അനുമതികളിലേക്ക് പോവുക."</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 9d3515d..680faa6 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -17,62 +17,62 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_app_name" msgid="1719889291772891695">"Ханын зураг"</string>
+    <string name="wallpaper_app_name" msgid="1719889291772891695">"Дэлгэцийн зураг"</string>
     <!-- no translation found for app_name (8773648973927541493) -->
     <skip />
-    <string name="select_wallpaper_label" msgid="6989581259339646085">"Ханийн зургийн ангилал"</string>
-    <string name="set_wallpaper_button_text" msgid="4426286890442731310">"Ханын зураг тохируулах"</string>
-    <string name="set_wallpaper_progress_message" msgid="7986528287618716715">"Ханын зургийг тохируулж байна…"</string>
+    <string name="select_wallpaper_label" msgid="6989581259339646085">"Дэлгэцийн зургийн ангилал"</string>
+    <string name="set_wallpaper_button_text" msgid="4426286890442731310">"Дэлгэцийн зураг тохируулах"</string>
+    <string name="set_wallpaper_progress_message" msgid="7986528287618716715">"Дэлгэцийн зургийг тохируулж байна…"</string>
     <string name="try_again" msgid="8278874823700921234">"Дахин оролдох"</string>
-    <string name="set_wallpaper_error_message" msgid="6819986999041085130">"Ханын зургийг тохируулах боломжгүй байна."</string>
+    <string name="set_wallpaper_error_message" msgid="6819986999041085130">"Дэлгэцийн зургийг тохируулах боломжгүй байна."</string>
     <string name="load_wallpaper_error_message" msgid="7913278480467707374">"Дэлгэцийн зургийг ачаалах боломжгүй байна. Зураг нь гэмтэлтэй буюу эсвэл ашиглах боломжгүй байна."</string>
-    <string name="static_wallpaper_presentation_mode_message" msgid="417940227049360906">"Одоогоор тохируулсан ханын зураг"</string>
-    <string name="rotating_wallpaper_presentation_mode_message" msgid="3361676041605733288">"Өдөр тутмын ханын зураг"</string>
+    <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="lock_screen_message" msgid="1534506081955058013">"Түгжигдсэн дэлгэц"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Нүүр хуудас болон түгжээ"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Ханын зураг тохируулах"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Дараахад дэлгэцийн зураг тохируулах"</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="6967226064958263939">"Үндсэн нүүр болон түгжих дэлгэц"</string>
-    <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Ханын зургийг эргүүлж байна"</string>
-    <string name="permission_needed_explanation" msgid="139166837541426823">"Одоогийн ханын зургийг энд харуулахын тулд <xliff:g id="APP_NAME">%1$s</xliff:g> таны төхөөрөмжийн санд хандах шаардлагатай байна."</string>
-    <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Одоогийн ханын зургийг энд харуулахын тулд Ханын зураг таны төхөөрөмжийн санд хандах шаардлагатай байна.\n\nЭнэ тохиргоог өөрчлөх бол Ханын зургийн аппын мэдээллийн Зөвшөөрөл хэсэгт очно уу."</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Үндсэн нүүр болон түгжигдсэн дэлгэц"</string>
+    <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Дэлгэцийн зургийг эргүүлж байна"</string>
+    <string name="permission_needed_explanation" msgid="139166837541426823">"Одоогийн дэлгэцийн зургийг энд харуулахын тулд <xliff:g id="APP_NAME">%1$s</xliff:g> таны төхөөрөмжийн санд хандах шаардлагатай байна."</string>
+    <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Одоогийн дэлгэцийн зургийг энд харуулахын тулд Дэлгэцийн зураг таны төхөөрөмжийн санд хандах шаардлагатай байна.\n\nЭнэ тохиргоог өөрчлөх бол Дэлгэцийн зургийн аппын мэдээллийн Зөвшөөрөл хэсэгт очно уу."</string>
     <string name="permission_needed_allow_access_button_label" msgid="1943133660612924306">"Хандалтыг зөвшөөрөх"</string>
-    <string name="no_backup_image_wallpaper_description" msgid="8303268619408738057">"Ханын зургийг эргүүлэх хөдөлгөөнт ханын зургийн үйлчилгээ"</string>
-    <string name="daily_refresh_tile_title" msgid="3270456074558525091">"Өдөр тутмын ханын зураг"</string>
+    <string name="no_backup_image_wallpaper_description" msgid="8303268619408738057">"Дэлгэцийн зургийг эргүүлэх дэлгэцийн хөдөлгөөнт зургийн үйлчилгээ"</string>
+    <string name="daily_refresh_tile_title" msgid="3270456074558525091">"Өдөр тутмын дэлгэцийн зураг"</string>
     <string name="daily_refresh_tile_subtitle" msgid="3976682014885446443">"Асаахын тулд товшино уу"</string>
-    <string name="start_rotation_dialog_body_live_wallpaper_needed" msgid="5132580257563846082">"Ханын зургийг өдөр бүр автоматаар солино. Тохируулгыг дуусгахын тулд дараагийн дэлгэцийн &lt;strong&gt;Ханын зураг тохируулах&lt;/strong&gt; гэснийг товшино уу."</string>
-    <string name="start_rotation_dialog_wifi_only_option_message" msgid="3126269859713666225">"Цаашдын ханын зургийг зөвхөн Wi-Fi-р татах"</string>
+    <string name="start_rotation_dialog_body_live_wallpaper_needed" msgid="5132580257563846082">"Дэлгэцийн зургийг өдөр бүр автоматаар солино. Тохируулгыг дуусгахын тулд дараагийн дэлгэцийн &lt;strong&gt;Дэлгэцийн зураг тохируулах&lt;/strong&gt; гэснийг товшино уу."</string>
+    <string name="start_rotation_dialog_wifi_only_option_message" msgid="3126269859713666225">"Цаашдын дэлгэцийн зургийг зөвхөн Wi-Fi-р татах"</string>
     <string name="start_rotation_dialog_continue" msgid="276678987852274872">"Үргэлжлүүлэх"</string>
-    <string name="start_rotation_progress_message" msgid="7872623873682262083">"Эхний ханын зургийг татаж байна…"</string>
-    <string name="start_rotation_error_message" msgid="3053799836719618972">"Эхний ханын зургийг татах боломжгүй байна. Сүлжээний тохиргоогоо шалгаад дахин оролдоно уу."</string>
-    <string name="start_rotation_dialog_body" msgid="7903554799046364916">"Ханын зургийг өдөр бүр автоматаар солино"</string>
+    <string name="start_rotation_progress_message" msgid="7872623873682262083">"Эхний дэлгэцийн зургийг татаж байна…"</string>
+    <string name="start_rotation_error_message" msgid="3053799836719618972">"Эхний дэлгэцийн зургийг татах боломжгүй байна. Сүлжээний тохиргоогоо шалгаад дахин оролдоно уу."</string>
+    <string name="start_rotation_dialog_body" msgid="7903554799046364916">"Дэлгэцийн зургийг өдөр бүр автоматаар солино"</string>
     <string name="settings_button_label" msgid="8724734130079207955">"Тохиргоо"</string>
     <string name="explore" msgid="7468719504199497281">"Судлах"</string>
-    <string name="next_wallpaper" msgid="3911873152952596232">"Дараагийн ханын зураг"</string>
-    <string name="wallpaper_disabled_message" msgid="7309484130562148185">"Ханын зураг тохируулах тохиргоог энэ төхөөрөмжид идэвхгүй болгосон байна"</string>
-    <string name="wallpaper_disabled_by_administrator_message" msgid="1551430406714747884">"Таны төхөөрөмжийн админ ханын зураг тохируулах тохиргоог идэвхгүй болгосон байна"</string>
-    <string name="wallpaper_set_successfully_message" msgid="2958998799111688578">"Ханын зургийг амжилттай тохирууллаа"</string>
-    <string name="wallpapers_unavailable_offline_message" msgid="8136405438621689532">"Ханын зургийг харахын тулд танд интернэт холболт шаардлагатай. Интернэтэд холбогдоод дахин оролдоно уу."</string>
-    <string name="currently_set_home_wallpaper_thumbnail" msgid="4022381436821898917">"Үндсэн нүүрэнд одоогоор тохируулсан ханын зургийн өнгөц зураг"</string>
-    <string name="currently_set_lock_wallpaper_thumbnail" msgid="2094209303934569997">"Түгжих дэлгэцэд одоогоор тохируулсан ханын зургийн өнгөц зураг"</string>
-    <string name="currently_set_wallpaper_thumbnail" msgid="8651887838745545107">"Одоогоор тохируулсан ханын зургийн өнгөц зураг"</string>
-    <string name="wallpaper_thumbnail" msgid="569931475923605974">"Ханын зургийн өнгөц зураг"</string>
-    <string name="explore_home_screen" msgid="8756346794535765482">"Үндсэн нүүрийн ханын зургийг судлах"</string>
-    <string name="explore_lock_screen" msgid="268938342103703665">"Түгжих дэлгэцийн ханын зургийг судлах"</string>
-    <string name="refresh_daily_wallpaper_home_content_description" msgid="2770445044556164259">"Үндсэн нүүрийн өдөр тутмын ханын зургийг сэргээх"</string>
-    <string name="refresh_daily_wallpaper_content_description" msgid="4362142658237147583">"Өдөр тутмын ханын зургийг сэргээх"</string>
-    <string name="refreshing_daily_wallpaper_dialog_message" msgid="1975910873362855761">"Өдөр тутмын ханын зургийг сэргээж байна…"</string>
-    <string name="refresh_daily_wallpaper_failed_message" msgid="4749879993812557166">"Өдөр тутмын ханын зургийг сэргээж чадсангүй. Сүлжээний холболтоо шалгаад дахин оролдоно уу."</string>
-    <string name="on_device_wallpapers_category_title" msgid="805819102071369004">"Төхөөрөмжийн ханын зураг"</string>
+    <string name="next_wallpaper" msgid="3911873152952596232">"Дараагийн дэлгэцийн зураг"</string>
+    <string name="wallpaper_disabled_message" msgid="7309484130562148185">"Дэлгэцийн зураг тохируулах тохиргоог энэ төхөөрөмжид идэвхгүй болгосон байна"</string>
+    <string name="wallpaper_disabled_by_administrator_message" msgid="1551430406714747884">"Таны төхөөрөмжийн админ дэлгэцийн зураг тохируулах тохиргоог идэвхгүй болгосон байна"</string>
+    <string name="wallpaper_set_successfully_message" msgid="2958998799111688578">"Дэлгэцийн зургийг амжилттай тохирууллаа"</string>
+    <string name="wallpapers_unavailable_offline_message" msgid="8136405438621689532">"Дэлгэцийн зургийг харахын тулд танд интернэт холболт шаардлагатай. Интернэтэд холбогдоод дахин оролдоно уу."</string>
+    <string name="currently_set_home_wallpaper_thumbnail" msgid="4022381436821898917">"Үндсэн нүүрэнд одоогоор тохируулсан дэлгэцийн зургийн өнгөц зураг"</string>
+    <string name="currently_set_lock_wallpaper_thumbnail" msgid="2094209303934569997">"Түгжих дэлгэцэд одоогоор тохируулсан дэлгэцийн зургийн өнгөц зураг"</string>
+    <string name="currently_set_wallpaper_thumbnail" msgid="8651887838745545107">"Одоогоор тохируулсан дэлгэцийн зургийн өнгөц зураг"</string>
+    <string name="wallpaper_thumbnail" msgid="569931475923605974">"Дэлгэцийн зургийн өнгөц зураг"</string>
+    <string name="explore_home_screen" msgid="8756346794535765482">"Үндсэн нүүрийн дэлгэцийн зургийг судлах"</string>
+    <string name="explore_lock_screen" msgid="268938342103703665">"Түгжих дэлгэцийн дэлгэцийн зургийг судлах"</string>
+    <string name="refresh_daily_wallpaper_home_content_description" msgid="2770445044556164259">"Үндсэн нүүрийн өдөр тутмын дэлгэцийн зургийг сэргээх"</string>
+    <string name="refresh_daily_wallpaper_content_description" msgid="4362142658237147583">"Өдөр тутмын дэлгэцийн зургийг сэргээх"</string>
+    <string name="refreshing_daily_wallpaper_dialog_message" msgid="1975910873362855761">"Өдөр тутмын дэлгэцийн зургийг сэргээж байна…"</string>
+    <string name="refresh_daily_wallpaper_failed_message" msgid="4749879993812557166">"Өдөр тутмын дэлгэцийн зургийг сэргээж чадсангүй. Сүлжээний холболтоо шалгаад дахин оролдоно уу."</string>
+    <string name="on_device_wallpapers_category_title" msgid="805819102071369004">"Төхөөрөмжийн дэлгэцийн зураг"</string>
     <string name="on_device_wallpapers_category_title_desktop" msgid="316919420410065369">"Төхөөрөмжид хадгалсан"</string>
-    <string name="on_device_wallpaper_title" msgid="5262564748034629524">"Андройдын ханын зураг"</string>
-    <string name="live_wallpapers_category_title" msgid="1814374812192366349">"Хөдөлгөөнт ханын зураг"</string>
+    <string name="on_device_wallpaper_title" msgid="5262564748034629524">"Андройдын дэлгэцийн зураг"</string>
+    <string name="live_wallpapers_category_title" msgid="1814374812192366349">"Дэлгэцийн хөдөлгөөнт зураг"</string>
     <string name="my_photos_category_title" msgid="4294567122144565273">"Миний зураг"</string>
     <string name="my_photos_generic_wallpaper_title" msgid="7002867526154631172">"Миний зураг"</string>
-    <string name="fallback_wallpaper_title" msgid="6154655421012506001">"Ханын зураг"</string>
+    <string name="fallback_wallpaper_title" msgid="6154655421012506001">"Дэлгэцийн зураг"</string>
     <string name="app_not_found" msgid="4431461707854088231">"Аппыг суулгаагүй байна."</string>
     <string name="center_wallpaper_position" msgid="4166894762352288883">"Гол хэсэг"</string>
     <string name="center_crop_wallpaper_position" msgid="1681980019815343348">"Голлуулж тайрах"</string>
@@ -82,16 +82,16 @@
     <string name="tab_customize" msgid="2533745409174959960">"Өөрчлөх"</string>
     <string name="configure_wallpaper" msgid="849882179182976621">"Тохиргоо…"</string>
     <string name="delete_live_wallpaper" msgid="589212696102662329">"Устгах"</string>
-    <string name="delete_wallpaper_confirmation" msgid="33790318361863778">"Энэ ханын зургийг утаснаасаа устгах уу?"</string>
+    <string name="delete_wallpaper_confirmation" msgid="33790318361863778">"Энэ дэлгэцийн зургийг утаснаасаа устгах уу?"</string>
     <string name="bottom_action_bar_back" msgid="8237013112999946725">"Буцах"</string>
     <string name="bottom_action_bar_edit" msgid="1214742990893082138">"Засах"</string>
     <string name="bottom_action_bar_download" msgid="3983122338076389421">"Татах"</string>
-    <string name="bottom_action_bar_slideshow_wallpaper" msgid="509770525179533154">"Слайдаар харуулах ханын зураг"</string>
+    <string name="bottom_action_bar_slideshow_wallpaper" msgid="509770525179533154">"Слайдаар харуулах дэлгэцийн зураг"</string>
     <string name="bottom_action_bar_apply" msgid="2983308349819178932">"Хэрэгжүүлэх"</string>
     <string name="accessibility_preview_pager" msgid="1839869637405028575">"Хуудас <xliff:g id="ID_2">%2$d</xliff:g>-н <xliff:g id="ID_1">%1$d</xliff:g>"</string>
     <string name="next_page_content_description" msgid="6268461446679584152">"Дараах"</string>
     <string name="previous_page_content_description" msgid="1138597031571078429">"Өмнөх"</string>
-    <string name="wallpaper_title" msgid="6754214682228331092">"Ханын зураг"</string>
-    <string name="wallpaper_preview_card_content_description" msgid="6049261033541034584">"Ханын зургийг урьдчилан үзэх"</string>
+    <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>
 </resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index f70ede7..4ae38e8 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"वॉलपेपर सेट करा"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"वॉलपेपर सेट करा"</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="6967226064958263939">"होम स्क्रीन आणि लॉक स्क्रीन"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"होम आणि लॉक स्क्रीन"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"फिरती इमेज वॉलपेपर"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"येथे सध्याचा वॉलपेपर दाखवण्यासाठी, <xliff:g id="APP_NAME">%1$s</xliff:g> ला तुमच्या डिव्हाइसच्या स्टोरेजचा ॲक्सेस हवा आहे."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"येथे सध्याचा वॉलपेपर दाखवण्यासाठी, वॉलपेपरला तुमच्या डिव्हाइसच्या स्टोरेजचा ॲक्सेस हवा आहे.\n\nहे सेटिंग बदलण्यासाठी, वॉलपेपरच्या ॲप माहितीच्या परवानग्या भागावर जा."</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 929a694..484e4cf 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Skrin utama"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Kunci skrin"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Skrin Utama &amp; Kunci"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Tetapkan kertas dinding"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Tetapkan kertas dinding"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Skrin utama"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Kunci skrin"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Skrin utama dan kunci skrin"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Skrin utama dan skrin kunci"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Menggilirkan Kertas Dinding Imej"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Untuk memaparkan kertas dinding semasa di sini, <xliff:g id="APP_NAME">%1$s</xliff:g> memerlukan akses kepada storan peranti anda."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Untuk memaparkan kertas dinding semasa di sini, Kertas Dinding memerlukan akses kepada storan peranti anda.\n\nUntuk menukar tetapan ini, pergi ke kawasan Kebenaran bagi maklumat apl Kertas Dinding."</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 9297a26..b220147 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"နောက်ခံ သတ်မှတ်ပါ"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"နောက်ခံ သတ်မှတ်ရန်"</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="6967226064958263939">"ပင်မစာမျက်နှာနှင့် လော့ခ်စာမျက်နှာ"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"ပင်မစာမျက်နှာနှင့် လော့ခ်မျက်နှာပြင်"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"နောက်ခံပုံကို လှည့်နေသည်"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"ဤနေရာတွင် လက်ရှိနောက်ခံကို ပြသရန်အတွက် <xliff:g id="APP_NAME">%1$s</xliff:g> သည် သင့်စက်၏ သိုလှောင်ခန်းကို အသုံးပြုခွင့်လိုအပ်သည်။"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"ဤနေရာတွင် လက်ရှိနောက်ခံကို ပြသရန်အတွက် Wallpapers သည် သင့်စက်၏ သိုလှောင်ခန်းကို အသုံးပြုခွင့်လိုအပ်သည်။\n\nဤဆက်တင်ကို ပြောင်းရန် Wallpapers ၏ အက်ပ်အချက်အလက်များထဲရှိ \'ခွင့်ပြုချက်များ\' ဧရိယာသို့ သွားပါ။"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index af24134..3b23d21 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Startskjerm"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Låseskjermen"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Startskjermen og låseskjermen"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Angi bakgrunn"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Angi bakgrunn på"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Startskjerm"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Låseskjermen"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Startskjerm og låseskjerm"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Startskjerm og låseskjerm"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Bakgrunn med skiftende bilder"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"For å vise gjeldende bakgrunn her må <xliff:g id="APP_NAME">%1$s</xliff:g> ha tilgang til lagring på enheten din."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"For å vise bakgrunnen din her må du gi Bakgrunner tilgang til enhetens lagringsplass.\n\nFor å endre denne innstillingen, gå til Tillatelser-områder i appinformasjonen for Bakgrunner."</string>
@@ -77,7 +77,7 @@
     <string name="center_wallpaper_position" msgid="4166894762352288883">"Midtstilt"</string>
     <string name="center_crop_wallpaper_position" msgid="1681980019815343348">"Midtstilt beskjæring"</string>
     <string name="stretch_wallpaper_position" msgid="5002680983147456935">"Strekk"</string>
-    <string name="preview" msgid="1774602101743861071">"Se forhåndsvisning"</string>
+    <string name="preview" msgid="1774602101743861071">"Forhåndsvisning"</string>
     <string name="tab_info" msgid="818614080690111416">"Informasjon"</string>
     <string name="tab_customize" msgid="2533745409174959960">"Tilpass"</string>
     <string name="configure_wallpaper" msgid="849882179182976621">"Innstillinger"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 3d5366a..f5b3081 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -32,13 +32,13 @@
     <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">"गृह स्क्रिन &amp; लक स्क्रिन"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"वालपेपर सेट गर्नुहोस्"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"यहाँ वालपेपर सेट गर्नुहोस्"</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="6967226064958263939">"गृह स्क्रिन र लक स्क्रिन"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"होम र लक स्क्रिन"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"छवि परिवर्तन हुने वालपेपर"</string>
-    <string name="permission_needed_explanation" msgid="139166837541426823">"यहाँ हालको वालपेपर देखाउन <xliff:g id="APP_NAME">%1$s</xliff:g> लाई तपाईंको यन्त्रको भण्डारणमाथिको पहुँच अनिवार्य हुन्छ।"</string>
-    <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"यहाँ हालैको वालपेपर देखाउन वालपेपरहरूलाई तपाईंको यन्त्रको भण्डारणमाथिको पहुँच अनिवार्य हुन्छ।\n\nयो सेटिङ बदल्न वालपेपरहरूको अनुप्रयोगसम्बन्धी जानकारीमा रहेको अनुमति क्षेत्रमा जानुहोस्।"</string>
+    <string name="permission_needed_explanation" msgid="139166837541426823">"यहाँ हालको वालपेपर देखाउन <xliff:g id="APP_NAME">%1$s</xliff:g> लाई तपाईंको डिभाइसको भण्डारणमाथिको पहुँच अनिवार्य हुन्छ।"</string>
+    <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"यहाँ हालैको वालपेपर देखाउन वालपेपरहरूलाई तपाईंको डिभाइसको भण्डारणमाथिको पहुँच अनिवार्य हुन्छ।\n\nयो सेटिङ बदल्न वालपेपरहरूको एपसम्बन्धी जानकारीमा रहेको अनुमति क्षेत्रमा जानुहोस्।"</string>
     <string name="permission_needed_allow_access_button_label" msgid="1943133660612924306">"पहुँच राख्न दिनुहोस्"</string>
     <string name="no_backup_image_wallpaper_description" msgid="8303268619408738057">"परिवर्तन हुने वालपेपरसम्बन्धी सेवाका लागि लाइभ वालपेपरहरू"</string>
     <string name="daily_refresh_tile_title" msgid="3270456074558525091">"दैनिक वालपेपर"</string>
@@ -53,7 +53,7 @@
     <string name="explore" msgid="7468719504199497281">"अन्वेषण गर्नुहोस्"</string>
     <string name="next_wallpaper" msgid="3911873152952596232">"अर्को वालपेपर"</string>
     <string name="wallpaper_disabled_message" msgid="7309484130562148185">"यस यन्त्रमा वालपेपर सेट गर्ने सुविधालाई असक्षम पारिएको छ"</string>
-    <string name="wallpaper_disabled_by_administrator_message" msgid="1551430406714747884">"तपाईंको यन्त्रको प्रशासकले वालपेपर सेट गर्ने सुविधालाई असक्षम पार्नुभएको छ"</string>
+    <string name="wallpaper_disabled_by_administrator_message" msgid="1551430406714747884">"तपाईंको डिभाइसको प्रशासकले वालपेपर सेट गर्ने सुविधालाई असक्षम पार्नुभएको छ"</string>
     <string name="wallpaper_set_successfully_message" msgid="2958998799111688578">"वालपेपर सफलतापूर्वक सेट गरियो"</string>
     <string name="wallpapers_unavailable_offline_message" msgid="8136405438621689532">"वालपेपरहरू हेर्न तपाईंसँग इन्टरनेट जडान हुनु आवश्यक हुन्छ। कृपया जडान गरेर फेरि प्रयास गर्नुहोस।"</string>
     <string name="currently_set_home_wallpaper_thumbnail" msgid="4022381436821898917">"हाल गृह स्क्रिनमा सेट गरिएको वालपेपरको थम्बनेल"</string>
@@ -67,7 +67,7 @@
     <string name="refreshing_daily_wallpaper_dialog_message" msgid="1975910873362855761">"दैनिक वालपेपर पुनः ताजा गर्दै…"</string>
     <string name="refresh_daily_wallpaper_failed_message" msgid="4749879993812557166">"दैनिक वालपेपर पुनः ताजा गर्न सकिएन। कृपया आफ्नो नेटवर्कको जडान जाँच गरी फेरि प्रयास गर्नुहोस्।"</string>
     <string name="on_device_wallpapers_category_title" msgid="805819102071369004">"यन्त्रमा रहेका वालपेपरहरू"</string>
-    <string name="on_device_wallpapers_category_title_desktop" msgid="316919420410065369">"यन्त्रका वालपेपर"</string>
+    <string name="on_device_wallpapers_category_title_desktop" msgid="316919420410065369">"डिभाइसका वालपेपर"</string>
     <string name="on_device_wallpaper_title" msgid="5262564748034629524">"Android वालपेपर"</string>
     <string name="live_wallpapers_category_title" msgid="1814374812192366349">"लाइभ वालपेपरहरू"</string>
     <string name="my_photos_category_title" msgid="4294567122144565273">"मेरा फोटोहरू"</string>
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
deleted file mode 100644
index f54283d..0000000
--- a/res/values-night/colors.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
-     Copyright (C) 2020 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<resources>
-    <color name="preview_pager_background">@color/google_grey900</color>
-    <color name="fullscreen_preview_background">@color/material_black_100</color>
-    <color name="edit_background_base">@color/material_white_100</color>
-    <color name="full_preview_tab_unselected_text_color">@color/white_54_alpha</color>
-    <color name="bottom_bar_background_color">@color/google_grey900</color>
-    <color name="bottom_bar_icon_unchecked_color">@color/white_54_alpha</color>
-    <color name="action_bar_bottom_sheet_text_color">@color/material_white_100</color>
-    <color name="action_bar_bottom_sheet_subtitle2_text_color">@color/white_87_alpha</color>
-    <color name="selected_check_color">@color/material_black_100</color>
-</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 569c089..3b15f2d 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Startscherm"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Vergrendelscherm"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Home- en vergrendelscherm"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Achtergrond instellen"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Achtergrond instellen op"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Startscherm"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Vergrendelscherm"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Startscherm en vergrendelscherm"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Start- en vergrendelscherm"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Achtergrond met roulerende afbeelding"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"<xliff:g id="APP_NAME">%1$s</xliff:g> heeft toegang nodig tot de opslag van je apparaat om de huidige achtergrond hier weer te geven."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Achtergronden heeft toegang nodig tot de opslag van je apparaat om de huidige achtergrond hier weer te geven.\n\nAls je deze instelling wilt wijzigen, ga je naar het gedeelte Rechten in de app-informatie van Achtergronden."</string>
diff --git a/res/values-notnight-v26/colors.xml b/res/values-notnight-v26/colors.xml
index 5283cc6..0a0ff59 100755
--- a/res/values-notnight-v26/colors.xml
+++ b/res/values-notnight-v26/colors.xml
@@ -14,7 +14,6 @@
      limitations under the License.
 -->
 <resources>
-    <color name="primary_color">#ffffff</color>
     <color name="secondary_color">#f8f9fa</color>
     <color name="accent_color">@color/material_googblue500</color>
 
diff --git a/res/values-notnight-v26/picker_colors.xml b/res/values-notnight-v26/picker_colors.xml
deleted file mode 100755
index 9b8150d..0000000
--- a/res/values-notnight-v26/picker_colors.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-     Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<resources>
-    <color name="textColorPrimary">@color/black_87_alpha</color>
-    <color name="textColorSecondary">@color/black_54_alpha</color>
-
-    <color name="category_picker_background_color">@color/material_white_100</color>
-    <color name="category_title_scrim_color">#E6FFFFFF</color>
-    <color name="category_title_scrim_color_no_thumbnail">@color/material_grey_100</color>
-    <color name="category_title_text_color">@color/textColorPrimary</color>
-
-    <color name="currently_set_presentation_mode_text_color">@color/category_title_text_color</color>
-    <color name="currently_set_title_text_color">@color/textColorPrimary</color>
-    <color name="currently_set_subtitle_text_color">@color/textColorSecondary</color>
-    <color name="currently_set_divider_background_color">@android:color/transparent</color>
-
-    <color name="currently_set_both_header_scrim">@color/white_80_alpha</color>
-    <color name="currently_set_both_refresh_button_color">@color/black_54_alpha</color>
-    <color name="currently_set_both_title_text_color">@color/textColorPrimary</color>
-    <color name="currently_set_both_presentation_mode_text_color">@color/textColorSecondary</color>
-    <color name="currently_set_both_attribution_title_text_color">@color/textColorPrimary</color>
-    <color name="currently_set_both_attribution_subtitle_text_color">@color/textColorSecondary
-    </color>
-
-    <color name="select_wallpaper_header_text_color">@color/textColorSecondary</color>
-
-    <color name="individual_tile_title_scrim_color">@color/white_80_alpha</color>
-    <color name="individual_tile_title_text_color">@color/textColorPrimary</color>
-
-    <color name="individual_picker_background_color">@color/material_white_100</color>
-
-    <color name="toolbar_icon_color">@color/text_color_dark</color>
-    <color name="toolbar_color">@color/material_white_100</color>
-</resources>
diff --git a/res/values-notnight-v26/styles.xml b/res/values-notnight-v26/styles.xml
index 065786f..1d6cfd5 100755
--- a/res/values-notnight-v26/styles.xml
+++ b/res/values-notnight-v26/styles.xml
@@ -31,7 +31,8 @@
         <item name="colorControlHighlight">@color/ripple_material_dark</item>
         <item name="windowActionBar">false</item>
         <item name="windowNoTitle">true</item>
-        <item name="toolbarNavigationButtonStyle">@style/Widget.AppCompat.Toolbar.Button.Navigation</item>
+        <item name="toolbarNavigationButtonStyle">@android:style/Widget.Toolbar.Button.Navigation
+        </item>
 
         <item name="android:windowActionBar">false</item>
         <item name="android:windowNoTitle">true</item>
diff --git a/res/values-notnight-v27/styles.xml b/res/values-notnight-v27/styles.xml
index e090c4c..95c5ee5 100755
--- a/res/values-notnight-v27/styles.xml
+++ b/res/values-notnight-v27/styles.xml
@@ -33,7 +33,8 @@
         <item name="colorControlHighlight">@color/ripple_material_dark</item>
         <item name="windowActionBar">false</item>
         <item name="windowNoTitle">true</item>
-        <item name="toolbarNavigationButtonStyle">@style/Widget.AppCompat.Toolbar.Button.Navigation</item>
+        <item name="toolbarNavigationButtonStyle">@android:style/Widget.Toolbar.Button.Navigation
+        </item>
 
         <item name="android:windowActionBar">false</item>
         <item name="android:windowNoTitle">true</item>
@@ -43,5 +44,8 @@
     <style name="LightDialogTheme" parent="@android:style/Theme.DeviceDefault.Light.Dialog.NoActionBar">
         <item name="android:layout">@layout/abc_alert_dialog_material</item>
         <item name="windowActionBar">false</item>
+        <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
+        <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
+        <item name="android:dialogCornerRadius">24dp</item>
     </style>
 </resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 54d485e..f707023 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"ୱାଲପେପର୍‍ ସେଟ୍ କରନ୍ତୁ"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"ଏଥିରେ ୱାଲପେପର୍ ସେଟ୍ କରନ୍ତୁ"</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="6967226064958263939">"ହୋମ୍‌ ସ୍କ୍ରୀନ୍‌ ଏବଂ ଲକ୍‌ ସ୍କ୍ରୀନ୍‌"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"ମୂଳସ୍କ୍ରିନ୍ ଏବଂ ଲକ୍ ସ୍କ୍ରିନ୍"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"ୱାଲପେପର୍‌ ଇମେଜ୍‌କୁ ଘୂରାଇବା"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"ଏଠାରେ ସାମ୍ପ୍ରତିକ ୱାଲପେପର୍‌କୁ ଦେଖାଇବା ପାଇଁ, <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କ ଡିଭାଇସ୍‌ ଷ୍ଟୋରେଜ୍‌ର ଆକ୍ସେସ୍ ଆବଶ୍ୟକ।"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"ଏଠାରେ ସାମ୍ପ୍ରତିକ ୱାଲପେପର୍‌କୁ ଦେଖାଇବା ପାଇଁ, ଆପଣଙ୍କ ଡିଭାଇସ୍‌ ଷ୍ଟୋରେଜ୍‌ର ଆକ୍ସେସ୍ ଆବଶ୍ୟକ। \n\n ଏହି ସେଟିଙ୍ଗକୁ ପରିବର୍ତ୍ତନ କରିବା ସକାଶେ ୱାଲପେପର୍‌ର ଆପ୍ ସୂଚନା ଅନୁମତି କ୍ଷେତ୍ରକୁ ଯା’ନ୍ତୁ।"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 87a1f04..9f82470 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"ਵਾਲਪੇਪਰ ਸੈੱਟ ਕਰੋ"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"ਵਾਲਪੇਪਰ ਵਜੋਂ ਸੈੱਟ ਕਰੋ"</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="6967226064958263939">"ਹੋਮ ਸਕ੍ਰੀਨ ਅਤੇ ਲਾਕ ਸਕ੍ਰੀਨ"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"ਹੋਮ ਅਤੇ ਲਾਕ ਸਕ੍ਰੀਨ"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"ਬਦਲਣ ਵਾਲਾ ਚਿੱਤਰ ਵਾਲਪੇਪਰ"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"ਇੱਥੇ ਵਰਤਮਾਨ ਵਾਲਪੇਪਰ ਨੂੰ ਦਿਖਾਉਣ ਲਈ, <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੀ ਸਟੋਰੇਜ ਤੱਕ ਪਹੁੰਚ ਕਰਨੀ ਪਵੇਗੀ।"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"ਇੱਥੇ ਵਰਤਮਾਨ ਵਾਲਪੇਪਰ ਨੂੰ ਦਿਖਾਉਣ ਲਈ, \'ਵਾਲਪੇਪਰ\' ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੀ ਸਟੋਰੇਜ ਤੱਕ ਪਹੁੰਚ ਕਰਨੀ ਪਵੇਗੀ।\n\nਇਸ ਸੈਟਿੰਗ ਨੂੰ ਬਦਲਣ ਲਈ, \'ਵਾਲਪੇਪਰ\' ਐਪ ਦੀ ਜਾਣਕਾਰੀ ਦੇ ਇਜਾਜ਼ਤਾਂ ਖੇਤਰ ਵਿੱਚ ਜਾਓ।"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index a62fdc5..ed50411 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Ekran główny"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Ekran blokady"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Ekran główny i ekran blokady"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Ustaw tapetę"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Ustaw tapetę"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Ekran główny"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Ekran blokady"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Ekran główny i ekran blokady"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Ekran główny i ekran blokady"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Tapeta z obracanym obrazem"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Aby wyświetlić tutaj bieżącą tapetę, <xliff:g id="APP_NAME">%1$s</xliff:g> musi mieć dostęp do pamięci urządzenia."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Aby wyświetlać tutaj aktualną tapetę, Tapety muszą mieć dostęp do pamięci urządzenia.\n\nTo ustawienie możesz zmienić w sekcji Uprawnienia w informacjach o aplikacji Tapety."</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index ace4431..060f60d 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Ecrã principal"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Ecrã de bloqueio"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Ecrã principal e de bloqueio"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Definir imagem de fundo"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Definir imagem de fundo"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Ecrã principal"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Ecrã de bloqueio"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Ecrã principal e ecrã de bloqueio"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Ecrã principal e de bloqueio"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Imagem de fundo rotativa"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Para apresentar a imagem de fundo atual aqui, a aplicação <xliff:g id="APP_NAME">%1$s</xliff:g> necessita de acesso ao armazenamento do dispositivo."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Para apresentar a imagem de fundo atual aqui, a aplicação Imagens de fundo necessita de acesso ao armazenamento do dispositivo.\n\nPara alterar esta definição, aceda à área Autorizações das informações da aplicação Imagens de fundo."</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 6b8ea55..df1d052 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Tela inicial"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Tela de bloqueio"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Tela inicial e de bloqueio"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Definir plano de fundo"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Definir como plano de fundo"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Tela inicial"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Tela de bloqueio"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Tela inicial e tela de bloqueio"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Tela inicial e de bloqueio"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Plano de fundo de imagens rotativo"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Para exibir o plano de fundo atual aqui, o app <xliff:g id="APP_NAME">%1$s</xliff:g> precisa acessar o armazenamento do dispositivo."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Para exibir o plano de fundo atual aqui, o Planos de fundo precisa acessar o armazenamento do dispositivo.\n\nPara alterar essa configuração, acesse a área \"Permissões\" das informações do app Planos de fundo."</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 8a9c44d..eaaf4c0 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Ecran de pornire"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Ecran de blocare"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"De pornire și de blocare"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Setați imaginea de fundal"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Setați ca imagine de fundal"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Ecran de pornire"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Ecran de blocare"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Ecranul de pornire și ecranul de blocare"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Ecranul de pornire și ecranul de blocare"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Rotirea imaginilor de fundal"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Pentru a afișa aici imaginea de fundal curentă, <xliff:g id="APP_NAME">%1$s</xliff:g> trebuie să poată accesa spațiul de stocare al dispozitivului."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Pentru a afișa imaginea de fundal actuală aici, aplicația Imagini de fundal trebuie să poată accesa spațiul de stocare al dispozitivului.\n\nPentru a schimba această setare, accesați zona Permisiuni din informațiile aplicației Imagini de fundal."</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index d807ba7..62d17ba 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"Установка обоев"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Выберите, где установить обои"</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="6967226064958263939">"Главный экран и заблокированный экран"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Главный экран и заблокированный экран"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Автоматически меняющиеся обои"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Чтобы посмотреть текущие обои здесь, предоставьте приложению \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" доступ к памяти устройства."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Чтобы посмотреть текущие обои здесь, предоставьте приложению \"Обои\" доступ к памяти устройства.\n\nЗакрыть доступ можно, нажав \"Настройки &gt; Приложения &gt; Обои &gt; Разрешения\"."</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 2a6288e..bf81b00 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"වෝල්පේපරය සකසන්න"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"වෝල්පේපරය සැකසීම ක්‍රියාත්මකයි"</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="6967226064958263939">"මුල් පිටු තිරය සහ අගුලු තිරය"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"මුල් පිටු සහ අගුලු තිරය"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"කැරකෙන රූප වෝල්පේපරය"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"මෙහි වත්මන් වෝල්පේපරය සංදර්ශනය කිරීමට, <xliff:g id="APP_NAME">%1$s</xliff:g> හට ඔබේ උපාංගයේ ගබඩාව වෙත ප්‍රවේශය අවශ්‍යයි."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"මෙහි වත්මන් වෝල්පේපරය පෙන්වීමට, වෝල්පේපර වෙත ඔබගේ උපාංග ගබඩාව වෙත ප්‍රවේශය අවශ්‍යයි.\n\nමෙම සැකසීම වෙනස් කිරීමට, වෝල්පේපර යෙදුම් තොරතුරු වල අවසර වෙත යන්න."</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index a77c513..89b45d4 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Plocha"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Uzamknutá obrazovka"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Plocha a uzamknutá obrazovka"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Nastavenie tapety"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Nastavenie tapety"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Plocha"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Uzamknutá obrazovka"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Plocha a uzamknutá obrazovka"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Plocha a uzamknutá obrazovka"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Tapeta zo striedajúcich sa obrázkov"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Ak chcete na tomto mieste zobraziť aktuálnu tapetu, aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> potrebuje prístup k úložisku vášho zariadenia."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Ak chcete na tomto mieste zobraziť aktuálnu tapetu, Tapety potrebujú prístup k úložisku vášho zariadenia.\n\nAk chcete zmeniť toto nastavenie, prejdite do časti Povolenia v informáciách o aplikácii Tapety."</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index abb8ee8..2c90b21 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Začetni zaslon"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Zaklenjen zaslon"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Začetni in zaklenjeni zaslon"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Nastavitev ozadja"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Nastavitev zaslonskega ozadja na"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Začetni zaslon"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Zaklenjen zaslon"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Začetni zaslon in zaklenjen zaslon"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Začetni in zaklenjen zaslon"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Ozadje s kroženjem slik"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Če želite tu prikazati trenutno ozadje, mora imeti aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> dostop do shrambe naprave."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Če želite tukaj prikazati trenutno ozadje, potrebuje aplikacija Ozadja dostop do shrambe v napravi.\n\nČe želite spremeniti to nastavitev, odprite razdelek z dovoljenji v podatkih o aplikaciji Ozadja."</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 03ed073..ff4a9d9 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Ekrani bazë"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Ekrani i kyçjes"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"\"Ekrani bazë\" dhe \"Kyçja\""</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Cakto imazhin e sfondit"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Caktoje aktiv imazhin e sfondit"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Ekrani bazë"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Ekrani i kyçjes"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Ekrani bazë dhe ekrani i kyçjes"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Ekrani i bazë dhe i kyçjes"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Imazh sfondi me rotacion"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Për të shfaqur imazhin aktual të sfondit këtu, <xliff:g id="APP_NAME">%1$s</xliff:g> ka nevojë për qasje te hapësira ruajtëse e pajisjes tënde."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Për të afishuar sfondin aktual këtu, \"Imazhet e sfondit\" kanë nevojë të kenë qasje në hapësirën ruajtëse të pajisjes sate.\n\nPër ta ndryshuar këtë cilësim, shko te zona \"Lejet\" në informacionin e aplikacionit \"Imazhet e sfondit\"."</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 6f7cda6..ecd2f51 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"Подесите позадину"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Подесите позадину на"</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="6967226064958263939">"Почетни екран и закључани екран"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Почетни и закључани екран"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Ротирајућа позадина са сликом"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Да би се актуелна позадина приказивала овде, апликација <xliff:g id="APP_NAME">%1$s</xliff:g> треба да има приступ меморијском простору на уређају."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Да би се актуелна позадина приказивала овде, апликација Позадине мора да има приступ меморијском простору на уређају.\n\nДа бисте променили ово подешавање, идите у одељак Дозволе у информацијама о апликацији Позадине."</string>
@@ -44,7 +44,7 @@
     <string name="daily_refresh_tile_title" msgid="3270456074558525091">"Дневна позадина"</string>
     <string name="daily_refresh_tile_subtitle" msgid="3976682014885446443">"Додирните да бисте укључили"</string>
     <string name="start_rotation_dialog_body_live_wallpaper_needed" msgid="5132580257563846082">"Позадина се аутоматски мења сваки дан. Да бисте довршили подешавање, додирните &lt;strong&gt;Подеси позадину&lt;/strong&gt; на следећем екрану."</string>
-    <string name="start_rotation_dialog_wifi_only_option_message" msgid="3126269859713666225">"Преузимај будуће позадине само преко Wi-Fi мреже"</string>
+    <string name="start_rotation_dialog_wifi_only_option_message" msgid="3126269859713666225">"Преузимај будуће позадине само преко WiFi мреже"</string>
     <string name="start_rotation_dialog_continue" msgid="276678987852274872">"Настави"</string>
     <string name="start_rotation_progress_message" msgid="7872623873682262083">"Преузима се прва позадина…"</string>
     <string name="start_rotation_error_message" msgid="3053799836719618972">"Преузимање прве позадине није успело. Проверите подешавања мреже и пробајте поново."</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index c496885..7bc5221 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Startskärm"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Låsskärm"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Start- och låsskärm"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Välj bakgrund"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Ställ in som bakgrund på"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Startskärm"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Låsskärm"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Startskärm och låsskärm"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Startskärm och låsskärm"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Bakgrund för bakgrundsbilder som byts ut"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Du behöver ge <xliff:g id="APP_NAME">%1$s</xliff:g> åtkomst till enhetens lagringsminne om du vill visa den aktuella bakgrunden här."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Du behöver ge Bakgrunder åtkomst till enhetens lagringsminne om du vill visa den aktuella bakgrunden här.\n\nDu kan ändra inställningen i Behörigheter i appinformationen för Bakgrunder."</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index ff90209..8ca6e68 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Skrini ya kwanza"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Skrini iliyofungwa"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Skrini ya Kwanza na Iliyofungwa"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Weka mandhari"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Weka madhari"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Skrini ya kwanza"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Skrini iliyofungwa"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Skrini ya kwanza na skrini iliyofungwa"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Skrini ya kwanza na skrini iliyofungwa"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Mandhari ya Picha Yanayozunguka"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Ili kuonyesha mandhari yanayotumika kwa sasa hapa, <xliff:g id="APP_NAME">%1$s</xliff:g> inahitaji idhini ya kufikia hifadhi ya kifaa chako."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Ili kuonyesha hapa mandhari yaliyopo sasa, programu ya Mandhari inahitaji ruhusa ya kufikia hifadhi ya kifaa chako.\n\nIli kubadilisha mipangilio hii, nenda kwenye sehemu ya Ruhusa katika maelezo ya programu ya Mandhari."</string>
diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml
deleted file mode 100755
index ece1ff7..0000000
--- a/res/values-sw720dp/dimens.xml
+++ /dev/null
@@ -1,47 +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.
--->
-<resources>
-    <!-- Dimensions for "single metadata card" configuration. -->
-    <dimen name="single_metadata_card_layout_height">256dp</dimen>
-    <dimen name="single_metadata_pane_wallpaper_collection_title_text_size">
-        @dimen/abc_text_size_headline_material
-    </dimen>
-    <dimen name="single_metadata_pane_wallpaper_subtitle_text_size">
-        @dimen/abc_text_size_body_1_material
-    </dimen>
-
-    <!-- Dimensions for "both metadata tiles" configuration. -->
-    <dimen name="both_metadata_title_text_size">@dimen/abc_text_size_subhead_material</dimen>
-
-    <!-- Dimensions for "rotation" tile. -->
-    <dimen name="grid_item_rotation_title_size">16sp</dimen>
-
-    <!-- Dimensions for "Select wallpaper" header. -->
-    <dimen name="select_wallpaper_header_height">44dp</dimen>
-
-    <!-- Dimensions for the preview fragment. -->
-    <dimen name="preview_toolbar_up_button_padding">8dp</dimen>
-    <dimen name="preview_toolbar_set_wallpaper_button_padding">20dp</dimen>
-
-    <!-- Dimensions for the preview attribution pane. -->
-
-    <dimen name="preview_attribution_pane_collapsed_height">0dp</dimen>
-
-    <dimen name="preview_attribution_pane_content_side_margin">24dp</dimen>
-    <dimen name="preview_attribution_pane_explore_left_margin">10dp</dimen>
-    <dimen name="preview_attribution_pane_title_top_margin">16dp</dimen>
-    <dimen name="preview_attribution_pane_arrow_top_bottom_margin">8dp</dimen>
-</resources>
diff --git a/res/values-sw720dp/styles.xml b/res/values-sw720dp/styles.xml
deleted file mode 100755
index 65939e8..0000000
--- a/res/values-sw720dp/styles.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-     Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<resources xmlns:tools="http://schemas.android.com/tools" tools:targetApi="23">
-    <!-- Preview attribution pane styles -->
-    <style name="preview_attribution_pane_title">
-        <item name="android:textColor">@color/material_white_text</item>
-        <item name="android:textSize">@dimen/abc_text_size_headline_material</item>
-    </style>
-
-    <style name="preview_attribution_pane_subtitle">
-        <item name="android:textColor">@color/material_white_text</item>
-        <item name="android:textSize">@dimen/abc_text_size_body_1_material</item>
-    </style>
-</resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 09478ba..4a5b096 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -32,10 +32,10 @@
     <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">"முகப்பு &amp; பூட்டு"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"வால்பேப்பரை அமைத்தல்"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"வால்பேப்பரை அமையுங்கள்"</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="6967226064958263939">"முகப்புத் திரையும் பூட்டுத் திரையும்"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"முகப்புத் திரையும் பூட்டுத் திரையும்"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"சுழலும் பட வால்பேப்பர்"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"இந்த வால்பேப்பரை இங்கே காட்ட, <xliff:g id="APP_NAME">%1$s</xliff:g> பயன்பாட்டிற்கு உங்கள் சாதனத்தின் சேமிப்பகத்திற்கான அணுகல் தேவை."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"இந்த வால்பேப்பரை இங்கே காட்ட, வால்பேப்பர்களுக்கு உங்கள் சாதனத்தின் சேமிப்பகத்திற்கான அணுகல் தேவை.\n\nஇந்த அமைப்பை மாற்ற, வால்பேப்பர்களின் ஆப்ஸ் தகவல் பக்கத்தில் உள்ள அனுமதிகள் பகுதிக்குச் செல்லவும்."</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index f371db9..e8b2d1c 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -32,10 +32,10 @@
     <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">"హోమ్ &amp; లాక్"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"వాల్‌పేపర్‌ను సెట్ చేయండి"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"వీటిలో వాల్‌పేపర్‌ను సెట్ చేయండి"</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="6967226064958263939">"హోమ్ స్క్రీన్ మరియు లాక్ స్క్రీన్"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"మొదటి ట్యాబ్, లాక్ స్క్రీన్"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"చిత్ర వాల్‌పేపర్‌ను వంతుల వారీగా మార్చడం"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"ప్రస్తుత వాల్‌పేపర్‌ని ఇక్కడ ప్రదర్శించడానికి, <xliff:g id="APP_NAME">%1$s</xliff:g>కి మీ పరికర నిల్వ యొక్క యాక్సెస్ అవసరమవుతుంది."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"ఇక్కడ ప్రస్తుత వాల్‌పేపర్‌ను ప్రదర్శించడానికి, వాల్‌పేపర్‌‌లకు మీ పరికర నిల్వ యాక్సెస్ అవసరం.\n\nఈ సెట్టింగ్‌ను మార్చడానికి, వాల్‌పేపర్‌ల యాప్ సమాచారం యొక్క అనుమతుల ప్రాంతానికి వెళ్లండి."</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 494a5c7..a027d64 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"ตั้งค่าวอลเปเปอร์"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"ตั้งเปิดวอลเปเปอร์"</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="6967226064958263939">"หน้าจอหลักและหน้าจอล็อก"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"หน้าจอหลักและหน้าจอล็อก"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"หมุนภาพวอลเปเปอร์"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"<xliff:g id="APP_NAME">%1$s</xliff:g> ต้องได้รับสิทธิ์เข้าถึงที่เก็บข้อมูลของอุปกรณ์จึงจะแสดงวอลเปเปอร์ปัจจุบันที่นี่ได้"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"วอลเปเปอร์ต้องได้สิทธิ์เข้าถึงพื้นที่เก็บข้อมูลของอุปกรณ์จึงจะแสดงวอลเปเปอร์ปัจจุบันที่นี่ได้\n\nหากต้องการเปลี่ยนการตั้งค่านี้ ให้ไปที่พื้นที่สิทธิ์ของข้อมูลแอปของวอลเปเปอร์"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 4e13333..3cabd22 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Home screen"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Lock screen"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Home at Lock"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Magtakda ng wallpaper"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Itakda ang wallpaper"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Home screen"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Lock screen"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Home screen at lock screen"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Home at lock screen"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Nagro-roate na Larawan na Wallpaper"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Para ipakita ang kasalukuyang wallpaper dito, kailangan ng <xliff:g id="APP_NAME">%1$s</xliff:g> ng access sa storage ng iyong device."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Para ipakita rito ang kasalukuyang wallpaper, kailangan ng Mga Wallpaper ng access sa storage ng iyong device.\n\nPara baguhin ang setting na ito, pumunta sa bahaging Mga Pahintulot ng impormasyon ng app ng Mga Wallpaper."</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 2b78d20..008de95 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Ana ekran"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Kilit ekranı"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Ana Ekran ve Kilit Ekranı"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Duvar kağıdını ayarlayın"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Duvar kağıdı ayarla:"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Ana ekran"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Kilit ekranı"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Ana ekran ve kilit ekranı"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Ana ekran ve kilit ekranı"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Değişen Resimli Duvar Kağıdı"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Geçerli duvar kağıdını burada görüntülemek için <xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının cihazınızın depolama alanına erişmesi gerekiyor."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Geçerli duvar kağıdını burada görüntülemek için Wallpapers uygulamasının, cihazınızın depolama alanına erişmesi gerekiyor.\n\nBu ayarı değiştirmek için Wallpapers\'ın uygulama bilgisindeki İzinler alanına gidin."</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 73b1c5a..9021401 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"Зробити фоновим малюнком"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Установити як фоновий малюнок"</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="6967226064958263939">"Головний і заблокований екрани"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Головний екран і екран блокування"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Чергування фонових малюнків"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Щоб показувати тут поточний фоновий малюнок, потрібно надати додатку <xliff:g id="APP_NAME">%1$s</xliff:g> доступ до пам’яті пристрою."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Щоб показувати тут поточний фоновий малюнок, потрібно надати додатку Фонові малюнки доступ до пам’яті пристрою.\n\nЩоб змінити це налаштування, перейдіть у розділ \"Дозволи\" на сторінці інформації про додаток."</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 6c7552b..c95c1d5 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"وال پیپر سیٹ کریں"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"اس پر وال پیپر سیٹ کریں"</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="6967226064958263939">"ہوم اسکرین اور مقفل اسکرین"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"ہوم اور مقفل اسکرین"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"گردشی تصویری وال پیپر"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"موجودہ وال پیپر یہاں ڈسپلے کرنے کے لیے، <xliff:g id="APP_NAME">%1$s</xliff:g> کو آپ کے آلہ کے اسٹوریج تک رسائی درکار ہے۔"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"یہاں موجودہ وال پیپر ڈسپلے کرنے کے لیے، وال پیپرز کو آپ کے آلہ کے اسٹوریج تک رسائی درکار ہے۔\n\nاس ترتیب کو بدلنے کے لیے، وال پیپرز کی ایپ کی معلومات کی اجازتوں کے ایریا میں جائیں۔"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index a906905..2fb79b0 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Bosh ekran"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Ekran qulfi"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Bosh ekran va ekran qulfi"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Fonga rasm tanlash"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Fon rasmi oʻrnatiladigan joyni tanlang"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Bosh ekran"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Ekran qulfi"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Bosh ekran va qulf ekrani"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Bosh ekran va ekran qulfi"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Fon rasmlarini aylantirish"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Bu yerda joriy fon rasmini chiqarish uchun <xliff:g id="APP_NAME">%1$s</xliff:g> xizmatiga qurilmangiz xotirasiga kirishi uchun ruxsat lozim."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Bu yerda joriy fon rasmini chiqarish uchun Fon rasmlari xizmatiga qurilmaning xotirasiga kirishi uchun ruxsat zarur.\n\nBu parametrni o‘zgartirish uchun Fon rasmlari ilova ma’lumotlaridagi Ruxsatlar sahifasiga kiring."</string>
diff --git a/res/values-v26/dimens.xml b/res/values-v26/dimens.xml
deleted file mode 100755
index 5e0b6aa..0000000
--- a/res/values-v26/dimens.xml
+++ /dev/null
@@ -1,20 +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.
--->
-<resources>
-    <!-- Dimensions for "single metadata card" configuration. -->
-    <dimen name="single_metadata_card_elevation">4dp</dimen>
-    <dimen name="single_metadata_pane_bottom_offset">12dp</dimen>
-</resources>
diff --git a/res/values-v29/styles.xml b/res/values-v29/styles.xml
deleted file mode 100644
index 6cae735..0000000
--- a/res/values-v29/styles.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
-     Copyright (C) 2019 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<resources>
-    <style name="PreviewCheckboxDeviceTheme" parent="@android:style/ThemeOverlay.DeviceDefault.Accent.DayNight">
-        <item name="android:colorControlActivated">?android:attr/colorAccent</item>
-        <item name="android:colorControlNormal">?android:attr/colorPrimary</item>
-    </style>
-</resources>
\ No newline at end of file
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 199cca2..1c072d5 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Màn hình chính"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Màn hình khóa"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Màn hình chính và khóa"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Đặt hình nền"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Đặt làm hình nền trên"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Màn hình chính"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Màn hình khóa"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Màn hình chính và màn hình khóa"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Màn hình chính và màn hình khóa"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Xoay vòng hình nền"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Để hiển thị hình nền hiện tại ở đây, <xliff:g id="APP_NAME">%1$s</xliff:g> cần quyền truy cập vào bộ nhớ của thiết bị."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Để hiển thị hình nền hiện tại ở đây, ứng dụng Hình nền cần quyền truy cập vào bộ nhớ của thiết bị.\n\nĐể thay đổi cài đặt này, hãy chuyển đến khu vực Quyền của thông tin ứng dụng Hình nền."</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 7c9404b..24d4bf7 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"设置壁纸"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"为以下屏幕设置壁纸:"</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="6967226064958263939">"主屏幕和锁定屏幕"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"主屏幕和锁定屏幕"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"轮换展示图片壁纸"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"要在这里显示当前壁纸,<xliff:g id="APP_NAME">%1$s</xliff:g>需要访问您设备的存储空间。"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"要在这里显示当前壁纸,壁纸应用需要访问您设备的存储空间。\n\n要更改此设置,请转到壁纸应用的应用信息的“权限”部分。"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 4382f14..6e2f7f7 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"設定桌布"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"設定以下畫面的桌布:"</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="6967226064958263939">"主畫面和上鎖畫面"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"主畫面和螢幕鎖定畫面"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"正在輪替顯示圖片桌布"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"如要在此顯示目前的桌布,「<xliff:g id="APP_NAME">%1$s</xliff:g>」需要存取您裝置的儲存空間。"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"如要在此顯示目前的桌布,「桌布」需要存取您裝置的儲存空間。\n\n如要變更此設定,請前往「桌布」應用程式資訊的「權限」部分。"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index e191907..8ce3524 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -32,10 +32,10 @@
     <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="6114951028768599417">"設定桌布"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"設定以下畫面的桌布:"</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="6967226064958263939">"主螢幕和螢幕鎖定"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"主畫面和螢幕鎖定畫面"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"輪播圖片桌布"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"如要在這裡顯示目前的桌布,「<xliff:g id="APP_NAME">%1$s</xliff:g>」需要存取裝置的儲存空間。"</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"如要在這裡顯示目前的桌布,「桌布」需要存取裝置的儲存空間。\n\n如要變更這項設定,請前往「桌布」應用程式資訊的權限區域。"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 00df6c0..3d693f5 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -32,10 +32,10 @@
     <string name="home_screen_message" msgid="106444102822522813">"Isikrini sasekhaya"</string>
     <string name="lock_screen_message" msgid="1534506081955058013">"Khiya isikrini"</string>
     <string name="home_and_lock_short_label" msgid="2937922943541927983">"Ikhaya nokukhiya"</string>
-    <string name="set_wallpaper_dialog_message" msgid="6114951028768599417">"Setha isithombe sangemuva"</string>
+    <string name="set_wallpaper_dialog_message" msgid="2110475703996853076">"Ukusetha isithombe sangemuva kuvuliwe"</string>
     <string name="set_wallpaper_home_screen_destination" msgid="7315594722013109354">"Isikrini sasekhaya"</string>
     <string name="set_wallpaper_lock_screen_destination" msgid="6224685559375417945">"Khiya isikrini"</string>
-    <string name="set_wallpaper_both_destination" msgid="6967226064958263939">"Isikrini sasekhaya nokukhiya isikrini"</string>
+    <string name="set_wallpaper_both_destination" msgid="233216830256235288">"Ikhaya nokukhiya isikrini"</string>
     <string name="no_backup_image_wallpaper_label" msgid="6316627676107284851">"Izungezisa isithombe sangemuva"</string>
     <string name="permission_needed_explanation" msgid="139166837541426823">"Ukuze ubonise isithombe sangemuva samanje lapha, i-<xliff:g id="APP_NAME">%1$s</xliff:g> idinga ukufinyelela isitoreji sedivayisi yakho."</string>
     <string name="permission_needed_explanation_go_to_settings" msgid="3923551582092599609">"Ukuze ubonise isithombe sangemuva lapha, izithombe zangemuva zidinga ukufinyelela isitoreji sedivayisi yakho.\n\nUkuze ushintshe lesi silungiselelo, iya endaweni yezimvume zolwazi lohlelo lokusebenza lezithombe zangemuva."</string>
diff --git a/res/values/borders.xml b/res/values/borders.xml
new file mode 100644
index 0000000..017fc7c
--- /dev/null
+++ b/res/values/borders.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- Border shapes -->
+    <!-- All shapes must be drawn in a 100 by 100 square -->
+    <string name="circular_border" translatable="false">M50,0 A50,50,0,1,1,50,100 A50,50,0,1,1,50,0</string>
+</resources>
+
diff --git a/res/values/colors.xml b/res/values/colors.xml
index ad51cf0..2c4b336 100755
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -16,40 +16,22 @@
 <resources>
 
     <color name="material_white_text">#ffffff</color>
-    <color name="material_grey600">#757575</color>
     <color name="material_grey500">#9e9e9e</color>
-    <color name="material_grey200">#eeeeee</color>
     <color name="material_white_100">#ffffff</color>
 
     <color name="material_googblue500">#4285f4</color>
 
     <color name="material_black_100">#000000</color>
 
-    <color name="material_white_divider">#1fffffff</color>
     <color name="text_color_dark">#2d2d2d</color>
     <color name="text_color_light">@color/material_white_text</color>
-    <color name="primary_color">#2d2d2d</color>
     <color name="secondary_color">#3a3a3a</color>
     <color name="accent_color">@color/material_googblue500</color>
 
     <color name="status_bar_color">@color/material_black_100</color>
-    <color name="toolbar_color">#000000</color>
-
-    <color name="preview_pager_arrow_disabled">@android:color/darker_gray</color>
-    <color name="preview_pager_background">@color/secondary_color</color>
-    <color name="fullscreen_preview_background">@color/secondary_color</color>
-    <color name="google_grey900">#202124</color>
 
     <color name="google_grey700">#5f6368</color>
-    <color name="edit_background_base">@color/google_grey700</color>
-    <color name="option_border_default">@color/edit_background_base</color>
-    <color name="full_preview_tab_unselected_text_color">@color/black_55_alpha</color>
-    <color name="bottom_bar_background_color">@color/material_white_100</color>
-    <color name="bottom_bar_icon_unchecked_color">@color/material_grey600</color>
-    <color name="action_bar_bottom_sheet_text_color">@color/black_87_alpha</color>
-    <color name="action_bar_bottom_sheet_subtitle2_text_color">@color/black_54_alpha</color>
 
-    <color name="selected_check_color">@color/material_white_100</color>
     <color name="smartspace_preview_shadow_color_dark">#B0000000</color>
     <color name="smartspace_preview_shadow_color_transparent">@android:color/transparent</color>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index f1e8a80..8e13fb0 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -15,68 +15,44 @@
 -->
 <resources>
     <!-- Default screen margins, per the Android Design guidelines. -->
-    <dimen name="activity_horizontal_margin">16dp</dimen>
-    <dimen name="activity_vertical_margin">16dp</dimen>
     <dimen name="grid_padding">4dp</dimen>
     <dimen name="grid_padding_desktop">8dp</dimen>
 
+    <!-- Dimensions for all grid item tiles. -->
+    <dimen name="grid_item_all_radius">28dp</dimen>
+    <dimen name="grid_item_all_radius_small">20dp</dimen>
+
     <!-- Dimensions for "category" tiles. -->
-    <dimen name="grid_item_category_label_padding">12dp</dimen>
-    <dimen name="grid_item_category_label_padding_top">12dp</dimen>
-    <dimen name="grid_item_category_label_padding_bottom">4dp</dimen>
+    <dimen name="grid_item_category_label_padding_top">6dp</dimen>
     <dimen name="grid_item_category_label_minimum_height">16dp</dimen>
-    <dimen name="grid_item_category_overlay_icon_margin_bottom">24dp</dimen>
-    <dimen name="grid_item_category_title_height">48dp</dimen>
+    <dimen name="grid_item_category_padding_horizontal">6dp</dimen>
+    <dimen name="grid_item_category_padding_bottom">12dp</dimen>
     <dimen name="grid_tile_aspect_height">340dp</dimen>
     <dimen name="grid_tile_aspect_width">182dp</dimen>
-    <dimen name="grid_edge_space">8dp</dimen>
-    <dimen name="category_grid_padding_top">4dp</dimen>
-    <dimen name="category_grid_padding_bottom">16dp</dimen>
+    <dimen name="category_grid_edge_space">18dp</dimen>
+    <dimen name="category_grid_padding_top">32dp</dimen>
+
+    <!-- Dimensions for featured "category" tiles. -->
+    <dimen name="grid_item_featured_category_padding_bottom">16dp</dimen>
 
     <!-- Dimensions for individual wallpaper tiles. -->
-    <dimen name="grid_item_individual_wallpaper_selected_inset">14dp</dimen>
-    <dimen name="grid_item_individual_wallpaper_check_circle_offset">4dp</dimen>
-    <dimen name="grid_item_individual_wallpaper_check_circle_size">24dp</dimen>
-    <dimen name="grid_item_individual_padding_top">8dp</dimen>
-    <dimen name="grid_item_individual_label_padding_top">4dp</dimen>
+    <dimen name="grid_item_individual_padding_horizontal">4dp</dimen>
+    <dimen name="grid_item_individual_padding_bottom">8dp</dimen>
+    <dimen name="grid_item_individual_label_padding_top">6dp</dimen>
     <dimen name="grid_item_individual_label_padding_bottom">4dp</dimen>
-    <dimen name="wallpaper_grid_padding_top">16dp</dimen>
-    <dimen name="wallpaper_grid_padding_bottom">24dp</dimen>
+    <dimen name="wallpaper_grid_edge_space">20dp</dimen>
+    <dimen name="wallpaper_grid_padding_top">32dp</dimen>
 
-    <!-- Dimensions for "single metadata card" configuration. -->
-    <dimen name="single_metadata_card_elevation">2dp</dimen>
-    <dimen name="single_metadata_card_corner_radius">0dp</dimen>
-    <dimen name="single_metadata_card_layout_height">192dp</dimen>
-    <dimen name="single_metadata_pane_vertical_offset">8dp</dimen>
-    <dimen name="single_metadata_pane_horizontal_offset">8dp</dimen>
-    <dimen name="single_metadata_pane_bottom_offset">12dp</dimen>
-    <dimen name="single_metadata_pane_thumb_width">120dp</dimen>
-    <dimen name="single_metadata_pane_attributions_margin_left">16dp</dimen>
-    <dimen name="single_metadata_pane_attributions_margin_right">16dp</dimen>
-    <dimen name="single_metadata_pane_wallpaper_label_margin_top">10dp</dimen>
-    <dimen name="single_metadata_pane_wallpaper_title_margin_top">12dp</dimen>
+    <!-- Dimensions for featured individual wallpaper tiles. -->
+    <dimen name="grid_item_featured_individual_padding_horizontal">6dp</dimen>
+    <dimen name="grid_item_featured_individual_padding_bottom">12dp</dimen>
+    <dimen name="featured_wallpaper_grid_edge_space">18dp</dimen>
 
-    <dimen name="single_metadata_pane_wallpaper_subtitle_text_size">
-        @dimen/abc_text_size_caption_material
-    </dimen>
-    <dimen name="single_metadata_pane_wallpaper_subtitle_margin_top">3dp</dimen>
-    <dimen name="single_metadata_pane_wallpaper_subtitle_margin_bottom">10dp</dimen>
-    <dimen name="single_metadata_explore_button_margin">12dp</dimen>
-    <dimen name="single_metadata_explore_section_height">48dp</dimen>
-    <dimen name="single_metadata_skip_button_margin">10dp</dimen>
-    <dimen name="single_metadata_explore_section_button_padding">5dp</dimen>
-
-    <!-- Dimensions for "both metadata tiles" configuration. -->
-    <dimen name="both_metadata_thumb_height">208dp</dimen>
-    <dimen name="both_metadata_content_side_margin">12dp</dimen>
-    <dimen name="both_metadata_scrim_height">68dp</dimen>
-    <dimen name="both_metadata_scrim_content_top_margin">9dp</dimen>
-    <dimen name="both_metadata_scrim_content_bottom_margin">16dp</dimen>
-    <dimen name="both_metadata_attribution_section_height">132dp</dimen>
-    <dimen name="both_metadata_attribution_section_top_margin">12dp</dimen>
-    <dimen name="both_metadata_attribution_section_bottom_margin">16dp</dimen>
-    <dimen name="both_metadata_title_text_size">@dimen/abc_text_size_body_2_material</dimen>
-    <dimen name="both_metadata_explore_button_size">50dp</dimen>
+    <!-- Dimensions for individual wallpaper wallpaper tiles' badge -->
+    <dimen name="grid_item_badge_size">24dp</dimen>
+    <dimen name="grid_item_badge_indicator_size">16dp</dimen>
+    <dimen name="grid_item_badge_margin_small">8dp</dimen>
+    <dimen name="grid_item_badge_margin">12dp</dimen>
 
     <!-- Dimensions for "permissions needed" tile. -->
     <dimen name="permissions_needed_metadata_content_margin_top">16dp</dimen>
@@ -89,10 +65,6 @@
     <!-- Dimensions for "loading indicator" configuration. -->
     <dimen name="categories_loading_indicator_margin_top">16dp</dimen>
 
-    <!-- Dimensions for "Select wallpaper" header. -->
-    <dimen name="select_wallpaper_header_height">48dp</dimen>
-    <dimen name="select_wallpaper_header_margin_left">12dp</dimen>
-
     <!-- Dimensions for wallpaper tiles in individual picker when in desktop mode. -->
     <dimen name="tile_desktop_progress_bar_size">40dp</dimen>
 
@@ -100,35 +72,8 @@
     <dimen name="rotation_tile_desktop_label_padding">16dp</dimen>
     <dimen name="rotation_tile_desktop_label_text_size">13sp</dimen>
 
-    <!-- Dimensions for the preview fragment. -->
-    <dimen name="preview_toolbar_up_button_start_padding">0dp</dimen>
-    <dimen name="preview_toolbar_set_wallpaper_button_end_padding">12dp</dimen>
-
-    <dimen name="preview_attribution_pane_collapsed_height">0dp</dimen>
-
-    <dimen name="preview_attribution_pane_expanded_height">96dp</dimen>
-    <dimen name="preview_attribution_pane_content_side_margin">16dp</dimen>
-    <dimen name="preview_attribution_pane_content_bottom_margin">12dp</dimen>
-    <dimen name="preview_attribution_pane_title_top_margin">16dp</dimen>
-    <dimen name="preview_attribution_pane_title_end_margin">48dp</dimen>
-    <dimen name="preview_attribution_pane_arrow_start_margin">16dp</dimen>
-    <dimen name="preview_attribution_pane_arrow_top_bottom_margin">4dp</dimen>
-    <dimen name="preview_attribution_pane_arrow_size">48dp</dimen>
-    <dimen name="preview_attribution_pane_subtitle1_top_margin">12dp</dimen>
-    <dimen name="preview_attribution_pane_subtitle2_top_margin">2dp</dimen>
-    <dimen name="preview_attribution_pane_explore_height">48dp</dimen>
-    <dimen name="preview_attribution_pane_explore_left_margin">2dp</dimen>
-    <dimen name="preview_attribution_pane_explore_bottom_margin">16dp</dimen>
+    <!-- Dimensions for the attribution pane. -->
     <dimen name="preview_attribution_pane_horizontal_padding">24dp</dimen>
-    <dimen name="preview_attribution_pane_extra_spacer_height">16dp</dimen>
-    <dimen name="preview_attribution_pane_inner_spacer_height">14dp</dimen>
-    <dimen name="preview_attribution_pane_title_height">48dp</dimen>
-    <dimen name="preview_attribution_pane_author_height">24dp</dimen>
-    <dimen name="preview_attribution_pane_author_top_margin">0dp</dimen>
-    <dimen name="preview_attribution_pane_description_height">34dp</dimen>
-    <dimen name="preview_attribution_pane_button_bottom_margin">8dp</dimen>
-
-    <dimen name="preview_gradient_background_height">256dp</dimen>
 
     <!-- Dimensions for the "start rotation" dialog. -->
     <dimen name="start_rotation_dialog_subhead_margin_top">19dp</dimen>
@@ -139,10 +84,12 @@
     <dimen name="start_rotation_dialog_checkbox_area_margin_bottom">12dp</dimen>
 
     <!-- Dimensions for the "Set wallpaper" destination dialog. -->
-    <dimen name="set_wallpaper_dialog_padding_bottom">8dp</dimen>
-    <dimen name="set_wallpaper_dialog_padding_top">15dp</dimen>
-    <dimen name="set_wallpaper_dialog_item_min_height">48dp</dimen>
-    <dimen name="set_wallpaper_dialog_item_drawable_padding">32dp</dimen>
+    <dimen name="set_wallpaper_dialog_padding">24dp</dimen>
+    <dimen name="set_wallpaper_dialog_item_min_height">56dp</dimen>
+    <dimen name="set_wallpaper_dialog_item_min_width">300dp</dimen>
+    <dimen name="set_wallpaper_dialog_item_outer_corner_radius">12dp</dimen>
+    <dimen name="set_wallpaper_dialog_item_inner_corner_radius">4dp</dimen>
+    <dimen name="set_wallpaper_dialog_icon_size">32dp</dimen>
 
     <!-- Dimensions for the "wallpaper disabled by administrator" UI. -->
     <dimen name="wallpaper_disabled_asset_margin_bottom">26dp</dimen>
@@ -179,12 +126,7 @@
 
     <!-- Dimensions for the "disabled by admin" UI in desktop mode. -->
     <dimen name="disabled_by_admin_desktop_message_text_size">13sp</dimen>
-    <dimen name="preview_bottom_sheet_corner_radius">?android:attr/dialogCornerRadius</dimen>
-
-    <!-- Dimensions for the minimum height of the scalable content container. -->
-    <dimen name="content_container_minimum_height">300dp</dimen>
-    <!-- Dimensions for the maximum height of the scalable content container. -->
-    <dimen name="content_container_maximum_height">400dp</dimen>
+    <dimen name="preview_bottom_sheet_corner_radius">12dp</dimen>
 
     <!-- Dimensions for PreviewPager and PageIndicator. -->
     <dimen name="preview_indicator_width">16dp</dimen>
@@ -195,13 +137,11 @@
     <dimen name="indicator_arrow_container_margin_horizontal">4dp</dimen>
     <dimen name="preview_page_gap">16dp</dimen>
     <dimen name="preview_page_horizontal_margin">56dp</dimen>
-    <dimen name="preview_page_top_margin">30dp</dimen>
-    <dimen name="preview_page_bottom_margin">2dp</dimen>
+    <dimen name="preview_page_top_margin">24dp</dimen>
+    <dimen name="preview_page_bottom_margin">24dp</dimen>
     <dimen name="preview_card_padding">20dp</dimen>
     <dimen name="preview_pager_max_height">450dp</dimen>
     <dimen name="preview_pager_min_height">350dp</dimen>
-    <dimen name="preview_pager_height">450dp</dimen>
-    <dimen name="system_rounded_corner">@*android:dimen/rounded_corner_radius_top</dimen>
     <!-- The maximum height ratio of PreviewPager and its parent view. -->
     <item name="preview_pager_maximum_height_ratio" format="float" type="dimen">0.7</item>
 
@@ -210,31 +150,59 @@
     <dimen name="full_preview_page_default_padding_bottom">32dp</dimen>
 
     <!-- Dimensions for the bottom bar. -->
-    <dimen name="bottom_navbar_height">76dp</dimen>
-    <dimen name="bottom_action_bar_padding_horizontal">4dp</dimen>
-    <dimen name="bottom_action_bar_padding_top">6dp</dimen>
-    <dimen name="bottom_action_bar_preview_info_padding_vertical">20dp</dimen>
-    <dimen name="bottom_action_bar_elevation">10dp</dimen>
-    <dimen name="bottom_action_button_size">48dp</dimen>
-    <dimen name="bottom_action_button_padding">12dp</dimen>
-    <dimen name="bottom_action_icon_size">24dp</dimen>
+    <dimen name="bottom_actions_height">84dp</dimen>
+    <dimen name="bottom_actions_top_padding">24dp</dimen>
+    <dimen name="bottom_actions_bottom_padding">12dp</dimen>
+    <dimen name="bottom_action_button_width">72dp</dimen>
+    <dimen name="bottom_action_button_height">48dp</dimen>
+    <dimen name="bottom_action_button_padding_horizontal">26dp</dimen>
+    <dimen name="bottom_action_button_radius">100dp</dimen>
 
-    <dimen name="wallpaper_info_pane_top_padding">20dp</dimen>
-    <dimen name="wallpaper_info_pane_bottom_padding">24dp</dimen>
-    <dimen name="wallpaper_info_pane_horizontal_padding">24dp</dimen>
-    <dimen name="wallpaper_info_pane_subtitle1_top_margin">14dp</dimen>
-    <dimen name="wallpaper_info_pane_subtitle2_top_margin">4dp</dimen>
-    <dimen name="wallpaper_info_pane_explore_button_top_margin">12dp</dimen>
-    <dimen name="wallpaper_info_pane_title_height">48dp</dimen>
+    <!-- Whenever updating this file, ensure that
+         bottom_actions_plus_separated_tabs == bottom_actions_height + separated_tabs_height -->
+    <dimen name="bottom_actions_plus_separated_tabs">144dp</dimen>
+
+    <dimen name="bottom_sheet_margin">24dp</dimen>
+    <dimen name="wallpaper_info_pane_padding">24dp</dimen>
+    <dimen name="wallpaper_info_pane_subtitle1_top_margin">4dp</dimen>
+    <dimen name="wallpaper_info_pane_subtitle2_top_margin">24dp</dimen>
+    <dimen name="wallpaper_info_pane_explore_button_top_margin">50dp</dimen>
 
     <dimen name="option_border_width">2dp</dimen>
     <dimen name="option_selected_border_width">3dp</dimen>
-    <dimen name="option_title_font_text_size">12sp</dimen>
-    <dimen name="option_title_line_height">16dp</dimen>
+    <dimen name="option_title_font_text_size">14sp</dimen>
+    <dimen name="option_title_line_height">20dp</dimen>
+
+    <!-- Dimensions for the separated tabs. -->
+    <dimen name="separated_tabs_height">56dp</dimen>
+    <dimen name="separated_tabs_corner_radius">12dp</dimen>
+    <dimen name="separated_tabs_inset_horizontal">4dp</dimen>
+    <!--  Default page horizontal margin (24dp) - separated tabs inset horizontal (4dp) -->
+    <dimen name="separated_tabs_horizontal_margin">20dp</dimen>
+
+    <!-- Whenever updating this file, ensure that
+         fullscreen_preview_button_margin == - separated_tabs_height -->
+    <dimen name="fullscreen_preview_button_margin">-60dp</dimen>
+    <dimen name="fullscreen_preview_button_margin_between">15dp</dimen>
+    <dimen name="fullscreen_preview_button_margin_bottom">28dp</dimen>
+    <dimen name="fullscreen_preview_buttons_horizontal_margin">24dp</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>
+    <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>
+    <dimen name="section_horizontal_padding">24dp</dimen>
+    <dimen name="section_vertical_padding">24dp</dimen>
+    <dimen name="section_top_padding">16dp</dimen>
+    <dimen name="section_bottom_padding">16dp</dimen>
+
+    <!-- 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/picker_colors.xml b/res/values/picker_colors.xml
index 59f98c0..51438e6 100755
--- a/res/values/picker_colors.xml
+++ b/res/values/picker_colors.xml
@@ -14,57 +14,14 @@
      limitations under the License.
 -->
 <resources>
-    <color name="black_24_alpha">#3D000000</color>
-    <color name="black_38_alpha">#61000000</color>
-    <color name="black_54_alpha">#8A000000</color>
-    <color name="black_55_alpha">#8C000000</color>
-    <color name="black_67_alpha">#AB000000</color>
-    <color name="black_87_alpha">#DE000000</color>
-    <color name="translucent_black_lighter">#59000000</color>
     <!-- Color for material black text @ 60% opacity. -->
     <color name="translucent_black_60_alpha">#99000000</color>
     <color name="translucent_black_90_alpha">#E6000000</color>
     <color name="translucent_black">@color/translucent_black_60_alpha</color>
-
+    <color name="black_67_alpha">#AB000000</color>
     <color name="light_grey">#d8d8d8</color>
     <color name="white_34_alpha">#57FFFFFF</color>
-    <color name="white_54_alpha">#8AFFFFFF</color>
-    <color name="white_60_alpha">#99FFFFFF</color>
     <color name="white_67_alpha">#ABFFFFFF</color>
     <color name="white_70_alpha">#B3FFFFFF</color>
-    <color name="white_80_alpha">#CCFFFFFF</color>
-    <color name="white_87_alpha">#DEFFFFFF</color>
-    <color name="white_88_alpha">#E0FFFFFF</color>
 
-    <!-- Dark scrollbar thumb color (26% of black) -->
-    <color name="scrollbar_thumb_color_dark">#43000000</color>
-
-    <color name="category_picker_background_color">@color/material_grey200</color>
-    <color name="category_title_scrim_color">@color/translucent_black</color>
-    <color name="category_title_scrim_color_no_thumbnail">@color/translucent_black</color>
-    <color name="category_title_text_color">@color/material_white_100</color>
-
-    <color name="currently_set_presentation_mode_text_color">@color/category_title_text_color</color>
-    <color name="currently_set_title_text_color">@color/material_white_text</color>
-    <color name="currently_set_subtitle_text_color">@color/white_70_alpha</color>
-    <color name="currently_set_divider_background_color">@color/material_white_divider</color>
-    <color name="currently_set_explore_button_color">@color/white_80_alpha</color>
-
-    <color name="currently_set_both_header_scrim">@color/translucent_black</color>
-    <color name="currently_set_both_refresh_button_color">@color/material_white_100</color>
-    <color name="currently_set_both_title_text_color">@color/material_white_text</color>
-    <color name="currently_set_both_presentation_mode_text_color">@color/material_white_text</color>
-    <color name="currently_set_both_attribution_title_text_color">@color/material_white_text</color>
-    <color name="currently_set_both_attribution_subtitle_text_color">@color/white_70_alpha</color>
-
-    <color name="select_wallpaper_header_text_color">@color/white_60_alpha</color>
-
-    <color name="individual_tile_title_scrim_color">@color/translucent_black</color>
-    <color name="individual_tile_title_text_color">@color/material_white_100</color>
-
-    <color name="individual_picker_background_color">@color/translucent_black</color>
-
-    <color name="preview_pane_arrow_color">@color/material_white_100</color>
-
-    <color name="toolbar_icon_color">@color/material_white_text</color>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9ec0118..f370463 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -69,7 +69,7 @@
     <string name="home_and_lock_short_label">Home &#38; Lock</string>
 
     <!-- Label for a dialog which lets the user set an image as wallpaper. [CHAR LIMIT=50] -->
-    <string name="set_wallpaper_dialog_message">Set wallpaper</string>
+    <string name="set_wallpaper_dialog_message">Set wallpaper on</string>
 
     <!-- Label referring to the home screen of the device, i.e. shown behind the launcher.
          [CHAR LIMIT=100] -->
@@ -81,7 +81,7 @@
 
     <!-- Label referring to both the home screen and the lock screen of the
          device. [CHAR LIMIT=100] -->
-    <string name="set_wallpaper_both_destination">Home screen and lock screen</string>
+    <string name="set_wallpaper_both_destination">Home and lock screen</string>
 
     <!-- Label describing a live wallpaper whose responsibility is to display a different wallpaper
          on a periodic basis (i.e., in a daily rotation). [CHAR LIMIT=80] -->
@@ -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] -->
@@ -344,4 +344,17 @@
 
     <!-- Error message of the wallpaper's collection doesn't exist. [CHAR_LIMIT=NONE] -->
     <string name="collection_not_exist_msg">The collection doesn\'t exist</string>
+
+    <!-- Label for a button which lets user hide certain parts of the fullscreen preview UI. [CHAR LIMIT=30] -->
+    <string name="hide_ui_preview_text">Hide UI Preview</string>
+
+    <!-- Label for a button which lets user show certain parts of the fullscreen preview UI. [CHAR LIMIT=30] -->
+    <string name="show_ui_preview_text">Show UI Preview</string>
+
+    <!-- The title of wallpaper picker entry in new picker. [CHAR LIMIT=30]  -->
+    <string name="wallpaper_picker_entry_title" msgid="7039652539125902659">Change wallpaper</string>
+
+    <!-- Content description of wallpaper preview card (lockscreen). [CHAR_LIMIT=40]-->
+    <string name="lockscreen_wallpaper_preview_card_content_description" msgid="8575577284424318765">Lockscreen wallpaper preview</string>
+
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index dc807cb..071792b 100755
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -32,7 +32,8 @@
         <item name="colorControlHighlight">@color/ripple_material_dark</item>
         <item name="windowActionBar">false</item>
         <item name="windowNoTitle">true</item>
-        <item name="toolbarNavigationButtonStyle">@style/Widget.AppCompat.Toolbar.Button.Navigation</item>
+        <item name="toolbarNavigationButtonStyle">@android:style/Widget.Toolbar.Button.Navigation
+        </item>
 
         <item name="android:windowActionBar">false</item>
         <item name="android:windowNoTitle">true</item>
@@ -66,7 +67,8 @@
         <item name="selectableItemBackground">?android:attr/selectableItemBackground</item>
         <item name="dialogPreferredPadding">24dp</item>
         <item name="colorControlHighlight">@color/ripple_material_dark</item>
-        <item name="toolbarNavigationButtonStyle">@style/Widget.AppCompat.Toolbar.Button.Navigation</item>
+        <item name="toolbarNavigationButtonStyle">@android:style/Widget.Toolbar.Button.Navigation
+        </item>
 
         <!-- Set status bar and navigation buttons to be translucent. -->
         <item name="android:colorPrimaryDark">@color/translucent_black</item>
@@ -74,83 +76,55 @@
         <item name="android:navigationBarColor">@android:color/transparent</item>
 
         <!-- Apply borderless button style for the right ripple effect. -->
-        <item name="borderlessButtonStyle">@style/Widget.AppCompat.Button.Borderless</item>
+        <item name="borderlessButtonStyle">@android:style/Widget.DeviceDefault.Button.Borderless
+        </item>
 
         <item name="android:actionBarItemBackground">
             ?android:attr/selectableItemBackgroundBorderless
         </item>
     </style>
 
-    <style name="WallpaperTheme.DarkActionBar" parent="@style/WallpaperTheme.Preview">
-        <item name="colorControlNormal">?attr/colorPrimary</item>
-        <item name="colorButtonNormal">?attr/colorPrimary</item>
-        <item name="android:colorControlActivated">?attr/colorPrimary</item>
-        <item name="android:colorControlHighlight">?attr/colorPrimary</item>
-        <item name="actionMenuTextColor">?attr/colorPrimary</item>
-        <item name="android:actionMenuTextColor">?attr/colorPrimary</item>
-        <item name="android:actionMenuTextAppearance">@style/WallpaperPicker.Preview.TextAppearance.ActionBar</item>
-    </style>
-
-    <!-- Toolbar -->
-    <style name="TranslucentToolbarStyle" parent="@style/Widget.AppCompat.Toolbar">
-        <item name="android:background">@android:color/transparent</item>
-        <item name="android:theme">@style/WallpaperTheme.DarkActionBar</item>
-    </style>
-
-    <style name="RegularToolbarStyle" parent="@style/Widget.AppCompat.Toolbar">
-        <item name="android:background">@color/toolbar_color</item>
-        <item name="android:elevation">0dp</item>
-        <item name="android:theme">@style/WallpaperTheme</item>
-    </style>
-
     <!-- Dialog themes -->
     <style name="LightDialogTheme" parent="@android:style/Theme.DeviceDefault.Dialog.NoActionBar">
         <item name="android:layout">@layout/abc_alert_dialog_material</item>
         <item name="windowActionBar">false</item>
+        <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
+        <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
+        <item name="android:dialogCornerRadius">24dp</item>
     </style>
 
     <style name="ProgressDialogThemePreL" parent="@style/Theme.AppCompat.Light.Dialog.Alert">
         <item name="android:windowBackground">@android:color/transparent</item>
     </style>
 
-    <!-- Individual components / Widgets -->
+    <!-- Text appearance -->
     <style name="TitleTextAppearance" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"/>
 
     <style name="SubtitleTextAppearance" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle"/>
 
-    <style name="ButtonStyle" parent="@android:style/Widget.DeviceDefault.Button.Colored">
-        <item name="android:padding">16dp</item>
-        <item name="android:minHeight">48dp</item>
+    <style name="SeparatedTabsTextAppearance" parent="TitleTextAppearance">
+        <item name="android:textStyle" />
+        <item name="textAllCaps">false</item>
+        <item name="android:textSize">14sp</item>
+        <item name="android:letterSpacing">0.02</item>
     </style>
 
+    <!-- Individual components / Widgets -->
     <style name="OutlinedButtonStyle"  parent="@android:style/Widget.DeviceDefault.Button">
         <item name="android:background">@drawable/btn_transparent</item>
         <item name="android:textColor">?android:attr/colorAccent</item>
     </style>
 
-    <style name="ActionBarCheckboxStyle" parent="@android:style/Widget.DeviceDefault.CompoundButton.CheckBox">
-        <item name="android:textColor">?android:attr/colorPrimary</item>
-    </style>
-
-    <style name="PreviewCheckboxDeviceTheme" parent="@android:style/Theme.DeviceDefault">
-        <item name="android:colorControlNormal">?android:attr/colorPrimary</item>
-    </style>
-
-    <style name="select_wallpaper_header">
-        <item name="android:textColor">@color/translucent_black_60_alpha</item>
-        <item name="android:textStyle">bold</item>
-        <item name="android:textSize">@dimen/abc_text_size_body_2_material</item>
+    <style name="ExploreButtonStyle"  parent="OutlinedButtonStyle">
+        <item name="android:insetLeft">0dp</item>
+        <item name="android:insetRight">0dp</item>
+        <item name="android:minWidth">0dp</item>
+        <item name="android:minHeight">22sp</item>
+        <item name="android:textSize">16sp</item>
     </style>
 
     <!-- Preview attribution pane styles -->
-    <style name="WallpaperPicker.BottomPaneStyle" parent="@android:style/Theme.DeviceDefault.Settings">
-        <item name="android:textColorPrimary">@color/material_white_100</item>
-        <item name="android:textColorSecondary">@color/white_70_alpha</item>
-        <item name="tabTextAppearance">@style/WallpaperPicker.Preview.TextAppearance.NoAllCaps</item>
-        <item name="tabIndicatorColor">?android:attr/textColorPrimary</item>
-        <item name="tabGravity">fill</item>
-        <item name="tabMaxWidth">0dp</item>
-    </style>
+    <style name="WallpaperPicker.BottomPaneStyle" parent="@android:style/Theme.DeviceDefault.Settings"/>
 
     <!-- Preview customization pane styles -->
     <style name="WallpaperPicker.CustomizationPaneStyle" parent="@android:style/Theme.DeviceDefault.Settings">
@@ -160,43 +134,23 @@
         <item name="tabMaxWidth">0dp</item>
     </style>
 
-    <style name="preview_attribution_pane_title">
-        <item name="android:textColor">@color/material_white_text</item>
-        <item name="android:textSize">@dimen/abc_text_size_subhead_material</item>
-    </style>
-
-    <style name="preview_attribution_pane_subtitle">
-        <item name="android:textColor">@color/material_white_text</item>
-        <item name="android:textSize">@dimen/abc_text_size_body_2_material</item>
-    </style>
-
     <style name="WallpaperPicker.Preview.TextAppearance.NoAllCaps"
         parent="@android:style/TextAppearance.DeviceDefault.Widget.TabWidget">
         <item name="android:textAllCaps">false</item>
     </style>
 
-    <style name="WallpaperPicker.Preview.TextAppearance.ActionBar"
-        parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Menu">
-        <item name="android:textAllCaps">false</item>
-        <item name="android:textColor">@color/material_white_100</item>
-    </style>
-
     <!-- Set wallpaper destination item -->
+    <!-- Studio can't directly reference ?androidprv:attr/textColorOnAccent here,
+     so we set the text color on the dialog items instead. -->
     <style name="set_wallpaper_destination_item">
+        <item name="android:fontFamily">@*android:string/config_bodyFontFamilyMedium</item>
         <item name="android:minHeight">@dimen/set_wallpaper_dialog_item_min_height</item>
-        <item name="android:textAlignment">viewStart</item>
-        <item name="android:textAppearance">?attr/textAppearanceListItemSmall</item>
-        <item name="android:textColor">?android:attr/textColorPrimary</item>
-        <item name="android:textSize">@dimen/abc_text_size_subhead_material</item>
-        <item name="android:gravity">center_vertical</item>
-        <item name="android:alpha">.87</item>
-        <item name="android:paddingStart">?attr/dialogPreferredPadding</item>
-        <item name="android:paddingEnd">?attr/dialogPreferredPadding</item>
-        <item name="android:background">?attr/selectableItemBackground</item>
-        <item name="android:drawablePadding">@dimen/set_wallpaper_dialog_item_drawable_padding
-        </item>
-        <item name="android:drawableTint">?android:colorAccent</item>
-        <item name="android:drawableTintMode">src_atop</item>
+        <item name="android:minWidth">@dimen/set_wallpaper_dialog_item_min_width</item>
+        <item name="android:textAlignment">center</item>
+        <item name="android:textSize">@dimen/abc_text_size_small_material</item>
+        <item name="android:letterSpacing">0.02</item>
+        <item name="android:gravity">center</item>
+        <item name="android:background">@drawable/dialog_option_background</item>
     </style>
 
     <!-- Desktop UI - category tabs layout -->
@@ -217,18 +171,16 @@
         <item name="cardCornerRadius">?android:dialogCornerRadius</item>
         <item name="android:clipChildren">true</item>
         <item name="contentPadding">@dimen/preview_card_padding</item>
-        <item name="cardBackgroundColor">?android:colorPrimary</item>
+        <item name="cardElevation">0dp</item>
     </style>
 
     <style name="FullContentPreviewCard" parent="PreviewCard">
-        <item name="android:clipChildren">true</item>
         <item name="contentPadding">0dp</item>
-        <item name="cardBackgroundColor">?android:colorPrimary</item>
     </style>
 
     <!-- Bottom action item -->
     <style name="BottomActionItemStyle">
-        <item name="android:tint">@color/material_grey500</item>
+        <item name="android:paddingHorizontal">@dimen/bottom_action_button_padding_horizontal</item>
     </style>
 
     <!-- Option tiles -->
diff --git a/res/xml/no_backup_image_wallpaper.xml b/res/xml/no_backup_image_wallpaper.xml
deleted file mode 100755
index d438b69..0000000
--- a/res/xml/no_backup_image_wallpaper.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-     Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
-    android:description="@string/no_backup_image_wallpaper_description"
-    android:label="@string/no_backup_image_wallpaper_label"
-    android:thumbnail="@drawable/material_ic_wallpaper_white_48" />
diff --git a/robolectric_tests/config/robolectric.properties b/robolectric_tests/config/robolectric.properties
index 197c393..c222b11 100644
--- a/robolectric_tests/config/robolectric.properties
+++ b/robolectric_tests/config/robolectric.properties
@@ -1,2 +1,2 @@
-manifest=vendor/unbundled_google/packages/WallpaperPickerGoogle/AndroidManifest.xml
+manifest=packages/apps/WallpaperPicker2/AndroidManifest.xml
 sdk=27
diff --git a/src/com/android/wallpaper/asset/Asset.java b/src/com/android/wallpaper/asset/Asset.java
index dc4a5e6..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;
@@ -82,16 +83,16 @@
 
     /**
      * Decodes and downscales a bitmap region off the main UI thread.
-     *
      * @param rect         Rect representing the crop region in terms of the original image's
      *                     resolution.
      * @param targetWidth  Width of target view in physical pixels.
      * @param targetHeight Height of target view in physical pixels.
+     * @param shouldAdjustForRtl whether the region selected should be adjusted for RTL (that is,
+     *                           the crop region will be considered starting from the right)
      * @param receiver     Called with the decoded bitmap region or null if there was an error
-     *                     decoding the bitmap region.
      */
     public abstract void decodeBitmapRegion(Rect rect, int targetWidth, int targetHeight,
-            BitmapReceiver receiver);
+            boolean shouldAdjustForRtl, BitmapReceiver receiver);
 
     /**
      * Calculates the raw dimensions of the asset at its original resolution off the main UI thread.
@@ -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();
@@ -283,6 +295,7 @@
 
             BitmapCropper bitmapCropper = InjectorProvider.getInjector().getBitmapCropper();
             bitmapCropper.cropAndScaleBitmap(this, /* scale= */ 1f, visibleRawWallpaperRect,
+                    WallpaperCropUtils.isRtl(activity),
                     new BitmapCropper.Callback() {
                         @Override
                         public void onBitmapCropped(Bitmap croppedBitmap) {
diff --git a/src/com/android/wallpaper/asset/BitmapCachingAsset.java b/src/com/android/wallpaper/asset/BitmapCachingAsset.java
index 5bc3703..bc38a9e 100644
--- a/src/com/android/wallpaper/asset/BitmapCachingAsset.java
+++ b/src/com/android/wallpaper/asset/BitmapCachingAsset.java
@@ -21,6 +21,7 @@
 import android.graphics.Bitmap;
 import android.graphics.Rect;
 import android.util.LruCache;
+import android.widget.ImageView;
 
 import androidx.annotation.Nullable;
 import androidx.core.app.ActivityManagerCompat;
@@ -37,27 +38,37 @@
 public class BitmapCachingAsset extends Asset {
 
     private static class CacheKey {
-        final Asset asset;
-        final int width;
-        final int height;
+        final Asset mAsset;
+        final int mWidth;
+        final int mHeight;
+        final boolean mRtl;
+        final Rect mRect;
 
         CacheKey(Asset asset, int width, int height) {
-            this.asset = asset;
-            this.width = width;
-            this.height = height;
+            this(asset, width, height, false, null);
+        }
+
+        CacheKey(Asset asset, int width, int height, boolean rtl, Rect rect) {
+            mAsset = asset;
+            mWidth = width;
+            mHeight = height;
+            mRtl = rtl;
+            mRect = rect;
         }
 
         @Override
         public int hashCode() {
-            return Objects.hash(asset, width, height);
+            return Objects.hash(mAsset, mWidth, mHeight);
         }
 
         @Override
         public boolean equals(Object obj) {
             return obj instanceof CacheKey
-                    && ((CacheKey)obj).asset == this.asset
-                    && ((CacheKey)obj).width == this.width
-                    && ((CacheKey)obj).height == this.height;
+                    && (Objects.equals(this.mAsset, ((CacheKey) obj).mAsset))
+                    && ((CacheKey) obj).mWidth == this.mWidth
+                    && ((CacheKey) obj).mHeight == this.mHeight
+                    && ((CacheKey) obj).mRtl == this.mRtl
+                    && (Objects.equals(this.mRect, ((CacheKey) obj).mRect));
         }
     }
 
@@ -72,7 +83,8 @@
     private final Asset mOriginalAsset;
 
     public BitmapCachingAsset(Context context, Asset originalAsset) {
-        mOriginalAsset = originalAsset;
+        mOriginalAsset = originalAsset instanceof BitmapCachingAsset
+                ? ((BitmapCachingAsset) originalAsset).mOriginalAsset : originalAsset;
         mIsLowRam = ActivityManagerCompat.isLowRamDevice(
                 (ActivityManager) context.getApplicationContext().getSystemService(
                         Context.ACTIVITY_SERVICE));
@@ -101,8 +113,27 @@
 
     @Override
     public void decodeBitmapRegion(Rect rect, int targetWidth, int targetHeight,
-            BitmapReceiver receiver) {
-        mOriginalAsset.decodeBitmapRegion(rect, targetWidth, targetHeight, receiver);
+            boolean shouldAdjustForRtl, BitmapReceiver receiver) {
+        // Skip the cache in low ram devices
+        if (mIsLowRam) {
+            mOriginalAsset.decodeBitmapRegion(rect, targetWidth, targetHeight, shouldAdjustForRtl,
+                    receiver);
+            return;
+        }
+        CacheKey key = new CacheKey(mOriginalAsset, targetWidth, targetHeight, shouldAdjustForRtl,
+                rect);
+        Bitmap cached = sCache.get(key);
+        if (cached != null) {
+            receiver.onBitmapDecoded(cached);
+        } else {
+            mOriginalAsset.decodeBitmapRegion(rect, targetWidth, targetHeight, shouldAdjustForRtl,
+                    bitmap -> {
+                        if (bitmap != null) {
+                            sCache.put(key, bitmap);
+                        }
+                        receiver.onBitmapDecoded(bitmap);
+                    });
+        }
     }
 
     @Override
@@ -114,4 +145,10 @@
     public boolean supportsTiling() {
         return mOriginalAsset.supportsTiling();
     }
+
+    @Override
+    public void loadPreviewImage(Activity activity, ImageView imageView, int placeholderColor) {
+        // Honor the original Asset's preview image loading
+        mOriginalAsset.loadPreviewImage(activity, imageView, placeholderColor);
+    }
 }
diff --git a/src/com/android/wallpaper/asset/BuiltInWallpaperAsset.java b/src/com/android/wallpaper/asset/BuiltInWallpaperAsset.java
index 1c73511..4d006ca 100755
--- a/src/com/android/wallpaper/asset/BuiltInWallpaperAsset.java
+++ b/src/com/android/wallpaper/asset/BuiltInWallpaperAsset.java
@@ -67,7 +67,7 @@
 
     @Override
     public void decodeBitmapRegion(Rect rect, int targetWidth, int targetHeight,
-                                   BitmapReceiver receiver) {
+            boolean shouldAdjustForRtl, BitmapReceiver receiver) {
         DecodeBitmapRegionAsyncTask task = new DecodeBitmapRegionAsyncTask(rect, receiver);
         task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     }
diff --git a/src/com/android/wallpaper/asset/ContentUriAsset.java b/src/com/android/wallpaper/asset/ContentUriAsset.java
index a240420..e5f446b 100755
--- a/src/com/android/wallpaper/asset/ContentUriAsset.java
+++ b/src/com/android/wallpaper/asset/ContentUriAsset.java
@@ -111,12 +111,12 @@
 
     @Override
     public void decodeBitmapRegion(final Rect rect, int targetWidth, int targetHeight,
-                                   final BitmapReceiver receiver) {
+            boolean shouldAdjustForRtl, final BitmapReceiver receiver) {
         // BitmapRegionDecoder only supports images encoded in either JPEG or PNG, so if the content
         // URI asset is encoded with another format (for example, GIF), then fall back to cropping a
         // bitmap region from the full-sized bitmap.
         if (isJpeg() || isPng()) {
-            super.decodeBitmapRegion(rect, targetWidth, targetHeight, receiver);
+            super.decodeBitmapRegion(rect, targetWidth, targetHeight, shouldAdjustForRtl, receiver);
             return;
         }
 
diff --git a/src/com/android/wallpaper/asset/CurrentWallpaperAssetV16.java b/src/com/android/wallpaper/asset/CurrentWallpaperAssetV16.java
index 3243e68..530c3a7 100755
--- a/src/com/android/wallpaper/asset/CurrentWallpaperAssetV16.java
+++ b/src/com/android/wallpaper/asset/CurrentWallpaperAssetV16.java
@@ -33,6 +33,7 @@
     private static final boolean FILTER_SCALED_BITMAP = true;
 
     private Context mApplicationContext;
+    private Drawable mCurrentWallpaperDrawable;
 
     public CurrentWallpaperAssetV16(Context context) {
         mApplicationContext = context.getApplicationContext();
@@ -40,7 +41,7 @@
 
     @Override
     public void decodeBitmapRegion(Rect rect, int targetWidth, int targetHeight,
-                                   BitmapReceiver receiver) {
+            boolean shouldAdjustForRtl, BitmapReceiver receiver) {
         receiver.onBitmapDecoded(null);
     }
 
@@ -62,17 +63,19 @@
         task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     }
 
-    private Drawable getCurrentWallpaperDrawable() {
-        WallpaperManager wallpaperManager = WallpaperManager.getInstance(mApplicationContext);
-        Drawable drawable;
-        try {
-            drawable = wallpaperManager.getDrawable();
-        } catch (java.lang.SecurityException e) {
-            // Work around Samsung bug where SecurityException is thrown if device is still using its
-            // default wallpaper.
-            drawable = wallpaperManager.getBuiltInDrawable();
+    private synchronized Drawable getCurrentWallpaperDrawable() {
+        if (mCurrentWallpaperDrawable != null) {
+            return mCurrentWallpaperDrawable;
         }
-        return drawable;
+        WallpaperManager wallpaperManager = WallpaperManager.getInstance(mApplicationContext);
+        try {
+            mCurrentWallpaperDrawable = wallpaperManager.getDrawable();
+        } catch (java.lang.SecurityException e) {
+            // Work around Samsung bug where SecurityException is thrown if device is still using
+            // its default wallpaper.
+            mCurrentWallpaperDrawable = wallpaperManager.getBuiltInDrawable();
+        }
+        return mCurrentWallpaperDrawable;
     }
 
     /**
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/LiveWallpaperThumbAsset.java b/src/com/android/wallpaper/asset/LiveWallpaperThumbAsset.java
index 8e7c0f0..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,26 +31,36 @@
 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;
 import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
 import com.bumptech.glide.request.RequestOptions;
 
 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();
@@ -71,7 +82,7 @@
 
     @Override
     public void decodeBitmapRegion(Rect rect, int targetWidth, int targetHeight,
-                                   BitmapReceiver receiver) {
+            boolean shouldAdjustForRtl, BitmapReceiver receiver) {
         receiver.onBitmapDecoded(null);
     }
 
@@ -106,6 +117,56 @@
                 .into(imageView);
     }
 
+    @Override
+    public void loadLowResDrawable(Activity activity, ImageView imageView, int placeholderColor,
+            BitmapTransformation transformation) {
+        Transformation<Bitmap> finalTransformation = (transformation == null)
+                ? new FitCenter()
+                : new MultiTransformation<>(new FitCenter(), transformation);
+        Glide.with(activity)
+                .asDrawable()
+                .load(LiveWallpaperThumbAsset.this)
+                .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.
      */
@@ -118,13 +179,12 @@
      * 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");
+            try (AssetFileDescriptor assetFileDescriptor =
+                         mContext.getContentResolver().openAssetFileDescriptor(mUri, "r")) {
                 if (assetFileDescriptor != null) {
                     mThumbnailDrawable = new BitmapDrawable(mContext.getResources(),
                             BitmapFactory.decodeStream(assetFileDescriptor.createInputStream()));
@@ -134,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/asset/StreamableAsset.java b/src/com/android/wallpaper/asset/StreamableAsset.java
index 17f2522..227f748 100755
--- a/src/com/android/wallpaper/asset/StreamableAsset.java
+++ b/src/com/android/wallpaper/asset/StreamableAsset.java
@@ -87,8 +87,8 @@
 
     @Override
     public void decodeBitmapRegion(Rect rect, int targetWidth, int targetHeight,
-                                   BitmapReceiver receiver) {
-        runDecodeBitmapRegionTask(rect, targetWidth, targetHeight, receiver);
+            boolean shouldAdjustForRtl, BitmapReceiver receiver) {
+        runDecodeBitmapRegionTask(rect, targetWidth, targetHeight, shouldAdjustForRtl, receiver);
     }
 
     @Override
@@ -136,14 +136,15 @@
      * @param rect         Rect representing the crop region in terms of the original image's resolution.
      * @param targetWidth  Width of target view in physical pixels.
      * @param targetHeight Height of target view in physical pixels.
+     * @param isRtl
      * @param receiver     Called with the decoded bitmap region or null if there was an error decoding
      *                     the bitmap region.
      * @return AsyncTask reference so that the decoding task can be canceled before it starts.
      */
     public AsyncTask runDecodeBitmapRegionTask(Rect rect, int targetWidth, int targetHeight,
-                                               BitmapReceiver receiver) {
+            boolean isRtl, BitmapReceiver receiver) {
         DecodeBitmapRegionAsyncTask task =
-                new DecodeBitmapRegionAsyncTask(rect, targetWidth, targetHeight, receiver);
+                new DecodeBitmapRegionAsyncTask(rect, targetWidth, targetHeight, isRtl, receiver);
         task.execute();
         return task;
     }
@@ -299,17 +300,19 @@
      */
     private class DecodeBitmapRegionAsyncTask extends AsyncTask<Void, Void, Bitmap> {
 
+        private final boolean mIsRtl;
         private Rect mCropRect;
-        private BitmapReceiver mReceiver;
+        private final BitmapReceiver mReceiver;
         private int mTargetWidth;
         private int mTargetHeight;
 
         public DecodeBitmapRegionAsyncTask(Rect rect, int targetWidth, int targetHeight,
-                                           BitmapReceiver receiver) {
+                boolean isRtl, BitmapReceiver receiver) {
             mCropRect = rect;
             mReceiver = receiver;
             mTargetWidth = targetWidth;
             mTargetHeight = targetHeight;
+            mIsRtl = isRtl;
         }
 
         @Override
@@ -324,8 +327,15 @@
             }
 
             // Rotate crop rect if image is rotated more than 0 degrees.
+            Point dimensions = calculateRawDimensions();
             mCropRect = CropRectRotator.rotateCropRectForExifOrientation(
-                    calculateRawDimensions(), mCropRect, exifOrientation);
+                    dimensions, mCropRect, exifOrientation);
+
+            // If we're in RTL mode, center in the rightmost side of the image
+            if (mIsRtl) {
+                mCropRect.set(dimensions.x - mCropRect.right, mCropRect.top,
+                        dimensions.x - mCropRect.left, mCropRect.bottom);
+            }
 
             BitmapFactory.Options options = new BitmapFactory.Options();
             options.inSampleSize = BitmapUtils.calculateInSampleSize(
@@ -355,6 +365,9 @@
                 } catch (OutOfMemoryError e) {
                     Log.e(TAG, "Out of memory and unable to decode bitmap region", e);
                     return null;
+                } catch (IllegalArgumentException e){
+                    Log.e(TAG, "Illegal argument for decoding bitmap region", e);
+                    return null;
                 }
             }
 
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/Category.java b/src/com/android/wallpaper/model/Category.java
index c353e19..99d7500 100755
--- a/src/com/android/wallpaper/model/Category.java
+++ b/src/com/android/wallpaper/model/Category.java
@@ -20,6 +20,8 @@
 import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
 
+import androidx.annotation.Nullable;
+
 import com.android.wallpaper.asset.Asset;
 
 /**
@@ -64,6 +66,25 @@
     }
 
     /**
+     * Returns true if this category contains a single Wallpaper, which could then be retrieved
+     * via {@link #getSingleWallpaper()}
+     */
+    public boolean isSingleWallpaperCategory() {
+        return false;
+    }
+
+    /**
+     * If {@link #isSingleWallpaperCategory()} returned true, this method will return the single
+     * wallpaper contained in this category.
+     * @return a {@link WallpaperInfo} for the one wallpaper in this category, if this category is
+     * a single wallpaper category, or {@code null} otherwise.
+     */
+    @Nullable
+    public WallpaperInfo getSingleWallpaper() {
+        return null;
+    }
+
+    /**
      * @return The title of the category.
      */
     public String getTitle() {
diff --git a/src/com/android/wallpaper/model/CategoryProvider.java b/src/com/android/wallpaper/model/CategoryProvider.java
index b86e6df..93158a3 100755
--- a/src/com/android/wallpaper/model/CategoryProvider.java
+++ b/src/com/android/wallpaper/model/CategoryProvider.java
@@ -62,6 +62,13 @@
 
     /**
      * 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.
+     */
+    boolean isFeaturedCollectionAvailable();
 }
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/CustomizationSectionController.java b/src/com/android/wallpaper/model/CustomizationSectionController.java
new file mode 100644
index 0000000..b01f098
--- /dev/null
+++ b/src/com/android/wallpaper/model/CustomizationSectionController.java
@@ -0,0 +1,57 @@
+/*
+ * 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.model;
+
+import android.content.Context;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.android.wallpaper.picker.SectionView;
+
+/**
+ * The interface for the behavior of section in the customization picker.
+ *
+ * @param <T> the {@link SectionView} to create for the section
+ */
+public interface CustomizationSectionController<T extends SectionView> {
+
+    /** Interface for customization section navigation. */
+    interface CustomizationSectionNavigationController {
+        /** Navigates to the given {@code fragment}. */
+        void navigateTo(Fragment fragment);
+    }
+
+    /** Returns {@code true} if the customization section is available. */
+    boolean isAvailable(@Nullable Context context);
+
+    /**
+     * Returns a newly created {@link SectionView} for the section.
+     *
+     * @param context the {@link Context} to inflate view
+     */
+    T createView(Context context);
+
+    /** Saves the view state for configuration changes. */
+    default void onSaveInstanceState(Bundle savedInstanceState) {}
+
+    /** 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 6b69a0c..bfa1318 100755
--- a/src/com/android/wallpaper/model/LiveWallpaperInfo.java
+++ b/src/com/android/wallpaper/model/LiveWallpaperInfo.java
@@ -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();
@@ -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/PermissionRequester.java b/src/com/android/wallpaper/model/PermissionRequester.java
new file mode 100644
index 0000000..e15d588
--- /dev/null
+++ b/src/com/android/wallpaper/model/PermissionRequester.java
@@ -0,0 +1,30 @@
+/*
+ * 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.model;
+
+import com.android.wallpaper.picker.MyPhotosStarter;
+
+/**
+ * The interface for a class that can request the permission.
+ */
+public interface PermissionRequester {
+    /**
+     * Requests the {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} permission.
+     *
+     * @param listener the listener to be notified of permissions grant status changes
+     */
+    void requestExternalStoragePermission(MyPhotosStarter.PermissionChangedListener listener);
+}
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/WallpaperCategory.java b/src/com/android/wallpaper/model/WallpaperCategory.java
index 858d19f..0393a48 100755
--- a/src/com/android/wallpaper/model/WallpaperCategory.java
+++ b/src/com/android/wallpaper/model/WallpaperCategory.java
@@ -21,6 +21,7 @@
 import android.util.AttributeSet;
 
 import androidx.annotation.IdRes;
+import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 
 import com.android.wallpaper.asset.Asset;
@@ -83,6 +84,17 @@
         return true;
     }
 
+    @Override
+    public boolean isSingleWallpaperCategory() {
+        return mWallpapers != null && mWallpapers.size() == 1;
+    }
+
+    @Nullable
+    @Override
+    public WallpaperInfo getSingleWallpaper() {
+        return isSingleWallpaperCategory() ? mWallpapers.get(0) : null;
+    }
+
     /**
      * Returns the mutable list of wallpapers backed by this WallpaperCategory. All reads and writes
      * on the returned list must be synchronized with {@code mWallpapersLock}.
diff --git a/src/com/android/wallpaper/model/WallpaperColorsViewModel.kt b/src/com/android/wallpaper/model/WallpaperColorsViewModel.kt
new file mode 100644
index 0000000..cecadb1
--- /dev/null
+++ b/src/com/android/wallpaper/model/WallpaperColorsViewModel.kt
@@ -0,0 +1,40 @@
+/*
+ * 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.model
+
+import android.app.WallpaperColors
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+
+/**
+ * ViewModel class to keep track of WallpaperColors for the current wallpaper
+ */
+class WallpaperColorsViewModel : ViewModel() {
+
+    /**
+     * WallpaperColors for the currently set home wallpaper
+     */
+    val homeWallpaperColors: MutableLiveData<WallpaperColors> by lazy {
+        MutableLiveData<WallpaperColors>()
+    }
+
+    /**
+     * WallpaperColors for the currently set lock wallpaper
+     */
+    val lockWallpaperColors: MutableLiveData<WallpaperColors> by lazy {
+        MutableLiveData<WallpaperColors>()
+    }
+}
\ No newline at end of file
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/WallpaperPreviewNavigator.java b/src/com/android/wallpaper/model/WallpaperPreviewNavigator.java
new file mode 100644
index 0000000..bf1642a
--- /dev/null
+++ b/src/com/android/wallpaper/model/WallpaperPreviewNavigator.java
@@ -0,0 +1,32 @@
+/*
+ * 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.model;
+
+import com.android.wallpaper.model.WallpaperInfo;
+
+/**
+ * Navigates to a wallpaper preview activity.
+ */
+public interface WallpaperPreviewNavigator {
+    /**
+     * Navigates full screen wallpaper preview
+     *
+     * @param wallpaperInfo the wallpaper to preview
+     * @param isViewAsHome  {@code true} if it's home wallpaper preview, {@code false} if it's
+     *                      lock screen wallpaper preview
+     */
+    void showViewOnlyPreview(WallpaperInfo wallpaperInfo, boolean isViewAsHome);
+}
diff --git a/src/com/android/wallpaper/model/WallpaperSectionController.java b/src/com/android/wallpaper/model/WallpaperSectionController.java
new file mode 100644
index 0000000..f8bd2f3
--- /dev/null
+++ b/src/com/android/wallpaper/model/WallpaperSectionController.java
@@ -0,0 +1,554 @@
+/*
+ * 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.model;
+
+import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
+
+import android.animation.Animator;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.WallpaperColors;
+import android.app.WallpaperManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.service.wallpaper.WallpaperService;
+import android.view.LayoutInflater;
+import android.view.SurfaceView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.MainThread;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.cardview.widget.CardView;
+import androidx.core.widget.ContentLoadingProgressBar;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.OnLifecycleEvent;
+
+import com.android.wallpaper.R;
+import com.android.wallpaper.asset.Asset;
+import com.android.wallpaper.asset.BitmapCachingAsset;
+import com.android.wallpaper.module.CurrentWallpaperInfoFactory;
+import com.android.wallpaper.module.InjectorProvider;
+import com.android.wallpaper.module.UserEventLogger;
+import com.android.wallpaper.picker.CategorySelectorFragment;
+import com.android.wallpaper.picker.MyPhotosStarter;
+import com.android.wallpaper.picker.WallpaperSectionView;
+import com.android.wallpaper.picker.WorkspaceSurfaceHolderCallback;
+import com.android.wallpaper.util.ResourceUtils;
+import com.android.wallpaper.util.WallpaperConnection;
+import com.android.wallpaper.util.WallpaperSurfaceCallback;
+import com.android.wallpaper.widget.LockScreenPreviewer;
+
+/** The class to control the wallpaper section view. */
+public class WallpaperSectionController implements
+        CustomizationSectionController<WallpaperSectionView>,
+        LifecycleObserver {
+
+    private static final String PERMISSION_READ_WALLPAPER_INTERNAL =
+            "android.permission.READ_WALLPAPER_INTERNAL";
+    private static final int SETTINGS_APP_INFO_REQUEST_CODE = 1;
+
+    private CardView mHomePreviewCard;
+    private ContentLoadingProgressBar mHomePreviewProgress;
+    private SurfaceView mWorkspaceSurface;
+    private WorkspaceSurfaceHolderCallback mWorkspaceSurfaceCallback;
+    private SurfaceView mHomeWallpaperSurface;
+    private WallpaperSurfaceCallback mHomeWallpaperSurfaceCallback;
+    private SurfaceView mLockWallpaperSurface;
+    private WallpaperSurfaceCallback mLockWallpaperSurfaceCallback;
+    private CardView mLockscreenPreviewCard;
+    private ViewGroup mLockPreviewContainer;
+    private ContentLoadingProgressBar mLockscreenPreviewProgress;
+    private WallpaperConnection mWallpaperConnection;
+
+    // The wallpaper information which is currently shown on the home preview.
+    private WallpaperInfo mHomePreviewWallpaperInfo;
+    // The wallpaper information which is currently shown on the lock preview.
+    private WallpaperInfo mLockPreviewWallpaperInfo;
+
+    private LockScreenPreviewer mLockScreenPreviewer;
+
+    private final Activity mActivity;
+    private final Context mAppContext;
+    private final LifecycleOwner mLifecycleOwner;
+    private final PermissionRequester mPermissionRequester;
+    private final WallpaperColorsViewModel mWallpaperColorsViewModel;
+    private final WorkspaceViewModel mWorkspaceViewModel;
+    private final CustomizationSectionNavigationController mSectionNavigationController;
+    private final WallpaperPreviewNavigator mWallpaperPreviewNavigator;
+    private final Bundle mSavedInstanceState;
+
+    public WallpaperSectionController(Activity activity, LifecycleOwner lifecycleOwner,
+            PermissionRequester permissionRequester, WallpaperColorsViewModel colorsViewModel,
+            WorkspaceViewModel workspaceViewModel,
+            CustomizationSectionNavigationController sectionNavigationController,
+            WallpaperPreviewNavigator wallpaperPreviewNavigator,
+            Bundle savedInstanceState) {
+        mActivity = activity;
+        mLifecycleOwner = lifecycleOwner;
+        mPermissionRequester = permissionRequester;
+        mAppContext = mActivity.getApplicationContext();
+        mWallpaperColorsViewModel = colorsViewModel;
+        mWorkspaceViewModel = workspaceViewModel;
+        mSectionNavigationController = sectionNavigationController;
+        mWallpaperPreviewNavigator = wallpaperPreviewNavigator;
+        mSavedInstanceState = savedInstanceState;
+    }
+
+    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
+    @MainThread
+    public void onResume() {
+        refreshCurrentWallpapers(/* forceRefresh= */ mSavedInstanceState == null);
+        if (mWallpaperConnection != null) {
+            mWallpaperConnection.setVisibility(true);
+        }
+    }
+
+    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
+    @MainThread
+    public void onPause() {
+        if (mWallpaperConnection != null) {
+            mWallpaperConnection.setVisibility(false);
+        }
+    }
+
+    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
+    @MainThread
+    public void onStop() {
+        if (mWallpaperConnection != null) {
+            mWallpaperConnection.disconnect();
+            mWallpaperConnection = null;
+        }
+    }
+
+    @Override
+    public boolean isAvailable(Context context) {
+        return true;
+    }
+
+    @Override
+    public WallpaperSectionView createView(Context context) {
+        WallpaperSectionView wallpaperSectionView = (WallpaperSectionView) LayoutInflater.from(
+                context).inflate(R.layout.wallpaper_section_view, /* root= */ null);
+        mHomePreviewCard = wallpaperSectionView.findViewById(R.id.home_preview);
+        mHomePreviewCard.setContentDescription(mAppContext.getString(
+                R.string.wallpaper_preview_card_content_description));
+        mWorkspaceSurface = mHomePreviewCard.findViewById(R.id.workspace_surface);
+        mHomePreviewProgress = mHomePreviewCard.findViewById(R.id.wallpaper_preview_spinner);
+        mWorkspaceSurfaceCallback = new WorkspaceSurfaceHolderCallback(
+                mWorkspaceSurface, mAppContext);
+        mHomeWallpaperSurface = mHomePreviewCard.findViewById(R.id.wallpaper_surface);
+        mHomeWallpaperSurfaceCallback = new WallpaperSurfaceCallback(mActivity, mHomePreviewCard,
+                mHomeWallpaperSurface, () -> {
+            if (mHomePreviewWallpaperInfo != null) {
+                maybeLoadThumbnail(mHomePreviewWallpaperInfo, mHomeWallpaperSurfaceCallback);
+            }
+        });
+
+        mLockscreenPreviewCard = wallpaperSectionView.findViewById(R.id.lock_preview);
+        mLockscreenPreviewCard.setContentDescription(mAppContext.getString(
+                R.string.lockscreen_wallpaper_preview_card_content_description));
+        mLockscreenPreviewProgress = mLockscreenPreviewCard.findViewById(
+                R.id.wallpaper_preview_spinner);
+        mLockscreenPreviewCard.findViewById(R.id.workspace_surface).setVisibility(View.GONE);
+        mLockWallpaperSurface = mLockscreenPreviewCard.findViewById(R.id.wallpaper_surface);
+        mLockWallpaperSurfaceCallback = new WallpaperSurfaceCallback(mActivity,
+                mLockscreenPreviewCard, mLockWallpaperSurface, () -> {
+            if (mLockPreviewWallpaperInfo != null) {
+                maybeLoadThumbnail(mLockPreviewWallpaperInfo, mLockWallpaperSurfaceCallback);
+            }
+        });
+        mLockPreviewContainer = mLockscreenPreviewCard.findViewById(
+                R.id.lock_screen_preview_container);
+        mLockPreviewContainer.setVisibility(View.INVISIBLE);
+        mLockScreenPreviewer = new LockScreenPreviewer(mLifecycleOwner.getLifecycle(), context,
+                mLockPreviewContainer);
+
+        setupCurrentWallpaperPreview(wallpaperSectionView);
+        final int shortDuration = mAppContext.getResources().getInteger(
+                android.R.integer.config_shortAnimTime);
+        fadeWallpaperPreview(true, shortDuration);
+        mLifecycleOwner.getLifecycle().addObserver(this);
+        updateWallpaperSurface();
+        updateWorkspaceSurface();
+
+        wallpaperSectionView.findViewById(R.id.wallpaper_picker_entry).setOnClickListener(
+                v -> mSectionNavigationController.navigateTo(new CategorySelectorFragment()));
+
+        mWorkspaceViewModel.getUpdateWorkspace().observe(mLifecycleOwner, update ->
+                updateWorkspacePreview(mWorkspaceSurface, mWorkspaceSurfaceCallback,
+                        mWallpaperColorsViewModel.getHomeWallpaperColors().getValue())
+        );
+
+        return wallpaperSectionView;
+    }
+
+    private void updateWorkspacePreview(SurfaceView workspaceSurface,
+            WorkspaceSurfaceHolderCallback callback, @Nullable WallpaperColors colors) {
+        // Reattach SurfaceView to trigger #surfaceCreated to update preview for different option.
+        ViewGroup parent = (ViewGroup) workspaceSurface.getParent();
+        int viewIndex = parent.indexOfChild(workspaceSurface);
+        parent.removeView(workspaceSurface);
+        if (callback != null) {
+            callback.resetLastSurface();
+            callback.setWallpaperColors(colors);
+        }
+        parent.addView(workspaceSurface, viewIndex);
+    }
+
+    @Override
+    public void release() {
+        if (mLockScreenPreviewer != null) {
+            mLockScreenPreviewer.release();
+            mLockScreenPreviewer = null;
+        }
+        if (mHomeWallpaperSurfaceCallback != null) {
+            mHomeWallpaperSurfaceCallback.cleanUp();
+        }
+        if (mLockWallpaperSurfaceCallback != null) {
+            mLockWallpaperSurfaceCallback.cleanUp();
+        }
+        if (mWorkspaceSurfaceCallback != null) {
+            mWorkspaceSurfaceCallback.cleanUp();
+        }
+        mLifecycleOwner.getLifecycle().removeObserver(this);
+    }
+
+    private void setupCurrentWallpaperPreview(View rootView) {
+        if (canShowCurrentWallpaper()) {
+            showCurrentWallpaper(rootView, true);
+        } else {
+            showCurrentWallpaper(rootView, false);
+
+            Button mAllowAccessButton = rootView
+                    .findViewById(R.id.permission_needed_allow_access_button);
+            mAllowAccessButton.setOnClickListener(view ->
+                    mPermissionRequester.requestExternalStoragePermission(
+                            new MyPhotosStarter.PermissionChangedListener() {
+
+                                @Override
+                                public void onPermissionsGranted() {
+                                    showCurrentWallpaper(rootView, true);
+                                }
+
+                                @Override
+                                public void onPermissionsDenied(boolean dontAskAgain) {
+                                    if (!dontAskAgain) {
+                                        return;
+                                    }
+                                    showPermissionNeededDialog();
+                                }
+                            })
+            );
+
+            // Replace explanation text with text containing the Wallpapers app name which replaces
+            // the placeholder.
+            Resources resources = mAppContext.getResources();
+            String appName = resources.getString(R.string.app_name);
+            String explanation = resources.getString(R.string.permission_needed_explanation,
+                    appName);
+            TextView explanationView = rootView.findViewById(R.id.permission_needed_explanation);
+            explanationView.setText(explanation);
+        }
+    }
+
+    private boolean canShowCurrentWallpaper() {
+        return isPermissionGranted(mAppContext, PERMISSION_READ_WALLPAPER_INTERNAL)
+                || isPermissionGranted(mAppContext, READ_EXTERNAL_STORAGE);
+    }
+
+    private boolean isPermissionGranted(Context context, String permission) {
+        return context.getPackageManager().checkPermission(permission,
+                context.getPackageName()) == PackageManager.PERMISSION_GRANTED;
+    }
+
+    private void showCurrentWallpaper(View rootView, boolean show) {
+        rootView.findViewById(R.id.home_preview)
+                .setVisibility(show ? View.VISIBLE : View.GONE);
+        rootView.findViewById(R.id.lock_preview)
+                .setVisibility(show ? View.VISIBLE : View.GONE);
+        rootView.findViewById(R.id.permission_needed)
+                .setVisibility(show ? View.GONE : View.VISIBLE);
+    }
+
+    private void showPermissionNeededDialog() {
+        String permissionNeededMessage = mAppContext.getResources().getString(
+                R.string.permission_needed_explanation_go_to_settings);
+        AlertDialog dialog = new AlertDialog.Builder(mAppContext, R.style.LightDialogTheme)
+                .setMessage(permissionNeededMessage)
+                .setPositiveButton(android.R.string.ok, /* onClickListener= */ null)
+                .setNegativeButton(
+                        R.string.settings_button_label,
+                        (dialogInterface, i) -> {
+                            Intent appInfoIntent = new Intent();
+                            appInfoIntent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+                            Uri uri = Uri.fromParts("package",
+                                    mAppContext.getPackageName(), /* fragment= */ null);
+                            appInfoIntent.setData(uri);
+                            mActivity.startActivityForResult(appInfoIntent,
+                                    SETTINGS_APP_INFO_REQUEST_CODE);
+                        })
+                .create();
+        dialog.show();
+    }
+
+    /**
+     * Obtains the {@link WallpaperInfo} object(s) representing the wallpaper(s) currently set to
+     * the device from the {@link CurrentWallpaperInfoFactory}.
+     */
+    private void refreshCurrentWallpapers(boolean forceRefresh) {
+        CurrentWallpaperInfoFactory factory = InjectorProvider.getInjector()
+                .getCurrentWallpaperFactory(mAppContext);
+
+        factory.createCurrentWallpaperInfos(
+                (homeWallpaper, lockWallpaper, presentationMode) -> {
+                    // A config change may have destroyed the activity since the refresh
+                    // started, so check for that.
+                    if (!isActivityAlive()) {
+                        return;
+                    }
+
+                    mHomePreviewWallpaperInfo = homeWallpaper;
+                    mLockPreviewWallpaperInfo =
+                            lockWallpaper == null ? homeWallpaper : lockWallpaper;
+
+                    mHomePreviewWallpaperInfo.computePlaceholderColor(mAppContext);
+                    if (lockWallpaper != null) {
+                        lockWallpaper.computePlaceholderColor(mAppContext);
+                    }
+                    updatePreview(mHomePreviewWallpaperInfo, true);
+                    updatePreview(mLockPreviewWallpaperInfo, false);
+
+                    WallpaperManager manager = WallpaperManager.getInstance(mAppContext);
+
+                    WallpaperColors homeColors =
+                            manager.getWallpaperColors(WallpaperManager.FLAG_SYSTEM);
+                    onHomeWallpaperColorsChanged(homeColors);
+                    WallpaperColors lockColors = homeColors;
+
+                    if (lockWallpaper != null) {
+                        lockColors = manager.getWallpaperColors(WallpaperManager.FLAG_LOCK);
+
+                    }
+                    onLockWallpaperColorsChanged(lockColors);
+                }, forceRefresh);
+    }
+
+    private void updatePreview(WallpaperInfo wallpaperInfo, boolean isHomeWallpaper) {
+        if (wallpaperInfo == null) {
+            return;
+        }
+
+        if (!isActivityAlive()) {
+            return;
+        }
+
+        UserEventLogger eventLogger = InjectorProvider.getInjector().getUserEventLogger(
+                mAppContext);
+
+        WallpaperSurfaceCallback surfaceCallback = isHomeWallpaper
+                ? mHomeWallpaperSurfaceCallback : mLockWallpaperSurfaceCallback;
+        // Load thumb regardless of live wallpaper to make sure we have a placeholder while
+        // the live wallpaper initializes in that case.
+        maybeLoadThumbnail(wallpaperInfo, surfaceCallback);
+
+        if (isHomeWallpaper) {
+            if (mWallpaperConnection != null) {
+                mWallpaperConnection.disconnect();
+                mWallpaperConnection = null;
+            }
+            if (wallpaperInfo instanceof LiveWallpaperInfo) {
+                setUpLiveWallpaperPreview(wallpaperInfo);
+            }
+        }
+
+        View preview = isHomeWallpaper ? mHomePreviewCard : mLockscreenPreviewCard;
+        preview.setOnClickListener(view -> {
+            mWallpaperPreviewNavigator.showViewOnlyPreview(wallpaperInfo, isHomeWallpaper);
+            eventLogger.logCurrentWallpaperPreviewed();
+        });
+    }
+
+    @NonNull
+    private Asset maybeLoadThumbnail(WallpaperInfo wallpaperInfo,
+            WallpaperSurfaceCallback surfaceCallback) {
+        ImageView imageView = surfaceCallback.getHomeImageWallpaper();
+        Asset thumbAsset = new BitmapCachingAsset(mAppContext,
+                wallpaperInfo.getThumbAsset(mAppContext));
+        if (imageView != null && imageView.getDrawable() == null) {
+            thumbAsset.loadPreviewImage(mActivity, imageView,
+                    ResourceUtils.getColorAttr(mActivity, android.R.attr.colorSecondary));
+        }
+        return thumbAsset;
+    }
+
+    private void onHomeWallpaperColorsChanged(WallpaperColors wallpaperColors) {
+        if (wallpaperColors != null && wallpaperColors.equals(
+                mWallpaperColorsViewModel.getHomeWallpaperColors().getValue())) {
+            return;
+        }
+        mWallpaperColorsViewModel.getHomeWallpaperColors().setValue(wallpaperColors);
+    }
+
+    private void onLockWallpaperColorsChanged(WallpaperColors wallpaperColors) {
+        if (wallpaperColors != null && wallpaperColors.equals(
+                mWallpaperColorsViewModel.getLockWallpaperColors().getValue())) {
+            return;
+        }
+        mWallpaperColorsViewModel.getLockWallpaperColors().setValue(wallpaperColors);
+        if (mLockScreenPreviewer != null) {
+            mLockScreenPreviewer.setColor(wallpaperColors);
+        }
+    }
+
+    private void setUpLiveWallpaperPreview(WallpaperInfo homeWallpaper) {
+        if (!isActivityAlive()) {
+            return;
+        }
+
+        if (WallpaperConnection.isPreviewAvailable()) {
+            final boolean isLockLive = mLockPreviewWallpaperInfo instanceof LiveWallpaperInfo;
+            mWallpaperConnection = new WallpaperConnection(
+                    getWallpaperIntent(homeWallpaper.getWallpaperComponent()), mActivity,
+                    new WallpaperConnection.WallpaperConnectionListener() {
+                        @Override
+                        public void onWallpaperColorsChanged(WallpaperColors colors,
+                                int displayId) {
+                            if (isLockLive && mLockScreenPreviewer != null) {
+                                mLockScreenPreviewer.setColor(colors);
+                                onLockWallpaperColorsChanged(colors);
+                            }
+                            onHomeWallpaperColorsChanged(colors);
+                        }
+                    },
+                    mHomeWallpaperSurface, isLockLive ? mLockWallpaperSurface : null);
+
+            mWallpaperConnection.setVisibility(true);
+            mHomeWallpaperSurface.post(() -> {
+                if (mWallpaperConnection != null && !mWallpaperConnection.connect()) {
+                    mWallpaperConnection = null;
+                }
+            });
+        }
+    }
+
+    private Intent getWallpaperIntent(android.app.WallpaperInfo info) {
+        return new Intent(WallpaperService.SERVICE_INTERFACE)
+                .setClassName(info.getPackageName(), info.getServiceName());
+    }
+
+    private void updateWallpaperSurface() {
+        mHomeWallpaperSurface.getHolder().addCallback(mHomeWallpaperSurfaceCallback);
+        mHomeWallpaperSurface.setZOrderMediaOverlay(true);
+        mLockWallpaperSurface.getHolder().addCallback(mLockWallpaperSurfaceCallback);
+        mLockWallpaperSurface.setZOrderMediaOverlay(true);
+    }
+
+    private void updateWorkspaceSurface() {
+        mWorkspaceSurface.setZOrderMediaOverlay(true);
+        mWorkspaceSurface.getHolder().addCallback(mWorkspaceSurfaceCallback);
+    }
+
+    private boolean isActivityAlive() {
+        return !mActivity.isDestroyed() && !mActivity.isFinishing();
+    }
+
+    private void fadeWallpaperPreview(boolean isFadeIn, int duration) {
+        setupFade(mHomePreviewCard, mHomePreviewProgress, duration, isFadeIn);
+        setupFade(mLockscreenPreviewCard, mLockscreenPreviewProgress, duration, isFadeIn);
+    }
+
+    private void setupFade(CardView cardView, ContentLoadingProgressBar progressBar, int duration,
+            boolean fadeIn) {
+        cardView.setAlpha(fadeIn ? 0.0f : 1.0f);
+        cardView.animate()
+                .alpha(fadeIn ? 1.0f : 0.0f)
+                .setDuration(duration)
+                .setListener(new Animator.AnimatorListener() {
+                    @Override
+                    public void onAnimationCancel(Animator animator) {
+                        progressBar.hide();
+                        setWallpaperPreviewsVisibility(View.VISIBLE);
+                    }
+
+                    @Override
+                    public void onAnimationEnd(Animator animator) {
+                        progressBar.hide();
+                        setWallpaperPreviewsVisibility(View.VISIBLE);
+                    }
+
+                    @Override
+                    public void onAnimationRepeat(Animator animator) {
+                    }
+
+                    @Override
+                    public void onAnimationStart(Animator animator) {
+                        setWallpaperPreviewsVisibility(View.INVISIBLE);
+                    }
+                });
+        progressBar.animate()
+                .alpha(fadeIn ? 1.0f : 0.0f)
+                .setDuration(duration * 2)
+                .setStartDelay(duration)
+                .withStartAction(progressBar::show)
+                .withEndAction(progressBar::hide);
+    }
+
+    private void setWallpaperPreviewsVisibility(int visibility) {
+        if (mHomeWallpaperSurface != null) {
+            mHomeWallpaperSurface.setVisibility(visibility);
+        }
+        if (mLockWallpaperSurface != null) {
+            mLockWallpaperSurface.setVisibility(visibility);
+        }
+        if (mWorkspaceSurface != null) {
+            mWorkspaceSurface.setVisibility(visibility);
+        }
+        if (mLockPreviewContainer != null) {
+            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/model/WorkspaceViewModel.kt b/src/com/android/wallpaper/model/WorkspaceViewModel.kt
new file mode 100644
index 0000000..bafd6aa
--- /dev/null
+++ b/src/com/android/wallpaper/model/WorkspaceViewModel.kt
@@ -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.model
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+
+/** ViewModel class to keep track of workspace updates. */
+class WorkspaceViewModel : ViewModel() {
+
+    /**
+     * Triggers workspace updates through flipping the value from {@code false} to {@code true},
+     * or from {@code true} to {@code false}.
+     */
+    val updateWorkspace: MutableLiveData<Boolean> by lazy {
+        MutableLiveData<Boolean>()
+    }
+}
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/BitmapCropper.java b/src/com/android/wallpaper/module/BitmapCropper.java
index ca38d2e..01be8bc 100755
--- a/src/com/android/wallpaper/module/BitmapCropper.java
+++ b/src/com/android/wallpaper/module/BitmapCropper.java
@@ -18,10 +18,10 @@
 import android.graphics.Bitmap;
 import android.graphics.Rect;
 
-import com.android.wallpaper.asset.Asset;
-
 import androidx.annotation.Nullable;
 
+import com.android.wallpaper.asset.Asset;
+
 /**
  * Interface for classes which perform crop operations on bitmaps.
  */
@@ -31,7 +31,8 @@
      * Crops and scales a bitmap per the given scale factor and crop area (at target scale) from the
      * source asset.
      */
-    void cropAndScaleBitmap(Asset asset, float scale, Rect cropRect, Callback callback);
+    void cropAndScaleBitmap(Asset asset, float scale, Rect cropRect, boolean adjustForRtl,
+            Callback callback);
 
     /**
      * Interface for receiving the output bitmap of crop operations.
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/DefaultBitmapCropper.java b/src/com/android/wallpaper/module/DefaultBitmapCropper.java
index 14d2022..b4d4bbc 100755
--- a/src/com/android/wallpaper/module/DefaultBitmapCropper.java
+++ b/src/com/android/wallpaper/module/DefaultBitmapCropper.java
@@ -31,8 +31,8 @@
     private static final boolean FILTER_SCALED_BITMAP = true;
 
     @Override
-    public void cropAndScaleBitmap(Asset asset, float scale, final Rect cropRect,
-                                   final Callback callback) {
+    public void cropAndScaleBitmap(Asset asset, float scale, Rect cropRect,
+            boolean isRtl, Callback callback) {
         // Crop rect in pixels of source image.
         Rect scaledCropRect = new Rect(
                 Math.round((float) cropRect.left / scale),
@@ -40,7 +40,7 @@
                 Math.round((float) cropRect.right / scale),
                 Math.round((float) cropRect.bottom / scale));
 
-        asset.decodeBitmapRegion(scaledCropRect, cropRect.width(), cropRect.height(),
+        asset.decodeBitmapRegion(scaledCropRect, cropRect.width(), cropRect.height(), isRtl,
                 new BitmapReceiver() {
                     @Override
                     public void onBitmapDecoded(Bitmap bitmap) {
diff --git a/src/com/android/wallpaper/module/DefaultCategoryProvider.java b/src/com/android/wallpaper/module/DefaultCategoryProvider.java
index e687bf5..e82045d 100755
--- a/src/com/android/wallpaper/module/DefaultCategoryProvider.java
+++ b/src/com/android/wallpaper/module/DefaultCategoryProvider.java
@@ -54,6 +54,7 @@
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Locale;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -68,7 +69,7 @@
      * Relative category priorities. Lower numbers correspond to higher priorities (i.e., should
      * appear higher in the categories list).
      */
-    private static final int PRIORITY_MY_PHOTOS = 1;
+    protected static final int PRIORITY_MY_PHOTOS = 1;
     private static final int PRIORITY_SYSTEM = 100;
     private static final int PRIORITY_ON_DEVICE = 200;
     private static final int PRIORITY_LIVE = 300;
@@ -83,6 +84,7 @@
     // The network status of the last fetch from the server.
     @NetworkStatus
     private int mNetworkStatus;
+    private Locale mLocale;
 
     public DefaultCategoryProvider(Context context) {
         mAppContext = context.getApplicationContext();
@@ -105,6 +107,7 @@
         }
 
         mNetworkStatus = mNetworkStatusNotifier.getNetworkStatus();
+        mLocale = getLocale();
         doFetch(receiver, forceRefresh);
     }
 
@@ -139,11 +142,19 @@
     }
 
     @Override
-    public void resetIfNeeded() {
-        if (mNetworkStatus != mNetworkStatusNotifier.getNetworkStatus()) {
+    public boolean resetIfNeeded() {
+        if (mNetworkStatus != mNetworkStatusNotifier.getNetworkStatus()
+                || mLocale != getLocale()) {
             mCategories.clear();
             mFetchedCategories = false;
+            return true;
         }
+        return false;
+    }
+
+    @Override
+    public boolean isFeaturedCollectionAvailable() {
+        return false;
     }
 
     protected void doFetch(final CategoryReceiver receiver, boolean forceRefresh) {
@@ -164,24 +175,28 @@
         new FetchCategoriesTask(delegatingReceiver, mAppContext).execute();
     }
 
+    private Locale getLocale() {
+        return mAppContext.getResources().getConfiguration().getLocales().get(0);
+    }
+
     /**
      * AsyncTask subclass used for fetching all the categories and pushing them one at a time to
      * the receiver.
      */
     protected static class FetchCategoriesTask extends AsyncTask<Void, Category, Void> {
         private CategoryReceiver mReceiver;
+        private PartnerProvider mPartnerProvider;
         protected final Context mAppContext;
-        protected final PartnerProvider mPartnerProvider;
 
         public FetchCategoriesTask(CategoryReceiver receiver, Context context) {
             mReceiver = receiver;
             mAppContext = context.getApplicationContext();
-            mPartnerProvider = InjectorProvider.getInjector().getPartnerProvider(
-                    mAppContext);
         }
 
         @Override
         protected Void doInBackground(Void... voids) {
+            mPartnerProvider = InjectorProvider.getInjector().getPartnerProvider(
+                    mAppContext);
             FormFactorChecker formFactorChecker =
                     InjectorProvider.getInjector().getFormFactorChecker(mAppContext);
             @FormFactor int formFactor = formFactorChecker.getFormFactor();
@@ -299,10 +314,6 @@
                                 || parser.getDepth() > categoryDepth)
                                 && type != XmlPullParser.END_DOCUMENT) {
                             if (type == XmlPullParser.START_TAG) {
-                                if (!publishedPlaceholder) {
-                                    publishProgress(categoryBuilder.buildPlaceholder());
-                                    publishedPlaceholder = true;
-                                }
                                 WallpaperInfo wallpaper = null;
                                 if (SystemStaticWallpaperInfo.TAG_NAME.equals(parser.getName())) {
                                     wallpaper = SystemStaticWallpaperInfo
@@ -316,12 +327,19 @@
                                 }
                                 if (wallpaper != null) {
                                     categoryBuilder.addWallpaper(wallpaper);
+                                    // Publish progress only if there's at least one wallpaper
+                                    if (!publishedPlaceholder) {
+                                        publishProgress(categoryBuilder.buildPlaceholder());
+                                        publishedPlaceholder = true;
+                                    }
                                 }
                             }
                         }
                         WallpaperCategory category = categoryBuilder.build();
-                        categories.add(category);
-                        publishProgress(category);
+                        if (!category.getUnmodifiableWallpapers().isEmpty()) {
+                            categories.add(category);
+                            publishProgress(category);
+                        }
                     }
                 }
             } catch (IOException | XmlPullParserException e) {
diff --git a/src/com/android/wallpaper/module/DefaultCurrentWallpaperInfoFactory.java b/src/com/android/wallpaper/module/DefaultCurrentWallpaperInfoFactory.java
index dbe3722..9e2787f 100755
--- a/src/com/android/wallpaper/module/DefaultCurrentWallpaperInfoFactory.java
+++ b/src/com/android/wallpaper/module/DefaultCurrentWallpaperInfoFactory.java
@@ -51,7 +51,8 @@
     @Override
     public synchronized void createCurrentWallpaperInfos(final WallpaperInfoCallback callback,
                                                          boolean forceRefresh) {
-        if (!forceRefresh && mHomeWallpaper != null) {
+        if (!forceRefresh && mHomeWallpaper != null
+                && mPresentationMode != WallpaperPreferences.PRESENTATION_MODE_ROTATING) {
             callback.onWallpaperInfoCreated(mHomeWallpaper, mLockWallpaper, mPresentationMode);
             return;
         }
diff --git a/src/com/android/wallpaper/module/DefaultWallpaperPersister.java b/src/com/android/wallpaper/module/DefaultWallpaperPersister.java
index c8f269f..52b86aa 100755
--- a/src/com/android/wallpaper/module/DefaultWallpaperPersister.java
+++ b/src/com/android/wallpaper/module/DefaultWallpaperPersister.java
@@ -126,7 +126,7 @@
         }
 
         BitmapCropper bitmapCropper = InjectorProvider.getInjector().getBitmapCropper();
-        bitmapCropper.cropAndScaleBitmap(asset, scale, cropRect, new Callback() {
+        bitmapCropper.cropAndScaleBitmap(asset, scale, cropRect, false, new Callback() {
             @Override
             public void onBitmapCropped(Bitmap croppedBitmap) {
                 setIndividualWallpaper(wallpaper, croppedBitmap, destination, callback);
@@ -211,13 +211,9 @@
                     (dimensions.y - screenSize.y) / 2,
                     dimensions.x - ((dimensions.x - screenSize.x) / 2),
                     dimensions.y - ((dimensions.y - screenSize.y) / 2));
-            asset.decodeBitmapRegion(cropRect, screenSize.x, screenSize.y, new BitmapReceiver() {
-                @Override
-                public void onBitmapDecoded(@Nullable Bitmap bitmap) {
-                    setIndividualWallpaper(wallpaper, bitmap, WallpaperPersister.DEST_BOTH,
-                            callback);
-                }
-            });
+            asset.decodeBitmapRegion(cropRect, screenSize.x, screenSize.y, false,
+                    bitmap -> setIndividualWallpaper(wallpaper, bitmap,
+                            WallpaperPersister.DEST_BOTH, callback));
         } else {
             // Decode the full bitmap and pass with the screen size as a fill rect.
             asset.decodeBitmap(dimensions.x, dimensions.y, new BitmapReceiver() {
@@ -488,7 +484,7 @@
     private int setBitmapToWallpaperManagerCompat(Bitmap wallpaperBitmap, boolean allowBackup,
             int whichWallpaper) {
         ByteArrayOutputStream tmpOut = new ByteArrayOutputStream();
-        if (wallpaperBitmap.compress(CompressFormat.JPEG, DEFAULT_COMPRESS_QUALITY, tmpOut)) {
+        if (wallpaperBitmap.compress(CompressFormat.PNG, DEFAULT_COMPRESS_QUALITY, tmpOut)) {
             try {
                 byte[] outByteArray = tmpOut.toByteArray();
                 return mWallpaperManagerCompat.setStream(
diff --git a/src/com/android/wallpaper/module/Injector.java b/src/com/android/wallpaper/module/Injector.java
index 0abb531..1c40e93 100755
--- a/src/com/android/wallpaper/module/Injector.java
+++ b/src/com/android/wallpaper/module/Injector.java
@@ -86,4 +86,8 @@
     DrawableLayerResolver getDrawableLayerResolver();
 
     Intent getDeepLinkRedirectIntent(Context context, Uri uri);
+
+    String getDownloadableIntentAction();
+
+    CustomizationSections getCustomizationSections();
 }
diff --git a/src/com/android/wallpaper/module/NoOpUserEventLogger.java b/src/com/android/wallpaper/module/NoOpUserEventLogger.java
index e0559a6..4578e11 100755
--- a/src/com/android/wallpaper/module/NoOpUserEventLogger.java
+++ b/src/com/android/wallpaper/module/NoOpUserEventLogger.java
@@ -15,6 +15,8 @@
  */
 package com.android.wallpaper.module;
 
+import android.content.Intent;
+
 import com.android.wallpaper.module.WallpaperPersister.WallpaperPosition;
 
 /**
@@ -33,7 +35,7 @@
     }
 
     @Override
-    public void logAppLaunched() {
+    public void logAppLaunched(Intent launchSource) {
     }
 
     @Override
diff --git a/src/com/android/wallpaper/module/UserEventLogger.java b/src/com/android/wallpaper/module/UserEventLogger.java
index 5ff404d..b574d5d 100755
--- a/src/com/android/wallpaper/module/UserEventLogger.java
+++ b/src/com/android/wallpaper/module/UserEventLogger.java
@@ -15,10 +15,12 @@
  */
 package com.android.wallpaper.module;
 
-import com.android.wallpaper.module.WallpaperPersister.WallpaperPosition;
+import android.content.Intent;
 
 import androidx.annotation.IntDef;
 
+import com.android.wallpaper.module.WallpaperPersister.WallpaperPosition;
+
 /**
  * Interface for logging user events in the wallpaper picker.
  */
@@ -48,7 +50,7 @@
 
     void logStopped();
 
-    void logAppLaunched();
+    void logAppLaunched(Intent launchSource);
 
     void logDailyRefreshTurnedOn();
 
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/module/WallpaperSetter.java b/src/com/android/wallpaper/module/WallpaperSetter.java
index cb283b3..9d5bb96 100644
--- a/src/com/android/wallpaper/module/WallpaperSetter.java
+++ b/src/com/android/wallpaper/module/WallpaperSetter.java
@@ -11,9 +11,13 @@
 import android.util.Log;
 import android.view.Display;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 import androidx.fragment.app.FragmentManager;
+import androidx.lifecycle.Lifecycle.Event;
+import androidx.lifecycle.LifecycleEventObserver;
+import androidx.lifecycle.LifecycleOwner;
 
 import com.android.wallpaper.R;
 import com.android.wallpaper.asset.Asset;
@@ -140,6 +144,20 @@
             mProgressDialog.setMessage(containerActivity.getString(
                             R.string.set_wallpaper_progress_message));
             mProgressDialog.setIndeterminate(PROGRESS_DIALOG_INDETERMINATE);
+            if (containerActivity instanceof LifecycleOwner) {
+                ((LifecycleOwner) containerActivity).getLifecycle().addObserver(
+                        new LifecycleEventObserver() {
+                            @Override
+                            public void onStateChanged(@NonNull LifecycleOwner source,
+                                    @NonNull Event event) {
+                                if (event == Event.ON_DESTROY) {
+                                    if (mProgressDialog != null) {
+                                        mProgressDialog.dismiss();
+                                    }
+                                }
+                            }
+                        });
+            }
             mProgressDialog.show();
         }
 
diff --git a/src/com/android/wallpaper/picker/AppbarFragment.java b/src/com/android/wallpaper/picker/AppbarFragment.java
index b4db49f..4a71bb0 100644
--- a/src/com/android/wallpaper/picker/AppbarFragment.java
+++ b/src/com/android/wallpaper/picker/AppbarFragment.java
@@ -15,17 +15,22 @@
  */
 package com.android.wallpaper.picker;
 
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+
+import android.annotation.MenuRes;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.view.MenuItem;
 import android.view.View;
 import android.widget.TextView;
-
-import androidx.annotation.MenuRes;
-import androidx.appcompat.widget.Toolbar;
-import androidx.appcompat.widget.Toolbar.OnMenuItemClickListener;
+import android.widget.Toolbar;
+import android.widget.Toolbar.OnMenuItemClickListener;
 
 import com.android.wallpaper.R;
+import com.android.wallpaper.util.ResourceUtils;
 import com.android.wallpaper.widget.BottomActionBar;
 
 /**
@@ -46,6 +51,29 @@
         implements OnMenuItemClickListener {
 
     private static final String ARG_TITLE = "ToolbarFragment.title";
+    private AppbarFragmentHost mHost;
+    private boolean mUpArrowEnabled;
+
+    /**
+     * Interface to be implemented by an Activity hosting a {@link AppbarFragment}.
+     */
+    public interface AppbarFragmentHost {
+        /**
+         * Called when a up arrow had been pressed.
+         */
+        void onUpArrowPressed();
+
+        /**
+         * Check if it supports up arrow.
+         */
+        boolean isUpArrowSupported();
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mHost = (AppbarFragmentHost) context;
+    }
 
     /**
      * Returns a newly created {@link Bundle} containing the given title as an argument.
@@ -63,10 +91,23 @@
 
     /**
      * Configures a toolbar in the given rootView, with id {@code toolbar} and sets its title to
-     * the value in Arguments or {@link #getDefaultTitle()}
+     * the value in Arguments or {@link #getDefaultTitle()}.
+     * Default upArrow value is true.
      */
     public void setUpToolbar(View rootView) {
-        mToolbar = rootView.findViewById(R.id.toolbar);
+        setUpToolbar(rootView, /* upArrow= */ true);
+    }
+
+    /**
+     * Configures a toolbar in the given rootView, inflating the menu corresponding to the given id
+     * for the toolbar menu.
+     *
+     * @param rootView given root view.
+     * @param upArrow  true to enable up arrow feature.
+     */
+    protected void setUpToolbar(View rootView, boolean upArrow) {
+        mUpArrowEnabled = upArrow;
+        mToolbar = rootView.findViewById(getToolbarId());
 
         mTitleView = mToolbar.findViewById(R.id.custom_toolbar_title);
         CharSequence title;
@@ -78,6 +119,45 @@
         if (!TextUtils.isEmpty(title)) {
             setTitle(title);
         }
+
+        if (upArrow && mHost.isUpArrowSupported()) {
+            setUpUpArrow();
+        }
+    }
+
+    /**
+     * Configures the menu in the toolbar.
+     *
+     * @param menuResId the resource id of the menu
+     */
+    public void setUpToolbarMenu(@MenuRes int menuResId) {
+        mToolbar.inflateMenu(menuResId);
+        mToolbar.setOnMenuItemClickListener(this);
+    }
+
+    protected int getToolbarId() {
+        return R.id.toolbar;
+    }
+
+    /**
+     * Set up arrow feature status to enabled or not. Enable it for updating
+     * onBottomActionBarReady() while initializing without toolbar setup.
+     *
+     * @param upArrow true to enable up arrow feature.
+     */
+    public void setUpArrowEnabled(boolean upArrow) {
+        mUpArrowEnabled = upArrow;
+    }
+
+    private void setUpUpArrow() {
+        Drawable backIcon = getResources().getDrawable(R.drawable.material_ic_arrow_back_black_24,
+                null).mutate();
+        backIcon.setAutoMirrored(true);
+        backIcon.setTint(
+                ResourceUtils.getColorAttr(getActivity(), android.R.attr.textColorPrimary));
+        mToolbar.setNavigationIcon(backIcon);
+        mToolbar.setNavigationContentDescription(R.string.bottom_action_bar_back);
+        mToolbar.setNavigationOnClickListener(v -> mHost.onUpArrowPressed());
     }
 
     /**
@@ -88,8 +168,7 @@
      */
     public void setUpToolbar(View rootView, @MenuRes int menuResId) {
         setUpToolbar(rootView);
-        mToolbar.inflateMenu(menuResId);
-        mToolbar.setOnMenuItemClickListener(this);
+        setUpToolbarMenu(menuResId);
     }
 
     /**
@@ -101,6 +180,10 @@
         return null;
     }
 
+    protected String getAccessibilityTitle() {
+        return null;
+    }
+
     protected void setTitle(CharSequence title) {
         if (mToolbar == null) {
             return;
@@ -114,11 +197,20 @@
 
         // Set Activity title to make TalkBack announce title after updating toolbar title.
         if (getActivity() != null) {
-            getActivity().setTitle(title);
+            String accessibilityTitle = getAccessibilityTitle();
+            getActivity().setTitle(TextUtils.isEmpty(accessibilityTitle) ? title
+                    : accessibilityTitle);
         }
     }
 
     @Override
+    protected void onBottomActionBarReady(BottomActionBar bottomActionBar) {
+        bottomActionBar.setBackButtonVisibility(
+                mUpArrowEnabled && mHost.isUpArrowSupported() ? GONE : VISIBLE);
+        super.onBottomActionBarReady(bottomActionBar);
+    }
+
+    @Override
     public boolean onMenuItemClick(MenuItem item) {
         return false;
     }
diff --git a/src/com/android/wallpaper/picker/BasePreviewActivity.java b/src/com/android/wallpaper/picker/BasePreviewActivity.java
index a70c2f9..2195909 100755
--- a/src/com/android/wallpaper/picker/BasePreviewActivity.java
+++ b/src/com/android/wallpaper/picker/BasePreviewActivity.java
@@ -20,8 +20,12 @@
 import android.os.Bundle;
 
 import androidx.annotation.Nullable;
+import androidx.core.view.WindowCompat;
 
 import com.android.wallpaper.R;
+import com.android.wallpaper.module.Injector;
+import com.android.wallpaper.module.InjectorProvider;
+import com.android.wallpaper.module.UserEventLogger;
 
 /**
  * Abstract base class for a wallpaper full-screen preview activity.
@@ -29,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";
@@ -37,8 +41,23 @@
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        Injector injector = InjectorProvider.getInjector();
+        UserEventLogger mUserEventLogger = injector.getUserEventLogger(this);
         getWindow().setColorMode(ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT);
         setTheme(R.style.WallpaperTheme);
         getWindow().setFormat(PixelFormat.TRANSLUCENT);
+
+        // Check the launching intent's action to figure out the caller is from other application
+        // and log its launch source.
+        if (getIntent() != null && getIntent().getAction() != null) {
+            mUserEventLogger.logAppLaunched(getIntent());
+        }
+    }
+
+    /** Allows the current activity to be full screen. */
+    protected void enableFullScreen() {
+        WindowCompat.setDecorFitsSystemWindows(getWindow(), /* decorFitsSystemWindows= */ false);
+
+        // Window insets are set in the PreviewFragment#onCreateView method.
     }
 }
diff --git a/src/com/android/wallpaper/picker/BottomActionBarFragment.java b/src/com/android/wallpaper/picker/BottomActionBarFragment.java
index 099741b..6802b76 100644
--- a/src/com/android/wallpaper/picker/BottomActionBarFragment.java
+++ b/src/com/android/wallpaper/picker/BottomActionBarFragment.java
@@ -19,6 +19,7 @@
 import android.os.Bundle;
 import android.view.View;
 
+import androidx.annotation.CallSuper;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
@@ -46,26 +47,13 @@
         super.onViewCreated(view, savedInstanceState);
         mBottomActionBar = findBottomActionBar();
         if (mBottomActionBar != null) {
-            mBottomActionBar.bindBackButtonToSystemBackKey(getActivity());
+            mBottomActionBar.reset();
             onBottomActionBarReady(mBottomActionBar);
         }
     }
 
-    @Override
-    public void onDestroyView() {
-        if (mBottomActionBar != null) {
-            mBottomActionBar.reset();
-            mBottomActionBar = null;
-        }
-        super.onDestroyView();
-    }
-
     /** Returns {@code true} if the fragment would handle the event. */
     public boolean onBackPressed() {
-        if (mBottomActionBar != null && mBottomActionBar.isVisible()) {
-            mBottomActionBar.hide();
-            return true;
-        }
         return false;
     }
 
@@ -73,7 +61,12 @@
      * Gets called when {@link #onViewCreated} finished. For extending fragment, this is the only
      * one interface to get {@link BottomActionBar}.
      */
-    protected void onBottomActionBarReady(BottomActionBar bottomActionBar) {}
+    @CallSuper
+    protected void onBottomActionBarReady(BottomActionBar bottomActionBar) {
+        // Needed for some cases that need to recreate the BottomActionBar.
+        mBottomActionBar = bottomActionBar;
+        bottomActionBar.bindBackButtonToSystemBackKey(getActivity());
+    }
 
     @Nullable
     private BottomActionBar findBottomActionBar() {
diff --git a/src/com/android/wallpaper/picker/CategoryFragment.java b/src/com/android/wallpaper/picker/CategoryFragment.java
index a90acc9..4cbde9d 100755
--- a/src/com/android/wallpaper/picker/CategoryFragment.java
+++ b/src/com/android/wallpaper/picker/CategoryFragment.java
@@ -24,13 +24,13 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.graphics.Rect;
-import android.graphics.RectF;
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.Settings;
 import android.service.wallpaper.WallpaperService;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
+import android.view.MenuItem;
 import android.view.SurfaceView;
 import android.view.View;
 import android.view.ViewGroup;
@@ -41,8 +41,6 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.cardview.widget.CardView;
-import androidx.constraintlayout.widget.ConstraintLayout;
-import androidx.fragment.app.Fragment;
 import androidx.viewpager.widget.PagerAdapter;
 import androidx.viewpager.widget.ViewPager;
 
@@ -65,12 +63,11 @@
 import com.android.wallpaper.picker.individual.IndividualPickerFragment.ThumbnailUpdater;
 import com.android.wallpaper.picker.individual.IndividualPickerFragment.WallpaperDestinationCallback;
 import com.android.wallpaper.util.DeepLinkUtils;
+import com.android.wallpaper.util.ResourceUtils;
 import com.android.wallpaper.util.SizeCalculator;
 import com.android.wallpaper.util.WallpaperConnection;
 import com.android.wallpaper.util.WallpaperConnection.WallpaperConnectionListener;
 import com.android.wallpaper.util.WallpaperSurfaceCallback;
-import com.android.wallpaper.widget.BottomActionBar;
-import com.android.wallpaper.widget.LiveTileOverlay;
 import com.android.wallpaper.widget.LockScreenPreviewer;
 import com.android.wallpaper.widget.PreviewPager;
 import com.android.wallpaper.widget.WallpaperColorsLoader;
@@ -106,9 +103,9 @@
 
         void show(String collectionId);
 
-        boolean isNavigationTabsContained();
-
         void fetchCategories();
+
+        void cleanUp();
     }
 
     public static CategoryFragment newInstance(CharSequence title) {
@@ -124,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;
@@ -165,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 LockScreenPreviewer(getLifecycle(), getActivity(),
+        mLockScreenPreviewer = new LockScreenPreviewer(getLifecycle(), getContext(),
                 lockPreviewContainer);
         mWallPaperPreviews.add(lockscreenPreviewCard);
 
@@ -207,20 +200,6 @@
                         mWallpaperSurface.setZOrderMediaOverlay(true);
                     }
                 }
-
-                if (mWallpaperConnection != null && mWallpaperConnection.isEngineReady()
-                        && mLockPreviewWallpaperInfo instanceof LiveWallpaperInfo) {
-                    if (positionOffset == 0.0f || positionOffset == 1.0f
-                            || positionOffsetPixels == 0) {
-                        // The page is not moved. Show live wallpaper.
-                        LiveTileOverlay.INSTANCE.attach(mLockscreenPreview.getOverlay());
-                    } else {
-                        // The page is moving. Show live wallpaper's thumbnail.
-                        LiveTileOverlay.INSTANCE.detach(mLockscreenPreview.getOverlay());
-                    }
-                } else {
-                    LiveTileOverlay.INSTANCE.detach(mLockscreenPreview.getOverlay());
-                }
             }
 
             @Override
@@ -262,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) -> {
@@ -310,21 +288,6 @@
     }
 
     @Override
-    protected void onBottomActionBarReady(BottomActionBar bottomActionBar) {
-        if (getFragmentHost().isNavigationTabsContained()) {
-            return;
-        }
-        int bottomActionBarHeight = getResources()
-                .getDimensionPixelSize(R.dimen.bottom_navbar_height);
-        ConstraintLayout.LayoutParams layoutParams =
-                (ConstraintLayout.LayoutParams) mRootContainer.getLayoutParams();
-        if (layoutParams != null) {
-            bottomActionBar.addVisibilityChangeListener(isVisible ->
-                    layoutParams.bottomMargin = isVisible ? bottomActionBarHeight : 0);
-        }
-    }
-
-    @Override
     public CharSequence getDefaultTitle() {
         return getContext().getString(R.string.app_name);
     }
@@ -370,8 +333,6 @@
     @Override
     public void onDestroyView() {
         super.onDestroyView();
-        LiveTileOverlay.INSTANCE.detach(mHomePreview.getOverlay());
-        LiveTileOverlay.INSTANCE.detach(mLockscreenPreview.getOverlay());
         mWallpaperSurfaceCallback.cleanUp();
         mWorkspaceSurfaceCallback.cleanUp();
         if (mWallpaperConnection != null) {
@@ -433,11 +394,26 @@
     }
 
     @Override
+    public boolean isHostToolbarShown() {
+        return true;
+    }
+
+    @Override
     public void setToolbarTitle(CharSequence title) {
         setTitle(title);
     }
 
     @Override
+    public void setToolbarMenu(int menuResId) {
+        setUpToolbarMenu(menuResId);
+    }
+
+    @Override
+    public void removeToolbarMenu() {
+        mToolbar.getMenu().clear();
+    }
+
+    @Override
     public void moveToPreviousFragment() {
         getChildFragmentManager().popBackStack();
     }
@@ -448,6 +424,11 @@
     }
 
     @Override
+    public void cleanUp() {
+        getFragmentHost().cleanUp();
+    }
+
+    @Override
     public void expandBottomSheet() {
         if (mBottomSheetBehavior.getState() != BottomSheetBehavior.STATE_EXPANDED) {
             mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
@@ -470,8 +451,8 @@
 
             mHomePreviewWallpaperInfo = wallpaperInfo;
             mLockPreviewWallpaperInfo = wallpaperInfo;
-            updateThumbnail(mHomePreviewWallpaperInfo, mHomePreview, true);
-            updateThumbnail(mLockPreviewWallpaperInfo, mLockscreenPreview, false);
+            updateThumbnail(mHomePreviewWallpaperInfo,
+                    mWallpaperSurfaceCallback.getHomeImageWallpaper(), true);
             mShowSelectedWallpaper = true;
         });
     }
@@ -491,11 +472,21 @@
     }
 
     @Override
-    public boolean onBackPressed() {
-        Fragment childFragment = getChildFragmentManager().findFragmentById(
-                R.id.category_fragment_container);
-        return childFragment instanceof BottomActionBarFragment
-                && ((BottomActionBarFragment) childFragment).onBackPressed();
+    public boolean onMenuItemClick(MenuItem item) {
+        if (item.getItemId() == R.id.daily_rotation) {
+            if (mIndividualPickerFragment != null && mIndividualPickerFragment.isVisible()) {
+                mIndividualPickerFragment.showRotationDialog();
+            }
+            return true;
+        }
+        return super.onMenuItemClick(item);
+    }
+
+    /**
+     * Gets the {@link CategorySelectorFragment} which is attached to {@link CategoryFragment}.
+     */
+    public CategorySelectorFragment getCategorySelectorFragment() {
+        return mCategorySelectorFragment;
     }
 
     /**
@@ -507,33 +498,6 @@
         return isVisible() && getChildFragmentManager().popBackStackImmediate();
     }
 
-    /**
-     * Inserts the given category into the categories list in priority order.
-     */
-    void addCategory(Category category, boolean loading) {
-        mCategorySelectorFragment.addCategory(category, loading);
-    }
-
-    void removeCategory(Category category) {
-        mCategorySelectorFragment.removeCategory(category);
-    }
-
-    void updateCategory(Category category) {
-        mCategorySelectorFragment.updateCategory(category);
-    }
-
-    void clearCategories() {
-        mCategorySelectorFragment.clearCategories();
-    }
-
-    /**
-     * Notifies the CategoryFragment that no further categories are expected so it may hide
-     * the loading indicator.
-     */
-    void doneFetchingCategories() {
-        mCategorySelectorFragment.doneFetchingCategories();
-    }
-
     private boolean canShowCurrentWallpaper() {
         Activity activity = getActivity();
         CategoryFragmentHost host = getFragmentHost();
@@ -652,8 +616,8 @@
                         mHomePreviewWallpaperInfo = homeWallpaper;
                         mLockPreviewWallpaperInfo =
                                 lockWallpaper == null ? homeWallpaper : lockWallpaper;
-                        updateThumbnail(mHomePreviewWallpaperInfo, mHomePreview, true);
-                        updateThumbnail(mLockPreviewWallpaperInfo, mLockscreenPreview, false);
+                        updateThumbnail(mHomePreviewWallpaperInfo,
+                                mWallpaperSurfaceCallback.getHomeImageWallpaper(), true);
                     }
                 });
             }
@@ -670,12 +634,7 @@
         }
 
         if (WallpaperConnection.isPreviewAvailable()) {
-            ImageView previewView = mWallpaperIndex == 0 ? mHomePreview : mLockscreenPreview;
-            previewView.getLocationOnScreen(mLivePreviewLocation);
-            mPreviewGlobalRect.set(0, 0, previewView.getMeasuredWidth(),
-                    previewView.getMeasuredHeight());
-            mPreviewLocalRect.set(mPreviewGlobalRect);
-            mPreviewGlobalRect.offset(mLivePreviewLocation[0], mLivePreviewLocation[1]);
+            ImageView previewView = mWallpaperSurfaceCallback.getHomeImageWallpaper();
             mWallpaperConnection = new WallpaperConnection(
                     getWallpaperIntent(homeWallpaper.getWallpaperComponent()), activity,
                     new WallpaperConnectionListener() {
@@ -686,16 +645,13 @@
                                 mLockScreenPreviewer.setColor(colors);
                             }
                         }
-                    }, mPreviewGlobalRect);
+                    }, mWallpaperSurface);
 
-            LiveTileOverlay.INSTANCE.update(new RectF(mPreviewLocalRect),
-                    ((CardView) previewView.getParent()).getRadius());
 
             mWallpaperConnection.setVisibility(true);
             previewView.post(() -> {
                 if (mWallpaperConnection != null && !mWallpaperConnection.connect()) {
                     mWallpaperConnection = null;
-                    LiveTileOverlay.INSTANCE.detach(previewView.getOverlay());
                 }
             });
         }
@@ -725,16 +681,17 @@
         if (imageView != null) {
             wallpaperInfo.getThumbAsset(activity.getApplicationContext())
                     .loadPreviewImage(activity, imageView,
-                            getResources().getColor(R.color.secondary_color));
+                            ResourceUtils.getColorAttr(
+                                    getActivity(), android.R.attr.colorSecondary));
         }
 
         if (isHomeWallpaper) {
-            LiveTileOverlay.INSTANCE.detach(thumbnailView.getOverlay());
             if (wallpaperInfo instanceof LiveWallpaperInfo) {
                 if (mWallpaperSurfaceCallback.getHomeImageWallpaper() != null) {
                     wallpaperInfo.getThumbAsset(activity.getApplicationContext()).loadPreviewImage(
                             activity, mWallpaperSurfaceCallback.getHomeImageWallpaper(),
-                            getResources().getColor(R.color.secondary_color));
+                            ResourceUtils.getColorAttr(
+                                    getActivity(), android.R.attr.colorSecondary));
                 }
                 setUpLiveWallpaperPreview(wallpaperInfo);
             } else {
@@ -745,11 +702,8 @@
             }
         } else {
             // lock screen wallpaper
-            if (wallpaperInfo instanceof LiveWallpaperInfo
-                    && WallpaperConnection.isPreviewAvailable()) {
-                LiveTileOverlay.INSTANCE.attach(thumbnailView.getOverlay());
-            } else {
-                LiveTileOverlay.INSTANCE.detach(thumbnailView.getOverlay());
+            if (!(wallpaperInfo instanceof LiveWallpaperInfo)
+                    || !WallpaperConnection.isPreviewAvailable()) {
                 // Load wallpaper color from thumbnail for static wallpaper.
                 WallpaperColorsLoader.getWallpaperColors(
                         activity,
@@ -766,6 +720,7 @@
 
     private void updateWallpaperSurface() {
         mWallpaperSurface.getHolder().addCallback(mWallpaperSurfaceCallback);
+        mWallpaperSurface.setZOrderMediaOverlay(true);
     }
 
     private void updateWorkspaceSurface() {
diff --git a/src/com/android/wallpaper/picker/CategorySelectorFragment.java b/src/com/android/wallpaper/picker/CategorySelectorFragment.java
index bb5d3d2..a611d48 100644
--- a/src/com/android/wallpaper/picker/CategorySelectorFragment.java
+++ b/src/com/android/wallpaper/picker/CategorySelectorFragment.java
@@ -15,6 +15,9 @@
  */
 package com.android.wallpaper.picker;
 
+import static com.android.wallpaper.picker.WallpaperPickerDelegate.PREVIEW_LIVE_WALLPAPER_REQUEST_CODE;
+import static com.android.wallpaper.picker.WallpaperPickerDelegate.PREVIEW_WALLPAPER_REQUEST_CODE;
+
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.content.Intent;
@@ -43,10 +46,14 @@
 import com.android.wallpaper.R;
 import com.android.wallpaper.asset.Asset;
 import com.android.wallpaper.model.Category;
+import com.android.wallpaper.model.CategoryProvider;
+import com.android.wallpaper.model.LiveWallpaperInfo;
+import com.android.wallpaper.model.WallpaperInfo;
 import com.android.wallpaper.module.InjectorProvider;
 import com.android.wallpaper.module.UserEventLogger;
 import com.android.wallpaper.util.DeepLinkUtils;
 import com.android.wallpaper.util.DisplayMetricsRetriever;
+import com.android.wallpaper.util.ResourceUtils;
 import com.android.wallpaper.util.SizeCalculator;
 import com.android.wallpaper.widget.WallpaperPickerRecyclerViewAccessibilityDelegate;
 import com.android.wallpaper.widget.WallpaperPickerRecyclerViewAccessibilityDelegate.BottomSheetHost;
@@ -59,7 +66,7 @@
 /**
  * Displays the UI which contains the categories of the wallpaper.
  */
-public class CategorySelectorFragment extends Fragment {
+public class CategorySelectorFragment extends AppbarFragment {
 
     // The number of ViewHolders that don't pertain to category tiles.
     // Currently 2: one for the metadata section and one for the "Select wallpaper" header.
@@ -85,8 +92,15 @@
          */
         void show(Category category);
 
+
         /**
-         * Sets the title in the toolbar.
+         * Indicates if the host has toolbar to show the title. If it does, we should set the title
+         * there.
+         */
+        boolean isHostToolbarShown();
+
+        /**
+         * Sets the title in the host's toolbar.
          */
         void setToolbarTitle(CharSequence title);
 
@@ -94,16 +108,25 @@
          * Fetches the wallpaper categories.
          */
         void fetchCategories();
+
+        /**
+         * Cleans up the listeners which will be notified when there's a package event.
+         */
+        void cleanUp();
     }
 
+    private final CategoryProvider mCategoryProvider;
+
     private RecyclerView mImageGrid;
     private CategoryAdapter mAdapter;
     private ArrayList<Category> mCategories = new ArrayList<>();
     private Point mTileSizePx;
     private boolean mAwaitingCategories;
+    private boolean mIsFeaturedCollectionAvailable;
 
     public CategorySelectorFragment() {
         mAdapter = new CategoryAdapter(mCategories);
+        mCategoryProvider = InjectorProvider.getInjector().getCategoryProvider(getContext());
     }
 
     @Nullable
@@ -113,27 +136,59 @@
         View view = inflater.inflate(R.layout.fragment_category_selector, container,
                 /* attachToRoot= */ false);
         mImageGrid = view.findViewById(R.id.category_grid);
-        mImageGrid.addItemDecoration(new GridPaddingDecoration(
-                getResources().getDimensionPixelSize(R.dimen.grid_padding)));
+        mImageGrid.addItemDecoration(new GridPaddingDecoration(getResources().getDimensionPixelSize(
+                R.dimen.grid_item_category_padding_horizontal)));
 
         mTileSizePx = SizeCalculator.getCategoryTileSize(getActivity());
 
         mImageGrid.setAdapter(mAdapter);
 
-        GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), getNumColumns());
+        GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(),
+                getNumColumns() * CategorySpanSizeLookup.DEFAULT_CATEGORY_SPAN_SIZE);
+        gridLayoutManager.setSpanSizeLookup(new CategorySpanSizeLookup(mAdapter));
         mImageGrid.setLayoutManager(gridLayoutManager);
         mImageGrid.setAccessibilityDelegateCompat(
                 new WallpaperPickerRecyclerViewAccessibilityDelegate(
                         mImageGrid, (BottomSheetHost) getParentFragment(), getNumColumns()));
-        getCategorySelectorFragmentHost().setToolbarTitle(getText(R.string.wallpaper_title));
+
+        if (getCategorySelectorFragmentHost().isHostToolbarShown()) {
+            view.findViewById(R.id.header_bar).setVisibility(View.GONE);
+            getCategorySelectorFragmentHost().setToolbarTitle(getText(R.string.wallpaper_title));
+        } else {
+            setUpToolbar(view);
+            setTitle(getText(R.string.wallpaper_title));
+        }
 
         if (!DeepLinkUtils.isDeepLink(getActivity().getIntent())) {
             getCategorySelectorFragmentHost().fetchCategories();
         }
 
+        // For nav bar edge-to-edge effect.
+        view.setOnApplyWindowInsetsListener((v, windowInsets) -> {
+            // For status bar height.
+            v.setPadding(
+                    v.getPaddingLeft(),
+                    windowInsets.getSystemWindowInsetTop(),
+                    v.getPaddingRight(),
+                    v.getPaddingBottom());
+
+            View gridView = v.findViewById(R.id.category_grid);
+            gridView.setPadding(
+                    gridView.getPaddingLeft(),
+                    gridView.getPaddingTop(),
+                    gridView.getPaddingRight(),
+                    windowInsets.getSystemWindowInsetBottom());
+            return windowInsets.consumeSystemWindowInsets();
+        });
         return view;
     }
 
+    @Override
+    public void onDestroyView() {
+        getCategorySelectorFragmentHost().cleanUp();
+        super.onDestroyView();
+    }
+
     /**
      * Inserts the given category into the categories list in priority order.
      */
@@ -196,6 +251,8 @@
             mAdapter.notifyItemRemoved(mAdapter.getItemCount() - 1);
             mAwaitingCategories = false;
         }
+
+        mIsFeaturedCollectionAvailable = mCategoryProvider.isFeaturedCollectionAvailable();
     }
 
     void notifyDataSetChanged() {
@@ -209,7 +266,12 @@
 
 
     private CategorySelectorFragmentHost getCategorySelectorFragmentHost() {
-        return (CategorySelectorFragmentHost) getParentFragment();
+        Fragment parentFragment = getParentFragment();
+        if (parentFragment != null) {
+            return (CategorySelectorFragmentHost) parentFragment;
+        } else {
+            return (CategorySelectorFragmentHost) getActivity();
+        }
     }
 
     /**
@@ -231,12 +293,14 @@
 
             CardView categoryView = itemView.findViewById(R.id.category);
             categoryView.getLayoutParams().height = mTileSizePx.y;
+            categoryView.setRadius(getResources().getDimension(R.dimen.grid_item_all_radius_small));
         }
 
         @Override
         public void onClick(View view) {
+            Activity activity = getActivity();
             final UserEventLogger eventLogger =
-                    InjectorProvider.getInjector().getUserEventLogger(getActivity());
+                    InjectorProvider.getInjector().getUserEventLogger(activity);
             eventLogger.logCategorySelected(mCategory.getCollectionId());
 
             if (mCategory.supportsCustomPhotos()) {
@@ -255,6 +319,20 @@
                 return;
             }
 
+            if (mCategory.isSingleWallpaperCategory()) {
+                WallpaperInfo wallpaper = mCategory.getSingleWallpaper();
+                // Log click on individual wallpaper
+                eventLogger.logIndividualWallpaperSelected(mCategory.getCollectionId());
+
+                InjectorProvider.getInjector().getWallpaperPersister(activity)
+                        .setWallpaperInfoInPreview(wallpaper);
+                wallpaper.showPreview(activity,
+                        new PreviewActivity.PreviewActivityIntentFactory(),
+                        wallpaper instanceof LiveWallpaperInfo ? PREVIEW_LIVE_WALLPAPER_REQUEST_CODE
+                                : PREVIEW_WALLPAPER_REQUEST_CODE);
+                return;
+            }
+
             getCategorySelectorFragmentHost().show(mCategory);
         }
 
@@ -285,7 +363,10 @@
             Asset thumbnail = mCategory.getThumbnail(getActivity().getApplicationContext());
             if (thumbnail != null) {
                 thumbnail.loadDrawable(getActivity(), mImageView,
-                        getResources().getColor(R.color.secondary_color));
+                        ResourceUtils.getColorAttr(
+                            getActivity(),
+                            android.R.attr.colorSecondary
+                        ));
             } else {
                 // TODO(orenb): Replace this workaround for b/62584914 with a proper way of
                 //  unloading the ImageView such that no incorrect image is improperly loaded upon
@@ -300,6 +381,32 @@
         }
     }
 
+    private class FeaturedCategoryHolder extends CategoryHolder {
+
+        FeaturedCategoryHolder(View itemView) {
+            super(itemView);
+            CardView categoryView = itemView.findViewById(R.id.category);
+            categoryView.getLayoutParams().height =
+                    SizeCalculator.getFeaturedCategoryTileSize(getActivity()).y;
+            categoryView.setRadius(getResources().getDimension(R.dimen.grid_item_all_radius));
+        }
+    }
+
+    private class MyPhotosCategoryHolder extends CategoryHolder {
+
+        MyPhotosCategoryHolder(View itemView) {
+            super(itemView);
+            // Reuse the height of featured category since My Photos category & featured category
+            // have the same height in current UI design.
+            CardView categoryView = itemView.findViewById(R.id.category);
+            int height = SizeCalculator.getFeaturedCategoryTileSize(getActivity()).y;
+            categoryView.getLayoutParams().height = height;
+            // Use the height as the card corner radius for the "My photos" category
+            // for a stadium border.
+            categoryView.setRadius(height);
+        }
+    }
+
     /**
      * ViewHolder subclass for the loading indicator ("spinner") shown when categories are being
      * fetched.
@@ -309,7 +416,10 @@
             super(view);
             ProgressBar progressBar = view.findViewById(R.id.loading_indicator);
             progressBar.getIndeterminateDrawable().setColorFilter(
-                    getResources().getColor(R.color.accent_color), PorterDuff.Mode.SRC_IN);
+                    ResourceUtils.getColorAttr(
+                            getActivity(),
+                            android.R.attr.colorAccent
+                    ), PorterDuff.Mode.SRC_IN);
         }
     }
 
@@ -318,6 +428,8 @@
      */
     private class CategoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
             implements MyPhotosStarter.PermissionChangedListener {
+        private static final int ITEM_VIEW_TYPE_MY_PHOTOS = 1;
+        private static final int ITEM_VIEW_TYPE_FEATURED_CATEGORY = 2;
         private static final int ITEM_VIEW_TYPE_CATEGORY = 3;
         private static final int ITEM_VIEW_TYPE_LOADING_INDICATOR = 4;
         private List<Category> mCategories;
@@ -332,6 +444,14 @@
                 return ITEM_VIEW_TYPE_LOADING_INDICATOR;
             }
 
+            if (position == 0) {
+                return ITEM_VIEW_TYPE_MY_PHOTOS;
+            }
+
+            if (mIsFeaturedCollectionAvailable && (position == 1 || position == 2)) {
+                return ITEM_VIEW_TYPE_FEATURED_CATEGORY;
+            }
+
             return ITEM_VIEW_TYPE_CATEGORY;
         }
 
@@ -345,6 +465,14 @@
                     view = layoutInflater.inflate(R.layout.grid_item_loading_indicator,
                             parent, /* attachToRoot= */ false);
                     return new LoadingIndicatorHolder(view);
+                case ITEM_VIEW_TYPE_MY_PHOTOS:
+                    view = layoutInflater.inflate(R.layout.grid_item_category,
+                            parent, /* attachToRoot= */ false);
+                    return new MyPhotosCategoryHolder(view);
+                case ITEM_VIEW_TYPE_FEATURED_CATEGORY:
+                    view = layoutInflater.inflate(R.layout.grid_item_category,
+                            parent, /* attachToRoot= */ false);
+                    return new FeaturedCategoryHolder(view);
                 case ITEM_VIEW_TYPE_CATEGORY:
                     view = layoutInflater.inflate(R.layout.grid_item_category,
                             parent, /* attachToRoot= */ false);
@@ -360,6 +488,8 @@
             int viewType = getItemViewType(position);
 
             switch (viewType) {
+                case ITEM_VIEW_TYPE_MY_PHOTOS:
+                case ITEM_VIEW_TYPE_FEATURED_CATEGORY:
                 case ITEM_VIEW_TYPE_CATEGORY:
                     // Offset position to get category index to account for the non-category view
                     // holders.
@@ -420,7 +550,7 @@
 
     private class GridPaddingDecoration extends RecyclerView.ItemDecoration {
 
-        private int mPadding;
+        private final int mPadding;
 
         GridPaddingDecoration(int padding) {
             mPadding = padding;
@@ -434,6 +564,16 @@
                 outRect.left = mPadding;
                 outRect.right = mPadding;
             }
+
+            RecyclerView.ViewHolder viewHolder = parent.getChildViewHolder(view);
+            if (viewHolder instanceof MyPhotosCategoryHolder
+                    || viewHolder instanceof FeaturedCategoryHolder) {
+                outRect.bottom = getResources().getDimensionPixelSize(
+                        R.dimen.grid_item_featured_category_padding_bottom);
+            } else {
+                outRect.bottom = getResources().getDimensionPixelSize(
+                        R.dimen.grid_item_category_padding_bottom);
+            }
         }
     }
 
@@ -442,6 +582,8 @@
      * of columns in the RecyclerView and all other items only take up a single span.
      */
     private class CategorySpanSizeLookup extends GridLayoutManager.SpanSizeLookup {
+        private static final int DEFAULT_CATEGORY_SPAN_SIZE = 2;
+
         CategoryAdapter mAdapter;
 
         private CategorySpanSizeLookup(CategoryAdapter adapter) {
@@ -450,13 +592,18 @@
 
         @Override
         public int getSpanSize(int position) {
-            if (position < NUM_NON_CATEGORY_VIEW_HOLDERS
-                    || mAdapter.getItemViewType(position)
-                    == CategoryAdapter.ITEM_VIEW_TYPE_LOADING_INDICATOR) {
-                return getNumColumns();
+            if (position < NUM_NON_CATEGORY_VIEW_HOLDERS || mAdapter.getItemViewType(position)
+                    == CategoryAdapter.ITEM_VIEW_TYPE_LOADING_INDICATOR || mAdapter.getItemViewType(
+                    position) == CategoryAdapter.ITEM_VIEW_TYPE_MY_PHOTOS) {
+                return getNumColumns() * DEFAULT_CATEGORY_SPAN_SIZE;
             }
 
-            return 1;
+            if (mAdapter.getItemViewType(position)
+                    == CategoryAdapter.ITEM_VIEW_TYPE_FEATURED_CATEGORY) {
+                return getNumColumns() * DEFAULT_CATEGORY_SPAN_SIZE / 2;
+            }
+
+            return DEFAULT_CATEGORY_SPAN_SIZE;
         }
     }
 }
diff --git a/src/com/android/wallpaper/picker/CustomizationPickerActivity.java b/src/com/android/wallpaper/picker/CustomizationPickerActivity.java
new file mode 100644
index 0000000..d97f598
--- /dev/null
+++ b/src/com/android/wallpaper/picker/CustomizationPickerActivity.java
@@ -0,0 +1,355 @@
+/*
+ * 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 static com.android.wallpaper.util.ActivityUtils.isSUWMode;
+import static com.android.wallpaper.util.ActivityUtils.isWallpaperOnlyMode;
+
+import android.app.Activity;
+import android.content.Intent;
+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 {
+
+    private static final String TAG = "CustomizationPickerActivity";
+
+    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);
+        setContentView(R.layout.activity_customization_picker);
+        mBottomActionBar = findViewById(R.id.bottom_actionbar);
+
+        // See go/pdr-edge-to-edge-guide.
+        WindowCompat.setDecorFitsSystemWindows(getWindow(), isSUWMode(this));
+
+        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 target fragment.
+            switchFragment(isWallpaperOnlyMode(getIntent())
+                    ? WallpaperOnlyFragment.newInstance(getString(R.string.wallpaper_app_name))
+                    : 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 = isWallpaperOnlyMode(getIntent());
+        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
+    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)) {
+            if (isSUWMode(this)) {
+                finishActivityForSUW();
+            } else {
+                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);
+    }
+
+    private void finishActivityForSUW() {
+        overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
+        // Return RESULT_CANCELED to make the "Change wallpaper" tile in SUW not be disabled.
+        setResult(Activity.RESULT_CANCELED);
+        finish();
+    }
+
+    @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 !isSUWMode(this);
+    }
+}
diff --git a/src/com/android/wallpaper/picker/CustomizationPickerFragment.java b/src/com/android/wallpaper/picker/CustomizationPickerFragment.java
new file mode 100644
index 0000000..8884c0e
--- /dev/null
+++ b/src/com/android/wallpaper/picker/CustomizationPickerFragment.java
@@ -0,0 +1,217 @@
+/*
+ * 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.content.Context;
+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;
+    @Nullable private Bundle mBackStackSavedInstanceState;
+
+    /** 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,
+            @Nullable 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);
+
+        if (mBackStackSavedInstanceState != null) {
+            savedInstanceState = mBackStackSavedInstanceState;
+            mBackStackSavedInstanceState = null;
+        }
+
+        initSections(savedInstanceState);
+        mSectionControllers.forEach(controller ->
+                mNestedScrollView.post(() -> {
+                            final Context context = getContext();
+                            if (context == null) {
+                                Log.w(TAG, "Adding section views with null context");
+                                return;
+                            }
+                            sectionContainer.addView(controller.createView(context));
+                        }
+                )
+        );
+        final Bundle savedInstanceStateRef = savedInstanceState;
+        // Post it to the end of adding views to ensure restoring view state the last task.
+        mNestedScrollView.post(() ->
+                restoreViewState(savedInstanceStateRef)
+        );
+        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) {
+        onSaveInstanceStateInternal(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() {
+        // When add to back stack, #onDestroyView would be called, but #onDestroy wouldn't. So
+        // storing the state in variable to restore when back to foreground. If it's not a back
+        // stack case (i,e, config change), the variable would not be retained, see
+        // https://developer.android.com/guide/fragments/saving-state.
+        mBackStackSavedInstanceState = new Bundle();
+        onSaveInstanceStateInternal(mBackStackSavedInstanceState);
+
+        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();
+    }
+
+    /** Saves state of the fragment. */
+    private void onSaveInstanceStateInternal(Bundle savedInstanceState) {
+        if (mNestedScrollView != null) {
+            savedInstanceState.putInt(SCROLL_POSITION_Y, mNestedScrollView.getScrollY());
+        }
+        mSectionControllers.forEach(c -> c.onSaveInstanceState(savedInstanceState));
+    }
+
+    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));
+    }
+
+    protected 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/DeepLinkActivity.java b/src/com/android/wallpaper/picker/DeepLinkActivity.java
index 9c4afb4..9e07996 100644
--- a/src/com/android/wallpaper/picker/DeepLinkActivity.java
+++ b/src/com/android/wallpaper/picker/DeepLinkActivity.java
@@ -15,7 +15,11 @@
  */
 package com.android.wallpaper.picker;
 
+import static com.android.wallpaper.util.LaunchSourceUtils.LAUNCH_SOURCE_DEEP_LINK;
+import static com.android.wallpaper.util.LaunchSourceUtils.WALLPAPER_LAUNCH_SOURCE;
+
 import android.app.Activity;
+import android.content.Intent;
 import android.os.Bundle;
 
 import androidx.annotation.Nullable;
@@ -27,12 +31,16 @@
  * the url link to deep link.
  */
 public class DeepLinkActivity extends Activity {
+
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        startActivity(InjectorProvider.getInjector().getDeepLinkRedirectIntent(
-                this, getIntent().getData()));
+        Intent intent = InjectorProvider.getInjector().getDeepLinkRedirectIntent(
+                this, getIntent().getData());
+        intent.putExtra(WALLPAPER_LAUNCH_SOURCE, LAUNCH_SOURCE_DEEP_LINK);
+
+        startActivity(intent);
         finish();
     }
 }
diff --git a/src/com/android/wallpaper/picker/ImagePreviewFragment.java b/src/com/android/wallpaper/picker/ImagePreviewFragment.java
index 1ea49f0..c41d394 100755
--- a/src/com/android/wallpaper/picker/ImagePreviewFragment.java
+++ b/src/com/android/wallpaper/picker/ImagePreviewFragment.java
@@ -15,6 +15,8 @@
  */
 package com.android.wallpaper.picker;
 
+import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS;
+import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES;
 import static android.view.View.MeasureSpec.EXACTLY;
 import static android.view.View.MeasureSpec.makeMeasureSpec;
 
@@ -25,14 +27,19 @@
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.app.Activity;
+import android.app.WallpaperColors;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.Color;
+import android.graphics.ColorSpace;
 import android.graphics.Point;
 import android.graphics.PointF;
 import android.graphics.Rect;
 import android.os.Bundle;
+import android.os.Handler;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Surface;
 import android.view.SurfaceControlViewHost;
@@ -48,31 +55,37 @@
 import androidx.cardview.widget.CardView;
 import androidx.constraintlayout.widget.ConstraintLayout;
 import androidx.constraintlayout.widget.ConstraintSet;
-import androidx.core.content.ContextCompat;
 import androidx.fragment.app.FragmentActivity;
 
 import com.android.wallpaper.R;
 import com.android.wallpaper.asset.Asset;
 import com.android.wallpaper.asset.CurrentWallpaperAssetVN;
 import com.android.wallpaper.model.WallpaperInfo;
+import com.android.wallpaper.module.BitmapCropper;
+import com.android.wallpaper.module.InjectorProvider;
 import com.android.wallpaper.module.WallpaperPersister.Destination;
 import com.android.wallpaper.module.WallpaperPersister.SetWallpaperCallback;
+import com.android.wallpaper.util.FullScreenAnimation;
+import com.android.wallpaper.util.ResourceUtils;
 import com.android.wallpaper.util.ScreenSizeCalculator;
 import com.android.wallpaper.util.SizeCalculator;
 import com.android.wallpaper.util.WallpaperCropUtils;
 import com.android.wallpaper.widget.BottomActionBar;
 import com.android.wallpaper.widget.BottomActionBar.AccessibilityCallback;
 import com.android.wallpaper.widget.LockScreenPreviewer;
-import com.android.wallpaper.widget.WallpaperColorsLoader;
-import com.android.wallpaper.widget.WallpaperInfoView;
 
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.MemoryCategory;
 import com.davemorrissey.labs.subscaleview.ImageSource;
 import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
-import com.google.android.material.tabs.TabLayout;
 
+import java.io.ByteArrayOutputStream;
 import java.util.Locale;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * Fragment which displays the UI for previewing an individual static wallpaper and its attribution
@@ -80,11 +93,16 @@
  */
 public class ImagePreviewFragment extends PreviewFragment {
 
+    private static final String TAG = "ImagePreviewFragment";
     private static final float DEFAULT_WALLPAPER_MAX_ZOOM = 8f;
+    private static final Executor sExecutor = Executors.newCachedThreadPool();
 
     private final WallpaperSurfaceCallback mWallpaperSurfaceCallback =
             new WallpaperSurfaceCallback();
 
+    private final AtomicInteger mImageScaleChangeCounter = new AtomicInteger(0);
+    private final AtomicInteger mRecalculateColorCounter = new AtomicInteger(0);
+
     private SubsamplingScaleImageView mFullResImageView;
     private Asset mWallpaperAsset;
     private Point mScreenSize;
@@ -92,27 +110,24 @@
     private ImageView mLowResImageView;
     private TouchForwardingLayout mTouchForwardingLayout;
     private ConstraintLayout mContainer;
-    private SurfaceView mWorkspaceSurface;
-    private WorkspaceSurfaceHolderCallback mWorkspaceSurfaceCallback;
     private SurfaceView mWallpaperSurface;
-    private ViewGroup mLockPreviewContainer;
-    private LockScreenPreviewer mLockScreenPreviewer;
-    private WallpaperInfoView mWallpaperInfoView;
+
+    protected SurfaceView mWorkspaceSurface;
+    protected WorkspaceSurfaceHolderCallback mWorkspaceSurfaceCallback;
+    protected ViewGroup mLockPreviewContainer;
+    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
     protected int getLayoutResId() {
-        return R.layout.fragment_image_preview_v2;
-    }
-
-    @Override
-    protected int getLoadingIndicatorResId() {
-        return R.id.loading_indicator;
+        return R.layout.fragment_image_preview;
     }
 
     @Override
@@ -124,12 +139,9 @@
         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);
 
         // Set aspect ratio on the preview card dynamically.
         ConstraintSet set = new ConstraintSet();
@@ -139,55 +151,50 @@
         set.applyTo(mContainer);
 
         mWorkspaceSurface = mContainer.findViewById(R.id.workspace_surface);
-        mWorkspaceSurfaceCallback = new WorkspaceSurfaceHolderCallback(mWorkspaceSurface,
-                getContext());
+        mWorkspaceSurfaceCallback = createWorkspaceSurfaceCallback(mWorkspaceSurface);
         mWallpaperSurface = mContainer.findViewById(R.id.wallpaper_surface);
         mLockPreviewContainer = mContainer.findViewById(R.id.lock_screen_preview_container);
-        mLockScreenPreviewer = new LockScreenPreviewer(getLifecycle(), getActivity(),
+        int placeHolderColor = ResourceUtils.getColorAttr(getContext(),
+                android.R.attr.colorBackground);
+        mWorkspaceSurface.setResizeBackgroundColor(placeHolderColor);
+        mLockScreenPreviewer = new LockScreenPreviewer(getLifecycle(), getContext(),
                 mLockPreviewContainer);
-
-        TabLayout tabs = inflater.inflate(R.layout.full_preview_tabs,
-                view.findViewById(R.id.toolbar_tabs_container))
-                .findViewById(R.id.full_preview_tabs);
-        tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
-            @Override
-            public void onTabSelected(TabLayout.Tab tab) {
-                updateScreenPreview(tab.getPosition() == 0);
-            }
-
-            @Override
-            public void onTabUnselected(TabLayout.Tab tab) {}
-
-            @Override
-            public void onTabReselected(TabLayout.Tab tab) {}
-        });
-
-        // The TabLayout only contains below tabs, see: full_preview_tabs.xml
-        // 0. Home tab
-        // 1. Lock tab
-        tabs.getTabAt(mViewAsHome ? 0 : 1).select();
-        updateScreenPreview(mViewAsHome);
+        mLockScreenPreviewer.setDateViewVisibility(!mFullScreenAnimation.isFullScreen());
+        mFullScreenAnimation.setFullScreenStatusListener(
+                isFullScreen -> mLockScreenPreviewer.setDateViewVisibility(!isFullScreen));
+        setUpTabs(view.findViewById(R.id.separated_tabs));
 
         view.measure(makeMeasureSpec(mScreenSize.x, EXACTLY),
                 makeMeasureSpec(mScreenSize.y, EXACTLY));
         ((CardView) mWorkspaceSurface.getParent())
                 .setRadius(SizeCalculator.getPreviewCornerRadius(
                         activity, mContainer.getMeasuredWidth()));
+
         renderImageWallpaper();
         renderWorkspaceSurface();
 
         // 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;
     }
 
     @Override
     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        WallpaperColorsLoader.getWallpaperColors(getContext(),
-                mWallpaper.getThumbAsset(getContext()),
-                mLockScreenPreviewer::setColor);
+    }
+
+    protected void onWallpaperColorsChanged(@Nullable WallpaperColors colors) {
+        // Make it enabled since the buttons are disabled while wallpaper is moving.
+        mBottomActionBar.enableActionButtonsWithBottomSheet(true);
+
+        mLockScreenPreviewer.setColor(colors);
+
+        mFullScreenAnimation.setFullScreenTextColor(
+                colors == null || (colors.getColorHints()
+                        & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) == 0
+                            ? FullScreenAnimation.FullScreenTextColor.LIGHT
+                            : FullScreenAnimation.FullScreenTextColor.DARK);
     }
 
     @Override
@@ -206,10 +213,14 @@
     @Override
     public void onDestroy() {
         super.onDestroy();
-        if (mLoadingProgressBar != null) {
-            mLoadingProgressBar.hide();
+
+        if (mFullResImageView != null) {
+            mFullResImageView.recycle();
         }
-        mFullResImageView.recycle();
+
+        if (mLockScreenPreviewer != null) {
+            mLockScreenPreviewer.release();
+        }
 
         mWallpaperSurfaceCallback.cleanUp();
         mWorkspaceSurfaceCallback.cleanUp();
@@ -218,58 +229,40 @@
     @Override
     protected void onBottomActionBarReady(BottomActionBar bottomActionBar) {
         super.onBottomActionBarReady(bottomActionBar);
-
-        mWallpaperInfoView = (WallpaperInfoView)
-                LayoutInflater.from(getContext()).inflate(
-                        R.layout.wallpaper_info_view, /* root= */null);
-        mBottomActionBar.attachViewToBottomSheetAndBindAction(mWallpaperInfoView, INFORMATION);
+        mBottomActionBar.bindBottomSheetContentWithAction(
+                new WallpaperInfoContent(getContext()), INFORMATION);
         mBottomActionBar.showActionsOnly(INFORMATION, EDIT, APPLY);
-        mBottomActionBar.setActionClickListener(EDIT, v ->
-                setEditingEnabled(mBottomActionBar.isActionSelected(EDIT))
-        );
-        mBottomActionBar.setActionSelectedListener(EDIT, this::setEditingEnabled);
+
         mBottomActionBar.setActionClickListener(APPLY, this::onSetWallpaperClicked);
 
+        View separatedTabsContainer = getView().findViewById(R.id.separated_tabs_container);
         // Update target view's accessibility param since it will be blocked by the bottom sheet
         // when expanded.
         mBottomActionBar.setAccessibilityCallback(new AccessibilityCallback() {
             @Override
             public void onBottomSheetCollapsed() {
-                mContainer.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
+                mContainer.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
+                separatedTabsContainer.setImportantForAccessibility(
+                        IMPORTANT_FOR_ACCESSIBILITY_YES);
             }
 
             @Override
             public void onBottomSheetExpanded() {
                 mContainer.setImportantForAccessibility(
-                        View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
+                        IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
+                separatedTabsContainer.setImportantForAccessibility(
+                        IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
+
             }
         });
 
-        // Will trigger onActionSelected callback to update the editing state.
-        mBottomActionBar.setDefaultSelectedButton(EDIT);
         mBottomActionBar.show();
-
+        // To avoid applying the wallpaper when the wallpaper's not parsed.
         mBottomActionBar.disableActions();
-        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;
-            }
-
-            if (mBottomActionBar != null) {
-                mBottomActionBar.enableActions();
-            }
-
-            mRawWallpaperSize = dimensions;
-
-            setUpExploreIntentAndLabel(ImagePreviewFragment.this::initFullResView);
-        });
+        // If the wallpaper is parsed, enable the bottom action bar.
+        if (mRawWallpaperSize != null) {
+            mBottomActionBar.enableActions();
+        }
     }
 
     /**
@@ -277,20 +270,16 @@
      * initializing a zoom-scroll observer and click listener.
      */
     private void initFullResView() {
+        if (mRawWallpaperSize == null || mFullResImageView == null) {
+            return;
+        }
+
         // Minimum scale will only be respected under this scale type.
         mFullResImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CUSTOM);
         // When we set a minimum scale bigger than the scale with which the full image is shown,
         // 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 = ContextCompat.getColor(getContext(), R.color.fullscreen_preview_background);
-        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);
@@ -301,17 +290,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));
@@ -319,12 +306,80 @@
                         setDefaultWallpaperZoomAndScroll(
                                 mWallpaperAsset instanceof CurrentWallpaperAssetVN);
                         crossFadeInMosaicView();
+                        mFullResImageView.setOnStateChangedListener(
+                                new SubsamplingScaleImageView.DefaultOnStateChangedListener() {
+                                    @Override
+                                    public void onCenterChanged(PointF newCenter, int origin) {
+                                        super.onCenterChanged(newCenter, origin);
+                                        // Disallow bottom sheet to popup when wallpaper is moving
+                                        // by user dragging.
+                                        mBottomActionBar.enableActionButtonsWithBottomSheet(false);
+                                        mImageScaleChangeCounter.incrementAndGet();
+                                        mFullResImageView.postDelayed(() -> {
+                                            if (mImageScaleChangeCounter.decrementAndGet() == 0) {
+                                                recalculateColors();
+                                            }
+                                        }, /* delayMillis= */ 100);
+                                    }
+                                });
+                        mFullResImageView.post(this::recalculateColors);
                     }
-                    getActivity().invalidateOptionsMenu();
+                });
 
-                    if (mWallpaperInfoView != null && mWallpaper != null) {
-                        mWallpaperInfoView.populateWallpaperInfo(mWallpaper, mActionLabel,
-                                mExploreIntent, this::onExploreClicked);
+        mFullResImageView.setOnTouchListener((v, ev) -> {
+            // Consume the touch event for collapsing bottom sheet while it is expanded or
+            // dragging (not collapsed).
+            if (mBottomActionBar != null && !mBottomActionBar.isBottomSheetCollapsed()) {
+                mBottomActionBar.collapseBottomSheetIfExpanded();
+                return true;
+            }
+            return false;
+        });
+    }
+
+    private void recalculateColors() {
+        Context context = getContext();
+        if (context == null) {
+            Log.e(TAG, "Got null context, skip recalculating colors");
+            return;
+        }
+
+        BitmapCropper bitmapCropper = InjectorProvider.getInjector().getBitmapCropper();
+        bitmapCropper.cropAndScaleBitmap(mWallpaperAsset, mFullResImageView.getScale(),
+                calculateCropRect(context), /* adjustForRtl= */ false,
+                new BitmapCropper.Callback() {
+                    @Override
+                    public void onBitmapCropped(Bitmap croppedBitmap) {
+                        mRecalculateColorCounter.incrementAndGet();
+                        sExecutor.execute(() -> {
+                            boolean shouldRecycle = false;
+                            ByteArrayOutputStream tmpOut = new ByteArrayOutputStream();
+                            Bitmap cropped = croppedBitmap;
+                            if (cropped.compress(Bitmap.CompressFormat.PNG, 100, tmpOut)) {
+                                byte[] outByteArray = tmpOut.toByteArray();
+                                BitmapFactory.Options options = new BitmapFactory.Options();
+                                options.inPreferredColorSpace =
+                                        ColorSpace.get(ColorSpace.Named.SRGB);
+                                cropped = BitmapFactory.decodeByteArray(outByteArray, 0,
+                                        outByteArray.length);
+                            }
+                            if (cropped.getConfig() == Bitmap.Config.HARDWARE) {
+                                cropped = cropped.copy(Bitmap.Config.ARGB_8888, false);
+                                shouldRecycle = true;
+                            }
+                            WallpaperColors colors = WallpaperColors.fromBitmap(cropped);
+                            if (shouldRecycle) {
+                                cropped.recycle();
+                            }
+                            if (mRecalculateColorCounter.decrementAndGet() == 0) {
+                                Handler.getMain().post(() -> onWallpaperColorsChanged(colors));
+                            }
+                        });
+                    }
+
+                    @Override
+                    public void onError(@Nullable Throwable e) {
+                        Log.w(TAG, "Recalculate colors, crop and scale bitmap failed.", e);
                     }
                 });
     }
@@ -340,6 +395,7 @@
         mFullResImageView.setAlpha(0f);
         mFullResImageView.animate()
                 .alpha(1f)
+                .setInterpolator(ALPHA_OUT)
                 .setDuration(shortAnimationDuration)
                 .setListener(new AnimatorListenerAdapter() {
                     @Override
@@ -351,18 +407,6 @@
                         }
                     }
                 });
-
-        mLoadingProgressBar.animate()
-                .alpha(0f)
-                .setDuration(shortAnimationDuration)
-                .setListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(Animator animation) {
-                        if (mLoadingProgressBar != null) {
-                            mLoadingProgressBar.hide();
-                        }
-                    }
-                });
     }
 
     /**
@@ -374,18 +418,23 @@
      * <p>This method is called once in the Fragment lifecycle after the wallpaper asset has loaded
      * and rendered to the layout.
      *
-     * @param offsetToFarLeft {@code true} if we want to offset the visible rectangle to far left of
-     *                                    the raw wallpaper; {@code false} otherwise.
+     * @param offsetToStart {@code true} if we want to offset the visible rectangle to the start
+     *                                  side of the raw wallpaper; {@code false} otherwise.
      */
-    private void setDefaultWallpaperZoomAndScroll(boolean offsetToFarLeft) {
+    private void setDefaultWallpaperZoomAndScroll(boolean offsetToStart) {
         // Determine minimum zoom to fit maximum visible area of wallpaper on crop surface.
         int cropWidth = mWallpaperSurface.getMeasuredWidth();
         int cropHeight = mWallpaperSurface.getMeasuredHeight();
         Point crop = new Point(cropWidth, cropHeight);
         Rect visibleRawWallpaperRect =
                 WallpaperCropUtils.calculateVisibleRect(mRawWallpaperSize, crop);
-        if (offsetToFarLeft) {
-            visibleRawWallpaperRect.offsetTo(/* newLeft= */ 0, visibleRawWallpaperRect.top);
+        if (offsetToStart) {
+            if (WallpaperCropUtils.isRtl(requireContext())) {
+                visibleRawWallpaperRect.offsetTo(mRawWallpaperSize.x
+                                - visibleRawWallpaperRect.width(), visibleRawWallpaperRect.top);
+            } else {
+                visibleRawWallpaperRect.offsetTo(/* newLeft= */ 0, visibleRawWallpaperRect.top);
+            }
         }
 
         final PointF centerPosition = new PointF(visibleRawWallpaperRect.centerX(),
@@ -407,9 +456,9 @@
         mFullResImageView.setScaleAndCenter(minWallpaperZoom, centerPosition);
     }
 
-    private Rect calculateCropRect() {
+    private Rect calculateCropRect(Context context) {
         float wallpaperZoom = mFullResImageView.getScale();
-        Context context = requireContext().getApplicationContext();
+        Context appContext = context.getApplicationContext();
 
         Rect visibleFileRect = new Rect();
         mFullResImageView.visibleFileRect(visibleFileRect);
@@ -420,18 +469,17 @@
         int minCrop = Math.min(cropWidth, cropHeight);
         Point hostViewSize = new Point(cropWidth, cropHeight);
 
-        Resources res = context.getResources();
+        Resources res = appContext.getResources();
         Point cropSurfaceSize = WallpaperCropUtils.calculateCropSurfaceSize(res, maxCrop, minCrop);
 
-        Rect cropRect = WallpaperCropUtils.calculateCropRect(context, hostViewSize,
+        return WallpaperCropUtils.calculateCropRect(appContext, hostViewSize,
                 cropSurfaceSize, mRawWallpaperSize, visibleFileRect, wallpaperZoom);
-        return cropRect;
     }
 
     @Override
     protected void setCurrentWallpaper(@Destination int destination) {
         mWallpaperSetter.setCurrentWallpaper(getActivity(), mWallpaper, mWallpaperAsset,
-                destination, mFullResImageView.getScale(), calculateCropRect(),
+                destination, mFullResImageView.getScale(), calculateCropRect(getContext()),
                 new SetWallpaperCallback() {
                     @Override
                     public void onSuccess(WallpaperInfo wallpaperInfo) {
@@ -455,7 +503,6 @@
     }
 
     private class WallpaperSurfaceCallback implements SurfaceHolder.Callback {
-
         private Surface mLastSurface;
         private SurfaceControlViewHost mHost;
 
@@ -471,6 +518,28 @@
                         R.layout.fullscreen_wallpaper_preview, null);
                 mFullResImageView = wallpaperPreviewContainer.findViewById(R.id.full_res_image);
                 mLowResImageView = wallpaperPreviewContainer.findViewById(R.id.low_res_image);
+                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.
@@ -496,12 +565,22 @@
 
                 // 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,
+                        mPreviewBitmapTransformation);
+
                 wallpaperPreviewContainer.measure(
                         makeMeasureSpec(width, EXACTLY),
                         makeMeasureSpec(height, EXACTLY));
@@ -529,14 +608,14 @@
                 mHost = null;
             }
         }
-    };
-
-    private void setEditingEnabled(boolean enabled) {
-        mTouchForwardingLayout.setForwardingEnabled(enabled);
     }
 
-    private void updateScreenPreview(boolean isHomeSelected) {
+    @Override
+    protected void updateScreenPreview(boolean isHomeSelected) {
         mWorkspaceSurface.setVisibility(isHomeSelected ? View.VISIBLE : View.INVISIBLE);
+
         mLockPreviewContainer.setVisibility(isHomeSelected ? View.INVISIBLE : View.VISIBLE);
+
+        mFullScreenAnimation.setIsHomeSelected(isHomeSelected);
     }
 }
diff --git a/src/com/android/wallpaper/picker/LivePreviewFragment.java b/src/com/android/wallpaper/picker/LivePreviewFragment.java
index 8019eb8..bb64817 100644
--- a/src/com/android/wallpaper/picker/LivePreviewFragment.java
+++ b/src/com/android/wallpaper/picker/LivePreviewFragment.java
@@ -15,9 +15,13 @@
  */
 package com.android.wallpaper.picker;
 
+import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS;
+import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES;
+
 import static com.android.wallpaper.widget.BottomActionBar.BottomAction.APPLY;
 import static com.android.wallpaper.widget.BottomActionBar.BottomAction.CUSTOMIZE;
 import static com.android.wallpaper.widget.BottomActionBar.BottomAction.DELETE;
+import static com.android.wallpaper.widget.BottomActionBar.BottomAction.EDIT;
 import static com.android.wallpaper.widget.BottomActionBar.BottomAction.INFORMATION;
 
 import android.annotation.SuppressLint;
@@ -27,16 +31,13 @@
 import android.app.WallpaperInfo;
 import android.app.WallpaperManager;
 import android.content.ComponentName;
+import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ServiceInfo;
 import android.graphics.Point;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
@@ -51,7 +52,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,20 +66,23 @@
 
 import com.android.wallpaper.R;
 import com.android.wallpaper.module.WallpaperPersister.SetWallpaperCallback;
+import com.android.wallpaper.util.FullScreenAnimation;
+import com.android.wallpaper.util.ResourceUtils;
 import com.android.wallpaper.util.ScreenSizeCalculator;
 import com.android.wallpaper.util.SizeCalculator;
 import com.android.wallpaper.util.WallpaperConnection;
 import com.android.wallpaper.util.WallpaperSurfaceCallback;
 import com.android.wallpaper.widget.BottomActionBar;
 import com.android.wallpaper.widget.BottomActionBar.AccessibilityCallback;
-import com.android.wallpaper.widget.LiveTileOverlay;
+import com.android.wallpaper.widget.BottomActionBar.BottomSheetContent;
 import com.android.wallpaper.widget.LockScreenPreviewer;
 import com.android.wallpaper.widget.WallpaperColorsLoader;
-import com.android.wallpaper.widget.WallpaperInfoView;
-
-import com.google.android.material.tabs.TabLayout;
 
 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
@@ -99,34 +102,28 @@
      * @see IWallpaperConnection
      */
     protected WallpaperConnection mWallpaperConnection;
-    protected WallpaperInfoView mWallpaperInfoView;
     protected CardView mHomePreviewCard;
-    protected ImageView mHomePreview;
-
-    private final int[] mLivePreviewLocation = new int[2];
-    private final Rect mPreviewLocalRect = new Rect();
-    private final Rect mPreviewGlobalRect = new Rect();
+    protected SurfaceView mWorkspaceSurface;
+    protected WallpaperSurfaceCallback mWallpaperSurfaceCallback;
+    protected WorkspaceSurfaceHolderCallback mWorkspaceSurfaceCallback;
+    protected ViewGroup mLockPreviewContainer;
+    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 mWorkspaceSurface;
     private SurfaceView mWallpaperSurface;
-    private ViewGroup mLockPreviewContainer;
-    private LockScreenPreviewer mLockScreenPreviewer;
-    private WorkspaceSurfaceHolderCallback mWorkspaceSurfaceCallback;
-    private WallpaperSurfaceCallback mWallpaperSurfaceCallback;
+    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)) {
@@ -134,7 +131,6 @@
             mDeleteIntent.setPackage(info.getPackageName());
             mDeleteIntent.putExtra(EXTRA_LIVE_WALLPAPER_INFO, info);
         }
-
         String settingsActivity = getSettingsActivity(info);
         if (settingsActivity != null) {
             mSettingsIntent = new Intent();
@@ -165,19 +161,9 @@
             Bundle savedInstanceState) {
         View view = super.onCreateView(inflater, container, savedInstanceState);
 
-        mLoadingScrim = view.findViewById(R.id.loading);
-        setUpLoadingIndicator();
-
         Activity activity = requireActivity();
         mScreenSize = ScreenSizeCalculator.getInstance().getScreenSize(
                 activity.getWindowManager().getDefaultDisplay());
-
-        mWallpaperInfoView = (WallpaperInfoView) LayoutInflater.from(getContext())
-                .inflate(R.layout.wallpaper_info_view, /* root= */ null);
-        setUpExploreIntentAndLabel(
-                () -> mWallpaperInfoView.populateWallpaperInfo(mWallpaper, mActionLabel,
-                                mExploreIntent, this::onExploreClicked));
-
         mPreviewContainer = view.findViewById(R.id.live_wallpaper_preview);
         mTouchForwardingLayout = view.findViewById(R.id.touch_forwarding_layout);
         // Set aspect ratio on the preview card.
@@ -188,41 +174,22 @@
         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 LockScreenPreviewer(getLifecycle(), activity,
+        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 = new WorkspaceSurfaceHolderCallback(
-                mWorkspaceSurface, getContext());
+        mWorkspaceSurfaceCallback = createWorkspaceSurfaceCallback(mWorkspaceSurface);
         mWallpaperSurfaceCallback = new WallpaperSurfaceCallback(getContext(),
-                mHomePreview, mWallpaperSurface);
+                mHomePreviewCard, mWallpaperSurface, mPlaceholderColorFuture, null);
 
-        TabLayout tabs = inflater.inflate(R.layout.full_preview_tabs,
-                view.findViewById(R.id.toolbar_tabs_container))
-                .findViewById(R.id.full_preview_tabs);
-        tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
-            @Override
-            public void onTabSelected(TabLayout.Tab tab) {
-                updateScreenPreview(tab.getPosition() == 0);
-            }
-
-            @Override
-            public void onTabUnselected(TabLayout.Tab tab) {}
-
-            @Override
-            public void onTabReselected(TabLayout.Tab tab) {}
-        });
-
-        // The TabLayout only contains below tabs, see: full_preview_tabs.xml
-        // 0. Home tab
-        // 1. Lock tab
-        tabs.getTabAt(mViewAsHome ? 0 : 1).select();
-        updateScreenPreview(mViewAsHome);
+        setUpTabs(view.findViewById(R.id.separated_tabs));
 
         view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
             @Override
@@ -233,6 +200,7 @@
                 view.removeOnLayoutChangeListener(this);
             }
         });
+
         return view;
     }
 
@@ -246,29 +214,29 @@
 
     private void updateWallpaperSurface() {
         mWallpaperSurface.getHolder().addCallback(mWallpaperSurfaceCallback);
+        mWallpaperSurface.setZOrderMediaOverlay(true);
     }
 
-    private void updateScreenPreview(boolean isHomeSelected) {
+    @Override
+    protected void updateScreenPreview(boolean isHomeSelected) {
         mWorkspaceSurface.setVisibility(isHomeSelected ? View.VISIBLE : View.INVISIBLE);
-        mLockPreviewContainer.setVisibility(isHomeSelected ? View.INVISIBLE : View.VISIBLE);
-    }
 
-    private void repositionPreview(ImageView previewView) {
-        previewView.getLocationOnScreen(mLivePreviewLocation);
-        mPreviewGlobalRect.set(0, 0, previewView.getMeasuredWidth(),
-                previewView.getMeasuredHeight());
-        mPreviewLocalRect.set(mPreviewGlobalRect);
-        mPreviewGlobalRect.offset(mLivePreviewLocation[0], mLivePreviewLocation[1]);
+        mLockPreviewContainer.setVisibility(isHomeSelected ? View.INVISIBLE : View.VISIBLE);
+
+        mFullScreenAnimation.setIsHomeSelected(isHomeSelected);
     }
 
     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;
                 int action = ev.getActionMasked();
                 if (action == MotionEvent.ACTION_DOWN) {
                     mBottomActionBar.collapseBottomSheetIfExpanded();
                 }
                 MotionEvent dup = MotionEvent.obtainNoHistory(ev);
+                dup.setLocation(ev.getX() / scaleRatio, ev.getY() / scaleRatio);
                 try {
                     mWallpaperConnection.getEngine().dispatchPointer(dup);
                     if (action == MotionEvent.ACTION_UP) {
@@ -292,39 +260,52 @@
     @Override
     public void onDestroyView() {
         super.onDestroyView();
-        if (mSettingsLiveData != null && mSettingsLiveData.hasObservers()) {
+        if (mSettingsLiveData != null && mSettingsLiveData.hasObservers()
+                && mSettingsSliceView != null) {
             mSettingsLiveData.removeObserver(mSettingsSliceView);
             mSettingsLiveData = null;
         }
-        LiveTileOverlay.INSTANCE.detach(mHomePreview.getOverlay());
         if (mWallpaperConnection != null) {
             mWallpaperConnection.disconnect();
             mWallpaperConnection = null;
         }
+        if (mLockScreenPreviewer != null) {
+            mLockScreenPreviewer.release();
+        }
         mWorkspaceSurfaceCallback.cleanUp();
         mWorkspaceSurface.getHolder().removeCallback(mWorkspaceSurfaceCallback);
         mWallpaperSurfaceCallback.cleanUp();
         mWallpaperSurface.getHolder().removeCallback(mWallpaperSurfaceCallback);
     }
 
-    private void previewLiveWallpaper(ImageView thumbnailView) {
-        thumbnailView.post(() -> {
-            if (mWallpaperSurfaceCallback.getHomeImageWallpaper() != null) {
-                mWallpaper.getThumbAsset(requireActivity().getApplicationContext())
-                        .loadPreviewImage(requireActivity(),
-                                mWallpaperSurfaceCallback.getHomeImageWallpaper(),
-                                getResources().getColor(R.color.secondary_color));
+    protected void previewLiveWallpaper(ImageView thumbnailView) {
+        mWallpaperSurface.post(() -> {
+            Activity activity = getActivity();
+            if (activity == null) {
+                return;
             }
-            LiveTileOverlay.INSTANCE.detach(thumbnailView.getOverlay());
-
-            setUpLiveWallpaperPreview(mWallpaper, thumbnailView,
-                    new ColorDrawable(getResources().getColor(
-                            R.color.secondary_color, getActivity().getTheme())));
+            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(),
+                                placeholderColor != null
+                                        ? placeholderColor
+                                        : ResourceUtils.getColorAttr(activity,
+                                                android.R.attr.colorBackground),
+                                mPreviewBitmapTransformation);
+            }
+            setUpLiveWallpaperPreview(mWallpaper);
         });
     }
 
-    private void setUpLiveWallpaperPreview(com.android.wallpaper.model.WallpaperInfo homeWallpaper,
-            ImageView previewView, Drawable thumbnail) {
+    protected void setUpLiveWallpaperPreview(
+            com.android.wallpaper.model.WallpaperInfo homeWallpaper) {
         Activity activity = getActivity();
         if (activity == null || activity.isFinishing()) {
             return;
@@ -332,21 +313,13 @@
         if (mWallpaperConnection != null) {
             mWallpaperConnection.disconnect();
         }
-        if (thumbnail != null) {
-            thumbnail.setBounds(previewView.getLeft(), previewView.getTop(), previewView.getRight(),
-                    previewView.getBottom());
-        }
 
         if (WallpaperConnection.isPreviewAvailable()) {
-            repositionPreview(previewView);
             mWallpaperConnection = new WallpaperConnection(
                     getWallpaperIntent(homeWallpaper.getWallpaperComponent()),
                     activity,
                     /* listener= */ this,
-                    mPreviewGlobalRect);
-
-            LiveTileOverlay.INSTANCE.update(new RectF(mPreviewLocalRect),
-                    ((CardView) previewView.getParent()).getRadius());
+                    mWallpaperSurface);
 
             mWallpaperConnection.setVisibility(true);
         } else {
@@ -355,18 +328,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;
-                        LiveTileOverlay.INSTANCE.detach(previewView.getOverlay());
-                    }
-                }));
+        if (mWallpaperConnection != null && !mWallpaperConnection.connect()) {
+            mWallpaperConnection = null;
+        }
     }
 
     private void renderWorkspaceSurface() {
@@ -377,35 +341,35 @@
     @Override
     protected void onBottomActionBarReady(BottomActionBar bottomActionBar) {
         super.onBottomActionBarReady(bottomActionBar);
-        mBottomActionBar.showActionsOnly(INFORMATION, DELETE, CUSTOMIZE, APPLY);
+        mBottomActionBar.showActionsOnly(INFORMATION, DELETE, EDIT, CUSTOMIZE, APPLY);
         mBottomActionBar.setActionClickListener(APPLY, unused -> onSetWallpaperClicked(null));
-        mBottomActionBar.attachViewToBottomSheetAndBindAction(mWallpaperInfoView, INFORMATION);
+        mBottomActionBar.bindBottomSheetContentWithAction(
+                new WallpaperInfoContent(getContext()), INFORMATION);
 
+        View separatedTabsContainer = getView().findViewById(R.id.separated_tabs_container);
         // Update target view's accessibility param since it will be blocked by the bottom sheet
         // when expanded.
         mBottomActionBar.setAccessibilityCallback(new AccessibilityCallback() {
             @Override
             public void onBottomSheetCollapsed() {
-                mPreviewContainer.setImportantForAccessibility(
-                        View.IMPORTANT_FOR_ACCESSIBILITY_YES);
+                mPreviewContainer.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
+                separatedTabsContainer.setImportantForAccessibility(
+                        IMPORTANT_FOR_ACCESSIBILITY_YES);
             }
 
             @Override
             public void onBottomSheetExpanded() {
                 mPreviewContainer.setImportantForAccessibility(
-                        View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
+                        IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
+                separatedTabsContainer.setImportantForAccessibility(
+                        IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
             }
         });
         final Uri uriSettingsSlice = getSettingsSliceUri(mWallpaper.getWallpaperComponent());
         if (uriSettingsSlice != null) {
-            View previewPage = LayoutInflater.from(getContext())
-                    .inflate(R.layout.preview_customize_settings, null);
-            mSettingsSliceView = previewPage.findViewById(R.id.settings_slice);
-            mSettingsSliceView.setMode(SliceView.MODE_LARGE);
-            mSettingsSliceView.setScrollable(false);
             mSettingsLiveData = SliceLiveData.fromUri(requireContext(), uriSettingsSlice);
-            mSettingsLiveData.observeForever(mSettingsSliceView);
-            mBottomActionBar.attachViewToBottomSheetAndBindAction(previewPage, CUSTOMIZE);
+            mBottomActionBar.bindBottomSheetContentWithAction(
+                    new PreviewCustomizeSettingsContent(getContext()), CUSTOMIZE);
         } else {
             if (mSettingsIntent != null) {
                 mBottomActionBar.setActionClickListener(CUSTOMIZE, listener ->
@@ -415,14 +379,19 @@
             }
         }
 
-        final String deleteAction = getDeleteAction(mWallpaper.getWallpaperComponent());
-        if (TextUtils.isEmpty(deleteAction)) {
+        if (TextUtils.isEmpty(getDeleteAction(mWallpaper.getWallpaperComponent()))) {
             mBottomActionBar.hideActions(DELETE);
         } else {
             mBottomActionBar.setActionClickListener(DELETE, listener ->
                     showDeleteConfirmDialog());
         }
         mBottomActionBar.show();
+        // Action buttons are disabled when live wallpaper is not loaded.
+        mBottomActionBar.disableActions();
+        // Enable buttons if loaded, or wait for it.
+        if (isLoaded()) {
+            mBottomActionBar.enableActions();
+        }
     }
 
     @Override
@@ -431,40 +400,27 @@
         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(() -> {
-                    if (mLoadingProgressBar != null) {
-                        mLoadingProgressBar.hide();
-                    }
-                    mLoadingScrim.setVisibility(View.GONE);
-                }));
-        final Drawable placeholder = mHomePreview.getDrawable() == null
-                ? new ColorDrawable(getResources().getColor(R.color.secondary_color,
-                activity.getTheme()))
-                : mHomePreview.getDrawable();
-        LiveTileOverlay.INSTANCE.setForegroundDrawable(placeholder);
-        LiveTileOverlay.INSTANCE.attach(mHomePreview.getOverlay());
-        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()))))
-                .withEndAction(() -> {
-                    LiveTileOverlay.INSTANCE.setForegroundDrawable(null);
-                }).start();
+                .alpha(0f)
+                .setInterpolator(ALPHA_OUT)
+                .start();
+
+        if (mBottomActionBar != null) {
+            mBottomActionBar.enableActions();
+        }
     }
 
     @Override
     public void onWallpaperColorsChanged(WallpaperColors colors, int displayId) {
         mLockScreenPreviewer.setColor(colors);
+
+        mFullScreenAnimation.setFullScreenTextColor(
+                colors == null || (colors.getColorHints()
+                        & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) == 0
+                            ? FullScreenAnimation.FullScreenTextColor.LIGHT
+                            : FullScreenAnimation.FullScreenTextColor.DARK);
     }
 
     @Override
@@ -482,12 +438,7 @@
 
     @Override
     protected int getLayoutResId() {
-        return R.layout.fragment_live_preview_v2;
-    }
-
-    @Override
-    protected int getLoadingIndicatorResId() {
-        return R.id.loading_indicator;
+        return R.layout.fragment_live_preview;
     }
 
     @Override
@@ -532,7 +483,7 @@
     @Override
     public void onStart() {
         super.onStart();
-        previewLiveWallpaper(mHomePreview);
+        previewLiveWallpaper(null);
     }
 
     @Override
@@ -581,4 +532,35 @@
     private boolean isPackagePreInstalled(ApplicationInfo info) {
         return info != null && (info.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
     }
+
+    private final class PreviewCustomizeSettingsContent extends BottomSheetContent<View> {
+
+        private PreviewCustomizeSettingsContent(Context context) {
+            super(context);
+        }
+
+        @Override
+        public int getViewId() {
+            return R.layout.preview_customize_settings;
+        }
+
+        @Override
+        public void onViewCreated(View previewPage) {
+            mSettingsSliceView = previewPage.findViewById(R.id.settings_slice);
+            mSettingsSliceView.setMode(SliceView.MODE_LARGE);
+            mSettingsSliceView.setScrollable(false);
+            if (mSettingsLiveData != null) {
+                mSettingsLiveData.observeForever(mSettingsSliceView);
+            }
+        }
+
+        @Override
+        public void onRecreateView(View oldPreviewPage) {
+            super.onRecreateView(oldPreviewPage);
+            if (mSettingsLiveData != null && mSettingsLiveData.hasObservers()
+                    && mSettingsSliceView != null) {
+                mSettingsLiveData.removeObserver(mSettingsSliceView);
+            }
+        }
+    }
 }
diff --git a/src/com/android/wallpaper/picker/PreviewActivity.java b/src/com/android/wallpaper/picker/PreviewActivity.java
index 721ed0c..31db5e8 100755
--- a/src/com/android/wallpaper/picker/PreviewActivity.java
+++ b/src/com/android/wallpaper/picker/PreviewActivity.java
@@ -26,12 +26,14 @@
 import com.android.wallpaper.model.InlinePreviewIntentFactory;
 import com.android.wallpaper.model.WallpaperInfo;
 import com.android.wallpaper.module.InjectorProvider;
+import com.android.wallpaper.picker.AppbarFragment.AppbarFragmentHost;
+import com.android.wallpaper.util.ActivityUtils;
 
 /**
  * Activity that displays a preview of a specific wallpaper and provides the ability to set the
  * wallpaper as the user's current wallpaper.
  */
-public class PreviewActivity extends BasePreviewActivity {
+public class PreviewActivity extends BasePreviewActivity implements AppbarFragmentHost {
 
     /**
      * Returns a new Intent with the provided WallpaperInfo instance put as an extra.
@@ -47,13 +49,15 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_preview);
 
+        enableFullScreen();
+
         FragmentManager fm = getSupportFragmentManager();
         Fragment fragment = fm.findFragmentById(R.id.fragment_container);
 
         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,
@@ -67,6 +71,15 @@
         }
     }
 
+    @Override
+    public void onUpArrowPressed() {
+        onBackPressed();
+    }
+
+    @Override
+    public boolean isUpArrowSupported() {
+        return !ActivityUtils.isSUWMode(getBaseContext());
+    }
 
     /**
      * Implementation that provides an intent to start a PreviewActivity.
diff --git a/src/com/android/wallpaper/picker/PreviewFragment.java b/src/com/android/wallpaper/picker/PreviewFragment.java
index c5c95ec..74bdd6f 100755
--- a/src/com/android/wallpaper/picker/PreviewFragment.java
+++ b/src/com/android/wallpaper/picker/PreviewFragment.java
@@ -16,27 +16,28 @@
 package com.android.wallpaper.picker;
 
 import static com.android.wallpaper.widget.BottomActionBar.BottomAction.APPLY;
+import static com.android.wallpaper.widget.BottomActionBar.BottomAction.EDIT;
 
 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;
@@ -48,10 +49,16 @@
 import com.android.wallpaper.module.WallpaperPersister.Destination;
 import com.android.wallpaper.module.WallpaperPreferences;
 import com.android.wallpaper.module.WallpaperSetter;
+import com.android.wallpaper.util.FullScreenAnimation;
 import com.android.wallpaper.widget.BottomActionBar;
+import com.android.wallpaper.widget.BottomActionBar.BottomSheetContent;
+import com.android.wallpaper.widget.WallpaperInfoView;
+
+import com.google.android.material.tabs.TabLayout;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * Base Fragment to display the UI for previewing an individual wallpaper
@@ -60,6 +67,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.
@@ -71,6 +80,7 @@
      * wallpaper with pan and crop position to the device.
      */
     static final int MODE_CROP_AND_SET_WALLPAPER = 1;
+    private Optional<Integer> mLastSelectedTabPositionOptional = Optional.empty();
 
     /**
      * Possible preview modes for the fragment.
@@ -111,11 +121,6 @@
     private static final int UNUSED_REQUEST_CODE = 1;
     private static final String TAG = "PreviewFragment";
 
-    @PreviewMode
-    protected int mPreviewMode;
-
-    protected boolean mViewAsHome;
-
     /**
      * When true, enables a test mode of operation -- in which certain UI features are disabled to
      * allow for UI tests to run correctly. Works around issue in ProgressDialog currently where the
@@ -124,13 +129,17 @@
     protected boolean mTestingModeEnabled;
 
     protected WallpaperInfo mWallpaper;
+    protected WallpaperPreviewBitmapTransformation mPreviewBitmapTransformation;
     protected WallpaperSetter mWallpaperSetter;
     protected UserEventLogger mUserEventLogger;
     protected BottomActionBar mBottomActionBar;
-    protected ContentLoadingProgressBar mLoadingProgressBar;
+    // For full screen animations.
+    protected View mRootView;
+    protected FullScreenAnimation mFullScreenAnimation;
+    @PreviewMode protected int mPreviewMode;
+    protected boolean mViewAsHome;
 
-    protected Intent mExploreIntent;
-    protected CharSequence mActionLabel;
+    private OnBackPressedCallback mOnBackPressedCallback;
 
     /**
      * Staged error dialog fragments that were unable to be shown when the hosting activity didn't
@@ -139,13 +148,6 @@
     private SetWallpaperErrorDialogFragment mStagedSetWallpaperErrorDialogFragment;
     private LoadWallpaperErrorDialogFragment mStagedLoadWallpaperErrorDialogFragment;
 
-    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);
@@ -154,6 +156,8 @@
 
         mUserEventLogger = injector.getUserEventLogger(appContext);
         mWallpaper = getArguments().getParcelable(ARG_WALLPAPER);
+        mPreviewBitmapTransformation = new WallpaperPreviewBitmapTransformation(
+                appContext, isRtl());
 
         //noinspection ResourceType
         mPreviewMode = getArguments().getInt(ARG_PREVIEW_MODE);
@@ -162,8 +166,6 @@
         mWallpaperSetter = new WallpaperSetter(injector.getWallpaperPersister(appContext),
                 injector.getPreferences(appContext), mUserEventLogger, mTestingModeEnabled);
 
-        setHasOptionsMenu(true);
-
         Activity activity = getActivity();
         List<String> attributions = getAttributions(activity);
         if (attributions.size() > 0 && attributions.get(0) != null) {
@@ -178,15 +180,75 @@
         View view = inflater.inflate(getLayoutResId(), container, false);
         setUpToolbar(view);
 
-        mLoadingProgressBar = view.findViewById(getLoadingIndicatorResId());
-        mLoadingProgressBar.show();
+        mRootView = view;
+        mFullScreenAnimation = new FullScreenAnimation(view);
+
+        getActivity().getWindow().getDecorView().setOnApplyWindowInsetsListener(
+                (v, windowInsets) -> {
+                    v.setPadding(
+                            v.getPaddingLeft(),
+                            0,
+                            v.getPaddingRight(),
+                            0);
+
+                    mFullScreenAnimation.setWindowInsets(windowInsets);
+                    mFullScreenAnimation.placeViews();
+                    return windowInsets.consumeSystemWindowInsets();
+                }
+        );
+
         return view;
     }
 
     @Override
     protected void onBottomActionBarReady(BottomActionBar bottomActionBar) {
+        super.onBottomActionBarReady(bottomActionBar);
         mBottomActionBar = bottomActionBar;
-        // TODO: Extract the common code here.
+        mBottomActionBar.setActionClickListener(EDIT, (view) -> {
+            mFullScreenAnimation.startAnimation(/* toFullScreen= */ true);
+            mBottomActionBar.deselectAction(EDIT);
+        });
+        setFullScreenActions(mRootView.findViewById(R.id.fullscreen_buttons_container));
+
+        if (mOnBackPressedCallback == null) {
+            mOnBackPressedCallback = new OnBackPressedCallback(true) {
+                @Override
+                public void handleOnBackPressed() {
+                    if (mFullScreenAnimation.isFullScreen()) {
+                        mFullScreenAnimation.startAnimation(/* toFullScreen= */ false);
+                        return;
+                    }
+                    if (mBottomActionBar != null && !mBottomActionBar.isBottomSheetCollapsed()) {
+                        mBottomActionBar.collapseBottomSheetIfExpanded();
+                        return;
+                    }
+                    getActivity().finish();
+                }
+            };
+            getActivity().getOnBackPressedDispatcher().addCallback(this, mOnBackPressedCallback);
+        }
+    }
+
+    protected void setFullScreenActions(View container) {
+        // Update the button text for the current workspace visibility.
+        Button hideUiPreviewButton = container.findViewById(R.id.hide_ui_preview_button);
+        hideUiPreviewButton.setText(mFullScreenAnimation.getWorkspaceVisibility()
+                ? R.string.hide_ui_preview_text
+                : R.string.show_ui_preview_text);
+        hideUiPreviewButton.setOnClickListener(
+                (button) -> {
+                    boolean visible = mFullScreenAnimation.getWorkspaceVisibility();
+                    // Update the button text for the next workspace visibility.
+                    ((Button) button).setText(visible
+                            ? R.string.show_ui_preview_text
+                            : R.string.hide_ui_preview_text);
+                    mFullScreenAnimation.setWorkspaceVisibility(!visible);
+                }
+        );
+        container.findViewById(R.id.set_as_wallpaper_button).setOnClickListener(
+                this::onSetWallpaperClicked);
+
+        mFullScreenAnimation.ensureBottomActionBarIsCorrectlyLocated();
     }
 
     protected List<String> getAttributions(Context context) {
@@ -196,11 +258,9 @@
     @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());
     }
 
     @Override
@@ -226,33 +286,6 @@
         }
     }
 
-    protected void setUpExploreIntentAndLabel(@Nullable Runnable callback) {
-        Context context = getContext();
-        if (context == null) {
-            return;
-        }
-
-        WallpaperInfoHelper.loadExploreIntent(context, mWallpaper,
-                (actionLabel, exploreIntent) -> {
-                    mActionLabel = actionLabel;
-                    mExploreIntent = exploreIntent;
-                    if (callback != null) {
-                        callback.run();
-                    }
-                }
-        );
-    }
-
-    /**
-     * 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
@@ -294,17 +327,33 @@
                 mWallpaper instanceof LiveWallpaperInfo);
     }
 
-    protected void onExploreClicked(View button) {
-        if (getContext() == null) {
-            return;
-        }
-        Context context = getContext();
-        mUserEventLogger.logActionClicked(mWallpaper.getCollectionId(context),
-                mWallpaper.getActionLabelRes(context));
+    protected void setUpTabs(TabLayout tabs) {
+        tabs.addTab(tabs.newTab().setText(R.string.home_screen_message));
+        tabs.addTab(tabs.newTab().setText(R.string.lock_screen_message));
+        tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
+            @Override
+            public void onTabSelected(TabLayout.Tab tab) {
+                mLastSelectedTabPositionOptional = Optional.of(tab.getPosition());
+                updateScreenPreview(/* isHomeSelected= */ tab.getPosition() == 0);
+            }
 
-        startActivity(mExploreIntent);
+            @Override
+            public void onTabUnselected(TabLayout.Tab tab) {}
+
+            @Override
+            public void onTabReselected(TabLayout.Tab tab) {}
+        });
+
+        // The TabLayout only contains below tabs
+        // 0. Home tab
+        // 1. Lock tab
+        int tabPosition = mLastSelectedTabPositionOptional.orElseGet(() -> mViewAsHome ? 0 : 1);
+        tabs.getTabAt(tabPosition).select();
+        updateScreenPreview(/* isHomeSelected= */ tabPosition == 0);
     }
 
+    protected abstract void updateScreenPreview(boolean isHomeSelected);
+
     /**
      * Sets current wallpaper to the device based on current zoom and scroll state.
      *
@@ -373,4 +422,70 @@
         return getResources().getConfiguration().getLayoutDirection()
                     == View.LAYOUT_DIRECTION_RTL;
     }
+
+    protected final class WallpaperInfoContent extends BottomSheetContent<WallpaperInfoView> {
+
+        @Nullable private Intent mExploreIntent;
+        private CharSequence mActionLabel;
+
+        protected WallpaperInfoContent(Context context) {
+            super(context);
+        }
+
+        @Override
+        public int getViewId() {
+            return R.layout.wallpaper_info_view;
+        }
+
+        @Override
+        public void onViewCreated(WallpaperInfoView view) {
+            if (mWallpaper == null) {
+                return;
+            }
+
+            if (mActionLabel == null) {
+                setUpExploreIntentAndLabel(() -> populateWallpaperInfo(view));
+            } else {
+                populateWallpaperInfo(view);
+            }
+        }
+
+        private void setUpExploreIntentAndLabel(@Nullable Runnable callback) {
+            Context context = getContext();
+            if (context == null) {
+                return;
+            }
+
+            WallpaperInfoHelper.loadExploreIntent(context, mWallpaper,
+                    (actionLabel, exploreIntent) -> {
+                        mActionLabel = actionLabel;
+                        mExploreIntent = exploreIntent;
+                        if (callback != null) {
+                            callback.run();
+                        }
+                    }
+            );
+        }
+
+        private void onExploreClicked(View button) {
+            Context context = getContext();
+            if (context == null) {
+                return;
+            }
+
+            mUserEventLogger.logActionClicked(mWallpaper.getCollectionId(context),
+                    mWallpaper.getActionLabelRes(context));
+
+            startActivity(mExploreIntent);
+        }
+
+        private void populateWallpaperInfo(WallpaperInfoView view) {
+            view.populateWallpaperInfo(
+                    mWallpaper,
+                    mActionLabel,
+                    WallpaperInfoHelper.shouldShowExploreButton(
+                            getContext(), mExploreIntent),
+                    this::onExploreClicked);
+        }
+    }
 }
diff --git a/src/com/android/wallpaper/picker/SectionView.java b/src/com/android/wallpaper/picker/SectionView.java
new file mode 100644
index 0000000..46b4a68
--- /dev/null
+++ b/src/com/android/wallpaper/picker/SectionView.java
@@ -0,0 +1,51 @@
+/*
+ * 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.content.Context;
+import android.util.AttributeSet;
+import android.widget.LinearLayout;
+
+import androidx.annotation.Nullable;
+
+/** The SectionView base for views hosting in the {@link CustomizationPickerFragment}. */
+public abstract class SectionView extends LinearLayout {
+
+    /** The callback for the section view updates. */
+    public interface SectionViewListener {
+        void onViewActivated(@Nullable Context context, boolean viewActivated);
+    }
+
+    protected SectionViewListener mSectionViewListener;
+    private String mTitle;
+
+    public SectionView(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public void setTitle(String title) {
+        mTitle = title;
+    }
+
+    public String getTitle() {
+        return mTitle;
+    }
+
+    /** Sets the listener to the {@code SectionView} instance for reacting the view changes. */
+    public void setViewListener(SectionViewListener sectionViewListener) {
+        mSectionViewListener = sectionViewListener;
+    }
+}
diff --git a/src/com/android/wallpaper/picker/SetWallpaperDialogFragment.java b/src/com/android/wallpaper/picker/SetWallpaperDialogFragment.java
index 4ed2e13..31d56e0 100755
--- a/src/com/android/wallpaper/picker/SetWallpaperDialogFragment.java
+++ b/src/com/android/wallpaper/picker/SetWallpaperDialogFragment.java
@@ -22,6 +22,7 @@
 import android.os.Bundle;
 import android.view.View;
 import android.widget.Button;
+import android.widget.TextView;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.StringRes;
@@ -29,7 +30,6 @@
 import androidx.fragment.app.DialogFragment;
 
 import com.android.wallpaper.R;
-import com.android.wallpaper.compat.ButtonDrawableSetterCompat;
 import com.android.wallpaper.module.WallpaperPersister;
 
 /**
@@ -65,31 +65,28 @@
                         R.layout.dialog_set_wallpaper,
                         null);
 
+        View options = layout.findViewById(R.id.dialog_set_wallpaper_options);
+        options.setClipToOutline(true);
+
+        View customTitleView = View.inflate(context, R.layout.dialog_set_wallpaper_title,  null);
+        TextView title = customTitleView.findViewById(R.id.dialog_set_wallpaper_title);
+        title.setText(mTitleResId);
         AlertDialog dialog = new AlertDialog.Builder(context, R.style.LightDialogTheme)
-                .setTitle(mTitleResId)
+                .setCustomTitle(customTitleView)
                 .setView(layout)
                 .create();
 
         mSetHomeWallpaperButton = layout.findViewById(R.id.set_home_wallpaper_button);
         mSetHomeWallpaperButton.setOnClickListener(
                 v -> onSetWallpaperButtonClick(WallpaperPersister.DEST_HOME_SCREEN));
-        ButtonDrawableSetterCompat.setDrawableToButtonStart(
-                mSetHomeWallpaperButton,
-                context.getDrawable(R.drawable.ic_home_24px));
 
         mSetLockWallpaperButton = layout.findViewById(R.id.set_lock_wallpaper_button);
         mSetLockWallpaperButton.setOnClickListener(
                 v -> onSetWallpaperButtonClick(WallpaperPersister.DEST_LOCK_SCREEN));
-        ButtonDrawableSetterCompat.setDrawableToButtonStart(
-                mSetLockWallpaperButton,
-                context.getDrawable(R.drawable.ic_lock_outline_24px));
 
         mSetBothWallpaperButton = layout.findViewById(R.id.set_both_wallpaper_button);
         mSetBothWallpaperButton.setOnClickListener(
                 v -> onSetWallpaperButtonClick(WallpaperPersister.DEST_BOTH));
-        ButtonDrawableSetterCompat.setDrawableToButtonStart(
-                mSetBothWallpaperButton,
-                context.getDrawable(R.drawable.ic_smartphone_24px));
 
         updateButtonsVisibility();
 
diff --git a/src/com/android/wallpaper/picker/StandalonePreviewActivity.java b/src/com/android/wallpaper/picker/StandalonePreviewActivity.java
index ee30e66..8651df6 100755
--- a/src/com/android/wallpaper/picker/StandalonePreviewActivity.java
+++ b/src/com/android/wallpaper/picker/StandalonePreviewActivity.java
@@ -22,6 +22,7 @@
 import android.os.Binder;
 import android.os.Bundle;
 import android.util.Log;
+import android.view.WindowManager;
 
 import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;
@@ -32,13 +33,14 @@
 import com.android.wallpaper.model.WallpaperInfo;
 import com.android.wallpaper.module.InjectorProvider;
 import com.android.wallpaper.module.UserEventLogger;
+import com.android.wallpaper.picker.AppbarFragment.AppbarFragmentHost;
 
 /**
  * Activity that displays a preview of a specific wallpaper and provides the ability to set the
  * wallpaper as the user's current wallpaper. It's "standalone" meaning it doesn't reside in the
  * app navigation hierarchy and can be launched directly via an explicit intent.
  */
-public class StandalonePreviewActivity extends BasePreviewActivity {
+public class StandalonePreviewActivity extends BasePreviewActivity implements AppbarFragmentHost {
     private static final String TAG = "StandalonePreview";
     private static final int READ_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 1;
 
@@ -49,6 +51,8 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_preview);
 
+        enableFullScreen();
+
         mUserEventLogger = InjectorProvider.getInjector().getUserEventLogger(getApplicationContext());
         mUserEventLogger.logStandalonePreviewLaunched();
 
@@ -110,6 +114,25 @@
         }
     }
 
+    @Override
+    public void onUpArrowPressed() {
+        // TODO(b/182972395): It should go back to WallpaperPicker.
+    }
+
+    @Override
+    public boolean isUpArrowSupported() {
+        // TODO(b/182972395): It should go back to WallpaperPicker.
+        return false;
+    }
+
+    @Override
+    protected void enableFullScreen() {
+        super.enableFullScreen();
+        getWindow().setFlags(
+                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
+                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
+    }
+
     /**
      * Creates a new instance of {@link PreviewFragment} and loads the fragment into this activity's
      * fragment container so that it's shown to the user.
diff --git a/src/com/android/wallpaper/picker/TopLevelPickerActivity.java b/src/com/android/wallpaper/picker/TopLevelPickerActivity.java
index 2baa7da..191a39f 100755
--- a/src/com/android/wallpaper/picker/TopLevelPickerActivity.java
+++ b/src/com/android/wallpaper/picker/TopLevelPickerActivity.java
@@ -72,13 +72,14 @@
 import com.android.wallpaper.module.WallpaperPreferences.PresentationMode;
 import com.android.wallpaper.module.WallpaperRotationRefresher;
 import com.android.wallpaper.module.WallpaperRotationRefresher.Listener;
+import com.android.wallpaper.picker.AppbarFragment.AppbarFragmentHost;
 import com.android.wallpaper.picker.CategoryFragment.CategoryFragmentHost;
 import com.android.wallpaper.picker.WallpaperDisabledFragment.WallpaperSupportLevel;
 import com.android.wallpaper.picker.individual.IndividualPickerFragment;
+import com.android.wallpaper.util.ActivityUtils;
+import com.android.wallpaper.util.ResourceUtils;
 import com.android.wallpaper.util.ScreenSizeCalculator;
 import com.android.wallpaper.util.ThrowableAnalyzer;
-import com.android.wallpaper.widget.BottomActionBar;
-import com.android.wallpaper.widget.BottomActionBar.BottomActionBarHost;
 
 import com.google.android.material.bottomsheet.BottomSheetBehavior;
 import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback;
@@ -93,7 +94,7 @@
  */
 public class TopLevelPickerActivity extends BaseActivity implements WallpapersUiContainer,
         CurrentWallpaperBottomSheetPresenter, SetWallpaperErrorDialogFragment.Listener,
-        MyPhotosStarter, CategoryFragmentHost, BottomActionBarHost {
+        MyPhotosStarter, AppbarFragmentHost, CategoryFragmentHost {
 
     private static final String TAG_SET_WALLPAPER_ERROR_DIALOG_FRAGMENT =
             "toplevel_set_wallpaper_error_dialog";
@@ -150,8 +151,11 @@
      */
     private WallpaperInfo mPendingSetWallpaperInfo;
 
-    private static int getTextColorIdForWallpaperPositionButton(boolean isSelected) {
-        return isSelected ? R.color.accent_color : R.color.material_grey500;
+    private int getTextColorForWallpaperPositionButton(boolean isSelected) {
+        int textColorId = isSelected
+                ? android.R.attr.colorAccent
+                : android.R.attr.textColorTertiary;
+        return ResourceUtils.getColorAttr(this, textColorId);
     }
 
     @Override
@@ -232,13 +236,7 @@
     @Override
     public void onBackPressed() {
         Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
-        if (fragment instanceof BottomActionBarFragment
-                && ((BottomActionBarFragment) fragment).onBackPressed()) {
-            return;
-        }
-
-        CategoryFragment categoryFragment = getCategoryFragment();
-        if (categoryFragment != null && categoryFragment.popChildFragment()) {
+        if (fragment != null && fragment.getChildFragmentManager().popBackStackImmediate()) {
             return;
         }
         super.onBackPressed();
@@ -263,6 +261,9 @@
 
     private void initializeMobile(boolean shouldForceRefresh) {
         setContentView(R.layout.activity_top_level_picker);
+        if (ActivityUtils.isSUWMode(getBaseContext())) {
+            findViewById(R.id.fragment_main).setFitsSystemWindows(/* fitSystemWindows= */ true);
+        }
         getWindow().getDecorView().setSystemUiVisibility(
                 getWindow().getDecorView().getSystemUiVisibility()
                         | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
@@ -295,8 +296,8 @@
         Fragment fragment = fm.findFragmentById(R.id.fragment_container);
 
         if (fragment == null) {
-            // App launch specific logic: log the "app launched" event and set up daily logging.
-            mUserEventLogger.logAppLaunched();
+            // App launch specific logic: log the "app launch source" event.
+            mUserEventLogger.logAppLaunched(getIntent());
             mWallpaperPreferences.incrementAppLaunched();
             DailyLoggingAlarmScheduler.setAlarm(getApplicationContext());
 
@@ -356,8 +357,8 @@
         Fragment fragment = fm.findFragmentById(R.id.fragment_container);
 
         if (fragment == null) {
-            // App launch specific logic: log the "app launched" event and set up daily logging.
-            mUserEventLogger.logAppLaunched();
+            // App launch specific logic: log the "app launch source" event.
+            mUserEventLogger.logAppLaunched(getIntent());
             mWallpaperPreferences.incrementAppLaunched();
             DailyLoggingAlarmScheduler.setAlarm(getApplicationContext());
         }
@@ -423,7 +424,7 @@
         // tab for a category not yet repopulated.
         mLastSelectedCategoryTabIndex = -1;
 
-        mDelegate.populateCategories(true /* forceCategoryRefresh */);
+        mDelegate.populateCategories(/* forceRefresh= */ true);
 
         setDesktopLoading(false);
         setCurrentWallpapersExpanded(false);
@@ -474,7 +475,8 @@
                     nextWallpaperButtonDrawable.getConstantState().newDrawable().mutate();
             // Color the "compass" icon with the accent color.
             nextWallpaperButtonDrawable.setColorFilter(
-                    getResources().getColor(R.color.accent_color), Mode.SRC_IN);
+                    ResourceUtils.getColorAttr(this,
+                            android.R.attr.colorAccent), Mode.SRC_IN);
             ButtonDrawableSetterCompat.setDrawableToButtonStart(
                     mCurrentWallpaperSkipWallpaperButton, nextWallpaperButtonDrawable);
         }
@@ -582,7 +584,8 @@
                                     .newDrawable().mutate();
                             // Color the "compass" icon with the accent color.
                             exploreButtonDrawable.setColorFilter(
-                                    getResources().getColor(R.color.accent_color), Mode.SRC_IN);
+                                    ResourceUtils.getColorAttr(TopLevelPickerActivity.this,
+                                            android.R.attr.colorAccent), Mode.SRC_IN);
 
                             ButtonDrawableSetterCompat.setDrawableToButtonStart(
                                     mCurrentWallpaperExploreButton, exploreButtonDrawable);
@@ -649,12 +652,13 @@
 
     @Override
     @Nullable
-    public CategoryFragment getCategoryFragment() {
+    public CategorySelectorFragment getCategorySelectorFragment() {
         if (mDelegate.getFormFactor() != FormFactorChecker.FORM_FACTOR_MOBILE) {
             return null;
         }
         FragmentManager fm = getSupportFragmentManager();
-        return (CategoryFragment) fm.findFragmentById(R.id.fragment_container);
+        return ((CategoryFragment) fm.findFragmentById(
+                R.id.fragment_container)).getCategorySelectorFragment();
     }
 
     /**
@@ -797,13 +801,13 @@
     }
 
     @Override
-    public boolean isNavigationTabsContained() {
-        return false;
+    public void fetchCategories() {
+        mDelegate.initialize(!mDelegate.getCategoryProvider().isCategoriesFetched());
     }
 
     @Override
-    public void fetchCategories() {
-        mDelegate.initialize(!mDelegate.getCategoryProvider().isCategoriesFetched());
+    public void cleanUp() {
+        mDelegate.cleanUp();
     }
 
     @Override
@@ -1069,19 +1073,19 @@
     private void setCenterWallpaperPositionButtonSelected(Button button, boolean isSelected) {
         int drawableId = isSelected ? R.drawable.center_blue : R.drawable.center_grey;
         ButtonDrawableSetterCompat.setDrawableToButtonStart(button, getDrawable(drawableId));
-        button.setTextColor(getColor(getTextColorIdForWallpaperPositionButton(isSelected)));
+        button.setTextColor(getTextColorForWallpaperPositionButton(isSelected));
     }
 
     private void setCenterCropWallpaperPositionButtonSelected(Button button, boolean isSelected) {
         int drawableId = isSelected ? R.drawable.center_crop_blue : R.drawable.center_crop_grey;
         ButtonDrawableSetterCompat.setDrawableToButtonStart(button, getDrawable(drawableId));
-        button.setTextColor(getColor(getTextColorIdForWallpaperPositionButton(isSelected)));
+        button.setTextColor(getTextColorForWallpaperPositionButton(isSelected));
     }
 
     private void setStretchWallpaperPositionButtonSelected(Button button, boolean isSelected) {
         int drawableId = isSelected ? R.drawable.stretch_blue : R.drawable.stretch_grey;
         ButtonDrawableSetterCompat.setDrawableToButtonStart(button, getDrawable(drawableId));
-        button.setTextColor(getColor(getTextColorIdForWallpaperPositionButton(isSelected)));
+        button.setTextColor(getTextColorForWallpaperPositionButton(isSelected));
     }
 
     private void showSettingWallpaperProgressDialog() {
@@ -1121,8 +1125,13 @@
     }
 
     @Override
-    public BottomActionBar getBottomActionBar() {
-        return findViewById(R.id.bottom_actionbar);
+    public void onUpArrowPressed() {
+        onBackPressed();
+    }
+
+    @Override
+    public boolean isUpArrowSupported() {
+        return !ActivityUtils.isSUWMode(getBaseContext());
     }
 
     private interface AssetReceiver {
diff --git a/src/com/android/wallpaper/picker/ViewOnlyPreviewActivity.java b/src/com/android/wallpaper/picker/ViewOnlyPreviewActivity.java
index 006789e..67bb943 100755
--- a/src/com/android/wallpaper/picker/ViewOnlyPreviewActivity.java
+++ b/src/com/android/wallpaper/picker/ViewOnlyPreviewActivity.java
@@ -26,11 +26,13 @@
 import com.android.wallpaper.model.InlinePreviewIntentFactory;
 import com.android.wallpaper.model.WallpaperInfo;
 import com.android.wallpaper.module.InjectorProvider;
+import com.android.wallpaper.picker.AppbarFragment.AppbarFragmentHost;
+import com.android.wallpaper.util.ActivityUtils;
 
 /**
  * Activity that displays a view-only preview of a specific wallpaper.
  */
-public class ViewOnlyPreviewActivity extends BasePreviewActivity {
+public class ViewOnlyPreviewActivity extends BasePreviewActivity implements AppbarFragmentHost {
 
     /**
      * Returns a new Intent with the provided WallpaperInfo instance put as an extra.
@@ -42,18 +44,15 @@
 
     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
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_preview);
-    }
 
-    @Override
-    public void onAttachedToWindow() {
-        super.onAttachedToWindow();
+        enableFullScreen();
 
         FragmentManager fm = getSupportFragmentManager();
         Fragment fragment = fm.findFragmentById(R.id.fragment_container);
@@ -62,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,
@@ -75,6 +74,16 @@
         }
     }
 
+    @Override
+    public void onUpArrowPressed() {
+        onBackPressed();
+    }
+
+    @Override
+    public boolean isUpArrowSupported() {
+        return !ActivityUtils.isSUWMode(getBaseContext());
+    }
+
     /**
      * Implementation that provides an intent to start a PreviewActivity.
      */
diff --git a/src/com/android/wallpaper/picker/WallpaperInfoHelper.java b/src/com/android/wallpaper/picker/WallpaperInfoHelper.java
index fc70718..7e5dd89 100644
--- a/src/com/android/wallpaper/picker/WallpaperInfoHelper.java
+++ b/src/com/android/wallpaper/picker/WallpaperInfoHelper.java
@@ -27,6 +27,7 @@
 import com.android.wallpaper.model.WallpaperInfo;
 import com.android.wallpaper.module.ExploreIntentChecker;
 import com.android.wallpaper.module.InjectorProvider;
+import com.android.wallpaper.util.ActivityUtils;
 
 /** A helper class for wallpaper info. */
 public class WallpaperInfoHelper {
@@ -55,6 +56,11 @@
         }
     }
 
+    /** Indicates if the explore button should show up in the wallpaper info view. */
+    public static boolean shouldShowExploreButton(Context context, @Nullable Intent exploreIntent) {
+        return exploreIntent != null && !ActivityUtils.isSUWMode(context);
+    }
+
     private static CharSequence getActionLabel(Context context, WallpaperInfo wallpaperInfo) {
         CharSequence exploreLabel = null;
         if (wallpaperInfo instanceof LiveWallpaperInfo) {
diff --git a/src/com/android/wallpaper/picker/WallpaperOnlyFragment.java b/src/com/android/wallpaper/picker/WallpaperOnlyFragment.java
new file mode 100644
index 0000000..b59b853
--- /dev/null
+++ b/src/com/android/wallpaper/picker/WallpaperOnlyFragment.java
@@ -0,0 +1,42 @@
+/*
+ * 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 com.android.wallpaper.model.CustomizationSectionController;
+import com.android.wallpaper.model.WallpaperSectionController;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/** The Fragment UI for wallpaper only section. */
+public class WallpaperOnlyFragment extends CustomizationPickerFragment {
+
+    /** Initiates WallpaperOnlyFragment instance. */
+    public static WallpaperOnlyFragment newInstance(CharSequence title) {
+        WallpaperOnlyFragment fragment = new WallpaperOnlyFragment();
+        fragment.setArguments(AppbarFragment.createArguments(title));
+        return fragment;
+    }
+
+    @Override
+    protected List<CustomizationSectionController<?>> getAvailableSections(
+            List<CustomizationSectionController<?>> controllers) {
+        List<CustomizationSectionController<?>> wallpaperOnlySections = controllers.stream()
+                .filter(controller -> controller instanceof WallpaperSectionController)
+                .collect(Collectors.toList());
+        return super.getAvailableSections(wallpaperOnlySections);
+    }
+}
diff --git a/src/com/android/wallpaper/picker/WallpaperPickerDelegate.java b/src/com/android/wallpaper/picker/WallpaperPickerDelegate.java
index 273e801..adb9e54 100644
--- a/src/com/android/wallpaper/picker/WallpaperPickerDelegate.java
+++ b/src/com/android/wallpaper/picker/WallpaperPickerDelegate.java
@@ -79,6 +79,8 @@
     private List<PermissionChangedListener> mPermissionChangedListeners;
     private PackageStatusNotifier.Listener mLiveWallpaperStatusListener;
     private PackageStatusNotifier.Listener mThirdPartyStatusListener;
+    private PackageStatusNotifier.Listener mDownloadableWallpaperStatusListener;
+    private String mDownloadableIntentAction;
     private CategoryProvider mCategoryProvider;
     private WallpaperPersister mWallpaperPersister;
     private static final String READ_PERMISSION = permission.READ_EXTERNAL_STORAGE;
@@ -101,6 +103,7 @@
         mFormFactor = formFactorChecker.getFormFactor();
 
         mPermissionChangedListeners = new ArrayList<>();
+        mDownloadableIntentAction = injector.getDownloadableIntentAction();
     }
 
     public void initialize(boolean forceCategoryRefresh) {
@@ -111,6 +114,15 @@
                 mLiveWallpaperStatusListener,
                 WallpaperService.SERVICE_INTERFACE);
         mPackageStatusNotifier.addListener(mThirdPartyStatusListener, Intent.ACTION_SET_WALLPAPER);
+        if (mDownloadableIntentAction != null) {
+            mDownloadableWallpaperStatusListener = (packageName, status) -> {
+                if (status != PackageStatusNotifier.PackageStatus.REMOVED) {
+                    populateCategories(/* forceRefresh= */ true);
+                }
+            };
+            mPackageStatusNotifier.addListener(
+                    mDownloadableWallpaperStatusListener, mDownloadableIntentAction);
+        }
     }
 
     @Override
@@ -194,7 +206,7 @@
             }
         } else {
             // CHANGED package, let's reload all categories as we could have more or fewer now
-            populateCategories(true);
+            populateCategories(/* forceRefresh= */ true);
         }
     }
 
@@ -247,6 +259,25 @@
     }
 
     /**
+     * Fetch the wallpaper categories but don't call any callbacks on the result, just so that
+     * they're cached when loading later.
+     */
+    public void prefetchCategories() {
+        boolean forceRefresh = mCategoryProvider.resetIfNeeded();
+        mCategoryProvider.fetchCategories(new CategoryReceiver() {
+            @Override
+            public void onCategoryReceived(Category category) {
+                // Do nothing
+            }
+
+            @Override
+            public void doneFetchingCategories() {
+                // Do nothing
+            }
+        }, forceRefresh);
+    }
+
+    /**
      * Populates the categories appropriately depending on the device form factor.
      *
      * @param forceRefresh        Whether to force a refresh of categories from the
@@ -255,10 +286,10 @@
      */
     public void populateCategories(boolean forceRefresh) {
 
-        final CategoryFragment categoryFragment = getCategoryPickerFragment();
+        final CategorySelectorFragment categorySelectorFragment = getCategorySelectorFragment();
 
-        if (forceRefresh && categoryFragment != null) {
-            categoryFragment.clearCategories();
+        if (forceRefresh && categorySelectorFragment != null) {
+            categorySelectorFragment.clearCategories();
         }
 
         mCategoryProvider.fetchCategories(new CategoryReceiver() {
@@ -276,9 +307,9 @@
 
     private void notifyDoneFetchingCategories() {
         if (mFormFactor == FormFactorChecker.FORM_FACTOR_MOBILE) {
-            CategoryFragment categoryFragment = getCategoryPickerFragment();
-            if (categoryFragment != null) {
-                categoryFragment.doneFetchingCategories();
+            CategorySelectorFragment categorySelectorFragment = getCategorySelectorFragment();
+            if (categorySelectorFragment != null) {
+                categorySelectorFragment.doneFetchingCategories();
             }
         } else {
             mContainer.doneFetchingCategories();
@@ -286,29 +317,29 @@
     }
 
     public void addCategory(Category category, boolean fetchingAll) {
-        CategoryFragment categoryFragment = getCategoryPickerFragment();
-        if (categoryFragment != null) {
-            categoryFragment.addCategory(category, fetchingAll);
+        CategorySelectorFragment categorySelectorFragment = getCategorySelectorFragment();
+        if (categorySelectorFragment != null) {
+            categorySelectorFragment.addCategory(category, fetchingAll);
         }
     }
 
     public void removeCategory(Category category) {
-        CategoryFragment categoryFragment = getCategoryPickerFragment();
-        if (categoryFragment != null) {
-            categoryFragment.removeCategory(category);
+        CategorySelectorFragment categorySelectorFragment = getCategorySelectorFragment();
+        if (categorySelectorFragment != null) {
+            categorySelectorFragment.removeCategory(category);
         }
     }
 
     public void updateCategory(Category category) {
-        CategoryFragment categoryFragment = getCategoryPickerFragment();
-        if (categoryFragment != null) {
-            categoryFragment.updateCategory(category);
+        CategorySelectorFragment categorySelectorFragment = getCategorySelectorFragment();
+        if (categorySelectorFragment != null) {
+            categorySelectorFragment.updateCategory(category);
         }
     }
 
     @Nullable
-    private CategoryFragment getCategoryPickerFragment() {
-        return mContainer.getCategoryFragment();
+    private CategorySelectorFragment getCategorySelectorFragment() {
+        return mContainer.getCategorySelectorFragment();
     }
 
     /**
@@ -396,6 +427,7 @@
         if (mPackageStatusNotifier != null) {
             mPackageStatusNotifier.removeListener(mLiveWallpaperStatusListener);
             mPackageStatusNotifier.removeListener(mThirdPartyStatusListener);
+            mPackageStatusNotifier.removeListener(mDownloadableWallpaperStatusListener);
         }
     }
 
@@ -455,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
new file mode 100644
index 0000000..ad97570
--- /dev/null
+++ b/src/com/android/wallpaper/picker/WallpaperSectionView.java
@@ -0,0 +1,70 @@
+/*
+ * 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.Context;
+import android.util.AttributeSet;
+import android.view.ViewGroup;
+
+import androidx.cardview.widget.CardView;
+
+import com.android.wallpaper.R;
+import com.android.wallpaper.util.ScreenSizeCalculator;
+import com.android.wallpaper.util.SizeCalculator;
+
+/** The wallpaper section view in the customization picker fragment. */
+public final class WallpaperSectionView extends SectionView {
+
+    private CardView mHomePreviewCard;
+    private CardView mLockscreenPreviewCard;
+
+    public WallpaperSectionView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        matchDeviceShape(mHomePreviewCard);
+        matchDeviceShape(mLockscreenPreviewCard);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        mHomePreviewCard = findViewById(R.id.home_preview);
+        mLockscreenPreviewCard = findViewById(R.id.lock_preview);
+
+        // Disable the shadows of these card views.
+        mHomePreviewCard.setCardElevation(0);
+        mLockscreenPreviewCard.setCardElevation(0);
+    }
+
+    private void matchDeviceShape(CardView cardView) {
+        // Match device aspect ratio
+        float screenAspectRatio =
+                ScreenSizeCalculator.getInstance().getScreenAspectRatio(getContext());
+        int cardWidth = cardView.getMeasuredWidth();
+        int cardHeight = (int) (cardWidth * screenAspectRatio);
+        ViewGroup.LayoutParams layoutParams = cardView.getLayoutParams();
+        layoutParams.height = cardHeight;
+
+        // Match device corner
+        cardView.setRadius(
+                SizeCalculator.getPreviewCornerRadius((Activity) getContext(), cardWidth));
+    }
+}
diff --git a/src/com/android/wallpaper/picker/WallpapersUiContainer.java b/src/com/android/wallpaper/picker/WallpapersUiContainer.java
index 724c107..2bc1763 100755
--- a/src/com/android/wallpaper/picker/WallpapersUiContainer.java
+++ b/src/com/android/wallpaper/picker/WallpapersUiContainer.java
@@ -27,11 +27,11 @@
     void onWallpapersReady();
 
     /**
-     * Returns the {@link CategoryFragment} used by this container to display wallpaper
+     * Returns the {@link CategorySelectorFragment} used by this container to display wallpaper
      * categories, or {@code null} if none is available.
      */
     @Nullable
-    CategoryFragment getCategoryFragment();
+    CategorySelectorFragment getCategorySelectorFragment();
 
     /**
      * Notifies the container that categories have been fetched.
diff --git a/src/com/android/wallpaper/picker/WorkspaceSurfaceHolderCallback.java b/src/com/android/wallpaper/picker/WorkspaceSurfaceHolderCallback.java
index 91aae6a..2661923 100644
--- a/src/com/android/wallpaper/picker/WorkspaceSurfaceHolderCallback.java
+++ b/src/com/android/wallpaper/picker/WorkspaceSurfaceHolderCallback.java
@@ -15,69 +15,146 @@
  */
 package com.android.wallpaper.picker;
 
+import android.app.WallpaperColors;
 import android.content.Context;
 import android.os.Bundle;
 import android.os.Message;
 import android.os.RemoteException;
+import android.util.Log;
 import android.view.Surface;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
 
+import androidx.annotation.Nullable;
+
 import com.android.wallpaper.R;
 import com.android.wallpaper.util.PreviewUtils;
 import com.android.wallpaper.util.SurfaceViewUtils;
 
+import java.util.concurrent.atomic.AtomicBoolean;
+
 /** A surface holder callback that renders user's workspace on the passed in surface view. */
 public class WorkspaceSurfaceHolderCallback implements SurfaceHolder.Callback {
 
+    /**
+     * Listener to be called when workspace surface is updated with a new Surface Package.
+     */
+    public interface WorkspaceRenderListener {
+        /**
+         * Called on the main thread after the workspace surface is updated from the provider
+         */
+        void onWorkspaceRendered();
+    }
+
+    private static final String TAG = "WsSurfaceHolderCallback";
+    private static final String KEY_WALLPAPER_COLORS = "wallpaper_colors";
     private final SurfaceView mWorkspaceSurface;
     private final PreviewUtils mPreviewUtils;
+    private final boolean mShouldUseWallpaperColors;
+    private final AtomicBoolean mRequestPending = new AtomicBoolean(false);
 
+    private WallpaperColors mWallpaperColors;
+    private boolean mIsWallpaperColorsReady;
     private Surface mLastSurface;
     private Message mCallback;
+    private WorkspaceRenderListener mListener;
 
     private boolean mNeedsToCleanUp;
 
     public WorkspaceSurfaceHolderCallback(SurfaceView workspaceSurface, Context context) {
+        this(workspaceSurface, context, false);
+    }
+
+    /**
+     * Creates a new instance of {@link WorkspaceSurfaceHolderCallback} specifying if wallpaper
+     * colors should be used to preview the workspace.
+     *
+     * @param shouldUseWallpaperColors if true, the workspace preview won't be requested until both
+     *                                 the surface is created and wallpaper colors are set via
+     *                                 {@link #setWallpaperColors(WallpaperColors)}
+     */
+    public WorkspaceSurfaceHolderCallback(SurfaceView workspaceSurface, Context context,
+            boolean shouldUseWallpaperColors) {
         mWorkspaceSurface = workspaceSurface;
         mPreviewUtils = new PreviewUtils(context,
                 context.getString(R.string.grid_control_metadata_name));
+        mShouldUseWallpaperColors = shouldUseWallpaperColors;
     }
 
     @Override
     public void surfaceCreated(SurfaceHolder holder) {
         if (mPreviewUtils.supportsPreview() && mLastSurface != holder.getSurface()) {
             mLastSurface = holder.getSurface();
-            Bundle result = renderPreview(mWorkspaceSurface);
-            if (result != null) {
+            maybeRenderPreview();
+        }
+    }
+
+    /**
+     * Set the current wallpaper's colors. This method must be called  if this instance was created
+     * with shouldUseWallpaperColors = true (even with {@code null} colors), and conversely, calling
+     * this method when {@code shouldUseWallpaperColors = false} will be a no-op.
+     *
+     * @param colors WallpaperColors extracted from the current wallpaper preview, or {@code null}
+     *               if none are available.
+     * @see #WorkspaceSurfaceHolderCallback(SurfaceView, Context, boolean)
+     */
+    public void setWallpaperColors(@Nullable WallpaperColors colors) {
+        if (!mShouldUseWallpaperColors) {
+            return;
+        }
+        mWallpaperColors = colors;
+        mIsWallpaperColorsReady = true;
+        maybeRenderPreview();
+    }
+
+    public void setListener(WorkspaceRenderListener listener) {
+        mListener = listener;
+    }
+
+    private void maybeRenderPreview() {
+        if ((mShouldUseWallpaperColors && !mIsWallpaperColorsReady) || mLastSurface == null) {
+            return;
+        }
+
+        mRequestPending.set(true);
+        requestPreview(mWorkspaceSurface, (result) -> {
+            mRequestPending.set(false);
+            if (result != null && mLastSurface != null) {
                 mWorkspaceSurface.setChildSurfacePackage(
                         SurfaceViewUtils.getSurfacePackage(result));
+
                 mCallback = SurfaceViewUtils.getCallback(result);
 
                 if (mNeedsToCleanUp) {
                     cleanUp();
+                } else if (mListener != null) {
+                    mListener.onWorkspaceRendered();
                 }
             }
-        }
+        });
     }
 
     @Override
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }
 
     @Override
-    public void surfaceDestroyed(SurfaceHolder holder) { }
+    public void surfaceDestroyed(SurfaceHolder holder) {
+    }
 
     public void cleanUp() {
         if (mCallback != null) {
             try {
                 mCallback.replyTo.send(mCallback);
+                mNeedsToCleanUp = false;
             } catch (RemoteException e) {
-                e.printStackTrace();
+                Log.w(TAG, "Couldn't call cleanup on workspace preview", e);
             } finally {
                 mCallback = null;
             }
         } else {
-            mNeedsToCleanUp = true;
+            if (mRequestPending.get()) {
+                mNeedsToCleanUp = true;
+            }
         }
     }
 
@@ -85,8 +162,18 @@
         mLastSurface = null;
     }
 
-    protected Bundle renderPreview(SurfaceView workspaceSurface) {
-        return mPreviewUtils.renderPreview(
-                SurfaceViewUtils.createSurfaceViewRequest(workspaceSurface));
+    protected void requestPreview(SurfaceView workspaceSurface,
+            PreviewUtils.WorkspacePreviewCallback callback) {
+        if (workspaceSurface.getDisplay() == null) {
+            Log.w(TAG,
+                    "No display ID, avoiding asking for workspace preview, lest WallpaperPicker "
+                            + "crash");
+            return;
+        }
+        Bundle request = SurfaceViewUtils.createSurfaceViewRequest(workspaceSurface);
+        if (mWallpaperColors != null) {
+            request.putParcelable(KEY_WALLPAPER_COLORS, mWallpaperColors);
+        }
+        mPreviewUtils.renderPreview(request, callback);
     }
 }
diff --git a/src/com/android/wallpaper/picker/individual/CheckmarkSelectionAnimator.java b/src/com/android/wallpaper/picker/individual/CheckmarkSelectionAnimator.java
deleted file mode 100755
index db33857..0000000
--- a/src/com/android/wallpaper/picker/individual/CheckmarkSelectionAnimator.java
+++ /dev/null
@@ -1,283 +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.picker.individual;
-
-import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.content.Context;
-import android.os.Handler;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnHoverListener;
-import android.widget.ImageView;
-
-import com.android.wallpaper.R;
-
-/**
- * Implementation of {@code SelectionAnimator} which uses a checkmark and inset around the tile to
- * indicate a selected state.
- */
-public class CheckmarkSelectionAnimator implements SelectionAnimator {
-    private static final int HOVER_TIMEOUT_MS = 200;
-    private static final float HOVER_CHECK_CIRCLE_OPACITY = 0.67f;
-
-    private Context mAppContext;
-
-    private View mTile;
-    private ImageView mCheckCircle;
-    private View mLoadingIndicatorContainer;
-    private boolean mIsSelected;
-    private boolean mIsHovered;
-    private Handler mHoverHandler;
-
-    private Runnable mHoverEnterRunnable = new Runnable() {
-        @Override
-        public void run() {
-            mIsHovered = true;
-
-            mCheckCircle.setImageDrawable(mAppContext.getDrawable(
-                    R.drawable.material_ic_check_circle_white_24));
-            mCheckCircle.setVisibility(View.VISIBLE);
-            ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(
-                    mCheckCircle, "alpha", 0f, HOVER_CHECK_CIRCLE_OPACITY);
-            alphaAnimator.start();
-
-            alphaAnimator.addListener(new AnimatorListener() {
-                @Override
-                public void onAnimationStart(Animator animation) {
-                }
-
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    mIsHovered = true;
-                }
-
-                @Override
-                public void onAnimationCancel(Animator animation) {
-                }
-
-                @Override
-                public void onAnimationRepeat(Animator animation) {
-                }
-            });
-        }
-    };
-
-    private Runnable mHoverExitRunnable = new Runnable() {
-        @Override
-        public void run() {
-            mIsHovered = false;
-
-            ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(
-                    mCheckCircle, "alpha", HOVER_CHECK_CIRCLE_OPACITY, 0f);
-            alphaAnimator.addListener(new AnimatorListener() {
-                @Override
-                public void onAnimationStart(Animator animation) {
-                }
-
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    mCheckCircle.setVisibility(View.GONE);
-                    mIsHovered = false;
-                }
-
-                @Override
-                public void onAnimationCancel(Animator animation) {
-                }
-
-                @Override
-                public void onAnimationRepeat(Animator animation) {
-                }
-            });
-
-            alphaAnimator.start();
-        }
-    };
-
-    public CheckmarkSelectionAnimator(Context appContext, View itemView) {
-        mAppContext = appContext;
-
-        mTile = itemView.findViewById(R.id.tile);
-        mCheckCircle = (ImageView) itemView.findViewById(R.id.check_circle);
-        mLoadingIndicatorContainer = itemView.findViewById(R.id.loading_indicator_container);
-        mHoverHandler = new Handler();
-
-        mTile.setOnHoverListener(new OnHoverListener() {
-            @Override
-            public boolean onHover(View v, MotionEvent event) {
-                // If this ViewHolder is already selected, then don't change the state of the check circle.
-                if (mIsSelected) {
-                    return false;
-                }
-
-                int actionMasked = event.getActionMasked();
-
-                switch (actionMasked) {
-                    case MotionEvent.ACTION_HOVER_ENTER:
-                        animateHoverEnter();
-                        break;
-                    case MotionEvent.ACTION_HOVER_EXIT:
-                        animateHoverExit();
-                        break;
-                    default:
-                        // fall out
-                }
-
-                return false;
-            }
-        });
-    }
-
-    @Override
-    public void selectImmediately() {
-        mIsSelected = true;
-        int insetPx = mAppContext.getResources().getDimensionPixelSize(
-                R.dimen.grid_item_individual_wallpaper_selected_inset);
-        mTile.setPadding(insetPx, insetPx, insetPx, insetPx);
-        mCheckCircle.setImageDrawable(
-                mAppContext.getDrawable(R.drawable.check_circle_accent_24dp));
-        mCheckCircle.setVisibility(View.VISIBLE);
-        mCheckCircle.setAlpha(1f);
-        mLoadingIndicatorContainer.setVisibility(View.GONE);
-    }
-
-    @Override
-    public void deselectImmediately() {
-        mIsSelected = false;
-        mCheckCircle.setAlpha(0f);
-        mCheckCircle.setVisibility(View.GONE);
-        mTile.setPadding(0, 0, 0, 0);
-        mLoadingIndicatorContainer.setVisibility(View.GONE);
-    }
-
-    @Override
-    public void animateSelected() {
-        // If already selected, do nothing.
-        if (mIsSelected) {
-            return;
-        }
-
-        mLoadingIndicatorContainer.setVisibility(View.GONE);
-
-        int[][] values = new int[2][4];
-        values[0] = new int[]{0, 0, 0, 0};
-        int insetPx = mAppContext.getResources().getDimensionPixelSize(
-                R.dimen.grid_item_individual_wallpaper_selected_inset);
-        values[1] = new int[]{insetPx, insetPx, insetPx, insetPx};
-
-        ObjectAnimator paddingAnimator = ObjectAnimator.ofMultiInt(mTile, "padding", values);
-        ObjectAnimator checkCircleAlphaAnimator = ObjectAnimator.ofFloat(mCheckCircle, "alpha", 0f, 1f);
-
-        mCheckCircle.setImageDrawable(
-                mAppContext.getDrawable(R.drawable.check_circle_accent_24dp));
-
-        AnimatorSet animatorSet = new AnimatorSet();
-        animatorSet.playTogether(paddingAnimator, checkCircleAlphaAnimator);
-        animatorSet.setDuration(200);
-        animatorSet.start();
-
-        mCheckCircle.setVisibility(View.VISIBLE);
-
-        mIsSelected = true;
-    }
-
-    @Override
-    public void animateDeselected() {
-        mLoadingIndicatorContainer.setVisibility(View.GONE);
-
-        // If already deselected, do nothing.
-        if (!mIsSelected) {
-            return;
-        }
-
-        int[][] values = new int[2][4];
-        int insetPx = mAppContext.getResources().getDimensionPixelSize(
-                R.dimen.grid_item_individual_wallpaper_selected_inset);
-        values[0] = new int[]{insetPx, insetPx, insetPx, insetPx};
-        values[1] = new int[]{0, 0, 0, 0};
-
-        ObjectAnimator paddingAnimator = ObjectAnimator.ofMultiInt(mTile, "padding", values);
-        ObjectAnimator checkCircleAlphaAnimator = ObjectAnimator.ofFloat(mCheckCircle, "alpha", 1f, 0f);
-
-        AnimatorSet animatorSet = new AnimatorSet();
-        animatorSet.playTogether(paddingAnimator, checkCircleAlphaAnimator);
-        animatorSet.setDuration(200);
-        animatorSet.start();
-
-        checkCircleAlphaAnimator.addListener(new AnimatorListener() {
-            @Override
-            public void onAnimationStart(Animator animation) {
-            }
-
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                mCheckCircle.setVisibility(View.GONE);
-            }
-
-            @Override
-            public void onAnimationCancel(Animator animation) {
-            }
-
-            @Override
-            public void onAnimationRepeat(Animator animation) {
-            }
-        });
-
-        mIsSelected = false;
-    }
-
-    @Override
-    public void showLoading() {
-        mLoadingIndicatorContainer.setVisibility(View.VISIBLE);
-    }
-
-    @Override
-    public void showNotLoading() {
-        mLoadingIndicatorContainer.setVisibility(View.GONE);
-    }
-
-    private void animateHoverEnter() {
-        removeHoverHandlerCallbacks();
-
-        if (mIsHovered) {
-            return;
-        }
-
-        mHoverHandler.postDelayed(mHoverEnterRunnable, HOVER_TIMEOUT_MS);
-    }
-
-    private void animateHoverExit() {
-        removeHoverHandlerCallbacks();
-
-        if (!mIsHovered) {
-            return;
-        }
-
-        mHoverHandler.postDelayed(mHoverExitRunnable, HOVER_TIMEOUT_MS);
-    }
-
-    @Override
-    public boolean isSelected() {
-        return mIsSelected;
-    }
-
-    private void removeHoverHandlerCallbacks() {
-        mHoverHandler.removeCallbacks(mHoverEnterRunnable);
-        mHoverHandler.removeCallbacks(mHoverExitRunnable);
-    }
-}
diff --git a/src/com/android/wallpaper/picker/individual/CustomShapeImageView.java b/src/com/android/wallpaper/picker/individual/CustomShapeImageView.java
new file mode 100644
index 0000000..3b190b6
--- /dev/null
+++ b/src/com/android/wallpaper/picker/individual/CustomShapeImageView.java
@@ -0,0 +1,99 @@
+/*
+ * 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.individual;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Path;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+import androidx.core.graphics.PathParser;
+
+import com.android.wallpaper.R;
+
+/**
+ * A view where the image can be optionally clipped to have a custom border, by default circular.
+ */
+public class CustomShapeImageView extends ImageView {
+    private boolean mClipped;
+
+    private boolean mPathSet;
+    private Path mPath;
+
+    public CustomShapeImageView(Context context) {
+        super(context);
+    }
+
+    public CustomShapeImageView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public CustomShapeImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    /**
+     * Returns whether the image is clipped with a circular border.
+     */
+    public boolean getClipped() {
+        return mClipped;
+    }
+
+    /**
+     * Modifies how the image is clipped. When called with true, the image
+     * is clipped with a circular border; with false, the default border.
+     *
+     * @param clippedValue Whether the image is clipped with a circular
+     *                     border.
+     */
+    public void setClipped(boolean clippedValue) {
+        mClipped = clippedValue;
+        invalidate();
+        requestLayout();
+    }
+
+    /**
+     * Sets the border of the thumbnail.
+     *
+     * @param clippingPathResource The resource ID of the path string of the desired
+     *                             border.
+     */
+    public void setClippingPath(int clippingPathResource) {
+        String string = getResources().getString(clippingPathResource);
+        mPath = PathParser.createPathFromPathData(string);
+        mPathSet = true;
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        if (mClipped) {
+            if (!mPathSet) {
+                setClippingPath(R.string.circular_border);
+            }
+            float scale = (float) (getHeight() / 100.0);
+            Matrix matrix = new Matrix();
+            matrix.postScale(scale, scale);
+            Path scaledPath = new Path(mPath);
+            scaledPath.transform(matrix);
+            canvas.clipPath(scaledPath);
+        }
+
+        super.onDraw(canvas);
+    }
+}
+
diff --git a/src/com/android/wallpaper/picker/individual/DesktopRotationHolder.java b/src/com/android/wallpaper/picker/individual/DesktopRotationHolder.java
index d2ab519..8cddcfd 100755
--- a/src/com/android/wallpaper/picker/individual/DesktopRotationHolder.java
+++ b/src/com/android/wallpaper/picker/individual/DesktopRotationHolder.java
@@ -19,6 +19,8 @@
 import android.view.View;
 import android.widget.ImageView;
 
+import androidx.recyclerview.widget.RecyclerView.ViewHolder;
+
 import com.android.wallpaper.R;
 import com.android.wallpaper.asset.Asset;
 import com.android.wallpaper.asset.Asset.DrawableLoadedListener;
@@ -26,8 +28,7 @@
 import com.android.wallpaper.module.InjectorProvider;
 import com.android.wallpaper.module.WallpaperPreferences;
 import com.android.wallpaper.picker.RotationStarter;
-
-import androidx.recyclerview.widget.RecyclerView.ViewHolder;
+import com.android.wallpaper.util.ResourceUtils;
 
 /**
  * IndividualHolder subclass for a wallpaper tile in the RecyclerView for which a click should
@@ -107,7 +108,8 @@
      */
     public void updateThumbnail(
             Asset newThumbnailAsset, DrawableLoadedListener drawableLoadedListener) {
-        int placeholderColor = mActivity.getResources().getColor(R.color.secondary_color);
+        int placeholderColor =
+                ResourceUtils.getColorAttr(mActivity, android.R.attr.colorSecondary);
 
         // Load the first image more quickly than subsequent ones in the rotation.
         int crossfadeDuration =
diff --git a/src/com/android/wallpaper/picker/individual/IndividualHolder.java b/src/com/android/wallpaper/picker/individual/IndividualHolder.java
index 294efa8..c780db1 100755
--- a/src/com/android/wallpaper/picker/individual/IndividualHolder.java
+++ b/src/com/android/wallpaper/picker/individual/IndividualHolder.java
@@ -25,6 +25,7 @@
 
 import com.android.wallpaper.R;
 import com.android.wallpaper.model.WallpaperInfo;
+import com.android.wallpaper.util.ResourceUtils;
 
 import java.util.List;
 
@@ -78,7 +79,7 @@
         } else {
             wallpaper.getThumbAsset(
                     mActivity.getApplicationContext()).loadDrawable(mActivity, mThumbnailView,
-                    mActivity.getResources().getColor(R.color.secondary_color));
+                    ResourceUtils.getColorAttr(mActivity, android.R.attr.colorSecondary));
         }
     }
 }
diff --git a/src/com/android/wallpaper/picker/individual/IndividualPickerActivity.java b/src/com/android/wallpaper/picker/individual/IndividualPickerActivity.java
index 1a2cae9..9923066 100755
--- a/src/com/android/wallpaper/picker/individual/IndividualPickerActivity.java
+++ b/src/com/android/wallpaper/picker/individual/IndividualPickerActivity.java
@@ -46,6 +46,7 @@
 import com.android.wallpaper.picker.BaseActivity;
 import com.android.wallpaper.picker.PreviewActivity.PreviewActivityIntentFactory;
 import com.android.wallpaper.util.DiskBasedLogger;
+import com.android.wallpaper.util.ResourceUtils;
 import com.android.wallpaper.widget.BottomActionBar;
 import com.android.wallpaper.widget.BottomActionBar.BottomActionBarHost;
 
@@ -53,7 +54,8 @@
  * Activity that can be launched from the Android wallpaper picker and allows users to pick from
  * various wallpapers and enter a preview mode for specific ones.
  */
-public class IndividualPickerActivity extends BaseActivity implements BottomActionBarHost {
+public class IndividualPickerActivity extends BaseActivity implements BottomActionBarHost,
+        IndividualPickerFragment.IndividualPickerFragmentHost {
     private static final String TAG = "IndividualPickerAct";
     private static final String EXTRA_CATEGORY_COLLECTION_ID =
             "com.android.wallpaper.category_collection_id";
@@ -142,7 +144,9 @@
 
         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 
-        toolbar.getNavigationIcon().setTint(getColor(R.color.toolbar_icon_color));
+        toolbar.getNavigationIcon().setTint(
+                ResourceUtils.getColorAttr(this, android.R.attr.textColorPrimary)
+        );
         toolbar.getNavigationIcon().setAutoMirrored(true);
 
         if (fragment == null) {
@@ -229,6 +233,32 @@
         return findViewById(R.id.bottom_actionbar);
     }
 
+    @Override
+    public boolean isHostToolbarShown() {
+        return true;
+    }
+
+    @Override
+    public void setToolbarTitle(CharSequence title) {
+        setTitle(title);
+        getSupportActionBar().setTitle(title);
+    }
+
+    @Override
+    public void setToolbarMenu(int menuResId) {
+
+    }
+
+    @Override
+    public void removeToolbarMenu() {
+
+    }
+
+    @Override
+    public void moveToPreviousFragment() {
+        getSupportFragmentManager().popBackStack();
+    }
+
     /**
      * Default implementation of intent factory that provides an intent to start an
      * IndividualPickerActivity.
diff --git a/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java b/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java
index 0925f39..bb7a1d0 100755
--- a/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java
+++ b/src/com/android/wallpaper/picker/individual/IndividualPickerFragment.java
@@ -15,12 +15,7 @@
  */
 package com.android.wallpaper.picker.individual;
 
-import static com.android.wallpaper.picker.WallpaperPickerDelegate.PREVIEW_WALLPAPER_REQUEST_CODE;
-import static com.android.wallpaper.widget.BottomActionBar.BottomAction.APPLY;
-import static com.android.wallpaper.widget.BottomActionBar.BottomAction.EDIT;
-import static com.android.wallpaper.widget.BottomActionBar.BottomAction.INFORMATION;
-import static com.android.wallpaper.widget.BottomActionBar.BottomAction.ROTATION;
-
+import android.annotation.MenuRes;
 import android.app.Activity;
 import android.app.ProgressDialog;
 import android.app.WallpaperManager;
@@ -36,16 +31,24 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.service.wallpaper.WallpaperService;
+import android.text.TextUtils;
+import android.util.ArraySet;
 import android.util.Log;
 import android.view.LayoutInflater;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
 import android.widget.Toast;
 
+import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.cardview.widget.CardView;
 import androidx.core.widget.ContentLoadingProgressBar;
 import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
 import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.recyclerview.widget.RecyclerView.OnScrollListener;
@@ -75,12 +78,11 @@
 import com.android.wallpaper.module.WallpaperPersister.Destination;
 import com.android.wallpaper.module.WallpaperPreferences;
 import com.android.wallpaper.module.WallpaperSetter;
+import com.android.wallpaper.picker.AppbarFragment;
 import com.android.wallpaper.picker.BaseActivity;
-import com.android.wallpaper.picker.BottomActionBarFragment;
 import com.android.wallpaper.picker.CurrentWallpaperBottomSheetPresenter;
 import com.android.wallpaper.picker.FragmentTransactionChecker;
 import com.android.wallpaper.picker.MyPhotosStarter.MyPhotosStarterProvider;
-import com.android.wallpaper.picker.PreviewActivity;
 import com.android.wallpaper.picker.RotationStarter;
 import com.android.wallpaper.picker.SetWallpaperDialogFragment;
 import com.android.wallpaper.picker.SetWallpaperErrorDialogFragment;
@@ -91,7 +93,6 @@
 import com.android.wallpaper.picker.individual.SetIndividualHolder.OnSetListener;
 import com.android.wallpaper.util.DiskBasedLogger;
 import com.android.wallpaper.util.SizeCalculator;
-import com.android.wallpaper.widget.BottomActionBar;
 import com.android.wallpaper.widget.WallpaperInfoView;
 import com.android.wallpaper.widget.WallpaperPickerRecyclerViewAccessibilityDelegate;
 import com.android.wallpaper.widget.WallpaperPickerRecyclerViewAccessibilityDelegate.BottomSheetHost;
@@ -104,11 +105,12 @@
 import java.util.List;
 import java.util.Optional;
 import java.util.Random;
+import java.util.Set;
 
 /**
  * Displays the Main UI for picking an individual wallpaper image.
  */
-public class IndividualPickerFragment extends BottomActionBarFragment
+public class IndividualPickerFragment extends AppbarFragment
         implements RotationStarter, StartRotationErrorDialogFragment.Listener,
         CurrentWallpaperBottomSheetPresenter.RefreshListener,
         SetWallpaperErrorDialogFragment.Listener, SetWallpaperDialogFragment.Listener,
@@ -121,6 +123,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";
@@ -172,15 +176,34 @@
     }
 
     /**
-     * Interface to be implemented by a Fragment hosting a {@link IndividualPickerFragment}
+     * Interface to be implemented by a Fragment(or an Activity) hosting
+     * a {@link IndividualPickerFragment}.
      */
     public interface IndividualPickerFragmentHost {
         /**
-         * Sets the title in the toolbar.
+         * Indicates if the host has toolbar to show the title. If it does, we should set the title
+         * there.
+         */
+        boolean isHostToolbarShown();
+
+        /**
+         * Sets the title in the host's toolbar.
          */
         void setToolbarTitle(CharSequence title);
 
         /**
+         * Configures the menu in the toolbar.
+         *
+         * @param menuResId the resource id of the menu
+         */
+        void setToolbarMenu(@MenuRes int menuResId);
+
+        /**
+         * Removes the menu in the toolbar.
+         */
+        void removeToolbarMenu();
+
+        /**
          * Moves to the previous fragment.
          */
         void moveToPreviousFragment();
@@ -227,7 +250,6 @@
         }
     };
     PackageStatusNotifier.Listener mAppStatusListener;
-    BottomActionBar mBottomActionBar;
     WallpaperInfoView mWallpaperInfoView;
     @Nullable WallpaperInfo mSelectedWallpaperInfo;
 
@@ -237,6 +259,7 @@
     private CurrentWallpaperBottomSheetPresenter mCurrentWallpaperBottomSheetPresenter;
     private SetIndividualHolder mPendingSetIndividualHolder;
     private ContentLoadingProgressBar mLoading;
+    private CategoryProvider mCategoryProvider;
 
     /**
      * Staged error dialog fragments that were unable to be shown when the activity didn't allow
@@ -280,6 +303,7 @@
     private WallpaperManager mWallpaperManager;
     private int mWallpaperDestination;
     private WallpaperSelectedListener mWallpaperSelectedListener;
+    private Set<String> mAppliedWallpaperIds;
 
     public static IndividualPickerFragment newInstance(String collectionId) {
         Bundle args = new Bundle();
@@ -360,8 +384,8 @@
             Glide.get(getContext()).clearMemory();
         }
 
-        CategoryProvider categoryProvider = injector.getCategoryProvider(appContext);
-        categoryProvider.fetchCategories(new CategoryReceiver() {
+        mCategoryProvider = injector.getCategoryProvider(appContext);
+        mCategoryProvider.fetchCategories(new CategoryReceiver() {
             @Override
             public void onCategoryReceived(Category category) {
                 // Do nothing.
@@ -369,7 +393,7 @@
 
             @Override
             public void doneFetchingCategories() {
-                Category category = categoryProvider.getCategory(
+                Category category = mCategoryProvider.getCategory(
                         getArguments().getString(ARG_CATEGORY_COLLECTION_ID));
                 if (category != null && !(category instanceof WallpaperCategory)) {
                     return;
@@ -395,13 +419,14 @@
         if (getIndividualPickerFragmentHost() == null) {
             return;
         }
-        getIndividualPickerFragmentHost().setToolbarTitle(mCategory.getTitle());
+        if (getIndividualPickerFragmentHost().isHostToolbarShown()) {
+            getIndividualPickerFragmentHost().setToolbarTitle(mCategory.getTitle());
+        } else {
+            setTitle(mCategory.getTitle());
+        }
         mWallpaperRotationInitializer = mCategory.getWallpaperRotationInitializer();
-        // Avoids the "rotation" action is not shown correctly
-        // in a rare case : onCategoryLoaded() is called after onBottomActionBarReady().
-        if (isRotationEnabled() && mBottomActionBar != null
-                && !mBottomActionBar.areActionsShown(ROTATION)) {
-            mBottomActionBar.showActions(ROTATION);
+        if (mToolbar != null && isRotationEnabled()) {
+            setUpToolbarMenu(R.menu.individual_picker_menu);
         }
         fetchWallpapers(false);
 
@@ -415,8 +440,6 @@
             mPackageStatusNotifier.addListener(mAppStatusListener,
                     WallpaperService.SERVICE_INTERFACE);
         }
-
-        maybeSetUpImageGrid();
     }
 
     void fetchWallpapers(boolean forceReload) {
@@ -431,6 +454,7 @@
                 for (WallpaperInfo wallpaper : wallpapers) {
                     mWallpapers.add(wallpaper);
                 }
+                maybeSetUpImageGrid();
 
                 // Wallpapers may load after the adapter is initialized, in which case we have
                 // to explicitly notify that the data set has changed.
@@ -478,8 +502,23 @@
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                              Bundle savedInstanceState) {
         View view = inflater.inflate(R.layout.fragment_individual_picker, container, false);
+        if (getIndividualPickerFragmentHost().isHostToolbarShown()) {
+            view.findViewById(R.id.header_bar).setVisibility(View.GONE);
+            setUpArrowEnabled(/* upArrow= */ true);
+            if (isRotationEnabled()) {
+                getIndividualPickerFragmentHost().setToolbarMenu(R.menu.individual_picker_menu);
+            }
+        } else {
+            setUpToolbar(view);
+            if (isRotationEnabled()) {
+                setUpToolbarMenu(R.menu.individual_picker_menu);
+            }
+            if (mCategory != null) {
+                setTitle(mCategory.getTitle());
+            }
+        }
 
-        mTileSizePx = SizeCalculator.getIndividualTileSize(getActivity());
+        mAppliedWallpaperIds = getAppliedWallpaperIds();
 
         mImageGrid = (RecyclerView) view.findViewById(R.id.wallpaper_grid);
         if (mFormFactor == FormFactorChecker.FORM_FACTOR_DESKTOP) {
@@ -487,15 +526,27 @@
             updateImageGridPadding(false /* addExtraBottomSpace */);
             mImageGrid.setScrollBarSize(gridPaddingPx);
         }
-        mImageGrid.addItemDecoration(new GridPaddingDecoration(
-                getResources().getDimensionPixelSize(R.dimen.grid_padding)));
-        mImageGrid.setAccessibilityDelegateCompat(
-                new WallpaperPickerRecyclerViewAccessibilityDelegate(
-                        mImageGrid, (BottomSheetHost) getParentFragment(), getNumColumns()));
         mLoading = view.findViewById(R.id.loading_indicator);
         updateLoading();
         maybeSetUpImageGrid();
         setUpBottomSheet();
+        // For nav bar edge-to-edge effect.
+        view.setOnApplyWindowInsetsListener((v, windowInsets) -> {
+            // For status bar height.
+            v.setPadding(
+                    v.getPaddingLeft(),
+                    windowInsets.getSystemWindowInsetTop(),
+                    v.getPaddingRight(),
+                    v.getPaddingBottom());
+
+            View gridView = v.findViewById(R.id.wallpaper_grid);
+            gridView.setPadding(
+                    gridView.getPaddingLeft(),
+                    gridView.getPaddingTop(),
+                    gridView.getPaddingRight(),
+                    windowInsets.getSystemWindowInsetBottom());
+            return windowInsets.consumeSystemWindowInsets();
+        });
         return view;
     }
 
@@ -517,10 +568,15 @@
     }
 
     private IndividualPickerFragmentHost getIndividualPickerFragmentHost() {
-        return (IndividualPickerFragmentHost) getParentFragment();
+        Fragment parentFragment = getParentFragment();
+        if (parentFragment != null) {
+            return (IndividualPickerFragmentHost) parentFragment;
+        } else {
+            return (IndividualPickerFragmentHost) getActivity();
+        }
     }
 
-    private void maybeSetUpImageGrid() {
+    protected void maybeSetUpImageGrid() {
         // Skip if mImageGrid been initialized yet
         if (mImageGrid == null) {
             return;
@@ -529,11 +585,63 @@
         if (mCategory == null) {
             return;
         }
-        // Skip if the adapter was already created
-        if (mAdapter != null) {
+        if (getContext() == null) {
             return;
         }
+
+        // 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();
+        mImageGrid.setPadding(edgePadding, mImageGrid.getPaddingTop(), edgePadding,
+                mImageGrid.getPaddingBottom());
+        mTileSizePx = isFewerColumnLayout()
+                ? SizeCalculator.getFeaturedIndividualTileSize(getActivity())
+                : SizeCalculator.getIndividualTileSize(getActivity());
         setUpImageGrid();
+        mImageGrid.setAccessibilityDelegateCompat(
+                new WallpaperPickerRecyclerViewAccessibilityDelegate(
+                        mImageGrid, (BottomSheetHost) getParentFragment(), getNumColumns()));
+    }
+
+    boolean isFewerColumnLayout() {
+        return mWallpapers != null && mWallpapers.size() <= MAX_CAPACITY_IN_FEWER_COLUMN_LAYOUT;
+    }
+
+    private int getGridItemPaddingHorizontal() {
+        return isFewerColumnLayout()
+                ? getResources().getDimensionPixelSize(
+                R.dimen.grid_item_featured_individual_padding_horizontal)
+                : getResources().getDimensionPixelSize(
+                        R.dimen.grid_item_individual_padding_horizontal);
+    }
+
+    private int getGridItemPaddingBottom() {
+        return isFewerColumnLayout()
+                ? getResources().getDimensionPixelSize(
+                R.dimen.grid_item_featured_individual_padding_bottom)
+                : getResources().getDimensionPixelSize(R.dimen.grid_item_individual_padding_bottom);
+    }
+
+    private int getEdgePadding() {
+        return isFewerColumnLayout()
+                ? getResources().getDimensionPixelSize(R.dimen.featured_wallpaper_grid_edge_space)
+                : getResources().getDimensionPixelSize(R.dimen.wallpaper_grid_edge_space);
     }
 
     /**
@@ -576,36 +684,6 @@
     }
 
     @Override
-    protected void onBottomActionBarReady(BottomActionBar bottomActionBar) {
-        mBottomActionBar = bottomActionBar;
-        if (isRotationEnabled()) {
-            mBottomActionBar.showActionsOnly(ROTATION);
-        }
-        mBottomActionBar.setActionClickListener(ROTATION, unused -> {
-            DialogFragment startRotationDialogFragment = new StartRotationDialogFragment();
-            startRotationDialogFragment.setTargetFragment(
-                    IndividualPickerFragment.this, UNUSED_REQUEST_CODE);
-            startRotationDialogFragment.show(getFragmentManager(), TAG_START_ROTATION_DIALOG);
-        });
-        mBottomActionBar.setActionClickListener(APPLY, unused -> {
-            mBottomActionBar.disableActions();
-            mWallpaperSetter.requestDestination(getActivity(), getFragmentManager(), this,
-                    mSelectedWallpaperInfo instanceof LiveWallpaperInfo);
-        });
-
-        mWallpaperInfoView = (WallpaperInfoView) LayoutInflater.from(getContext())
-                .inflate(R.layout.wallpaper_info_view, /* root= */ null);
-        mBottomActionBar.attachViewToBottomSheetAndBindAction(mWallpaperInfoView, INFORMATION);
-        mBottomActionBar.setActionClickListener(EDIT, unused -> {
-            mWallpaperPersister.setWallpaperInfoInPreview(mSelectedWallpaperInfo);
-            mSelectedWallpaperInfo.showPreview(getActivity(),
-                    new PreviewActivity.PreviewActivityIntentFactory(),
-                    PREVIEW_WALLPAPER_REQUEST_CODE);
-        });
-        mBottomActionBar.show();
-    }
-
-    @Override
     public void onResume() {
         super.onResume();
 
@@ -649,6 +727,12 @@
     }
 
     @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        getIndividualPickerFragmentHost().removeToolbarMenu();
+    }
+
+    @Override
     public void onDestroy() {
         super.onDestroy();
         if (mProgressDialog != null) {
@@ -667,9 +751,6 @@
         // This is to handle config change with StartRotationDialog popup,  the StartRotationDialog
         // still holds a reference to the destroyed Fragment and is calling
         // onStartRotationDialogDismissed on that destroyed Fragment.
-        if (mBottomActionBar != null) {
-            mBottomActionBar.deselectAction(ROTATION);
-        }
     }
 
     @Override
@@ -677,15 +758,6 @@
         startRotation(networkPreference);
     }
 
-    @Override
-    public boolean onBackPressed() {
-        if (mSelectedWallpaperInfo != null) {
-            onWallpaperSelected(null, 0);
-            return true;
-        }
-        return false;
-    }
-
     public void setCurrentWallpaperBottomSheetPresenter(
             CurrentWallpaperBottomSheetPresenter presenter) {
         mCurrentWallpaperBottomSheetPresenter = presenter;
@@ -842,7 +914,12 @@
 
     int getNumColumns() {
         Activity activity = getActivity();
-        return activity == null ? 1 : SizeCalculator.getNumIndividualColumns(activity);
+        if (activity == null) {
+            return 1;
+        }
+        return isFewerColumnLayout()
+                ? SizeCalculator.getNumFeaturedIndividualColumns(activity)
+                : SizeCalculator.getNumIndividualColumns(activity);
     }
 
     /**
@@ -889,15 +966,26 @@
                 @Override
                 public void onError(@Nullable Throwable throwable) {
                     Log.e(TAG, "Can't apply the wallpaper.");
-                    mBottomActionBar.enableActions();
                 }
             };
 
     @Override
-    public void onDialogDismissed(boolean withItemSelected) {
-        if (!withItemSelected) {
-            mBottomActionBar.enableActions();
+    public boolean onMenuItemClick(MenuItem item) {
+        if (item.getItemId() == R.id.daily_rotation) {
+            showRotationDialog();
+            return true;
         }
+        return super.onMenuItemClick(item);
+    }
+
+    /**
+     * Popups a daily rotation dialog for the uses to confirm.
+     */
+    public void showRotationDialog() {
+        DialogFragment startRotationDialogFragment = new StartRotationDialogFragment();
+        startRotationDialogFragment.setTargetFragment(
+                IndividualPickerFragment.this, UNUSED_REQUEST_CODE);
+        startRotationDialogFragment.show(getFragmentManager(), TAG_START_ROTATION_DIALOG);
     }
 
     /**
@@ -915,14 +1003,6 @@
         }
     }
 
-    void updateBottomActions(boolean hasWallpaperSelected) {
-        if (hasWallpaperSelected) {
-            mBottomActionBar.showActionsOnly(INFORMATION, EDIT, APPLY);
-        } else {
-            mBottomActionBar.showActionsOnly(ROTATION);
-        }
-    }
-
     private void updateThumbnail(WallpaperInfo selectedWallpaperInfo) {
         ThumbnailUpdater thumbnailUpdater = (ThumbnailUpdater) getParentFragment();
         if (thumbnailUpdater == null) {
@@ -959,7 +1039,6 @@
                 ? mAppliedWallpaperInfo : newSelectedWallpaperInfo, true);
 
         mSelectedWallpaperInfo = newSelectedWallpaperInfo;
-        updateBottomActions(mSelectedWallpaperInfo != null);
         updateThumbnail(mSelectedWallpaperInfo);
         // Populate wallpaper info into view.
         if (mSelectedWallpaperInfo != null && mWallpaperInfoView != null) {
@@ -968,8 +1047,12 @@
                     mSelectedWallpaperInfo,
                     (actionLabel, exploreIntent) ->
                             mWallpaperInfoView.populateWallpaperInfo(
-                                    mSelectedWallpaperInfo, actionLabel, exploreIntent,
-                                    v -> onExploreClicked(exploreIntent)));
+                                    mSelectedWallpaperInfo,
+                                    actionLabel,
+                                    WallpaperInfoHelper.shouldShowExploreButton(
+                                            getContext(), exploreIntent),
+                                    v -> onExploreClicked(exploreIntent))
+            );
         }
 
         if (mWallpaperSelectedListener != null) {
@@ -988,6 +1071,7 @@
         startActivity(exploreIntent);
     }
 
+    // TODO: Dead code. Should remove this method in the future.
     private void updateActivatedStatus(WallpaperInfo wallpaperInfo, boolean isActivated) {
         if (wallpaperInfo == null) {
             return;
@@ -1004,6 +1088,7 @@
         }
     }
 
+    // TODO: Dead code. Should remove this method in the future.
     private void updateAppliedStatus(WallpaperInfo wallpaperInfo, boolean isApplied) {
         if (wallpaperInfo == null) {
             return;
@@ -1013,8 +1098,7 @@
                 ? index + 1 : index;
         ViewHolder holder = mImageGrid.findViewHolderForAdapterPosition(index);
         if (holder != null) {
-            holder.itemView.findViewById(R.id.check_circle)
-                    .setVisibility(isApplied ? View.VISIBLE : View.GONE);
+            mAdapter.showBadge(holder, R.drawable.wallpaper_check_circle_24dp, isApplied);
         } else {
             // Item is not visible, make sure the item is re-bound when it becomes visible.
             mAdapter.notifyItemChanged(index);
@@ -1053,6 +1137,28 @@
         }
     }
 
+    private Set<String> getAppliedWallpaperIds() {
+        WallpaperPreferences prefs =
+                InjectorProvider.getInjector().getPreferences(getContext());
+        android.app.WallpaperInfo wallpaperInfo = mWallpaperManager.getWallpaperInfo();
+        Set<String> appliedWallpaperIds = new ArraySet<>();
+
+        String homeWallpaperId = wallpaperInfo != null ? wallpaperInfo.getServiceName()
+                : prefs.getHomeWallpaperRemoteId();
+        if (!TextUtils.isEmpty(homeWallpaperId)) {
+            appliedWallpaperIds.add(homeWallpaperId);
+        }
+
+        boolean isLockWallpaperApplied =
+                mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_LOCK) >= 0;
+        String lockWallpaperId = prefs.getLockWallpaperRemoteId();
+        if (isLockWallpaperApplied && !TextUtils.isEmpty(lockWallpaperId)) {
+            appliedWallpaperIds.add(lockWallpaperId);
+        }
+
+        return appliedWallpaperIds;
+    }
+
     private void showCheckMarkAndBorderForAppliedWallpaper(boolean show) {
         updateAppliedStatus(mAppliedWallpaperInfo, show);
         if (mSelectedWallpaperInfo == null) {
@@ -1060,10 +1166,49 @@
         }
     }
 
-    private boolean shouldShowRotationTile() {
+    boolean shouldShowRotationTile() {
         return mFormFactor == FormFactorChecker.FORM_FACTOR_DESKTOP && isRotationEnabled();
     }
 
+    class EmptySelectionAnimator implements SelectionAnimator{
+        EmptySelectionAnimator() {}
+
+        public boolean isSelected() {
+            return false;
+        }
+
+        /**
+         * Sets the UI to selected immediately with no animation.
+         */
+        public void selectImmediately() {}
+
+        /**
+         * Sets the UI to deselected immediately with no animation.
+         */
+        public void deselectImmediately() {}
+
+        /**
+         * Sets the UI to selected with a smooth animation.
+         */
+        public void animateSelected() {}
+
+        /**
+         * Sets the UI to deselected with a smooth animation.
+         */
+        public void animateDeselected() {}
+
+        /**
+         * Sets the UI to show a loading indicator.
+         */
+        public void showLoading() {}
+
+        /**
+         * Sets the UI to hide the loading indicator.
+         */
+        public void showNotLoading() {}
+
+    }
+
     /**
      * RecyclerView Adapter subclass for the wallpaper tiles in the RecyclerView.
      */
@@ -1143,8 +1288,7 @@
         private ViewHolder createRotationHolder(ViewGroup parent) {
             LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
             View view = layoutInflater.inflate(R.layout.grid_item_rotation_desktop, parent, false);
-            SelectionAnimator selectionAnimator =
-                    new CheckmarkSelectionAnimator(getActivity(), view);
+            SelectionAnimator selectionAnimator = new EmptySelectionAnimator();
             return new DesktopRotationHolder(getActivity(), mTileSizePx.y, view, selectionAnimator,
                     IndividualPickerFragment.this);
         }
@@ -1154,8 +1298,7 @@
             View view = layoutInflater.inflate(R.layout.grid_item_image, parent, false);
 
             if (mFormFactor == FormFactorChecker.FORM_FACTOR_DESKTOP) {
-                SelectionAnimator selectionAnimator =
-                        new CheckmarkSelectionAnimator(getActivity(), view);
+                SelectionAnimator selectionAnimator = new EmptySelectionAnimator();
                 return new SetIndividualHolder(
                         getActivity(), mTileSizePx.y, view,
                         selectionAnimator,
@@ -1297,30 +1440,53 @@
             int wallpaperIndex = (shouldShowRotationTile() || mCategory.supportsCustomPhotos())
                     ? position - 1 : position;
             WallpaperInfo wallpaper = mWallpapers.get(wallpaperIndex);
+            wallpaper.computePlaceholderColor(holder.itemView.getContext());
             ((IndividualHolder) holder).bindWallpaper(wallpaper);
-            String appliedWallpaperId = getAppliedWallpaperId();
-            boolean isWallpaperApplied = wallpaper.getWallpaperId().equals(appliedWallpaperId);
-            boolean isWallpaperSelected = wallpaper.equals(mSelectedWallpaperInfo);
-            boolean hasUserSelectedWallpaper = mSelectedWallpaperInfo != null;
+            boolean isWallpaperApplied = isWallpaperApplied(wallpaper);
 
             if (isWallpaperApplied) {
                 mSelectedAdapterPosition = position;
                 mAppliedWallpaperInfo = wallpaper;
             }
 
-            holder.itemView.setActivated(
-                    (isWallpaperApplied && !hasUserSelectedWallpaper) || isWallpaperSelected);
-            holder.itemView.findViewById(R.id.check_circle).setVisibility(
-                    isWallpaperApplied ? View.VISIBLE : View.GONE);
+            CardView container = holder.itemView.findViewById(R.id.wallpaper_container);
+            int radiusId = isFewerColumnLayout() ? R.dimen.grid_item_all_radius
+                    : R.dimen.grid_item_all_radius_small;
+            container.setRadius(getResources().getDimension(radiusId));
+            showBadge(holder, R.drawable.wallpaper_check_circle_24dp, isWallpaperApplied);
+        }
+
+        protected boolean isWallpaperApplied(WallpaperInfo wallpaper) {
+            return mAppliedWallpaperIds.contains(wallpaper.getWallpaperId());
+        }
+
+        protected void showBadge(ViewHolder holder, @DrawableRes int icon, boolean show) {
+            ImageView badge = holder.itemView.findViewById(R.id.indicator_icon);
+            if (show) {
+                final float margin = isFewerColumnLayout() ? getResources().getDimension(
+                        R.dimen.grid_item_badge_margin) : getResources().getDimension(
+                        R.dimen.grid_item_badge_margin_small);
+                final RelativeLayout.LayoutParams layoutParams =
+                        (RelativeLayout.LayoutParams) badge.getLayoutParams();
+                layoutParams.setMargins(/* left= */ (int) margin, /* top= */ (int) margin,
+                        /* right= */ (int) margin, /* bottom= */ (int) margin);
+                badge.setLayoutParams(layoutParams);
+                badge.setBackgroundResource(icon);
+                badge.setVisibility(View.VISIBLE);
+            } else {
+                badge.setVisibility(View.GONE);
+            }
         }
     }
 
     private class GridPaddingDecoration extends RecyclerView.ItemDecoration {
 
-        private int mPadding;
+        private final int mPaddingHorizontal;
+        private final int mPaddingBottom;
 
-        GridPaddingDecoration(int padding) {
-            mPadding = padding;
+        GridPaddingDecoration(int paddingHorizontal, int paddingBottom) {
+            mPaddingHorizontal = paddingHorizontal;
+            mPaddingBottom = paddingBottom;
         }
 
         @Override
@@ -1328,8 +1494,9 @@
                                    RecyclerView.State state) {
             int position = parent.getChildAdapterPosition(view);
             if (position >= 0) {
-                outRect.left = mPadding;
-                outRect.right = mPadding;
+                outRect.left = mPaddingHorizontal;
+                outRect.right = mPaddingHorizontal;
+                outRect.bottom = mPaddingBottom;
             }
         }
     }
diff --git a/src/com/android/wallpaper/picker/individual/MyPhotosViewHolder.java b/src/com/android/wallpaper/picker/individual/MyPhotosViewHolder.java
index 6844740..d5c0503 100755
--- a/src/com/android/wallpaper/picker/individual/MyPhotosViewHolder.java
+++ b/src/com/android/wallpaper/picker/individual/MyPhotosViewHolder.java
@@ -33,6 +33,7 @@
 import com.android.wallpaper.asset.Asset;
 import com.android.wallpaper.asset.ContentUriAsset;
 import com.android.wallpaper.picker.MyPhotosStarter;
+import com.android.wallpaper.util.ResourceUtils;
 
 /**
  * ViewHolder for a "my photos" tile presented in an individual category grid.
@@ -150,7 +151,7 @@
                 }
 
                 thumbnail.loadDrawable(mActivity, mThumbnailView,
-                        mActivity.getResources().getColor(R.color.secondary_color));
+                        ResourceUtils.getColorAttr(mActivity, android.R.attr.colorSecondary));
             }
         });
     }
diff --git a/src/com/android/wallpaper/util/ActivityUtils.java b/src/com/android/wallpaper/util/ActivityUtils.java
index cc1912d..1fccd2f 100755
--- a/src/com/android/wallpaper/util/ActivityUtils.java
+++ b/src/com/android/wallpaper/util/ActivityUtils.java
@@ -15,9 +15,16 @@
  */
 package com.android.wallpaper.util;
 
+import static com.android.wallpaper.util.LaunchSourceUtils.LAUNCH_SETTINGS_SEARCH;
+import static com.android.wallpaper.util.LaunchSourceUtils.LAUNCH_SOURCE_SETTINGS;
+import static com.android.wallpaper.util.LaunchSourceUtils.WALLPAPER_LAUNCH_SOURCE;
+
 import android.app.Activity;
 import android.content.ActivityNotFoundException;
+import android.content.Context;
 import android.content.Intent;
+import android.provider.Settings;
+import android.text.TextUtils;
 import android.util.Log;
 import android.widget.Toast;
 
@@ -27,6 +34,8 @@
  * Various utilities pertaining to activities.
  */
 public final class ActivityUtils {
+    private static final int SUW_NOT_YET = 0;
+    private static final int SUW_COMPLETE = 1;
 
     /**
      * Starts an activity with the given intent "safely" - i.e., catches exceptions that may occur
@@ -49,4 +58,53 @@
                     + "or use the exported attribute for this activity.", e);
         }
     }
-}
+
+    /**
+     * Returns true if wallpaper launch source is from Settings related.
+     *
+     * @param intent activity intent.
+     */
+    public static boolean isLaunchedFromSettingsRelated(Intent intent) {
+        return isLaunchedFromSettings(intent) || isLaunchedFromSettingsSearch(intent);
+    }
+
+    /**
+     * Returns true if wallpaper launch source is from Settings.
+     *
+     * @param intent activity intent.
+     */
+    private static boolean isLaunchedFromSettings(Intent intent) {
+        return (intent != null && TextUtils.equals(LAUNCH_SOURCE_SETTINGS,
+                intent.getStringExtra(WALLPAPER_LAUNCH_SOURCE)));
+    }
+
+    /**
+     * Returns true if wallpaper launch source is from Settings Search.
+     *
+     * @param intent activity intent.
+     */
+    public static boolean isLaunchedFromSettingsSearch(Intent intent) {
+        return (intent != null && intent.hasExtra(LAUNCH_SETTINGS_SEARCH));
+    }
+
+    /**
+     * Returns true if wallpaper is in SUW mode.
+     *
+     * @param context activity's context.
+     */
+    public static boolean isSUWMode(Context context) {
+        return (Settings.Secure.getInt(
+                context.getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, SUW_COMPLETE)
+                == SUW_NOT_YET);
+    }
+
+    /**
+     * Returns true if it's wallpaper only mode.
+     *
+     * @param intent activity intent.
+     */
+    public static boolean isWallpaperOnlyMode(Intent intent) {
+        return "wallpaper_only".equals(
+                intent.getStringExtra("com.android.launcher3.WALLPAPER_FLAVOR"));
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/wallpaper/util/FullScreenAnimation.java b/src/com/android/wallpaper/util/FullScreenAnimation.java
new file mode 100644
index 0000000..0a97f72
--- /dev/null
+++ b/src/com/android/wallpaper/util/FullScreenAnimation.java
@@ -0,0 +1,482 @@
+/*
+ * 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.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.content.res.TypedArray;
+import android.graphics.Insets;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.view.Gravity;
+import android.view.SurfaceView;
+import android.view.View;
+import android.view.WindowInsets;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.ImageButton;
+import android.widget.TextView;
+import android.widget.Toolbar;
+
+import androidx.cardview.widget.CardView;
+
+import com.android.wallpaper.R;
+import com.android.wallpaper.picker.TouchForwardingLayout;
+
+import com.google.android.material.appbar.AppBarLayout;
+
+/**
+ * A class storing information about a preview fragment's full-screen layout.
+ *
+ * Used for {@code ImagePreviewFragment} and {@code LivePreviewFragment}.
+ */
+public class FullScreenAnimation {
+
+    private final View mView;
+    private final TouchForwardingLayout mTouchForwardingLayout;
+    private final SurfaceView mWorkspaceSurface;
+    private boolean mIsFullScreen = false;
+
+    private boolean mScaleIsSet = false;
+    private boolean mWorkspaceVisibility = true;
+    private float mOffsetY;
+    private float mScale;
+    private float mDefaultRadius;
+    private int mWorkspaceWidth;
+    private int mWorkspaceHeight;
+    private float mBottomActionBarTranslation;
+    private float mFullScreenButtonsTranslation;
+    private int mStatusBarHeight;
+    private int mNavigationBarHeight;
+    private FullScreenStatusListener mFullScreenStatusListener;
+
+    private static final float HIDE_ICONS_TOP_RATIO = 0.2f;
+
+    private boolean mIsHomeSelected = true;
+
+    /**
+     * Options for the full-screen text color.
+     *
+     * {@code DEFAULT} represents the default text color.
+     * {@code DARK} represents a text color that is dark, and should be used when the wallpaper
+     *              supports dark text.
+     * {@code LIGHT} represents a text color that is light, and should be used when the wallpaper
+     *               does not support dark text.
+     */
+    public enum FullScreenTextColor {
+        DEFAULT,
+        DARK,
+        LIGHT
+    }
+
+    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.
+     *
+     * @param view The view containing all relevant UI elements. Equal to {@code mRootView}.
+     */
+    public FullScreenAnimation(View view) {
+        mView = view;
+        mTouchForwardingLayout = view.findViewById(R.id.touch_forwarding_layout);
+        mWorkspaceSurface = view.findViewById(R.id.workspace_surface);
+        mCurrentTextColor = ResourceUtils.getColorAttr(
+                view.getContext(),
+                android.R.attr.textColorPrimary);
+    }
+
+    /**
+     * Returns if the preview layout is currently in full screen.
+     *
+     * @return whether the preview layout is currently in full screen.
+     */
+    public boolean isFullScreen() {
+        return mIsFullScreen;
+    }
+
+    /**
+     * Informs this object whether the home tab is selected.
+     *
+     * Used to determine the visibility of {@code lock_screen_preview_container}.
+     *
+     * @param isHomeSelected whether the home tab is selected.
+     */
+    public void setIsHomeSelected(boolean isHomeSelected) {
+        mIsHomeSelected = isHomeSelected;
+    }
+
+    private int getStatusBarHeight() {
+        return mStatusBarHeight;
+    }
+
+    private int getNavigationBarHeight() {
+        return mNavigationBarHeight;
+    }
+
+    private int getAttributeDimension(int resId) {
+        final TypedArray attributes = mView.getContext().getTheme().obtainStyledAttributes(
+                new int[]{resId});
+        int dimension = attributes.getDimensionPixelSize(0, 0);
+        attributes.recycle();
+        return dimension;
+    }
+
+    private void setViewMargins(int viewId, float marginTop, float marginBottom,
+            boolean separatedTabs) {
+        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
+                FrameLayout.LayoutParams.MATCH_PARENT,
+                separatedTabs ? FrameLayout.LayoutParams.WRAP_CONTENT
+                        : FrameLayout.LayoutParams.MATCH_PARENT);
+
+        layoutParams.setMargins(0, Math.round(marginTop), 0, Math.round(marginBottom));
+
+        if (separatedTabs) {
+            layoutParams.gravity = Gravity.BOTTOM;
+        }
+
+        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.
+     *
+     * Called by a {@code View.OnApplyWindowInsetsListener} defined in {@code PreviewFragment}.
+     *
+     * @param windowInsets the window insets of the current window.
+     */
+    public void setWindowInsets(WindowInsets windowInsets) {
+        Insets insets = windowInsets.getInsetsIgnoringVisibility(
+                WindowInsets.Type.systemBars()
+        );
+
+        mStatusBarHeight = insets.top;
+        mNavigationBarHeight = insets.bottom;
+    }
+
+    /**
+     * Place UI elements in the correct locations.
+     *
+     * Takes status bar and navigation bar into account.
+     */
+    public void placeViews() {
+        setViewMargins(R.id.screen_preview_layout,
+                getStatusBarHeight() + getAttributeDimension(R.attr.actionBarSize),
+                getNavigationBarHeight()
+                        + mView.getResources().getDimension(R.dimen.bottom_actions_height)
+                        + mView.getResources().getDimension(R.dimen.separated_tabs_height),
+                false);
+        setViewMargins(R.id.bottom_action_bar_container,
+                0,
+                getNavigationBarHeight(),
+                false);
+        setViewMargins(R.id.separated_tabs_container,
+                0,
+                getNavigationBarHeight()
+                        + mView.getResources().getDimension(R.dimen.bottom_actions_height),
+                true);
+        ensureToolbarIsCorrectlyLocated();
+    }
+
+    /**
+     * Ensures that the bottom action bar is in the correct location.
+     *
+     * Called by {@code onBottomActionBarReady}, so that the bottom action bar is correctly located
+     * when it is redrawn.
+     */
+    public void ensureBottomActionBarIsCorrectlyLocated() {
+        float targetTranslation = mIsFullScreen ? mBottomActionBarTranslation : 0;
+        mView.findViewById(R.id.bottom_actionbar).setTranslationY(targetTranslation);
+    }
+
+    /**
+     * Ensures that the toolbar is in the correct location.
+     *
+     * Called by {@code placeViews}, {@code ImageWallpaperColorThemePreviewFragment#updateToolBar},
+     * and @{code LiveWallpaperColorThemePreviewFragment#updateToolBar}, so that the toolbar is
+     * correctly located when it is redrawn.
+     */
+    public void ensureToolbarIsCorrectlyLocated() {
+        AppBarLayout.LayoutParams layoutParams = new AppBarLayout.LayoutParams(
+                AppBarLayout.LayoutParams.MATCH_PARENT,
+                AppBarLayout.LayoutParams.MATCH_PARENT);
+
+        layoutParams.setMargins(0, getStatusBarHeight(), 0, 0);
+
+        mView.findViewById(R.id.toolbar).setLayoutParams(layoutParams);
+    }
+
+    /**
+     * Ensures that the text and the navigation button on the toolbar is given the correct color.
+     *
+     * Called by {@code updateToolBar}.
+     */
+    public void ensureToolbarIsCorrectlyColored() {
+        TextView textView = mView.findViewById(R.id.custom_toolbar_title);
+        textView.setTextColor(mCurrentTextColor);
+
+        Toolbar toolbar = mView.findViewById(R.id.toolbar);
+        // It may be null because there's no back arrow in some cases. For example: no back arrow
+        // for Photos launching case.
+        ImageButton button = (ImageButton) toolbar.getNavigationView();
+        if (button != null) {
+            button.setColorFilter(mCurrentTextColor);
+        }
+    }
+
+    /**
+     * Sets the text color used for the "Preview" caption in full screen mode.
+     *
+     * @param fullScreenTextColor The desired color for the "Preview" caption in full screen mode.
+     */
+    public void setFullScreenTextColor(FullScreenTextColor fullScreenTextColor) {
+        mFullScreenTextColor = fullScreenTextColor;
+
+        animateColor(mIsFullScreen);
+    }
+
+    /**
+     * Sets the visibility of the workspace surface (containing icons from the home screen) and
+     * the elements unique to the lock screen (date and time).
+     *
+     * Called when the "Hide UI Preview" button is clicked.
+     *
+     * @param visible {@code true} if the icons should be shown;
+     *                {@code false} if they should be hidden.
+     */
+    public void setWorkspaceVisibility(boolean visible) {
+        // Not using [setVisibility], because it creates a "jump".
+        if (visible) {
+            mWorkspaceSurface.setClipBounds(new Rect(
+                    0,
+                    Math.round(mWorkspaceHeight * HIDE_ICONS_TOP_RATIO),
+                    mWorkspaceWidth,
+                    mWorkspaceHeight + Math.round(mFullScreenButtonsTranslation / mScale)));
+            mView.findViewById(R.id.lock_screen_preview_container).setVisibility(View.VISIBLE);
+        } else {
+            int half = mWorkspaceHeight / 2;
+            mWorkspaceSurface.setClipBounds(new Rect(
+                    0,
+                    half,
+                    mWorkspaceWidth,
+                    half + 1));
+            mView.findViewById(R.id.lock_screen_preview_container).setVisibility(View.INVISIBLE);
+        }
+        if (mIsHomeSelected) {
+            mView.findViewById(R.id.lock_screen_preview_container).setVisibility(View.INVISIBLE);
+        }
+        mWorkspaceVisibility = visible;
+    }
+
+    /**
+     * Returns the visibility of the workspace surface (containing icons from the home screen).
+     *
+     * @return the visibility of the workspace surface.
+     */
+    public boolean getWorkspaceVisibility() {
+        return mWorkspaceVisibility;
+    }
+
+    private void animateColor(boolean toFullScreen) {
+        TextView textView = mView.findViewById(R.id.custom_toolbar_title);
+
+        int targetColor;
+        if (!toFullScreen || mFullScreenTextColor == FullScreenTextColor.DEFAULT) {
+            targetColor = ResourceUtils.getColorAttr(
+                    mView.getContext(),
+                    android.R.attr.textColorPrimary);
+        } else if (mFullScreenTextColor == FullScreenTextColor.DARK) {
+            targetColor = mView.getContext().getColor(android.R.color.black);
+        } else {
+            targetColor = mView.getContext().getColor(android.R.color.white);
+        }
+
+        if (targetColor == mCurrentTextColor) {
+            return;
+        }
+
+        Toolbar toolbar = mView.findViewById(R.id.toolbar);
+        ImageButton button = (ImageButton) toolbar.getNavigationView();
+
+        ValueAnimator colorAnimator = ValueAnimator.ofArgb(mCurrentTextColor, targetColor);
+        colorAnimator.addUpdateListener(animation -> {
+            int color = (int) animation.getAnimatedValue();
+            textView.setTextColor(color);
+            // It may be null because there's no back arrow in some cases. For example: no back
+            // arrow for Photos launching case.
+            if (button != null) {
+                button.setColorFilter(color);
+            }
+        });
+        colorAnimator.start();
+
+        mCurrentTextColor = targetColor;
+    }
+
+    /**
+     * Animates the layout to or from fullscreen.
+     *
+     * @param toFullScreen {@code true} if animating into the full screen layout;
+     *                     {@code false} if animating out of the full screen layout.
+     */
+    public void startAnimation(boolean toFullScreen) {
+        // If there is no need to animate, return.
+        if (toFullScreen == mIsFullScreen) {
+            return;
+        }
+
+        // If the scale is not set, compute the location and size of frame layout.
+        if (!mScaleIsSet) {
+            int[] loc = new int[2];
+            mTouchForwardingLayout.getLocationInWindow(loc);
+
+            ScreenSizeCalculator screenSizeCalculator = ScreenSizeCalculator.getInstance();
+            Point screenSize = screenSizeCalculator.getScreenSize(mView.getDisplay());
+            int screenWidth = screenSize.x;
+            int screenHeight = screenSize.y;
+
+            mOffsetY = (float) (screenHeight / 2.0
+                    - (loc[1] + mTouchForwardingLayout.getHeight() / 2.0));
+
+            mScale = Math.max(
+                    screenWidth / (float) mTouchForwardingLayout.getWidth(),
+                    screenHeight / (float) mTouchForwardingLayout.getHeight());
+
+            mDefaultRadius = ((CardView) mWorkspaceSurface.getParent()).getRadius();
+
+            mWorkspaceSurface.setEnableSurfaceClipping(true);
+
+            mWorkspaceWidth = mWorkspaceSurface.getWidth();
+            mWorkspaceHeight = mWorkspaceSurface.getHeight();
+
+            mBottomActionBarTranslation = getNavigationBarHeight()
+                    + mView.getResources().getDimension(R.dimen.bottom_actions_height)
+                    + mView.getResources().getDimension(R.dimen.separated_tabs_height);
+
+            mFullScreenButtonsTranslation = -(getNavigationBarHeight()
+                    + mView.getResources().getDimension(
+                            R.dimen.fullscreen_preview_button_margin_bottom)
+                    + mView.getResources().getDimension(R.dimen.separated_tabs_height));
+
+            mScaleIsSet = true;
+        }
+
+        // Perform animations.
+
+        // Rounding animation.
+        // Animated version of ((CardView) mWorkspaceSurface.getParent()).setRadius(0);
+        float fromRadius = toFullScreen ? mDefaultRadius : 0f;
+        float toRadius = toFullScreen ? 0f : mDefaultRadius;
+
+        ValueAnimator animationRounding = ValueAnimator.ofFloat(fromRadius, toRadius);
+        animationRounding.addUpdateListener(animation -> {
+            ((CardView) mWorkspaceSurface.getParent()).setRadius(
+                    (float) animation.getAnimatedValue());
+        });
+
+        // Animation to hide some of the home screen icons.
+        float fromTop = toFullScreen ? 0f : HIDE_ICONS_TOP_RATIO;
+        float toTop = toFullScreen ? HIDE_ICONS_TOP_RATIO : 0f;
+        float fromBottom = toFullScreen ? 0 : mFullScreenButtonsTranslation / mScale;
+        float toBottom = toFullScreen ? mFullScreenButtonsTranslation / mScale : 0;
+
+        ValueAnimator animationHide = ValueAnimator.ofFloat(0f, 1f);
+        animationHide.addUpdateListener(animation -> {
+            float t = (float) animation.getAnimatedValue();
+            float top = fromTop + t * (toTop - fromTop);
+            float bottom = fromBottom + t * (toBottom - fromBottom);
+            mWorkspaceSurface.setClipBounds(new Rect(
+                    0,
+                    Math.round(mWorkspaceHeight * top),
+                    mWorkspaceWidth,
+                    mWorkspaceHeight + Math.round(bottom)));
+        });
+
+        // Other animations.
+        float scale = toFullScreen ? mScale : 1f;
+        float offsetY = toFullScreen ? mOffsetY : 0f;
+        float bottomActionBarTranslation = toFullScreen ? mBottomActionBarTranslation : 0;
+        float fullScreenButtonsTranslation = toFullScreen ? mFullScreenButtonsTranslation : 0;
+        View frameLayout = mView.findViewById(R.id.screen_preview_layout);
+
+        AnimatorSet animatorSet = new AnimatorSet();
+        animatorSet.playTogether(
+                ObjectAnimator.ofFloat(frameLayout, "scaleX", scale),
+                ObjectAnimator.ofFloat(frameLayout, "scaleY", scale),
+                ObjectAnimator.ofFloat(frameLayout, "translationY", offsetY),
+                ObjectAnimator.ofFloat(mView.findViewById(R.id.bottom_actionbar),
+                        "translationY", bottomActionBarTranslation),
+                ObjectAnimator.ofFloat(mView.findViewById(R.id.separated_tabs_container),
+                        "translationY", bottomActionBarTranslation),
+                ObjectAnimator.ofFloat(mView.findViewById(R.id.fullscreen_buttons_container),
+                        "translationY", fullScreenButtonsTranslation),
+                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);
+
+        // Changes appearances of some elements.
+        mWorkspaceVisibility = true;
+
+        if (toFullScreen) {
+            ((Button) mView.findViewById(R.id.hide_ui_preview_button)).setText(
+                    R.string.hide_ui_preview_text
+            );
+        }
+
+        mView.findViewById(R.id.lock_screen_preview_container).setVisibility(View.VISIBLE);
+        if (mIsHomeSelected) {
+            mView.findViewById(R.id.lock_screen_preview_container)
+                    .setVisibility(View.INVISIBLE);
+        }
+
+        mIsFullScreen = toFullScreen;
+    }
+}
diff --git a/src/com/android/wallpaper/util/LaunchSourceUtils.java b/src/com/android/wallpaper/util/LaunchSourceUtils.java
new file mode 100644
index 0000000..a4048bd
--- /dev/null
+++ b/src/com/android/wallpaper/util/LaunchSourceUtils.java
@@ -0,0 +1,13 @@
+package com.android.wallpaper.util;
+
+/** Util class for launch source logging. */
+public final class LaunchSourceUtils {
+    public static final String WALLPAPER_LAUNCH_SOURCE =
+            "com.android.wallpaper.LAUNCH_SOURCE";
+    public static final String LAUNCH_SOURCE_LAUNCHER = "app_launched_launcher";
+    public static final String LAUNCH_SOURCE_SETTINGS = "app_launched_settings";
+    public static final String LAUNCH_SOURCE_SUW = "app_launched_suw";
+    public static final String LAUNCH_SOURCE_TIPS = "app_launched_tips";
+    public static final String LAUNCH_SOURCE_DEEP_LINK = "app_launched_deeplink";
+    public static final String LAUNCH_SETTINGS_SEARCH = ":settings:fragment_args_key";
+}
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/PreviewUtils.java b/src/com/android/wallpaper/util/PreviewUtils.java
index 5b1d857..0b8977a 100644
--- a/src/com/android/wallpaper/util/PreviewUtils.java
+++ b/src/com/android/wallpaper/util/PreviewUtils.java
@@ -23,17 +23,23 @@
 import android.content.pm.ResolveInfo;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
 import android.text.TextUtils;
 
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
 /** Util class for wallpaper preview. */
 public class PreviewUtils {
 
     private static final String PREVIEW = "preview";
     private static final String METHOD_GET_PREVIEW = "get_preview";
+    private static final ExecutorService sExecutorService = Executors.newSingleThreadExecutor();
 
     private final Context mContext;
     private final String mProviderAuthority;
-    private final ProviderInfo mProviderInfo;
+    private ProviderInfo mProviderInfo;
 
     public PreviewUtils(Context context, String authorityMetadataKey) {
         mContext = context;
@@ -46,15 +52,28 @@
         } else {
             mProviderAuthority = null;
         }
-        // TODO: check permissions if needed
+
         mProviderInfo = TextUtils.isEmpty(mProviderAuthority) ? null
                 : mContext.getPackageManager().resolveContentProvider(mProviderAuthority, 0);
+        if (mProviderInfo != null && !TextUtils.isEmpty(mProviderInfo.readPermission)) {
+            if (context.checkSelfPermission(mProviderInfo.readPermission)
+                    != PackageManager.PERMISSION_GRANTED) {
+                mProviderInfo = null;
+            }
+        }
     }
 
-    /** Render preview under the current grid option. */
-    public Bundle renderPreview(Bundle bundle) {
-        return mContext.getContentResolver().call(getUri(PREVIEW), METHOD_GET_PREVIEW, null,
-                bundle);
+    /**
+     * Render preview under the current grid option.
+     * @param bundle request options to pass on the call
+     * @param callback to receive the results, it will be called on the main thread.
+     */
+    public void renderPreview(Bundle bundle, WorkspacePreviewCallback callback) {
+        sExecutorService.submit(() -> {
+            Bundle result = mContext.getContentResolver().call(getUri(PREVIEW),
+                    METHOD_GET_PREVIEW, null, bundle);
+            new Handler(Looper.getMainLooper()).post(() -> callback.onPreviewRendered(result));
+        });
     }
 
     /** Easy way to generate a Uri with the provider info from this class. */
@@ -70,4 +89,14 @@
     public boolean supportsPreview() {
         return mProviderInfo != null;
     }
+
+    /**
+     * Callback for a call to the provider to render preview
+     */
+    public interface WorkspacePreviewCallback {
+        /**
+         * Called with the result from the provider.
+         */
+        void onPreviewRendered(Bundle resultBundle);
+    }
 }
diff --git a/src/com/android/wallpaper/util/ResourceUtils.java b/src/com/android/wallpaper/util/ResourceUtils.java
new file mode 100644
index 0000000..f375633
--- /dev/null
+++ b/src/com/android/wallpaper/util/ResourceUtils.java
@@ -0,0 +1,39 @@
+/*
+ * 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.res.ColorStateList;
+import android.content.res.TypedArray;
+
+/**
+ * A set of common resource utilities.
+ */
+public class ResourceUtils {
+    /**
+     * Returns the default color for a given attribute.
+     */
+    public static int getColorAttr(Context context, int attr) {
+        TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
+        ColorStateList stateList = null;
+        try {
+            stateList = ta.getColorStateList(0);
+        } finally {
+            ta.recycle();
+        }
+        return stateList.getDefaultColor();
+    }
+}
diff --git a/src/com/android/wallpaper/util/SizeCalculator.java b/src/com/android/wallpaper/util/SizeCalculator.java
index 89f4318..30378de 100755
--- a/src/com/android/wallpaper/util/SizeCalculator.java
+++ b/src/com/android/wallpaper/util/SizeCalculator.java
@@ -52,6 +52,17 @@
     private static final int CATEGORY_MORE_COLUMNS = 3;
 
     /**
+     * The number of columns for a "fewer columns" configuration of the featured category tiles
+     * grid.
+     */
+    private static final int FEATURED_CATEGORY_FEWER_COLUMNS = 2;
+
+    /**
+     * The number of columns for a "more columns" configuration of the featured category tiles grid.
+     */
+    private static final int FEATURED_CATEGORY_MORE_COLUMNS = 2;
+
+    /**
      * The number of columns for a "fewer columns" configuration of the individual wallpaper tiles
      * grid.
      */
@@ -63,6 +74,18 @@
      */
     private static final int INDIVIDUAL_MORE_COLUMNS = 4;
 
+    /**
+     * The number of columns for a "fewer columns" configuration of the featured individual
+     * wallpaper tiles grid.
+     */
+    private static final int FEATURED_INDIVIDUAL_FEWER_COLUMNS = 2;
+
+    /**
+     * The number of columns for a "more columns" configuration of the featured individual wallpaper
+     * tiles grid.
+     */
+    private static final int FEATURED_INDIVIDUAL_MORE_COLUMNS = 2;
+
     // Suppress default constructor for noninstantiability.
     private SizeCalculator() {
         throw new AssertionError("Can't initialize a SizeCalculator.");
@@ -86,16 +109,35 @@
         return getNumIndividualColumns(activity, windowWidthPx);
     }
 
+    /**
+     * Returns the number of columns for a grid of featured individual tiles. Selects from fewer and
+     * more columns based on the width of the activity.
+     */
+    public static int getNumFeaturedIndividualColumns(@NonNull Activity activity) {
+        int windowWidthPx = getActivityWindowWidthPx(activity);
+        return getNumFeaturedIndividualColumns(activity, windowWidthPx);
+    }
+
     private static int getNumCategoryColumns(Activity activity, int windowWidthPx) {
         return getNumColumns(activity, windowWidthPx, CATEGORY_FEWER_COLUMNS,
                 CATEGORY_MORE_COLUMNS);
     }
 
+    private static int getNumFeaturedCategoryColumns(Activity activity, int windowWidthPx) {
+        return getNumColumns(activity, windowWidthPx, FEATURED_CATEGORY_FEWER_COLUMNS,
+                FEATURED_CATEGORY_MORE_COLUMNS);
+    }
+
     private static int getNumIndividualColumns(Activity activity, int windowWidthPx) {
         return getNumColumns(
                 activity, windowWidthPx, INDIVIDUAL_FEWER_COLUMNS, INDIVIDUAL_MORE_COLUMNS);
     }
 
+    private static int getNumFeaturedIndividualColumns(Activity activity, int windowWidthPx) {
+        return getNumColumns(activity, windowWidthPx, FEATURED_INDIVIDUAL_FEWER_COLUMNS,
+                FEATURED_INDIVIDUAL_MORE_COLUMNS);
+    }
+
     private static int getNumColumns(
             Context context, int windowWidthPx, int fewerCount, int moreCount) {
         WindowManager windowManager = (WindowManager)
@@ -119,22 +161,52 @@
      * Returns the size of a category grid tile in px.
      */
     public static Point getCategoryTileSize(@NonNull Activity activity) {
-        Context appContext = activity.getApplicationContext();
+        Resources res = activity.getResources();
         int windowWidthPx = getActivityWindowWidthPx(activity);
 
         int columnCount = getNumCategoryColumns(activity, windowWidthPx);
-        return getSquareTileSize(appContext, columnCount, windowWidthPx);
+        return getSquareTileSize(columnCount, windowWidthPx,
+                res.getDimensionPixelSize(R.dimen.grid_item_category_padding_horizontal),
+                res.getDimensionPixelSize(R.dimen.category_grid_edge_space));
+    }
+
+    /**
+     * Returns the size of a featured category grid tile in px.
+     */
+    public static Point getFeaturedCategoryTileSize(@NonNull Activity activity) {
+        Resources res = activity.getResources();
+        int windowWidthPx = getActivityWindowWidthPx(activity);
+
+        int columnCount = getNumFeaturedCategoryColumns(activity, windowWidthPx);
+        return getSquareTileSize(columnCount, windowWidthPx,
+                res.getDimensionPixelSize(R.dimen.grid_item_category_padding_horizontal),
+                res.getDimensionPixelSize(R.dimen.category_grid_edge_space));
     }
 
     /**
      * Returns the size of an individual grid tile for the given activity in px.
      */
     public static Point getIndividualTileSize(@NonNull Activity activity) {
-        Context appContext = activity.getApplicationContext();
+        Resources res = activity.getResources();
         int windowWidthPx = getActivityWindowWidthPx(activity);
 
         int columnCount = getNumIndividualColumns(activity, windowWidthPx);
-        return getSquareTileSize(appContext, columnCount, windowWidthPx);
+        return getSquareTileSize(columnCount, windowWidthPx,
+                res.getDimensionPixelSize(R.dimen.grid_item_individual_padding_horizontal),
+                res.getDimensionPixelSize(R.dimen.wallpaper_grid_edge_space));
+    }
+
+    /**
+     * Returns the size of a featured individual grid tile for the given activity in px.
+     */
+    public static Point getFeaturedIndividualTileSize(@NonNull Activity activity) {
+        Resources res = activity.getResources();
+        int windowWidthPx = getActivityWindowWidthPx(activity);
+
+        int columnCount = getNumFeaturedIndividualColumns(activity, windowWidthPx);
+        return getSquareTileSize(columnCount, windowWidthPx,
+                res.getDimensionPixelSize(R.dimen.grid_item_featured_individual_padding_horizontal),
+                res.getDimensionPixelSize(R.dimen.featured_wallpaper_grid_edge_space));
     }
 
     /**
@@ -202,11 +274,8 @@
      * display. The size is determined by these counts with the aspect ratio of 1:1 and is in units
      * of px.
      */
-    private static Point getSquareTileSize(Context context, int columnCount, int windowWidthPx) {
-        Resources res = context.getResources();
-        int gridPaddingPx = res.getDimensionPixelSize(R.dimen.grid_padding);
-        int gridEdgeSpacePx = res.getDimensionPixelSize(R.dimen.grid_edge_space);
-
+    private static Point getSquareTileSize(int columnCount, int windowWidthPx, int gridPaddingPx,
+            int gridEdgeSpacePx) {
         int availableWidthPx = windowWidthPx
                 - gridPaddingPx * 2 * columnCount // Item's left and right padding * column count
                 - gridEdgeSpacePx * 2; // Grid view's left and right edge's space
diff --git a/src/com/android/wallpaper/util/TimeUtils.java b/src/com/android/wallpaper/util/TimeUtils.java
index 5b3334c..2dc9f51 100644
--- a/src/com/android/wallpaper/util/TimeUtils.java
+++ b/src/com/android/wallpaper/util/TimeUtils.java
@@ -26,12 +26,18 @@
 import java.util.Calendar;
 
 /** Utility class for clock time preview. */
-public class TimeUtils {
+public final class TimeUtils {
 
-    private static final String CLOCK_FORMAT_12HOUR = "h:mm";
-    private static final String CLOCK_FORMAT_24HOUR = "H:mm";
+    private static final CharSequence CLOCK_FORMAT_12HOUR = "h:mm";
+    private static final CharSequence CLOCK_FORMAT_24HOUR = "H:mm";
+    private static final CharSequence CLOCK_DOUBLE_LINE_FORMAT_12_HOUR = "hh\nmm";
+    private static final CharSequence CLOCK_DOUBLE_LINE_FORMAT_24_HOUR = "HH\nmm";
 
-    /** Returns the clock formatted time. For 12-hour format, there's no AM/PM field displayed. */
+    /**
+     *  Returns the default clock formatted time. For example: 4:35 or 16:35.
+     *
+     *  <p> For 12-hour format, there's no AM/PM field displayed.
+     */
     public static CharSequence getFormattedTime(Context context, Calendar calendar) {
         return DateFormat.format(
                 DateFormat.is24HourFormat(context)
@@ -41,6 +47,20 @@
     }
 
     /**
+     * Returns the double line clock formatted time.
+     *
+     * <p> For 12-hour format, there's no AM/PM field displayed.
+     */
+    public static CharSequence getDoubleLineFormattedTime(Context context,
+            Calendar calendar) {
+        return DateFormat.format(
+                DateFormat.is24HourFormat(context)
+                        ? CLOCK_DOUBLE_LINE_FORMAT_24_HOUR
+                        : CLOCK_DOUBLE_LINE_FORMAT_12_HOUR,
+                calendar);
+    }
+
+    /**
      * BroadcastReceiver that can notify a listener when the system time (minutes) changes.
      * Use {@link #registerNewReceiver(Context, TimeListener)} to create a new instance that will be
      * automatically registered using the given Context.
diff --git a/src/com/android/wallpaper/util/WallpaperConnection.java b/src/com/android/wallpaper/util/WallpaperConnection.java
index 27b02ee..06b4619 100644
--- a/src/com/android/wallpaper/util/WallpaperConnection.java
+++ b/src/com/android/wallpaper/util/WallpaperConnection.java
@@ -15,27 +15,35 @@
  */
 package com.android.wallpaper.util;
 
-import android.app.Activity;
+import static android.graphics.Matrix.MSCALE_X;
+import static android.graphics.Matrix.MSCALE_Y;
+import static android.graphics.Matrix.MSKEW_X;
+import static android.graphics.Matrix.MSKEW_Y;
+
 import android.app.WallpaperColors;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.graphics.Matrix;
 import android.graphics.Rect;
+import android.graphics.RectF;
 import android.os.IBinder;
 import android.os.ParcelFileDescriptor;
 import android.os.RemoteException;
 import android.service.wallpaper.IWallpaperConnection;
 import android.service.wallpaper.IWallpaperEngine;
 import android.service.wallpaper.IWallpaperService;
+import android.util.DisplayMetrics;
 import android.util.Log;
-import android.view.View;
+import android.view.SurfaceControl;
+import android.view.SurfaceHolder;
+import android.view.SurfaceHolder.Callback;
+import android.view.SurfaceView;
 import android.view.WindowManager.LayoutParams;
 
 import androidx.annotation.Nullable;
 
-import com.android.systemui.shared.system.WallpaperEngineCompat;
-
 /**
  * Implementation of {@link IWallpaperConnection} that handles communication with a
  * {@link android.service.wallpaper.WallpaperService}
@@ -46,37 +54,53 @@
      * Returns whether live preview is available in framework.
      */
     public static boolean isPreviewAvailable() {
-        return WallpaperEngineCompat.supportsScalePreview();
+        try {
+            return IWallpaperEngine.class.getMethod("mirrorSurfaceControl") != null;
+        } catch (NoSuchMethodException | SecurityException e) {
+            return false;
+        }
     }
 
     private static final String TAG = "WallpaperConnection";
-    private final Activity mActivity;
+    private final Context mContext;
     private final Intent mIntent;
     private final WallpaperConnectionListener mListener;
-    private Rect mWallpaperPreviewRect;
+    private final SurfaceView mContainerView;
+    private final SurfaceView mSecondContainerView;
     private IWallpaperService mService;
-    private IWallpaperEngine mEngine;
+    @Nullable private IWallpaperEngine mEngine;
     private boolean mConnected;
     private boolean mIsVisible;
     private boolean mIsEngineVisible;
     private boolean mEngineReady;
-    private WallpaperEngineCompat mEngineCompat;
 
     /**
      * @param intent used to bind the wallpaper service
-     * @param activity Activity that owns the window where the wallpaper is rendered
-     * @param listener if provided, it'll be notified of connection/desconnection events
-     * @param wallpaperPositionInScreen an optional Rect with the position to render the wallpaper
-     *                                  in global coordinates. If null, the wallpaper will be
-     *                                  rendered in full screen.
+     * @param context Context used to start and bind the live wallpaper service
+     * @param listener if provided, it'll be notified of connection/disconnection events
+     * @param containerView SurfaceView that will display the wallpaper
      */
-    public WallpaperConnection(Intent intent, Activity activity,
-            @Nullable WallpaperConnectionListener listener,
-            @Nullable Rect wallpaperPositionInScreen) {
-        mActivity = activity;
+    public WallpaperConnection(Intent intent, Context context,
+            @Nullable WallpaperConnectionListener listener, SurfaceView containerView) {
+        this(intent, context, listener, containerView, null);
+    }
+
+    /**
+     * @param intent used to bind the wallpaper service
+     * @param context Context used to start and bind the live wallpaper service
+     * @param listener if provided, it'll be notified of connection/disconnection events
+     * @param containerView SurfaceView that will display the wallpaper
+     * @param secondaryContainerView optional SurfaceView that will display a second, mirrored
+     *                               version of the wallpaper
+     */
+    public WallpaperConnection(Intent intent, Context context,
+            @Nullable WallpaperConnectionListener listener, SurfaceView containerView,
+            @Nullable SurfaceView secondaryContainerView) {
+        mContext = context.getApplicationContext();
         mIntent = intent;
         mListener = listener;
-        mWallpaperPreviewRect = wallpaperPositionInScreen;
+        mContainerView = containerView;
+        mSecondContainerView = secondaryContainerView;
     }
 
     /**
@@ -87,7 +111,7 @@
             if (mConnected) {
                 return true;
             }
-            if (!mActivity.bindService(mIntent, this,
+            if (!mContext.bindService(mIntent, this,
                     Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT)) {
                 return false;
             }
@@ -115,13 +139,12 @@
                     // Ignore
                 }
                 mEngine = null;
-                mEngineCompat = null;
             }
             try {
-                mActivity.unbindService(this);
+                mContext.unbindService(this);
             } catch (IllegalArgumentException e) {
-                Log.w(TAG, "Can't unbind wallpaper service. "
-                        + "It might have crashed, just ignoring.", e);
+                Log.i(TAG, "Can't unbind wallpaper service. "
+                        + "It might have crashed, just ignoring.");
             }
             mService = null;
         }
@@ -136,25 +159,29 @@
     public void onServiceConnected(ComponentName name, IBinder service) {
         mService = IWallpaperService.Stub.asInterface(service);
         try {
-            View root = mActivity.getWindow().getDecorView();
-            int displayId = root.getDisplay().getDisplayId();
+            int displayId = mContainerView.getDisplay().getDisplayId();
 
-            mService.attach(this, root.getWindowToken(),
+            mService.attach(this, mContainerView.getWindowToken(),
                     LayoutParams.TYPE_APPLICATION_MEDIA,
-                    true, root.getWidth(), root.getHeight(),
+                    true, mContainerView.getWidth(), mContainerView.getHeight(),
                     new Rect(0, 0, 0, 0), displayId);
         } catch (RemoteException e) {
             Log.w(TAG, "Failed attaching wallpaper; clearing", e);
         }
     }
 
+    @Override
+    public void onLocalWallpaperColorsChanged(RectF area,
+            WallpaperColors colors, int displayId) {
+
+    }
+
     /**
      * @see ServiceConnection#onServiceDisconnected(ComponentName)
      */
     public void onServiceDisconnected(ComponentName name) {
         mService = null;
         mEngine = null;
-        mEngineCompat = null;
         Log.w(TAG, "Wallpaper service gone: " + name);
     }
 
@@ -165,8 +192,6 @@
         synchronized (this) {
             if (mConnected) {
                 mEngine = engine;
-                mEngineCompat = new WallpaperEngineCompat(mEngine);
-                updateEnginePosition();
                 if (mIsVisible) {
                     setEngineVisibility(true);
                 }
@@ -188,15 +213,10 @@
         }
     }
 
-    private void updateEnginePosition() {
-        if (mWallpaperPreviewRect != null && mEngineCompat != null) {
-            mEngineCompat.scalePreview(mWallpaperPreviewRect);
-        }
-    }
-
     /**
      * Returns the engine handled by this WallpaperConnection
      */
+    @Nullable
     public IWallpaperEngine getEngine() {
         return mEngine;
     }
@@ -210,7 +230,7 @@
 
     @Override
     public void onWallpaperColorsChanged(WallpaperColors colors, int displayId) {
-        mActivity.runOnUiThread(() -> {
+        mContainerView.post(() -> {
             if (mListener != null) {
                 mListener.onWallpaperColorsChanged(colors, displayId);
             }
@@ -220,7 +240,14 @@
     @Override
     public void engineShown(IWallpaperEngine engine)  {
         mEngineReady = true;
-        mActivity.runOnUiThread(() -> {
+        if (mContainerView != null) {
+            mContainerView.post(() -> reparentWallpaperSurface(mContainerView));
+        }
+        if (mSecondContainerView != null) {
+            mSecondContainerView.post(() -> reparentWallpaperSurface(mSecondContainerView));
+        }
+
+        mContainerView.post(() -> {
             if (mListener != null) {
                 mListener.onEngineShown();
             }
@@ -228,14 +255,6 @@
     }
 
     /**
-     * Update the wallpaper's position to match the given Rect (in gobal coordinates)
-     */
-    public void updatePreviewPosition(Rect positionGlobalRect) {
-        mWallpaperPreviewRect = positionGlobalRect;
-        updateEnginePosition();
-    }
-
-    /**
      * Returns true if the wallpaper engine has been initialized.
      */
     public boolean isEngineReady() {
@@ -261,6 +280,70 @@
         }
     }
 
+    private void reparentWallpaperSurface(SurfaceView parentSurface) {
+        if (mEngine == null) {
+            Log.i(TAG, "Engine is null, was the service disconnected?");
+            return;
+        }
+        if (parentSurface.getSurfaceControl() != null) {
+            mirrorAndReparent(parentSurface);
+        } else {
+            Log.d(TAG, "SurfaceView not initialized yet, adding callback");
+            parentSurface.getHolder().addCallback(new Callback() {
+                @Override
+                public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
+
+                }
+
+                @Override
+                public void surfaceCreated(SurfaceHolder surfaceHolder) {
+                    mirrorAndReparent(parentSurface);
+                    parentSurface.getHolder().removeCallback(this);
+                }
+
+                @Override
+                public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
+
+                }
+            });
+        }
+    }
+
+    private void mirrorAndReparent(SurfaceView parentSurface) {
+        if (mEngine == null) {
+            Log.i(TAG, "Engine is null, was the service disconnected?");
+            return;
+        }
+        try {
+            SurfaceControl parentSC = parentSurface.getSurfaceControl();
+            SurfaceControl wallpaperMirrorSC = mEngine.mirrorSurfaceControl();
+            if (wallpaperMirrorSC == null) {
+                return;
+            }
+            float[] values = getScale(parentSurface);
+            SurfaceControl.Transaction t = new SurfaceControl.Transaction();
+            t.setMatrix(wallpaperMirrorSC, values[MSCALE_X], values[MSKEW_Y],
+                    values[MSKEW_X], values[MSCALE_Y]);
+            t.reparent(wallpaperMirrorSC, parentSC);
+            t.show(wallpaperMirrorSC);
+            t.apply();
+        } catch (RemoteException e) {
+            Log.e(TAG, "Couldn't reparent wallpaper surface", e);
+        }
+    }
+
+    private float[] getScale(SurfaceView parentSurface) {
+        Matrix m = new Matrix();
+        float[] values = new float[9];
+        Rect surfacePosition = parentSurface.getHolder().getSurfaceFrame();
+        DisplayMetrics metrics = DisplayMetricsRetriever.getInstance().getDisplayMetrics(
+                mContainerView.getResources(), mContainerView.getDisplay());
+        m.postScale(((float) surfacePosition.width()) / metrics.widthPixels,
+                ((float) surfacePosition.height()) / metrics.heightPixels);
+        m.getValues(values);
+        return values;
+    }
+
     /**
      * Interface to be notified of connect/disconnect events from {@link WallpaperConnection}
      */
diff --git a/src/com/android/wallpaper/util/WallpaperCropUtils.java b/src/com/android/wallpaper/util/WallpaperCropUtils.java
index bff7a67..eaf0e4a 100755
--- a/src/com/android/wallpaper/util/WallpaperCropUtils.java
+++ b/src/com/android/wallpaper/util/WallpaperCropUtils.java
@@ -193,8 +193,8 @@
     public static Rect calculateCropRect(Context context, float wallpaperZoom, Point wallpaperSize,
             Point defaultCropSurfaceSize, Point targetHostSize, int scrollX, int scrollY) {
         // Calculate Rect of wallpaper in physical pixel terms (i.e., scaled to current zoom).
-        int scaledWallpaperWidth = (int) (wallpaperSize.x * wallpaperZoom);
-        int scaledWallpaperHeight = (int) (wallpaperSize.y * wallpaperZoom);
+        int scaledWallpaperWidth = Math.round(wallpaperSize.x * wallpaperZoom);
+        int scaledWallpaperHeight = Math.round(wallpaperSize.y * wallpaperZoom);
         Rect rect = new Rect();
         rect.set(0, 0, scaledWallpaperWidth, scaledWallpaperHeight);
 
diff --git a/src/com/android/wallpaper/util/WallpaperSurfaceCallback.java b/src/com/android/wallpaper/util/WallpaperSurfaceCallback.java
index 1b39007..e043051 100644
--- a/src/com/android/wallpaper/util/WallpaperSurfaceCallback.java
+++ b/src/com/android/wallpaper/util/WallpaperSurfaceCallback.java
@@ -24,16 +24,18 @@
 import android.view.SurfaceControlViewHost;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
+import android.view.View;
 import android.widget.ImageView;
 
 import androidx.annotation.Nullable;
-import androidx.core.content.ContextCompat;
 
-import com.android.wallpaper.R;
 import com.android.wallpaper.module.Injector;
 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.
@@ -56,19 +58,22 @@
     // the live wallpaper. This view is rendered on here for home image wallpaper.
     private ImageView mHomeImageWallpaper;
     private final Context mContext;
-    private final ImageView mHomePreview;
+    private final View mContainerView;
     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, ImageView homePreview,
-            SurfaceView wallpaperSurface, @Nullable  SurfaceListener listener) {
-        mContext = context;
-        mHomePreview = homePreview;
+    public WallpaperSurfaceCallback(Context context, View containerView,
+            SurfaceView wallpaperSurface, @Nullable Future<Integer> placeholderColor,
+            @Nullable SurfaceListener listener) {
+        mContext = context.getApplicationContext();
+        mContainerView = containerView;
         mWallpaperSurface = wallpaperSurface;
         mListener = listener;
 
@@ -83,11 +88,17 @@
         };
         mPackageStatusNotifier.addListener(mAppStatusListener,
                 WallpaperService.SERVICE_INTERFACE);
+        mPlaceholderColor = placeholderColor;
     }
 
-    public WallpaperSurfaceCallback(Context context, ImageView homePreview,
+    public WallpaperSurfaceCallback(Context context, View containerView,
+            SurfaceView wallpaperSurface, @Nullable SurfaceListener listener) {
+        this(context, containerView, wallpaperSurface, null, listener);
+    }
+
+    public WallpaperSurfaceCallback(Context context, View containerView,
             SurfaceView wallpaperSurface) {
-        this(context, homePreview, wallpaperSurface, null);
+        this(context, containerView, wallpaperSurface, null);
     }
 
     @Override
@@ -115,6 +126,9 @@
      */
     public void cleanUp() {
         releaseHost();
+        if (mHomeImageWallpaper != null) {
+            mHomeImageWallpaper.setImageDrawable(null);
+        }
         mPackageStatusNotifier.removeListener(mAppStatusListener);
     }
 
@@ -141,16 +155,24 @@
 
     private void setupSurfaceWallpaper(boolean forceClean) {
         mHomeImageWallpaper = new ImageView(mContext);
-        mHomeImageWallpaper.setBackgroundColor(
-                ContextCompat.getColor(mContext, R.color.primary_color));
-        mHomeImageWallpaper.measure(makeMeasureSpec(mHomePreview.getWidth(), EXACTLY),
-                makeMeasureSpec(mHomePreview.getHeight(), EXACTLY));
-        mHomeImageWallpaper.layout(0, 0, mHomePreview.getWidth(),
-                mHomePreview.getHeight());
+        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(),
+                mContainerView.getHeight());
         if (forceClean) {
             releaseHost();
             mHost = new SurfaceControlViewHost(mContext,
-                    mContext.getDisplay(), mWallpaperSurface.getHostToken());
+                    mContainerView.getDisplay(), mWallpaperSurface.getHostToken());
         }
         mHost.setView(mHomeImageWallpaper, mHomeImageWallpaper.getWidth(),
                 mHomeImageWallpaper.getHeight());
diff --git a/src/com/android/wallpaper/widget/BottomActionBar.java b/src/com/android/wallpaper/widget/BottomActionBar.java
index c6dc61a..c20d578 100644
--- a/src/com/android/wallpaper/widget/BottomActionBar.java
+++ b/src/com/android/wallpaper/widget/BottomActionBar.java
@@ -24,12 +24,17 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.Button;
 import android.widget.FrameLayout;
+import android.widget.ImageView;
 
+import androidx.annotation.LayoutRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.core.widget.ImageViewCompat;
 
 import com.android.wallpaper.R;
+import com.android.wallpaper.util.ResourceUtils;
 import com.android.wallpaper.util.SizeCalculator;
 
 import com.google.android.material.bottomsheet.BottomSheetBehavior;
@@ -92,14 +97,61 @@
         void onBottomSheetExpanded();
     }
 
+    /**
+     * Object to host content view for bottom sheet to display.
+     *
+     * <p> The view would be created in the constructor.
+     */
+    public static abstract class BottomSheetContent<T extends View> {
+
+        private T mContentView;
+        private boolean mIsVisible;
+
+        public BottomSheetContent(Context context) {
+            mContentView = createView(context);
+            setVisibility(false);
+        }
+
+        /** Gets the view id to inflate. */
+        @LayoutRes
+        public abstract int getViewId();
+
+        /** Gets called when the content view is created. */
+        public abstract void onViewCreated(T view);
+
+        /** Gets called when the current content view is going to recreate. */
+        public void onRecreateView(T oldView) {}
+
+        private void recreateView(Context context) {
+            // Inform that the view is going to recreate.
+            onRecreateView(mContentView);
+            // Create a new view with the given context.
+            mContentView = createView(context);
+            setVisibility(mIsVisible);
+        }
+
+        private T createView(Context context) {
+            T contentView = (T) LayoutInflater.from(context).inflate(getViewId(), null);
+            onViewCreated(contentView);
+            contentView.setFocusable(true);
+            return contentView;
+        }
+
+        private void setVisibility(boolean isVisible) {
+            mIsVisible = isVisible;
+            mContentView.setVisibility(mIsVisible ? VISIBLE : GONE);
+        }
+    }
+
     // 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);
-    private final Map<BottomAction, View> mContentViewMap = new EnumMap<>(BottomAction.class);
+    private final Map<BottomAction, BottomSheetContent<?>> mContentViewMap =
+            new EnumMap<>(BottomAction.class);
     private final Map<BottomAction, OnActionSelectedListener> mActionSelectedListeners =
             new EnumMap<>(BottomAction.class);
 
@@ -123,9 +175,11 @@
         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);
+        setColor(context);
 
         mBottomSheetBehavior = (QueueStateBottomSheetBehavior<ViewGroup>) BottomSheetBehavior.from(
                 mBottomSheetView);
@@ -175,25 +229,20 @@
     @Override
     public void onVisibilityAggregated(boolean isVisible) {
         super.onVisibilityAggregated(isVisible);
-        if (!isVisible) {
-            hideBottomSheetAndDeselectButtonIfExpanded();
-            mBottomSheetBehavior.reset();
-        }
         mVisibilityChangeListeners.forEach(listener -> listener.onVisibilityChange(isVisible));
     }
 
     /**
-     * Adds content view to the bottom sheet and binds with a {@code BottomAction} to
-     * expand / collapse the bottom sheet.
+     * Binds the {@code bottomSheetContent} with the {@code action}, the {@code action} button
+     * would be able to expand/collapse the bottom sheet to show the content.
      *
-     * @param contentView the view with content to be added on the bottom sheet
+     * @param bottomSheetContent the content object with view being added to the bottom sheet
      * @param action the action to be bound to expand / collapse the bottom sheet
      */
-    public void attachViewToBottomSheetAndBindAction(View contentView, BottomAction action) {
-        contentView.setVisibility(GONE);
-        contentView.setFocusable(true);
-        mContentViewMap.put(action, contentView);
-        mBottomSheetView.addView(contentView);
+    public void bindBottomSheetContentWithAction(BottomSheetContent<?> bottomSheetContent,
+            BottomAction action) {
+        mContentViewMap.put(action, bottomSheetContent);
+        mBottomSheetView.addView(bottomSheetContent.mContentView);
         setActionClickListener(action, actionView -> {
             if (mBottomSheetBehavior.getState() == STATE_COLLAPSED) {
                 updateContentViewFor(action);
@@ -207,6 +256,15 @@
         hideBottomSheetAndDeselectButtonIfExpanded();
     }
 
+    /** Enables or disables action buttons that show the bottom sheet. */
+    public void enableActionButtonsWithBottomSheet(boolean enabled) {
+        if (enabled) {
+            enableActions(mContentViewMap.keySet().toArray(new BottomAction[0]));
+        } else {
+            disableActions(mContentViewMap.keySet().toArray(new BottomAction[0]));
+        }
+    }
+
     /**
      * Sets a click listener to a specific action.
      *
@@ -263,6 +321,11 @@
         mActionSelectedListeners.put(bottomAction, actionSelectedListener);
     }
 
+    /** Set back button visibility. */
+    public void setBackButtonVisibility(int visibility) {
+        findViewById(R.id.action_back).setVisibility(visibility);
+    }
+
     /** Binds the cancel button to back key. */
     public void bindBackButtonToSystemBackKey(Activity activity) {
         findViewById(R.id.action_back).setOnClickListener(v -> activity.onBackPressed());
@@ -424,6 +487,11 @@
         return mActionMap.get(action).isSelected();
     }
 
+    /** Returns {@code true} if the state of bottom sheet is collapsed. */
+    public boolean isBottomSheetCollapsed() {
+        return mBottomSheetBehavior.getState() == STATE_COLLAPSED;
+    }
+
     /** Resets {@link BottomActionBar} to initial state. */
     public void reset() {
         // Not visible by default, see res/layout/bottom_action_bar.xml
@@ -444,6 +512,36 @@
         mSelectedAction = null;
     }
 
+    /** Dynamic update color with {@code Context}. */
+    public void setColor(Context context) {
+        // Set bottom sheet background.
+        mBottomSheetView.setBackground(context.getDrawable(R.drawable.bottom_sheet_background));
+        if (mBottomSheetView.getChildCount() > 0) {
+            // Update the bottom sheet content view if any.
+            mBottomSheetView.removeAllViews();
+            mContentViewMap.values().forEach(bottomSheetContent -> {
+                bottomSheetContent.recreateView(context);
+                mBottomSheetView.addView(bottomSheetContent.mContentView);
+            });
+        }
+
+        // Set the bar background and action buttons.
+        ViewGroup actionTabs = findViewById(R.id.action_tabs);
+        actionTabs.setBackgroundColor(
+                ResourceUtils.getColorAttr(context, android.R.attr.colorBackground));
+        for (int i = 0; i < actionTabs.getChildCount(); i++) {
+            View v = actionTabs.getChildAt(i);
+            if (v instanceof ImageView) {
+                v.setBackground(context.getDrawable(R.drawable.bottom_action_button_background));
+                ImageViewCompat.setImageTintList((ImageView) v,
+                        context.getColorStateList(R.color.bottom_action_button_color_tint));
+            }
+        }
+        Button applyButton = findViewById(R.id.action_apply_text_button);
+        applyButton.setBackground(context.getDrawable(R.drawable.btn_transparent_background));
+        applyButton.setTextColor(ResourceUtils.getColorAttr(context, android.R.attr.colorAccent));
+    }
+
     private void updateSelectedState(BottomAction bottomAction, boolean selected) {
         View bottomActionView = mActionMap.get(bottomAction);
         if (bottomActionView.isSelected() == selected) {
@@ -466,7 +564,7 @@
     }
 
     private void updateContentViewFor(BottomAction action) {
-        mContentViewMap.forEach((a, v) -> v.setVisibility(a.equals(action) ? VISIBLE : GONE));
+        mContentViewMap.forEach((a, content) -> content.setVisibility(a.equals(action)));
     }
 
     private boolean isExpandable(BottomAction action) {
diff --git a/src/com/android/wallpaper/widget/LiveTileOverlay.java b/src/com/android/wallpaper/widget/LiveTileOverlay.java
deleted file mode 100644
index b829cab..0000000
--- a/src/com/android/wallpaper/widget/LiveTileOverlay.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.wallpaper.widget;
-
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.drawable.Drawable;
-import android.view.ViewOverlay;
-
-import androidx.annotation.Nullable;
-
-/**
- * Translucent Drawable to be rendered on a {@link ViewOverlay} to allow the window background
- * to be seen through it.
- */
-public class LiveTileOverlay extends Drawable {
-
-    public static final LiveTileOverlay INSTANCE = new LiveTileOverlay();
-
-    private final Paint mPaint = new Paint();
-    private final Rect mBoundsRect = new Rect();
-
-    private RectF mCurrentRect;
-    private float mCornerRadius;
-
-    private boolean mIsAttached;
-
-    private Drawable mForegroundDrawable;
-
-    private LiveTileOverlay() {
-        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
-    }
-
-    /**
-     * Update the position and radius of the overlay.
-     */
-    public void update(RectF currentRect, float cornerRadius) {
-        invalidateSelf();
-
-        mCurrentRect = currentRect;
-        mCornerRadius = cornerRadius;
-
-        mCurrentRect.roundOut(mBoundsRect);
-        setBounds(mBoundsRect);
-        invalidateSelf();
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        if (mCurrentRect != null) {
-            canvas.drawRoundRect(mCurrentRect, mCornerRadius, mCornerRadius, mPaint);
-            if (mForegroundDrawable != null) {
-                mForegroundDrawable.draw(canvas);
-            }
-        }
-    }
-
-    @Override
-    public void setAlpha(int i) { }
-
-    @Override
-    public void setColorFilter(ColorFilter colorFilter) { }
-
-    @Override
-    public int getOpacity() {
-        return PixelFormat.TRANSLUCENT;
-    }
-
-    /**
-     * Attach this drawable to a given {@link ViewOverlay}
-     * @return true if the drawable was newly attached, false if it was already attached or it
-     *          couldn't be attached
-     */
-    public boolean attach(ViewOverlay overlay) {
-        if (overlay != null && !mIsAttached) {
-            overlay.add(this);
-            mIsAttached = true;
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Detach this drawable from the given overlay
-     * @param overlay
-     */
-    public void detach(ViewOverlay overlay) {
-        if (overlay != null) {
-            overlay.remove(this);
-            mIsAttached = false;
-        }
-    }
-
-    /**
-     * Set a drawable to be drawn on top of this one.
-     */
-    public void setForegroundDrawable(@Nullable Drawable foregroundDrawable) {
-        mForegroundDrawable = foregroundDrawable;
-        invalidateSelf();
-    }
-}
diff --git a/src/com/android/wallpaper/widget/LockScreenPreviewer.java b/src/com/android/wallpaper/widget/LockScreenPreviewer.java
index 9a6f7d4..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.
@@ -18,9 +18,8 @@
 import static android.view.View.MeasureSpec.EXACTLY;
 import static android.view.View.MeasureSpec.makeMeasureSpec;
 
-import android.app.Activity;
 import android.app.WallpaperColors;
-import android.content.res.ColorStateList;
+import android.content.Context;
 import android.content.res.Configuration;
 import android.graphics.Point;
 import android.text.format.DateFormat;
@@ -28,7 +27,7 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ImageView;
+import android.view.WindowManager;
 import android.widget.TextView;
 
 import androidx.annotation.MainThread;
@@ -45,41 +44,44 @@
 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 Activity mActivity;
-    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, Activity activity, ViewGroup previewContainer) {
-        lifecycle.addObserver(this);
-        mActivity = activity;
-        View contentView = LayoutInflater.from(mActivity).inflate(
+    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);
 
-        Display defaultDisplay = mActivity.getWindowManager().getDefaultDisplay();
+        Display defaultDisplay = mContext.getSystemService(WindowManager.class).getDefaultDisplay();
         Point screenSize = ScreenSizeCalculator.getInstance().getScreenSize(defaultDisplay);
 
-        Configuration config = mActivity.getResources().getConfiguration();
-        final boolean directionLTR = config.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR;
+        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 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(
@@ -88,7 +90,8 @@
                 contentView.layout(0, 0, screenSize.x, screenSize.y);
 
                 // Scale the content view from full screen size to the container(card) size.
-                float scale = (float) cardHeight / screenSize.y;
+                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).
@@ -103,21 +106,27 @@
                 rootView.removeOnLayoutChangeListener(this);
             }
         });
+        mLifecycle.addObserver(this);
     }
 
     @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
     @MainThread
     public void onResume() {
-        mTicker = TimeTicker.registerNewReceiver(mActivity, 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 (mActivity != null) {
-            mActivity.unregisterReceiver(mTicker);
-        }
+        unregisterReceiver();
     }
 
     /**
@@ -129,32 +138,46 @@
     public void setColor(@Nullable WallpaperColors colors) {
         boolean useLightTextColor = colors == null
                 || (colors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) == 0;
-        int color = mActivity.getColor(useLightTextColor
+        int color = mContext.getColor(useLightTextColor
                 ? R.color.text_color_light : R.color.text_color_dark);
-        int textShadowColor = mActivity.getColor(useLightTextColor
+        int textShadowColor = mContext.getColor(useLightTextColor
                 ? R.color.smartspace_preview_shadow_color_dark
                 : R.color.smartspace_preview_shadow_color_transparent);
-        mLockIcon.setImageTintList(ColorStateList.valueOf(color));
         mLockDate.setTextColor(color);
-        mLockTime.setTextColor(color);
-
         mLockDate.setShadowLayer(
-                mActivity.getResources().getDimension(
-                        R.dimen.smartspace_preview_key_ambient_shadow_blur),
-                /* dx = */ 0,
-                /* dy = */ 0,
-                textShadowColor);
-        mLockTime.setShadowLayer(
-                mActivity.getResources().getDimension(
+                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(mActivity, calendar));
         mLockDate.setText(DateFormat.format(mDatePattern, calendar));
+        mLockTime.setText(TimeUtils.getDoubleLineFormattedTime(mLockTime.getContext(), calendar));
     }
 }
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/src/com/android/wallpaper/widget/SeparatedTabLayout.java b/src/com/android/wallpaper/widget/SeparatedTabLayout.java
new file mode 100644
index 0000000..8642485
--- /dev/null
+++ b/src/com/android/wallpaper/widget/SeparatedTabLayout.java
@@ -0,0 +1,118 @@
+package com.android.wallpaper.widget;
+
+import static androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_DRAGGING;
+import static androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_IDLE;
+import static androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_SETTLING;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.viewpager2.widget.ViewPager2;
+import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback;
+
+import com.android.wallpaper.R;
+
+import com.google.android.material.tabs.TabLayout;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * Custom {@link TabLayout} for separated tabs.
+ *
+ * <p>Don't use {@code TabLayoutMediator} for the tab layout, which binds the tab scrolling
+ * animation that is unwanted for the separated tab design. Uses {@link
+ * SeparatedTabLayout#setViewPager} to bind a {@link ViewPager2} to use the proper tab effect.
+ */
+public final class SeparatedTabLayout extends TabLayout {
+
+    public SeparatedTabLayout(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    @NonNull
+    public Tab newTab() {
+        Tab tab = super.newTab();
+        tab.view.setBackgroundResource(R.drawable.separated_tabs_ripple_mask);
+        return tab;
+    }
+
+    /** Binds the given {@code viewPager} to the {@link SeparatedTabLayout}. */
+    public void setViewPager(ViewPager2 viewPager) {
+        viewPager.registerOnPageChangeCallback(new SeparatedTabLayoutOnPageChangeCallback(this));
+        addOnTabSelectedListener(new SeparatedTabLayoutOnTabSelectedListener(viewPager));
+    }
+
+    private static class SeparatedTabLayoutOnTabSelectedListener implements
+            OnTabSelectedListener {
+        private final WeakReference<ViewPager2> mViewPagerRef;
+
+        private SeparatedTabLayoutOnTabSelectedListener(ViewPager2 viewPager) {
+            mViewPagerRef = new WeakReference<>(viewPager);
+        }
+
+        @Override
+        public void onTabSelected(Tab tab) {
+            ViewPager2 viewPager = mViewPagerRef.get();
+            if (viewPager != null && viewPager.getCurrentItem() != tab.getPosition()) {
+                viewPager.setCurrentItem(tab.getPosition());
+            }
+        }
+
+        @Override
+        public void onTabUnselected(Tab tab) {}
+
+        @Override
+        public void onTabReselected(Tab tab) {}
+    }
+
+    private static class SeparatedTabLayoutOnPageChangeCallback extends OnPageChangeCallback {
+        private final WeakReference<TabLayout> mTabLayoutRef;
+        private int mPreviousScrollState = SCROLL_STATE_IDLE;
+        private int mScrollState = SCROLL_STATE_IDLE;
+
+        private SeparatedTabLayoutOnPageChangeCallback(TabLayout tabLayout) {
+            mTabLayoutRef = new WeakReference<>(tabLayout);
+        }
+
+        @Override
+        public void onPageSelected(final int position) {
+            if (isUserDragging()) {
+                // Don't update tab position here, wait for page scrolling done to update the tabs.
+                return;
+            }
+            // ViewPager2#setCurrentItem would run into here.
+            updateTabPositionIfNeeded(position);
+        }
+
+        @Override
+        public void onPageScrollStateChanged(final int state) {
+            mPreviousScrollState = mScrollState;
+            mScrollState = state;
+        }
+
+        @Override
+        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+            // Update the tab when the scrolling page is full displayed and is user dragging case.
+            if (positionOffset == 0f && isUserDragging()) {
+                updateTabPositionIfNeeded(position);
+            }
+        }
+
+        private boolean isUserDragging() {
+            return mPreviousScrollState == SCROLL_STATE_DRAGGING
+                    && mScrollState == SCROLL_STATE_SETTLING;
+        }
+
+        private void updateTabPositionIfNeeded(int position) {
+            TabLayout tabLayout = mTabLayoutRef.get();
+            if (tabLayout != null
+                    && tabLayout.getSelectedTabPosition() != position
+                    && position < tabLayout.getTabCount()) {
+                tabLayout.selectTab(tabLayout.getTabAt(position), /* updateIndicator= */ true);
+            }
+        }
+    }
+}
diff --git a/src/com/android/wallpaper/widget/WallpaperInfoView.java b/src/com/android/wallpaper/widget/WallpaperInfoView.java
index db5e0e3..109279c 100644
--- a/src/com/android/wallpaper/widget/WallpaperInfoView.java
+++ b/src/com/android/wallpaper/widget/WallpaperInfoView.java
@@ -16,7 +16,6 @@
 package com.android.wallpaper.widget;
 
 import android.content.Context;
-import android.content.Intent;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.Button;
@@ -54,7 +53,7 @@
     /** Populates wallpaper info. */
     public void populateWallpaperInfo(@NonNull WallpaperInfo wallpaperInfo,
                                       CharSequence actionLabel,
-                                      @Nullable Intent exploreIntent,
+                                      boolean shouldShowExploreButton,
                                       OnClickListener exploreButtonClickListener) {
         final List<String> attributions = wallpaperInfo.getAttributions(getContext());
 
@@ -83,7 +82,7 @@
                 mSubtitle2.setText(attributions.get(2));
             }
 
-            if (exploreIntent != null) {
+            if (shouldShowExploreButton) {
                 mExploreButton.setVisibility(View.VISIBLE);
                 mExploreButton.setText(actionLabel);
                 mExploreButton.setOnClickListener(exploreButtonClickListener);
diff --git a/src/com/android/wallpaper/widget/WallpaperPickerRecyclerViewAccessibilityDelegate.java b/src/com/android/wallpaper/widget/WallpaperPickerRecyclerViewAccessibilityDelegate.java
index b983780..06e0dcf 100644
--- a/src/com/android/wallpaper/widget/WallpaperPickerRecyclerViewAccessibilityDelegate.java
+++ b/src/com/android/wallpaper/widget/WallpaperPickerRecyclerViewAccessibilityDelegate.java
@@ -15,10 +15,12 @@
  */
 package com.android.wallpaper.widget;
 
+import android.os.Bundle;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
 
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate;
 
@@ -46,6 +48,11 @@
          * Gets bottom sheet current state.
          */
         int getBottomSheetState();
+
+        /** Returns {@code true} if the bottom sheet is expanded. */
+        default boolean isExpanded() {
+            return getBottomSheetState() == BottomSheetBehavior.STATE_EXPANDED;
+        }
     }
 
     private final RecyclerView mGridRecyclerView;
@@ -67,11 +74,22 @@
             int itemPos = mGridRecyclerView.getChildLayoutPosition(child);
 
             // Expand the bottom sheet when TB travel to second column.
-            if (mBottomSheetHost != null && mBottomSheetHost.getBottomSheetState()
-                    != BottomSheetBehavior.STATE_EXPANDED && itemPos >= mColumns) {
+            if (mBottomSheetHost != null && !mBottomSheetHost.isExpanded()
+                    && itemPos >= mColumns) {
                 mBottomSheetHost.expandBottomSheet();
             }
         }
         return super.onRequestSendAccessibilityEvent(host, child, event);
     }
+
+    @Override
+    public boolean performAccessibilityAction(View host, int action, Bundle args) {
+        // Expand the bottom sheet when Switch Access scrolls down grid category.
+        if (action == AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD) {
+            if (mBottomSheetHost != null && !mBottomSheetHost.isExpanded()) {
+                mBottomSheetHost.expandBottomSheet();
+            }
+        }
+        return super.performAccessibilityAction(host, action, args);
+    }
 }
diff --git a/src_override/com/android/wallpaper/module/WallpapersInjector.java b/src_override/com/android/wallpaper/module/WallpapersInjector.java
index fa846a9..480eede 100755
--- a/src_override/com/android/wallpaper/module/WallpapersInjector.java
+++ b/src_override/com/android/wallpaper/module/WallpapersInjector.java
@@ -103,4 +103,9 @@
     public synchronized LoggingOptInStatusProvider getLoggingOptInStatusProvider(Context context) {
         return null;
     }
+
+    @Override
+    public String getDownloadableIntentAction() {
+        return null;
+    }
 }
diff --git a/tests/Android.bp b/tests/Android.bp
new file mode 100644
index 0000000..5d291be
--- /dev/null
+++ b/tests/Android.bp
@@ -0,0 +1,55 @@
+// 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.
+//
+
+//
+// Build rule for WallpaperPicker2 tests
+//
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+android_test {
+    name: "WallpaperPicker2Tests",
+
+    static_libs: [
+        "androidx.annotation_annotation",
+        "androidx.test.core",
+        "androidx.test.runner",
+        "androidx.test.rules",
+        "androidx.test.espresso.contrib",
+        "androidx.test.espresso.intents",
+        "mockito-target-minus-junit4",
+        "androidx.test.espresso.core",
+        "hamcrest-library",
+        "hamcrest",
+        "wallpaper-common-deps",
+    ],
+
+    platform_apis: true,
+
+
+    optimize: {
+        enabled: false,
+    },
+
+    srcs: [
+        "src/**/*.java",
+        "src/**/*.kt",
+    ],
+
+    manifest: "AndroidManifest.xml",
+
+    instrumentation_for: "WallpaperPicker2",
+}
diff --git a/tests/Android.mk b/tests/Android.mk
deleted file mode 100644
index ee7e5f3..0000000
--- a/tests/Android.mk
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright (C) 2019 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-#
-# Build rule for WallpaperPicker2 tests
-#
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
-    androidx.annotation_annotation \
-    androidx.test.core \
-    androidx.test.runner \
-    androidx.test.rules \
-    androidx.test.espresso.contrib \
-    androidx.test.espresso.intents \
-    mockito-target-minus-junit4 \
-    androidx.test.espresso.core \
-    hamcrest-library \
-    hamcrest
-
-ifneq (,$(wildcard frameworks/base))
-    LOCAL_PRIVATE_PLATFORM_APIS := true
-else
-    LOCAL_SDK_VERSION := 29
-    LOCAL_MIN_SDK_VERSION := 26
-endif
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_STATIC_ANDROID_LIBRARIES := WallpaperPicker2CommonDepsLib
-
-LOCAL_FULL_LIBS_MANIFEST_FILES := $(LOCAL_PATH)/AndroidManifest.xml
-LOCAL_MANIFEST_FILE := AndroidManifest.xml
-
-LOCAL_INSTRUMENTATION_FOR := WallpaperPicker2
-
-LOCAL_PACKAGE_NAME := WallpaperPicker2Tests
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-
-include $(BUILD_PACKAGE)
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/src/com/android/wallpaper/picker/PreviewActivityTest.java b/tests/src/com/android/wallpaper/picker/PreviewActivityTest.java
index 98855fa..eee481a 100644
--- a/tests/src/com/android/wallpaper/picker/PreviewActivityTest.java
+++ b/tests/src/com/android/wallpaper/picker/PreviewActivityTest.java
@@ -147,7 +147,7 @@
         launchActivityIntentWithMockWallpaper();
         assertNull(mWallpaperPersister.getCurrentHomeWallpaper());
 
-        onView(withId(R.id.preview_attribution_pane_set_wallpaper_button)).perform(click());
+        onView(withId(R.id.action_apply)).perform(click());
 
         // Destination dialog is shown; click "Home screen".
         onView(withText(R.string.set_wallpaper_home_screen_destination)).perform(click());
@@ -175,7 +175,7 @@
         launchActivityIntentWithMockWallpaper();
         assertNull(mWallpaperPersister.getCurrentLockWallpaper());
 
-        onView(withId(R.id.preview_attribution_pane_set_wallpaper_button)).perform(click());
+        onView(withId(R.id.action_apply)).perform(click());
 
         // Destination dialog is shown; click "Lock screen."
         onView(withText(R.string.set_wallpaper_lock_screen_destination)).perform(click());
@@ -204,7 +204,7 @@
         assertNull(mWallpaperPersister.getCurrentHomeWallpaper());
         assertNull(mWallpaperPersister.getCurrentLockWallpaper());
 
-        onView(withId(R.id.preview_attribution_pane_set_wallpaper_button)).perform(click());
+        onView(withId(R.id.action_apply)).perform(click());
 
         // Destination dialog is shown; click "Both."
         onView(withText(R.string.set_wallpaper_both_destination)).perform(click());
@@ -237,7 +237,7 @@
 
         mWallpaperPersister.setFailNextCall(true);
 
-        onView(withId(R.id.preview_attribution_pane_set_wallpaper_button)).perform(click());
+        onView(withId(R.id.action_apply)).perform(click());
 
         // Destination dialog is shown; click "Home screen."
         onView(withText(R.string.set_wallpaper_home_screen_destination)).perform(click());
@@ -276,7 +276,7 @@
 
         mWallpaperPersister.setFailNextCall(true);
 
-        onView(withId(R.id.preview_attribution_pane_set_wallpaper_button)).perform(click());
+        onView(withId(R.id.action_apply)).perform(click());
 
         // Destination dialog is shown; click "Lock screen."
         onView(withText(R.string.set_wallpaper_lock_screen_destination)).perform(click());
@@ -316,7 +316,7 @@
 
         mWallpaperPersister.setFailNextCall(true);
 
-        onView(withId(R.id.preview_attribution_pane_set_wallpaper_button)).perform(click());
+        onView(withId(R.id.action_apply)).perform(click());
 
         // Destination dialog is shown; click "Both."
         onView(withText(R.string.set_wallpaper_both_destination)).perform(click());
@@ -355,7 +355,7 @@
         // Scale should not have a meaningful value before clicking "set wallpaper".
         assertTrue(mWallpaperPersister.getScale() < 0);
 
-        onView(withId(R.id.preview_attribution_pane_set_wallpaper_button)).perform(click());
+        onView(withId(R.id.action_apply)).perform(click());
 
         // Destination dialog is shown; click "Home screen".
         onView(withText(R.string.set_wallpaper_home_screen_destination)).perform(click());
@@ -380,7 +380,7 @@
             throws Throwable {
         launchActivityIntentWithMockWallpaper();
         mWallpaperPersister.setFailNextCall(true);
-        onView(withId(R.id.preview_attribution_pane_set_wallpaper_button)).perform(click());
+        onView(withId(R.id.action_apply)).perform(click());
         // Destination dialog is shown; click "Home screen".
         onView(withText(R.string.set_wallpaper_home_screen_destination)).perform(click());
 
@@ -396,7 +396,7 @@
     @Test
     public void testClickSetWallpaper_ShowsDestinationDialog() {
         launchActivityIntentWithMockWallpaper();
-        onView(withId(R.id.preview_attribution_pane_set_wallpaper_button)).perform(click());
+        onView(withId(R.id.action_apply)).perform(click());
         onView(withText(R.string.set_wallpaper_dialog_message)).check(matches(isDisplayed()));
     }
 
@@ -451,7 +451,7 @@
         assertNotEquals(ActivityInfo.SCREEN_ORIENTATION_LOCKED, activity.getRequestedOrientation());
 
         // Show SetWallpaperDialog.
-        onView(withId(R.id.preview_attribution_pane_set_wallpaper_button)).perform(click());
+        onView(withId(R.id.action_apply)).perform(click());
 
         assertEquals(ActivityInfo.SCREEN_ORIENTATION_LOCKED, activity.getRequestedOrientation());
 
@@ -468,7 +468,7 @@
         assertNotEquals(ActivityInfo.SCREEN_ORIENTATION_LOCKED, activity.getRequestedOrientation());
 
         // Show SetWallpaperDialog.
-        onView(withId(R.id.preview_attribution_pane_set_wallpaper_button)).perform(click());
+        onView(withId(R.id.action_apply)).perform(click());
 
         // Destination dialog is shown; click "Home screen".
         onView(withText(R.string.set_wallpaper_home_screen_destination)).perform(click());
@@ -486,13 +486,13 @@
         launchActivityIntentWithMockWallpaper();
         PreviewActivity activity = mActivityRule.getActivity();
 
-        TextView titleView = activity.findViewById(R.id.preview_attribution_pane_title);
+        TextView titleView = activity.findViewById(R.id.wallpaper_info_title);
         assertEquals("Title", titleView.getText());
 
-        TextView subtitle1View = activity.findViewById(R.id.preview_attribution_pane_subtitle1);
+        TextView subtitle1View = activity.findViewById(R.id.wallpaper_info_subtitle1);
         assertEquals("Subtitle 1", subtitle1View.getText());
 
-        TextView subtitle2View = activity.findViewById(R.id.preview_attribution_pane_subtitle2);
+        TextView subtitle2View = activity.findViewById(R.id.wallpaper_info_subtitle2);
         assertEquals("Subtitle 2", subtitle2View.getText());
     }
 
@@ -522,7 +522,7 @@
         mExploreIntentChecker.setViewHandlerExists(false);
 
         launchActivityIntentWithMockWallpaper();
-        onView(withId(R.id.preview_attribution_pane_explore_button)).check(
+        onView(withId(R.id.wallpaper_info_explore_button)).check(
                 matches(not(isDisplayed())));
     }
 }
diff --git a/tests/src/com/android/wallpaper/picker/individual/IndividualPickerActivityTest.java b/tests/src/com/android/wallpaper/picker/individual/IndividualPickerActivityTest.java
index c9170bc..93c2b01 100644
--- a/tests/src/com/android/wallpaper/picker/individual/IndividualPickerActivityTest.java
+++ b/tests/src/com/android/wallpaper/picker/individual/IndividualPickerActivityTest.java
@@ -42,7 +42,6 @@
 import android.content.Intent;
 
 import androidx.recyclerview.widget.RecyclerView;
-import androidx.test.espresso.contrib.RecyclerViewActions;
 import androidx.test.espresso.intent.Intents;
 import androidx.test.filters.MediumTest;
 import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
@@ -55,7 +54,6 @@
 import com.android.wallpaper.model.WallpaperInfo;
 import com.android.wallpaper.model.WallpaperRotationInitializer;
 import com.android.wallpaper.model.WallpaperRotationInitializer.RotationInitializationState;
-import com.android.wallpaper.module.FormFactorChecker;
 import com.android.wallpaper.module.Injector;
 import com.android.wallpaper.module.InjectorProvider;
 import com.android.wallpaper.testing.TestCategoryProvider;
@@ -63,6 +61,7 @@
 import com.android.wallpaper.testing.TestInjector;
 import com.android.wallpaper.testing.TestWallpaperCategory;
 import com.android.wallpaper.testing.TestWallpaperInfo;
+import com.android.wallpaper.testing.TestWallpaperPreferences;
 import com.android.wallpaper.testing.TestWallpaperRotationInitializer;
 
 import org.hamcrest.Matcher;
@@ -99,6 +98,9 @@
 
     private TestWallpaperCategory mTestCategory;
 
+    private TestWallpaperPreferences mPreferences;
+    private ArrayList<WallpaperInfo> mWallpapers;
+
     @Rule
     public ActivityTestRule<IndividualPickerActivity> mActivityRule =
             new ActivityTestRule<>(IndividualPickerActivity.class, false, false);
@@ -116,6 +118,15 @@
 
         sWallpaperInfo1.setAttributions(Arrays.asList(
                 "Attribution 0", "Attribution 1", "Attribution 2"));
+
+        sWallpaperInfo1.setCollectionId("collection");
+
+        mPreferences = (TestWallpaperPreferences) mInjector.getPreferences(context);
+
+        mWallpapers = new ArrayList<>();
+        mWallpapers.add(sWallpaperInfo1);
+        mWallpapers.add(sWallpaperInfo2);
+        mWallpapers.add(sWallpaperInfo3);
     }
 
     @After
@@ -136,15 +147,8 @@
 
     private void setActivityWithMockWallpapers(boolean isRotationEnabled,
             @RotationInitializationState int rotationState) {
-        sWallpaperInfo1.setCollectionId("collection");
-
-        ArrayList<WallpaperInfo> wallpapers = new ArrayList<>();
-        wallpapers.add(sWallpaperInfo1);
-        wallpapers.add(sWallpaperInfo2);
-        wallpapers.add(sWallpaperInfo3);
-
         mTestCategory = new TestWallpaperCategory(
-                "Test category", "collection", wallpapers, 0 /* priority */);
+                "Test category", "collection", mWallpapers, 0 /* priority */);
         mTestCategory.setIsRotationEnabled(isRotationEnabled);
         mTestCategory.setRotationInitializationState(rotationState);
 
@@ -176,22 +180,6 @@
     }
 
     @Test
-    public void testClickTile_Mobile_showsBottomActions() {
-        mTestFormFactorChecker.setFormFactor(FormFactorChecker.FORM_FACTOR_MOBILE);
-
-        setActivityWithMockWallpapers(false /* isRotationEnabled */,
-                WallpaperRotationInitializer.ROTATION_NOT_INITIALIZED);
-        getActivity();
-
-        onView(withId(R.id.wallpaper_grid)).perform(
-                RecyclerViewActions.actionOnItemAtPosition(0, click()));
-
-        onView(withId(R.id.action_back)).check(matches(isDisplayed()));
-        onView(withId(R.id.action_information)).check(matches(isDisplayed()));
-        onView(withId(R.id.action_apply)).check(matches(isDisplayed()));
-    }
-
-    @Test
     public void testClickDailyRefreshAction_ShowsStartRotationDialog() {
         setActivityWithMockWallpapers(true /* isRotationEnabled */,
                 WallpaperRotationInitializer.ROTATION_NOT_INITIALIZED);
@@ -406,4 +394,50 @@
         assertEquals("Attribution 0", holder.itemView.findViewById(R.id.tile)
                 .getContentDescription());
     }
+
+    /**
+     * Tests whether the selected wallpaper has a clipped thumbnail: first wallpaper.
+     */
+    @Test
+    public void testSelectFirstWallpaper_ShowsClippedThumbnail() {
+        runSelectWallpaperTest(0);
+    }
+
+    /**
+     * Tests whether the selected wallpaper has a clipped thumbnail: second wallpaper.
+     */
+    @Test
+    public void testSelectSecondWallpaper_ShowsClippedThumbnail() {
+        runSelectWallpaperTest(1);
+    }
+
+    /**
+     * Tests whether the selected wallpaper has a clipped thumbnail: third wallpaper.
+     */
+    @Test
+    public void testSelectThirdWallpaper_ShowsClippedThumbnail() {
+        runSelectWallpaperTest(2);
+    }
+
+    private void runSelectWallpaperTest(int selectedWallpaperIndex) {
+        mPreferences.setHomeWallpaperRemoteId(
+                mWallpapers.get(selectedWallpaperIndex).getWallpaperId());
+
+        setActivityWithMockWallpapers(false /* isRotationEnabled */,
+                WallpaperRotationInitializer.ROTATION_NOT_INITIALIZED);
+        IndividualPickerActivity activity = getActivity();
+
+        RecyclerView recyclerView = activity.findViewById(R.id.wallpaper_grid);
+
+        for (int index = 0; index < 3; index++) {
+            assertNotNull(recyclerView.findViewHolderForAdapterPosition(index));
+
+            CustomShapeImageView thumbnail =
+                    recyclerView.findViewHolderForAdapterPosition(index)
+                            .itemView.findViewById(R.id.thumbnail);
+
+            // Assert that only the selected wallpaper has a clipped thumbnail.
+            assertEquals(thumbnail.getClipped(), index == selectedWallpaperIndex);
+        }
+    }
 }
diff --git a/tests/src/com/android/wallpaper/testing/TestAsset.java b/tests/src/com/android/wallpaper/testing/TestAsset.java
index 368919a..505946a 100644
--- a/tests/src/com/android/wallpaper/testing/TestAsset.java
+++ b/tests/src/com/android/wallpaper/testing/TestAsset.java
@@ -62,7 +62,7 @@
 
     @Override
     public void decodeBitmapRegion(Rect unused, int targetWidth, int targetHeight,
-            BitmapReceiver receiver) {
+            boolean shouldAdjustForRtl, BitmapReceiver receiver) {
         receiver.onBitmapDecoded(mBitmap);
     }
 
diff --git a/tests/src/com/android/wallpaper/testing/TestBitmapCropper.java b/tests/src/com/android/wallpaper/testing/TestBitmapCropper.java
index 7daeeab..778561d 100644
--- a/tests/src/com/android/wallpaper/testing/TestBitmapCropper.java
+++ b/tests/src/com/android/wallpaper/testing/TestBitmapCropper.java
@@ -34,7 +34,7 @@
     }
 
     @Override
-    public void cropAndScaleBitmap(Asset asset, float scale, Rect cropRect,
+    public void cropAndScaleBitmap(Asset asset, float scale, Rect cropRect, boolean adjustRtl,
             Callback callback) {
         if (mFailNextCall) {
             callback.onError(null /* throwable */);
@@ -47,7 +47,7 @@
                 Math.round((float) cropRect.right / scale),
                 Math.round((float) cropRect.bottom / scale));
 
-        asset.decodeBitmapRegion(scaledCropRect, cropRect.width(), cropRect.height(),
+        asset.decodeBitmapRegion(scaledCropRect, cropRect.width(), cropRect.height(), adjustRtl,
                 new BitmapReceiver() {
                     @Override
                     public void onBitmapDecoded(Bitmap bitmap) {
diff --git a/tests/src/com/android/wallpaper/testing/TestCategoryProvider.java b/tests/src/com/android/wallpaper/testing/TestCategoryProvider.java
index 9354958..d6fa979 100644
--- a/tests/src/com/android/wallpaper/testing/TestCategoryProvider.java
+++ b/tests/src/com/android/wallpaper/testing/TestCategoryProvider.java
@@ -93,8 +93,14 @@
     }
 
     @Override
-    public void resetIfNeeded() {
+    public boolean resetIfNeeded() {
         mCategories.clear();
+        return true;
+    }
+
+    @Override
+    public boolean isFeaturedCollectionAvailable() {
+        return false;
     }
 
     /** Returns a list of test Category objects used by this TestCategoryProvider. */
diff --git a/tests/src/com/android/wallpaper/testing/TestInjector.java b/tests/src/com/android/wallpaper/testing/TestInjector.java
index 9b7927f..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;
@@ -243,10 +244,20 @@
     }
 
     @Override
+    public String getDownloadableIntentAction() {
+        return null;
+    }
+
+    @Override
     public PerformanceMonitor getPerformanceMonitor() {
         if (mPerformanceMonitor == null) {
             mPerformanceMonitor = new TestPerformanceMonitor();
         }
         return mPerformanceMonitor;
     }
+
+    @Override
+    public CustomizationSections getCustomizationSections() {
+        return null;
+    }
 }
diff --git a/tests/src/com/android/wallpaper/testing/TestUserEventLogger.java b/tests/src/com/android/wallpaper/testing/TestUserEventLogger.java
index 63ae94e..bb70e93 100644
--- a/tests/src/com/android/wallpaper/testing/TestUserEventLogger.java
+++ b/tests/src/com/android/wallpaper/testing/TestUserEventLogger.java
@@ -15,6 +15,8 @@
  */
 package com.android.wallpaper.testing;
 
+import android.content.Intent;
+
 import com.android.wallpaper.module.UserEventLogger;
 import com.android.wallpaper.module.WallpaperPersister.WallpaperPosition;
 
@@ -66,7 +68,7 @@
     }
 
     @Override
-    public void logAppLaunched() {
+    public void logAppLaunched(Intent launchSource) {
         // Do nothing.
     }
 
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);