summaryrefslogtreecommitdiff
path: root/services/contentcapture
diff options
context:
space:
mode:
authorFelipe Leme <felipeal@google.com>2019-05-06 15:57:30 -0700
committerFelipe Leme <felipeal@google.com>2019-05-06 16:09:05 -0700
commit0a3bec5860624a1a9e9185a560a96304049ea70e (patch)
tree03262c32d1ec6e447f86e7ba58fc5f74b1947209 /services/contentcapture
parent56c006f5a6238bc73731cc8d77009c72e9602c27 (diff)
Disable existing ContentCapture sessions if service changes their whitelist status.
Test: atest CtsContentCaptureServiceTestCases:CustomViewActivityTest Test: atest CtsContentCaptureServiceTestCases # sanity check Fixes: 130802293 Change-Id: Ia94016382192912668c4ac1ce580a0b95c76f35c
Diffstat (limited to 'services/contentcapture')
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java34
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java4
2 files changed, 38 insertions, 0 deletions
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
index 4399e4267fda..67c3d01cb86b 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
@@ -54,6 +54,7 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.SparseBooleanArray;
import android.view.contentcapture.ContentCaptureCondition;
import android.view.contentcapture.DataRemovalRequest;
@@ -552,6 +553,39 @@ final class ContentCapturePerUserService
+ " for user " + mUserId);
}
mMaster.mGlobalContentCaptureOptions.setWhitelist(mUserId, packages, activities);
+
+ // Must disable session that are not the whitelist anymore...
+ final int numSessions = mSessions.size();
+ if (numSessions <= 0) return;
+
+ // ...but without holding the lock on mGlobalContentCaptureOptions
+ final SparseBooleanArray blacklistedSessions = new SparseBooleanArray(numSessions);
+
+ for (int i = 0; i < numSessions; i++) {
+ final ContentCaptureServerSession session = mSessions.valueAt(i);
+ final boolean whitelisted = mMaster.mGlobalContentCaptureOptions
+ .isWhitelisted(mUserId, session.appComponentName);
+ if (!whitelisted) {
+ final int sessionId = mSessions.keyAt(i);
+ if (mMaster.debug) {
+ Slog.d(TAG, "marking session " + sessionId + " (" + session.appComponentName
+ + ") for un-whitelisting");
+ }
+ blacklistedSessions.append(sessionId, true);
+ }
+ }
+ final int numBlacklisted = blacklistedSessions.size();
+
+ if (numBlacklisted <= 0) return;
+
+ synchronized (mLock) {
+ for (int i = 0; i < numBlacklisted; i++) {
+ final int sessionId = blacklistedSessions.keyAt(i);
+ if (mMaster.debug) Slog.d(TAG, "un-whitelisting " + sessionId);
+ final ContentCaptureServerSession session = mSessions.get(sessionId);
+ session.setContentCaptureEnabledLocked(false);
+ }
+ }
}
@Override
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java
index 2643db1d5851..aa63e40747ee 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java
@@ -72,6 +72,8 @@ final class ContentCaptureServerSession {
private final Object mLock;
+ public final ComponentName appComponentName;
+
ContentCaptureServerSession(@NonNull Object lock, @NonNull IBinder activityToken,
@NonNull ContentCapturePerUserService service, @NonNull ComponentName appComponentName,
@NonNull IResultReceiver sessionStateReceiver, int taskId, int displayId, int sessionId,
@@ -79,6 +81,7 @@ final class ContentCaptureServerSession {
Preconditions.checkArgument(sessionId != NO_SESSION_ID);
mLock = lock;
mActivityToken = activityToken;
+ this.appComponentName = appComponentName;
mService = service;
mId = sessionId;
mUid = uid;
@@ -228,6 +231,7 @@ final class ContentCaptureServerSession {
pw.print(prefix); pw.print("uid: "); pw.print(mUid); pw.println();
pw.print(prefix); pw.print("context: "); mContentCaptureContext.dump(pw); pw.println();
pw.print(prefix); pw.print("activity token: "); pw.println(mActivityToken);
+ pw.print(prefix); pw.print("app component: "); pw.println(appComponentName);
pw.print(prefix); pw.print("has autofill callback: ");
}