Request scroll capture when the screen rotates.

Show/hide the scroll capture button based upon availability of
scrollable content in the underlying app.

Needed a little delay after rotation to allow the underlying app to
adjust to the new orientation (otherwise it was always not scrollable).

Bug: 185897865
Test: Take screenshot, observe capture more, rotate, tap capture more.
Test: Take screenshot of an activity that scrolls in portrait but not
      landcape, rotate the phone and observe the capture more button
      appearing and disappearing appropriately.
Change-Id: I0015adee77e576549509468486936c57ec62a2fd
This commit is contained in:
Matt Casey
2021-06-08 10:47:05 -04:00
parent 825d39e0f1
commit da72d6dae4
2 changed files with 20 additions and 7 deletions

View File

@@ -554,16 +554,15 @@ public class ScreenshotController {
// Wait until this window is attached to request because it is
// the reference used to locate the target window (below).
withWindowAttached(() -> {
mScrollCaptureClient.setHostWindowToken(mWindow.getDecorView().getWindowToken());
if (mLastScrollCaptureRequest != null) {
mLastScrollCaptureRequest.cancel(true);
}
mLastScrollCaptureRequest = mScrollCaptureClient.request(DEFAULT_DISPLAY);
mLastScrollCaptureRequest.addListener(() ->
onScrollCaptureResponseReady(mLastScrollCaptureRequest), mMainExecutor);
requestScrollCapture();
mWindow.peekDecorView().getViewRootImpl().setActivityConfigCallback(
(overrideConfig, newDisplayId) -> {
if (mConfigChanges.applyNewConfig(mContext.getResources())) {
// Hide the scroll chip until we know it's available in this orientation
mScreenshotView.hideScrollChip();
// Delay scroll capture eval a bit to allow the underlying activity
// to set up in the new orientation.
mScreenshotHandler.postDelayed(this::requestScrollCapture, 150);
updateDisplayCutout();
}
});
@@ -593,6 +592,16 @@ public class ScreenshotController {
cancelTimeout(); // restarted after animation
}
private void requestScrollCapture() {
mScrollCaptureClient.setHostWindowToken(mWindow.getDecorView().getWindowToken());
if (mLastScrollCaptureRequest != null) {
mLastScrollCaptureRequest.cancel(true);
}
mLastScrollCaptureRequest = mScrollCaptureClient.request(DEFAULT_DISPLAY);
mLastScrollCaptureRequest.addListener(() ->
onScrollCaptureResponseReady(mLastScrollCaptureRequest), mMainExecutor);
}
private void onScrollCaptureResponseReady(Future<ScrollCaptureResponse> responseFuture) {
try {
if (mLastScrollCaptureResponse != null) {

View File

@@ -204,6 +204,10 @@ public class ScreenshotView extends FrameLayout implements
mSwipeDismissHandler = new SwipeDismissHandler();
}
public void hideScrollChip() {
mScrollChip.setVisibility(View.GONE);
}
/**
* Called to display the scroll action chip when support is detected.
*