From 712eb51dc9af1d4cdb987918607a5e4cebfe9f6b Mon Sep 17 00:00:00 2001 From: James O'Leary Date: Thu, 14 Nov 2019 12:27:40 -0500 Subject: [PATCH] [DO NOT MERGE] Convert TakeScreenshot finishers Runnables to Consumer Test: n/a Bug: b/131082115 Change-Id: Ia84d034d08ff4d004fc9852dc5156d46059e8b00 --- .../internal/util/ScreenshotHelper.java | 16 +++++++------ .../internal/util/ScreenshotHelperTest.java | 6 ++--- .../systemui/screenshot/GlobalScreenshot.java | 24 +++++++++---------- .../screenshot/TakeScreenshotService.java | 11 +++++---- 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/core/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java index cac691cf7d451..d24d78c6f3dab 100644 --- a/core/java/com/android/internal/util/ScreenshotHelper.java +++ b/core/java/com/android/internal/util/ScreenshotHelper.java @@ -6,6 +6,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.net.Uri; import android.os.Handler; import android.os.IBinder; import android.os.Message; @@ -58,7 +59,7 @@ public class ScreenshotHelper { */ public void takeScreenshot(final int screenshotType, final boolean hasStatus, final boolean hasNav, @NonNull Handler handler, - @Nullable Consumer completionConsumer) { + @Nullable Consumer completionConsumer) { takeScreenshot(screenshotType, hasStatus, hasNav, SCREENSHOT_TIMEOUT_MS, handler, completionConsumer); } @@ -83,12 +84,12 @@ public class ScreenshotHelper { * the screenshot attempt will be cancelled and `completionConsumer` * will be run. * @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. + * @param completionConsumer Consumes `null` if a screenshot was not taken, and the URI of the + * screenshot if the screenshot was taken. */ public void takeScreenshot(final int screenshotType, final boolean hasStatus, final boolean hasNav, long timeoutMs, @NonNull Handler handler, - @Nullable Consumer completionConsumer) { + @Nullable Consumer completionConsumer) { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { return; @@ -108,7 +109,7 @@ public class ScreenshotHelper { } } if (completionConsumer != null) { - completionConsumer.accept(false); + completionConsumer.accept(null); } } }; @@ -134,8 +135,9 @@ public class ScreenshotHelper { handler.removeCallbacks(mScreenshotTimeout); } } + if (completionConsumer != null) { - completionConsumer.accept(true); + completionConsumer.accept((Uri) msg.obj); } } }; @@ -148,7 +150,7 @@ public class ScreenshotHelper { } catch (RemoteException e) { Log.e(TAG, "Couldn't take screenshot: " + e); if (completionConsumer != null) { - completionConsumer.accept(false); + completionConsumer.accept(null); } } } 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 848364584ef3e..e16d1caa98eb0 100644 --- a/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java +++ b/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java @@ -19,7 +19,7 @@ package com.android.internal.util; import static android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN; import static android.view.WindowManager.TAKE_SCREENSHOT_SELECTED_REGION; -import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertNull; import static junit.framework.Assert.fail; import static org.mockito.ArgumentMatchers.any; @@ -80,8 +80,8 @@ public final class ScreenshotHelperTest { CountDownLatch lock = new CountDownLatch(1); mScreenshotHelper.takeScreenshot(TAKE_SCREENSHOT_FULLSCREEN, false, false, timeoutMs, mHandler, - worked -> { - assertFalse(worked); + uri -> { + assertNull(uri); lock.countDown(); }); diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 11ca94f6f4e62..7bb41034d8564 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -95,7 +95,7 @@ import java.util.Date; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; - +import java.util.function.Consumer; /** @@ -105,7 +105,7 @@ class SaveImageInBackgroundData { Context context; Bitmap image; Uri imageUri; - Runnable finisher; + Consumer finisher; int iconSize; int previewWidth; int previewheight; @@ -406,7 +406,7 @@ class SaveImageInBackgroundTask extends AsyncTask { mNotificationManager.notify(SystemMessage.NOTE_GLOBAL_SCREENSHOT, mNotificationBuilder.build()); } - mParams.finisher.run(); + mParams.finisher.accept(mParams.imageUri); mParams.clearContext(); } @@ -415,7 +415,7 @@ class SaveImageInBackgroundTask extends AsyncTask { // If we are cancelled while the task is running in the background, we may get null params. // The finisher is expected to always be called back, so just use the baked-in params from // the ctor in any case. - mParams.finisher.run(); + mParams.finisher.accept(null); mParams.clearImage(); mParams.clearContext(); @@ -566,7 +566,7 @@ class GlobalScreenshot { /** * Creates a new worker thread and saves the screenshot to the media store. */ - private void saveScreenshotInWorkerThread(Runnable finisher) { + private void saveScreenshotInWorkerThread(Consumer finisher) { SaveImageInBackgroundData data = new SaveImageInBackgroundData(); data.context = mContext; data.image = mScreenBitmap; @@ -584,8 +584,8 @@ class GlobalScreenshot { /** * Takes a screenshot of the current display and shows an animation. */ - private void takeScreenshot(Runnable finisher, boolean statusBarVisible, boolean navBarVisible, - Rect crop) { + private void takeScreenshot(Consumer finisher, boolean statusBarVisible, + boolean navBarVisible, Rect crop) { int rot = mDisplay.getRotation(); int width = crop.width(); int height = crop.height(); @@ -595,7 +595,7 @@ class GlobalScreenshot { if (mScreenBitmap == null) { notifyScreenshotError(mContext, mNotificationManager, R.string.screenshot_failed_to_capture_text); - finisher.run(); + finisher.accept(null); return; } @@ -608,7 +608,7 @@ class GlobalScreenshot { statusBarVisible, navBarVisible); } - void takeScreenshot(Runnable finisher, boolean statusBarVisible, boolean navBarVisible) { + void takeScreenshot(Consumer finisher, boolean statusBarVisible, boolean navBarVisible) { mDisplay.getRealMetrics(mDisplayMetrics); takeScreenshot(finisher, statusBarVisible, navBarVisible, new Rect(0, 0, mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels)); @@ -617,7 +617,7 @@ class GlobalScreenshot { /** * Displays a screenshot selector */ - void takeScreenshotPartial(final Runnable finisher, final boolean statusBarVisible, + void takeScreenshotPartial(final Consumer finisher, final boolean statusBarVisible, final boolean navBarVisible) { mWindowManager.addView(mScreenshotLayout, mWindowLayoutParams); mScreenshotSelectorView.setOnTouchListener(new View.OnTouchListener() { @@ -677,8 +677,8 @@ class GlobalScreenshot { /** * Starts the animation after taking the screenshot */ - private void startAnimation(final Runnable finisher, int w, int h, boolean statusBarVisible, - boolean navBarVisible) { + private void startAnimation(final Consumer finisher, int w, int h, + boolean statusBarVisible, boolean navBarVisible) { // 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); diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java index 34b8bfe59e7ee..330a6b541098c 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java @@ -18,6 +18,7 @@ package com.android.systemui.screenshot; import android.app.Service; import android.content.Intent; +import android.net.Uri; import android.os.Handler; import android.os.IBinder; import android.os.Message; @@ -27,6 +28,8 @@ import android.os.UserManager; import android.util.Log; import android.view.WindowManager; +import java.util.function.Consumer; + public class TakeScreenshotService extends Service { private static final String TAG = "TakeScreenshotService"; @@ -36,10 +39,10 @@ public class TakeScreenshotService extends Service { @Override public void handleMessage(Message msg) { final Messenger callback = msg.replyTo; - Runnable finisher = new Runnable() { + Consumer finisher = new Consumer() { @Override - public void run() { - Message reply = Message.obtain(null, 1); + public void accept(Uri uri) { + Message reply = Message.obtain(null, 1, uri); try { callback.send(reply); } catch (RemoteException e) { @@ -52,7 +55,7 @@ public class TakeScreenshotService extends Service { // animation and error notification. if (!getSystemService(UserManager.class).isUserUnlocked()) { Log.w(TAG, "Skipping screenshot because storage is locked!"); - post(finisher); + post(() -> finisher.accept(null)); return; }