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

Commit 6aead1cc authored by Jorim Jaggi's avatar Jorim Jaggi
Browse files

Fix creating of app theme snapshots

Apparently locking a HW bitmap makes it super slow to draw.
Instead, draw it into a bitmap, copy it into a hw bitmap, and then
extract the GraphicBuffer.

Test: Open Camera, go home, reopen camera (and maybe go to recents)
Change-Id: Id2371dcdad95f07a680e6c56c0403b3ad815a3f3
Fixes: 38510859
parent ff389264
Loading
Loading
Loading
Loading
+13 −15
Original line number Diff line number Diff line
@@ -17,15 +17,14 @@
package com.android.server.wm;

import static android.app.ActivityManager.ENABLE_TASK_SNAPSHOTS;
import static android.graphics.GraphicBuffer.USAGE_HW_TEXTURE;
import static android.graphics.GraphicBuffer.USAGE_SW_READ_NEVER;
import static android.graphics.GraphicBuffer.USAGE_SW_WRITE_RARELY;
import static android.graphics.PixelFormat.RGBA_8888;
import static android.graphics.Bitmap.Config.ARGB_8888;
import static android.graphics.Bitmap.Config.HARDWARE;

import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityManager.StackId;
import android.app.ActivityManager.TaskSnapshot;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.GraphicBuffer;
import android.graphics.Rect;
@@ -42,7 +41,6 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.wm.TaskSnapshotSurface.SystemBarBackgroundPainter;

import java.io.PrintWriter;
import java.util.function.Consumer;

/**
 * When an app token becomes invisible, we take a snapshot (bitmap) of the corresponding task and
@@ -240,22 +238,22 @@ class TaskSnapshotController {
        final int color = task.getTaskDescription().getBackgroundColor();
        final int statusBarColor = task.getTaskDescription().getStatusBarColor();
        final int navigationBarColor = task.getTaskDescription().getNavigationBarColor();
        final GraphicBuffer buffer = GraphicBuffer.create(mainWindow.getFrameLw().width(),
                mainWindow.getFrameLw().height(),
                RGBA_8888, USAGE_HW_TEXTURE | USAGE_SW_WRITE_RARELY | USAGE_SW_READ_NEVER);
        if (buffer == null) {
            return null;
        }
        final Canvas c = buffer.lockCanvas();
        final Bitmap b = Bitmap.createBitmap(mainWindow.getFrameLw().width(),
                mainWindow.getFrameLw().height(), ARGB_8888);
        final Canvas c = new Canvas(b);
        c.drawColor(color);
        final LayoutParams attrs = mainWindow.getAttrs();
        final SystemBarBackgroundPainter decorPainter = new SystemBarBackgroundPainter(attrs.flags,
                attrs.privateFlags, attrs.systemUiVisibility, statusBarColor, navigationBarColor);
        decorPainter.setInsets(mainWindow.mContentInsets, mainWindow.mStableInsets);
        decorPainter.drawDecors(c, null /* statusBarExcludeFrame */);
        buffer.unlockCanvasAndPost(c);
        return new TaskSnapshot(buffer, topChild.getConfiguration().orientation,
                mainWindow.mStableInsets, false /* reduced */, 1.0f /* scale */);

        // Flush writer.
        c.setBitmap(null);
        final Bitmap hwBitmap = b.copy(HARDWARE, false /* isMutable */);
        return new TaskSnapshot(hwBitmap.createGraphicBufferHandle(),
                topChild.getConfiguration().orientation, mainWindow.mStableInsets,
                false /* reduced */, 1.0f /* scale */);
    }

    /**