Update itemDecorations for LayoutManager set by the application

Bug: 157515540
Test: Manual
Change-Id: I8886e3adf3a45eb2bbcd1dbea655a54b87a55a22
diff --git a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/recyclerview/CarUiRecyclerView.java b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/recyclerview/CarUiRecyclerView.java
index cce2dd9..9e0cac8 100644
--- a/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/recyclerview/CarUiRecyclerView.java
+++ b/car-ui-lib/car-ui-lib/src/main/java/com/android/car/ui/recyclerview/CarUiRecyclerView.java
@@ -82,7 +82,13 @@
     private ScrollBar mScrollBar;
 
     @Nullable
-    private GridOffsetItemDecoration mOffsetItemDecoration;
+    private GridOffsetItemDecoration mTopOffsetItemDecorationGrid;
+    @Nullable
+    private GridOffsetItemDecoration mBottomOffsetItemDecorationGrid;
+    @Nullable
+    private RecyclerView.ItemDecoration mTopOffsetItemDecorationLinear;
+    @Nullable
+    private RecyclerView.ItemDecoration mBottomOffsetItemDecorationLinear;
     @NonNull
     private GridDividerItemDecoration mDividerItemDecorationGrid;
     @NonNull
@@ -97,6 +103,10 @@
     @Nullable
     private LinearLayout mContainer;
 
+    private boolean mEnableDividers;
+    private int mTopOffset;
+    private int mBottomOffset;
+
 
     /**
      * The possible values for setScrollBarPosition. The default value is actually {@link
@@ -182,7 +192,7 @@
         @CarUiRecyclerViewLayout int carUiRecyclerViewLayout =
                 a.getInt(R.styleable.CarUiRecyclerView_layoutStyle, CarUiRecyclerViewLayout.LINEAR);
         mNumOfColumns = a.getInt(R.styleable.CarUiRecyclerView_numOfColumns, /* defValue= */ 2);
-        boolean enableDivider =
+        mEnableDividers =
                 a.getBoolean(R.styleable.CarUiRecyclerView_enableDivider, /* defValue= */ false);
 
         mDividerItemDecorationLinear = new LinearDividerItemDecoration(
@@ -194,41 +204,23 @@
                         context.getDrawable(R.drawable.car_ui_divider),
                         mNumOfColumns);
 
-        int topOffset = a.getInteger(R.styleable.CarUiRecyclerView_topOffset, /* defValue= */0);
-        int bottomOffset = a.getInteger(
+        mTopOffset = a.getInteger(R.styleable.CarUiRecyclerView_topOffset, /* defValue= */0);
+        mBottomOffset = a.getInteger(
                 R.styleable.CarUiRecyclerView_bottomOffset, /* defValue= */0);
+        mTopOffsetItemDecorationLinear =
+                new LinearOffsetItemDecoration(mTopOffset, OffsetPosition.START);
+        mBottomOffsetItemDecorationLinear =
+                new LinearOffsetItemDecoration(mBottomOffset, OffsetPosition.END);
+        mTopOffsetItemDecorationGrid =
+                new GridOffsetItemDecoration(mTopOffset, mNumOfColumns,
+                        OffsetPosition.START);
+        mBottomOffsetItemDecorationGrid =
+                new GridOffsetItemDecoration(mBottomOffset, mNumOfColumns,
+                        OffsetPosition.END);
         if (carUiRecyclerViewLayout == CarUiRecyclerViewLayout.LINEAR) {
-
-            if (enableDivider) {
-                addItemDecoration(mDividerItemDecorationLinear);
-            }
-            RecyclerView.ItemDecoration topOffsetItemDecoration =
-                    new LinearOffsetItemDecoration(topOffset, OffsetPosition.START);
-
-            RecyclerView.ItemDecoration bottomOffsetItemDecoration =
-                    new LinearOffsetItemDecoration(bottomOffset, OffsetPosition.END);
-
-            addItemDecoration(topOffsetItemDecoration);
-            addItemDecoration(bottomOffsetItemDecoration);
             setLayoutManager(new LinearLayoutManager(getContext()));
         } else {
-
-            if (enableDivider) {
-                addItemDecoration(mDividerItemDecorationGrid);
-            }
-
-            mOffsetItemDecoration =
-                    new GridOffsetItemDecoration(topOffset, mNumOfColumns,
-                            OffsetPosition.START);
-
-            GridOffsetItemDecoration bottomOffsetItemDecoration =
-                    new GridOffsetItemDecoration(bottomOffset, mNumOfColumns,
-                            OffsetPosition.END);
-
-            addItemDecoration(mOffsetItemDecoration);
-            addItemDecoration(bottomOffsetItemDecoration);
             setLayoutManager(new GridLayoutManager(getContext(), mNumOfColumns));
-            setNumOfColumns(mNumOfColumns);
         }
 
         a.recycle();
@@ -255,6 +247,34 @@
         mScrollBarClass = context.getResources().getString(R.string.car_ui_scrollbar_component);
     }
 
+    @Override
+    public void setLayoutManager(@Nullable LayoutManager layout) {
+        addItemDecorations(layout);
+        super.setLayoutManager(layout);
+    }
+
+    private void addItemDecorations(LayoutManager layout) {
+        if (layout instanceof GridLayoutManager) {
+            if (mEnableDividers) {
+                removeItemDecoration(mDividerItemDecorationGrid);
+                addItemDecoration(mDividerItemDecorationGrid);
+            }
+            removeItemDecoration(mTopOffsetItemDecorationGrid);
+            addItemDecoration(mTopOffsetItemDecorationGrid);
+            removeItemDecoration(mBottomOffsetItemDecorationGrid);
+            addItemDecoration(mBottomOffsetItemDecorationGrid);
+            setNumOfColumns(((GridLayoutManager) layout).getSpanCount());
+        } else {
+            if (mEnableDividers) {
+                addItemDecoration(mDividerItemDecorationLinear);
+            }
+            removeItemDecoration(mTopOffsetItemDecorationLinear);
+            addItemDecoration(mTopOffsetItemDecorationLinear);
+            removeItemDecoration(mBottomOffsetItemDecorationLinear);
+            addItemDecoration(mBottomOffsetItemDecorationLinear);
+        }
+    }
+
     /**
      * If this view's content description isn't set to opt out of scrolling via the rotary
      * controller, initialize it accordingly.
@@ -324,8 +344,8 @@
      */
     public void setNumOfColumns(int numberOfColumns) {
         mNumOfColumns = numberOfColumns;
-        if (mOffsetItemDecoration != null) {
-            mOffsetItemDecoration.setNumOfColumns(mNumOfColumns);
+        if (mTopOffsetItemDecorationGrid != null) {
+            mTopOffsetItemDecorationGrid.setNumOfColumns(mNumOfColumns);
         }
         if (mDividerItemDecorationGrid != null) {
             mDividerItemDecorationGrid.setNumOfColumns(mNumOfColumns);
diff --git a/car-ui-lib/paintbooth/src/main/java/com/android/car/ui/paintbooth/caruirecyclerview/GridCarUiRecyclerViewActivity.java b/car-ui-lib/paintbooth/src/main/java/com/android/car/ui/paintbooth/caruirecyclerview/GridCarUiRecyclerViewActivity.java
index 5d51d4c..a691bf0 100644
--- a/car-ui-lib/paintbooth/src/main/java/com/android/car/ui/paintbooth/caruirecyclerview/GridCarUiRecyclerViewActivity.java
+++ b/car-ui-lib/paintbooth/src/main/java/com/android/car/ui/paintbooth/caruirecyclerview/GridCarUiRecyclerViewActivity.java
@@ -20,6 +20,7 @@
 import android.os.Bundle;
 
 import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.GridLayoutManager;
 
 import com.android.car.ui.baselayout.Insets;
 import com.android.car.ui.baselayout.InsetsChangedListener;
@@ -47,6 +48,7 @@
         toolbar.setState(Toolbar.State.SUBPAGE);
 
         CarUiRecyclerView recyclerView = findViewById(R.id.list);
+        recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
 
         RecyclerViewAdapter adapter = new RecyclerViewAdapter(generateSampleData());
         recyclerView.setAdapter(adapter);
diff --git a/car-ui-lib/paintbooth/src/main/res/layout/grid_car_ui_recycler_view_activity.xml b/car-ui-lib/paintbooth/src/main/res/layout/grid_car_ui_recycler_view_activity.xml
index 2b0d1a4..622ffa3 100644
--- a/car-ui-lib/paintbooth/src/main/res/layout/grid_car_ui_recycler_view_activity.xml
+++ b/car-ui-lib/paintbooth/src/main/res/layout/grid_car_ui_recycler_view_activity.xml
@@ -18,7 +18,6 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/list"
-    app:layoutStyle="grid"
     app:numOfColumns="4"
     android:layout_width="match_parent"
     android:layout_height="match_parent"