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

Commit 428c17f4 authored by Winson Chung's avatar Winson Chung
Browse files

Workaround for crash from invalid snapshot

- wrapHardwareBuffer will throw an illegal argument exception when
  the buffer doesn't have this flag, but it's not clear how this
  happens yet because all the buffers should be from surface flinger
  snapshots...

Bug: 157562905
Test: Manual
Change-Id: I48be367d8aafb3e17f11a73a73432617a247c0dd
parent c6531920
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -18,12 +18,16 @@ package com.android.systemui.shared.recents.model;

import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
import static android.content.res.Configuration.ORIENTATION_UNDEFINED;
import static android.graphics.Bitmap.Config.ARGB_8888;

import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_UNDEFINED;

import android.app.ActivityManager.TaskSnapshot;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Rect;
import android.hardware.HardwareBuffer;
import android.util.Log;

/**
 * Data for a single thumbnail.
@@ -57,8 +61,15 @@ public class ThumbnailData {
    }

    public ThumbnailData(TaskSnapshot snapshot) {
        thumbnail = Bitmap.wrapHardwareBuffer(snapshot.getHardwareBuffer(),
                snapshot.getColorSpace());
        final HardwareBuffer buffer = snapshot.getHardwareBuffer();
        if (buffer != null && (buffer.getUsage() & HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE) == 0) {
            // TODO(b/157562905): Workaround for a crash when we get a snapshot without this state
            Log.e("ThumbnailData", "Unexpected snapshot without USAGE_GPU_SAMPLED_IMAGE");
            thumbnail = Bitmap.createBitmap(buffer.getWidth(), buffer.getHeight(), ARGB_8888);
            thumbnail.eraseColor(Color.BLACK);
        } else {
            thumbnail = Bitmap.wrapHardwareBuffer(buffer, snapshot.getColorSpace());
        }
        insets = new Rect(snapshot.getContentInsets());
        orientation = snapshot.getOrientation();
        rotation = snapshot.getRotation();