Merge "Fixing touch feedback clipped on SetWallpaper button" into ub-launcher3-burnaby
diff --git a/src/com/android/launcher3/WidgetPreviewLoader.java b/src/com/android/launcher3/WidgetPreviewLoader.java
index a621771..cfeced2 100644
--- a/src/com/android/launcher3/WidgetPreviewLoader.java
+++ b/src/com/android/launcher3/WidgetPreviewLoader.java
@@ -586,26 +586,26 @@
         protected Bitmap doInBackground(Void... params) {
             Bitmap unusedBitmap = null;
 
+            // If already cancelled before this gets to run in the background, then return early
+            if (isCancelled()) {
+                return null;
+            }
             synchronized (mUnusedBitmaps) {
-                // If already cancelled before this gets to run in the background, then return early
-                if (isCancelled()) {
-                    return null;
-                }
-                // Check if we can use a bitmap
+                // Check if we can re-use a bitmap
                 for (Bitmap candidate : mUnusedBitmaps) {
                     if (candidate != null && candidate.isMutable() &&
                             candidate.getWidth() == mPreviewWidth &&
                             candidate.getHeight() == mPreviewHeight) {
                         unusedBitmap = candidate;
+                        mUnusedBitmaps.remove(unusedBitmap);
                         break;
                     }
                 }
+            }
 
-                if (unusedBitmap == null) {
-                    unusedBitmap = Bitmap.createBitmap(mPreviewWidth, mPreviewHeight, Config.ARGB_8888);
-                } else {
-                    mUnusedBitmaps.remove(unusedBitmap);
-                }
+            // creating a bitmap is expensive. Do not do this inside synchronized block.
+            if (unusedBitmap == null) {
+                unusedBitmap = Bitmap.createBitmap(mPreviewWidth, mPreviewHeight, Config.ARGB_8888);
             }
             // If cancelled now, don't bother reading the preview from the DB
             if (isCancelled()) {
diff --git a/src/com/android/launcher3/widget/WidgetCell.java b/src/com/android/launcher3/widget/WidgetCell.java
index 2714f51..7496ea2 100644
--- a/src/com/android/launcher3/widget/WidgetCell.java
+++ b/src/com/android/launcher3/widget/WidgetCell.java
@@ -26,6 +26,7 @@
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.OnLayoutChangeListener;
+import android.view.ViewPropertyAnimator;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
@@ -175,7 +176,8 @@
         if (bitmap != null) {
             mWidgetImage.setBitmap(bitmap);
             mWidgetImage.setAlpha(0f);
-            mWidgetImage.animate().alpha(1.0f).setDuration(FADE_IN_DURATION_MS);
+            ViewPropertyAnimator anim = mWidgetImage.animate();
+            anim.alpha(1.0f).setDuration(FADE_IN_DURATION_MS);
         }
     }
 
diff --git a/src/com/android/launcher3/widget/WidgetImageView.java b/src/com/android/launcher3/widget/WidgetImageView.java
index 6f8fd89..b0fbe1e 100644
--- a/src/com/android/launcher3/widget/WidgetImageView.java
+++ b/src/com/android/launcher3/widget/WidgetImageView.java
@@ -64,6 +64,14 @@
         }
     }
 
+    /**
+     * Prevents the inefficient alpha view rendering.
+     */
+    @Override
+    public boolean hasOverlappingRendering() {
+        return false;
+    }
+
     private void updateDstRectF() {
         if (mBitmap.getWidth() > getWidth()) {
             float scale = ((float) getWidth()) / mBitmap.getWidth();