Grid/CellContent changes to know # of lines in a row

To measure grid content correctly we need to know the
max number of lines of text within the row and also
if there is an image.

Bug: 68378574
Test: none
Change-Id: Iff0f714eb9e52dfbfd074355fa2fa57dbd5ac686
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/GridContent.java b/slices/view/src/main/java/androidx/app/slice/widget/GridContent.java
index 794187d..41a9640 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/GridContent.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/GridContent.java
@@ -27,6 +27,7 @@
 import static android.app.slice.SliceItem.FORMAT_TEXT;
 import static android.app.slice.SliceItem.FORMAT_TIMESTAMP;
 
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 
@@ -47,6 +48,8 @@
     private SliceItem mColorItem;
     private SliceItem mPrimaryAction;
     private ArrayList<CellContent> mGridContent = new ArrayList<>();
+    private int mMaxCellLineCount;
+    private boolean mHasImage;
 
     public GridContent(SliceItem gridItem) {
         populate(gridItem);
@@ -54,6 +57,8 @@
 
     private void reset() {
         mColorItem = null;
+        mMaxCellLineCount = 0;
+        mHasImage = false;
         mGridContent.clear();
     }
 
@@ -77,25 +82,30 @@
             for (int i = 0; i < items.size(); i++) {
                 SliceItem item = items.get(i);
                 CellContent cc = new CellContent(item);
-                if (cc.isValid()) {
-                    mGridContent.add(cc);
-                    if (!cc.isImageOnly()) {
-                        mAllImages = false;
-                    }
-                }
+                processContent(cc);
             }
         } else {
             CellContent cc = new CellContent(gridItem);
-            if (cc.isValid()) {
-                mGridContent.add(cc);
-            }
+            processContent(cc);
         }
         return isValid();
     }
 
+    private void processContent(CellContent cc) {
+        if (cc.isValid()) {
+            mGridContent.add(cc);
+            if (!cc.isImageOnly()) {
+                mAllImages = false;
+            }
+            mMaxCellLineCount = Math.max(mMaxCellLineCount, cc.getTextCount());
+            mHasImage |= cc.hasImage();
+        }
+    }
+
     /**
      * @return the list of cell content for this grid.
      */
+    @NonNull
     public ArrayList<CellContent> getGridContent() {
         return mGridContent;
     }
@@ -103,6 +113,7 @@
     /**
      * @return the color to tint content in this grid.
      */
+    @Nullable
     public SliceItem getColorItem() {
         return mColorItem;
     }
@@ -141,6 +152,20 @@
     }
 
     /**
+     * @return the max number of lines of text in the cells of this grid row.
+     */
+    public int getMaxCellLineCount() {
+        return mMaxCellLineCount;
+    }
+
+    /**
+     * @return whether this row contains an image.
+     */
+    public boolean hasImage() {
+        return mHasImage;
+    }
+
+    /**
      * Extracts information required to present content in a cell.
      * @hide
      */
@@ -148,6 +173,8 @@
     public static class CellContent {
         private SliceItem mContentIntent;
         private ArrayList<SliceItem> mCellItems = new ArrayList<>();
+        private int mTextCount;
+        private boolean mHasImage;
 
         public CellContent(SliceItem cellItem) {
             populate(cellItem);
@@ -170,17 +197,18 @@
                 if (FORMAT_ACTION.equals(format)) {
                     mContentIntent = cellItem;
                 }
-                int textCount = 0;
+                mTextCount = 0;
                 int imageCount = 0;
                 for (int i = 0; i < items.size(); i++) {
                     final SliceItem item = items.get(i);
                     final String itemFormat = item.getFormat();
-                    if (textCount < 2 && (FORMAT_TEXT.equals(itemFormat)
+                    if (mTextCount < 2 && (FORMAT_TEXT.equals(itemFormat)
                             || FORMAT_TIMESTAMP.equals(itemFormat))) {
-                        textCount++;
+                        mTextCount++;
                         mCellItems.add(item);
                     } else if (imageCount < 1 && FORMAT_IMAGE.equals(item.getFormat())) {
                         imageCount++;
+                        mHasImage = true;
                         mCellItems.add(item);
                     }
                 }
@@ -227,5 +255,19 @@
         public boolean isImageOnly() {
             return mCellItems.size() == 1 && FORMAT_IMAGE.equals(mCellItems.get(0).getFormat());
         }
+
+        /**
+         * @return number of text items in this cell.
+         */
+        public int getTextCount() {
+            return mTextCount;
+        }
+
+        /**
+         * @return whether this cell contains an image.
+         */
+        public boolean hasImage() {
+            return mHasImage;
+        }
     }
 }