Loading packages/SystemUI/res/layout/global_screenshot_static.xml +1 −0 Original line number Diff line number Diff line Loading @@ -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"/> Loading packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java +7 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -259,6 +260,7 @@ public class ScreenshotController { private ScreenshotView mScreenshotView; private Bitmap mScreenBitmap; private SaveImageInBackgroundTask mSaveInBgTask; private boolean mScreenshotTakenInPortrait; private Animator mScreenshotAnimation; private RequestCallback mCurrentRequestCallback; Loading Loading @@ -488,6 +490,9 @@ public class ScreenshotController { * Takes a screenshot of the current display and shows an animation. */ private void takeScreenshotInternal(Consumer<Uri> 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); Loading Loading @@ -661,7 +666,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 Loading packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java +85 −53 Original line number Diff line number Diff line Loading @@ -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<ScreenshotActionChip> mSmartChips = new ArrayList<>(); private PendingInteraction mPendingInteraction; Loading Loading @@ -772,8 +773,14 @@ public class ScreenshotView extends FrameLayout implements void startLongScreenshotTransition(Rect destination, Runnable onTransitionEnd, ScrollCaptureController.LongScreenshot longScreenshot) { AnimatorSet animSet = new AnimatorSet(); ValueAnimator scrimAnim = ValueAnimator.ofFloat(0, 1); scrimAnim.addUpdateListener(animation -> mScrollingScrim.setAlpha(1 - animation.getAnimatedFraction())); if (mShowScrollablePreview) { mScrollablePreview.setImageBitmap(longScreenshot.toBitmap()); ValueAnimator anim = ValueAnimator.ofFloat(0, 1); float startX = mScrollablePreview.getX(); float startY = mScrollablePreview.getY(); int[] locInScreen = mScrollablePreview.getLocationOnScreen(); Loading @@ -785,40 +792,63 @@ public class ScreenshotView extends FrameLayout implements Matrix matrix = new Matrix(); matrix.setScale(currentScale, currentScale); matrix.postTranslate( longScreenshot.getLeft() * currentScale, longScreenshot.getTop() * currentScale); longScreenshot.getLeft() * currentScale, longScreenshot.getTop() * currentScale); mScrollablePreview.setImageMatrix(matrix); float destinationScale = destination.width() / (float) mScrollablePreview.getWidth(); anim.addUpdateListener(animation -> { ValueAnimator previewAnim = ValueAnimator.ofFloat(0, 1); previewAnim.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() { 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(); mScrollablePreview.animate().alpha(0).setListener(new AnimatorListenerAdapter() { } }); } 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); mCallbacks.onDismiss(); onTransitionEnd.run(); } }); } animSet.addListener(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); if (mShowScrollablePreview) { Rect scrollableArea = scrollableAreaOnScreen(response); float scale = mCornerSizeX / (mOrientationPortrait ? screenBitmap.getWidth() : screenBitmap.getHeight()); ConstraintLayout.LayoutParams params = Loading @@ -833,9 +863,9 @@ public class ScreenshotView extends FrameLayout implements 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); Loading Loading @@ -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( Loading Loading
packages/SystemUI/res/layout/global_screenshot_static.xml +1 −0 Original line number Diff line number Diff line Loading @@ -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"/> Loading
packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java +7 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -259,6 +260,7 @@ public class ScreenshotController { private ScreenshotView mScreenshotView; private Bitmap mScreenBitmap; private SaveImageInBackgroundTask mSaveInBgTask; private boolean mScreenshotTakenInPortrait; private Animator mScreenshotAnimation; private RequestCallback mCurrentRequestCallback; Loading Loading @@ -488,6 +490,9 @@ public class ScreenshotController { * Takes a screenshot of the current display and shows an animation. */ private void takeScreenshotInternal(Consumer<Uri> 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); Loading Loading @@ -661,7 +666,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 Loading
packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java +85 −53 Original line number Diff line number Diff line Loading @@ -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<ScreenshotActionChip> mSmartChips = new ArrayList<>(); private PendingInteraction mPendingInteraction; Loading Loading @@ -772,8 +773,14 @@ public class ScreenshotView extends FrameLayout implements void startLongScreenshotTransition(Rect destination, Runnable onTransitionEnd, ScrollCaptureController.LongScreenshot longScreenshot) { AnimatorSet animSet = new AnimatorSet(); ValueAnimator scrimAnim = ValueAnimator.ofFloat(0, 1); scrimAnim.addUpdateListener(animation -> mScrollingScrim.setAlpha(1 - animation.getAnimatedFraction())); if (mShowScrollablePreview) { mScrollablePreview.setImageBitmap(longScreenshot.toBitmap()); ValueAnimator anim = ValueAnimator.ofFloat(0, 1); float startX = mScrollablePreview.getX(); float startY = mScrollablePreview.getY(); int[] locInScreen = mScrollablePreview.getLocationOnScreen(); Loading @@ -785,40 +792,63 @@ public class ScreenshotView extends FrameLayout implements Matrix matrix = new Matrix(); matrix.setScale(currentScale, currentScale); matrix.postTranslate( longScreenshot.getLeft() * currentScale, longScreenshot.getTop() * currentScale); longScreenshot.getLeft() * currentScale, longScreenshot.getTop() * currentScale); mScrollablePreview.setImageMatrix(matrix); float destinationScale = destination.width() / (float) mScrollablePreview.getWidth(); anim.addUpdateListener(animation -> { ValueAnimator previewAnim = ValueAnimator.ofFloat(0, 1); previewAnim.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() { 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(); mScrollablePreview.animate().alpha(0).setListener(new AnimatorListenerAdapter() { } }); } 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); mCallbacks.onDismiss(); onTransitionEnd.run(); } }); } animSet.addListener(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); if (mShowScrollablePreview) { Rect scrollableArea = scrollableAreaOnScreen(response); float scale = mCornerSizeX / (mOrientationPortrait ? screenBitmap.getWidth() : screenBitmap.getHeight()); ConstraintLayout.LayoutParams params = Loading @@ -833,9 +863,9 @@ public class ScreenshotView extends FrameLayout implements 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); Loading Loading @@ -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( Loading