diff --git a/src/com/android/settings/dream/DreamAdapter.java b/src/com/android/settings/dream/DreamAdapter.java index cfee12e0f42..b81d6b6d679 100644 --- a/src/com/android/settings/dream/DreamAdapter.java +++ b/src/com/android/settings/dream/DreamAdapter.java @@ -21,6 +21,7 @@ import android.content.Context; 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 @@ import java.util.List; */ public class DreamAdapter extends RecyclerView.Adapter { private final List 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 @@ public class DreamAdapter extends RecyclerView.Adapter 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 @@ public class DreamAdapter extends RecyclerView.Adapter 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 class DreamAdapter extends RecyclerView.Adapter } } + public DreamAdapter(SparseIntArray layouts, List itemList) { + mItemList = itemList; + mLayouts = layouts; + } + public DreamAdapter(@LayoutRes int layoutRes, List 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()); } @@ -167,6 +175,11 @@ public class DreamAdapter extends RecyclerView.Adapter ((DreamViewHolder) viewHolder).bindView(mItemList.get(i), i); } + @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 00000000000..b7202429769 --- /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 49c82bec42a..911a3cf0bd2 100644 --- a/src/com/android/settings/dream/IDreamItem.java +++ b/src/com/android/settings/dream/IDreamItem.java @@ -67,4 +67,11 @@ public interface IDreamItem { 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; + } }