summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiranda Kephart <mkephart@google.com>2020-11-16 11:22:13 -0500
committerAnis Assi <anisassi@google.com>2021-02-26 12:24:38 -0800
commitb73ef520e3f6a48f9a2db998da38886d95ea885a (patch)
treebc7d4a63799ed8d2e98d9f054c519af6a2762a03
parent60f9488e122b636dc630c0321de770a2e4497b35 (diff)
downloadbase-b73ef520e3f6a48f9a2db998da38886d95ea885a.tar.gz
[DO NOT MERGE] Close screenshot process on user switchedandroid-security-10.0.0_r53
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 (cherry picked from commit 7ef1a5dd1506075507412626f2533283d9520144) (cherry picked from commit 9908e1a14575b5543fef15032f9fe495382fce87)
-rw-r--r--core/java/com/android/internal/util/ScreenshotHelper.java47
1 files changed, 35 insertions, 12 deletions
diff --git a/core/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java
index 7fd94c6859fb..9ab89328a075 100644
--- a/core/java/com/android/internal/util/ScreenshotHelper.java
+++ b/core/java/com/android/internal/util/ScreenshotHelper.java
@@ -1,9 +1,13 @@
package com.android.internal.util;
+import static android.content.Intent.ACTION_USER_SWITCHED;
+
import android.annotation.NonNull;
+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.os.Handler;
import android.os.IBinder;
@@ -29,8 +33,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);
}
/**
@@ -53,14 +70,12 @@ public class ScreenshotHelper {
SYSUI_SCREENSHOT_SERVICE);
final Intent serviceIntent = new Intent();
- final Runnable mScreenshotTimeout = new Runnable() {
- @Override public void run() {
- synchronized (mScreenshotLock) {
- if (mScreenshotConnection != null) {
- mContext.unbindService(mScreenshotConnection);
- mScreenshotConnection = null;
- notifyScreenshotError();
- }
+ final Runnable mScreenshotTimeout = () -> {
+ synchronized (mScreenshotLock) {
+ if (mScreenshotConnection != null) {
+ Log.e(TAG, "Timed out before getting screenshot capture response");
+ resetConnection();
+ notifyScreenshotError();
}
}
};
@@ -81,8 +96,7 @@ public class ScreenshotHelper {
public void handleMessage(Message msg) {
synchronized (mScreenshotLock) {
if (mScreenshotConnection == myConn) {
- mContext.unbindService(mScreenshotConnection);
- mScreenshotConnection = null;
+ resetConnection();
handler.removeCallbacks(mScreenshotTimeout);
}
}
@@ -103,8 +117,7 @@ public class ScreenshotHelper {
public void onServiceDisconnected(ComponentName name) {
synchronized (mScreenshotLock) {
if (mScreenshotConnection != null) {
- mContext.unbindService(mScreenshotConnection);
- mScreenshotConnection = null;
+ resetConnection();
handler.removeCallbacks(mScreenshotTimeout);
notifyScreenshotError();
}
@@ -121,6 +134,16 @@ public class ScreenshotHelper {
}
/**
+ * Unbinds the current screenshot connection (if any).
+ */
+ private void resetConnection() {
+ if (mScreenshotConnection != null) {
+ mContext.unbindService(mScreenshotConnection);
+ mScreenshotConnection = null;
+ }
+ }
+
+ /**
* Notifies the screenshot service to show an error.
*/
private void notifyScreenshotError() {