[automerger skipped] Import translations. DO NOT MERGE ANYWHERE am: 880a85a41c -s ours

am skip reason: subject contains skip directive

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

Change-Id: Iedd02e52bce6a40e27e1d9a8f848e2b8f7c1b17f
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/Android.bp b/Android.bp
index 57d30ce..c85fd2b 100644
--- a/Android.bp
+++ b/Android.bp
@@ -69,12 +69,19 @@
     name: "ThemePicker",
 
     static_libs: [
+        "guava",
+        "monet",
+	"renderscript_toolkit",
         "wallpaper-common-deps",
         "SettingsLibSettingsTheme",
         "SystemUI-statsd",
         "styleprotoslite",
     ],
 
+    jni_libs: [
+        "librenderscript-toolkit",
+    ],
+
     srcs: [
         ":WallpaperPicker2_srcs",
         ":ThemePicker_srcs",
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c6e79a9..ff8f187 100755
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -57,9 +57,26 @@
             android:theme="@style/CustomizationTheme.NoActionBar"
             android:exported="false"/>
 
+        <activity
+            tools:node="replace"
+            android:name="com.android.wallpaper.picker.PassThroughCustomizationPickerActivity"
+            android:label="@string/app_name"
+            android:resizeableActivity="false"
+            android:theme="@style/CustomizationTheme.NoActionBar"
+            android:exported="false"/>
+
+        <activity
+            tools:node="replace"
+            android:name="com.android.wallpaper.picker.TrampolinePickerActivity"
+            android:label="@string/app_name"
+            android:relinquishTaskIdentity="true"
+            android:resizeableActivity="false"
+            android:theme="@style/CustomizationTheme.NoActionBar"
+            android:exported="false"/>
+
         <activity-alias
             android:name="com.android.customization.picker.CustomizationPickerActivity"
-            android:targetActivity="com.android.wallpaper.picker.CustomizationPickerActivity"
+            android:targetActivity="com.android.wallpaper.picker.TrampolinePickerActivity"
             android:label="@string/app_name"
             android:exported="true">
              <intent-filter>
diff --git a/res/drawable/color_chip_seed_filled0.xml b/res/drawable/color_chip_seed_filled0.xml
new file mode 100644
index 0000000..a93bc6b
--- /dev/null
+++ b/res/drawable/color_chip_seed_filled0.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+     Copyright (C) 2022 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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>
+        <shape android:shape="rectangle">
+            <corners
+                android:topLeftRadius="@dimen/component_color_chip_small_size_default" />
+            <size
+                android:width="@dimen/component_color_chip_small_size_default"
+                android:height="@dimen/component_color_chip_small_size_default" />
+            <solid android:color="@android:color/black" />
+        </shape>
+    </item>
+</selector>
\ No newline at end of file
diff --git a/res/drawable/color_chip_seed_filled1.xml b/res/drawable/color_chip_seed_filled1.xml
new file mode 100644
index 0000000..a0672bc
--- /dev/null
+++ b/res/drawable/color_chip_seed_filled1.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+     Copyright (C) 2022 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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>
+         <shape android:shape="rectangle">
+            <corners
+                android:bottomLeftRadius="@dimen/component_color_chip_small_size_default" />
+            <size
+                android:width="@dimen/component_color_chip_small_size_default"
+                android:height="@dimen/component_color_chip_small_size_default" />
+            <solid android:color="@android:color/black" />
+        </shape>
+    </item>
+</selector>
\ No newline at end of file
diff --git a/res/drawable/color_chip_seed_filled2.xml b/res/drawable/color_chip_seed_filled2.xml
new file mode 100644
index 0000000..545fbdd
--- /dev/null
+++ b/res/drawable/color_chip_seed_filled2.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+     Copyright (C) 2022 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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>
+        <shape android:shape="rectangle">
+            <corners
+                android:topRightRadius="@dimen/component_color_chip_small_size_default" />
+            <size
+                android:width="@dimen/component_color_chip_small_size_default"
+                android:height="@dimen/component_color_chip_small_size_default" />
+            <solid android:color="@android:color/black" />
+        </shape>
+    </item>
+</selector>
\ No newline at end of file
diff --git a/res/drawable/color_chip_seed_filled3.xml b/res/drawable/color_chip_seed_filled3.xml
new file mode 100644
index 0000000..0e286a5
--- /dev/null
+++ b/res/drawable/color_chip_seed_filled3.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+     Copyright (C) 2022 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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>
+        <shape android:shape="rectangle">
+            <corners
+                android:bottomRightRadius="@dimen/component_color_chip_small_size_default" />
+            <size
+                android:width="@dimen/component_color_chip_small_size_default"
+                android:height="@dimen/component_color_chip_small_size_default" />
+            <solid android:color="@android:color/black" />
+        </shape>
+    </item>
+</selector>
\ No newline at end of file
diff --git a/res/layout-land/fragment_grid_picker.xml b/res/layout-land/fragment_grid_picker.xml
index 2861e7d..0fd52c8 100644
--- a/res/layout-land/fragment_grid_picker.xml
+++ b/res/layout-land/fragment_grid_picker.xml
@@ -26,35 +26,41 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent">
 
-        <LinearLayout
-        android:id="@+id/content_section"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="horizontal">
-        <FrameLayout
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:clipToPadding="false"
-            android:paddingTop="@dimen/preview_content_padding_top"
-            android:paddingBottom="@dimen/preview_content_padding_bottom"
-            android:background="?android:colorSecondary">
-            <include layout="@layout/grid_preview_card"/>
-        </FrameLayout>
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/content_section"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
 
-        <FrameLayout
-            android:id="@+id/options_section"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:paddingVertical="10dp">
+            <FrameLayout
+                android:id="@+id/preview_card_container"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:background="?android:colorSecondary"
+                android:clipToPadding="false"
+                android:paddingBottom="@dimen/preview_content_padding_bottom"
+                android:paddingTop="@dimen/preview_content_padding_top"
+                app:layout_constraintHorizontal_weight="1"
+                app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintRight_toLeftOf="@+id/options_section">
+                <include layout="@layout/grid_preview_card"/>
+            </FrameLayout>
 
-            <androidx.recyclerview.widget.RecyclerView
-                android:id="@+id/options_container"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"/>
-        </FrameLayout>
-    </LinearLayout>
+            <FrameLayout
+                android:id="@+id/options_section"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:paddingVertical="10dp"
+                app:layout_constraintHorizontal_weight="1"
+                app:layout_constraintLeft_toRightOf="@+id/preview_card_container"
+                app:layout_constraintRight_toRightOf="parent">
+
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/options_container"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"/>
+            </FrameLayout>
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
         <androidx.core.widget.ContentLoadingProgressBar
             android:id="@+id/loading_indicator"
             style="@android:style/Widget.DeviceDefault.ProgressBar"
diff --git a/res/layout/color_option.xml b/res/layout/color_option.xml
new file mode 100644
index 0000000..9bbfd7f
--- /dev/null
+++ b/res/layout/color_option.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2022 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:clipChildren="false"
+    android:clipToPadding="false"
+    android:orientation="vertical">
+
+    <FrameLayout
+        android:id="@+id/option_tile"
+        android:layout_width="@dimen/option_tile_width"
+        android:layout_height="@dimen/option_tile_width"
+        android:layout_gravity="center_horizontal"
+        android:background="@drawable/option_border_color">
+        <ImageView
+            android:id="@+id/color_preview_0"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:layout_marginRight="@dimen/color_seed_chip_margin"
+            android:layout_marginBottom="@dimen/color_seed_chip_margin"
+            android:src="@drawable/color_chip_seed_filled0"/>
+        <ImageView
+            android:id="@+id/color_preview_1"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:layout_marginLeft="@dimen/color_seed_chip_margin"
+            android:layout_marginBottom="@dimen/color_seed_chip_margin"
+            android:src="@drawable/color_chip_seed_filled2"/>
+        <ImageView
+            android:id="@+id/color_preview_2"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:layout_marginRight="@dimen/color_seed_chip_margin"
+            android:layout_marginTop="@dimen/color_seed_chip_margin"
+            android:src="@drawable/color_chip_seed_filled1"/>
+        <ImageView
+            android:id="@+id/color_preview_3"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:layout_marginLeft="@dimen/color_seed_chip_margin"
+            android:layout_marginTop="@dimen/color_seed_chip_margin"
+            android:src="@drawable/color_chip_seed_filled3"/>
+    </FrameLayout>
+</FrameLayout>
diff --git a/res/layout/color_options_view.xml b/res/layout/color_options_view.xml
new file mode 100644
index 0000000..65028a6
--- /dev/null
+++ b/res/layout/color_options_view.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2022 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/color_option_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal"
+        android:orientation="horizontal" />
+</FrameLayout>
diff --git a/res/layout/color_pages_view.xml b/res/layout/color_pages_view.xml
new file mode 100644
index 0000000..3ccbd41
--- /dev/null
+++ b/res/layout/color_pages_view.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2022 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <androidx.viewpager2.widget.ViewPager2
+        android:id="@+id/color_page_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+    <com.android.wallpaper.widget.PageIndicator
+        android:id="@+id/color_page_indicator"
+        android:layout_marginTop="@dimen/color_page_indicator_margin_top"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:visibility="gone"
+        android:layout_gravity="center"/>
+</LinearLayout>
diff --git a/res/layout/color_section_view.xml b/res/layout/color_section_view.xml
new file mode 100644
index 0000000..6095c9b
--- /dev/null
+++ b/res/layout/color_section_view.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2022 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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.customization.picker.color.ColorSectionView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingBottom="@dimen/section_bottom_padding"
+    android:orientation="vertical">
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingHorizontal="@dimen/separated_tabs_horizontal_padding">
+        <include layout="@layout/separated_tabs" />
+    </FrameLayout>
+
+    <androidx.viewpager2.widget.ViewPager2
+        android:id="@+id/color_section_view_pager"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/color_options_container_top_margin"
+        android:clipChildren="false"
+        android:clipToPadding="false"/>
+</com.android.customization.picker.color.ColorSectionView>
diff --git a/res/layout/fragment_grid_picker.xml b/res/layout/fragment_grid_picker.xml
index aec8e49..34547fc 100644
--- a/res/layout/fragment_grid_picker.xml
+++ b/res/layout/fragment_grid_picker.xml
@@ -33,8 +33,8 @@
 
             <FrameLayout
                 android:id="@+id/preview_card_container"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
                 android:clipToPadding="false"
                 android:paddingTop="@dimen/preview_page_top_margin"
                 android:paddingBottom="@dimen/preview_page_bottom_margin"
@@ -42,7 +42,8 @@
                 app:layout_constraintBottom_toTopOf="@+id/options_container"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent">
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintVertical_bias="@dimen/preview_card_vertical_bias">
 
                 <include layout="@layout/grid_preview_card" />
             </FrameLayout>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 1d2b248..4a6733e 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Tema-ikone"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Verander programrooster"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Muurpapierkleure"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Muurpapierkleur"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Basiese kleure"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Kleur het verander"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamies"</string>
 </resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index ded03a2..592ad89 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"ገጽታ ያላቸው አዶዎች"</string>
     <string name="beta_title" msgid="8703819523760746458">"ቤታ"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"የመተግበሪያ ፍርግርግን ይቀይሩ"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"የልጣፍ ቀለማት"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"የልጣፍ ቀለም"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"መሰረታዊ ቀለሞች"</string>
+    <string name="color_changed" msgid="7029571720331641235">"ቀለም ተቀይሯል"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ተለዋዋጭ"</string>
 </resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 8b4af4c..ef802d2 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"رموز مستوحاة من موضوع معيّن"</string>
     <string name="beta_title" msgid="8703819523760746458">"تجريبي"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"تغيير شبكة التطبيقات"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"ألوان الخلفية"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"لون الخلفية"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"الألوان الأساسية"</string>
+    <string name="color_changed" msgid="7029571720331641235">"تم تغيير اللون."</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ألوان ديناميكية"</string>
 </resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 249f655..fb72239 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"থীমযুক্ত চিহ্ন"</string>
     <string name="beta_title" msgid="8703819523760746458">"বিটা"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"এপৰ গ্ৰিড সলনি কৰক"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"ৱালপেপাৰৰ ৰং"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"ৱালপেপাৰৰ ৰং"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"প্ৰাথমিক ৰং"</string>
+    <string name="color_changed" msgid="7029571720331641235">"ৰং সলনি কৰা হৈছে"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ডাইনামিক"</string>
 </resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 0c6efab..2d8209b 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Temalı ikonalar"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Tətbiq torunu dəyişin"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Divar kağızı rəngləri"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Divar kağızı rəngi"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Əsas rənglər"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Rəng dəyişdirildi"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamik"</string>
 </resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 35a35fe..d8aacd6 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Tematske ikone"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Promenite mrežu aplikacija"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Boje pozadine"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Boja pozadine"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Osnovne boje"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Boja je promenjena"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamički"</string>
 </resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 13ad63e..4151478 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Тэматычныя значкі"</string>
     <string name="beta_title" msgid="8703819523760746458">"Бэта"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Змяніць сетку праграм"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Колеры шпалер"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Колер шпалер"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Асноўныя колеры"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Колер зменены"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Дынамічны"</string>
 </resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 8f19803..849af69 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Икони с теми"</string>
     <string name="beta_title" msgid="8703819523760746458">"Бета"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Промяна на решетката с приложения"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Цветове от тапета"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Цвят от тапета"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Основни цветове"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Цветът бе променен"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Динамично"</string>
 </resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 2e94198..b1c9abe 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"থিমযুক্ত আইকন"</string>
     <string name="beta_title" msgid="8703819523760746458">"বিটা"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"অ্যাপ গ্রিড পরিবর্তন করুন"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"ওয়ালপেপারের রঙ"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"ওয়ালপেপারের রঙ"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"প্রাথমিক রঙ"</string>
+    <string name="color_changed" msgid="7029571720331641235">"রঙ পরিবর্তন করা হয়েছে"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ডায়নামিক"</string>
 </resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 29075d6..11c4587 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Tematske ikone"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Promjena mreže aplikacije"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Boje pozadinske slike"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Boja pozadinske slike"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Osnovne boje"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Boja je promijenjena"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamički"</string>
 </resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index c8fdb3d..f9a3a33 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Icones temàtiques"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Canvia la quadrícula d\'aplicacions"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Colors del fons"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Color del fons de pantalla"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Colors bàsics"</string>
+    <string name="color_changed" msgid="7029571720331641235">"S\'ha canviat el color"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinàmic"</string>
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 0b3bf29..3bdbe89 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Tematické ikony"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Změnit mřížku aplikací"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Barvy tapety"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Barva tapety"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Základní barvy"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Barva byla změněna"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamické"</string>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index ee0888a..68fe7b3 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Temaikoner"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Juster appgitter"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Baggrundsfarver"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Baggrundsfarve"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Standardfarver"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Farven er ændret"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamisk"</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 6a83d72..c55bffb 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Symboldesigns"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"App-Raster ändern"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Hintergrundfarben"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Hintergrundfarbe"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Standardfarben"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Farbe geändert"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamisch"</string>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index c067781..db4400f 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Θεματικά εικονίδια"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Αλλαγή πλέγματος εφαρμογής"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Χρώματα ταπετσαρίας"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Χρώμα ταπετσαρίας"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Βασικά χρώματα"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Το χρώμα άλλαξε"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Δυναμική"</string>
 </resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 953a985..afd6deb 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Themed icons"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Change app grid"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Wallpaper colours"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Wallpaper colour"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Basic colours"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Colour changed"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamic"</string>
 </resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 953a985..afd6deb 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Themed icons"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Change app grid"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Wallpaper colours"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Wallpaper colour"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Basic colours"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Colour changed"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamic"</string>
 </resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 953a985..afd6deb 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Themed icons"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Change app grid"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Wallpaper colours"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Wallpaper colour"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Basic colours"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Colour changed"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamic"</string>
 </resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 953a985..afd6deb 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Themed icons"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Change app grid"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Wallpaper colours"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Wallpaper colour"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Basic colours"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Colour changed"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamic"</string>
 </resources>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index fae727a..8ed71cd 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‎‎‏‎‎‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‏‏‎‎‎‏‎‎‎‎‏‎‎‏‏‏‎‎Themed icons‎‏‎‎‏‎"</string>
     <string name="beta_title" msgid="8703819523760746458">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‎‏‏‏‏‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‏‏‎‏‏‎‏‎‎Beta‎‏‎‎‏‎"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎‏‏‏‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎Change app grid‎‏‎‎‏‎"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‎‏‎‎‎‎‎‏‎‏‎‎‎‎‎‏‏‎‎‏‎‏‎‏‏‏‎‏‎‏‏‏‎‎‎‎‎‎‎Wallpaper colors‎‏‎‎‏‎"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‏‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‏‏‏‎‎‎‎‏‎‎‎‎‏‎‏‏‎‏‎‎Wallpaper color‎‏‎‎‏‎"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‏‎‎‎‏‏‎‏‏‎‎‎‏‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‎‏‏‏‎‏‎‎‎‏‎‎Basic colors‎‏‎‎‏‎"</string>
+    <string name="color_changed" msgid="7029571720331641235">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‏‎‎‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎‎‏‎‎‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‎‏‎‎‏‏‎Color changed‎‏‎‎‏‎"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‏‏‏‏‏‎‏‎‏‏‎‏‎‎‎‏‎‏‏‎‏‎‏‏‏‏‎‎‎‏‏‏‎‎‎‏‏‎‏‎Dynamic‎‏‎‎‏‎"</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 50b3bc5..0eb30c7 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Íconos temáticos"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Cambiar cuadrícula de apps"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Colores del fondo"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Color del fondo de pantalla"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Colores básicos"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Se cambió el color"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinámico"</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 17cfabe..c45e390 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Iconos con tema"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Cambiar cuadrícula de aplicaciones"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Colores del fondo"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Color del fondo de pantalla"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Colores básicos"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Color cambiado"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinámico"</string>
 </resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index f444cb2..2a6e051 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Temaatilised ikoonid"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beeta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Rakenduste ruudustiku muutmine"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Taustapildi värvid"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Taustapildi värv"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Põhivärvid"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Värvi muudeti"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dünaamiline"</string>
 </resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 7e4b016..7944b93 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Ikono gaidunak"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Aldatu aplikazioen sareta"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Horma-papereko koloreak"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Horma-paperaren kolorea"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Oinarrizko koloreak"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Aldatu da kolorea"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamikoa"</string>
 </resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 500af38..4a5f763 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"نمادهای دارای زمینه"</string>
     <string name="beta_title" msgid="8703819523760746458">"بتا"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"تغییر جدول برنامه"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"رنگ‌های کاغذدیواری"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"رنگ کاغذدیواری"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"رنگ‌های اصلی"</string>
+    <string name="color_changed" msgid="7029571720331641235">"رنگ تغییر کرد"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"پویا"</string>
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 1d393ee..37f57b8 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Kuvakkeiden teemat"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Muuta sovellusruudukkoa"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Taustakuvan värit"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Taustakuvan väri"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Perusvärit"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Väri vaihdettu"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynaaminen"</string>
 </resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 57f348e..c271e5c 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Icônes du thème"</string>
     <string name="beta_title" msgid="8703819523760746458">"Bêta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Modifiez la grille d\'applications"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Couleurs fond d\'écran"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Couleur du fond d\'écran"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Couleurs de base"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Couleur changée"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamique"</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index b436871..f6b5546 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Icônes à thème"</string>
     <string name="beta_title" msgid="8703819523760746458">"Bêta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Modifier la grille d\'applis"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Couleurs fond d\'écran"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Couleur du fond d\'écran"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Couleurs de base"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Couleur modifiée"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamique"</string>
 </resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index de26228..5b90944 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Tema das iconas"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Cambia a grade de aplicacións"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Cores do fondo"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Cor do fondo de pantalla"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Cores básicas"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Cor modificada"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinámica"</string>
 </resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index e2bed3f..1ff79ad 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"થીમવાળા આઇકન"</string>
     <string name="beta_title" msgid="8703819523760746458">"બીટા"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"ઍપ ગ્રિડ બદલો"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"વૉલપેપરના રંગો"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"વૉલપેપરનો રંગ"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"મૂળભૂત રંગો"</string>
+    <string name="color_changed" msgid="7029571720331641235">"રંગ બદલ્યો છે"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ડાઇનૅમિક"</string>
 </resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 43fb23b..a207bfe 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"थीम वाले आइकॉन"</string>
     <string name="beta_title" msgid="8703819523760746458">"बीटा"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"ऐप्लिकेशन ग्रिड बदलें"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"वॉलपेपर के रंग"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"वॉलपेपर का रंग"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"सामान्य रंग"</string>
+    <string name="color_changed" msgid="7029571720331641235">"रंग बदल दिया गया है"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"डाइनैमिक"</string>
 </resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 30bbd97..b603fa6 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Tematske ikone"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Promjena rešetke aplikacije"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Boje pozadine"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Boja pozadine"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Osnovne boje"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Promijenjena boja"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamično"</string>
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 6ebbc07..620d36c 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Tematikus ikonok"</string>
     <string name="beta_title" msgid="8703819523760746458">"Béta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Alkalmazásrács módosítása"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Háttérképszínek"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Háttérkép színe"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Alapszínek"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Szín módosítva"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamikus"</string>
 </resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index a7b9bcd..7c7d059 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Թեմատիկ պատկերակներ"</string>
     <string name="beta_title" msgid="8703819523760746458">"Բետա"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Փոխել հավելվածների ցանցը"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Պաստառի գույներ"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Պաստառի գույն"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Հիմնական գույներ"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Գույնը փոխվեց"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Դինամիկ"</string>
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 60bfcb9..7e48536 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Ikon bertema"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Ubah petak aplikasi"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Warna wallpaper"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Warna wallpaper"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Warna dasar"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Warna diubah"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamis"</string>
 </resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 69eb141..9312a5c 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Þematákn"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Breyta forritatöflu"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Veggfóðurslitir"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Veggfóðurslitur"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Grunnlitir"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Lit breytt"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Breytilegt"</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index b74912d..08df999 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Icone a tema"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Cambia griglia di app"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Colori di sfondo"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Colore dello sfondo"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Colori di base"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Colore modificato"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamica"</string>
 </resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 876a60a..5d9e2d9 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"סמלים מעוצבים"</string>
     <string name="beta_title" msgid="8703819523760746458">"בטא"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"שינוי רשת האפליקציות"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"צבעי הטפט"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"צבע הטפט"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"הצבעים הבסיסיים"</string>
+    <string name="color_changed" msgid="7029571720331641235">"הצבע השתנה"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"דינמי"</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 29cb668..f6a20d3 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"テーマアイコン"</string>
     <string name="beta_title" msgid="8703819523760746458">"ベータ版"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"アプリグリッドを変更します"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"壁紙の色"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"壁紙の色"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"基本の色"</string>
+    <string name="color_changed" msgid="7029571720331641235">"色を変更しました"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"動的"</string>
 </resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index a74d2fa..7fb2f96 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"თემატური ხატულები"</string>
     <string name="beta_title" msgid="8703819523760746458">"ბეტა"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"აპების ბადის შეცვლა"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"ფონის ფერები"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"ფონის ფერი"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"ძირითადი ფერები"</string>
+    <string name="color_changed" msgid="7029571720331641235">"ფერი შეიცვალა"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"დინამიკური"</string>
 </resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index cbd2ebc..c62d6a0 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Тақырыптық белгішелер"</string>
     <string name="beta_title" msgid="8703819523760746458">"Бета"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Қолданбалар торын өзгерту"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Тұсқағаз түстері"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Тұсқағаз түсі"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Негізгі түстер"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Түс өзгертілді."</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Динамикалық"</string>
 </resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 00eea2f..02080a7 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"រូបតំណាងប្ដូររចនាប័ទ្ម"</string>
     <string name="beta_title" msgid="8703819523760746458">"បេតា"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"ប្ដូរ​ក្រឡា​កម្មវិធី"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"ពណ៌ផ្ទាំងរូបភាព"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"ពណ៌​ផ្ទាំងរូបភាព"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"ពណ៌​លំនាំដើម"</string>
+    <string name="color_changed" msgid="7029571720331641235">"បាន​ផ្លាស់ប្ដូរ​ពណ៌"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ឌីណាមិក"</string>
 </resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 1ed1847..95d8df3 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"ಥೀಮ್ ಮಾಡಿದ ಐಕಾನ್‌ಗಳು"</string>
     <string name="beta_title" msgid="8703819523760746458">"ಬೀಟಾ"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"ಆ್ಯಪ್ ಗ್ರಿಡ್ ಬದಲಾಯಿಸಿ"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"ವಾಲ್‌ಪೇಪರ್ ಬಣ್ಣಗಳು"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"ವಾಲ್‌ಪೇಪರ್ ಬಣ್ಣ"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"ಮೂಲ ಬಣ್ಣಗಳು"</string>
+    <string name="color_changed" msgid="7029571720331641235">"ಬಣ್ಣ ಬದಲಾಗಿದೆ"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ಡೈನಾಮಿಕ್"</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 923f092..25e7d43 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"테마 아이콘"</string>
     <string name="beta_title" msgid="8703819523760746458">"베타"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"앱 그리드 변경"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"배경화면 색상"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"배경화면 색상"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"기본 색상"</string>
+    <string name="color_changed" msgid="7029571720331641235">"색상 변경됨"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"동적"</string>
 </resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index b83f458..f7b60ef 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Тематикалык сүрөтчөлөр"</string>
     <string name="beta_title" msgid="8703819523760746458">"Бета"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Колдонмонун торчосун өзгөртүү"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Тушкагаздын түстөрү"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Тушкагаздын түсү"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Негизги түстөр"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Түс өзгөртүлдү"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Динамикалык"</string>
 </resources>
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index 3bad9e6..601f06f 100644
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -27,7 +27,7 @@
     <dimen name="preview_theme_tile_size">14dp</dimen>
     <dimen name="preview_theme_shape_size">30dp</dimen>
 
-    <dimen name="options_container_width">400dp</dimen>
+    <dimen name="options_container_width">0dp</dimen>
     <dimen name="option_bottom_margin">8dp</dimen>
     <dimen name="option_tile_width">62dp</dimen>
     <dimen name="option_tile_padding_horizontal">7dp</dimen>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 5f9acf6..8fe51ba 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"ໄອຄອນຕາມຮູບແບບສີສັນ"</string>
     <string name="beta_title" msgid="8703819523760746458">"ເບຕ້າ"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"ປ່ຽນຕາຕະລາງແອັບ"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"ສີຮູບພື້ນຫຼັງ"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"ສີຮູບພື້ນຫຼັງ"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"ສີພື້ນຖານ"</string>
+    <string name="color_changed" msgid="7029571720331641235">"ປ່ຽນສີແລ້ວ"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ໄດນາມິກ"</string>
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index b790726..02b289b 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Teminės piktogramos"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Programų tinklelio keitimas"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Ekrano fono spalvos"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Ekrano fono spalva"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Pagrindinės spalvos"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Spalva pakeista"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinaminės"</string>
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index f090215..f8fb310 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Motīvu ikonas"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Mainīt lietotņu režģi"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Fona tapetes krāsas"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Fona tapetes krāsa"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Pamatkrāsas"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Krāsa mainīta"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamiska"</string>
 </resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 0f086b4..197058c 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Икони со тема"</string>
     <string name="beta_title" msgid="8703819523760746458">"Бета"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Променете ја мрежата на апликации"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Бои од тапетот"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Боја на тапет"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Основни бои"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Бојата е променета"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Динамично"</string>
 </resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 7ed3912..91ae2dc 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"തീമുള്ള ഐക്കണുകൾ"</string>
     <string name="beta_title" msgid="8703819523760746458">"ബീറ്റ"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"ആപ്പ് ഗ്രിഡ് മാറ്റുക"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"വാൾപേപ്പർ നിറങ്ങൾ"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"വാൾപേപ്പറിനിന്റെ നിറം"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"അടിസ്ഥാന നിറങ്ങൾ"</string>
+    <string name="color_changed" msgid="7029571720331641235">"നിറം മാറ്റി"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ഡൈനാമിക്"</string>
 </resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index bcab83d..6fc45b5 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Загварын дүрс тэмдэг"</string>
     <string name="beta_title" msgid="8703819523760746458">"Бета"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Аппын хүснэгтийг өөрчлөх"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Дэлгэцийн зургийн өнгө"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Дэлгэцийн зургийн өнгө"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Суурь өнгөнүүд"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Өнгийг өөрчилсөн"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Динамик"</string>
 </resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 4622270..0eba26e 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"थीम असलेले आयकन"</string>
     <string name="beta_title" msgid="8703819523760746458">"बीटा"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"अ‍ॅप ग्रिड बदला"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"वॉलपेपरचे रंग"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"वॉलपेपरचा रंग"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"डीफॉल्ट रंग"</string>
+    <string name="color_changed" msgid="7029571720331641235">"रंग बदलला आहे"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"सतत बदलणारे"</string>
 </resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 3fedc89..a241339 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Ikon bertema"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Tukar grid apl"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Warna kertas dinding"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Warna kertas dinding"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Warna asas"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Warna ditukar"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamik"</string>
 </resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index f08adf4..f4eeb3f 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"အပြင်အဆင်သုံး သင်္ကေတများ"</string>
     <string name="beta_title" msgid="8703819523760746458">"စမ်းသပ်ဆော့ဖ်ဝဲ"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"အက်ပ်ဇယား ပြောင်းရန်"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"နောက်ခံအရောင်များ"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"နောက်ခံအရောင်"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"အခြေခံအရောင်များ"</string>
+    <string name="color_changed" msgid="7029571720331641235">"အရောင် ပြောင်းလိုက်ပါပြီ"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ပြောင်းနိုင်သော"</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 808828d..a82f28b 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Temaikoner"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Endre apprutenett"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Bakgrunnsfarger"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Bakgrunnsfarge"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Grunnleggende farger"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Fargen er endret"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamisk"</string>
 </resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 0f3dfd5..a29a975 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"थिम भएका आइकन"</string>
     <string name="beta_title" msgid="8703819523760746458">"बिटा"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"एप ग्रिड बदल्नुहोस्"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"वालपेपरका रङहरू"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"वालपेपरको रङ"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"आधारभूत रङहरू"</string>
+    <string name="color_changed" msgid="7029571720331641235">"रङ बदलियो"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"गतिशील"</string>
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 9d7de8b..6210372 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Thema-iconen"</string>
     <string name="beta_title" msgid="8703819523760746458">"Bèta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"App-raster wijzigen"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Achtergrondkleuren"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Achtergrondkleur"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Basiskleuren"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Kleur gewijzigd"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamisch"</string>
 </resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 5cd59a2..628fe74 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"ଥିମ୍ ଯୁକ୍ତ ଆଇକନ୍"</string>
     <string name="beta_title" msgid="8703819523760746458">"ବିଟା"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"ଆପ୍ ଗ୍ରିଡ୍ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"ୱାଲପେପର ରଙ୍ଗଗୁଡ଼ିକ"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"ୱାଲପେପର ରଙ୍ଗ"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"ମୌଳିକ ରଙ୍ଗଗୁଡ଼ିକ"</string>
+    <string name="color_changed" msgid="7029571720331641235">"ରଙ୍ଗ ପରିବର୍ତ୍ତନ କରାଯାଇଛି"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ଡାଇନାମିକ"</string>
 </resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 070455a..1d9d119 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"ਥੀਮ ਵਾਲੇ ਪ੍ਰਤੀਕ"</string>
     <string name="beta_title" msgid="8703819523760746458">"ਬੀਟਾ"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"ਐਪ ਗ੍ਰਿਡ ਬਦਲੋ"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"ਵਾਲਪੇਪਰ ਦੇ ਰੰਗ"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"ਵਾਲਪੇਪਰ ਦਾ ਰੰਗ"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"ਮੂਲ ਰੰਗ"</string>
+    <string name="color_changed" msgid="7029571720331641235">"ਰੰਗ ਬਦਲਿਆ ਗਿਆ"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ਪਰਿਵਰਤਨਸ਼ੀਲ"</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 18d7d57..b3140dc 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Ikony z motywem"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Zmień siatkę aplikacji"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Kolory tapety"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Kolor tapety"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Kolory podstawowe"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Kolor został zmieniony"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamicznie"</string>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 48995e5..a9a4fe3 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Ícones temáticos"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Altere a grelha de apps"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Cores imag. de fundo"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Cor da imagem de fundo"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Cores básicas"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Cor alterada"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinâmico"</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 6054585..c858265 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Ícones com tema"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Mudar a grade de apps"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Cores do plano de fundo"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Cor do plano de fundo"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Cores básicas"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Cor trocada"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinâmica"</string>
 </resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index b819165..7389836 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Pictograme tematice"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Schimbați grila de aplicații"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Culori de fundal"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Culoarea imaginii de fundal"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Culori de bază"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Culoare modificată"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamic"</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index c8f2a69..1a674ff 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Тематические значки"</string>
     <string name="beta_title" msgid="8703819523760746458">"Бета"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Настроить сетку приложений"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Цвета обоев"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Цвет обоев"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Основные цвета"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Цвет изменен"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Динамически"</string>
 </resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 2ec8efd..2e85b26 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"තේමාගත නිරූපක"</string>
     <string name="beta_title" msgid="8703819523760746458">"බීටා"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"යෙදුම් ජාලකය වෙනස් කරන්න"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"වෝල්පේපර වර්ණ"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"වෝල්පේපර වර්ණය"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"මූලික වර්ණ"</string>
+    <string name="color_changed" msgid="7029571720331641235">"වර්ණය වෙනස් විය"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ගතික"</string>
 </resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 7293003..7431dec 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Prefarbené ikony"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Zmeniť mriežku aplikácií"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Farby tapety"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Farba tapety"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Základné farby"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Farba bola zmenená"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamické"</string>
 </resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index c7592d5..a637d4f 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Ikone s temo"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Spreminjanje mreže aplikacij."</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Barve zaslon. ozadja"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Barva zaslonskega ozadja"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Osnovne barve"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Barva je spremenjena."</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamično"</string>
 </resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 1793163..8f6259c 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Ikona me temë"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Ndrysho rrjetën e aplikacioneve"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Ngjyra imazhi sfondi"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Ngjyra e imazhit të sfondit"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Ngjyra bazë"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Ngjyra ka ndryshuar"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamike"</string>
 </resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 80fa87d..3a7de2b 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Тематске иконе"</string>
     <string name="beta_title" msgid="8703819523760746458">"Бета"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Промените мрежу апликација"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Боје позадине"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Боја позадине"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Основне боје"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Боја је промењена"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Динамички"</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index f84613f..d16ff0f 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Ikoner med tema"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Ändra rutnät för appar"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Bakgrundsfärger"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Bakgrundsfärg"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Standardfärger"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Färgen har ändrats"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamisk"</string>
 </resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index c4dc13a..1a01433 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Aikoni zenye mada"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Badilisha gridi ya programu"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Rangi za mandhari"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Rangi ya mandhari"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Rangi za msingi"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Rangi imebadilishwa"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Inayobadilika"</string>
 </resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index e2d1384..3a2bffb 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"தீம் செய்யப்பட்ட ஐகான்கள்"</string>
     <string name="beta_title" msgid="8703819523760746458">"பீட்டா"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"ஆப்ஸ் கட்டக் காட்சியை மாற்றும்"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"வால்பேப்பர் நிறங்கள்"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"வால்பேப்பரின் நிறம்"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"அடிப்படை வண்ணங்கள்"</string>
+    <string name="color_changed" msgid="7029571720331641235">"வண்ணம் மாற்றப்பட்டது"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"டைனமிக்"</string>
 </resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index f195a9c..72fd0c3 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"రూపానికి తగిన చిహ్నాలు"</string>
     <string name="beta_title" msgid="8703819523760746458">"బీటా"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"యాప్ గ్రిడ్‌ను మార్చండి"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"వాల్‌పేపర్ రంగులు"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"వాల్‌పేపర్ రంగు"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"ప్రాథమిక రంగులు"</string>
+    <string name="color_changed" msgid="7029571720331641235">"రంగు మార్చబడింది"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"డైనమిక్"</string>
 </resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 3adb04a..3375c30 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"ไอคอนตามธีม"</string>
     <string name="beta_title" msgid="8703819523760746458">"เบต้า"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"เปลี่ยนแปลงตารางกริดสำหรับแอป"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"สีวอลเปเปอร์"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"สีวอลเปเปอร์"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"สีพื้นฐาน"</string>
+    <string name="color_changed" msgid="7029571720331641235">"เปลี่ยนสีแล้ว"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ไดนามิก"</string>
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index f59f3e9..591a107 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Mga may temang icon"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Baguhin ang grid ng app"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Kulay ng wallpaper"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Kulay ng wallpaper"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Mga basic na kulay"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Pinalitan ang kulay"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dynamic"</string>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 7c01dd6..e90cc22 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Tema simgeleri"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Uygulama ızgarasını değiştirin"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Duvar kağıdı renkleri"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Duvar kağıdı rengi"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Temel renkler"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Renk değişti"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamik"</string>
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 6117e09..a41a498 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Тема значків"</string>
     <string name="beta_title" msgid="8703819523760746458">"Бета"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Змінити сітку додатків"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Кольори малюнка"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Колір фонового малюнка"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Основні кольори"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Колір змінено"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Динамічний"</string>
 </resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index fa5e259..8ae85d3 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"تھیم کردہ آئیکنز"</string>
     <string name="beta_title" msgid="8703819523760746458">"بی ٹا"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"ایپ گرڈ تبدیل کریں"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"وال پیپر کے رنگ"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"وال پیپر کا رنگ"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"بنیادی رنگ"</string>
+    <string name="color_changed" msgid="7029571720331641235">"رنگ کو تبدیل کر دیا گیا"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"ڈائنیمک"</string>
 </resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index eee5210..44563b5 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Mavzuga oid ikonkalar"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Ilovalar jadvalini oʻzgartirish"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Fon ranglari"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Fon rasmi rangi"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Asosiy ranglar"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Rang oʻzgartirildi"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Dinamik"</string>
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 4e4281b..c078772 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Biểu tượng theo chủ đề"</string>
     <string name="beta_title" msgid="8703819523760746458">"Thử nghiệm"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Thay đổi lưới ứng dụng"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Màu hình nền"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Màu hình nền"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Màu cơ bản"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Đã thay đổi màu"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Động"</string>
 </resources>
diff --git a/res/values-w600dp-port/dimens.xml b/res/values-w600dp-port/dimens.xml
new file mode 100644
index 0000000..ba92746
--- /dev/null
+++ b/res/values-w600dp-port/dimens.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2022 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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 the customization option tiles -->
+    <dimen name="option_tile_width">79dp</dimen>
+    <dimen name="option_tile_grid_padding_horizontal">8dp</dimen>
+
+    <dimen name="component_color_chip_small_size_default">30dp</dimen>
+    <dimen name="color_seed_chip_margin">15dp</dimen>
+</resources>
diff --git a/res/values-w800dp/dimens.xml b/res/values-w800dp/dimens.xml
new file mode 100644
index 0000000..4cd6242
--- /dev/null
+++ b/res/values-w800dp/dimens.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2022 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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 the customization option tiles -->
+    <dimen name="option_tile_width">87dp</dimen>
+    <dimen name="option_tile_grid_padding_horizontal">8dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/res/values-w800dp/integers.xml b/res/values-w800dp/integers.xml
new file mode 100644
index 0000000..23fa48a
--- /dev/null
+++ b/res/values-w800dp/integers.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2022 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+    <integer name="options_grid_num_columns">6</integer>
+</resources>
diff --git a/res/values-w840dp/attrs.xml b/res/values-w840dp/attrs.xml
new file mode 100644
index 0000000..f63f574
--- /dev/null
+++ b/res/values-w840dp/attrs.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+     Copyright (C) 2022 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+    <item name="linear_layout_horizontal_display_options_max" format="float" type="dimen">6.35
+    </item>
+</resources>
\ No newline at end of file
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 13a6c87..1a20566 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"带主题的图标"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta 版"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"更改应用网格"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"壁纸颜色"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"壁纸颜色"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"基本颜色"</string>
+    <string name="color_changed" msgid="7029571720331641235">"颜色已更改"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"动态"</string>
 </resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index e06d883..df0972c 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"主題圖示"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta 版本"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"變更應用程式網格"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"桌布顏色"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"桌布顏色"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"基本顏色"</string>
+    <string name="color_changed" msgid="7029571720331641235">"已經變咗顏色"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"動態"</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 454db85..478d759 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"圖示套用主題色"</string>
     <string name="beta_title" msgid="8703819523760746458">"Beta 版"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"變更應用程式格線"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"桌布顏色"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"桌布顏色"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"基本顏色"</string>
+    <string name="color_changed" msgid="7029571720331641235">"顏色已變更"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"動態"</string>
 </resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 532491d..e399001 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -84,4 +84,9 @@
     <string name="themed_icon_title" msgid="7312460430471956558">"Izithonjana ezinetimu"</string>
     <string name="beta_title" msgid="8703819523760746458">"I-beta"</string>
     <string name="gird_picker_entry_content_description" msgid="9087651470212293439">"Shintsha igridi ye-app"</string>
+    <string name="wallpaper_color_tab" msgid="1447926591721403840">"Imibala yesithombe sangemuva"</string>
+    <string name="wallpaper_color_title" msgid="5687965239180986458">"Umbala wesithombe sangemuva"</string>
+    <string name="preset_color_tab" msgid="3133391839341329314">"Imibala eyisisekelo"</string>
+    <string name="color_changed" msgid="7029571720331641235">"Umbala ushintshiwe"</string>
+    <string name="adaptive_color_title" msgid="1336508599235896205">"Okuguqukayo"</string>
 </resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
new file mode 100644
index 0000000..288dd19
--- /dev/null
+++ b/res/values/attrs.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+     Copyright (C) 2022 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+    <item name="linear_layout_horizontal_display_options_max" format="float" type="dimen">4.35
+    </item>
+</resources>
\ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 2086480..0ad221e 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -38,6 +38,7 @@
     <dimen name="option_tile_margin_horizontal">6dp</dimen>
     <dimen name="option_tile_padding_vertical">12dp</dimen>
     <dimen name="option_tile_padding_horizontal">12dp</dimen>
+    <dimen name="option_tile_grid_padding_horizontal">4dp</dimen>
     <dimen name="option_icon_size">16dp</dimen>
     <dimen name="theme_option_icon_sample_height">22dp</dimen>
     <dimen name="theme_option_icon_sample_width">22dp</dimen>
@@ -123,4 +124,15 @@
 
     <dimen name="beta_tag_background_width">46dp</dimen>
     <dimen name="beta_tag_background_height">24dp</dimen>
+
+    <!-- For the color option section -->
+    <dimen name="color_options_container_top_margin">24dp</dimen>
+
+    <!-- For the color page. -->
+    <dimen name="color_page_indicator_margin_top">16dp</dimen>
+
+    <dimen name="component_color_chip_small_size_default">29dp</dimen>
+    <dimen name="color_seed_option_tile_padding">10dp</dimen>
+    <dimen name="color_seed_option_tile_padding_selected">6dp</dimen>
+    <dimen name="color_seed_chip_margin">14dp</dimen>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index f2d0f21..1a15fd0 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -247,4 +247,17 @@
 
     <!-- The content description of grid picker entry. [CHAR LIMIT=NONE] -->
     <string name="gird_picker_entry_content_description" msgid="7538418512525897691">Change app grid</string>
+
+    <!-- The title for the tab with colors from wallpaper. [CHAR_LIMIT=20]-->
+    <string name="wallpaper_color_tab">Wallpaper colors</string>
+    <!-- The description on an item that shows a color obtained from the wallpaper
+        (used mainly for accessibility). [CHAR_LIMIT=NONE] -->
+    <string name="wallpaper_color_title">Wallpaper color</string>
+    <!-- The title for the tab with a default set of color options. [CHAR_LIMIT=20]-->
+    <string name="preset_color_tab">Basic colors</string>
+    <!-- The text for A11y announcement when color changes. -->
+    <string name="color_changed">Color changed</string>
+    <!-- Title of a section of color selection option that obtains colors automatically from the
+        wallpaper instead of a set color [CHAR LIMIT=15] -->
+    <string name="adaptive_color_title">Dynamic</string>
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index c0a0aed..3991b65 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -41,6 +41,17 @@
 
         <item name="android:windowContentOverlay">@null</item>
         <item name="android:windowDisablePreview">true</item>
+        <item name="snackbarStyle">@style/SnackbarMargin</item>
+
+        <item name="borderlessButtonStyle">@style/Widget.AppCompat.Button.Borderless</item>
+        <item name="colorAccent">@color/accent_color</item>
+        <item name="colorSurface">@color/design_default_color_surface</item>
+        <item name="colorOnSurface">@color/design_default_color_on_surface</item>
+    </style>
+
+    <!-- Snackbar margin -->
+    <style name="SnackbarMargin" parent="Widget.MaterialComponents.Snackbar">
+        <item name="android:layout_margin">48dp</item>
     </style>
 
     <!-- Bottom nav -->
diff --git a/robolectric_tests/Android.mk b/robolectric_tests/Android.mk
index 1117cc3..7d9b0e1 100644
--- a/robolectric_tests/Android.mk
+++ b/robolectric_tests/Android.mk
@@ -29,7 +29,7 @@
     mockito-robolectric-prebuilt \
     truth-prebuilt
 LOCAL_JAVA_LIBRARIES := \
-    platform-robolectric-3.6.2-prebuilt
+    platform-robolectric-4.5.1-prebuilt
 
 LOCAL_JAVA_RESOURCE_DIRS := config
 
diff --git a/robolectric_tests/config/robolectric.properties b/robolectric_tests/config/robolectric.properties
index 6a5d031..6c518c0 100644
--- a/robolectric_tests/config/robolectric.properties
+++ b/robolectric_tests/config/robolectric.properties
@@ -1,2 +1,2 @@
 manifest=packages/apps/ThemePicker/AndroidManifest.xml
-sdk=27
+sdk=31
diff --git a/robolectric_tests/robolectric_gradle_config/robolectric.properties b/robolectric_tests/robolectric_gradle_config/robolectric.properties
index 926e354..2916ca9 100644
--- a/robolectric_tests/robolectric_gradle_config/robolectric.properties
+++ b/robolectric_tests/robolectric_gradle_config/robolectric.properties
@@ -1,3 +1,3 @@
 # Do not include the manifest definition in this version
 # as it is specified directly in the gradle file
-sdk=27
\ No newline at end of file
+sdk=31
\ No newline at end of file
diff --git a/robolectric_tests/src/com/android/customization/model/clock/ClockManagerTest.java b/robolectric_tests/src/com/android/customization/model/clock/ClockManagerTest.java
index f431006..574548a 100644
--- a/robolectric_tests/src/com/android/customization/model/clock/ClockManagerTest.java
+++ b/robolectric_tests/src/com/android/customization/model/clock/ClockManagerTest.java
@@ -18,8 +18,8 @@
 import static junit.framework.TestCase.fail;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
 import android.content.ContentResolver;
 import android.provider.Settings.Secure;
@@ -86,7 +86,9 @@
 
     @Test
     public void testApply_whenJSONExceptionOccurs_callsOnError() {
-        when(mMockClockface.getId()).thenThrow(JSONException.class);
+        doAnswer((invocation) -> {
+            throw new JSONException("Fake Test Excepton");
+        }).when(mMockClockface).getId();
 
         mManager.apply(mMockClockface, mMockCallback);
 
diff --git a/robolectric_tests/src/com/android/customization/model/color/ColorCustomizationManagerTest.kt b/robolectric_tests/src/com/android/customization/model/color/ColorCustomizationManagerTest.kt
new file mode 100644
index 0000000..f6f4227
--- /dev/null
+++ b/robolectric_tests/src/com/android/customization/model/color/ColorCustomizationManagerTest.kt
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.customization.model.color
+
+import android.app.WallpaperColors
+import android.graphics.Color
+import com.android.customization.model.CustomizationManager
+import com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_SYSTEM_PALETTE
+import com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_COLOR
+import com.android.customization.model.color.ColorOptionsProvider.COLOR_SOURCE_HOME
+import com.android.customization.model.color.ColorOptionsProvider.COLOR_SOURCE_PRESET
+import com.android.customization.model.color.ColorOptionsProvider.OVERLAY_COLOR_BOTH
+import com.android.customization.model.color.ColorOptionsProvider.OVERLAY_COLOR_INDEX
+import com.android.customization.model.color.ColorOptionsProvider.OVERLAY_COLOR_SOURCE
+import com.android.customization.model.theme.OverlayManagerCompat
+import com.android.systemui.monet.Style
+import com.google.common.truth.Truth.assertThat
+import org.json.JSONObject
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.Mock
+import org.mockito.MockitoAnnotations
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.RuntimeEnvironment
+
+/**
+ * Tests of {@link ColorCustomizationManager}.
+ */
+// TODO(b/222433744): most of these tests are failing due to the manager apk missing in the image
+@RunWith(RobolectricTestRunner::class)
+class ColorCustomizationManagerTest {
+
+    @get:Rule
+    val rule: MockitoRule = MockitoJUnit.rule()
+
+    @Mock private lateinit var provider: ColorOptionsProvider
+    @Mock private lateinit var mockOM: OverlayManagerCompat
+
+    private lateinit var manager: ColorCustomizationManager
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+        val application = RuntimeEnvironment.application
+        manager = ColorCustomizationManager(provider, application.contentResolver, mockOM)
+    }
+
+    @Test
+    fun testParseSettings() {
+        val source = COLOR_SOURCE_HOME
+        val style = Style.SPRITZ
+        val someColor = "aabbcc"
+        val someOtherColor = "bbccdd"
+        val settings = mapOf(OVERLAY_CATEGORY_SYSTEM_PALETTE to someColor,
+                OVERLAY_CATEGORY_COLOR to someOtherColor,
+                OVERLAY_COLOR_SOURCE to source,
+                ColorOption.TIMESTAMP_FIELD to "12345")
+        val json = JSONObject(settings).toString()
+
+        manager.parseSettings(json)
+
+        assertThat(manager.currentColorSource).isEqualTo(source)
+        assertThat(manager.currentStyle).isEqualTo(style)
+        assertThat(manager.currentOverlays.size).isEqualTo(2)
+        assertThat(manager.currentOverlays.get(OVERLAY_CATEGORY_COLOR)).isEqualTo(someOtherColor)
+        assertThat(manager.currentOverlays.get(OVERLAY_CATEGORY_SYSTEM_PALETTE))
+                .isEqualTo(someColor)
+    }
+
+    @Test
+    fun apply_ColorBundle_index() {
+        testApplyColorBundle(1, "1")
+        testApplyColorBundle(2, "2")
+        testApplyColorBundle(3, "3")
+        testApplyColorBundle(4, "4")
+    }
+
+    private fun testApplyColorBundle(index: Int, value: String) {
+        manager.apply(getColorBundle(index), object : CustomizationManager.Callback {
+            override fun onSuccess() {}
+            override fun onError(throwable: Throwable?) {}
+        })
+
+        val overlaysJson = JSONObject(manager.storedOverlays)
+
+        assertThat(overlaysJson.getString(OVERLAY_COLOR_INDEX)).isEqualTo(value)
+    }
+
+    private fun getColorBundle(index: Int): ColorBundle {
+        return ColorBundle(
+            "fake color", mapOf("fake_package" to "fake_color"),
+            /* isDefault= */ false,
+            null,
+            /* index= */ index,
+            null
+        )
+    }
+
+    @Test
+    fun apply_ColorSeed_index() {
+        testApplyColorSeed(1, "1")
+        testApplyColorSeed(2, "2")
+        testApplyColorSeed(3, "3")
+        testApplyColorSeed(4, "4")
+    }
+
+    private fun testApplyColorSeed(index: Int, value: String) {
+        manager.apply(getColorSeed(index), object : CustomizationManager.Callback {
+            override fun onSuccess() {}
+            override fun onError(throwable: Throwable?) {}
+        })
+
+        val overlaysJson = JSONObject(manager.storedOverlays)
+        assertThat(overlaysJson.getString(OVERLAY_COLOR_INDEX)).isEqualTo(value)
+    }
+
+    private fun getColorSeed(index: Int): ColorSeedOption {
+        return ColorSeedOption(
+            "fake color",
+            mapOf("fake_package" to "fake_color"),
+            /* isDefault= */ false,
+            COLOR_SOURCE_PRESET,
+            null,
+            index,
+            null
+        )
+    }
+
+    @Test
+    fun testApply_colorSeedFromWallpaperBoth_shouldReturnBothValue() {
+        val wallpaperColor = WallpaperColors(Color.valueOf(Color.RED), null, null)
+        manager.setWallpaperColors(wallpaperColor, wallpaperColor)
+
+        manager.apply(getColorSeed(anyInt()), object : CustomizationManager.Callback {
+            override fun onSuccess() {}
+            override fun onError(throwable: Throwable?) {}
+        })
+
+        val overlaysJson = JSONObject(manager.storedOverlays)
+        assertThat(overlaysJson.getString(OVERLAY_COLOR_BOTH)).isEqualTo("1")
+    }
+
+    @Test
+    fun testApply_colorSeedFromWallpaperDifferent_shouldReturnNonBothValue() {
+        val wallpaperColor1 = WallpaperColors(Color.valueOf(Color.RED), null, null)
+        val wallpaperColor2 = WallpaperColors(Color.valueOf(Color.BLUE), null, null)
+        manager.setWallpaperColors(wallpaperColor1, wallpaperColor2)
+
+        manager.apply(getColorSeed(anyInt()), object : CustomizationManager.Callback {
+            override fun onSuccess() {}
+            override fun onError(throwable: Throwable?) {}
+        })
+
+        val overlaysJson = JSONObject(manager.storedOverlays)
+        assertThat(overlaysJson.getString(OVERLAY_COLOR_BOTH)).isEqualTo("0")
+    }
+}
diff --git a/robolectric_tests/src/com/android/customization/model/color/ColorOptionTest.kt b/robolectric_tests/src/com/android/customization/model/color/ColorOptionTest.kt
new file mode 100644
index 0000000..271aa83
--- /dev/null
+++ b/robolectric_tests/src/com/android/customization/model/color/ColorOptionTest.kt
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.customization.model.color
+
+import com.android.customization.model.color.ColorOptionsProvider.COLOR_SOURCE_HOME
+import com.android.customization.model.color.ColorOptionsProvider.COLOR_SOURCE_LOCK
+import com.android.customization.model.color.ColorOptionsProvider.COLOR_SOURCE_PRESET
+import com.android.systemui.monet.Style
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.`when`
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+import org.robolectric.RobolectricTestRunner
+
+/**
+ * Tests of {@link ColorOption}.
+ */
+@RunWith(RobolectricTestRunner::class)
+class ColorOptionTest {
+
+    @get:Rule
+    val rule: MockitoRule = MockitoJUnit.rule()
+
+    @Mock
+    private lateinit var manager: ColorCustomizationManager
+
+    @Test
+    fun colorOption_Source_Preset() {
+        val bundleOption: ColorOption = ColorBundle("fake color",
+                mapOf("fake_package" to "fake_color"), false, null, /* index= */ 0, null)
+        assertEquals(COLOR_SOURCE_PRESET, bundleOption.source)
+    }
+
+    @Test
+    fun colorOption_bundle_index() {
+        testBundleOptionIndex(1)
+        testBundleOptionIndex(2)
+        testBundleOptionIndex(3)
+        testBundleOptionIndex(4)
+    }
+
+    private fun testBundleOptionIndex(index: Int) {
+        val bundleOption: ColorBundle = ColorBundle("fake color",
+                mapOf("fake_package" to "fake_color"), false, null, /* index= */ index, null)
+        assertThat(bundleOption.index).isEqualTo(index)
+    }
+
+    @Test
+    fun colorOption_Source_Seed() {
+        testSeedOptionSource(COLOR_SOURCE_HOME)
+        testSeedOptionSource(COLOR_SOURCE_LOCK)
+    }
+
+    private fun testSeedOptionSource(source: String) {
+        val seedOption: ColorOption = ColorSeedOption("fake color",
+                mapOf("fake_package" to "fake_color"), false, source, null, /* index= */ 0, null)
+        assertThat(seedOption.source).isEqualTo(source)
+    }
+
+    @Test
+    fun colorOption_seed_style() {
+        testSeedOptionStyle(Style.TONAL_SPOT)
+        testSeedOptionStyle(Style.SPRITZ)
+        testSeedOptionStyle(Style.VIBRANT)
+        testSeedOptionStyle(Style.EXPRESSIVE)
+    }
+
+    private fun testSeedOptionStyle(style: Style) {
+        val seedOption: ColorOption = ColorSeedOption("fake color",
+            mapOf("fake_package" to "fake_color"), /* isDefault= */ false, "fake_source", style,
+            0, null)
+        assertThat(seedOption.style).isEqualTo(style)
+    }
+
+    @Test
+    fun colorOption_seed_index() {
+        testSeedOptionIndex(1)
+        testSeedOptionIndex(2)
+        testSeedOptionIndex(3)
+        testSeedOptionIndex(4)
+    }
+
+    private fun testSeedOptionIndex(index: Int) {
+        val seedOption: ColorOption = ColorSeedOption("fake color",
+                mapOf("fake_package" to "fake_color"),
+                /* isDefault= */ false,
+                "fake_source",
+                Style.TONAL_SPOT,
+                index,
+                /* previewInfo= */ null)
+        assertThat(seedOption.index).isEqualTo(index)
+    }
+
+    private fun setUpSeedOption(isDefault: Boolean, source: String = "some_source")
+            : ColorSeedOption {
+        val overlays = if (isDefault) {
+            HashMap()
+        } else {
+            mapOf("package" to "value", "otherPackage" to "otherValue")
+        }
+        `when`(manager.currentOverlays).thenReturn(overlays)
+        return ColorSeedOption("seed",
+                overlays,
+                isDefault,
+                source,
+                Style.TONAL_SPOT,
+                /* index= */ 0,
+                /* previewInfo= */ null)
+    }
+
+    @Test
+    fun seedOption_isActive_notDefault_SourceSet() {
+        val source = "some_source"
+        val seedOption = setUpSeedOption(false, source)
+        `when`(manager.currentColorSource).thenReturn(source)
+
+        assertThat(seedOption.isActive(manager)).isTrue()
+    }
+
+    @Test
+    fun seedOption_isActive_notDefault_NoSource() {
+        val seedOption = setUpSeedOption(false)
+        `when`(manager.currentColorSource).thenReturn(null)
+
+        assertThat(seedOption.isActive(manager)).isTrue()
+    }
+
+    @Test
+    fun seedOption_isActive_notDefault_differentSource() {
+        val seedOption = setUpSeedOption(false)
+        `when`(manager.currentColorSource).thenReturn("some_other_source")
+
+        assertThat(seedOption.isActive(manager)).isFalse()
+    }
+
+    @Test
+    fun seedOption_isActive_default_emptyJson() {
+        val seedOption = setUpSeedOption(true)
+        `when`(manager.storedOverlays).thenReturn("")
+
+        assertThat(seedOption.isActive(manager)).isTrue()
+    }
+
+    @Test
+    fun seedOption_isActive_default_nonEmptyJson() {
+        val seedOption = setUpSeedOption(true)
+
+        `when`(manager.storedOverlays).thenReturn("{non-empty-json}")
+
+        // Should still be Active because overlays is empty
+        assertThat(seedOption.isActive(manager)).isTrue()
+    }
+
+    @Test
+    fun seedOption_isActive_default_nonEmptyOverlays() {
+        val seedOption = setUpSeedOption(true)
+
+        `when`(manager.currentOverlays).thenReturn(mapOf("a" to "b"))
+        // TODO(b/222433744): failing as it's true
+        assertThat(seedOption.isActive(manager)).isFalse()
+    }
+}
diff --git a/robolectric_tests/src/com/android/customization/model/color/ColorSectionControllerTest.java b/robolectric_tests/src/com/android/customization/model/color/ColorSectionControllerTest.java
new file mode 100644
index 0000000..820e641
--- /dev/null
+++ b/robolectric_tests/src/com/android/customization/model/color/ColorSectionControllerTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.customization.model.color;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.android.wallpaper.model.WallpaperColorsViewModel;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+/**
+ * Tests of {@link ColorSectionController}.
+ */
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public final class ColorSectionControllerTest {
+
+    private AppCompatActivity mActivity;
+    private ColorSectionController mColorSectionController;
+
+    /**
+     * Set up the test case.
+     */
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mActivity = Robolectric.buildActivity(AppCompatActivity.class).create().get();
+        mColorSectionController = new ColorSectionController(mActivity,
+                new WallpaperColorsViewModel(), mActivity, null);
+    }
+
+    /**
+     * isAvailable()'s test.
+     */
+    @Test
+    @Config(manifest = Config.NONE)
+    public void isAvailable_nullContext_shouldReturnFalse() {
+        assertThat(mColorSectionController.isAvailable(/* context= */ null)).isFalse();
+    }
+}
+
diff --git a/robolectric_tests/src/com/android/customization/model/grid/GridOptionsManagerTest.java b/robolectric_tests/src/com/android/customization/model/grid/GridOptionsManagerTest.java
index 64a8389..4268725 100644
--- a/robolectric_tests/src/com/android/customization/model/grid/GridOptionsManagerTest.java
+++ b/robolectric_tests/src/com/android/customization/model/grid/GridOptionsManagerTest.java
@@ -31,7 +31,6 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 
 @RunWith(RobolectricTestRunner.class)
@@ -69,7 +68,6 @@
     @Test
     public void testFetch_backgroundThread() {
         mManager.fetchOptions(null, false);
-        Robolectric.flushBackgroundThreadScheduler();
         verify(mProvider).fetch(anyBoolean());
     }
 }
diff --git a/src/com/android/customization/model/ResourceConstants.java b/src/com/android/customization/model/ResourceConstants.java
index 86eb7f4..aaee935 100644
--- a/src/com/android/customization/model/ResourceConstants.java
+++ b/src/com/android/customization/model/ResourceConstants.java
@@ -58,6 +58,8 @@
      * Overlay Categories that theme picker handles.
      */
     String OVERLAY_CATEGORY_COLOR = "android.theme.customization.accent_color";
+    String OVERLAY_CATEGORY_SYSTEM_PALETTE = "android.theme.customization.system_palette";
+    String OVERLAY_CATEGORY_THEME_STYLE = "android.theme.customization.theme_style";
     String OVERLAY_CATEGORY_FONT = "android.theme.customization.font";
     String OVERLAY_CATEGORY_SHAPE = "android.theme.customization.adaptive_icon_shape";
     String OVERLAY_CATEGORY_ICON_ANDROID = "android.theme.customization.icon_pack.android";
@@ -88,6 +90,14 @@
             "ic_battery_80_24dp"
     };
 
+    /**
+     * Color bundle strings used to reference system resources.
+     */
+    String COLOR_BUNDLES_ARRAY_NAME = "color_bundles";
+    String COLOR_BUNDLE_NAME_PREFIX = "bundle_name_";
+    String COLOR_BUNDLE_MAIN_COLOR_PREFIX = "color_secondary_";
+    String COLOR_BUNDLE_STYLE_PREFIX = "color_style_";
+
     ArrayList<String> sTargetPackages = new ArrayList<>();
     String ACCENT_COLOR_LIGHT_NAME = "accent_device_default_light";
     String ACCENT_COLOR_DARK_NAME = "accent_device_default_dark";
diff --git a/src/com/android/customization/model/clock/ContentProviderClockProvider.java b/src/com/android/customization/model/clock/ContentProviderClockProvider.java
index 8f4c031..f0df031 100644
--- a/src/com/android/customization/model/clock/ContentProviderClockProvider.java
+++ b/src/com/android/customization/model/clock/ContentProviderClockProvider.java
@@ -8,8 +8,10 @@
 import android.content.pm.ProviderInfo;
 import android.database.Cursor;
 import android.net.Uri;
-import android.os.AsyncTask;
+import android.os.Handler;
+import android.os.Looper;
 import android.text.TextUtils;
+import android.util.Log;
 
 import com.android.customization.model.CustomizationManager.OptionsFetchedListener;
 import com.android.customization.model.clock.Clockface.Builder;
@@ -21,9 +23,19 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 public class ContentProviderClockProvider implements ClockProvider {
 
+    private static final String TAG = "ContentProviderClockProvider";
+    private static final ExecutorService sExecutorService = Executors.newSingleThreadExecutor();
+    private static final String LIST_OPTIONS = "list_options";
+    private static final String COL_TITLE = "title";
+    private static final String COL_ID = "id";
+    private static final String COL_THUMBNAIL = "thumbnail";
+    private static final String COL_PREVIEW = "preview";
+
     private final Context mContext;
     private final ProviderInfo mProviderInfo;
     private List<Clockface> mClocks;
@@ -75,42 +87,7 @@
             }
             return;
         }
-        new ClocksFetchTask(mContext, mProviderInfo, options -> {
-            mClocks = options;
-            if (callback != null) {
-                if (!mClocks.isEmpty()) {
-                    callback.onOptionsLoaded(mClocks);
-                } else {
-                    callback.onError(null);
-                }
-            }
-        }).execute();
-    }
-
-    private static class ClocksFetchTask extends AsyncTask<Void, Void, List<Clockface>> {
-
-        private static final String LIST_OPTIONS = "list_options";
-
-        private static final String COL_NAME = "name";
-        private static final String COL_TITLE = "title";
-        private static final String COL_ID = "id";
-        private static final String COL_THUMBNAIL = "thumbnail";
-        private static final String COL_PREVIEW = "preview";
-
-        private final OptionsFetchedListener<Clockface> mCallback;
-        private Context mContext;
-        private final ProviderInfo mProviderInfo;
-
-        public ClocksFetchTask(Context context, ProviderInfo providerInfo,
-                OptionsFetchedListener<Clockface> callback) {
-            super();
-            mContext = context;
-            mProviderInfo = providerInfo;
-            mCallback = callback;
-        }
-
-        @Override
-        protected List<Clockface> doInBackground(Void... voids) {
+        sExecutorService.submit(() -> {
             Uri optionsUri = new Uri.Builder()
                     .scheme(ContentResolver.SCHEME_CONTENT)
                     .authority(mProviderInfo.authority)
@@ -121,7 +98,7 @@
 
             List<Clockface> clockfaces = new ArrayList<>();
             try (Cursor c = resolver.query(optionsUri, null, null, null, null)) {
-                while(c.moveToNext()) {
+                while (c != null && c.moveToNext()) {
                     String id = c.getString(c.getColumnIndex(COL_ID));
                     String title = c.getString(c.getColumnIndex(COL_TITLE));
                     String thumbnailUri = c.getString(c.getColumnIndex(COL_THUMBNAIL));
@@ -140,16 +117,19 @@
                 Glide.get(mContext).clearDiskCache();
             } catch (Exception e) {
                 clockfaces = null;
-            } finally {
-                mContext = null;
+                Log.e(TAG, "Failed to query clock face options.", e);
             }
-            return clockfaces;
-        }
-
-        @Override
-        protected void onPostExecute(List<Clockface> clockfaces) {
-            super.onPostExecute(clockfaces);
-            mCallback.onOptionsLoaded(clockfaces);
-        }
+            final List<Clockface> clockfaceList = clockfaces;
+            new Handler(Looper.getMainLooper()).post(() -> {
+                mClocks = clockfaceList;
+                if (callback != null) {
+                    if (!mClocks.isEmpty()) {
+                        callback.onOptionsLoaded(mClocks);
+                    } else {
+                        callback.onError(null);
+                    }
+                }
+            });
+        });
     }
 }
diff --git a/src/com/android/customization/model/color/ColorBundle.java b/src/com/android/customization/model/color/ColorBundle.java
new file mode 100644
index 0000000..dc5a367
--- /dev/null
+++ b/src/com/android/customization/model/color/ColorBundle.java
@@ -0,0 +1,350 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.customization.model.color;
+
+import static com.android.customization.model.ResourceConstants.PATH_SIZE;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.graphics.Path;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.PathShape;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.ImageView;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.Dimension;
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+import androidx.core.graphics.PathParser;
+
+import com.android.customization.model.ResourceConstants;
+import com.android.systemui.monet.Style;
+import com.android.wallpaper.R;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Represents a preset color available for the user to chose as their theming option.
+ */
+public class ColorBundle extends ColorOption {
+
+    private final PreviewInfo mPreviewInfo;
+
+    @VisibleForTesting ColorBundle(String title,
+            Map<String, String> overlayPackages, boolean isDefault, Style style, int index,
+            PreviewInfo previewInfo) {
+        super(title, overlayPackages, isDefault, style, index);
+        mPreviewInfo = previewInfo;
+    }
+
+    @Override
+    public void bindThumbnailTile(View view) {
+        Resources res = view.getContext().getResources();
+        int primaryColor = mPreviewInfo.resolvePrimaryColor(res);
+        int secondaryColor = mPreviewInfo.resolveSecondaryColor(res);
+        int padding = view.isActivated()
+                ? res.getDimensionPixelSize(R.dimen.color_seed_option_tile_padding_selected)
+                : res.getDimensionPixelSize(R.dimen.color_seed_option_tile_padding);
+
+        for (int i = 0; i < mPreviewColorIds.length; i++) {
+            ImageView colorPreviewImageView = view.findViewById(mPreviewColorIds[i]);
+            int color = i % 2 == 0 ? primaryColor : secondaryColor;
+            colorPreviewImageView.getDrawable().setColorFilter(color, PorterDuff.Mode.SRC);
+            colorPreviewImageView.setPadding(padding, padding, padding, padding);
+        }
+        view.setContentDescription(getContentDescription(view.getContext()));
+    }
+
+    @Override
+    public PreviewInfo getPreviewInfo() {
+        return mPreviewInfo;
+    }
+
+    @Override
+    public int getLayoutResId() {
+        return R.layout.color_option;
+    }
+
+    @Override
+    public String getSource() {
+        return ColorOptionsProvider.COLOR_SOURCE_PRESET;
+    }
+
+    /**
+     * The preview information of {@link ColorBundle}
+     */
+    public static class PreviewInfo implements ColorOption.PreviewInfo {
+        @ColorInt
+        public final int secondaryColorLight;
+        @ColorInt public final int secondaryColorDark;
+        // Monet system palette and accent colors
+        @ColorInt public final int primaryColorLight;
+        @ColorInt public final int primaryColorDark;
+        public final List<Drawable> icons;
+        public final Drawable shapeDrawable;
+        @Dimension
+        public final int bottomSheetCornerRadius;
+
+        @ColorInt private int mOverrideSecondaryColorLight = Color.TRANSPARENT;
+        @ColorInt private int mOverrideSecondaryColorDark = Color.TRANSPARENT;
+        @ColorInt private int mOverridePrimaryColorLight = Color.TRANSPARENT;
+        @ColorInt private int mOverridePrimaryColorDark = Color.TRANSPARENT;
+
+        private PreviewInfo(
+                int secondaryColorLight, int secondaryColorDark, int colorSystemPaletteLight,
+                int primaryColorDark, List<Drawable> icons, Drawable shapeDrawable,
+                @Dimension int cornerRadius) {
+            this.secondaryColorLight = secondaryColorLight;
+            this.secondaryColorDark = secondaryColorDark;
+            this.primaryColorLight = colorSystemPaletteLight;
+            this.primaryColorDark = primaryColorDark;
+            this.icons = icons;
+            this.shapeDrawable = shapeDrawable;
+            this.bottomSheetCornerRadius = cornerRadius;
+        }
+
+        /**
+         * Returns the accent color to be applied corresponding with the current configuration's
+         * UI mode.
+         * @return one of {@link #secondaryColorDark} or {@link #secondaryColorLight}
+         */
+        @ColorInt
+        public int resolveSecondaryColor(Resources res) {
+            boolean night = (res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK)
+                    == Configuration.UI_MODE_NIGHT_YES;
+            if (mOverrideSecondaryColorDark != Color.TRANSPARENT
+                    || mOverrideSecondaryColorLight != Color.TRANSPARENT) {
+                return night ? mOverrideSecondaryColorDark : mOverrideSecondaryColorLight;
+            }
+            return night ? secondaryColorDark : secondaryColorLight;
+        }
+
+        /**
+         * Returns the palette (main) color to be applied corresponding with the current
+         * configuration's UI mode.
+         * @return one of {@link #secondaryColorDark} or {@link #secondaryColorLight}
+         */
+        @ColorInt
+        public int resolvePrimaryColor(Resources res) {
+            boolean night = (res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK)
+                    == Configuration.UI_MODE_NIGHT_YES;
+            if (mOverridePrimaryColorDark != Color.TRANSPARENT
+                    || mOverridePrimaryColorLight != Color.TRANSPARENT) {
+                return night ? mOverridePrimaryColorDark : mOverridePrimaryColorLight;
+            }
+            return night ? primaryColorDark
+                    : primaryColorLight;
+        }
+
+        /**
+         * Sets accent colors to override the ones in this bundle
+         */
+        public void setOverrideAccentColors(int overrideColorAccentLight,
+                int overrideColorAccentDark) {
+            mOverrideSecondaryColorLight = overrideColorAccentLight;
+            mOverrideSecondaryColorDark = overrideColorAccentDark;
+        }
+
+        /**
+         * Sets palette colors to override the ones in this bundle
+         */
+        public void setOverridePaletteColors(int overrideColorPaletteLight,
+                int overrideColorPaletteDark) {
+            mOverridePrimaryColorLight = overrideColorPaletteLight;
+            mOverridePrimaryColorDark = overrideColorPaletteDark;
+        }
+    }
+
+    /**
+     * The builder of ColorBundle
+     */
+    public static class Builder {
+        protected String mTitle;
+        @ColorInt private int mSecondaryColorLight = Color.TRANSPARENT;
+        @ColorInt private int mSecondaryColorDark = Color.TRANSPARENT;
+        // System and Monet colors
+        @ColorInt private int mPrimaryColorLight = Color.TRANSPARENT;
+        @ColorInt private int mPrimaryColorDark = Color.TRANSPARENT;
+        private List<Drawable> mIcons = new ArrayList<>();
+        private boolean mIsDefault;
+        private Style mStyle = Style.TONAL_SPOT;
+        private int mIndex;
+        protected Map<String, String> mPackages = new HashMap<>();
+
+        /**
+         * Builds the ColorBundle
+         * @param context {@link Context}
+         * @return new {@link ColorBundle} object
+         */
+        public ColorBundle build(Context context) {
+            if (mTitle == null) {
+                mTitle = context.getString(R.string.adaptive_color_title);
+            }
+            return new ColorBundle(mTitle, mPackages, mIsDefault, mStyle, mIndex,
+                    createPreviewInfo(context));
+        }
+
+        /**
+         * Creates preview information
+         * @param context the {@link Context}
+         * @return the {@link PreviewInfo} object
+         */
+        public PreviewInfo createPreviewInfo(@NonNull Context context) {
+            ShapeDrawable shapeDrawable = null;
+            Resources system = context.getResources().getSystem();
+            String pathString = system.getString(
+                    system.getIdentifier(ResourceConstants.CONFIG_ICON_MASK,
+                            "string", ResourceConstants.ANDROID_PACKAGE));
+            Path path = null;
+            if (!TextUtils.isEmpty(pathString)) {
+                path = PathParser.createPathFromPathData(pathString);
+            }
+            if (path != null) {
+                PathShape shape = new PathShape(path, PATH_SIZE, PATH_SIZE);
+                shapeDrawable = new ShapeDrawable(shape);
+                shapeDrawable.setIntrinsicHeight((int) PATH_SIZE);
+                shapeDrawable.setIntrinsicWidth((int) PATH_SIZE);
+            }
+            return new PreviewInfo(mSecondaryColorLight,
+                    mSecondaryColorDark, mPrimaryColorLight, mPrimaryColorDark, mIcons,
+                    shapeDrawable, system.getDimensionPixelOffset(
+                    system.getIdentifier(ResourceConstants.CONFIG_CORNERRADIUS,
+                            "dimen", ResourceConstants.ANDROID_PACKAGE)));
+        }
+
+        public Map<String, String> getPackages() {
+            return Collections.unmodifiableMap(mPackages);
+        }
+
+        /**
+         * Gets title of this {@link ColorBundle} object
+         * @return title string
+         */
+        public String getTitle() {
+            return mTitle;
+        }
+
+        /**
+         * Sets title of bundle
+         * @param title specified title
+         * @return this of {@link Builder}
+         */
+        public Builder setTitle(String title) {
+            mTitle = title;
+            return this;
+        }
+
+        /**
+         * Sets color accent (light)
+         * @param colorSecondaryLight color accent light in {@link ColorInt}
+         * @return this of {@link Builder}
+         */
+        public Builder setColorSecondaryLight(@ColorInt int colorSecondaryLight) {
+            mSecondaryColorLight = colorSecondaryLight;
+            return this;
+        }
+
+        /**
+         * Sets color accent (dark)
+         * @param colorSecondaryDark color accent dark in {@link ColorInt}
+         * @return this of {@link Builder}
+         */
+        public Builder setColorSecondaryDark(@ColorInt int colorSecondaryDark) {
+            mSecondaryColorDark = colorSecondaryDark;
+            return this;
+        }
+
+        /**
+         * Sets color system palette (light)
+         * @param colorPrimaryLight color system palette in {@link ColorInt}
+         * @return this of {@link Builder}
+         */
+        public Builder setColorPrimaryLight(@ColorInt int colorPrimaryLight) {
+            mPrimaryColorLight = colorPrimaryLight;
+            return this;
+        }
+
+        /**
+         * Sets color system palette (dark)
+         * @param colorPrimaryDark color system palette in {@link ColorInt}
+         * @return this of {@link Builder}
+         */
+        public Builder setColorPrimaryDark(@ColorInt int colorPrimaryDark) {
+            mPrimaryColorDark = colorPrimaryDark;
+            return this;
+        }
+
+        /**
+         * Sets icon for bundle
+         * @param icon icon in {@link Drawable}
+         * @return this of {@link Builder}
+         */
+        public Builder addIcon(Drawable icon) {
+            mIcons.add(icon);
+            return this;
+        }
+
+        /**
+         * Sets overlay package for bundle
+         * @param category the category of bundle
+         * @param packageName tha name of package in the category
+         * @return this of {@link Builder}
+         */
+        public Builder addOverlayPackage(String category, String packageName) {
+            mPackages.put(category, packageName);
+            return this;
+        }
+
+        /**
+         * Sets the style of this color seed
+         * @param style color style of {@link Style}
+         * @return this of {@link Builder}
+         */
+        public Builder setStyle(Style style) {
+            mStyle = style;
+            return this;
+        }
+
+        /**
+         * Sets color option index of bundle
+         * @param index color option index
+         * @return this of {@link Builder}
+         */
+        public Builder setIndex(int index) {
+            mIndex = index;
+            return this;
+        }
+
+        /**
+         * Sets as default bundle
+         * @return this of {@link Builder}
+         */
+        public Builder asDefault() {
+            mIsDefault = true;
+            return this;
+        }
+    }
+}
diff --git a/src/com/android/customization/model/color/ColorBundlePreviewExtractor.java b/src/com/android/customization/model/color/ColorBundlePreviewExtractor.java
new file mode 100644
index 0000000..b67eec8
--- /dev/null
+++ b/src/com/android/customization/model/color/ColorBundlePreviewExtractor.java
@@ -0,0 +1,105 @@
+/**
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.customization.model.color;
+
+import static com.android.customization.model.ResourceConstants.ANDROID_PACKAGE;
+import static com.android.customization.model.ResourceConstants.ICONS_FOR_PREVIEW;
+import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_COLOR;
+import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_SYSTEM_PALETTE;
+import static com.android.customization.model.color.ColorUtils.toColorString;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.ColorInt;
+
+import com.android.systemui.monet.ColorScheme;
+import com.android.systemui.monet.Style;
+
+/**
+ * Utility class to read all the details of a color bundle for previewing it
+ * (eg, actual color values)
+ */
+class ColorBundlePreviewExtractor {
+
+    private static final String TAG = "ColorBundlePreviewExtractor";
+
+    private final PackageManager mPackageManager;
+
+    ColorBundlePreviewExtractor(Context context) {
+        mPackageManager = context.getPackageManager();
+    }
+
+    void addSecondaryColor(ColorBundle.Builder builder, @ColorInt int color) {
+        ColorScheme darkColorScheme = new ColorScheme(color, true);
+        ColorScheme lightColorScheme = new ColorScheme(color, false);
+        int lightSecondary = lightColorScheme.getAccentColor();
+        int darkSecondary = darkColorScheme.getAccentColor();
+        builder.addOverlayPackage(OVERLAY_CATEGORY_COLOR, toColorString(color))
+                .setColorSecondaryLight(lightSecondary)
+                .setColorSecondaryDark(darkSecondary);
+    }
+
+    void addPrimaryColor(ColorBundle.Builder builder, @ColorInt int color) {
+        ColorScheme darkColorScheme = new ColorScheme(color, true);
+        ColorScheme lightColorScheme = new ColorScheme(color, false);
+        int lightPrimary = lightColorScheme.getAccentColor();
+        int darkPrimary = darkColorScheme.getAccentColor();
+        builder.addOverlayPackage(OVERLAY_CATEGORY_SYSTEM_PALETTE, toColorString(color))
+                .setColorPrimaryLight(lightPrimary)
+                .setColorPrimaryDark(darkPrimary);
+    }
+
+    void addColorStyle(ColorBundle.Builder builder, String styleName) {
+        Style s = Style.TONAL_SPOT;
+        if (!TextUtils.isEmpty(styleName)) {
+            try {
+                s = Style.valueOf(styleName);
+            } catch (IllegalArgumentException e) {
+                Log.i(TAG, "Unknown style : " + styleName + ". Will default to TONAL_SPOT.");
+            }
+        }
+        builder.setStyle(s);
+    }
+
+    void addAndroidIconOverlay(ColorBundle.Builder builder) throws NameNotFoundException {
+        addSystemDefaultIcons(builder, ICONS_FOR_PREVIEW);
+    }
+
+    void addSystemDefaultIcons(ColorBundle.Builder builder, String... previewIcons) {
+        try {
+            for (String iconName : previewIcons) {
+                builder.addIcon(loadIconPreviewDrawable(iconName));
+            }
+        } catch (NameNotFoundException | NotFoundException e) {
+            Log.w(TAG, "Didn't find android package icons, will skip preview", e);
+        }
+    }
+
+    Drawable loadIconPreviewDrawable(String drawableName)
+            throws NameNotFoundException, NotFoundException {
+        Resources packageRes = mPackageManager.getResourcesForApplication(ANDROID_PACKAGE);
+        Resources res = Resources.getSystem();
+        return res.getDrawable(packageRes.getIdentifier(drawableName, "drawable",
+                        ANDROID_PACKAGE), null);
+    }
+}
diff --git a/src/com/android/customization/model/color/ColorCustomizationManager.java b/src/com/android/customization/model/color/ColorCustomizationManager.java
new file mode 100644
index 0000000..908480f
--- /dev/null
+++ b/src/com/android/customization/model/color/ColorCustomizationManager.java
@@ -0,0 +1,268 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.customization.model.color;
+
+import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_COLOR;
+import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_SYSTEM_PALETTE;
+import static com.android.customization.model.color.ColorOptionsProvider.COLOR_SOURCE_PRESET;
+import static com.android.customization.model.color.ColorOptionsProvider.OVERLAY_COLOR_BOTH;
+import static com.android.customization.model.color.ColorOptionsProvider.OVERLAY_COLOR_INDEX;
+import static com.android.customization.model.color.ColorOptionsProvider.OVERLAY_COLOR_SOURCE;
+import static com.android.customization.model.color.ColorOptionsProvider.OVERLAY_THEME_STYLE;
+
+import android.app.WallpaperColors;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.customization.model.CustomizationManager;
+import com.android.customization.model.ResourceConstants;
+import com.android.customization.model.color.ColorOptionsProvider.ColorSource;
+import com.android.customization.model.theme.OverlayManagerCompat;
+import com.android.wallpaper.R;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/** The Color manager to manage Color bundle related operations. */
+public class ColorCustomizationManager implements CustomizationManager<ColorOption> {
+
+    private static final String TAG = "ColorCustomizationManager";
+    private static final ExecutorService sExecutorService = Executors.newSingleThreadExecutor();
+
+    private static final Set<String> COLOR_OVERLAY_SETTINGS = new HashSet<>();
+    static {
+        COLOR_OVERLAY_SETTINGS.add(OVERLAY_CATEGORY_SYSTEM_PALETTE);
+        COLOR_OVERLAY_SETTINGS.add(OVERLAY_CATEGORY_COLOR);
+        COLOR_OVERLAY_SETTINGS.add(OVERLAY_COLOR_SOURCE);
+        COLOR_OVERLAY_SETTINGS.add(OVERLAY_THEME_STYLE);
+    }
+
+    private static ColorCustomizationManager sColorCustomizationManager;
+
+    private final ColorOptionsProvider mProvider;
+    private final OverlayManagerCompat mOverlayManagerCompat;
+    private final ContentResolver mContentResolver;
+    private final ContentObserver mObserver;
+
+    private Map<String, String> mCurrentOverlays;
+    @ColorSource private String mCurrentSource;
+    private String mCurrentStyle;
+    private WallpaperColors mHomeWallpaperColors;
+    private WallpaperColors mLockWallpaperColors;
+
+    /** Returns the {@link ColorCustomizationManager} instance. */
+    public static ColorCustomizationManager getInstance(Context context,
+            OverlayManagerCompat overlayManagerCompat) {
+        if (sColorCustomizationManager == null) {
+            Context appContext = context.getApplicationContext();
+            sColorCustomizationManager = new ColorCustomizationManager(
+                    new ColorProvider(appContext,
+                            appContext.getString(R.string.themes_stub_package)),
+                    appContext.getContentResolver(), overlayManagerCompat);
+        }
+        return sColorCustomizationManager;
+    }
+
+    @VisibleForTesting
+    ColorCustomizationManager(ColorOptionsProvider provider, ContentResolver contentResolver,
+            OverlayManagerCompat overlayManagerCompat) {
+        mProvider = provider;
+        mContentResolver = contentResolver;
+        mObserver = new ContentObserver(/* handler= */ null) {
+            @Override
+            public void onChange(boolean selfChange, Uri uri) {
+                super.onChange(selfChange, uri);
+                // Resets current overlays when system's theme setting is changed.
+                if (TextUtils.equals(uri.getLastPathSegment(), ResourceConstants.THEME_SETTING)) {
+                    Log.i(TAG, "Resetting " + mCurrentOverlays + ", " + mCurrentStyle + ", "
+                            + mCurrentSource + " to null");
+                    mCurrentOverlays = null;
+                    mCurrentStyle = null;
+                    mCurrentSource = null;
+                }
+            }
+        };
+        mContentResolver.registerContentObserver(
+                Settings.Secure.CONTENT_URI, /* notifyForDescendants= */ true, mObserver);
+        mOverlayManagerCompat = overlayManagerCompat;
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return mOverlayManagerCompat.isAvailable() && mProvider.isAvailable();
+    }
+
+    @Override
+    public void apply(ColorOption theme, Callback callback) {
+        applyOverlays(theme, callback);
+    }
+
+    private void applyOverlays(ColorOption colorOption, Callback callback) {
+        sExecutorService.submit(() -> {
+            String currentStoredOverlays = getStoredOverlays();
+            if (TextUtils.isEmpty(currentStoredOverlays)) {
+                currentStoredOverlays = "{}";
+            }
+            JSONObject overlaysJson = null;
+            try {
+                overlaysJson = new JSONObject(currentStoredOverlays);
+                JSONObject colorJson = colorOption.getJsonPackages(true);
+                for (String setting : COLOR_OVERLAY_SETTINGS) {
+                    overlaysJson.remove(setting);
+                }
+                for (Iterator<String> it = colorJson.keys(); it.hasNext(); ) {
+                    String key = it.next();
+                    overlaysJson.put(key, colorJson.get(key));
+                }
+                overlaysJson.put(OVERLAY_COLOR_SOURCE, colorOption.getSource());
+                overlaysJson.put(OVERLAY_COLOR_INDEX, String.valueOf(colorOption.getIndex()));
+                overlaysJson.put(OVERLAY_THEME_STYLE,
+                        String.valueOf(colorOption.getStyle().toString()));
+
+                // OVERLAY_COLOR_BOTH is only for wallpaper color case, not preset.
+                if (!COLOR_SOURCE_PRESET.equals(colorOption.getSource())) {
+                    boolean isForBoth =
+                            (mLockWallpaperColors == null || mLockWallpaperColors.equals(
+                                    mHomeWallpaperColors));
+                    overlaysJson.put(OVERLAY_COLOR_BOTH, isForBoth ? "1" : "0");
+                } else {
+                    overlaysJson.remove(OVERLAY_COLOR_BOTH);
+                }
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+            boolean allApplied = overlaysJson != null && Settings.Secure.putString(
+                    mContentResolver, ResourceConstants.THEME_SETTING, overlaysJson.toString());
+            new Handler(Looper.getMainLooper()).post(() -> {
+                if (allApplied) {
+                    callback.onSuccess();
+                } else {
+                    callback.onError(null);
+                }
+            });
+        });
+    }
+
+    @Override
+    public void fetchOptions(OptionsFetchedListener<ColorOption> callback, boolean reload) {
+        WallpaperColors lockWallpaperColors = mLockWallpaperColors;
+        if (lockWallpaperColors != null && mLockWallpaperColors.equals(mHomeWallpaperColors)) {
+            lockWallpaperColors = null;
+        }
+        mProvider.fetch(callback, reload, mHomeWallpaperColors, lockWallpaperColors);
+    }
+
+    /**
+     * Sets the current wallpaper colors to extract seeds from
+     */
+    public void setWallpaperColors(WallpaperColors homeColors,
+            @Nullable WallpaperColors lockColors) {
+        mHomeWallpaperColors = homeColors;
+        mLockWallpaperColors = lockColors;
+    }
+
+    /**
+     * Gets current overlays mapping
+     * @return the {@link Map} of overlays
+     */
+    public Map<String, String> getCurrentOverlays() {
+        if (mCurrentOverlays == null) {
+            parseSettings(getStoredOverlays());
+        }
+        return mCurrentOverlays;
+    }
+
+    /**
+     * @return The source of the currently applied color. One of
+     * {@link ColorOptionsProvider#COLOR_SOURCE_HOME},{@link ColorOptionsProvider#COLOR_SOURCE_LOCK}
+     * or {@link ColorOptionsProvider#COLOR_SOURCE_PRESET}.
+     */
+    @ColorSource
+    public String getCurrentColorSource() {
+        if (mCurrentSource == null) {
+            parseSettings(getStoredOverlays());
+        }
+        return mCurrentSource;
+    }
+
+    /**
+     * @return The style of the currently applied color. One of enum values in
+     * {@link com.android.systemui.monet.Style}.
+     */
+    public String getCurrentStyle() {
+        if (mCurrentStyle == null) {
+            parseSettings(getStoredOverlays());
+        }
+        return mCurrentStyle;
+    }
+
+    public String getStoredOverlays() {
+        return Settings.Secure.getString(mContentResolver, ResourceConstants.THEME_SETTING);
+    }
+
+    @VisibleForTesting
+    void parseSettings(String serializedJson) {
+        Map<String, String> allSettings = parseColorSettings(serializedJson);
+        mCurrentSource = allSettings.remove(OVERLAY_COLOR_SOURCE);
+        mCurrentStyle = allSettings.remove(OVERLAY_THEME_STYLE);
+        mCurrentOverlays = allSettings;
+    }
+
+    private Map<String, String> parseColorSettings(String serializedJsonSettings) {
+        Map<String, String> overlayPackages = new HashMap<>();
+        if (serializedJsonSettings != null) {
+            try {
+                final JSONObject jsonPackages = new JSONObject(serializedJsonSettings);
+
+                JSONArray names = jsonPackages.names();
+                if (names != null) {
+                    for (int i = 0; i < names.length(); i++) {
+                        String category = names.getString(i);
+                        if (COLOR_OVERLAY_SETTINGS.contains(category)) {
+                            try {
+                                overlayPackages.put(category, jsonPackages.getString(category));
+                            } catch (JSONException e) {
+                                Log.e(TAG, "parseColorOverlays: " + e.getLocalizedMessage(), e);
+                            }
+                        }
+                    }
+                }
+            } catch (JSONException e) {
+                Log.e(TAG, "parseColorOverlays: " + e.getLocalizedMessage(), e);
+            }
+        }
+        return overlayPackages;
+    }
+}
diff --git a/src/com/android/customization/model/color/ColorOption.java b/src/com/android/customization/model/color/ColorOption.java
new file mode 100644
index 0000000..c8b28c2
--- /dev/null
+++ b/src/com/android/customization/model/color/ColorOption.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.customization.model.color;
+
+import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_COLOR;
+import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_SYSTEM_PALETTE;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.customization.model.CustomizationManager;
+import com.android.customization.model.CustomizationOption;
+import com.android.customization.model.color.ColorOptionsProvider.ColorSource;
+import com.android.systemui.monet.Style;
+import com.android.wallpaper.R;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Represents a color choice for the user.
+ * This could be a preset color or those obtained from a wallpaper.
+ */
+public abstract class ColorOption implements CustomizationOption<ColorOption> {
+
+    private static final String TAG = "ColorOption";
+    private static final String EMPTY_JSON = "{}";
+    @VisibleForTesting
+    static final String TIMESTAMP_FIELD = "_applied_timestamp";
+
+    protected final Map<String, String> mPackagesByCategory;
+    protected final int[] mPreviewColorIds = {R.id.color_preview_0, R.id.color_preview_1,
+            R.id.color_preview_2, R.id.color_preview_3};
+    private final String mTitle;
+    private final boolean mIsDefault;
+    private final Style mStyle;
+    private final int mIndex;
+    private CharSequence mContentDescription;
+
+    protected ColorOption(String title, Map<String, String> overlayPackages, boolean isDefault,
+            Style style, int index) {
+        mTitle = title;
+        mIsDefault = isDefault;
+        mStyle = style;
+        mIndex = index;
+        mPackagesByCategory = Collections.unmodifiableMap(removeNullValues(overlayPackages));
+    }
+
+    @Override
+    public String getTitle() {
+        return mTitle;
+    }
+
+    @Override
+    public boolean isActive(CustomizationManager<ColorOption> manager) {
+        ColorCustomizationManager colorManager = (ColorCustomizationManager) manager;
+
+        String currentStyle = colorManager.getCurrentStyle();
+        if (TextUtils.isEmpty(currentStyle)) {
+            currentStyle = Style.TONAL_SPOT.toString();
+        }
+        boolean isCurrentStyle = TextUtils.equals(getStyle().toString(), currentStyle);
+
+        if (mIsDefault) {
+            String serializedOverlays = colorManager.getStoredOverlays();
+            return (TextUtils.isEmpty(serializedOverlays) || EMPTY_JSON.equals(serializedOverlays)
+                    || colorManager.getCurrentOverlays().isEmpty() || !(serializedOverlays.contains(
+                    OVERLAY_CATEGORY_SYSTEM_PALETTE) || serializedOverlays.contains(
+                    OVERLAY_CATEGORY_COLOR))) && isCurrentStyle;
+        } else {
+            Map<String, String> currentOverlays = colorManager.getCurrentOverlays();
+            String currentSource = colorManager.getCurrentColorSource();
+            boolean isCurrentSource = TextUtils.isEmpty(currentSource) || getSource().equals(
+                    currentSource);
+            return isCurrentSource && isCurrentStyle && mPackagesByCategory.equals(currentOverlays);
+        }
+    }
+
+    /**
+     * This is similar to #equals() but it only compares this theme's packages with the other, that
+     * is, it will return true if applying this theme has the same effect of applying the given one.
+     */
+    public boolean isEquivalent(ColorOption other) {
+        if (other == null) {
+            return false;
+        }
+        if (mIsDefault) {
+            return other.isDefault() || TextUtils.isEmpty(other.getSerializedPackages())
+                    || EMPTY_JSON.equals(other.getSerializedPackages());
+        }
+        // Map#equals ensures keys and values are compared.
+        return mPackagesByCategory.equals(other.mPackagesByCategory);
+    }
+
+    /**
+     * Returns the {@link PreviewInfo} object for this ColorOption
+     */
+    public abstract PreviewInfo getPreviewInfo();
+
+    boolean isDefault() {
+        return mIsDefault;
+    }
+
+    public Map<String, String> getPackagesByCategory() {
+        return mPackagesByCategory;
+    }
+
+    public String getSerializedPackages() {
+        return getJsonPackages(false).toString();
+    }
+
+    public String getSerializedPackagesWithTimestamp() {
+        return getJsonPackages(true).toString();
+    }
+
+    /**
+     * Get a JSONObject representation of this color option, with the current values for each
+     * field, and optionally a {@link TIMESTAMP_FIELD} field.
+     * @param insertTimestamp whether to add a field with the current timestamp
+     * @return the JSONObject for this color option
+     */
+    public JSONObject getJsonPackages(boolean insertTimestamp) {
+        JSONObject json;
+        if (isDefault()) {
+            json = new JSONObject();
+        } else {
+            json = new JSONObject(mPackagesByCategory);
+            // Remove items with null values to avoid deserialization issues.
+            removeNullValues(json);
+        }
+        if (insertTimestamp) {
+            try {
+                json.put(TIMESTAMP_FIELD, System.currentTimeMillis());
+            } catch (JSONException e) {
+                Log.e(TAG, "Couldn't add timestamp to serialized themebundle");
+            }
+        }
+        return json;
+    }
+
+    private void removeNullValues(JSONObject json) {
+        Iterator<String> keys = json.keys();
+        Set<String> keysToRemove = new HashSet<>();
+        while (keys.hasNext()) {
+            String key = keys.next();
+            if (json.isNull(key)) {
+                keysToRemove.add(key);
+            }
+        }
+        for (String key : keysToRemove) {
+            json.remove(key);
+        }
+    }
+
+    private Map<String, String> removeNullValues(Map<String, String> map) {
+        return map.entrySet()
+                .stream()
+                .filter(entry -> entry.getValue() != null)
+                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+    }
+
+    protected CharSequence getContentDescription(Context context) {
+        if (mContentDescription == null) {
+            CharSequence defaultName = context.getString(R.string.default_theme_title);
+            if (isDefault()) {
+                mContentDescription = defaultName;
+            } else {
+                mContentDescription = mTitle;
+            }
+        }
+        return mContentDescription;
+    }
+
+    /**
+     * @return the source of this color option
+     */
+    @ColorSource
+    public abstract String getSource();
+
+    /**
+     * @return the style of this color option
+     */
+    public Style getStyle() {
+        return mStyle;
+    }
+
+    /**
+     * @return the index of this color option
+     */
+    public int getIndex() {
+        return mIndex;
+    }
+
+    /**
+     * The preview information of {@link ColorOption}
+     */
+    public interface PreviewInfo {
+    }
+
+}
diff --git a/src/com/android/customization/model/color/ColorOptionsProvider.java b/src/com/android/customization/model/color/ColorOptionsProvider.java
new file mode 100644
index 0000000..2803c7b
--- /dev/null
+++ b/src/com/android/customization/model/color/ColorOptionsProvider.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.customization.model.color;
+
+import android.app.WallpaperColors;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.StringDef;
+
+import com.android.customization.model.CustomizationManager.OptionsFetchedListener;
+
+/**
+ * Interface for a class that can retrieve Colors from the system.
+ */
+public interface ColorOptionsProvider {
+
+    /**
+     * Extra setting indicating the source of the color overlays (it can be one of
+     * COLOR_SOURCE_PRESET, COLOR_SOURCE_HOME or COLOR_SOURCE_LOCK)
+     */
+    String OVERLAY_COLOR_SOURCE = "android.theme.customization.color_source";
+
+    /**
+     * Extra setting indicating the style of the color overlays (it can be one of
+     * {@link com.android.systemui.monet.Style}).
+     */
+    String OVERLAY_THEME_STYLE = "android.theme.customization.theme_style";
+
+    /**
+     * Users selected color option, its value starts from 1 (which means first option).
+     */
+    String OVERLAY_COLOR_INDEX = "android.theme.customization.color_index";
+
+    /**
+     * Users selected color from both home and lock screen.
+     * Example value: 0 means home or lock screen, 1 means both.
+     */
+    String OVERLAY_COLOR_BOTH = "android.theme.customization.color_both";
+
+    String COLOR_SOURCE_PRESET = "preset";
+    String COLOR_SOURCE_HOME = "home_wallpaper";
+    String COLOR_SOURCE_LOCK = "lock_wallpaper";
+
+    @StringDef({COLOR_SOURCE_PRESET, COLOR_SOURCE_HOME, COLOR_SOURCE_LOCK})
+    @interface ColorSource{}
+
+
+    /**
+     * Returns whether themes are available in the current setup.
+     */
+    boolean isAvailable();
+
+    /**
+     * Retrieve the available themes.
+     * @param callback called when the themes have been retrieved (or immediately if cached)
+     * @param reload whether to reload themes if they're cached.
+     * @param homeWallpaperColors to get seed colors from
+     * @param lockWallpaperColors WallpaperColors from the lockscreen wallpaper to get seeds from,
+     *                            if different than homeWallpaperColors
+     */
+    void fetch(OptionsFetchedListener<ColorOption> callback, boolean reload,
+            @Nullable WallpaperColors homeWallpaperColors,
+            @Nullable WallpaperColors lockWallpaperColors);
+}
diff --git a/src/com/android/customization/model/color/ColorProvider.kt b/src/com/android/customization/model/color/ColorProvider.kt
new file mode 100644
index 0000000..a63f904
--- /dev/null
+++ b/src/com/android/customization/model/color/ColorProvider.kt
@@ -0,0 +1,281 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.customization.model.color
+
+import android.app.WallpaperColors
+import android.content.Context
+import android.content.res.ColorStateList
+import android.content.res.Resources
+import android.text.TextUtils
+import androidx.annotation.ColorInt
+import androidx.core.graphics.ColorUtils.setAlphaComponent
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.lifecycleScope
+import com.android.customization.model.CustomizationManager.OptionsFetchedListener
+import com.android.customization.model.ResourceConstants.COLOR_BUNDLES_ARRAY_NAME
+import com.android.customization.model.ResourceConstants.COLOR_BUNDLE_MAIN_COLOR_PREFIX
+import com.android.customization.model.ResourceConstants.COLOR_BUNDLE_NAME_PREFIX
+import com.android.customization.model.ResourceConstants.COLOR_BUNDLE_STYLE_PREFIX
+import com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_SYSTEM_PALETTE
+import com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_COLOR
+import com.android.customization.model.ResourcesApkProvider
+import com.android.customization.model.color.ColorOptionsProvider.COLOR_SOURCE_HOME
+import com.android.customization.model.color.ColorOptionsProvider.COLOR_SOURCE_LOCK
+import com.android.customization.model.color.ColorUtils.toColorString
+import com.android.systemui.monet.ColorScheme
+import com.android.systemui.monet.Style
+import com.android.wallpaper.compat.WallpaperManagerCompat
+import com.android.wallpaper.module.InjectorProvider
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import java.util.*
+
+/**
+ * Default implementation of {@link ColorOptionsProvider} that reads preset colors from
+ * a stub APK.
+ */
+class ColorProvider(context: Context, stubPackageName: String) :
+        ResourcesApkProvider(context, stubPackageName), ColorOptionsProvider {
+
+    companion object {
+        const val themeStyleEnabled = true
+        val styleSize = if (themeStyleEnabled) Style.values().size else 1
+        private const val TAG = "ColorProvider"
+        private const val MAX_SEED_COLORS = 4
+        private const val MAX_PRESET_COLORS = 4
+        private const val ALPHA_MASK = 0xFF
+    }
+
+    private val monetEnabled = ColorUtils.isMonetEnabled(context)
+    // TODO(b/202145216): Use style method to fetch the list of style.
+    private var styleList = if (themeStyleEnabled) arrayOf(
+        Style.TONAL_SPOT, Style.SPRITZ, Style.VIBRANT, Style.EXPRESSIVE
+    ) else arrayOf(Style.TONAL_SPOT)
+
+    private val scope = if (mContext is LifecycleOwner) {
+        mContext.lifecycleScope
+    } else {
+        CoroutineScope(Dispatchers.Default + SupervisorJob())
+    }
+
+    private var colorsAvailable = true
+    private var colorBundles: List<ColorOption>? = null
+    private var homeWallpaperColors: WallpaperColors? = null
+    private var lockWallpaperColors: WallpaperColors? = null
+
+
+    override fun isAvailable(): Boolean {
+        return monetEnabled && super.isAvailable() && colorsAvailable
+    }
+
+    override fun fetch(callback: OptionsFetchedListener<ColorOption>?, reload: Boolean,
+                       homeWallpaperColors: WallpaperColors?,
+                       lockWallpaperColors: WallpaperColors?) {
+        val wallpaperColorsChanged = this.homeWallpaperColors != homeWallpaperColors
+                || this.lockWallpaperColors != lockWallpaperColors
+        if (wallpaperColorsChanged) {
+            this.homeWallpaperColors = homeWallpaperColors
+            this.lockWallpaperColors = lockWallpaperColors
+        }
+        if(colorBundles == null || reload || wallpaperColorsChanged) {
+            scope.launch {
+                try {
+                    if (colorBundles == null || reload) {
+                        loadPreset()
+                    }
+                    if (wallpaperColorsChanged || reload) {
+                        loadSeedColors(homeWallpaperColors, lockWallpaperColors)
+                    }
+                } catch (e: Throwable) {
+                    colorsAvailable = false
+                    callback?.onError(e)
+                    return@launch
+                }
+                callback?.onOptionsLoaded(colorBundles)
+            }
+        } else {
+            callback?.onOptionsLoaded(colorBundles)
+        }
+    }
+
+    private fun isLockScreenWallpaperLastApplied(): Boolean {
+        // The WallpaperId increases every time a new wallpaper is set, so the larger wallpaper id
+        // is the most recently set wallpaper
+        val manager = InjectorProvider.getInjector().getWallpaperManagerCompat(mContext)
+        return manager.getWallpaperId(WallpaperManagerCompat.FLAG_LOCK) >
+                manager.getWallpaperId(WallpaperManagerCompat.FLAG_SYSTEM)
+    }
+
+    private fun loadSeedColors(homeWallpaperColors: WallpaperColors?,
+                               lockWallpaperColors: WallpaperColors?) {
+        if (homeWallpaperColors == null) return
+
+        val bundles: MutableList<ColorOption> = ArrayList()
+        val colorsPerSource = if (lockWallpaperColors == null) {
+            MAX_SEED_COLORS
+        } else {
+            MAX_SEED_COLORS / 2
+        }
+
+        if (lockWallpaperColors != null) {
+            val shouldLockColorsGoFirst = isLockScreenWallpaperLastApplied()
+            // First half of the colors
+            buildColorSeeds(
+                    if (shouldLockColorsGoFirst) lockWallpaperColors else homeWallpaperColors,
+                    colorsPerSource,
+                    if (shouldLockColorsGoFirst) COLOR_SOURCE_LOCK else COLOR_SOURCE_HOME,
+                    true,
+                    bundles)
+            // Second half of the colors
+            buildColorSeeds(
+                    if (shouldLockColorsGoFirst) homeWallpaperColors else lockWallpaperColors,
+                    MAX_SEED_COLORS - bundles.size / styleSize,
+                    if (shouldLockColorsGoFirst) COLOR_SOURCE_HOME else COLOR_SOURCE_LOCK,
+                    false,
+                    bundles)
+        } else {
+            buildColorSeeds(homeWallpaperColors, colorsPerSource, COLOR_SOURCE_HOME, true, bundles)
+        }
+
+        bundles.addAll(colorBundles?.filterNot{it is ColorSeedOption} ?: emptyList())
+        colorBundles = bundles
+    }
+
+    private fun buildColorSeeds(wallpaperColors: WallpaperColors, maxColors: Int, source: String,
+                                containsDefault: Boolean, bundles: MutableList<ColorOption>) {
+        val seedColors = ColorScheme.getSeedColors(wallpaperColors)
+        val defaultSeed = seedColors.first()
+        buildBundle(defaultSeed, 0, containsDefault, source, bundles)
+        for ((i, colorInt) in seedColors.drop(1).take(maxColors - 1).withIndex()) {
+            buildBundle(colorInt, i + 1, false, source, bundles)
+        }
+    }
+
+    private fun buildBundle(colorInt: Int, i: Int, isDefault: Boolean, source: String,
+                            bundles: MutableList<ColorOption>) {
+        // TODO(b/202145216): Measure time cost in the loop.
+        for (style in styleList) {
+            val builder = ColorSeedOption.Builder()
+            val lightColorScheme = ColorScheme(colorInt, /* darkTheme= */ false, style)
+            val darkColorScheme = ColorScheme(colorInt, /* darkTheme= */ true, style)
+            builder.setLightColors(lightColorScheme.getLightColorPreview())
+                .setDarkColors(darkColorScheme.getDarkColorPreview())
+                .addOverlayPackage(OVERLAY_CATEGORY_SYSTEM_PALETTE,
+                    if (isDefault) "" else toColorString(colorInt)
+                )
+                .addOverlayPackage(OVERLAY_CATEGORY_COLOR,
+                    if (isDefault) "" else toColorString(colorInt)
+                )
+                .setSource(source)
+                .setStyle(style)
+                // Color option index value starts from 1.
+                .setIndex(i + 1)
+
+            if (isDefault) builder.asDefault()
+
+            bundles.add(builder.build())
+        }
+    }
+
+    /**
+     * Returns the colors for the light theme version of the preview of a ColorScheme
+     * based on this order:
+     * |-------|
+     * | 0 | 1 |
+     * |---+---|
+     * | 2 | 3 |
+     * |-------|
+     */
+    @ColorInt
+    private fun ColorScheme.getLightColorPreview(): IntArray {
+        return intArrayOf(setAlphaComponent(this.accent1[2], ALPHA_MASK),
+                setAlphaComponent(this.accent1[2], ALPHA_MASK),
+                ColorStateList.valueOf(this.accent3[6]).withLStar(85f).colors[0],
+                setAlphaComponent(this.accent1[6], ALPHA_MASK))
+    }
+
+    /**
+     * Returns the color for the dark theme version of the preview of a ColorScheme
+     * based on this order:
+     * |-------|
+     * | 0 | 1 |
+     * |---+---|
+     * | 2 | 3 |
+     * |-------|
+     */
+    @ColorInt
+    private fun ColorScheme.getDarkColorPreview(): IntArray {
+        return intArrayOf(setAlphaComponent(this.accent1[2], ALPHA_MASK),
+                setAlphaComponent(this.accent1[2], ALPHA_MASK),
+                ColorStateList.valueOf(this.accent3[6]).withLStar(85f).colors[0],
+                setAlphaComponent(this.accent1[6], ALPHA_MASK))
+    }
+
+    private fun ColorScheme.getPresetColorPreview(seed: Int): IntArray {
+        return when(this.style) {
+            Style.FRUIT_SALAD -> intArrayOf(seed, this.accent1[2])
+            Style.TONAL_SPOT -> intArrayOf(this.accentColor, this.accentColor)
+            else -> intArrayOf(this.accent1[2], this.accent1[2])
+        }
+    }
+
+    private suspend fun loadPreset() = withContext(Dispatchers.IO) {
+        val extractor = ColorBundlePreviewExtractor(mContext)
+        val bundles: MutableList<ColorOption> = ArrayList()
+
+        val bundleNames = getItemsFromStub(COLOR_BUNDLES_ARRAY_NAME)
+        // Color option index value starts from 1.
+        var index = 1
+        val maxPresetColors = if (themeStyleEnabled) bundleNames.size else MAX_PRESET_COLORS
+        for (bundleName in bundleNames.take(maxPresetColors)) {
+            val builder = ColorBundle.Builder()
+            builder.title = getItemStringFromStub(COLOR_BUNDLE_NAME_PREFIX, bundleName)
+            builder.setIndex(index)
+            val colorFromStub = getItemColorFromStub(COLOR_BUNDLE_MAIN_COLOR_PREFIX, bundleName)
+            extractor.addPrimaryColor(builder, colorFromStub)
+            extractor.addSecondaryColor(builder, colorFromStub)
+            if (themeStyleEnabled) {
+                val styleName = try {
+                    getItemStringFromStub(COLOR_BUNDLE_STYLE_PREFIX, bundleName)
+                } catch (e: Resources.NotFoundException) {
+                    null
+                }
+                extractor.addColorStyle(builder, styleName)
+                val style = try {
+                    if (styleName != null) Style.valueOf(styleName) else Style.TONAL_SPOT
+                } catch (e: IllegalArgumentException) {
+                    Style.TONAL_SPOT
+                }
+
+                val darkColors = ColorScheme(colorFromStub, true, style)
+                        .getPresetColorPreview(colorFromStub)
+                val lightColors = ColorScheme(colorFromStub, false, style)
+                        .getPresetColorPreview(colorFromStub)
+                builder.setColorPrimaryDark(darkColors[0]).setColorSecondaryDark(darkColors[1])
+                builder.setColorPrimaryLight(lightColors[0]).setColorSecondaryLight(lightColors[1])
+            }
+
+            extractor.addAndroidIconOverlay(builder)
+            bundles.add(builder.build(mContext))
+            index++
+        }
+
+        colorBundles = bundles
+    }
+}
diff --git a/src/com/android/customization/model/color/ColorSectionController.java b/src/com/android/customization/model/color/ColorSectionController.java
new file mode 100644
index 0000000..3b8a927
--- /dev/null
+++ b/src/com/android/customization/model/color/ColorSectionController.java
@@ -0,0 +1,554 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.customization.model.color;
+
+import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO;
+import static android.view.View.VISIBLE;
+
+import static com.android.customization.model.color.ColorOptionsProvider.COLOR_SOURCE_HOME;
+import static com.android.customization.model.color.ColorOptionsProvider.COLOR_SOURCE_LOCK;
+import static com.android.customization.model.color.ColorOptionsProvider.COLOR_SOURCE_PRESET;
+import static com.android.customization.widget.OptionSelectorController.CheckmarkStyle.CENTER;
+
+import android.app.Activity;
+import android.app.WallpaperColors;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.stats.style.StyleEnums;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.widget.FrameLayout;
+
+import androidx.annotation.Nullable;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.viewpager2.widget.MarginPageTransformer;
+import androidx.viewpager2.widget.ViewPager2;
+
+import com.android.customization.model.CustomizationManager;
+import com.android.customization.model.theme.OverlayManagerCompat;
+import com.android.customization.module.CustomizationInjector;
+import com.android.customization.module.ThemesUserEventLogger;
+import com.android.customization.picker.color.ColorSectionView;
+import com.android.customization.widget.OptionSelectorController;
+import com.android.wallpaper.R;
+import com.android.wallpaper.model.CustomizationSectionController;
+import com.android.wallpaper.model.WallpaperColorsViewModel;
+import com.android.wallpaper.module.InjectorProvider;
+import com.android.wallpaper.module.LargeScreenMultiPanesChecker;
+import com.android.wallpaper.widget.PageIndicator;
+import com.android.wallpaper.widget.SeparatedTabLayout;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Optional;
+
+/**
+ * Color section view's controller for the logic of color customization.
+ */
+public class ColorSectionController implements CustomizationSectionController<ColorSectionView> {
+
+    private static final String TAG = "ColorSectionController";
+    private static final String KEY_COLOR_TAB_POSITION = "COLOR_TAB_POSITION";
+    private static final String KEY_COLOR_PAGE_POSITION = "COLOR_PAGE_POSITION";
+    private static final String ID_VIEWPAGER = "ColorSectionController_colorSectionViewPager";
+    private static final String ID_ITEMVIEW = "ColorSectionController_itemView";
+    private static final String ID_CONTAINER = "ColorSectionController_container";
+    private static final long MIN_COLOR_APPLY_PERIOD = 500L;
+
+    private static final int WALLPAPER_TAB_INDEX = 0;
+    private static final int PRESET_TAB_INDEX = 1;
+
+    private final ThemesUserEventLogger mEventLogger;
+    private final ColorCustomizationManager mColorManager;
+    private final WallpaperColorsViewModel mWallpaperColorsViewModel;
+    private final LifecycleOwner mLifecycleOwner;
+    private final ColorSectionAdapter mColorSectionAdapter = new ColorSectionAdapter();
+
+    private List<ColorOption> mWallpaperColorOptions = new ArrayList<>();
+    private List<ColorOption> mPresetColorOptions = new ArrayList<>();
+    private ViewPager2 mColorSectionViewPager;
+    private ColorOption mSelectedColor;
+    private SeparatedTabLayout mTabLayout;
+    @Nullable private WallpaperColors mHomeWallpaperColors;
+    @Nullable private WallpaperColors mLockWallpaperColors;
+    // Uses a boolean value to indicate whether wallpaper color is ready because WallpaperColors
+    // maybe be null when it's ready.
+    private boolean mHomeWallpaperColorsReady;
+    private boolean mLockWallpaperColorsReady;
+    private Optional<Integer> mTabPositionToRestore = Optional.empty();
+    private Optional<Integer>[] mPagePositionToRestore =
+            new Optional[]{Optional.empty(), Optional.empty()};
+    private long mLastColorApplyingTime = 0L;
+    private ColorSectionView mColorSectionView;
+    private boolean mIsMultiPane;
+
+    private static int getNumPages(int optionsPerPage, int totalOptions) {
+        return (int) Math.ceil((float) totalOptions / optionsPerPage);
+    }
+
+    public ColorSectionController(Activity activity, WallpaperColorsViewModel viewModel,
+            LifecycleOwner lifecycleOwner, @Nullable Bundle savedInstanceState) {
+        CustomizationInjector injector = (CustomizationInjector) InjectorProvider.getInjector();
+        mEventLogger = (ThemesUserEventLogger) injector.getUserEventLogger(activity);
+        mColorManager = ColorCustomizationManager.getInstance(activity,
+                new OverlayManagerCompat(activity));
+        mWallpaperColorsViewModel = viewModel;
+        mLifecycleOwner = lifecycleOwner;
+        mIsMultiPane = new LargeScreenMultiPanesChecker().isMultiPanesEnabled(activity);
+
+        if (savedInstanceState != null) {
+            if (savedInstanceState.containsKey(KEY_COLOR_TAB_POSITION)) {
+                mTabPositionToRestore = Optional.of(
+                        savedInstanceState.getInt(KEY_COLOR_TAB_POSITION));
+            }
+
+            for (int i = 0; i < mPagePositionToRestore.length; i++) {
+                String keyColorPage = getPagePositionKey(i);
+                if (keyColorPage != null && savedInstanceState.containsKey(keyColorPage)) {
+                    setPagePositionToRestore(i, savedInstanceState.getInt(keyColorPage));
+                }
+            }
+        }
+    }
+
+    private String getPagePositionKey(int index) {
+        return String.format(Locale.US, "%s_%d", KEY_COLOR_PAGE_POSITION, index);
+    }
+
+    private void setPagePositionToRestore(int pagePositionKeyIndex, int pagePosition) {
+        if (pagePositionKeyIndex >= 0 && pagePositionKeyIndex < mPagePositionToRestore.length) {
+            mPagePositionToRestore[pagePositionKeyIndex] = Optional.of(pagePosition);
+        }
+    }
+
+    private int getPagePositionToRestore(int pagePositionKeyIndex, int defaultPagePosition) {
+        if (pagePositionKeyIndex >= 0 && pagePositionKeyIndex < mPagePositionToRestore.length) {
+            return mPagePositionToRestore[pagePositionKeyIndex].orElse(defaultPagePosition);
+        }
+        return 0;
+    }
+
+    @Override
+    public boolean isAvailable(@Nullable Context context) {
+        return context != null && ColorUtils.isMonetEnabled(context) && mColorManager.isAvailable();
+    }
+
+    @Override
+    public ColorSectionView createView(Context context) {
+        mColorSectionView = (ColorSectionView) LayoutInflater.from(context).inflate(
+                R.layout.color_section_view, /* root= */ null);
+        mColorSectionViewPager = mColorSectionView.findViewById(R.id.color_section_view_pager);
+        mColorSectionViewPager.setAccessibilityDelegate(createAccessibilityDelegate(ID_VIEWPAGER));
+        mColorSectionViewPager.setAdapter(mColorSectionAdapter);
+        mColorSectionViewPager.setUserInputEnabled(false);
+        if (ColorProvider.themeStyleEnabled) {
+            mColorSectionViewPager.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
+        }
+        mTabLayout = mColorSectionView.findViewById(R.id.separated_tabs);
+        mColorSectionAdapter.setNumColors(context.getResources().getInteger(
+                R.integer.options_grid_num_columns));
+        // TODO(b/202145216): Use just 2 views when tapping either button on top.
+        mTabLayout.setViewPager(mColorSectionViewPager);
+
+        mWallpaperColorsViewModel.getHomeWallpaperColors().observe(mLifecycleOwner,
+                homeColors -> {
+                    mHomeWallpaperColors = homeColors;
+                    mHomeWallpaperColorsReady = true;
+                    maybeLoadColors();
+                });
+        mWallpaperColorsViewModel.getLockWallpaperColors().observe(mLifecycleOwner,
+                lockColors -> {
+                    mLockWallpaperColors = lockColors;
+                    mLockWallpaperColorsReady = true;
+                    maybeLoadColors();
+                });
+        return mColorSectionView;
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle savedInstanceState) {
+        if (mColorSectionViewPager != null) {
+            savedInstanceState.putInt(KEY_COLOR_TAB_POSITION,
+                    mColorSectionViewPager.getCurrentItem());
+
+            for (int i = 0; i < mPagePositionToRestore.length; i++) {
+                savedInstanceState.putInt(getPagePositionKey(i), getPagePositionToRestore(i, 0));
+            }
+        }
+    }
+
+    private void maybeLoadColors() {
+        if (mHomeWallpaperColorsReady && mLockWallpaperColorsReady) {
+            mColorManager.setWallpaperColors(mHomeWallpaperColors, mLockWallpaperColors);
+            loadColorOptions(/* reload= */ false);
+        }
+    }
+
+    private void loadColorOptions(boolean reload) {
+        mColorManager.fetchOptions(new CustomizationManager.OptionsFetchedListener<ColorOption>() {
+            @Override
+            public void onOptionsLoaded(List<ColorOption> options) {
+                List<ColorOption> wallpaperColorOptions = new ArrayList<>();
+                List<ColorOption> presetColorOptions = new ArrayList<>();
+                for (ColorOption option : options) {
+                    if (option instanceof ColorSeedOption) {
+                        wallpaperColorOptions.add(option);
+                    } else if (option instanceof ColorBundle) {
+                        presetColorOptions.add(option);
+                    }
+                }
+                mWallpaperColorOptions = wallpaperColorOptions;
+                mPresetColorOptions = presetColorOptions;
+                mSelectedColor = findActiveColorOption(mWallpaperColorOptions,
+                        mPresetColorOptions);
+                mTabLayout.post(()-> setUpColorViewPager());
+            }
+
+            @Override
+            public void onError(@Nullable Throwable throwable) {
+                if (throwable != null) {
+                    Log.e(TAG, "Error loading theme bundles", throwable);
+                }
+            }
+        }, reload);
+    }
+
+    private void setUpColorViewPager() {
+        mColorSectionAdapter.notifyDataSetChanged();
+
+        if (mTabLayout != null && mTabLayout.getTabCount() == 0) {
+            mTabLayout.addTab(mTabLayout.newTab().setText(R.string.wallpaper_color_tab),
+                    WALLPAPER_TAB_INDEX);
+            mTabLayout.addTab(mTabLayout.newTab().setText(R.string.preset_color_tab),
+                    PRESET_TAB_INDEX);
+        }
+
+        if (mWallpaperColorOptions.isEmpty()) {
+            // Select preset tab and disable wallpaper tab.
+            mTabLayout.getTabAt(WALLPAPER_TAB_INDEX).view.setEnabled(false);
+            mColorSectionViewPager.setCurrentItem(PRESET_TAB_INDEX, /* smoothScroll= */ false);
+            return;
+        }
+
+        mColorSectionViewPager.setCurrentItem(
+                mTabPositionToRestore.orElseGet(
+                        () -> COLOR_SOURCE_PRESET.equals(mColorManager.getCurrentColorSource())
+                                ? PRESET_TAB_INDEX
+                                : WALLPAPER_TAB_INDEX),
+                /* smoothScroll= */ false);
+
+        // Disable "wallpaper colors" and "basic colors" swiping for new color style.
+        mColorSectionViewPager.setUserInputEnabled(!ColorProvider.themeStyleEnabled);
+    }
+
+    private void setupColorPages(ViewPager2 container, int colorsPerPage, int sectionPosition,
+            List<ColorOption> options, PageIndicator pageIndicator) {
+        container.setAdapter(new ColorPageAdapter(options, /* pageEnabled= */ true,
+                colorsPerPage));
+        if (ColorProvider.themeStyleEnabled) {
+            // Update page index to show selected items.
+            int selectedIndex = options.indexOf(mSelectedColor);
+            if (colorsPerPage != 0) {
+                int pageIndex = selectedIndex / colorsPerPage;
+                int position = getPagePositionToRestore(sectionPosition, pageIndex);
+                container.setCurrentItem(position, /* smoothScroll= */ false);
+            }
+            pageIndicator.setNumPages(getNumPages(colorsPerPage, options.size()));
+            registerOnPageChangeCallback(sectionPosition, container, pageIndicator);
+        }
+    }
+
+    private void registerOnPageChangeCallback(int sectionPosition, ViewPager2 container,
+            PageIndicator pageIndicator) {
+        container.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
+            @Override
+            public void onPageSelected(int position) {
+                super.onPageSelected(position);
+                if (mColorSectionViewPager.getCurrentItem() == sectionPosition) {
+                    pageIndicator.setLocation(getPagePosition(pageIndicator, position));
+                    setPagePositionToRestore(sectionPosition, position);
+                }
+            }
+
+            @Override
+            public void onPageScrolled(int position, float positionOffset,
+                    int positionOffsetPixels) {
+                super.onPageScrolled(position, positionOffset, positionOffsetPixels);
+                if (mColorSectionViewPager.getCurrentItem() == sectionPosition) {
+                    pageIndicator.setLocation(getPagePosition(pageIndicator, position));
+                    setPagePositionToRestore(sectionPosition, position);
+                }
+            }
+
+            private int getPagePosition(PageIndicator pageIndicator, int position) {
+                return pageIndicator.isLayoutRtl() ? pageIndicator.getChildCount() - 1 - position
+                        : position;
+            }
+        });
+    }
+
+    private void setupColorOptions(RecyclerView container, List<ColorOption> colorOptions,
+            boolean pageEnabled, int index, int colorsPerPage) {
+        int totalSize = colorOptions.size();
+        if (totalSize == 0) {
+            return;
+        }
+
+        List<ColorOption> subOptions;
+        if (pageEnabled && ColorProvider.themeStyleEnabled) {
+            subOptions = colorOptions.subList(colorsPerPage * index,
+                    Math.min(colorsPerPage * (index + 1), totalSize));
+        } else {
+            subOptions = colorOptions;
+        }
+
+        OptionSelectorController<ColorOption> adaptiveController = new OptionSelectorController<>(
+                container, subOptions, /* useGrid= */ true, CENTER);
+        adaptiveController.initOptions(mColorManager);
+        setUpColorOptionsController(adaptiveController);
+    }
+
+    private ColorOption findActiveColorOption(List<ColorOption> wallpaperColorOptions,
+            List<ColorOption> presetColorOptions) {
+        ColorOption activeColorOption = null;
+        for (ColorOption colorOption : Lists.newArrayList(
+                Iterables.concat(wallpaperColorOptions, presetColorOptions))) {
+            if (colorOption.isActive(mColorManager)) {
+                activeColorOption = colorOption;
+                break;
+            }
+        }
+        // Use the first one option by default. This should not happen as above should have an
+        // active option found.
+        if (activeColorOption == null) {
+            activeColorOption = wallpaperColorOptions.isEmpty()
+                    ? presetColorOptions.get(0)
+                    : wallpaperColorOptions.get(0);
+        }
+        return activeColorOption;
+    }
+
+    private void setUpColorOptionsController(
+            OptionSelectorController<ColorOption> optionSelectorController) {
+        if (mSelectedColor != null && optionSelectorController.containsOption(mSelectedColor)) {
+            optionSelectorController.setSelectedOption(mSelectedColor);
+        }
+
+        optionSelectorController.addListener(selectedOption -> {
+            ColorOption selectedColor = (ColorOption) selectedOption;
+            if (mSelectedColor.equals(selectedColor)) {
+                return;
+            }
+            mSelectedColor = (ColorOption) selectedOption;
+            // Post with delay for color option to run ripple.
+            new Handler().postDelayed(()-> applyColor(mSelectedColor), /* delayMillis= */ 100);
+        });
+    }
+
+    private void applyColor(ColorOption colorOption) {
+        if (SystemClock.elapsedRealtime() - mLastColorApplyingTime < MIN_COLOR_APPLY_PERIOD) {
+            return;
+        }
+        mLastColorApplyingTime = SystemClock.elapsedRealtime();
+        mColorManager.apply(colorOption, new CustomizationManager.Callback() {
+            @Override
+            public void onSuccess() {
+                mColorSectionView.announceForAccessibility(
+                        mColorSectionView.getContext().getString(R.string.color_changed));
+                mEventLogger.logColorApplied(getColorAction(colorOption), colorOption);
+            }
+
+            @Override
+            public void onError(@Nullable Throwable throwable) {
+                Log.w(TAG, "Apply theme with error: " + throwable);
+            }
+        });
+    }
+
+    private int getColorAction(ColorOption colorOption) {
+        int action = StyleEnums.DEFAULT_ACTION;
+        boolean isForBoth = mLockWallpaperColors == null || mLockWallpaperColors.equals(
+                mHomeWallpaperColors);
+
+        if (TextUtils.equals(colorOption.getSource(), COLOR_SOURCE_PRESET)) {
+            action = StyleEnums.COLOR_PRESET_APPLIED;
+        } else if (isForBoth) {
+            action = StyleEnums.COLOR_WALLPAPER_HOME_LOCK_APPLIED;
+        } else {
+            switch (colorOption.getSource()) {
+                case COLOR_SOURCE_HOME:
+                    action = StyleEnums.COLOR_WALLPAPER_HOME_APPLIED;
+                    break;
+                case COLOR_SOURCE_LOCK:
+                    action = StyleEnums.COLOR_WALLPAPER_LOCK_APPLIED;
+                    break;
+            }
+        }
+        return action;
+    }
+
+    private View.AccessibilityDelegate createAccessibilityDelegate(String id) {
+        return new View.AccessibilityDelegate() {
+            @Override
+            public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+                super.onInitializeAccessibilityNodeInfo(host, info);
+                info.setUniqueId(id);
+            }
+        };
+    }
+
+    private class ColorSectionAdapter extends
+            RecyclerView.Adapter<ColorSectionAdapter.ColorPageViewHolder> {
+
+        private final int mItemCounts = new int[]{WALLPAPER_TAB_INDEX, PRESET_TAB_INDEX}.length;
+        private int mNumColors;
+
+        @Override
+        public int getItemCount() {
+            return mItemCounts;
+        }
+
+        @Override
+        public void onBindViewHolder(ColorPageViewHolder viewHolder, int position) {
+            switch (position) {
+                case WALLPAPER_TAB_INDEX:
+                    setupColorPages(viewHolder.mContainer, mNumColors, position,
+                            mWallpaperColorOptions, viewHolder.mPageIndicator);
+                    break;
+                case PRESET_TAB_INDEX:
+                    setupColorPages(viewHolder.mContainer, mNumColors, position,
+                            mPresetColorOptions, viewHolder.mPageIndicator);
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        @Override
+        public ColorPageViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
+            return new ColorPageViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(
+                    viewType, viewGroup, false));
+        }
+
+        @Override
+        public int getItemViewType(int position) {
+            return R.layout.color_pages_view;
+        }
+
+        public void setNumColors(int numColors) {
+            mNumColors = numColors;
+        }
+
+        private class ColorPageViewHolder extends RecyclerView.ViewHolder {
+            private ViewPager2 mContainer;
+            private PageIndicator mPageIndicator;
+
+            ColorPageViewHolder(View itemView) {
+                super(itemView);
+                mContainer = itemView.findViewById(R.id.color_page_container);
+                // Correct scrolling goes under collapsing toolbar while scrolling oclor options.
+                mContainer.getChildAt(0).setNestedScrollingEnabled(false);
+                /**
+                 * Sets page transformer with margin to separate color pages and
+                 * sets color pages' padding to not scroll to window boundary if multi-pane case
+                 */
+                if (mIsMultiPane) {
+                    final int padding = itemView.getContext().getResources().getDimensionPixelSize(
+                            R.dimen.section_horizontal_padding);
+                    mContainer.setPageTransformer(new MarginPageTransformer(padding * 2));
+                    mContainer.setPadding(padding, /* top= */ 0, padding, /* bottom= */ 0);
+                }
+                mPageIndicator = itemView.findViewById(R.id.color_page_indicator);
+                if (ColorProvider.themeStyleEnabled) {
+                    mPageIndicator.setVisibility(VISIBLE);
+                }
+                itemView.setAccessibilityDelegate(createAccessibilityDelegate(ID_ITEMVIEW));
+                mContainer.setAccessibilityDelegate(createAccessibilityDelegate(ID_CONTAINER));
+            }
+        }
+    }
+
+    private class ColorPageAdapter extends
+            RecyclerView.Adapter<ColorPageAdapter.ColorOptionViewHolder> {
+
+        private final boolean mPageEnabled;
+        private final List<ColorOption> mColorOptions;
+        private final int mColorsPerPage;
+
+        private ColorPageAdapter(List<ColorOption> colorOptions, boolean pageEnabled,
+                int colorsPerPage) {
+            mPageEnabled = pageEnabled;
+            mColorOptions = colorOptions;
+            mColorsPerPage = colorsPerPage;
+        }
+
+        @Override
+        public int getItemCount() {
+            if (!mPageEnabled || !ColorProvider.themeStyleEnabled) {
+                return 1;
+            }
+            // Color page size.
+            return getNumPages(mColorsPerPage, mColorOptions.size());
+        }
+
+        @Override
+        public void onBindViewHolder(ColorOptionViewHolder viewHolder, int position) {
+            setupColorOptions(viewHolder.mContainer, mColorOptions, mPageEnabled, position,
+                    mColorsPerPage);
+        }
+
+        @Override
+        public ColorOptionViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
+            return new ColorOptionViewHolder(
+                    LayoutInflater.from(viewGroup.getContext()).inflate(viewType, viewGroup,
+                            false));
+        }
+
+        @Override
+        public int getItemViewType(int position) {
+            return R.layout.color_options_view;
+        }
+
+        private class ColorOptionViewHolder extends RecyclerView.ViewHolder {
+            private RecyclerView mContainer;
+
+            ColorOptionViewHolder(View itemView) {
+                super(itemView);
+                mContainer = itemView.findViewById(R.id.color_option_container);
+                // Sets layout with margins for non multi-pane case to separate color options.
+                if (!mIsMultiPane) {
+                    final FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
+                            mContainer.getLayoutParams());
+                    final int margin = itemView.getContext().getResources().getDimensionPixelSize(
+                            R.dimen.section_horizontal_padding);
+                    layoutParams.setMargins(margin, /* top= */ 0, margin, /* bottom= */ 0);
+                    mContainer.setLayoutParams(layoutParams);
+                }
+            }
+        }
+    }
+}
diff --git a/src/com/android/customization/model/color/ColorSeedOption.java b/src/com/android/customization/model/color/ColorSeedOption.java
new file mode 100644
index 0000000..7bddcb0
--- /dev/null
+++ b/src/com/android/customization/model/color/ColorSeedOption.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.customization.model.color;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.PorterDuff.Mode;
+import android.view.View;
+import android.widget.ImageView;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.customization.model.color.ColorOptionsProvider.ColorSource;
+import com.android.systemui.monet.Style;
+import com.android.wallpaper.R;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Represents a seed color obtained from WallpaperColors, for the user to chose as their theming
+ * option.
+ */
+public class ColorSeedOption extends ColorOption {
+
+    private final PreviewInfo mPreviewInfo;
+    @ColorSource
+    private final String mSource;
+
+    @VisibleForTesting
+    ColorSeedOption(String title, Map<String, String> overlayPackages, boolean isDefault,
+            @ColorSource String source, Style style, int index, PreviewInfo previewInfo) {
+        super(title, overlayPackages, isDefault, style, index);
+        mSource = source;
+        mPreviewInfo = previewInfo;
+    }
+
+    @Override
+    public PreviewInfo getPreviewInfo() {
+        return mPreviewInfo;
+    }
+
+    @Override
+    public String getSource() {
+        return mSource;
+    }
+
+    @Override
+    public int getLayoutResId() {
+        return R.layout.color_option;
+    }
+
+    @Override
+    public void bindThumbnailTile(View view) {
+        Resources res = view.getContext().getResources();
+        @ColorInt int[] colors = mPreviewInfo.resolveColors(res);
+
+        int padding = view.isActivated()
+                ? res.getDimensionPixelSize(R.dimen.color_seed_option_tile_padding_selected)
+                : res.getDimensionPixelSize(R.dimen.color_seed_option_tile_padding);
+        for (int i = 0; i < mPreviewColorIds.length; i++) {
+            ImageView colorPreviewImageView = view.findViewById(mPreviewColorIds[i]);
+            colorPreviewImageView.getDrawable().setColorFilter(colors[i], Mode.SRC);
+            colorPreviewImageView.setPadding(padding, padding, padding, padding);
+        }
+
+        view.setContentDescription(getContentDescription(view.getContext()));
+    }
+
+    @Override
+    protected CharSequence getContentDescription(Context context) {
+        // Override because we want all options with the same description.
+        return context.getString(R.string.wallpaper_color_title);
+    }
+
+    /**
+     * The preview information of {@link ColorOption}
+     */
+    public static class PreviewInfo implements ColorOption.PreviewInfo {
+        @ColorInt public int[] lightColors;
+        @ColorInt public int[] darkColors;
+
+        private PreviewInfo(@ColorInt int[] lightColors, @ColorInt int[] darkColors) {
+            this.lightColors = lightColors;
+            this.darkColors = darkColors;
+        }
+
+        /**
+         * Returns the colors to be applied corresponding with the current
+         * configuration's UI mode.
+         * @return one of {@link #lightColors} or {@link #darkColors}
+         */
+        @ColorInt
+        public int[] resolveColors(Resources res) {
+            boolean night = (res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK)
+                    == Configuration.UI_MODE_NIGHT_YES;
+            return night ? darkColors : lightColors;
+        }
+    }
+
+    /**
+     * The builder of ColorSeedOption
+     */
+    public static class Builder {
+        protected String mTitle;
+        @ColorInt
+        private int[] mLightColors;
+        @ColorInt
+        private int[] mDarkColors;
+        @ColorSource
+        private String mSource;
+        private boolean mIsDefault;
+        private Style mStyle = Style.TONAL_SPOT;
+        private int mIndex;
+        protected Map<String, String> mPackages = new HashMap<>();
+
+        /**
+         * Builds the ColorSeedOption
+         * @return new {@link ColorOption} object
+         */
+        public ColorSeedOption build() {
+            return new ColorSeedOption(mTitle, mPackages, mIsDefault, mSource, mStyle, mIndex,
+                    createPreviewInfo());
+        }
+
+        /**
+         * Creates preview information
+         * @return the {@link PreviewInfo} object
+         */
+        public PreviewInfo createPreviewInfo() {
+            return new PreviewInfo(mLightColors, mDarkColors);
+        }
+
+        public Map<String, String> getPackages() {
+            return Collections.unmodifiableMap(mPackages);
+        }
+
+        /**
+         * Gets title of {@link ColorOption} object
+         * @return title string
+         */
+        public String getTitle() {
+            return mTitle;
+        }
+
+        /**
+         * Sets title of bundle
+         * @param title specified title
+         * @return this of {@link ColorBundle.Builder}
+         */
+        public Builder setTitle(String title) {
+            mTitle = title;
+            return this;
+        }
+
+        /**
+         * Sets the colors for preview in light mode
+         * @param lightColors  {@link ColorInt} colors for light mode
+         * @return this of {@link Builder}
+         */
+        public Builder setLightColors(@ColorInt int[] lightColors) {
+            mLightColors = lightColors;
+            return this;
+        }
+
+        /**
+         * Sets the colors for preview in light mode
+         * @param darkColors  {@link ColorInt} colors for light mode
+         * @return this of {@link Builder}
+         */
+        public Builder setDarkColors(@ColorInt int[] darkColors) {
+            mDarkColors = darkColors;
+            return this;
+        }
+
+
+        /**
+         * Sets overlay package for bundle
+         * @param category the category of bundle
+         * @param packageName tha name of package in the category
+         * @return this of {@link Builder}
+         */
+        public Builder addOverlayPackage(String category, String packageName) {
+            mPackages.put(category, packageName);
+            return this;
+        }
+
+        /**
+         * Sets the source of this color seed
+         * @param source typically either {@link ColorOptionsProvider#COLOR_SOURCE_HOME} or
+         *              {@link ColorOptionsProvider#COLOR_SOURCE_LOCK}
+         * @return this of {@link Builder}
+         */
+        public Builder setSource(@ColorSource String source) {
+            mSource = source;
+            return this;
+        }
+
+        /**
+         * Sets the source of this color seed
+         * @param style color style of {@link Style}
+         * @return this of {@link Builder}
+         */
+        public Builder setStyle(Style style) {
+            mStyle = style;
+            return this;
+        }
+
+        /**
+         * Sets color option index of seed
+         * @param index color option index
+         * @return this of {@link ColorBundle.Builder}
+         */
+        public Builder setIndex(int index) {
+            mIndex = index;
+            return this;
+        }
+
+        /**
+         * Sets as default bundle
+         * @return this of {@link Builder}
+         */
+        public Builder asDefault() {
+            mIsDefault = true;
+            return this;
+        }
+    }
+}
diff --git a/src/com/android/customization/model/color/ColorUtils.kt b/src/com/android/customization/model/color/ColorUtils.kt
new file mode 100644
index 0000000..f07ff31
--- /dev/null
+++ b/src/com/android/customization/model/color/ColorUtils.kt
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.customization.model.color
+
+import android.content.Context
+import android.content.pm.PackageManager
+import android.content.res.Resources
+import android.os.SystemProperties
+import android.util.Log
+import androidx.annotation.ColorInt
+
+/**
+ * Utility to wrap Monet's color extraction
+ */
+object ColorUtils {
+    private const val TAG = "ColorUtils"
+    private const val MONET_FLAG = "flag_monet"
+    private var sSysuiRes: Resources? = null
+    private var sFlagId = 0
+
+    /**
+     * Returns true if color extraction is enabled in systemui.
+     */
+    @JvmStatic
+    fun isMonetEnabled(context: Context): Boolean {
+        var monetEnabled = SystemProperties.getBoolean("persist.systemui.flag_monet", false)
+        if (!monetEnabled) {
+            if (sSysuiRes == null) {
+                try {
+                    val pm = context.packageManager
+                    val sysUIInfo = pm.getApplicationInfo("com.android.systemui",
+                            PackageManager.GET_META_DATA or PackageManager.MATCH_SYSTEM_ONLY)
+                    if (sysUIInfo != null) {
+                        sSysuiRes = pm.getResourcesForApplication(sysUIInfo)
+                    }
+                } catch (e: PackageManager.NameNotFoundException) {
+                    Log.w(TAG, "Couldn't read color flag, skipping section", e)
+                }
+            }
+            if (sFlagId == 0) {
+                sFlagId = if (sSysuiRes == null) 0 else sSysuiRes!!.getIdentifier(
+                        MONET_FLAG, "bool", "com.android.systemui")
+            }
+            if (sFlagId > 0) {
+                monetEnabled = sSysuiRes!!.getBoolean(sFlagId)
+            }
+        }
+        return monetEnabled
+    }
+
+    @JvmStatic
+    fun toColorString(@ColorInt color: Int): String {
+        return String.format("%06X", 0xFFFFFF and color)
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/customization/model/color/WallpaperColorResources.java b/src/com/android/customization/model/color/WallpaperColorResources.java
new file mode 100644
index 0000000..eb8b39b
--- /dev/null
+++ b/src/com/android/customization/model/color/WallpaperColorResources.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.customization.model.color;
+
+import android.app.WallpaperColors;
+import android.content.Context;
+import android.util.SparseIntArray;
+import android.widget.RemoteViews.ColorResources;
+
+import com.android.systemui.monet.ColorScheme;
+
+import java.util.List;
+
+/** A class to override colors in a {@link Context} with wallpaper colors. */
+public class WallpaperColorResources {
+
+    private final SparseIntArray mColorOverlay = new SparseIntArray();
+
+    public WallpaperColorResources(WallpaperColors wallpaperColors) {
+        ColorScheme wallpaperColorScheme = new ColorScheme(wallpaperColors, /* darkTheme= */ false);
+        addOverlayColor(wallpaperColorScheme.getNeutral1(), android.R.color.system_neutral1_10);
+        addOverlayColor(wallpaperColorScheme.getNeutral2(), android.R.color.system_neutral2_10);
+        addOverlayColor(wallpaperColorScheme.getAccent1(), android.R.color.system_accent1_10);
+        addOverlayColor(wallpaperColorScheme.getAccent2(), android.R.color.system_accent2_10);
+        addOverlayColor(wallpaperColorScheme.getAccent3(), android.R.color.system_accent3_10);
+    }
+
+    /** Applies the wallpaper color resources to the {@code context}. */
+    public void apply(Context context) {
+        ColorResources.create(context, mColorOverlay).apply(context);
+    }
+
+    private void addOverlayColor(List<Integer> colors, int firstResourceColorId) {
+        int resourceColorId = firstResourceColorId;
+        for (int color : colors) {
+            mColorOverlay.put(resourceColorId, color);
+            resourceColorId++;
+        }
+    }
+}
diff --git a/src/com/android/customization/model/grid/GridOptionsManager.java b/src/com/android/customization/model/grid/GridOptionsManager.java
index da1139e..7f15d83 100644
--- a/src/com/android/customization/model/grid/GridOptionsManager.java
+++ b/src/com/android/customization/model/grid/GridOptionsManager.java
@@ -16,11 +16,11 @@
 package com.android.customization.model.grid;
 
 import android.content.Context;
-import android.os.AsyncTask;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.util.Log;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import com.android.customization.model.CustomizationManager;
@@ -31,12 +31,18 @@
 import com.android.wallpaper.util.PreviewUtils;
 
 import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * {@link CustomizationManager} for interfacing with the launcher to handle {@link GridOption}s.
  */
 public class GridOptionsManager implements CustomizationManager<GridOption> {
 
+    private static final ExecutorService sExecutorService = Executors.newSingleThreadExecutor();
+    private static final String TAG = "GridOptionsManager";
+
     private static GridOptionsManager sGridOptionsManager;
 
     private final LauncherGridOptionsProvider mProvider;
@@ -65,7 +71,16 @@
 
     @Override
     public boolean isAvailable() {
-        return mProvider.areGridsAvailable();
+        int gridOptionSize = 0;
+        try {
+            gridOptionSize = sExecutorService.submit(() -> {
+                List<GridOption> gridOptions = mProvider.fetch(/* reload= */true);
+                return gridOptions == null ? 0 : gridOptions.size();
+            }).get();
+        } catch (InterruptedException | ExecutionException e) {
+            Log.w(TAG, "could not get gridOptionSize", e);
+        }
+        return gridOptionSize > 1 && mProvider.areGridsAvailable();
     }
 
     @Override
@@ -81,7 +96,18 @@
 
     @Override
     public void fetchOptions(OptionsFetchedListener<GridOption> callback, boolean reload) {
-        new FetchTask(mProvider, callback, reload).execute();
+        sExecutorService.submit(() -> {
+            List<GridOption> gridOptions = mProvider.fetch(reload);
+            new Handler(Looper.getMainLooper()).post(() -> {
+                if (callback != null) {
+                    if (gridOptions != null && !gridOptions.isEmpty()) {
+                        callback.onOptionsLoaded(gridOptions);
+                    } else {
+                        callback.onError(null);
+                    }
+                }
+            });
+        });
     }
 
     /** Call through content provider API to render preview */
@@ -89,41 +115,4 @@
             PreviewUtils.WorkspacePreviewCallback callback) {
         mProvider.renderPreview(gridName, bundle, callback);
     }
-
-    private static class FetchTask extends AsyncTask<Void, Void, List<GridOption>> {
-        private final LauncherGridOptionsProvider mProvider;
-        @Nullable private final OptionsFetchedListener<GridOption> mCallback;
-        private final boolean mReload;
-
-        private FetchTask(@NonNull LauncherGridOptionsProvider provider,
-                @Nullable OptionsFetchedListener<GridOption> callback, boolean reload) {
-            mCallback = callback;
-            mProvider = provider;
-            mReload = reload;
-        }
-
-        @Override
-        protected List<GridOption> doInBackground(Void[] params) {
-            return mProvider.fetch(mReload);
-        }
-
-        @Override
-        protected void onPostExecute(List<GridOption> gridOptions) {
-            if (mCallback != null) {
-                if (gridOptions != null && !gridOptions.isEmpty()) {
-                    mCallback.onOptionsLoaded(gridOptions);
-                } else {
-                    mCallback.onError(null);
-                }
-            }
-        }
-
-        @Override
-        protected void onCancelled() {
-            super.onCancelled();
-            if (mCallback != null) {
-                mCallback.onError(null);
-            }
-        }
-    }
 }
diff --git a/src/com/android/customization/model/grid/GridSectionController.java b/src/com/android/customization/model/grid/GridSectionController.java
index 64a6cce..2f54a1b 100644
--- a/src/com/android/customization/model/grid/GridSectionController.java
+++ b/src/com/android/customization/model/grid/GridSectionController.java
@@ -72,7 +72,7 @@
                 sectionDescription.setText(R.string.something_went_wrong);
                 sectionTile.setVisibility(View.GONE);
             }
-        }, /* reload= */ true);
+        }, /* The result is getting when calling isAvailable(), so reload= */ false);
 
         gridSectionView.setOnClickListener(
                 v -> mSectionNavigationController.navigateTo(new GridFragment()));
diff --git a/src/com/android/customization/model/theme/DefaultThemeProvider.java b/src/com/android/customization/model/theme/DefaultThemeProvider.java
index 404130f..89067c6 100644
--- a/src/com/android/customization/model/theme/DefaultThemeProvider.java
+++ b/src/com/android/customization/model/theme/DefaultThemeProvider.java
@@ -44,10 +44,6 @@
 import com.android.customization.model.theme.custom.CustomTheme;
 import com.android.customization.module.CustomizationPreferences;
 import com.android.wallpaper.R;
-import com.android.wallpaper.asset.ResourceAsset;
-
-import com.bumptech.glide.request.RequestOptions;
-import com.google.android.apps.wallpaper.asset.ThemeBundleThumbAsset;
 
 import org.json.JSONArray;
 import org.json.JSONException;
@@ -425,18 +421,4 @@
     private String getOverlayPackage(String prefix, String themeName) {
         return getItemStringFromStub(prefix, themeName);
     }
-
-    private ResourceAsset getDrawableResourceAsset(String prefix, String themeName) {
-        int drawableResId = mStubApkResources.getIdentifier(prefix + themeName,
-                "drawable", mStubPackageName);
-        return drawableResId == 0 ? null : new ResourceAsset(mStubApkResources, drawableResId,
-                RequestOptions.fitCenterTransform());
-    }
-
-    private ThemeBundleThumbAsset getThumbAsset(String prefix, String themeName) {
-        int drawableResId = mStubApkResources.getIdentifier(prefix + themeName,
-                "drawable", mStubPackageName);
-        return drawableResId == 0 ? null : new ThemeBundleThumbAsset(mStubApkResources,
-                drawableResId);
-    }
 }
diff --git a/src/com/android/customization/module/DefaultCustomizationInjector.java b/src/com/android/customization/module/DefaultCustomizationInjector.java
index c906281..220c406 100644
--- a/src/com/android/customization/module/DefaultCustomizationInjector.java
+++ b/src/com/android/customization/module/DefaultCustomizationInjector.java
@@ -70,7 +70,7 @@
     @Override
     public synchronized ThemesUserEventLogger getUserEventLogger(Context context) {
         if (mUserEventLogger == null) {
-            mUserEventLogger = new StatsLogUserEventLogger();
+            mUserEventLogger = new StatsLogUserEventLogger(context);
         }
         return mUserEventLogger;
     }
diff --git a/src/com/android/customization/module/StatsLogUserEventLogger.java b/src/com/android/customization/module/StatsLogUserEventLogger.java
index fecf19b..216395d 100644
--- a/src/com/android/customization/module/StatsLogUserEventLogger.java
+++ b/src/com/android/customization/module/StatsLogUserEventLogger.java
@@ -38,16 +38,23 @@
 import static com.android.wallpaper.util.LaunchSourceUtils.WALLPAPER_LAUNCH_SOURCE;
 
 import android.app.WallpaperManager;
+import android.content.Context;
 import android.content.Intent;
 import android.stats.style.StyleEnums;
+import android.text.TextUtils;
 
 import androidx.annotation.Nullable;
 
 import com.android.customization.model.clock.Clockface;
+import com.android.customization.model.color.ColorOption;
 import com.android.customization.model.grid.GridOption;
 import com.android.customization.model.theme.ThemeBundle;
 import com.android.systemui.shared.system.SysUiStatsLog;
+import com.android.wallpaper.module.Injector;
+import com.android.wallpaper.module.InjectorProvider;
 import com.android.wallpaper.module.NoOpUserEventLogger;
+import com.android.wallpaper.module.WallpaperPreferences;
+import com.android.wallpaper.module.WallpaperStatusChecker;
 
 import java.util.Map;
 import java.util.Objects;
@@ -58,51 +65,63 @@
 public class StatsLogUserEventLogger extends NoOpUserEventLogger implements ThemesUserEventLogger {
 
     private static final String TAG = "StatsLogUserEventLogger";
+    private final Context mContext;
+    private final WallpaperPreferences mPreferences;
+    private final WallpaperStatusChecker mWallpaperStatusChecker;
+
+    public StatsLogUserEventLogger(Context appContext) {
+        mContext = appContext;
+        Injector injector = InjectorProvider.getInjector();
+        mPreferences = injector.getPreferences(appContext);
+        mWallpaperStatusChecker = injector.getWallpaperStatusChecker();
+    }
 
     @Override
     public void logAppLaunched(Intent launchSource) {
-        SysUiStatsLog.write(STYLE_UI_CHANGED, STYLE_UICHANGED__ACTION__APP_LAUNCHED, 0, 0, 0, 0, 0,
-                0, 0, 0, 0, 0, getAppLaunchSource(launchSource));
+        SysUiStatsLog.write(STYLE_UI_CHANGED, STYLE_UICHANGED__ACTION__APP_LAUNCHED,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, getAppLaunchSource(launchSource), 0, 0,
+                0, 0, 0, 0, 0, 0);
     }
 
     @Override
     public void logResumed(boolean provisioned, boolean wallpaper) {
-        SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.ONRESUME, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                0);
+        SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.ONRESUME,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
     public void logStopped() {
-        SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.ONSTOP, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.ONSTOP,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
     public void logActionClicked(String collectionId, int actionLabelResId) {
         SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.WALLPAPER_EXPLORE, 0, 0, 0, 0, 0,
-                getCollectionIdHashCode(collectionId), 0, 0, 0, 0, 0);
+                getIdHashCode(collectionId), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
     public void logIndividualWallpaperSelected(String collectionId) {
         SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.WALLPAPER_SELECT, 0, 0, 0, 0, 0,
-                getCollectionIdHashCode(collectionId), 0, 0, 0, 0, 0);
+                getIdHashCode(collectionId), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
     public void logCategorySelected(String collectionId) {
         SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.WALLPAPER_OPEN_CATEGORY,
                 0, 0, 0, 0, 0,
-                getCollectionIdHashCode(collectionId),
-                0, 0, 0, 0, 0);
+                getIdHashCode(collectionId),
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
     public void logLiveWallpaperInfoSelected(String collectionId, @Nullable String wallpaperId) {
         SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.LIVE_WALLPAPER_INFO_SELECT,
                 0, 0, 0, 0, 0,
-                getCollectionIdHashCode(collectionId),
-                wallpaperId != null ? wallpaperId.hashCode() : 0,
-                0, 0, 0, 0);
+                getIdHashCode(collectionId),
+                getIdHashCode(wallpaperId),
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
@@ -110,18 +129,52 @@
             @Nullable String wallpaperId) {
         SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.LIVE_WALLPAPER_CUSTOMIZE_SELECT,
                 0, 0, 0, 0, 0,
-                getCollectionIdHashCode(collectionId),
-                wallpaperId != null ? wallpaperId.hashCode() : 0,
-                0, 0, 0, 0);
+                getIdHashCode(collectionId),
+                getIdHashCode(wallpaperId),
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
-    public void logWallpaperSet(String collectionId, @Nullable String wallpaperId) {
+    public void logSnapshot() {
+        final boolean isLockWallpaperSet = mWallpaperStatusChecker.isLockWallpaperSet(mContext);
+        final String homeCollectionId = mPreferences.getHomeWallpaperCollectionId();
+        final String homeRemoteId = mPreferences.getHomeWallpaperRemoteId();
+        String homeWallpaperId = TextUtils.isEmpty(homeRemoteId)
+                ? mPreferences.getHomeWallpaperServiceName() : homeRemoteId;
+        String lockCollectionId = isLockWallpaperSet ? mPreferences.getLockWallpaperCollectionId()
+                : homeCollectionId;
+        String lockWallpaperId = isLockWallpaperSet ? mPreferences.getLockWallpaperRemoteId()
+                : homeWallpaperId;
+
+        SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.SNAPSHOT,
+                0, 0, 0, 0, 0,
+                getIdHashCode(homeCollectionId),
+                getIdHashCode(homeWallpaperId),
+                0, 0, 0, 0, 0, 0,
+                getIdHashCode(lockCollectionId),
+                getIdHashCode(lockWallpaperId),
+                mPreferences.getFirstLaunchDateSinceSetup(),
+                mPreferences.getFirstWallpaperApplyDateSinceSetup(),
+                mPreferences.getAppLaunchCount(),
+                0);
+    }
+
+    @Override
+    public void logWallpaperSet(String collectionId, @Nullable String wallpaperId,
+            @Nullable String effects) {
         SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.WALLPAPER_APPLIED,
                 0, 0, 0, 0, 0,
-                getCollectionIdHashCode(collectionId),
-                wallpaperId != null ? wallpaperId.hashCode() : 0,
-                0, 0, 0, 0);
+                getIdHashCode(collectionId),
+                getIdHashCode(wallpaperId),
+                0, 0, 0, 0, 0, effects != null ? effects.hashCode() : 0,
+                0, 0, 0, 0, 0, 0);
+    }
+
+    @Override
+    public void logEffectApply(String effect, @EffectStatus int status) {
+        SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.WALLPAPER_EFFECT_APPLIED,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, status, effect != null ? effect.hashCode() : 0,
+                0, 0, 0, 0, 0, 0);
     }
 
     @Nullable
@@ -136,7 +189,7 @@
                 Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR)),
                 Objects.hashCode(getThemePackage(theme,OVERLAY_CATEGORY_FONT)),
                 Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE)),
-                0, 0, 0, 0, 0, 0, 0, 0);
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
@@ -145,15 +198,15 @@
                 Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_COLOR)),
                 Objects.hashCode(getThemePackage(theme,OVERLAY_CATEGORY_FONT)),
                 Objects.hashCode(getThemePackage(theme, OVERLAY_CATEGORY_SHAPE)),
-                0, 0, 0, 0, 0, 0, 0, 0);
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
-    public void logColorApplied(int action, int colorIndex) {
+    public void logColorApplied(int action, ColorOption colorOption) {
         SysUiStatsLog.write(STYLE_UI_CHANGED, action,
                 0, 0, 0, 0, 0, 0, 0,
-                colorIndex,
-                0, 0, 0);
+                colorOption.getIndex(),
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, colorOption.getStyle().ordinal() + 1);
     }
 
     @Override
@@ -161,7 +214,7 @@
         SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.PICKER_SELECT,
                 0, 0, 0,
                 Objects.hashCode(clock.getId()),
-                0, 0, 0, 0, 0, 0, 0);
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
@@ -169,7 +222,7 @@
         SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.PICKER_APPLIED,
                 0, 0, 0,
                 Objects.hashCode(clock.getId()),
-                0, 0, 0, 0, 0, 0, 0);
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
@@ -177,7 +230,7 @@
         SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.PICKER_SELECT,
                 0, 0, 0, 0,
                 grid.cols,
-                0, 0, 0, 0, 0, 0);
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     @Override
@@ -185,7 +238,7 @@
         SysUiStatsLog.write(STYLE_UI_CHANGED, StyleEnums.PICKER_APPLIED,
                 0, 0, 0, 0,
                 grid.cols,
-                0, 0, 0, 0, 0, 0);
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     }
 
     private int getAppLaunchSource(Intent launchSource) {
@@ -217,7 +270,7 @@
         }
     }
 
-    private int getCollectionIdHashCode(String collectionId) {
-        return collectionId != null ? collectionId.hashCode() : 0;
+    private int getIdHashCode(String id) {
+        return id != null ? id.hashCode() : 0;
     }
 }
diff --git a/src/com/android/customization/module/ThemesUserEventLogger.java b/src/com/android/customization/module/ThemesUserEventLogger.java
index ae26290..3e5bb54 100644
--- a/src/com/android/customization/module/ThemesUserEventLogger.java
+++ b/src/com/android/customization/module/ThemesUserEventLogger.java
@@ -16,6 +16,7 @@
 package com.android.customization.module;
 
 import com.android.customization.model.clock.Clockface;
+import com.android.customization.model.color.ColorOption;
 import com.android.customization.model.grid.GridOption;
 import com.android.customization.model.theme.ThemeBundle;
 import com.android.wallpaper.module.UserEventLogger;
@@ -33,9 +34,9 @@
      * Logs the color usage while color is applied.
      *
      * @param action color applied action.
-     * @param colorIndex color applied index.
+     * @param colorOption applied color option.
      */
-    void logColorApplied(int action, int colorIndex);
+    void logColorApplied(int action, ColorOption colorOption);
 
     void logClockSelected(Clockface clock);
 
diff --git a/src/com/android/customization/picker/color/ColorSectionView.java b/src/com/android/customization/picker/color/ColorSectionView.java
new file mode 100644
index 0000000..b8ba2e4
--- /dev/null
+++ b/src/com/android/customization/picker/color/ColorSectionView.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.customization.picker.color;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.annotation.Nullable;
+
+import com.android.wallpaper.picker.SectionView;
+
+/**
+ * The class inherits from {@link SectionView} as the view representing the color section of the
+ * customization picker.
+ */
+public final class ColorSectionView extends SectionView {
+    public ColorSectionView(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+    }
+}
diff --git a/src/com/android/customization/picker/grid/GridFragment.java b/src/com/android/customization/picker/grid/GridFragment.java
index cb04fc3..c4029d6 100644
--- a/src/com/android/customization/picker/grid/GridFragment.java
+++ b/src/com/android/customization/picker/grid/GridFragment.java
@@ -18,6 +18,7 @@
 import static com.android.wallpaper.widget.BottomActionBar.BottomAction.APPLY_TEXT;
 
 import android.content.Context;
+import android.graphics.Point;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.LayoutInflater;
@@ -29,6 +30,8 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.constraintlayout.widget.ConstraintSet;
 import androidx.core.widget.ContentLoadingProgressBar;
 import androidx.lifecycle.ViewModelProvider;
 import androidx.recyclerview.widget.RecyclerView;
@@ -49,11 +52,13 @@
 import com.android.wallpaper.module.InjectorProvider;
 import com.android.wallpaper.picker.AppbarFragment;
 import com.android.wallpaper.util.LaunchUtils;
+import com.android.wallpaper.util.ScreenSizeCalculator;
 import com.android.wallpaper.widget.BottomActionBar;
 
 import com.bumptech.glide.Glide;
 
 import java.util.List;
+import java.util.Locale;
 
 /**
  * Fragment that contains the UI for selecting and applying a GridOption.
@@ -67,7 +72,7 @@
     private OptionSelectorController<GridOption> mOptionsController;
     private GridOptionsManager mGridManager;
     private ContentLoadingProgressBar mLoading;
-    private View mContent;
+    private ConstraintLayout mContent;
     private View mError;
     private BottomActionBar mBottomActionBar;
     private ThemesUserEventLogger mEventLogger;
@@ -117,6 +122,18 @@
             // Make Talkback focus won't reset when notifyDataSetChange
             mOptionsContainer.setItemAnimator(null);
         }
+
+        // Set aspect ratio on the preview card dynamically.
+        Point mScreenSize;
+        ScreenSizeCalculator screenSizeCalculator = ScreenSizeCalculator.getInstance();
+        mScreenSize = screenSizeCalculator.getScreenSize(
+                requireActivity().getWindowManager().getDefaultDisplay());
+        ConstraintSet set = new ConstraintSet();
+        set.clone(mContent);
+        String ratio = String.format(Locale.US, "%d:%d", mScreenSize.x, mScreenSize.y);
+        set.setDimensionRatio(R.id.preview_card_container, ratio);
+        set.applyTo(mContent);
+
         mLoading = view.findViewById(R.id.loading_indicator);
         mError = view.findViewById(R.id.error_section);
 
@@ -182,6 +199,8 @@
         mBottomActionBar.showActionsOnly(APPLY_TEXT);
         mBottomActionBar.setActionClickListener(APPLY_TEXT,
                 v -> applyGridOption(mGridOptionViewModel.getSelectedOption()));
+        mBottomActionBar.setActionAccessibilityTraversalAfter(APPLY_TEXT,
+                mOptionsContainer.getId());
     }
 
     private void applyGridOption(GridOption gridOption) {
diff --git a/src/com/android/customization/picker/grid/GridOptionPreviewer.java b/src/com/android/customization/picker/grid/GridOptionPreviewer.java
index 8de08cf..5cf327e 100644
--- a/src/com/android/customization/picker/grid/GridOptionPreviewer.java
+++ b/src/com/android/customization/picker/grid/GridOptionPreviewer.java
@@ -64,16 +64,17 @@
         if (mSurfaceCallback != null) {
             mSurfaceCallback.cleanUp();
             mSurfaceCallback.resetLastSurface();
+            if (mGridOptionSurface != null) {
+                mGridOptionSurface.getHolder().removeCallback(mSurfaceCallback);
+            }
         }
-        if (mGridOptionSurface == null) {
-            mGridOptionSurface = new SurfaceView(mPreviewContainer.getContext());
-            mGridOptionSurface.setLayoutParams(new ViewGroup.LayoutParams(
-                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
-            mGridOptionSurface.setZOrderMediaOverlay(true);
-            mSurfaceCallback = new GridOptionSurfaceHolderCallback(mGridOptionSurface,
-                    mGridOptionSurface.getContext());
-            mGridOptionSurface.getHolder().addCallback(mSurfaceCallback);
-        }
+        mGridOptionSurface = new SurfaceView(mPreviewContainer.getContext());
+        mGridOptionSurface.setLayoutParams(new ViewGroup.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
+        mGridOptionSurface.setZOrderMediaOverlay(true);
+        mSurfaceCallback = new GridOptionSurfaceHolderCallback(mGridOptionSurface,
+                mGridOptionSurface.getContext());
+        mGridOptionSurface.getHolder().addCallback(mSurfaceCallback);
         mPreviewContainer.addView(mGridOptionSurface);
     }
 
diff --git a/src/com/android/customization/widget/OptionSelectorController.java b/src/com/android/customization/widget/OptionSelectorController.java
index 952bc55..a66dd44 100644
--- a/src/com/android/customization/widget/OptionSelectorController.java
+++ b/src/com/android/customization/widget/OptionSelectorController.java
@@ -24,6 +24,7 @@
 import android.graphics.drawable.LayerDrawable;
 import android.text.TextUtils;
 import android.util.DisplayMetrics;
+import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -43,6 +44,7 @@
 import com.android.customization.model.CustomizationManager;
 import com.android.customization.model.CustomizationOption;
 import com.android.wallpaper.R;
+import com.android.wallpaper.widget.GridPaddingDecoration;
 
 import java.util.HashSet;
 import java.util.List;
@@ -77,7 +79,7 @@
         int CENTER_CHANGE_COLOR_WHEN_NOT_SELECTED = 3;
     }
 
-    private static final float LINEAR_LAYOUT_HORIZONTAL_DISPLAY_OPTIONS_MAX = 4.35f;
+    private float mLinearLayoutHorizontalDisplayOptionsMax;
 
     private final RecyclerView mContainer;
     private final List<T> mOptions;
@@ -99,6 +101,10 @@
         mOptions = options;
         mUseGrid = useGrid;
         mCheckmarkStyle = checkmarkStyle;
+        TypedValue typedValue = new TypedValue();
+        mContainer.getResources().getValue(R.dimen.linear_layout_horizontal_display_options_max,
+                typedValue, true);
+        mLinearLayoutHorizontalDisplayOptionsMax = typedValue.getFloat();
     }
 
     public void addListener(OptionSelectedListener listener) {
@@ -312,6 +318,11 @@
             if (mContainer.getLayoutManager() != null) {
                 ((GridLayoutManager) mContainer.getLayoutManager()).setSpanCount(numColumns);
             }
+            if (mContainer.getItemDecorationCount() == 0) {
+                mContainer.addItemDecoration(new GridPaddingDecoration(
+                        mContainer.getContext().getResources().getDimensionPixelSize(
+                                R.dimen.option_tile_grid_padding_horizontal), 0));
+            }
             return;
         }
 
@@ -320,12 +331,12 @@
             mContainer.setOverScrollMode(View.OVER_SCROLL_NEVER);
         }
 
-        if (mAdapter.getItemCount() >= LINEAR_LAYOUT_HORIZONTAL_DISPLAY_OPTIONS_MAX) {
+        if (mAdapter.getItemCount() >= mLinearLayoutHorizontalDisplayOptionsMax) {
             int spaceBetweenItems = availableWidth
-                    - Math.round(widthPerItem * LINEAR_LAYOUT_HORIZONTAL_DISPLAY_OPTIONS_MAX)
+                    - Math.round(widthPerItem * mLinearLayoutHorizontalDisplayOptionsMax)
                     - mContainer.getPaddingLeft();
             int itemEndMargin =
-                    spaceBetweenItems / (int) LINEAR_LAYOUT_HORIZONTAL_DISPLAY_OPTIONS_MAX;
+                    spaceBetweenItems / (int) mLinearLayoutHorizontalDisplayOptionsMax;
             if (itemEndMargin <= 0) {
                 itemEndMargin = res.getDimensionPixelOffset(R.dimen.option_tile_margin_horizontal);
             }
diff --git a/src/com/google/android/apps/wallpaper/asset/ThemeBundleThumbAsset.java b/src/com/google/android/apps/wallpaper/asset/ThemeBundleThumbAsset.java
deleted file mode 100644
index d941854..0000000
--- a/src/com/google/android/apps/wallpaper/asset/ThemeBundleThumbAsset.java
+++ /dev/null
@@ -1,108 +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.
- */
-package com.google.android.apps.wallpaper.asset;
-
-import android.app.Activity;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Rect;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.os.AsyncTask;
-
-import androidx.annotation.Nullable;
-
-import com.android.wallpaper.asset.Asset;
-import com.android.wallpaper.module.DrawableLayerResolver;
-import com.android.wallpaper.module.InjectorProvider;
-
-public class ThemeBundleThumbAsset extends Asset {
-    private final Resources mRes;
-    private final int mResId;
-    private final DrawableLayerResolver mLayerResolver;
-
-    public ThemeBundleThumbAsset(Resources res, int resId) {
-        mRes = res;
-        mResId = resId;
-        mLayerResolver = InjectorProvider.getInjector().getDrawableLayerResolver();
-    }
-
-    @Override
-    public void decodeBitmap(int targetWidth, int targetHeight, BitmapReceiver receiver) {
-        // No scaling is needed, as the thumbnail is already a thumbnail.
-        LoadThumbnailTask task = new LoadThumbnailTask(mRes, mResId, mLayerResolver, receiver);
-        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
-    }
-
-    @Override
-    public void decodeBitmapRegion(Rect rect, int targetWidth, int targetHeight,
-            boolean shouldAdjustForRtl, BitmapReceiver receiver) {
-
-    }
-
-    @Override
-    public void decodeRawDimensions(@Nullable Activity activity, DimensionsReceiver receiver) {
-
-    }
-
-    @Override
-    public boolean supportsTiling() {
-        return false;
-    }
-
-    /**
-     * AsyncTask subclass which loads the live wallpaper's thumbnail bitmap off the main UI thread.
-     * Resolves with null if live wallpaper thumbnail is not a bitmap.
-     */
-    private static class LoadThumbnailTask extends AsyncTask<Void, Void, Bitmap> {
-        private final DrawableLayerResolver mLayerResolver;
-        private final Resources mResources;
-        private final int mResId;
-        private BitmapReceiver mReceiver;
-
-        public LoadThumbnailTask(Resources res, int resId, DrawableLayerResolver resolver,
-                BitmapReceiver receiver) {
-            mLayerResolver = resolver;
-            mReceiver = receiver;
-            mResources = res;
-            mResId = resId;
-        }
-
-        @Override
-        protected Bitmap doInBackground(Void... unused) {
-            Drawable thumb = mResources.getDrawable(mResId, null);
-
-            // Live wallpaper components may or may not specify a thumbnail drawable.
-            if (thumb instanceof BitmapDrawable) {
-                return ((BitmapDrawable) thumb).getBitmap();
-            } else if (thumb instanceof LayerDrawable) {
-                Drawable layer = mLayerResolver.resolveLayer((LayerDrawable) thumb);
-                if (layer instanceof BitmapDrawable) {
-                    return ((BitmapDrawable) layer).getBitmap();
-                }
-            }
-
-            // If no thumbnail was specified, return a null bitmap.
-            return null;
-        }
-
-        @Override
-        protected void onPostExecute(Bitmap bitmap) {
-            mReceiver.onBitmapDecoded(bitmap);
-        }
-    }
-}
diff --git a/src_override/com/android/wallpaper/module/WallpapersInjector.java b/src_override/com/android/wallpaper/module/WallpapersInjector.java
index f8a4182..9f8fe9c 100755
--- a/src_override/com/android/wallpaper/module/WallpapersInjector.java
+++ b/src_override/com/android/wallpaper/module/WallpapersInjector.java
@@ -24,8 +24,8 @@
 import com.android.wallpaper.model.CategoryProvider;
 import com.android.wallpaper.model.WallpaperInfo;
 import com.android.wallpaper.monitor.PerformanceMonitor;
+import com.android.wallpaper.picker.CustomizationPickerActivity;
 import com.android.wallpaper.picker.ImagePreviewFragment;
-import com.android.wallpaper.picker.TopLevelPickerActivity;
 
 /**
  * A concrete, real implementation of the dependency provider.
@@ -81,7 +81,7 @@
     @Override
     public Intent getDeepLinkRedirectIntent(Context context, Uri uri) {
         Intent intent = new Intent();
-        intent.setClass(context, TopLevelPickerActivity.class);
+        intent.setClass(context, CustomizationPickerActivity.class);
         intent.setData(uri);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
         return intent;
diff --git a/tests/src/com/android/customization/testing/TestThemesUserEventLogger.java b/tests/src/com/android/customization/testing/TestThemesUserEventLogger.java
index 9969e6e..9250a86 100644
--- a/tests/src/com/android/customization/testing/TestThemesUserEventLogger.java
+++ b/tests/src/com/android/customization/testing/TestThemesUserEventLogger.java
@@ -1,6 +1,7 @@
 package com.android.customization.testing;
 
 import com.android.customization.model.clock.Clockface;
+import com.android.customization.model.color.ColorOption;
 import com.android.customization.model.grid.GridOption;
 import com.android.customization.model.theme.ThemeBundle;
 import com.android.customization.module.ThemesUserEventLogger;
@@ -22,7 +23,7 @@
     }
 
     @Override
-    public void logColorApplied(int action, int colorIndex) {
+    public void logColorApplied(int action, ColorOption colorOption) {
         // Do nothing.
     }