diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java index 60b0d17b40..11f9ddd5b3 100644 --- a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java +++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java @@ -50,6 +50,7 @@ import androidx.core.graphics.ColorUtils; import com.android.launcher3.BaseActivity; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Utilities; +import com.android.launcher3.icons.BitmapRenderer; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.SystemUiController; import com.android.quickstep.TaskOverlayFactory.TaskOverlay; @@ -161,6 +162,23 @@ public class TaskThumbnailView extends View { setThumbnail(task, thumbnailData, true /* refreshNow */); } + /** + * By combining the two in a single bitmap then we only have to do a single draw + * call in the onDraw function. Also, this fixes a bug where the background was + * visible in the corners because of anti-aliasing. + */ + public Bitmap combineThumbnailAndBackground(Bitmap bm) { + return BitmapRenderer.createHardwareBitmap(bm.getWidth(), bm.getHeight(), c -> { + final boolean drawBackgroundOnly = mTask == null || mTask.isLocked; + if (drawBackgroundOnly) { + c.drawPaint(mBackgroundPaint); + } else { + c.drawPaint(mBackgroundPaint); + c.drawBitmap(bm, 0, 0, null); + } + }); + } + /** Updates the shader, paint, matrix to redraw. */ public void refresh() { refresh(false); @@ -173,6 +191,7 @@ public class TaskThumbnailView extends View { private void refresh(boolean shouldRefreshOverlay) { if (mThumbnailData != null && mThumbnailData.thumbnail != null) { Bitmap bm = mThumbnailData.thumbnail; + bm = combineThumbnailAndBackground(bm); bm.prepareToDraw(); mBitmapShader = new BitmapShader(bm, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mPaint.setShader(mBitmapShader); @@ -194,7 +213,6 @@ public class TaskThumbnailView extends View { *
* If dimAlpha is 0, no dimming is applied; if dimAlpha is 1, the thumbnail will be the * extracted background color. - * */ public void setDimAlpha(float dimAlpha) { mDimAlpha = dimAlpha; @@ -296,18 +314,6 @@ public class TaskThumbnailView extends View { return; } } - - // Always draw the background since the snapshots might be translucent or partially empty - // (For example, tasks been reparented out of dismissing split root when drag-to-dismiss - // split screen). - canvas.drawRoundRect(x, y, width, height, cornerRadius, cornerRadius, mBackgroundPaint); - - final boolean drawBackgroundOnly = mTask == null || mTask.isLocked || mBitmapShader == null - || mThumbnailData == null; - if (drawBackgroundOnly) { - return; - } - canvas.drawRoundRect(x, y, width, height, cornerRadius, cornerRadius, mPaint); } @@ -338,7 +344,6 @@ public class TaskThumbnailView extends View { private void updateThumbnailPaintFilter() { ColorFilter filter = getColorFilter(mDimAlpha); - mBackgroundPaint.setColorFilter(filter); int alpha = (int) (mDimAlpha * 255); mDimmingPaintAfterClearing.setAlpha(alpha); if (mBitmapShader != null) {