Add dream descriptions to dream settings UI.

The dream descriptions will now be shown underneath the title, if the
dream has provided one.

We also cleaned up the icon view, instead merging it with the title view
to ensure proper alignment between the icon and title.

Bug: 221078654
Test: locally on device
Test: atest DreamPickerControllerTest
Change-Id: I00fd69c294f1a5fbcbc5392eba342f2896f6d9ed
diff --git a/res/layout/dream_preference_layout.xml b/res/layout/dream_preference_layout.xml
index abb2a34..894ac32 100644
--- a/res/layout/dream_preference_layout.xml
+++ b/res/layout/dream_preference_layout.xml
@@ -64,36 +64,38 @@
             app:layout_constraintStart_toStartOf="@+id/preview"
             app:layout_constraintEnd_toEndOf="@+id/preview"/>
 
-        <ImageView
-            android:id="@+id/icon"
-            android:layout_width="@dimen/dream_item_icon_size"
-            android:layout_height="0dp"
-            android:layout_marginTop="@dimen/dream_item_title_margin_top"
-            android:layout_marginStart="@dimen/dream_item_icon_margin_start"
-            android:layout_marginBottom="@dimen/dream_item_title_margin_bottom"
-            android:gravity="center_vertical"
-            android:importantForAccessibility="no"
-            app:layout_constraintDimensionRatio="1:1"
-            app:layout_constraintHorizontal_chainStyle="packed"
-            app:layout_constraintTop_toBottomOf="@+id/preview"
-            app_layout_constraintEnd_toStartOf="@+id/title_text"
-            app:layout_constraintStart_toStartOf="parent"/>
-
         <TextView
             android:id="@+id/title_text"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
             android:layout_marginTop="@dimen/dream_item_title_margin_top"
-            android:layout_marginStart="@dimen/dream_item_title_margin_start"
+            android:layout_marginHorizontal="@dimen/dream_item_title_margin_horizontal"
             android:layout_marginBottom="@dimen/dream_item_title_margin_bottom"
             android:gravity="center_vertical"
             android:maxLines="1"
             android:ellipsize="end"
-            android:textSize="16sp"
+            android:textSize="@dimen/dream_item_title_text_size"
             android:textColor="@color/dream_card_text_color_state_list"
+            android:drawablePadding="@dimen/dream_item_icon_padding"
             app:layout_constraintTop_toBottomOf="@+id/preview"
             app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toEndOf="@+id/icon"/>
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintBottom_toTopOf="@id/summary_text"/>
+
+        <TextView
+            android:id="@+id/summary_text"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginHorizontal="@dimen/dream_item_title_margin_horizontal"
+            android:layout_marginBottom="@dimen/dream_item_title_margin_bottom"
+            android:maxLines="2"
+            android:ellipsize="end"
+            android:textSize="@dimen/dream_item_summary_text_size"
+            android:textColor="@color/dream_card_text_color_state_list"
+            app:layout_constraintTop_toBottomOf="@+id/title_text"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"/>
 
     </androidx.constraintlayout.widget.ConstraintLayout>
 </androidx.cardview.widget.CardView>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 78dbcce..5cd1ebb 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -445,10 +445,12 @@
     <dimen name="dream_item_corner_radius">28dp</dimen>
     <dimen name="dream_item_content_padding">8dp</dimen>
     <dimen name="dream_item_icon_size">20dp</dimen>
-    <dimen name="dream_item_title_margin_top">18dp</dimen>
+    <dimen name="dream_item_summary_text_size">14sp</dimen>
+    <dimen name="dream_item_title_margin_top">16dp</dimen>
     <dimen name="dream_item_title_margin_bottom">8dp</dimen>
-    <dimen name="dream_item_title_margin_start">18dp</dimen>
-    <dimen name="dream_item_icon_margin_start">10dp</dimen>
+    <dimen name="dream_item_title_text_size">16sp</dimen>
+    <dimen name="dream_item_icon_padding">18dp</dimen>
+    <dimen name="dream_item_title_margin_horizontal">8dp</dimen>
     <dimen name="dream_preference_card_padding">16dp</dimen>
     <dimen name="dream_preference_margin_bottom">20dp</dimen>
     <dimen name="dream_picker_margin_horizontal">48dp</dimen>
diff --git a/src/com/android/settings/dream/DreamAdapter.java b/src/com/android/settings/dream/DreamAdapter.java
index 4e16ccb..8e487d4 100644
--- a/src/com/android/settings/dream/DreamAdapter.java
+++ b/src/com/android/settings/dream/DreamAdapter.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.VectorDrawable;
+import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -45,8 +46,8 @@
      * View holder for each {@link IDreamItem}.
      */
     private class DreamViewHolder extends RecyclerView.ViewHolder {
-        private final ImageView mIconView;
         private final TextView mTitleView;
+        private final TextView mSummaryView;
         private final ImageView mPreviewView;
         private final ImageView mPreviewPlaceholderView;
         private final Button mCustomizeButton;
@@ -57,8 +58,8 @@
             mContext = context;
             mPreviewView = view.findViewById(R.id.preview);
             mPreviewPlaceholderView = view.findViewById(R.id.preview_placeholder);
-            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);
         }
 
@@ -68,6 +69,14 @@
         public void bindView(IDreamItem item, int position) {
             mTitleView.setText(item.getTitle());
 
+            final CharSequence summary = item.getSummary();
+            if (TextUtils.isEmpty(summary)) {
+                mSummaryView.setVisibility(View.GONE);
+            } else {
+                mSummaryView.setText(summary);
+                mSummaryView.setVisibility(View.VISIBLE);
+            }
+
             final Drawable previewImage = item.getPreviewImage();
             if (previewImage != null) {
                 mPreviewView.setImageDrawable(previewImage);
@@ -82,7 +91,10 @@
                 icon.setTint(Utils.getColorAttrDefaultColor(mContext,
                         com.android.internal.R.attr.colorAccentPrimaryVariant));
             }
-            mIconView.setImageDrawable(icon);
+            final int iconSize = mContext.getResources().getDimensionPixelSize(
+                    R.dimen.dream_item_icon_size);
+            icon.setBounds(0, 0, iconSize, iconSize);
+            mTitleView.setCompoundDrawablesRelative(icon, null, null, null);
 
             if (item.isActive()) {
                 mLastSelectedPos = position;
diff --git a/src/com/android/settings/dream/DreamPickerController.java b/src/com/android/settings/dream/DreamPickerController.java
index b7ba614..af8c364 100644
--- a/src/com/android/settings/dream/DreamPickerController.java
+++ b/src/com/android/settings/dream/DreamPickerController.java
@@ -112,6 +112,11 @@
         }
 
         @Override
+        public CharSequence getSummary() {
+            return mDreamInfo.description;
+        }
+
+        @Override
         public Drawable getIcon() {
             return mDreamInfo.icon;
         }
diff --git a/src/com/android/settings/dream/IDreamItem.java b/src/com/android/settings/dream/IDreamItem.java
index c462fe2..49c82be 100644
--- a/src/com/android/settings/dream/IDreamItem.java
+++ b/src/com/android/settings/dream/IDreamItem.java
@@ -18,23 +18,52 @@
 
 import android.graphics.drawable.Drawable;
 
+import androidx.annotation.Nullable;
+
 /**
  * Interface representing a dream item to be displayed.
  */
 public interface IDreamItem {
+    /**
+     * Gets the title of this dream.
+     */
     CharSequence getTitle();
 
+    /**
+     * Gets the summary of this dream, or null if the dream doesn't provide one.
+     */
+    @Nullable
+    CharSequence getSummary();
+
+    /**
+     * Gets the icon for the dream.
+     */
     Drawable getIcon();
 
+    /**
+     * Callback which can be implemented to handle clicks on this dream.
+     */
     void onItemClicked();
 
+    /**
+     * Callback which can be implemented to handle the customization of this dream.
+     */
     default void onCustomizeClicked() {
     }
 
+    /**
+     * Gets the preview image of this dream.
+     */
     Drawable getPreviewImage();
 
+    /**
+     * Returns whether or not this dream is currently active.
+     */
     boolean isActive();
 
+    /**
+     * Returns whether to allow customization of this dream or not.
+     */
     default boolean allowCustomization() {
         return false;
     }