Use correct window token for scrolling screenshots

Test: manual
Bug: 178093024
Fix: 178093024
Change-Id: I2a2e6bbbcd00f4d64c3226f3b22a9880acc3c412
Merged-In: I2a2e6bbbcd00f4d64c3226f3b22a9880acc3c412
(cherry picked from commit 3a4750beb7)
This commit is contained in:
Miranda Kephart
2021-01-21 11:26:11 -05:00
parent c8d8b7cd9c
commit a8cf862df0

View File

@@ -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();
}
/**