From 9c759448ee1ac9062c0e953db593a08c742a9bf0 Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Tue, 29 Jun 2021 09:30:54 -0400 Subject: [PATCH] Turn off screenshot transition into long screenshots for rotations If the user rotates the phone between the initial screenshot capture and the long screenshot capture, the views will be completely different and it doesn't make sense to try to transition from the preview into the long screenshots activity. This change just turns off the preview transition for this case (though we still show the scrim and fade it out during the transition). Bug: 192344739 Fix: 192344739 Test: manual Change-Id: I5951c074ad8ddb3957a76df963979cf47c987a66 --- .../res/layout/global_screenshot_static.xml | 1 + .../screenshot/ScreenshotController.java | 8 +- .../systemui/screenshot/ScreenshotView.java | 132 +++++++++++------- 3 files changed, 90 insertions(+), 51 deletions(-) diff --git a/packages/SystemUI/res/layout/global_screenshot_static.xml b/packages/SystemUI/res/layout/global_screenshot_static.xml index ba46edced03c9..665d4a04b00b6 100644 --- a/packages/SystemUI/res/layout/global_screenshot_static.xml +++ b/packages/SystemUI/res/layout/global_screenshot_static.xml @@ -127,6 +127,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="matrix" + android:visibility="gone" app:layout_constraintStart_toStartOf="@id/global_screenshot_preview" app:layout_constraintTop_toTopOf="@id/global_screenshot_preview" android:elevation="@dimen/screenshot_preview_elevation"/> diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java index 24cca91ea3f30..0dbe568b0a2d7 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java @@ -16,6 +16,7 @@ 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; @@ -257,6 +258,7 @@ public class ScreenshotController { private ScreenshotView mScreenshotView; private Bitmap mScreenBitmap; private SaveImageInBackgroundTask mSaveInBgTask; + private boolean mScreenshotTakenInPortrait; private Animator mScreenshotAnimation; private RequestCallback mCurrentRequestCallback; @@ -484,6 +486,9 @@ public class ScreenshotController { * Takes a screenshot of the current display and shows an animation. */ private void takeScreenshotInternal(Consumer finisher, Rect crop) { + mScreenshotTakenInPortrait = + mContext.getResources().getConfiguration().orientation == ORIENTATION_PORTRAIT; + // copy the input Rect, since SurfaceControl.screenshot can mutate it Rect screenRect = new Rect(crop); Bitmap screenshot = captureScreenshot(crop); @@ -653,7 +658,8 @@ public class ScreenshotController { Bitmap newScreenshot = captureScreenshot( new Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels)); - mScreenshotView.prepareScrollingTransition(response, mScreenBitmap, newScreenshot); + mScreenshotView.prepareScrollingTransition(response, mScreenBitmap, newScreenshot, + mScreenshotTakenInPortrait); // delay starting scroll capture to make sure the scrim is up before the app moves mScreenshotView.post(() -> { // Clear the reference to prevent close() in dismissScreenshot diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java index 9fe8c84bc13d1..dc736374cd592 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java @@ -162,6 +162,7 @@ public class ScreenshotView extends FrameLayout implements private GestureDetector mSwipeDetector; private SwipeDismissHandler mSwipeDismissHandler; private InputMonitorCompat mInputMonitor; + private boolean mShowScrollablePreview; private final ArrayList mSmartChips = new ArrayList<>(); private PendingInteraction mPendingInteraction; @@ -772,70 +773,99 @@ public class ScreenshotView extends FrameLayout implements void startLongScreenshotTransition(Rect destination, Runnable onTransitionEnd, ScrollCaptureController.LongScreenshot longScreenshot) { - mScrollablePreview.setImageBitmap(longScreenshot.toBitmap()); - ValueAnimator anim = ValueAnimator.ofFloat(0, 1); - float startX = mScrollablePreview.getX(); - float startY = mScrollablePreview.getY(); - int[] locInScreen = mScrollablePreview.getLocationOnScreen(); - destination.offset((int) startX - locInScreen[0], (int) startY - locInScreen[1]); - mScrollablePreview.setPivotX(0); - mScrollablePreview.setPivotY(0); - mScrollablePreview.setAlpha(1f); - float currentScale = mScrollablePreview.getWidth() / (float) longScreenshot.getWidth(); - Matrix matrix = new Matrix(); - matrix.setScale(currentScale, currentScale); - matrix.postTranslate( - longScreenshot.getLeft() * currentScale, longScreenshot.getTop() * currentScale); - mScrollablePreview.setImageMatrix(matrix); - float destinationScale = destination.width() / (float) mScrollablePreview.getWidth(); - anim.addUpdateListener(animation -> { - float t = animation.getAnimatedFraction(); - mScrollingScrim.setAlpha(1 - t); - float currScale = MathUtils.lerp(1, destinationScale, t); - mScrollablePreview.setScaleX(currScale); - mScrollablePreview.setScaleY(currScale); - mScrollablePreview.setX(MathUtils.lerp(startX, destination.left, t)); - mScrollablePreview.setY(MathUtils.lerp(startY, destination.top, t)); - }); - anim.addListener(new AnimatorListenerAdapter() { + AnimatorSet animSet = new AnimatorSet(); + + ValueAnimator scrimAnim = ValueAnimator.ofFloat(0, 1); + scrimAnim.addUpdateListener(animation -> + mScrollingScrim.setAlpha(1 - animation.getAnimatedFraction())); + + if (mShowScrollablePreview) { + mScrollablePreview.setImageBitmap(longScreenshot.toBitmap()); + float startX = mScrollablePreview.getX(); + float startY = mScrollablePreview.getY(); + int[] locInScreen = mScrollablePreview.getLocationOnScreen(); + destination.offset((int) startX - locInScreen[0], (int) startY - locInScreen[1]); + mScrollablePreview.setPivotX(0); + mScrollablePreview.setPivotY(0); + mScrollablePreview.setAlpha(1f); + float currentScale = mScrollablePreview.getWidth() / (float) longScreenshot.getWidth(); + Matrix matrix = new Matrix(); + matrix.setScale(currentScale, currentScale); + matrix.postTranslate( + longScreenshot.getLeft() * currentScale, + longScreenshot.getTop() * currentScale); + mScrollablePreview.setImageMatrix(matrix); + float destinationScale = destination.width() / (float) mScrollablePreview.getWidth(); + + ValueAnimator previewAnim = ValueAnimator.ofFloat(0, 1); + previewAnim.addUpdateListener(animation -> { + float t = animation.getAnimatedFraction(); + float currScale = MathUtils.lerp(1, destinationScale, t); + mScrollablePreview.setScaleX(currScale); + mScrollablePreview.setScaleY(currScale); + mScrollablePreview.setX(MathUtils.lerp(startX, destination.left, t)); + mScrollablePreview.setY(MathUtils.lerp(startY, destination.top, t)); + }); + ValueAnimator previewFadeAnim = ValueAnimator.ofFloat(1, 0); + previewFadeAnim.addUpdateListener(animation -> + mScrollablePreview.setAlpha(1 - animation.getAnimatedFraction())); + animSet.play(previewAnim).with(scrimAnim).before(previewFadeAnim); + previewAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + onTransitionEnd.run(); + } + }); + } else { + // if we switched orientations between the original screenshot and the long screenshot + // capture, just fade out the scrim instead of running the preview animation + animSet.play(scrimAnim); + animSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + onTransitionEnd.run(); + } + }); + } + animSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); - onTransitionEnd.run(); - mScrollablePreview.animate().alpha(0).setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); mCallbacks.onDismiss(); } - }); - } }); - anim.start(); + animSet.start(); } void prepareScrollingTransition(ScrollCaptureResponse response, Bitmap screenBitmap, - Bitmap newBitmap) { + Bitmap newBitmap, boolean screenshotTakenInPortrait) { + mShowScrollablePreview = (screenshotTakenInPortrait == mOrientationPortrait); + mScrollingScrim.setImageBitmap(newBitmap); mScrollingScrim.setVisibility(View.VISIBLE); - Rect scrollableArea = scrollableAreaOnScreen(response); - float scale = mCornerSizeX - / (mOrientationPortrait ? screenBitmap.getWidth() : screenBitmap.getHeight()); - ConstraintLayout.LayoutParams params = - (ConstraintLayout.LayoutParams) mScrollablePreview.getLayoutParams(); - params.width = (int) (scale * scrollableArea.width()); - params.height = (int) (scale * scrollableArea.height()); - Matrix matrix = new Matrix(); - matrix.setScale(scale, scale); - matrix.postTranslate(-scrollableArea.left * scale, -scrollableArea.top * scale); + if (mShowScrollablePreview) { + Rect scrollableArea = scrollableAreaOnScreen(response); - mScrollablePreview.setTranslationX(scale * scrollableArea.left); - mScrollablePreview.setTranslationY(scale * scrollableArea.top); - mScrollablePreview.setImageMatrix(matrix); + float scale = mCornerSizeX + / (mOrientationPortrait ? screenBitmap.getWidth() : screenBitmap.getHeight()); + ConstraintLayout.LayoutParams params = + (ConstraintLayout.LayoutParams) mScrollablePreview.getLayoutParams(); - mScrollablePreview.setImageBitmap(screenBitmap); - mScrollablePreview.setVisibility(View.VISIBLE); + params.width = (int) (scale * scrollableArea.width()); + params.height = (int) (scale * scrollableArea.height()); + Matrix matrix = new Matrix(); + matrix.setScale(scale, scale); + matrix.postTranslate(-scrollableArea.left * scale, -scrollableArea.top * scale); + + mScrollablePreview.setTranslationX(scale * scrollableArea.left); + mScrollablePreview.setTranslationY(scale * scrollableArea.top); + mScrollablePreview.setImageMatrix(matrix); + mScrollablePreview.setImageBitmap(screenBitmap); + mScrollablePreview.setVisibility(View.VISIBLE); + } mDismissButton.setVisibility(View.GONE); mActionsContainer.setVisibility(View.GONE); mBackgroundProtection.setVisibility(View.GONE); @@ -919,6 +949,8 @@ public class ScreenshotView extends FrameLayout implements mActionsContainer.setVisibility(View.GONE); mBackgroundProtection.setAlpha(0f); mDismissButton.setVisibility(View.GONE); + mScrollingScrim.setVisibility(View.GONE); + mScrollablePreview.setVisibility(View.GONE); mScreenshotStatic.setTranslationX(0); mScreenshotPreview.setTranslationY(0); mScreenshotPreview.setContentDescription(