Implement the new UI design for the category tiles in the wallpaper
picker.

Screenshot: https://screenshot.googleplex.com/OZvuf2bx6bO.png
deck: https://docs.google.com/presentation/d/15JadcGi5k1_0znUN_XdFpU7UxeXwxjK3Y7LxvhW5ETM/edit#slide=id.g7c8f4a82bf_0_154

Bug: 149000013
Change-Id: I687c77eeb02d2df841fbb1b4630309d18da73b10
diff --git a/res/layout/fragment_category_picker.xml b/res/layout/fragment_category_picker.xml
index 3c74180..75eee45 100755
--- a/res/layout/fragment_category_picker.xml
+++ b/res/layout/fragment_category_picker.xml
@@ -23,13 +23,14 @@
 
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/category_grid"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:clipToPadding="false"
         android:fitsSystemWindows="true"
-        android:paddingLeft="@dimen/grid_padding"
+        android:paddingHorizontal="@dimen/grid_edge_space"
         android:paddingTop="@dimen/grid_padding"
         android:scrollbarSize="@dimen/grid_padding"
+        android:scrollbarStyle="outsideOverlay"
         android:scrollbarThumbVertical="@color/scrollbar_thumb_color_dark"
         android:scrollbars="vertical"
         app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
diff --git a/res/layout/fragment_category_scalable_picker.xml b/res/layout/fragment_category_scalable_picker.xml
index 275af07..a813b0d 100644
--- a/res/layout/fragment_category_scalable_picker.xml
+++ b/res/layout/fragment_category_scalable_picker.xml
@@ -52,18 +52,19 @@
 
     <FrameLayout
         android:id="@+id/scalable_content_container"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="@dimen/content_container_maximum_height"
         app:behavior_peekHeight="@dimen/content_container_minimum_height"
         app:layout_behavior="@string/bottom_sheet_behavior">
 
         <androidx.recyclerview.widget.RecyclerView
             android:id="@+id/category_grid"
-            android:layout_width="wrap_content"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:paddingStart="@dimen/grid_padding"
+            android:paddingHorizontal="@dimen/grid_edge_space"
             android:paddingTop="@dimen/grid_padding"
             android:scrollbarSize="@dimen/grid_padding"
+            android:scrollbarStyle="outsideOverlay"
             android:scrollbarThumbVertical="@color/scrollbar_thumb_color_dark"
             android:scrollbars="vertical" />
 
diff --git a/res/layout/grid_item_category.xml b/res/layout/grid_item_category.xml
index dbff1a1..1f9ec90 100755
--- a/res/layout/grid_item_category.xml
+++ b/res/layout/grid_item_category.xml
@@ -13,22 +13,39 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/tile"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:layout_margin="8dp"
+    android:layout_height="wrap_content"
     android:clickable="true"
-    android:focusable="true">
+    android:focusable="true"
+    android:orientation="vertical">
+
+    <TextView
+        android:id="@+id/category_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:background="@color/category_title_scrim_color"
+        android:gravity="center_horizontal|bottom"
+        android:paddingTop="@dimen/grid_item_category_label_padding_top"
+        android:paddingBottom="@dimen/grid_item_category_label_padding_bottom"
+        android:textAlignment="center"
+        android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"
+        android:textColor="@color/category_title_text_color"
+        android:textSize="@dimen/abc_text_size_subhead_material"
+        tools:text="Wallpaper category" />
+
     <androidx.cardview.widget.CardView
+        android:id="@+id/category"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_above="@+id/category_title"
         android:foreground="?attr/selectableItemBackground"
-        app:cardElevation="0dp"
-        app:cardCornerRadius="?android:dialogCornerRadius">
+        app:cardCornerRadius="?android:dialogCornerRadius"
+        app:cardElevation="0dp">
+
         <ImageView
             android:id="@+id/image"
             android:layout_width="match_parent"
@@ -40,21 +57,6 @@
             android:id="@+id/overlay_icon"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            android:layout_marginBottom="@dimen/grid_item_category_overlay_icon_margin_bottom" />
+            android:layout_gravity="center" />
     </androidx.cardview.widget.CardView>
-    <TextView
-        android:id="@+id/category_title"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true"
-        android:background="@color/category_title_scrim_color"
-        android:gravity="start"
-        android:paddingVertical="@dimen/grid_item_category_label_padding"
-        android:textColor="@color/category_title_text_color"
-        android:textSize="@dimen/abc_text_size_subhead_material"
-        android:textAlignment="viewStart"
-        android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"
-        tools:text="Wallpaper category" />
-
-</RelativeLayout>
+</LinearLayout>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 2966254..8bcbb3f 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -22,10 +22,13 @@
 
     <!-- Dimensions for "category" tiles. -->
     <dimen name="grid_item_category_label_padding">12dp</dimen>
+    <dimen name="grid_item_category_label_padding_top">12dp</dimen>
+    <dimen name="grid_item_category_label_padding_bottom">4dp</dimen>
     <dimen name="grid_item_category_overlay_icon_margin_bottom">24dp</dimen>
     <dimen name="grid_item_category_title_height">48dp</dimen>
     <dimen name="grid_tile_aspect_height">340dp</dimen>
     <dimen name="grid_tile_aspect_width">182dp</dimen>
+    <dimen name="grid_edge_space">8dp</dimen>
 
     <!-- Dimensions for individual wallpaper tiles. -->
     <dimen name="grid_item_individual_wallpaper_selected_inset">14dp</dimen>
diff --git a/src/com/android/wallpaper/picker/CategoryFragment.java b/src/com/android/wallpaper/picker/CategoryFragment.java
index 7468f12..9bf71ab 100755
--- a/src/com/android/wallpaper/picker/CategoryFragment.java
+++ b/src/com/android/wallpaper/picker/CategoryFragment.java
@@ -23,6 +23,7 @@
 import android.content.pm.PackageManager;
 import android.graphics.Point;
 import android.graphics.PorterDuff.Mode;
+import android.graphics.Rect;
 import android.net.Uri;
 import android.os.Build.VERSION;
 import android.os.Build.VERSION_CODES;
@@ -40,11 +41,11 @@
 import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.ProgressBar;
-import android.widget.RelativeLayout;
 import android.widget.TextView;
 
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
+import androidx.cardview.widget.CardView;
 import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup;
 import androidx.recyclerview.widget.RecyclerView;
@@ -70,7 +71,6 @@
 import com.android.wallpaper.util.DisplayMetricsRetriever;
 import com.android.wallpaper.util.ScreenSizeCalculator;
 import com.android.wallpaper.util.TileSizeCalculator;
-import com.android.wallpaper.widget.GridMarginDecoration;
 
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.MemoryCategory;
@@ -157,7 +157,8 @@
         }
 
         mImageGrid = view.findViewById(R.id.category_grid);
-        GridMarginDecoration.applyTo(mImageGrid);
+        mImageGrid.addItemDecoration(new GridPaddingDecoration(
+                getResources().getDimensionPixelSize(R.dimen.grid_padding)));
 
         mTileSizePx = TileSizeCalculator.getCategoryTileSize(getActivity());
 
@@ -877,7 +878,7 @@
      */
     private class CategoryHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
         private Category mCategory;
-        private RelativeLayout mTileLayout;
+        private CardView mCategoryView;
         private ImageView mImageView;
         private ImageView mOverlayIconView;
         private TextView mTitleView;
@@ -886,12 +887,12 @@
             super(itemView);
             itemView.setOnClickListener(this);
 
-            mTileLayout = itemView.findViewById(R.id.tile);
+            mCategoryView = itemView.findViewById(R.id.category);
             mImageView = itemView.findViewById(R.id.image);
             mOverlayIconView = itemView.findViewById(R.id.overlay_icon);
             mTitleView = itemView.findViewById(R.id.category_title);
 
-            mTileLayout.getLayoutParams().height = mTileSizePx.y;
+            mCategoryView.getLayoutParams().height = mTileSizePx.y;
         }
 
         @Override
@@ -1155,4 +1156,23 @@
             dialog.show();
         }
     }
+
+    private class GridPaddingDecoration extends RecyclerView.ItemDecoration {
+
+        private int mPadding;
+
+        GridPaddingDecoration(int padding) {
+            mPadding = padding;
+        }
+
+        @Override
+        public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
+                                   RecyclerView.State state) {
+            int position = parent.getChildAdapterPosition(view) - NUM_NON_CATEGORY_VIEW_HOLDERS;
+            if (position >= 0) {
+                outRect.left = mPadding;
+                outRect.right = mPadding;
+            }
+        }
+    }
 }
diff --git a/src/com/android/wallpaper/util/TileSizeCalculator.java b/src/com/android/wallpaper/util/TileSizeCalculator.java
index 84ecad7..ddeaf57 100755
--- a/src/com/android/wallpaper/util/TileSizeCalculator.java
+++ b/src/com/android/wallpaper/util/TileSizeCalculator.java
@@ -39,7 +39,7 @@
     /**
      * The number of columns for a "fewer columns" configuration of the category tiles grid.
      */
-    private static final int CATEGORY_FEWER_COLUMNS = 2;
+    private static final int CATEGORY_FEWER_COLUMNS = 3;
 
     /**
      * The number of columns for a "more columns" configuration of the category tiles grid.
@@ -116,7 +116,7 @@
         int windowWidthPx = getActivityWindowWidthPx(activity);
 
         int columnCount = getNumCategoryColumns(activity, windowWidthPx);
-        return getTileSize(appContext, columnCount, windowWidthPx);
+        return getSquareTileSize(appContext, columnCount, windowWidthPx);
     }
 
     /**
@@ -181,6 +181,24 @@
     }
 
     /**
+     * Returns the size of a grid tile with the given "fewer" count and "more" count, on the given
+     * display. The size is determined by these counts with the aspect ratio of 1:1 and is in units
+     * of px.
+     */
+    private static Point getSquareTileSize(Context context, int columnCount, int windowWidthPx) {
+        Resources res = context.getResources();
+        int gridPaddingPx = res.getDimensionPixelSize(R.dimen.grid_padding);
+        int gridEdgeSpacePx = res.getDimensionPixelSize(R.dimen.grid_edge_space);
+
+        int availableWidthPx = windowWidthPx
+                - gridPaddingPx * 2 * columnCount // Item's left and right padding * column count
+                - gridEdgeSpacePx * 2; // Grid view's left and right edge's space
+        int widthPx = Math.round((float) availableWidthPx / columnCount);
+
+        return new Point(widthPx, widthPx);
+    }
+
+    /**
      * Returns the available width of the activity window in pixels.
      */
     private static int getActivityWindowWidthPx(Activity activity) {