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

Commit e9169bd5 authored by Miranda Kephart's avatar Miranda Kephart
Browse files

Fix handling of display cutout

Add margins around the static screenshot layout. We want the
preview/buttons/etc to respect display cutouts (so they aren't
covered), but the flash and the background scrim to display across
the entire screen. This change adds bounding margins and updates
their location when the orientation changes (since we want to move
"up/down" in portrait and "left/right" in landscape). This also
allows us to handle waterfall cutouts correctly.

Bug: 189853509
Fix: 189853509
Test: manual -- used developer settings to test possible cutouts in
portrait and landscape

Change-Id: Id12012bb3d4dacb948cecd819999e0c7d46bb37b
parent 894c5d3d
Loading
Loading
Loading
Loading
+6 −20
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.systemui.screenshot;

import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.WindowManager.LayoutParams.TYPE_SCREENSHOT;
@@ -289,6 +288,7 @@ public class ScreenshotController {
        mWindowLayoutParams.setTitle("ScreenshotAnimation");
        mWindowLayoutParams.layoutInDisplayCutoutMode =
                WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
        mWindowLayoutParams.setFitInsetsTypes(0);
        // This is needed to let touches pass through outside the touchable areas
        mWindowLayoutParams.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY;

@@ -402,11 +402,6 @@ public class ScreenshotController {
            Log.d(TAG, "reloadAssets()");
        }

        // respect the display cutout in landscape (since we'd otherwise overlap) but not portrait
        int orientation = mContext.getResources().getConfiguration().orientation;
        mWindowLayoutParams.setFitInsetsTypes(
                orientation == ORIENTATION_PORTRAIT ? 0 : WindowInsets.Type.displayCutout());

        // Inflate the screenshot layout
        mScreenshotView = (ScreenshotView)
                LayoutInflater.from(mContext).inflate(R.layout.global_screenshot, null);
@@ -494,17 +489,6 @@ public class ScreenshotController {
        saveScreenshot(screenshot, finisher, screenRect, Insets.NONE, true);
    }

    private void updateDisplayCutout() {
        // respect the display cutout in landscape (since we'd otherwise overlap) but not portrait
        int orientation = mContext.getResources().getConfiguration().orientation;
        mWindowLayoutParams.setFitInsetsTypes(
                orientation == ORIENTATION_PORTRAIT ? 0 : WindowInsets.Type.displayCutout());
        final View decorView = mWindow.peekDecorView();
        if (decorView != null && decorView.isAttachedToWindow()) {
            mWindowManager.updateViewLayout(decorView, mWindowLayoutParams);
        }
    }

    private void saveScreenshot(Bitmap screenshot, Consumer<Uri> finisher, Rect screenRect,
            Insets screenInsets, boolean showFlash) {
        if (mAccessibilityManager.isEnabled()) {
@@ -528,8 +512,8 @@ public class ScreenshotController {
            mScreenshotView.reset();
        }

        int orientation = mContext.getResources().getConfiguration().orientation;
        mScreenshotView.updateOrientation(orientation == ORIENTATION_PORTRAIT);
        mScreenshotView.updateOrientation(mWindowManager.getCurrentWindowMetrics()
                .getWindowInsets().getDisplayCutout());

        mScreenBitmap = screenshot;

@@ -563,7 +547,9 @@ public class ScreenshotController {
                            // Delay scroll capture eval a bit to allow the underlying activity
                            // to set up in the new orientation.
                            mScreenshotHandler.postDelayed(this::requestScrollCapture, 150);
                            updateDisplayCutout();
                            mScreenshotView.updateDisplayCutoutMargins(
                                    mWindowManager.getCurrentWindowMetrics().getWindowInsets()
                                        .getDisplayCutout());
                        }
                    });
        });
+28 −3
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.MathUtils;
import android.view.DisplayCutout;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -348,12 +349,35 @@ public class ScreenshotView extends FrameLayout implements
        mScreenshotPreview.setImageDrawable(createScreenDrawable(mResources, bitmap, screenInsets));
    }

    void updateOrientation(boolean portrait) {
        mOrientationPortrait = portrait;
    void updateDisplayCutoutMargins(DisplayCutout cutout) {
        int orientation = mContext.getResources().getConfiguration().orientation;
        mOrientationPortrait = (orientation == ORIENTATION_PORTRAIT);
        FrameLayout.LayoutParams p =
                (FrameLayout.LayoutParams) mScreenshotStatic.getLayoutParams();
        if (cutout == null) {
            p.setMargins(0, 0, 0, 0);
        } else {
            Insets waterfall = cutout.getWaterfallInsets();
            if (mOrientationPortrait) {
                p.setMargins(waterfall.left, Math.max(cutout.getSafeInsetTop(), waterfall.top),
                        waterfall.right, Math.max(cutout.getSafeInsetBottom(), waterfall.bottom));
            } else {
                p.setMargins(Math.max(cutout.getSafeInsetLeft(), waterfall.left), waterfall.top,
                        Math.max(cutout.getSafeInsetRight(), waterfall.right), waterfall.bottom);
            }
        }
        mScreenshotStatic.setLayoutParams(p);
        mScreenshotStatic.requestLayout();
    }

    void updateOrientation(DisplayCutout cutout) {
        int orientation = mContext.getResources().getConfiguration().orientation;
        mOrientationPortrait = (orientation == ORIENTATION_PORTRAIT);
        updateDisplayCutoutMargins(cutout);
        int screenshotFixedSize =
                mContext.getResources().getDimensionPixelSize(R.dimen.global_screenshot_x_scale);
        ViewGroup.LayoutParams params = mScreenshotPreview.getLayoutParams();
        if (portrait) {
        if (mOrientationPortrait) {
            params.width = screenshotFixedSize;
            params.height = LayoutParams.WRAP_CONTENT;
            mScreenshotPreview.setScaleType(ImageView.ScaleType.FIT_START);
@@ -362,6 +386,7 @@ public class ScreenshotView extends FrameLayout implements
            params.height = screenshotFixedSize;
            mScreenshotPreview.setScaleType(ImageView.ScaleType.FIT_END);
        }

        mScreenshotPreview.setLayoutParams(params);
    }