diff options
author | Felipe Leme <felipeal@google.com> | 2019-05-08 10:22:42 -0700 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2019-05-08 10:22:42 -0700 |
commit | 6916eda7c2c3df488edd042c305d89355fa28b09 (patch) | |
tree | a9e69d9b8c70c0dbf5dcc39249434f25ccde272f | |
parent | b8a473d4620e3a97931b563431bbb029fd76bf65 (diff) | |
parent | a182f9c95fe01163d56a9b0dccaa345c209bad2f (diff) |
Merge "Disable existing ContentCapture sessions if service changes their whitelist status." into qt-dev am: d97db54da4
am: a182f9c95f
Change-Id: I6463bd892ce0f0e67449988e40e0b2ac40598bea
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 5ff0ee95cd0c..d0119e59939c 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.UserDataRemovalRequest; @@ -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: "); } |