From 5a9dce518edb2487b76485723401751ac0be0a74 Mon Sep 17 00:00:00 2001 From: Sebastian Franco Date: Wed, 8 Dec 2021 13:14:13 -0600 Subject: [PATCH] Combining the Thumbnail bitmap with the background to fix background spilling in the front. What's happening is that we first draw a background, on top of it, we then draw the Task and because we have a curvature the corners have pixels with transparency, and those pixels get combined with the background pixels. Most tasks have a transparent background or background of the same color as the task so we don't see this but for example, Telegram has a white background and you can see this in the corners. Fixed by creating a bitmap, drawing the background on it and then drawing the thumbnail on top of it then using that bitmap to draw it on the canvas. Test: Put Telegram in recent Task (shouldn't be the first one) and you won't see a white border. Also when a task was in multitask the backgroudn should be draw. Fix: 146521490 Change-Id: Id02a64ef472eb07900b0c7c5522d931d5b08f94e --- .../quickstep/views/TaskThumbnailView.java | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) 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) {