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

Commit a31ffa9b authored by Santos Cordon's avatar Santos Cordon
Browse files

Support folding display in screenshot controller.

Since the underlying display device can now change for the default
logical display, we need to remove some caching that is done in
screenshot controller to appropriately grab the correct display
content when a sceenshot is requested.

Test: Manually test that a screenshot is taken before and after
      a device's default display changed (folded device folds).
Bug: 173144019
Change-Id: I8c8057f0eba78676580fa23c90cdf72cb6f1df9d
parent 41af40f6
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -79,10 +79,8 @@ public final class Display {

    private final DisplayManagerGlobal mGlobal;
    private final int mDisplayId;
    private final int mLayerStack;
    private final int mFlags;
    private final int mType;
    private final DisplayAddress mAddress;
    private final int mOwnerUid;
    private final String mOwnerPackageName;
    private final Resources mResources;
@@ -501,10 +499,8 @@ public final class Display {
        mIsValid = true;

        // Cache properties that cannot change as long as the display is valid.
        mLayerStack = displayInfo.layerStack;
        mFlags = displayInfo.flags;
        mType = displayInfo.type;
        mAddress = displayInfo.address;
        mOwnerUid = displayInfo.ownerUid;
        mOwnerPackageName = displayInfo.ownerPackageName;
    }
@@ -579,7 +575,10 @@ public final class Display {
     * @hide
     */
    public int getLayerStack() {
        return mLayerStack;
        synchronized (this) {
            updateDisplayInfoLocked();
            return mDisplayInfo.layerStack;
        }
    }

    /**
@@ -623,7 +622,10 @@ public final class Display {
     * @hide
     */
    public DisplayAddress getAddress() {
        return mAddress;
        synchronized (this) {
            updateDisplayInfoLocked();
            return mDisplayInfo.address;
        }
    }

    /**
+32 −18
Original line number Diff line number Diff line
@@ -55,13 +55,13 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.UserHandle;
import android.provider.DeviceConfig;
import android.provider.Settings;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.Pair;
import android.view.Display;
import android.view.DisplayAddress;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -177,13 +177,13 @@ public class ScreenshotController {

    private final WindowManager mWindowManager;
    private final WindowManager.LayoutParams mWindowLayoutParams;
    private final DisplayMetrics mDisplayMetrics;
    private final AccessibilityManager mAccessibilityManager;
    private final MediaActionSound mCameraSound;
    private final ScrollCaptureClient mScrollCaptureClient;
    private final DeviceConfigProxy mConfigProxy;
    private final PhoneWindow mWindow;
    private final View mDecorView;
    private final DisplayManager mDisplayManager;

    private final Binder mWindowToken;
    private ScreenshotView mScreenshotView;
@@ -239,9 +239,8 @@ public class ScreenshotController {
        mMainExecutor = mainExecutor;
        mBgExecutor = bgExecutor;

        final DisplayManager dm = requireNonNull(context.getSystemService(DisplayManager.class));
        final Display display = dm.getDisplay(DEFAULT_DISPLAY);
        final Context displayContext = context.createDisplayContext(display);
        mDisplayManager = requireNonNull(context.getSystemService(DisplayManager.class));
        final Context displayContext = context.createDisplayContext(getDefaultDisplay());
        mContext = (WindowContext) displayContext.createWindowContext(TYPE_SCREENSHOT, null);
        mWindowManager = mContext.getSystemService(WindowManager.class);

@@ -277,9 +276,6 @@ public class ScreenshotController {

        reloadAssets();

        mDisplayMetrics = new DisplayMetrics();
        display.getRealMetrics(mDisplayMetrics);

        // Setup the Camera shutter sound
        mCameraSound = new MediaActionSound();
        mCameraSound.load(MediaActionSound.SHUTTER_CLICK);
@@ -288,9 +284,11 @@ public class ScreenshotController {
    void takeScreenshotFullscreen(Consumer<Uri> finisher, Runnable onComplete) {
        mOnCompleteRunnable = onComplete;

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getDefaultDisplay().getRealMetrics(displayMetrics);
        takeScreenshotInternal(
                finisher,
                new Rect(0, 0, mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels));
                new Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels));
    }

    void handleImageAsScreenshot(Bitmap screenshot, Rect screenshotScreenBounds,
@@ -440,7 +438,18 @@ public class ScreenshotController {
        Rect screenRect = new Rect(crop);
        int width = crop.width();
        int height = crop.height();
        final IBinder displayToken = SurfaceControl.getInternalDisplayToken();

        Bitmap screenshot = null;
        final Display display = getDefaultDisplay();
        final DisplayAddress address = display.getAddress();
        if (!(address instanceof DisplayAddress.Physical)) {
            Log.e(TAG, "Skipping Screenshot - Default display does not have a physical address: "
                    + display);
        } else {
            final DisplayAddress.Physical physicalAddress = (DisplayAddress.Physical) address;

            final IBinder displayToken = SurfaceControl.getPhysicalDisplayToken(
                    physicalAddress.getPhysicalDisplayId());
            final SurfaceControl.DisplayCaptureArgs captureArgs =
                    new SurfaceControl.DisplayCaptureArgs.Builder(displayToken)
                            .setSourceCrop(crop)
@@ -448,7 +457,8 @@ public class ScreenshotController {
                            .build();
            final SurfaceControl.ScreenshotHardwareBuffer screenshotBuffer =
                    SurfaceControl.captureDisplay(captureArgs);
        Bitmap screenshot = screenshotBuffer == null ? null : screenshotBuffer.asBitmap();
            screenshot = screenshotBuffer == null ? null : screenshotBuffer.asBitmap();
        }

        if (screenshot == null) {
            Log.e(TAG, "takeScreenshotInternal: Screenshot bitmap was null");
@@ -753,6 +763,10 @@ public class ScreenshotController {
        }
    }

    private Display getDefaultDisplay() {
        return mDisplayManager.getDisplay(DEFAULT_DISPLAY);
    }

    /** Does the aspect ratio of the bitmap with insets removed match the bounds. */
    private static boolean aspectRatiosMatch(Bitmap bitmap, Insets bitmapInsets,
            Rect screenBounds) {