summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/content/ContentCaptureOptions.java117
-rw-r--r--core/java/android/view/contentcapture/ContentCaptureManager.java38
-rw-r--r--core/tests/coretests/src/android/content/ContentCaptureOptionsTest.java32
-rw-r--r--core/tests/coretests/src/android/view/contentcapture/ContentCaptureManagerTest.java20
-rw-r--r--core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java13
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java84
-rw-r--r--services/tests/servicestests/src/com/android/server/contentcapture/ContentCaptureManagerServiceTest.java18
7 files changed, 302 insertions, 20 deletions
diff --git a/core/java/android/content/ContentCaptureOptions.java b/core/java/android/content/ContentCaptureOptions.java
index 36e0529e3566..3fbcd704308b 100644
--- a/core/java/android/content/ContentCaptureOptions.java
+++ b/core/java/android/content/ContentCaptureOptions.java
@@ -30,6 +30,11 @@ import android.view.contentcapture.ContentCaptureManager.ContentCaptureClient;
import com.android.internal.annotations.VisibleForTesting;
import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
/**
* Content capture options for a given package.
@@ -119,7 +124,10 @@ public final class ContentCaptureOptions implements Parcelable {
/* enableReceiver= */ false,
new ContentProtectionOptions(
/* enableReceiver= */ false,
- /* bufferSize= */ 0),
+ /* bufferSize= */ 0,
+ /* requiredGroups= */ Collections.emptyList(),
+ /* optionalGroups= */ Collections.emptyList(),
+ /* optionalGroupsThreshold= */ 0),
/* whitelistedComponents= */ null);
}
@@ -141,9 +149,7 @@ public final class ContentCaptureOptions implements Parcelable {
logHistorySize,
ContentCaptureManager.DEFAULT_DISABLE_FLUSH_FOR_VIEW_TREE_APPEARING,
ContentCaptureManager.DEFAULT_ENABLE_CONTENT_CAPTURE_RECEIVER,
- new ContentProtectionOptions(
- ContentCaptureManager.DEFAULT_ENABLE_CONTENT_PROTECTION_RECEIVER,
- ContentCaptureManager.DEFAULT_CONTENT_PROTECTION_BUFFER_SIZE),
+ new ContentProtectionOptions(),
whitelistedComponents);
}
@@ -183,9 +189,7 @@ public final class ContentCaptureOptions implements Parcelable {
ContentCaptureManager.DEFAULT_LOG_HISTORY_SIZE,
ContentCaptureManager.DEFAULT_DISABLE_FLUSH_FOR_VIEW_TREE_APPEARING,
ContentCaptureManager.DEFAULT_ENABLE_CONTENT_CAPTURE_RECEIVER,
- new ContentProtectionOptions(
- ContentCaptureManager.DEFAULT_ENABLE_CONTENT_PROTECTION_RECEIVER,
- ContentCaptureManager.DEFAULT_CONTENT_PROTECTION_BUFFER_SIZE),
+ new ContentProtectionOptions(),
whitelistedComponents);
}
@@ -386,9 +390,58 @@ public final class ContentCaptureOptions implements Parcelable {
*/
public final int bufferSize;
- public ContentProtectionOptions(boolean enableReceiver, int bufferSize) {
+ /**
+ * The list of required groups of strings to match.
+ *
+ * @hide
+ */
+ @NonNull public final List<List<String>> requiredGroups;
+
+ /**
+ * The list of optional groups of strings to match.
+ *
+ * @hide
+ */
+ @NonNull public final List<List<String>> optionalGroups;
+
+ /**
+ * The minimal number of optional groups that have to be matched. This is the threshold
+ * value and comparison is done with greater than or equals.
+ *
+ * @hide
+ */
+ public final int optionalGroupsThreshold;
+
+ /**
+ * Empty constructor with default values.
+ *
+ * @hide
+ */
+ public ContentProtectionOptions() {
+ this(
+ ContentCaptureManager.DEFAULT_ENABLE_CONTENT_PROTECTION_RECEIVER,
+ ContentCaptureManager.DEFAULT_CONTENT_PROTECTION_BUFFER_SIZE,
+ ContentCaptureManager.DEFAULT_CONTENT_PROTECTION_REQUIRED_GROUPS,
+ ContentCaptureManager.DEFAULT_CONTENT_PROTECTION_OPTIONAL_GROUPS,
+ ContentCaptureManager.DEFAULT_CONTENT_PROTECTION_OPTIONAL_GROUPS_THRESHOLD);
+ }
+
+ /**
+ * Full primary constructor.
+ *
+ * @hide
+ */
+ public ContentProtectionOptions(
+ boolean enableReceiver,
+ int bufferSize,
+ @NonNull List<List<String>> requiredGroups,
+ @NonNull List<List<String>> optionalGroups,
+ int optionalGroupsThreshold) {
this.enableReceiver = enableReceiver;
this.bufferSize = bufferSize;
+ this.requiredGroups = requiredGroups;
+ this.optionalGroups = optionalGroups;
+ this.optionalGroupsThreshold = optionalGroupsThreshold;
}
@Override
@@ -398,7 +451,14 @@ public final class ContentCaptureOptions implements Parcelable {
.append("enableReceiver=")
.append(enableReceiver)
.append(", bufferSize=")
- .append(bufferSize);
+ .append(bufferSize)
+ .append(", requiredGroupsSize=")
+ .append(requiredGroups.size())
+ .append(", optionalGroupsSize=")
+ .append(optionalGroups.size())
+ .append(", optionalGroupsThreshold=")
+ .append(optionalGroupsThreshold);
+
return stringBuilder.append(']').toString();
}
@@ -407,17 +467,50 @@ public final class ContentCaptureOptions implements Parcelable {
pw.print(enableReceiver);
pw.print(", bufferSize=");
pw.print(bufferSize);
+ pw.print(", requiredGroupsSize=");
+ pw.print(requiredGroups.size());
+ pw.print(", optionalGroupsSize=");
+ pw.print(optionalGroups.size());
+ pw.print(", optionalGroupsThreshold=");
+ pw.print(optionalGroupsThreshold);
}
- private void writeToParcel(Parcel parcel) {
+ private void writeToParcel(@NonNull Parcel parcel) {
parcel.writeBoolean(enableReceiver);
parcel.writeInt(bufferSize);
+ writeGroupsToParcel(requiredGroups, parcel);
+ writeGroupsToParcel(optionalGroups, parcel);
+ parcel.writeInt(optionalGroupsThreshold);
}
- private static ContentProtectionOptions createFromParcel(Parcel parcel) {
+ @NonNull
+ private static ContentProtectionOptions createFromParcel(@NonNull Parcel parcel) {
boolean enableReceiver = parcel.readBoolean();
int bufferSize = parcel.readInt();
- return new ContentProtectionOptions(enableReceiver, bufferSize);
+ List<List<String>> requiredGroups = createGroupsFromParcel(parcel);
+ List<List<String>> optionalGroups = createGroupsFromParcel(parcel);
+ int optionalGroupsThreshold = parcel.readInt();
+ return new ContentProtectionOptions(
+ enableReceiver,
+ bufferSize,
+ requiredGroups,
+ optionalGroups,
+ optionalGroupsThreshold);
+ }
+
+ private static void writeGroupsToParcel(
+ @NonNull List<List<String>> groups, @NonNull Parcel parcel) {
+ parcel.writeInt(groups.size());
+ groups.forEach(parcel::writeStringList);
+ }
+
+ @NonNull
+ private static List<List<String>> createGroupsFromParcel(@NonNull Parcel parcel) {
+ int size = parcel.readInt();
+ return IntStream.range(0, size)
+ .mapToObj(i -> new ArrayList<String>())
+ .peek(parcel::readStringList)
+ .collect(Collectors.toUnmodifiableList());
}
}
}
diff --git a/core/java/android/view/contentcapture/ContentCaptureManager.java b/core/java/android/view/contentcapture/ContentCaptureManager.java
index 2c7d326587c7..42b3e38b544f 100644
--- a/core/java/android/view/contentcapture/ContentCaptureManager.java
+++ b/core/java/android/view/contentcapture/ContentCaptureManager.java
@@ -60,7 +60,9 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
@@ -377,6 +379,30 @@ public final class ContentCaptureManager {
public static final String DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_BUFFER_SIZE =
"content_protection_buffer_size";
+ /**
+ * Sets the config for content protection required groups.
+ *
+ * @hide
+ */
+ public static final String DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_REQUIRED_GROUPS_CONFIG =
+ "content_protection_required_groups_config";
+
+ /**
+ * Sets the config for content protection optional groups.
+ *
+ * @hide
+ */
+ public static final String DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_OPTIONAL_GROUPS_CONFIG =
+ "content_protection_optional_groups_config";
+
+ /**
+ * Sets the threshold for content protection optional groups.
+ *
+ * @hide
+ */
+ public static final String DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_OPTIONAL_GROUPS_THRESHOLD =
+ "content_protection_optional_groups_threshold";
+
/** @hide */
@TestApi
public static final int LOGGING_LEVEL_OFF = 0;
@@ -417,6 +443,18 @@ public final class ContentCaptureManager {
public static final int DEFAULT_CONTENT_PROTECTION_APPS_BLOCKLIST_SIZE = 5000;
/** @hide */
public static final int DEFAULT_CONTENT_PROTECTION_BUFFER_SIZE = 150;
+ /** @hide */
+ public static final List<List<String>> DEFAULT_CONTENT_PROTECTION_REQUIRED_GROUPS =
+ Collections.emptyList();
+ /** @hide */
+ public static final String DEFAULT_CONTENT_PROTECTION_REQUIRED_GROUPS_CONFIG = "";
+ /** @hide */
+ public static final List<List<String>> DEFAULT_CONTENT_PROTECTION_OPTIONAL_GROUPS =
+ Collections.emptyList();
+ /** @hide */
+ public static final String DEFAULT_CONTENT_PROTECTION_OPTIONAL_GROUPS_CONFIG = "";
+ /** @hide */
+ public static final int DEFAULT_CONTENT_PROTECTION_OPTIONAL_GROUPS_THRESHOLD = 0;
private final Object mLock = new Object();
diff --git a/core/tests/coretests/src/android/content/ContentCaptureOptionsTest.java b/core/tests/coretests/src/android/content/ContentCaptureOptionsTest.java
index f8348d28b7fe..eefa6e482adf 100644
--- a/core/tests/coretests/src/android/content/ContentCaptureOptionsTest.java
+++ b/core/tests/coretests/src/android/content/ContentCaptureOptionsTest.java
@@ -32,6 +32,8 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
+import java.util.List;
+
/**
* Unit test for {@link ContentCaptureOptions}.
*
@@ -44,6 +46,9 @@ public class ContentCaptureOptionsTest {
private static final ComponentName CONTEXT_COMPONENT = new ComponentName("marco", "polo");
private static final ComponentName COMPONENT1 = new ComponentName("comp", "one");
private static final ComponentName COMPONENT2 = new ComponentName("two", "comp");
+ private static final List<List<String>> CONTENT_PROTECTION_REQUIRED_GROUPS =
+ List.of(List.of("first"), List.of("second", "third"), List.of());
+ private static final List<List<String>> CONTENT_PROTECTION_OPTIONAL_GROUPS = List.of();
private static final ContentCaptureOptions CONTENT_CAPTURE_OPTIONS =
new ContentCaptureOptions(
/* loggingLevel= */ 1000,
@@ -55,7 +60,10 @@ public class ContentCaptureOptionsTest {
/* enableReceiver= */ false,
new ContentCaptureOptions.ContentProtectionOptions(
/* enableReceiver= */ true,
- /* bufferSize= */ 2001),
+ /* bufferSize= */ 2001,
+ CONTENT_PROTECTION_REQUIRED_GROUPS,
+ CONTENT_PROTECTION_OPTIONAL_GROUPS,
+ /* optionalGroupsThreshold= */ 2002),
/* whitelistedComponents= */ toSet(COMPONENT1, COMPONENT2));
@Mock private Context mContext;
@@ -134,6 +142,19 @@ public class ContentCaptureOptionsTest {
.append(CONTENT_CAPTURE_OPTIONS.contentProtectionOptions.enableReceiver)
.append(", bufferSize=")
.append(CONTENT_CAPTURE_OPTIONS.contentProtectionOptions.bufferSize)
+ .append(", requiredGroupsSize=")
+ .append(
+ CONTENT_CAPTURE_OPTIONS.contentProtectionOptions.requiredGroups
+ .size())
+ .append(", optionalGroupsSize=")
+ .append(
+ CONTENT_CAPTURE_OPTIONS.contentProtectionOptions.optionalGroups
+ .size())
+ .append(", optionalGroupsThreshold=")
+ .append(
+ CONTENT_CAPTURE_OPTIONS
+ .contentProtectionOptions
+ .optionalGroupsThreshold)
.append("], whitelisted=")
.append(CONTENT_CAPTURE_OPTIONS.whitelistedComponents)
.append(']')
@@ -166,6 +187,15 @@ public class ContentCaptureOptionsTest {
.isEqualTo(CONTENT_CAPTURE_OPTIONS.contentProtectionOptions.enableReceiver);
assertThat(actual.contentProtectionOptions.bufferSize)
.isEqualTo(CONTENT_CAPTURE_OPTIONS.contentProtectionOptions.bufferSize);
+ assertThat(actual.contentProtectionOptions.requiredGroups)
+ .containsExactlyElementsIn(
+ CONTENT_CAPTURE_OPTIONS.contentProtectionOptions.requiredGroups);
+ assertThat(actual.contentProtectionOptions.optionalGroups)
+ .containsExactlyElementsIn(
+ CONTENT_CAPTURE_OPTIONS.contentProtectionOptions.optionalGroups);
+ assertThat(actual.contentProtectionOptions.optionalGroupsThreshold)
+ .isEqualTo(
+ CONTENT_CAPTURE_OPTIONS.contentProtectionOptions.optionalGroupsThreshold);
assertThat(actual.whitelistedComponents)
.containsExactlyElementsIn(CONTENT_CAPTURE_OPTIONS.whitelistedComponents);
}
diff --git a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureManagerTest.java b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureManagerTest.java
index 101f7c21fa19..5c411d5335a7 100644
--- a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureManagerTest.java
+++ b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureManagerTest.java
@@ -31,6 +31,8 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
+import java.util.Collections;
+
/**
* Unit test for {@link ContentCaptureManager}.
*
@@ -69,7 +71,11 @@ public class ContentCaptureManagerTest {
ContentCaptureOptions options =
createOptions(
new ContentCaptureOptions.ContentProtectionOptions(
- /* enableReceiver= */ false, BUFFER_SIZE));
+ /* enableReceiver= */ false,
+ BUFFER_SIZE,
+ /* requiredGroups= */ Collections.emptyList(),
+ /* optionalGroups= */ Collections.emptyList(),
+ /* optionalGroupsThreshold= */ 0));
ContentCaptureManager manager =
new ContentCaptureManager(mMockContext, mMockContentCaptureManager, options);
@@ -82,7 +88,11 @@ public class ContentCaptureManagerTest {
ContentCaptureOptions options =
createOptions(
new ContentCaptureOptions.ContentProtectionOptions(
- /* enableReceiver= */ true, /* bufferSize= */ 0));
+ /* enableReceiver= */ true,
+ /* bufferSize= */ 0,
+ /* requiredGroups= */ Collections.emptyList(),
+ /* optionalGroups= */ Collections.emptyList(),
+ /* optionalGroupsThreshold= */ 0));
ContentCaptureManager manager =
new ContentCaptureManager(mMockContext, mMockContentCaptureManager, options);
@@ -95,7 +105,11 @@ public class ContentCaptureManagerTest {
ContentCaptureOptions options =
createOptions(
new ContentCaptureOptions.ContentProtectionOptions(
- /* enableReceiver= */ true, BUFFER_SIZE));
+ /* enableReceiver= */ true,
+ BUFFER_SIZE,
+ /* requiredGroups= */ Collections.emptyList(),
+ /* optionalGroups= */ Collections.emptyList(),
+ /* optionalGroupsThreshold= */ 0));
ContentCaptureManager manager =
new ContentCaptureManager(mMockContext, mMockContentCaptureManager, options);
diff --git a/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java b/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java
index 3373b8b13273..e76d266c614c 100644
--- a/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java
+++ b/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java
@@ -47,6 +47,7 @@ import org.mockito.junit.MockitoRule;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
/**
@@ -112,7 +113,11 @@ public class MainContentCaptureSessionTest {
createOptions(
/* enableContentCaptureReceiver= */ true,
new ContentCaptureOptions.ContentProtectionOptions(
- /* enableReceiver= */ true, -BUFFER_SIZE));
+ /* enableReceiver= */ true,
+ -BUFFER_SIZE,
+ /* requiredGroups= */ Collections.emptyList(),
+ /* optionalGroups= */ Collections.emptyList(),
+ /* optionalGroupsThreshold= */ 0));
MainContentCaptureSession session = createSession(options);
session.mContentProtectionEventProcessor = mMockContentProtectionEventProcessor;
@@ -313,7 +318,11 @@ public class MainContentCaptureSessionTest {
return createOptions(
enableContentCaptureReceiver,
new ContentCaptureOptions.ContentProtectionOptions(
- enableContentProtectionReceiver, BUFFER_SIZE));
+ enableContentProtectionReceiver,
+ BUFFER_SIZE,
+ /* requiredGroups= */ Collections.emptyList(),
+ /* optionalGroups= */ Collections.emptyList(),
+ /* optionalGroupsThreshold= */ 0));
}
private ContentCaptureManager createManager(ContentCaptureOptions options) {
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
index f59417046c85..1a8dd3a7316e 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
@@ -20,6 +20,9 @@ import static android.Manifest.permission.MANAGE_CONTENT_CAPTURE;
import static android.content.Context.CONTENT_CAPTURE_MANAGER_SERVICE;
import static android.service.contentcapture.ContentCaptureService.setClientState;
import static android.view.contentcapture.ContentCaptureHelper.toList;
+import static android.view.contentcapture.ContentCaptureManager.DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_OPTIONAL_GROUPS_CONFIG;
+import static android.view.contentcapture.ContentCaptureManager.DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_OPTIONAL_GROUPS_THRESHOLD;
+import static android.view.contentcapture.ContentCaptureManager.DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_REQUIRED_GROUPS_CONFIG;
import static android.view.contentcapture.ContentCaptureManager.RESULT_CODE_FALSE;
import static android.view.contentcapture.ContentCaptureManager.RESULT_CODE_OK;
import static android.view.contentcapture.ContentCaptureManager.RESULT_CODE_SECURITY_EXCEPTION;
@@ -112,6 +115,7 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
@@ -203,6 +207,17 @@ public class ContentCaptureManagerService extends
@GuardedBy("mLock")
int mDevCfgContentProtectionBufferSize;
+ @GuardedBy("mLock")
+ @NonNull
+ List<List<String>> mDevCfgContentProtectionRequiredGroups;
+
+ @GuardedBy("mLock")
+ @NonNull
+ List<List<String>> mDevCfgContentProtectionOptionalGroups;
+
+ @GuardedBy("mLock")
+ int mDevCfgContentProtectionOptionalGroupsThreshold;
+
private final Executor mDataShareExecutor = Executors.newCachedThreadPool();
private final Handler mHandler = new Handler(Looper.getMainLooper());
@@ -226,6 +241,11 @@ public class ContentCaptureManagerService extends
com.android.internal.R.string.config_defaultContentCaptureService),
UserManager.DISALLOW_CONTENT_CAPTURE,
/*packageUpdatePolicy=*/ PACKAGE_UPDATE_POLICY_NO_REFRESH);
+
+ mDevCfgContentProtectionRequiredGroups =
+ ContentCaptureManager.DEFAULT_CONTENT_PROTECTION_REQUIRED_GROUPS;
+ mDevCfgContentProtectionOptionalGroups =
+ ContentCaptureManager.DEFAULT_CONTENT_PROTECTION_OPTIONAL_GROUPS;
DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_CONTENT_CAPTURE,
ActivityThread.currentApplication().getMainExecutor(),
(properties) -> onDeviceConfigChange(properties));
@@ -422,6 +442,9 @@ public class ContentCaptureManagerService extends
case ContentCaptureManager.DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_BUFFER_SIZE:
case ContentCaptureManager
.DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_APPS_BLOCKLIST_SIZE:
+ case DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_REQUIRED_GROUPS_CONFIG:
+ case DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_OPTIONAL_GROUPS_CONFIG:
+ case DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_OPTIONAL_GROUPS_THRESHOLD:
setFineTuneParamsFromDeviceConfig();
return;
default:
@@ -433,6 +456,8 @@ public class ContentCaptureManagerService extends
/** @hide */
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
protected void setFineTuneParamsFromDeviceConfig() {
+ String contentProtectionRequiredGroupsConfig;
+ String contentProtectionOptionalGroupsConfig;
synchronized (mLock) {
mDevCfgMaxBufferSize =
DeviceConfig.getInt(
@@ -486,6 +511,24 @@ public class ContentCaptureManagerService extends
ContentCaptureManager
.DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_BUFFER_SIZE,
ContentCaptureManager.DEFAULT_CONTENT_PROTECTION_BUFFER_SIZE);
+ contentProtectionRequiredGroupsConfig =
+ DeviceConfig.getString(
+ DeviceConfig.NAMESPACE_CONTENT_CAPTURE,
+ DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_REQUIRED_GROUPS_CONFIG,
+ ContentCaptureManager
+ .DEFAULT_CONTENT_PROTECTION_REQUIRED_GROUPS_CONFIG);
+ contentProtectionOptionalGroupsConfig =
+ DeviceConfig.getString(
+ DeviceConfig.NAMESPACE_CONTENT_CAPTURE,
+ DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_OPTIONAL_GROUPS_CONFIG,
+ ContentCaptureManager
+ .DEFAULT_CONTENT_PROTECTION_OPTIONAL_GROUPS_CONFIG);
+ mDevCfgContentProtectionOptionalGroupsThreshold =
+ DeviceConfig.getInt(
+ DeviceConfig.NAMESPACE_CONTENT_CAPTURE,
+ DEVICE_CONFIG_PROPERTY_CONTENT_PROTECTION_OPTIONAL_GROUPS_THRESHOLD,
+ ContentCaptureManager
+ .DEFAULT_CONTENT_PROTECTION_OPTIONAL_GROUPS_THRESHOLD);
if (verbose) {
Slog.v(
TAG,
@@ -507,9 +550,24 @@ public class ContentCaptureManagerService extends
+ ", contentProtectionAppsBlocklistSize="
+ mDevCfgContentProtectionAppsBlocklistSize
+ ", contentProtectionBufferSize="
- + mDevCfgContentProtectionBufferSize);
+ + mDevCfgContentProtectionBufferSize
+ + ", contentProtectionRequiredGroupsConfig="
+ + contentProtectionRequiredGroupsConfig
+ + ", contentProtectionOptionalGroupsConfig="
+ + contentProtectionOptionalGroupsConfig
+ + ", contentProtectionOptionalGroupsThreshold="
+ + mDevCfgContentProtectionOptionalGroupsThreshold);
}
}
+
+ List<List<String>> contentProtectionRequiredGroups =
+ parseContentProtectionGroupsConfig(contentProtectionRequiredGroupsConfig);
+ List<List<String>> contentProtectionOptionalGroups =
+ parseContentProtectionGroupsConfig(contentProtectionOptionalGroupsConfig);
+ synchronized (mLock) {
+ mDevCfgContentProtectionRequiredGroups = contentProtectionRequiredGroups;
+ mDevCfgContentProtectionOptionalGroups = contentProtectionOptionalGroups;
+ }
}
private void setLoggingLevelFromDeviceConfig() {
@@ -786,6 +844,15 @@ public class ContentCaptureManagerService extends
pw.print(prefix2);
pw.print("contentProtectionBufferSize: ");
pw.println(mDevCfgContentProtectionBufferSize);
+ pw.print(prefix2);
+ pw.print("contentProtectionRequiredGroupsSize: ");
+ pw.println(mDevCfgContentProtectionRequiredGroups.size());
+ pw.print(prefix2);
+ pw.print("contentProtectionOptionalGroupsSize: ");
+ pw.println(mDevCfgContentProtectionOptionalGroups.size());
+ pw.print(prefix2);
+ pw.print("contentProtectionOptionalGroupsThreshold: ");
+ pw.println(mDevCfgContentProtectionOptionalGroupsThreshold);
pw.print(prefix);
pw.println("Global Options:");
mGlobalContentCaptureOptions.dump(prefix2, pw);
@@ -890,6 +957,16 @@ public class ContentCaptureManagerService extends
return mContentCaptureManagerServiceStub;
}
+ /** @hide */
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+ @NonNull
+ protected List<List<String>> parseContentProtectionGroupsConfig(@Nullable String config) {
+ if (verbose) {
+ Slog.v(TAG, "parseContentProtectionGroupsConfig: " + config);
+ }
+ return Collections.emptyList();
+ }
+
final class ContentCaptureManagerServiceStub extends IContentCaptureManager.Stub {
@Override
@@ -1277,7 +1354,10 @@ public class ContentCaptureManagerService extends
isContentCaptureReceiverEnabled || whitelistedComponents != null,
new ContentCaptureOptions.ContentProtectionOptions(
isContentProtectionReceiverEnabled,
- mDevCfgContentProtectionBufferSize),
+ mDevCfgContentProtectionBufferSize,
+ mDevCfgContentProtectionRequiredGroups,
+ mDevCfgContentProtectionOptionalGroups,
+ mDevCfgContentProtectionOptionalGroupsThreshold),
whitelistedComponents);
if (verbose) Slog.v(TAG, "getOptionsForPackage(" + packageName + "): " + options);
return options;
diff --git a/services/tests/servicestests/src/com/android/server/contentcapture/ContentCaptureManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/contentcapture/ContentCaptureManagerServiceTest.java
index e7777f75b6df..67b70684eede 100644
--- a/services/tests/servicestests/src/com/android/server/contentcapture/ContentCaptureManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/contentcapture/ContentCaptureManagerServiceTest.java
@@ -436,6 +436,24 @@ public class ContentCaptureManagerServiceTest {
verify(mMockRemoteContentProtectionService).onLoginDetected(PARCELED_EVENTS);
}
+ @Test
+ public void parseContentProtectionGroupsConfig_null() {
+ ContentCaptureManagerService service = new ContentCaptureManagerService(sContext);
+ assertThat(service.parseContentProtectionGroupsConfig(null)).isEmpty();
+ }
+
+ @Test
+ public void parseContentProtectionGroupsConfig_empty() {
+ ContentCaptureManagerService service = new ContentCaptureManagerService(sContext);
+ assertThat(service.parseContentProtectionGroupsConfig("")).isEmpty();
+ }
+
+ @Test
+ public void parseContentProtectionGroupsConfig_notEmpty() {
+ ContentCaptureManagerService service = new ContentCaptureManagerService(sContext);
+ assertThat(service.parseContentProtectionGroupsConfig("a")).isEmpty();
+ }
+
private class TestContentCaptureManagerService extends ContentCaptureManagerService {
TestContentCaptureManagerService() {