OSDN Git Service

Disable existing ContentCapture sessions if service changes their whitelist status.
authorFelipe Leme <felipeal@google.com>
Mon, 6 May 2019 22:57:30 +0000 (15:57 -0700)
committerFelipe Leme <felipeal@google.com>
Mon, 6 May 2019 23:09:05 +0000 (16:09 -0700)
Test: atest CtsContentCaptureServiceTestCases:CustomViewActivityTest
Test: atest CtsContentCaptureServiceTestCases # sanity check

Fixes: 130802293

Change-Id: Ia94016382192912668c4ac1ce580a0b95c76f35c

services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
services/contentcapture/java/com/android/server/contentcapture/ContentCaptureServerSession.java

index 4399e42..67c3d01 100644 (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
index 2643db1..aa63e40 100644 (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: ");
     }