Measuring the notifications at wrap_content height now

The notifications are now measured at wrap_content such
that the layout still looks good even if the text
was ommited instead of arbitrarily making it bigger.
This also fixes some small rounding issues where the
expanded notification was just a pixel bigger than
the collapsed version.

Bug: 26185377
Change-Id: Ie3339ff75680ab512446605055304576e058f588
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
index f3ee0bb..ca68856 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
@@ -24,6 +24,7 @@
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffXfermode;
 import android.graphics.Rect;
+import android.os.Build;
 import android.service.notification.StatusBarNotification;
 import android.util.AttributeSet;
 import android.view.NotificationHeaderView;
@@ -58,6 +59,8 @@
     private final int mRoundRectRadius;
     private final Interpolator mLinearInterpolator = new LinearInterpolator();
     private final boolean mRoundRectClippingEnabled;
+    private final int mMinContractedHeight;
+
 
     private View mContractedChild;
     private View mExpandedChild;
@@ -103,7 +106,7 @@
         }
     };
     private OnClickListener mExpandClickListener;
-
+    private boolean mBeforeN;
     public NotificationContentView(Context context, AttributeSet attrs) {
         super(context, attrs);
         mHybridViewManager = new HybridNotificationViewManager(getContext(), this);
@@ -112,6 +115,8 @@
                 R.dimen.notification_material_rounded_rect_radius);
         mRoundRectClippingEnabled = getResources().getBoolean(
                 R.bool.config_notifications_round_rect_clipping);
+        mMinContractedHeight = getResources().getDimensionPixelSize(
+                R.dimen.min_notification_layout_height);
         reset(true);
         setOutlineProvider(mOutlineProvider);
     }
@@ -133,10 +138,20 @@
         }
         int maxChildHeight = 0;
         if (mContractedChild != null) {
-            int size = Math.min(maxSize, mSmallHeight);
-            mContractedChild.measure(widthMeasureSpec,
-                    MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY));
-            maxChildHeight = Math.max(maxChildHeight, mContractedChild.getMeasuredHeight());
+            int heightSpec;
+            if (shouldContractedBeFixedSize()) {
+                int size = Math.min(maxSize, mSmallHeight);
+                heightSpec = MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY);
+            } else {
+                heightSpec = MeasureSpec.makeMeasureSpec(maxSize, MeasureSpec.AT_MOST);
+            }
+            mContractedChild.measure(widthMeasureSpec, heightSpec);
+            int measuredHeight = mContractedChild.getMeasuredHeight();
+            if (measuredHeight < mMinContractedHeight) {
+                heightSpec = MeasureSpec.makeMeasureSpec(mMinContractedHeight, MeasureSpec.EXACTLY);
+                mContractedChild.measure(widthMeasureSpec, heightSpec);
+            }
+            maxChildHeight = Math.max(maxChildHeight, measuredHeight);
         }
         if (mExpandedChild != null) {
             int size = Math.min(maxSize, mNotificationMaxHeight);
@@ -172,6 +187,10 @@
         setMeasuredDimension(width, ownHeight);
     }
 
+    private boolean shouldContractedBeFixedSize() {
+        return mBeforeN && mContractedWrapper instanceof NotificationCustomViewWrapper;
+    }
+
     @Override
     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
         super.onLayout(changed, left, top, right, bottom);
@@ -294,14 +313,14 @@
         } else if (mIsHeadsUp && mHeadsUpChild != null) {
             return mHeadsUpChild.getHeight();
         }
-        return mSmallHeight;
+        return mContractedChild.getHeight();
     }
 
     public int getMinHeight() {
         if (mIsChildInGroup && !isGroupExpanded()) {
             return mSingleLineView.getHeight();
         } else {
-            return mSmallHeight;
+            return mContractedChild.getHeight();
         }
     }
 
@@ -448,7 +467,7 @@
                 return VISIBLE_TYPE_EXPANDED;
             }
         } else {
-            if (mContentHeight <= mSmallHeight || noExpandedChild) {
+            if (mContentHeight <= mContractedChild.getHeight() || noExpandedChild) {
                 return VISIBLE_TYPE_CONTRACTED;
             } else {
                 return VISIBLE_TYPE_EXPANDED;
@@ -493,6 +512,7 @@
 
     public void onNotificationUpdated(NotificationData.Entry entry) {
         mStatusBarNotification = entry.notification;
+        mBeforeN = entry.targetSdk < Build.VERSION_CODES.N;
         updateSingleLineView();
         applyRemoteInput(entry);
         selectLayout(false /* animate */, true /* force */);