Merge "Disable existing ContentCapture sessions if service changes their whitelist status." into qt-dev

am: d97db54da4

Change-Id: I2e404b24e66d02afcc9ab64f15b67d391f914997
This commit is contained in:
Felipe Leme
2019-05-08 10:07:36 -07:00
committed by android-build-merger
2 changed files with 38 additions and 0 deletions

View File

@@ -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

View File

@@ -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: ");
}