diff options
8 files changed, 259 insertions, 16 deletions
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index c8dea43e8f4c..55c298e2a92b 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -497,13 +497,48 @@ public interface WindowManager extends ViewManager { * Message for taking fullscreen screenshot * @hide */ - final int TAKE_SCREENSHOT_FULLSCREEN = 1; + int TAKE_SCREENSHOT_FULLSCREEN = 1; /** * Message for taking screenshot of selected region. * @hide */ - final int TAKE_SCREENSHOT_SELECTED_REGION = 2; + int TAKE_SCREENSHOT_SELECTED_REGION = 2; + + /** + * Message for handling a screenshot flow with an image provided by the caller. + * @hide + */ + int TAKE_SCREENSHOT_PROVIDED_IMAGE = 3; + + /** + * Parcel key for the screen shot bitmap sent with messages of type + * {@link #TAKE_SCREENSHOT_PROVIDED_IMAGE}, type {@link android.graphics.Bitmap} + * @hide + */ + String PARCEL_KEY_SCREENSHOT_BITMAP = "screenshot_screen_bitmap"; + + /** + * Parcel key for the screen bounds of the image sent with messages of type + * [@link {@link #TAKE_SCREENSHOT_PROVIDED_IMAGE}], type {@link Rect} in screen coordinates. + * @hide + */ + String PARCEL_KEY_SCREENSHOT_BOUNDS = "screenshot_screen_bounds"; + + /** + * Parcel key for the task id of the task that the screen shot was taken of, sent with messages + * of type [@link {@link #TAKE_SCREENSHOT_PROVIDED_IMAGE}], type int. + * @hide + */ + String PARCEL_KEY_SCREENSHOT_TASK_ID = "screenshot_task_id"; + + /** + * Parcel key for the visible insets of the image sent with messages of type + * [@link {@link #TAKE_SCREENSHOT_PROVIDED_IMAGE}], type {@link android.graphics.Insets} in + * screen coordinates. + * @hide + */ + String PARCEL_KEY_SCREENSHOT_INSETS = "screenshot_insets"; /** * @hide diff --git a/core/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java index 8cad5a0d1d09..7cff90bbf437 100644 --- a/core/java/com/android/internal/util/ScreenshotHelper.java +++ b/core/java/com/android/internal/util/ScreenshotHelper.java @@ -6,7 +6,11 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.graphics.Bitmap; +import android.graphics.Insets; +import android.graphics.Rect; import android.net.Uri; +import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; @@ -14,6 +18,7 @@ import android.os.Messenger; import android.os.RemoteException; import android.os.UserHandle; import android.util.Log; +import android.view.WindowManager; import java.util.function.Consumer; @@ -38,9 +43,9 @@ public class ScreenshotHelper { * is recommended for general use. * * @param screenshotType The type of screenshot, for example either - * {@link android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN} + * {@link android.view.WindowManager#TAKE_SCREENSHOT_FULLSCREEN} * or - * {@link android.view.WindowManager.TAKE_SCREENSHOT_SELECTED_REGION} + * {@link android.view.WindowManager#TAKE_SCREENSHOT_SELECTED_REGION} * @param hasStatus {@code true} if the status bar is currently showing. {@code false} * if * not. @@ -65,9 +70,9 @@ public class ScreenshotHelper { * is recommended for general use. * * @param screenshotType The type of screenshot, for example either - * {@link android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN} + * {@link android.view.WindowManager#TAKE_SCREENSHOT_FULLSCREEN} * or - * {@link android.view.WindowManager.TAKE_SCREENSHOT_SELECTED_REGION} + * {@link android.view.WindowManager#TAKE_SCREENSHOT_SELECTED_REGION} * @param hasStatus {@code true} if the status bar is currently showing. {@code false} * if * not. @@ -84,6 +89,40 @@ public class ScreenshotHelper { public void takeScreenshot(final int screenshotType, final boolean hasStatus, final boolean hasNav, long timeoutMs, @NonNull Handler handler, @Nullable Consumer<Uri> completionConsumer) { + takeScreenshot(screenshotType, hasStatus, hasNav, timeoutMs, handler, null, + completionConsumer + ); + } + + /** + * Request that provided image be handled as if it was a screenshot. + * + * @param screenshot The bitmap to treat as the screen shot. + * @param boundsInScreen The bounds in screen coordinates that the bitmap orginated from. + * @param insets The insets that the image was shown with, inside the screenbounds. + * @param taskId The taskId of the task that the screen shot was taken of. + * @param handler A handler used in case the screenshot times out + * @param completionConsumer Consumes `false` if a screenshot was not taken, and `true` if the + * screenshot was taken. + */ + public void provideScreenshot(@NonNull Bitmap screenshot, @NonNull Rect boundsInScreen, + @NonNull Insets insets, int taskId, @NonNull Handler handler, + @Nullable Consumer<Uri> completionConsumer) { + Bundle imageBundle = new Bundle(); + imageBundle.putParcelable(WindowManager.PARCEL_KEY_SCREENSHOT_BITMAP, screenshot); + imageBundle.putParcelable(WindowManager.PARCEL_KEY_SCREENSHOT_BOUNDS, boundsInScreen); + imageBundle.putParcelable(WindowManager.PARCEL_KEY_SCREENSHOT_INSETS, insets); + imageBundle.putInt(WindowManager.PARCEL_KEY_SCREENSHOT_TASK_ID, taskId); + + takeScreenshot( + WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE, + false, false, // ignored when image bundle is set + SCREENSHOT_TIMEOUT_MS, handler, imageBundle, completionConsumer); + } + + private void takeScreenshot(final int screenshotType, final boolean hasStatus, + final boolean hasNav, long timeoutMs, @NonNull Handler handler, + @Nullable Bundle providedImage, @Nullable Consumer<Uri> completionConsumer) { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { return; @@ -139,6 +178,10 @@ public class ScreenshotHelper { msg.arg1 = hasStatus ? 1 : 0; msg.arg2 = hasNav ? 1 : 0; + if (screenshotType == WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE) { + msg.setData(providedImage); + } + try { messenger.send(msg); } catch (RemoteException e) { diff --git a/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java b/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java index 1472b9034249..cd6b3af5fa6d 100644 --- a/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java +++ b/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java @@ -31,6 +31,9 @@ import static org.mockito.Mockito.mock; import android.content.Context; import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Insets; +import android.graphics.Rect; import android.os.Handler; import android.os.Looper; @@ -85,6 +88,13 @@ public final class ScreenshotHelperTest { } @Test + public void testProvidedImageScreenshot() { + mScreenshotHelper.provideScreenshot( + Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888), new Rect(), + Insets.of(0, 0, 0, 0), 1, mHandler, null); + } + + @Test public void testScreenshotTimesOut() { long timeoutMs = 10; diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl index 1cabee1ae679..2d288ff40b2c 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl @@ -16,12 +16,15 @@ package com.android.systemui.shared.recents; +import android.graphics.Bitmap; +import android.graphics.Insets; import android.graphics.Rect; import android.os.Bundle; import android.view.MotionEvent; /** * Temporary callbacks into SystemUI. + * Next id = 22 */ interface ISystemUiProxy { @@ -114,4 +117,10 @@ interface ISystemUiProxy { * Sets the shelf height and visibility. */ void setShelfHeight(boolean visible, int shelfHeight) = 20; + + /** + * Handle the provided image as if it was a screenshot. + */ + void handleImageAsScreenshot(in Bitmap screenImage, in Rect locationInScreen, + in Insets visibleInsets, int taskId) = 21; } diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 569f660d1797..79a33c926993 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -38,6 +38,8 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; +import android.graphics.Bitmap; +import android.graphics.Insets; import android.graphics.Rect; import android.graphics.Region; import android.hardware.input.InputManager; @@ -55,6 +57,7 @@ import android.view.MotionEvent; import android.view.accessibility.AccessibilityManager; import com.android.internal.policy.ScreenDecorationsUtils; +import com.android.internal.util.ScreenshotHelper; import com.android.systemui.Dumpable; import com.android.systemui.model.SysUiState; import com.android.systemui.pip.PipUI; @@ -115,6 +118,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis private final DeviceProvisionedController mDeviceProvisionedController; private final List<OverviewProxyListener> mConnectionCallbacks = new ArrayList<>(); private final Intent mQuickStepIntent; + private final ScreenshotHelper mScreenshotHelper; private Region mActiveNavBarRegion; @@ -365,6 +369,13 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis } } + @Override + public void handleImageAsScreenshot(Bitmap screenImage, Rect locationInScreen, + Insets visibleInsets, int taskId) { + mScreenshotHelper.provideScreenshot(screenImage, locationInScreen, visibleInsets, + taskId, mHandler, null); + } + private boolean verifyCaller(String reason) { final int callerId = Binder.getCallingUserHandle().getIdentifier(); if (callerId != mCurrentBoundedUserId) { @@ -518,6 +529,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis // Listen for status bar state changes statusBarWinController.registerCallback(mStatusBarWindowCallback); + mScreenshotHelper = new ScreenshotHelper(context); } public void notifyBackAction(boolean completed, int downX, int downY, boolean isButton, diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 99a9dfeae1d6..880b8f8776e8 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -29,6 +29,7 @@ import android.animation.AnimatorSet; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.annotation.Nullable; +import android.annotation.SuppressLint; import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.Notification; @@ -38,6 +39,7 @@ import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.Bitmap; +import android.graphics.Insets; import android.graphics.Outline; import android.graphics.PixelFormat; import android.graphics.PointF; @@ -300,8 +302,11 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset int width = crop.width(); int height = crop.height(); - // Take the screenshot - mScreenBitmap = SurfaceControl.screenshot(crop, width, height, rot); + takeScreenshot(SurfaceControl.screenshot(crop, width, height, rot), finisher, null); + } + + private void takeScreenshot(Bitmap screenshot, Consumer<Uri> finisher, Rect screenRect) { + mScreenBitmap = screenshot; if (mScreenBitmap == null) { mNotificationsController.notifyScreenshotError( R.string.screenshot_failed_to_capture_text); @@ -317,7 +322,8 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset mScreenshotLayout.getViewTreeObserver().addOnComputeInternalInsetsListener(this); // Start the post-screenshot animation - startAnimation(finisher, mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels); + startAnimation(finisher, mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels, + screenRect); } void takeScreenshot(Consumer<Uri> finisher) { @@ -327,9 +333,16 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset new Rect(0, 0, mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels)); } + void handleImageAsScreenshot(Bitmap screenshot, Rect screenshotScreenBounds, + Insets visibleInsets, int taskId, Consumer<Uri> finisher) { + // TODO use taskId and visibleInsets + takeScreenshot(screenshot, finisher, screenshotScreenBounds); + } + /** * Displays a screenshot selector */ + @SuppressLint("ClickableViewAccessibility") void takeScreenshotPartial(final Consumer<Uri> finisher) { mWindowManager.addView(mScreenshotLayout, mWindowLayoutParams); mScreenshotSelectorView.setOnTouchListener(new View.OnTouchListener() { @@ -402,7 +415,8 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset /** * Starts the animation after taking the screenshot */ - private void startAnimation(final Consumer<Uri> finisher, int w, int h) { + private void startAnimation(final Consumer<Uri> finisher, int w, int h, + @Nullable Rect screenRect) { // If power save is on, show a toast so there is some visual indication that a screenshot // has been taken. PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); @@ -422,7 +436,8 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset mScreenshotAnimation.removeAllListeners(); } - ValueAnimator screenshotDropInAnim = createScreenshotDropInAnimation(); + ValueAnimator screenshotDropInAnim = screenRect != null ? createRectAnimation(screenRect) + : createScreenshotDropInAnimation(); ValueAnimator screenshotFadeOutAnim = createScreenshotToCornerAnimation(w, h); mScreenshotAnimation = new AnimatorSet(); mScreenshotAnimation.playSequentially(screenshotDropInAnim, screenshotFadeOutAnim); @@ -460,6 +475,46 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset }); } + private ValueAnimator createRectAnimation(Rect rect) { + mScreenshotView.setAdjustViewBounds(true); + mScreenshotView.setMaxHeight(rect.height()); + mScreenshotView.setMaxWidth(rect.width()); + + final float flashPeakDurationPct = ((float) (SCREENSHOT_FLASH_TO_PEAK_DURATION) + / SCREENSHOT_DROP_IN_DURATION); + final float flashDurationPct = 2f * flashPeakDurationPct; + final Interpolator scaleInterpolator = x -> { + // We start scaling when the flash is at it's peak + if (x < flashPeakDurationPct) { + return 0; + } + return (x - flashDurationPct) / (1f - flashDurationPct); + }; + + ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); + anim.setDuration(SCREENSHOT_DROP_IN_DURATION); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + mBackgroundView.setAlpha(0f); + mBackgroundView.setVisibility(View.VISIBLE); + mScreenshotView.setAlpha(0f); + mScreenshotView.setElevation(0f); + mScreenshotView.setTranslationX(0f); + mScreenshotView.setTranslationY(0f); + mScreenshotView.setScaleX(1f); + mScreenshotView.setScaleY(1f); + mScreenshotView.setVisibility(View.VISIBLE); + } + }); + anim.addUpdateListener(animation -> { + float t = (Float) animation.getAnimatedValue(); + mBackgroundView.setAlpha(scaleInterpolator.getInterpolation(t) * BACKGROUND_ALPHA); + mScreenshotView.setAlpha(t); + }); + return anim; + } + private ValueAnimator createScreenshotDropInAnimation() { final float flashPeakDurationPct = ((float) (SCREENSHOT_FLASH_TO_PEAK_DURATION) / SCREENSHOT_DROP_IN_DURATION); diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshotLegacy.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshotLegacy.java index a5baa7a49bd0..f3614ffbdb1b 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshotLegacy.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshotLegacy.java @@ -30,6 +30,7 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Color; +import android.graphics.Insets; import android.graphics.PixelFormat; import android.graphics.PointF; import android.graphics.Rect; @@ -205,8 +206,13 @@ public class GlobalScreenshotLegacy { int width = crop.width(); int height = crop.height(); - // Take the screenshot - mScreenBitmap = SurfaceControl.screenshot(crop, width, height, rot); + takeScreenshot(SurfaceControl.screenshot(crop, width, height, rot), finisher, + statusBarVisible, navBarVisible, null); + } + + private void takeScreenshot(Bitmap screenshot, Consumer<Uri> finisher, boolean statusBarVisible, + boolean navBarVisible, Rect screenboundsOfBitmap) { + mScreenBitmap = screenshot; if (mScreenBitmap == null) { mNotificationsController.notifyScreenshotError( R.string.screenshot_failed_to_capture_text); @@ -220,7 +226,7 @@ public class GlobalScreenshotLegacy { // Start the post-screenshot animation startAnimation(finisher, mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels, - statusBarVisible, navBarVisible); + statusBarVisible, navBarVisible, screenboundsOfBitmap); } void takeScreenshot(Consumer<Uri> finisher, boolean statusBarVisible, boolean navBarVisible) { @@ -229,6 +235,12 @@ public class GlobalScreenshotLegacy { new Rect(0, 0, mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels)); } + void handleImageAsScreenshot(Bitmap screenshot, Rect screenshotScreenBounds, + Insets visibleInsets, int taskId, Consumer<Uri> finisher) { + // TODO use taskId and visibleInsets + takeScreenshot(screenshot, finisher, false, false, screenshotScreenBounds); + } + /** * Displays a screenshot selector */ @@ -302,7 +314,7 @@ public class GlobalScreenshotLegacy { * Starts the animation after taking the screenshot */ private void startAnimation(final Consumer<Uri> finisher, int w, int h, - boolean statusBarVisible, boolean navBarVisible) { + boolean statusBarVisible, boolean navBarVisible, @Nullable Rect screenBoundsOfBitmap) { // If power save is on, show a toast so there is some visual indication that a screenshot // has been taken. PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); @@ -323,7 +335,8 @@ public class GlobalScreenshotLegacy { } mWindowManager.addView(mScreenshotLayout, mWindowLayoutParams); - ValueAnimator screenshotDropInAnim = createScreenshotDropInAnimation(); + ValueAnimator screenshotDropInAnim = screenBoundsOfBitmap != null + ? createRectAnimation(screenBoundsOfBitmap) : createScreenshotDropInAnimation(); ValueAnimator screenshotFadeOutAnim = createScreenshotDropOutAnimation(w, h, statusBarVisible, navBarVisible); mScreenshotAnimation = new AnimatorSet(); @@ -430,6 +443,53 @@ public class GlobalScreenshotLegacy { return anim; } + /** + * If a bitmap was supplied to be used as the screenshot, animated from where that bitmap was + * on screen, rather than using the whole screen. + */ + private ValueAnimator createRectAnimation(Rect rect) { + mScreenshotView.setAdjustViewBounds(true); + mScreenshotView.setMaxHeight(rect.height()); + mScreenshotView.setMaxWidth(rect.width()); + + final float flashPeakDurationPct = ((float) (SCREENSHOT_FLASH_TO_PEAK_DURATION) + / SCREENSHOT_DROP_IN_DURATION); + final float flashDurationPct = 2f * flashPeakDurationPct; + final Interpolator scaleInterpolator = x -> { + // We start scaling when the flash is at it's peak + if (x < flashPeakDurationPct) { + return 0; + } + return (x - flashDurationPct) / (1f - flashDurationPct); + }; + + ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); + anim.setDuration(SCREENSHOT_DROP_IN_DURATION); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + mBackgroundView.setAlpha(0f); + mBackgroundView.setVisibility(View.VISIBLE); + mScreenshotView.setAlpha(0f); + mScreenshotView.setElevation(0f); + mScreenshotView.setTranslationX(0f); + mScreenshotView.setTranslationY(0f); + mScreenshotView.setScaleX(SCREENSHOT_SCALE + mBgPaddingScale); + mScreenshotView.setScaleY(SCREENSHOT_SCALE + mBgPaddingScale); + mScreenshotView.setVisibility(View.VISIBLE); + } + }); + anim.addUpdateListener(animation -> { + float t = (Float) animation.getAnimatedValue(); + float scaleT = (SCREENSHOT_SCALE + mBgPaddingScale) + - scaleInterpolator.getInterpolation(t) + * (SCREENSHOT_SCALE - SCREENSHOT_DROP_IN_MIN_SCALE); + mBackgroundView.setAlpha(scaleInterpolator.getInterpolation(t) * BACKGROUND_ALPHA); + mScreenshotView.setAlpha(t); + }); + return anim; + } + private ValueAnimator createScreenshotDropOutAnimation(int w, int h, boolean statusBarVisible, boolean navBarVisible) { ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java index 9570b5a3b57c..4ac59df07eb9 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java @@ -22,6 +22,9 @@ import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREEN import android.app.Service; import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.Insets; +import android.graphics.Rect; import android.net.Uri; import android.os.Handler; import android.os.IBinder; @@ -85,6 +88,22 @@ public class TakeScreenshotService extends Service { finisher, msg.arg1 > 0, msg.arg2 > 0); } break; + case WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE: + Bitmap screenshot = msg.getData().getParcelable( + WindowManager.PARCEL_KEY_SCREENSHOT_BITMAP); + Rect screenBounds = msg.getData().getParcelable( + WindowManager.PARCEL_KEY_SCREENSHOT_BOUNDS); + Insets insets = msg.getData().getParcelable( + WindowManager.PARCEL_KEY_SCREENSHOT_INSETS); + int taskId = msg.getData().getInt(WindowManager.PARCEL_KEY_SCREENSHOT_TASK_ID); + if (useCornerFlow) { + mScreenshot.handleImageAsScreenshot( + screenshot, screenBounds, insets, taskId, finisher); + } else { + mScreenshotLegacy.handleImageAsScreenshot( + screenshot, screenBounds, insets, taskId, finisher); + } + break; default: Log.d(TAG, "Invalid screenshot option: " + msg.what); } |