Merge "Only create one bitmap to clip popup item corners" into ub-launcher3-dorval
diff --git a/src/com/android/launcher3/notification/NotificationItemView.java b/src/com/android/launcher3/notification/NotificationItemView.java
index c6268e2..37b8325 100644
--- a/src/com/android/launcher3/notification/NotificationItemView.java
+++ b/src/com/android/launcher3/notification/NotificationItemView.java
@@ -17,7 +17,6 @@
 package com.android.launcher3.notification;
 
 import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
 import android.content.Context;
 import android.graphics.Rect;
 import android.util.AttributeSet;
@@ -74,20 +73,8 @@
 
     public Animator animateHeightRemoval(int heightToRemove) {
         final int newHeight = getHeight() - heightToRemove;
-        Animator heightAnimator = new PillHeightRevealOutlineProvider(mPillRect,
+        return new PillHeightRevealOutlineProvider(mPillRect,
                 getBackgroundRadius(), newHeight).createRevealAnimator(this, true /* isReversed */);
-        heightAnimator.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                if (newHeight > 0) {
-                    measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY),
-                            MeasureSpec.makeMeasureSpec(newHeight, MeasureSpec.EXACTLY));
-                    initializeBackgroundClipping(true /* force */);
-                    invalidate();
-                }
-            }
-        });
-        return heightAnimator;
     }
 
     public void updateHeader(int notificationCount) {
diff --git a/src/com/android/launcher3/popup/PopupItemView.java b/src/com/android/launcher3/popup/PopupItemView.java
index 71daae9..0853c13 100644
--- a/src/com/android/launcher3/popup/PopupItemView.java
+++ b/src/com/android/launcher3/popup/PopupItemView.java
@@ -21,14 +21,13 @@
 import android.animation.ValueAnimator;
 import android.content.Context;
 import android.graphics.Bitmap;
-import android.graphics.BitmapShader;
 import android.graphics.Canvas;
+import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Point;
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffXfermode;
 import android.graphics.Rect;
-import android.graphics.Shader;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.FrameLayout;
@@ -52,8 +51,9 @@
 
     protected View mIconView;
 
-    private final Paint mBackgroundClipPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG |
-            Paint.FILTER_BITMAP_FLAG);
+    private final Paint mBackgroundClipPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
+    private final Matrix mMatrix = new Matrix();
+    private Bitmap mRoundedCornerBitmap;
 
     public PopupItemView(Context context) {
         this(context, null, 0);
@@ -67,6 +67,14 @@
         super(context, attrs, defStyle);
 
         mPillRect = new Rect();
+
+        // Initialize corner clipping Bitmap and Paint.
+        int radius = (int) getBackgroundRadius();
+        mRoundedCornerBitmap = Bitmap.createBitmap(radius, radius, Bitmap.Config.ALPHA_8);
+        Canvas canvas = new Canvas();
+        canvas.setBitmap(mRoundedCornerBitmap);
+        canvas.drawArc(0, 0, radius*2, radius*2, 180, 90, true, mBackgroundClipPaint);
+        mBackgroundClipPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
     }
 
     @Override
@@ -81,30 +89,29 @@
         mPillRect.set(0, 0, getMeasuredWidth(), getMeasuredHeight());
     }
 
-    protected void initializeBackgroundClipping(boolean force) {
-        if (force || mBackgroundClipPaint.getShader() == null) {
-            mBackgroundClipPaint.setXfermode(null);
-            mBackgroundClipPaint.setShader(null);
-            Bitmap backgroundBitmap = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(),
-                    Bitmap.Config.ALPHA_8);
-            Canvas canvas = new Canvas();
-            canvas.setBitmap(backgroundBitmap);
-            canvas.drawRoundRect(0, 0, getMeasuredWidth(), getMeasuredHeight(),
-                    getBackgroundRadius(), getBackgroundRadius(), mBackgroundClipPaint);
-            Shader backgroundClipShader = new BitmapShader(backgroundBitmap,
-                    Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
-            mBackgroundClipPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
-            mBackgroundClipPaint.setShader(backgroundClipShader);
-        }
-    }
-
     @Override
     protected void dispatchDraw(Canvas canvas) {
-        initializeBackgroundClipping(false /* force */);
-        int saveCount = canvas.saveLayer(0, 0, getWidth(), getHeight(), null,
-                Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG);
+        int saveCount = canvas.saveLayer(0, 0, getWidth(), getHeight(), null);
         super.dispatchDraw(canvas);
-        canvas.drawPaint(mBackgroundClipPaint);
+
+        int cornerWidth = mRoundedCornerBitmap.getWidth();
+        int cornerHeight = mRoundedCornerBitmap.getHeight();
+        // Clip top left corner.
+        mMatrix.reset();
+        canvas.drawBitmap(mRoundedCornerBitmap, mMatrix, mBackgroundClipPaint);
+        // Clip top right corner.
+        mMatrix.setRotate(90, cornerWidth / 2, cornerHeight / 2);
+        mMatrix.postTranslate(canvas.getWidth() - cornerWidth, 0);
+        canvas.drawBitmap(mRoundedCornerBitmap, mMatrix, mBackgroundClipPaint);
+        // Clip bottom right corner.
+        mMatrix.setRotate(180, cornerWidth / 2, cornerHeight / 2);
+        mMatrix.postTranslate(canvas.getWidth() - cornerWidth, canvas.getHeight() - cornerHeight);
+        canvas.drawBitmap(mRoundedCornerBitmap, mMatrix, mBackgroundClipPaint);
+        // Clip bottom left corner.
+        mMatrix.setRotate(270, cornerWidth / 2, cornerHeight / 2);
+        mMatrix.postTranslate(0, canvas.getHeight() - cornerHeight);
+        canvas.drawBitmap(mRoundedCornerBitmap, mMatrix, mBackgroundClipPaint);
+
         canvas.restoreToCount(saveCount);
     }