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

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

Use correct window token for scrolling screenshots

Test: manual
Bug: 178093024
Fix: 178093024
Change-Id: I2a2e6bbbcd00f4d64c3226f3b22a9880acc3c412
Merged-In: I2a2e6bbbcd00f4d64c3226f3b22a9880acc3c412
(cherry picked from commit 3a4750be)
parent c8d8b7cd
Loading
Loading
Loading
Loading
+34 −24
Original line number Diff line number Diff line
@@ -49,7 +49,6 @@ import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.media.MediaActionSound;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -185,7 +184,6 @@ public class ScreenshotController {
    private final View mDecorView;
    private final DisplayManager mDisplayManager;

    private final Binder mWindowToken;
    private ScreenshotView mScreenshotView;
    private Bitmap mScreenBitmap;
    private SaveImageInBackgroundTask mSaveInBgTask;
@@ -247,9 +245,6 @@ public class ScreenshotController {
        mAccessibilityManager = AccessibilityManager.getInstance(mContext);
        mConfigProxy = configProxy;

        mWindowToken = new Binder("ScreenshotController");
        mScrollCaptureClient.setHostWindowToken(mWindowToken);

        // Setup the window that we are going to use
        mWindowLayoutParams = new WindowManager.LayoutParams(
                MATCH_PARENT, MATCH_PARENT, /* xpos */ 0, /* ypos */ 0, TYPE_SCREENSHOT,
@@ -263,7 +258,6 @@ public class ScreenshotController {
        mWindowLayoutParams.setTitle("ScreenshotAnimation");
        mWindowLayoutParams.layoutInDisplayCutoutMode =
                WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
        mWindowLayoutParams.token = mWindowToken;
        // This is needed to let touches pass through outside the touchable areas
        mWindowLayoutParams.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY;

@@ -526,21 +520,6 @@ public class ScreenshotController {

        // Start the post-screenshot animation
        startAnimation(finisher, screenRect, screenInsets, showFlash);

        if (mConfigProxy.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
                SystemUiDeviceConfigFlags.SCREENSHOT_SCROLLING_ENABLED, false)) {
            mScrollCaptureClient.request(DEFAULT_DISPLAY, (connection) ->
                    mScreenshotView.showScrollChip(() ->
                            runScrollCapture(connection,
                                    () -> mScreenshotHandler.post(
                                            () -> dismissScreenshot(false)))));
        }
    }

    private void runScrollCapture(ScrollCaptureClient.Connection connection, Runnable andThen) {
        ScrollCaptureController controller = new ScrollCaptureController(mContext, connection,
                mMainExecutor, mBgExecutor, mImageExporter);
        controller.run(andThen);
    }

    /**
@@ -570,6 +549,24 @@ public class ScreenshotController {
        });
    }

    /**
     * If scrolling is enabled, check whether the current view is scrollable and if so, show the
     * scroll chip.
     */
    private void maybeRequestScrollCapture() {
        if (mConfigProxy.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
                SystemUiDeviceConfigFlags.SCREENSHOT_SCROLLING_ENABLED, false)) {
            mScrollCaptureClient.setHostWindowToken(mDecorView.getWindowToken());
            mScrollCaptureClient.request(DEFAULT_DISPLAY, (connection) ->
                    mScreenshotView.showScrollChip(() -> {
                        ScrollCaptureController controller = new ScrollCaptureController(
                                mContext, connection, mMainExecutor, mBgExecutor, mImageExporter);
                        controller.run(() -> mScreenshotHandler.post(
                                () -> dismissScreenshot(false)));
                    }));
        }
    }

    /**
     * Starts the animation after taking the screenshot
     */
@@ -577,11 +574,24 @@ public class ScreenshotController {
            boolean showFlash) {
        mScreenshotHandler.removeMessages(MESSAGE_CORNER_TIMEOUT);
        mScreenshotHandler.post(() -> {
            if (!mScreenshotView.isAttachedToWindow()) {
            if (!mDecorView.isAttachedToWindow()) {
                if (DEBUG_WINDOW) {
                    Log.d(TAG, "Adding screenshot window");
                }
                mDecorView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                    @Override
                    public void onViewAttachedToWindow(View v) {
                        mDecorView.removeOnAttachStateChangeListener(this);
                        maybeRequestScrollCapture();
                    }

                    @Override
                    public void onViewDetachedFromWindow(View v) {
                    }
                });
                mWindowManager.addView(mWindow.getDecorView(), mWindowLayoutParams);
            } else {
                maybeRequestScrollCapture();
            }

            mScreenshotView.prepareForAnimation(mScreenBitmap, screenInsets);
@@ -618,10 +628,10 @@ public class ScreenshotController {
            if (DEBUG_WINDOW) {
                Log.d(TAG, "Removing screenshot window");
            }
            mWindowManager.removeView(mDecorView);
            mWindowManager.removeViewImmediate(mDecorView);
        }
        mScreenshotView.reset();
        mOnCompleteRunnable.run();
        mScreenshotView.reset();
    }

    /**