From 7ef1a5dd1506075507412626f2533283d9520144 Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Mon, 16 Nov 2020 11:22:13 -0500 Subject: Close screenshot process on user switched Currently, we keep the process up even if the user switches, meaning that in some cases (if the user is switched while the screenshot UI is up) we will save images to the wrong profile. This change makes ScreenshotHelper listen for user switches and close the screenshot service, so that a new screenshot is guaranteed to be constructed with the correct user's context. Bug: 170474245 Fix: 170474245 Test: manual -- verified bad state occurs if user switches within the timeout period, ensured that screenshots work immediately after switching with this change. Change-Id: I9d32d0928e6c2bda161d04555438d0dd7afef0ba --- .../android/internal/util/ScreenshotHelper.java | 41 ++++++++++++++++------ .../systemui/screenshot/TakeScreenshotService.java | 4 +-- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/core/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java index 0bafb2f6ff57..4ad779551060 100644 --- a/core/java/com/android/internal/util/ScreenshotHelper.java +++ b/core/java/com/android/internal/util/ScreenshotHelper.java @@ -1,12 +1,15 @@ package com.android.internal.util; +import static android.content.Intent.ACTION_USER_SWITCHED; import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_OTHER; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.ServiceConnection; import android.graphics.Insets; import android.graphics.Rect; @@ -161,8 +164,21 @@ public class ScreenshotHelper { private ServiceConnection mScreenshotConnection = null; private final Context mContext; + private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + synchronized (mScreenshotLock) { + if (ACTION_USER_SWITCHED.equals(intent.getAction())) { + resetConnection(); + } + } + } + }; + public ScreenshotHelper(Context context) { mContext = context; + IntentFilter filter = new IntentFilter(ACTION_USER_SWITCHED); + mContext.registerReceiver(mBroadcastReceiver, filter); } /** @@ -280,9 +296,7 @@ public class ScreenshotHelper { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { Log.e(TAG, "Timed out before getting screenshot capture response"); - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; - mScreenshotService = null; + resetConnection(); notifyScreenshotError(); } } @@ -305,11 +319,7 @@ public class ScreenshotHelper { break; case SCREENSHOT_MSG_PROCESS_COMPLETE: synchronized (mScreenshotLock) { - if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; - mScreenshotService = null; - } + resetConnection(); } break; } @@ -349,9 +359,7 @@ public class ScreenshotHelper { public void onServiceDisconnected(ComponentName name) { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; - mScreenshotService = null; + resetConnection(); // only log an error if we're still within the timeout period if (handler.hasCallbacks(mScreenshotTimeout)) { Log.e(TAG, "Screenshot service disconnected"); @@ -384,6 +392,17 @@ public class ScreenshotHelper { } } + /** + * Unbinds the current screenshot connection (if any). + */ + private void resetConnection() { + if (mScreenshotConnection != null) { + mContext.unbindService(mScreenshotConnection); + mScreenshotConnection = null; + mScreenshotService = null; + } + } + /** * Notifies the screenshot service to show an error. */ diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java index 5f35e60ad142..672f82c2a583 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java @@ -125,9 +125,9 @@ public class TakeScreenshotService extends Service { }; @Inject - public TakeScreenshotService(ScreenshotController globalScreenshot, UserManager userManager, + public TakeScreenshotService(ScreenshotController screenshotController, UserManager userManager, UiEventLogger uiEventLogger) { - mScreenshot = globalScreenshot; + mScreenshot = screenshotController; mUserManager = userManager; mUiEventLogger = uiEventLogger; } -- cgit v1.2.3-59-g8ed1b