Merge "Force theme icons to stay on one row and adjust size to fit" into tm-qpr-dev
diff --git a/res/drawable/color_chip_seed_filled0.xml b/res/drawable/color_chip_seed_filled0.xml
index a93bc6b..2d4376c 100644
--- a/res/drawable/color_chip_seed_filled0.xml
+++ b/res/drawable/color_chip_seed_filled0.xml
@@ -19,10 +19,10 @@
     <item>
         <shape android:shape="rectangle">
             <corners
-                android:topLeftRadius="@dimen/component_color_chip_small_size_default" />
+                android:topLeftRadius="@dimen/component_color_chip_small_radius_default" />
             <size
-                android:width="@dimen/component_color_chip_small_size_default"
-                android:height="@dimen/component_color_chip_small_size_default" />
+                android:width="@dimen/component_color_chip_small_radius_default"
+                android:height="@dimen/component_color_chip_small_radius_default" />
             <solid android:color="@android:color/black" />
         </shape>
     </item>
diff --git a/res/drawable/color_chip_seed_filled1.xml b/res/drawable/color_chip_seed_filled1.xml
index a0672bc..1514939 100644
--- a/res/drawable/color_chip_seed_filled1.xml
+++ b/res/drawable/color_chip_seed_filled1.xml
@@ -19,10 +19,10 @@
     <item>
          <shape android:shape="rectangle">
             <corners
-                android:bottomLeftRadius="@dimen/component_color_chip_small_size_default" />
+                android:bottomLeftRadius="@dimen/component_color_chip_small_radius_default" />
             <size
-                android:width="@dimen/component_color_chip_small_size_default"
-                android:height="@dimen/component_color_chip_small_size_default" />
+                android:width="@dimen/component_color_chip_small_radius_default"
+                android:height="@dimen/component_color_chip_small_radius_default" />
             <solid android:color="@android:color/black" />
         </shape>
     </item>
diff --git a/res/drawable/color_chip_seed_filled2.xml b/res/drawable/color_chip_seed_filled2.xml
index 545fbdd..b415bb2 100644
--- a/res/drawable/color_chip_seed_filled2.xml
+++ b/res/drawable/color_chip_seed_filled2.xml
@@ -19,10 +19,10 @@
     <item>
         <shape android:shape="rectangle">
             <corners
-                android:topRightRadius="@dimen/component_color_chip_small_size_default" />
+                android:topRightRadius="@dimen/component_color_chip_small_radius_default" />
             <size
-                android:width="@dimen/component_color_chip_small_size_default"
-                android:height="@dimen/component_color_chip_small_size_default" />
+                android:width="@dimen/component_color_chip_small_radius_default"
+                android:height="@dimen/component_color_chip_small_radius_default" />
             <solid android:color="@android:color/black" />
         </shape>
     </item>
diff --git a/res/drawable/color_chip_seed_filled3.xml b/res/drawable/color_chip_seed_filled3.xml
index 0e286a5..49f429d 100644
--- a/res/drawable/color_chip_seed_filled3.xml
+++ b/res/drawable/color_chip_seed_filled3.xml
@@ -19,10 +19,10 @@
     <item>
         <shape android:shape="rectangle">
             <corners
-                android:bottomRightRadius="@dimen/component_color_chip_small_size_default" />
+                android:bottomRightRadius="@dimen/component_color_chip_small_radius_default" />
             <size
-                android:width="@dimen/component_color_chip_small_size_default"
-                android:height="@dimen/component_color_chip_small_size_default" />
+                android:width="@dimen/component_color_chip_small_radius_default"
+                android:height="@dimen/component_color_chip_small_radius_default" />
             <solid android:color="@android:color/black" />
         </shape>
     </item>
diff --git a/res/layout/color_option.xml b/res/layout/color_option.xml
index 9bbfd7f..d9a7136 100644
--- a/res/layout/color_option.xml
+++ b/res/layout/color_option.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?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");
@@ -14,50 +13,91 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<!-- Enclosing layout must be match_parent so that we can center content within -->
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    android:layout_gravity="center"
     android:clipChildren="false"
-    android:clipToPadding="false"
-    android:orientation="vertical">
+    android:gravity="center"
+    android:padding="@dimen/option_tile_grid_tile_padding_min">
 
-    <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"
+    <!--
+        This displays the background. It is dynamically sized, constrained remain square and
+        have a maximum size, and be centered within its parent.
+     -->
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:layout_gravity="center"
+        android:background="@drawable/option_border_color"
+        android:gravity="center"
+        android:padding="@dimen/option_tile_grid_icon_padding_min"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintDimensionRatio="1:1"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintWidth_max="@dimen/option_tile_width">
+
+        <!-- This is the color wheel itself, constrained to a maximum size and centered -->
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/option_tile"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
             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>
+            android:gravity="center"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHeight_max="@dimen/component_color_chip_small_diameter_default"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintWidth_max="@dimen/component_color_chip_small_diameter_default">
+
+            <ImageView
+                android:id="@+id/color_preview_0"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:adjustViewBounds="true"
+                android:src="@drawable/color_chip_seed_filled0"
+                app:layout_constraintHeight_percent=".50"
+                app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintWidth_percent=".50" />
+
+            <ImageView
+                android:id="@+id/color_preview_1"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:adjustViewBounds="true"
+                android:src="@drawable/color_chip_seed_filled2"
+                app:layout_constraintHeight_percent=".50"
+                app:layout_constraintLeft_toRightOf="@id/color_preview_0"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintWidth_percent=".50" />
+
+            <ImageView
+                android:id="@+id/color_preview_2"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:adjustViewBounds="true"
+                android:src="@drawable/color_chip_seed_filled1"
+                app:layout_constraintHeight_percent=".50"
+                app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/color_preview_0"
+                app:layout_constraintWidth_percent=".50" />
+
+            <ImageView
+                android:id="@+id/color_preview_3"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:adjustViewBounds="true"
+                android:src="@drawable/color_chip_seed_filled3"
+                app:layout_constraintHeight_percent=".50"
+                app:layout_constraintLeft_toRightOf="@id/color_preview_2"
+                app:layout_constraintTop_toBottomOf="@id/color_preview_1"
+                app:layout_constraintWidth_percent=".50" />
+        </androidx.constraintlayout.widget.ConstraintLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/values-w600dp-port/dimens.xml b/res/values-w600dp-port/dimens.xml
index ba92746..112e396 100644
--- a/res/values-w600dp-port/dimens.xml
+++ b/res/values-w600dp-port/dimens.xml
@@ -17,8 +17,11 @@
 <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="option_tile_linear_padding_horizontal">8dp</dimen>
+    <dimen name="option_tile_grid_icon_padding_min">8dp</dimen>
+    <dimen name="option_tile_grid_tile_padding_min">4dp</dimen>
 
-    <dimen name="component_color_chip_small_size_default">30dp</dimen>
+    <dimen name="component_color_chip_small_radius_default">30dp</dimen>
+    <dimen name="component_color_chip_small_diameter_default">60dp</dimen>
     <dimen name="color_seed_chip_margin">15dp</dimen>
 </resources>
diff --git a/res/values-w800dp/dimens.xml b/res/values-w800dp/dimens.xml
index 4cd6242..bdbf7d4 100644
--- a/res/values-w800dp/dimens.xml
+++ b/res/values-w800dp/dimens.xml
@@ -17,5 +17,7 @@
 <resources>
     <!-- Dimensions for the customization option tiles -->
     <dimen name="option_tile_width">87dp</dimen>
-    <dimen name="option_tile_grid_padding_horizontal">8dp</dimen>
+    <dimen name="option_tile_linear_padding_horizontal">8dp</dimen>
+    <dimen name="option_tile_grid_icon_padding_min">8dp</dimen>
+    <dimen name="option_tile_grid_tile_padding_min">4dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 225d7b0..3bb0df8 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -38,7 +38,12 @@
     <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>
+    <!-- Spacing between tiles in linear layout -->
+    <dimen name="option_tile_linear_padding_horizontal">4dp</dimen>
+    <!-- Minimum padding around tile icon in grid layout -->
+    <dimen name="option_tile_grid_icon_padding_min">8dp</dimen>
+    <!-- Minimum padding around entire tile in grid layout -->
+    <dimen name="option_tile_grid_tile_padding_min">2dp</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>
@@ -131,9 +136,8 @@
     <!-- 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="component_color_chip_small_radius_default">29dp</dimen>
+    <dimen name="component_color_chip_small_diameter_default">58dp</dimen>
     <dimen name="color_seed_chip_margin">14dp</dimen>
 
     <!-- Keyguard quick affordances -->
diff --git a/src/com/android/customization/model/color/ColorBundle.java b/src/com/android/customization/model/color/ColorBundle.java
index 2f2df51..d34f3fc 100644
--- a/src/com/android/customization/model/color/ColorBundle.java
+++ b/src/com/android/customization/model/color/ColorBundle.java
@@ -55,15 +55,11 @@
         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()));
     }
diff --git a/src/com/android/customization/model/color/ColorSeedOption.java b/src/com/android/customization/model/color/ColorSeedOption.java
index 7bddcb0..53d3954 100644
--- a/src/com/android/customization/model/color/ColorSeedOption.java
+++ b/src/com/android/customization/model/color/ColorSeedOption.java
@@ -71,13 +71,9 @@
         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()));
diff --git a/src/com/android/customization/widget/OptionSelectorController.java b/src/com/android/customization/widget/OptionSelectorController.java
index 95924fa..8805caf 100644
--- a/src/com/android/customization/widget/OptionSelectorController.java
+++ b/src/com/android/customization/widget/OptionSelectorController.java
@@ -44,8 +44,6 @@
 import com.android.customization.model.CustomizationManager;
 import com.android.customization.model.CustomizationOption;
 import com.android.wallpaper.R;
-import com.android.wallpaper.widget.GridPaddingDecoration;
-import com.android.wallpaper.widget.GridRowSpacerDecoration;
 
 import java.util.HashSet;
 import java.util.List;
@@ -285,37 +283,19 @@
 
         Resources res = mContainer.getContext().getResources();
         mContainer.setAdapter(mAdapter);
-        final int padding = res.getDimensionPixelSize(
-                R.dimen.option_tile_grid_padding_horizontal);
-        final int fixWidth = res.getDimensionPixelSize(R.dimen.options_container_width);
         final DisplayMetrics metrics = new DisplayMetrics();
         mContainer.getContext().getSystemService(WindowManager.class)
                 .getDefaultDisplay().getMetrics(metrics);
         final boolean hasDecoration = mContainer.getItemDecorationCount() != 0;
 
         if (mUseGrid) {
-            // This is based on the assumption that the parent view is the same width as the screen.
-            final int availableDynamicWidth = metrics.widthPixels - 2 * res.getDimensionPixelSize(
-                    R.dimen.section_horizontal_padding);
-            final int availableWidth = (fixWidth != 0) ? fixWidth : availableDynamicWidth;
             int numColumns = res.getInteger(R.integer.options_grid_num_columns);
             GridLayoutManager gridLayoutManager = new GridLayoutManager(mContainer.getContext(),
                     numColumns);
             mContainer.setLayoutManager(gridLayoutManager);
-            if (!hasDecoration) {
-                mContainer.addItemDecoration(new GridPaddingDecoration(padding, 0));
-            }
-            // Measure RecyclerView to get to the total amount of space used by all options.
-            mContainer.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
-            while (mContainer.getMeasuredWidth() > availableWidth && numColumns > 1) {
-                numColumns -= 1;
-                gridLayoutManager.setSpanCount(numColumns);
-                mContainer.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
-            }
-            if (!hasDecoration && numColumns > 1) {
-                mContainer.addItemDecoration(new GridRowSpacerDecoration(2 * padding));
-            }
         } else {
+            final int padding = res.getDimensionPixelSize(
+                    R.dimen.option_tile_linear_padding_horizontal);
             final int widthPerItem = res.getDimensionPixelSize(R.dimen.option_tile_width) + (
                     hasDecoration ? 0 : 2 * padding);
             mContainer.setLayoutManager(new LinearLayoutManager(mContainer.getContext(),