diff --git a/res/color/dream_card_color_state_list.xml b/res/color/dream_card_color_state_list.xml
index 31821ddc216..8cd5bc9d49e 100644
--- a/res/color/dream_card_color_state_list.xml
+++ b/res/color/dream_card_color_state_list.xml
@@ -17,6 +17,6 @@
-
-
+
+
\ No newline at end of file
diff --git a/res/drawable/ic_dream_check_circle.xml b/res/drawable/ic_dream_check_circle.xml
new file mode 100644
index 00000000000..820615d260d
--- /dev/null
+++ b/res/drawable/ic_dream_check_circle.xml
@@ -0,0 +1,24 @@
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/dream_picker_layout.xml b/res/layout/dream_picker_layout.xml
index c5210dd45f6..6530ea20bbf 100644
--- a/res/layout/dream_picker_layout.xml
+++ b/res/layout/dream_picker_layout.xml
@@ -15,28 +15,43 @@
limitations under the License.
-->
-
+ android:layout_height="wrap_content">
-
+ style="@style/DreamPickerBackgroundStyle">
-
+
-
+
+
+
+
+
+
+
+
diff --git a/res/layout/dream_preference_layout.xml b/res/layout/dream_preference_layout.xml
index 05f88cd07c4..2bc67ba3f01 100644
--- a/res/layout/dream_preference_layout.xml
+++ b/res/layout/dream_preference_layout.xml
@@ -17,18 +17,17 @@
-
-
@@ -77,9 +76,10 @@
android:id="@+id/title_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
- android:layout_marginStart="18dp"
- android:layout_marginTop="16dp"
- android:layout_marginBottom="10dp"
+ android:layout_marginTop="@dimen/dream_item_title_margin_top"
+ android:layout_marginStart="@dimen/dream_item_title_margin_start"
+ android:layout_marginBottom="@dimen/dream_item_title_margin_bottom"
+ android:gravity="center_vertical"
android:maxLines="1"
android:ellipsize="end"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
@@ -87,18 +87,5 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/icon"/>
-
-
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index c6059d17c23..be1ba5b48c6 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -441,11 +441,17 @@
2dp
- 230dp
- @*android:dimen/config_dialogCornerRadius
- 4dp
- 8dp
- 40dp
+ 210dp
+ 28dp
+ 8dp
+ 20dp
+ 18dp
+ 8dp
+ 18dp
+ 10dp
+ 10dp
+ 20dp
+ 48dp
24dp
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 58f6df44817..a64eb1f5b3b 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -951,5 +951,16 @@
- @dimen/dream_item_corner_radius
- 0dp
- ?android:attr/colorControlHighlight
+ - @dimen/dream_item_content_padding
+
+
+
diff --git a/src/com/android/settings/dream/AutoFitGridLayoutManager.java b/src/com/android/settings/dream/AutoFitGridLayoutManager.java
new file mode 100644
index 00000000000..0e5d3e1bbd5
--- /dev/null
+++ b/src/com/android/settings/dream/AutoFitGridLayoutManager.java
@@ -0,0 +1,44 @@
+/*
+ * 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.content.Context;
+
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.settings.R;
+
+/** Grid layout manager that calculates the number of columns for the screen size. */
+final class AutoFitGridLayoutManager extends GridLayoutManager {
+ private final float mColumnWidth;
+
+ AutoFitGridLayoutManager(Context context) {
+ super(context, /* spanCount= */ 1);
+ this.mColumnWidth = context
+ .getResources()
+ .getDimensionPixelSize(R.dimen.dream_item_min_column_width);
+ }
+
+ @Override
+ public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
+ final int totalSpace = getWidth() - getPaddingRight() - getPaddingLeft();
+ final int spanCount = Math.max(1, (int) (totalSpace / mColumnWidth));
+ setSpanCount(spanCount);
+ super.onLayoutChildren(recycler, state);
+ }
+}
diff --git a/src/com/android/settings/dream/DreamAdapter.java b/src/com/android/settings/dream/DreamAdapter.java
new file mode 100644
index 00000000000..80e4efb180a
--- /dev/null
+++ b/src/com/android/settings/dream/DreamAdapter.java
@@ -0,0 +1,107 @@
+/*
+ * 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.content.Context;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.VectorDrawable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.settings.R;
+import com.android.settingslib.Utils;
+
+import java.util.List;
+
+/**
+ * RecyclerView adapter which displays list of items for the user to select.
+ */
+class DreamAdapter extends RecyclerView.Adapter {
+ private final List mItemList;
+
+ /**
+ * View holder for each {@link IDreamItem}.
+ */
+ private static class DreamViewHolder extends RecyclerView.ViewHolder {
+ private final ImageView mIconView;
+ private final TextView mTitleView;
+ private final ImageView mPreviewView;
+ private final Button mCustomizeButton;
+ private final Context mContext;
+
+ DreamViewHolder(View view, Context context) {
+ super(view);
+ mContext = context;
+ mPreviewView = view.findViewById(R.id.preview);
+ mIconView = view.findViewById(R.id.icon);
+ mTitleView = view.findViewById(R.id.title_text);
+ mCustomizeButton = view.findViewById(R.id.customize_button);
+ }
+
+ /**
+ * Bind the view at the given position, populating the view with the provided data.
+ */
+ public void bindView(IDreamItem item) {
+ mTitleView.setText(item.getTitle());
+ mPreviewView.setImageDrawable(item.getPreviewImage());
+
+ final Drawable icon = item.getIcon();
+ if (icon instanceof VectorDrawable) {
+ icon.setTint(Utils.getColorAttrDefaultColor(mContext,
+ com.android.internal.R.attr.colorAccentPrimaryVariant));
+ }
+ mIconView.setImageDrawable(icon);
+ if (item.allowCustomization()) {
+ mCustomizeButton.setVisibility(View.VISIBLE);
+ mCustomizeButton.setOnClickListener(v -> item.onCustomizeClicked());
+ } else {
+ mCustomizeButton.setVisibility(View.GONE);
+ }
+ itemView.setOnClickListener(v -> item.onItemClicked());
+ itemView.setActivated(item.isActive());
+ }
+ }
+
+ DreamAdapter(List itemList) {
+ mItemList = itemList;
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
+ View view = LayoutInflater.from(viewGroup.getContext())
+ .inflate(R.layout.dream_preference_layout, viewGroup, false);
+ return new DreamViewHolder(view, viewGroup.getContext());
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
+ ((DreamViewHolder) viewHolder).bindView(mItemList.get(i));
+ }
+
+ @Override
+ public int getItemCount() {
+ return mItemList.size();
+ }
+}
diff --git a/src/com/android/settings/dream/DreamPickerAdapter.java b/src/com/android/settings/dream/DreamPickerAdapter.java
deleted file mode 100644
index 50aaee216e3..00000000000
--- a/src/com/android/settings/dream/DreamPickerAdapter.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * 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.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.settings.R;
-import com.android.settingslib.dream.DreamBackend.DreamInfo;
-
-import java.util.List;
-
-/**
- * RecyclerView adapter which displays list of available dreams for the user to select.
- */
-class DreamPickerAdapter extends RecyclerView.Adapter {
- private final List mDreamInfoList;
- private final OnItemClickListener mItemClickListener;
- private final OnItemClickListener mOnDreamSelected = new OnItemClickListener() {
- @Override
- public void onItemClicked(DreamInfo dreamInfo) {
- if (mItemClickListener != null) {
- mItemClickListener.onItemClicked(dreamInfo);
- }
- mDreamInfoList.forEach(dream -> {
- if (dream != null) {
- dream.isActive = false;
- }
- });
- dreamInfo.isActive = true;
- notifyDataSetChanged();
- }
- };
- private final OnItemClickListener mOnCustomizeListener;
-
- interface OnItemClickListener {
- void onItemClicked(DreamInfo dreamInfo);
- }
-
- /**
- * View holder for each Dream service.
- */
- private static class DreamViewHolder extends RecyclerView.ViewHolder {
- private final ImageView mIconView;
- private final TextView mTitleView;
- private final TextView mSummaryView;
- private final ImageView mPreviewView;
- private final Button mCustomizeButton;
-
- DreamViewHolder(View view) {
- super(view);
- mPreviewView = view.findViewById(R.id.preview);
- mIconView = view.findViewById(R.id.icon);
- mTitleView = view.findViewById(R.id.title_text);
- mSummaryView = view.findViewById(R.id.summary_text);
- mCustomizeButton = view.findViewById(R.id.customize_button);
- }
-
- /**
- * Bind the dream service view at the given position. Add details on the
- * dream's icon, name and description.
- */
- public void bindView(DreamInfo dreamInfo, OnItemClickListener clickListener,
- OnItemClickListener customizeListener) {
- mIconView.setImageDrawable(dreamInfo.icon);
- mTitleView.setText(dreamInfo.caption);
- mPreviewView.setImageDrawable(dreamInfo.previewImage);
- mSummaryView.setText(dreamInfo.description);
- itemView.setActivated(dreamInfo.isActive);
- if (dreamInfo.isActive && dreamInfo.settingsComponentName != null) {
- mCustomizeButton.setVisibility(View.VISIBLE);
- mCustomizeButton.setOnClickListener(
- v -> customizeListener.onItemClicked(dreamInfo));
- } else {
- mCustomizeButton.setVisibility(View.GONE);
- }
-
- itemView.setOnClickListener(v -> clickListener.onItemClicked(dreamInfo));
- }
- }
-
- DreamPickerAdapter(List dreamInfos, OnItemClickListener clickListener,
- OnItemClickListener onCustomizeListener) {
- mDreamInfoList = dreamInfos;
- mItemClickListener = clickListener;
- mOnCustomizeListener = onCustomizeListener;
- }
-
- @NonNull
- @Override
- public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
- View view = LayoutInflater.from(viewGroup.getContext())
- .inflate(R.layout.dream_preference_layout, viewGroup, false);
- return new DreamViewHolder(view);
- }
-
- @Override
- public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
- ((DreamViewHolder) viewHolder).bindView(mDreamInfoList.get(i), mOnDreamSelected,
- mOnCustomizeListener);
- }
-
- @Override
- public int getItemCount() {
- return mDreamInfoList.size();
- }
-}
diff --git a/src/com/android/settings/dream/DreamPickerController.java b/src/com/android/settings/dream/DreamPickerController.java
index f634d9bba65..101e4a63b6e 100644
--- a/src/com/android/settings/dream/DreamPickerController.java
+++ b/src/com/android/settings/dream/DreamPickerController.java
@@ -18,22 +18,23 @@ package com.android.settings.dream;
import android.app.settings.SettingsEnums;
import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.view.View;
import android.widget.Button;
import androidx.annotation.Nullable;
import androidx.preference.Preference;
-import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
-import com.android.settings.dream.DreamPickerAdapter.OnItemClickListener;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.dream.DreamBackend;
import com.android.settingslib.widget.LayoutPreference;
import java.util.List;
+import java.util.stream.Collectors;
/**
* Controller for the dream picker where the user can select a screensaver.
@@ -44,32 +45,11 @@ public class DreamPickerController extends BasePreferenceController {
private final DreamBackend mBackend;
private final MetricsFeatureProvider mMetricsFeatureProvider;
private final List mDreamInfos;
+ private final Drawable mActiveDrawable;
private Button mPreviewButton;
@Nullable
private DreamBackend.DreamInfo mActiveDream;
-
- private final OnItemClickListener mItemClickListener =
- new OnItemClickListener() {
- @Override
- public void onItemClicked(DreamBackend.DreamInfo dreamInfo) {
- mActiveDream = dreamInfo;
- mMetricsFeatureProvider.action(
- mContext,
- SettingsEnums.ACTION_DREAM_SELECT_TYPE,
- mActiveDream == null ? null
- : mActiveDream.componentName.flattenToString());
- mBackend.setActiveDream(
- mActiveDream == null ? null : mActiveDream.componentName);
- updatePreviewButtonState();
- }
- };
-
- private final OnItemClickListener mCustomizeListener = new OnItemClickListener() {
- @Override
- public void onItemClicked(DreamBackend.DreamInfo dreamInfo) {
- mBackend.launchSettings(mContext, dreamInfo);
- }
- };
+ private DreamAdapter mAdapter;
public DreamPickerController(Context context, String preferenceKey) {
this(context, preferenceKey, DreamBackend.getInstance(context));
@@ -79,6 +59,7 @@ public class DreamPickerController extends BasePreferenceController {
super(context, preferenceKey);
mBackend = backend;
mDreamInfos = mBackend.getDreamInfos();
+ mActiveDrawable = context.getDrawable(R.drawable.ic_dream_check_circle);
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
}
@@ -98,15 +79,17 @@ public class DreamPickerController extends BasePreferenceController {
mActiveDream = getActiveDreamInfo();
- final DreamPickerAdapter adapter =
- new DreamPickerAdapter(mDreamInfos, mItemClickListener, mCustomizeListener);
+ mAdapter = new DreamAdapter(mDreamInfos.stream()
+ .map(DreamItem::new)
+ .collect(Collectors.toList()));
final RecyclerView recyclerView =
((LayoutPreference) preference).findViewById(R.id.dream_list);
recyclerView.setLayoutManager(new AutoFitGridLayoutManager(mContext));
- recyclerView.setAdapter(adapter);
+ recyclerView.setAdapter(mAdapter);
mPreviewButton = ((LayoutPreference) preference).findViewById(R.id.preview_button);
+ mPreviewButton.setVisibility(View.VISIBLE);
mPreviewButton.setOnClickListener(v -> mBackend.preview(mActiveDream));
updatePreviewButtonState();
}
@@ -126,23 +109,56 @@ public class DreamPickerController extends BasePreferenceController {
.orElse(null);
}
- /** Grid layout manager that calculates the number of columns for the screen size. */
- private static final class AutoFitGridLayoutManager extends GridLayoutManager {
- private final float mColumnWidth;
+ private class DreamItem implements IDreamItem {
+ DreamBackend.DreamInfo mDreamInfo;
- AutoFitGridLayoutManager(Context context) {
- super(context, /* spanCount= */ 1);
- this.mColumnWidth = context
- .getResources()
- .getDimensionPixelSize(R.dimen.dream_item_min_column_width);
+ DreamItem(DreamBackend.DreamInfo dreamInfo) {
+ mDreamInfo = dreamInfo;
}
@Override
- public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
- final int totalSpace = getWidth() - getPaddingRight() - getPaddingLeft();
- final int spanCount = Math.max(1, (int) (totalSpace / mColumnWidth));
- setSpanCount(spanCount);
- super.onLayoutChildren(recycler, state);
+ public CharSequence getTitle() {
+ return mDreamInfo.caption;
+ }
+
+ @Override
+ public Drawable getIcon() {
+ return isActive() ? mActiveDrawable : mDreamInfo.icon;
+ }
+
+ @Override
+ public void onItemClicked() {
+ mActiveDream = mDreamInfo;
+ mBackend.setActiveDream(mDreamInfo.componentName);
+ mAdapter.notifyDataSetChanged();
+ updatePreviewButtonState();
+ mMetricsFeatureProvider.action(
+ mContext,
+ SettingsEnums.ACTION_DREAM_SELECT_TYPE,
+ mDreamInfo.componentName.flattenToString());
+ }
+
+ @Override
+ public void onCustomizeClicked() {
+ mBackend.launchSettings(mContext, mDreamInfo);
+ }
+
+ @Override
+ public Drawable getPreviewImage() {
+ return mDreamInfo.previewImage;
+ }
+
+ @Override
+ public boolean isActive() {
+ if (mActiveDream == null) {
+ return false;
+ }
+ return mDreamInfo.componentName.equals(mActiveDream.componentName);
+ }
+
+ @Override
+ public boolean allowCustomization() {
+ return isActive() && mDreamInfo.settingsComponentName != null;
}
}
}
diff --git a/src/com/android/settings/dream/IDreamItem.java b/src/com/android/settings/dream/IDreamItem.java
new file mode 100644
index 00000000000..32fee5bde96
--- /dev/null
+++ b/src/com/android/settings/dream/IDreamItem.java
@@ -0,0 +1,35 @@
+/*
+ * 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.graphics.drawable.Drawable;
+
+interface IDreamItem {
+ CharSequence getTitle();
+
+ Drawable getIcon();
+
+ void onItemClicked();
+
+ void onCustomizeClicked();
+
+ Drawable getPreviewImage();
+
+ boolean isActive();
+
+ boolean allowCustomization();
+}