Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5a9dce51 authored by Sebastian Franco's avatar Sebastian Franco Committed by Sebastián Franco
Browse files

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
parent 3159d775
Loading
Loading
Loading
Loading
+19 −14
Original line number Diff line number Diff line
@@ -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 {
     * <p>
     * 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) {