Add NoDreamViewHolder for a different layout for NoDreamItem.

Bug: 243389115
Test: Manually tested
Change-Id: Id7549d55721c474cf8baddc0b336fe3600ccb5e3
diff --git a/src/com/android/settings/dream/DreamAdapter.java b/src/com/android/settings/dream/DreamAdapter.java
index cfee12e..b81d6b6 100644
--- a/src/com/android/settings/dream/DreamAdapter.java
+++ b/src/com/android/settings/dream/DreamAdapter.java
@@ -21,6 +21,7 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.VectorDrawable;
 import android.text.TextUtils;
+import android.util.SparseIntArray;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -41,10 +42,9 @@
  */
 public class DreamAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
     private final List<IDreamItem> mItemList;
-    @LayoutRes
-    private final int mLayoutRes;
     private int mLastSelectedPos = -1;
     private boolean mEnabled = true;
+    private SparseIntArray mLayouts = new SparseIntArray();
 
     /**
      * View holder for each {@link IDreamItem}.
@@ -83,16 +83,6 @@
                 mSummaryView.setVisibility(View.VISIBLE);
             }
 
-            final Drawable previewImage = item.getPreviewImage();
-            if (previewImage != null) {
-                mPreviewView.setImageDrawable(previewImage);
-                mPreviewView.setClipToOutline(true);
-                mPreviewPlaceholderView.setVisibility(View.GONE);
-            } else {
-                mPreviewView.setImageDrawable(null);
-                mPreviewPlaceholderView.setVisibility(View.VISIBLE);
-            }
-
             final Drawable icon = item.isActive()
                     ? mContext.getDrawable(R.drawable.ic_dream_check_circle)
                     : item.getIcon().mutate();
@@ -122,12 +112,24 @@
                 itemView.setClickable(true);
             }
 
-            mCustomizeButton.setOnClickListener(v -> item.onCustomizeClicked());
-            mCustomizeButton.setVisibility(
-                    item.allowCustomization() && mEnabled ? View.VISIBLE : View.GONE);
-            // This must be called AFTER itemView.setSelected above, in order to keep the
-            // customize button in an unselected state.
-            mCustomizeButton.setSelected(false);
+            if (item.viewType() != DreamItemViewTypes.NO_DREAM_ITEM) {
+                final Drawable previewImage = item.getPreviewImage();
+                if (previewImage != null) {
+                    mPreviewView.setImageDrawable(previewImage);
+                    mPreviewView.setClipToOutline(true);
+                    mPreviewPlaceholderView.setVisibility(View.GONE);
+                } else {
+                    mPreviewView.setImageDrawable(null);
+                    mPreviewPlaceholderView.setVisibility(View.VISIBLE);
+                }
+
+                mCustomizeButton.setOnClickListener(v -> item.onCustomizeClicked());
+                mCustomizeButton.setVisibility(
+                        item.allowCustomization() && mEnabled ? View.VISIBLE : View.GONE);
+                // This must be called AFTER itemView.setSelected above, in order to keep the
+                // customize button in an unselected state.
+                mCustomizeButton.setSelected(false);
+            }
 
             setEnabledStateOnViews(itemView, mEnabled);
         }
@@ -149,16 +151,22 @@
         }
     }
 
+    public DreamAdapter(SparseIntArray layouts, List<IDreamItem> itemList) {
+        mItemList = itemList;
+        mLayouts = layouts;
+    }
+
     public DreamAdapter(@LayoutRes int layoutRes, List<IDreamItem> itemList) {
         mItemList = itemList;
-        mLayoutRes = layoutRes;
+        mLayouts.append(DreamItemViewTypes.DREAM_ITEM, layoutRes);
     }
 
     @NonNull
     @Override
-    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
+    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
+                                                      @DreamItemViewTypes.ViewType int viewType) {
         View view = LayoutInflater.from(viewGroup.getContext())
-                .inflate(mLayoutRes, viewGroup, false);
+                .inflate(mLayouts.get(viewType), viewGroup, false);
         return new DreamViewHolder(view, viewGroup.getContext());
     }
 
@@ -168,6 +176,11 @@
     }
 
     @Override
+    public @DreamItemViewTypes.ViewType int getItemViewType(int position) {
+        return mItemList.get(position).viewType();
+    }
+
+    @Override
     public int getItemCount() {
         return mItemList.size();
     }
diff --git a/src/com/android/settings/dream/DreamItemViewTypes.java b/src/com/android/settings/dream/DreamItemViewTypes.java
new file mode 100644
index 0000000..b720242
--- /dev/null
+++ b/src/com/android/settings/dream/DreamItemViewTypes.java
@@ -0,0 +1,43 @@
+/*
+ * 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.settings.dream;
+
+import android.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Class representing a dream item view types.
+ */
+public final class DreamItemViewTypes {
+
+    /**
+     * The default dream item layout
+     */
+    public static final int DREAM_ITEM = 0;
+
+    /**
+     * The dream item layout indicating no dream item selected.
+     */
+    public static final int NO_DREAM_ITEM = 1;
+
+
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({DreamItemViewTypes.DREAM_ITEM, DreamItemViewTypes.NO_DREAM_ITEM})
+    public @interface ViewType {}
+}
diff --git a/src/com/android/settings/dream/IDreamItem.java b/src/com/android/settings/dream/IDreamItem.java
index 49c82be..911a3cf 100644
--- a/src/com/android/settings/dream/IDreamItem.java
+++ b/src/com/android/settings/dream/IDreamItem.java
@@ -67,4 +67,11 @@
     default boolean allowCustomization() {
         return false;
     }
+
+    /**
+     * Returns whether or not this item is the no screensaver item.
+     */
+    default @DreamItemViewTypes.ViewType int viewType() {
+        return DreamItemViewTypes.DREAM_ITEM;
+    }
 }