diff options
author | Felipe Leme <felipeal@google.com> | 2019-05-06 15:57:30 -0700 |
---|---|---|
committer | Felipe Leme <felipeal@google.com> | 2019-05-06 16:09:05 -0700 |
commit | 0a3bec5860624a1a9e9185a560a96304049ea70e (patch) | |
tree | 03262c32d1ec6e447f86e7ba58fc5f74b1947209 /services/contentcapture | |
parent | 56c006f5a6238bc73731cc8d77009c72e9602c27 (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')
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: "); } |