summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/system-current.txt25
-rw-r--r--core/java/android/companion/virtual/ActivityPolicyExemption.aidl19
-rw-r--r--core/java/android/companion/virtual/ActivityPolicyExemption.java196
-rw-r--r--core/java/android/companion/virtual/IVirtualDevice.aidl41
-rw-r--r--core/java/android/companion/virtual/VirtualDeviceInternal.java59
-rw-r--r--core/java/android/companion/virtual/VirtualDeviceManager.java193
-rw-r--r--services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java157
7 files changed, 318 insertions, 372 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 03eab7c28300..9c93c3aaf4fb 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -3434,6 +3434,23 @@ package android.companion {
package android.companion.virtual {
+ @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") public final class ActivityPolicyExemption implements android.os.Parcelable {
+ method public int describeContents();
+ method @Nullable public android.content.ComponentName getComponentName();
+ method public int getDisplayId();
+ method @Nullable public String getPackageName();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.companion.virtual.ActivityPolicyExemption> CREATOR;
+ }
+
+ public static final class ActivityPolicyExemption.Builder {
+ ctor public ActivityPolicyExemption.Builder();
+ method @NonNull public android.companion.virtual.ActivityPolicyExemption build();
+ method @NonNull public android.companion.virtual.ActivityPolicyExemption.Builder setComponentName(@NonNull android.content.ComponentName);
+ method @NonNull public android.companion.virtual.ActivityPolicyExemption.Builder setDisplayId(int);
+ method @NonNull public android.companion.virtual.ActivityPolicyExemption.Builder setPackageName(@NonNull String);
+ }
+
public final class VirtualDevice implements android.os.Parcelable {
method @FlaggedApi("android.companion.virtual.flags.vdm_public_apis") public boolean hasCustomAudioInputSupport();
method @FlaggedApi("android.companion.virtual.flags.vdm_public_apis") public boolean hasCustomCameraSupport();
@@ -3467,9 +3484,7 @@ package android.companion.virtual {
public static class VirtualDeviceManager.VirtualDevice implements java.lang.AutoCloseable {
method public void addActivityListener(@NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener);
method @FlaggedApi("android.companion.virtual.flags.dynamic_policy") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void addActivityPolicyExemption(@NonNull android.content.ComponentName);
- method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void addActivityPolicyExemption(@NonNull String);
- method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void addActivityPolicyExemption(@NonNull android.content.ComponentName, int);
- method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void addActivityPolicyExemption(@NonNull String, int);
+ method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void addActivityPolicyExemption(@NonNull android.companion.virtual.ActivityPolicyExemption);
method public void addSoundEffectListener(@NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.VirtualDeviceManager.SoundEffectListener);
method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void close();
method @NonNull public android.content.Context createContext();
@@ -3494,9 +3509,7 @@ package android.companion.virtual {
method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void registerIntentInterceptor(@NonNull android.content.IntentFilter, @NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.VirtualDeviceManager.IntentInterceptorCallback);
method public void removeActivityListener(@NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener);
method @FlaggedApi("android.companion.virtual.flags.dynamic_policy") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void removeActivityPolicyExemption(@NonNull android.content.ComponentName);
- method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void removeActivityPolicyExemption(@NonNull String);
- method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void removeActivityPolicyExemption(@NonNull android.content.ComponentName, int);
- method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void removeActivityPolicyExemption(@NonNull String, int);
+ method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void removeActivityPolicyExemption(@NonNull android.companion.virtual.ActivityPolicyExemption);
method public void removeSoundEffectListener(@NonNull android.companion.virtual.VirtualDeviceManager.SoundEffectListener);
method @FlaggedApi("android.companion.virtual.flags.dynamic_policy") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void setDevicePolicy(int, int);
method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void setDevicePolicy(int, int, int);
diff --git a/core/java/android/companion/virtual/ActivityPolicyExemption.aidl b/core/java/android/companion/virtual/ActivityPolicyExemption.aidl
new file mode 100644
index 000000000000..2f89da3464e2
--- /dev/null
+++ b/core/java/android/companion/virtual/ActivityPolicyExemption.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.companion.virtual;
+
+parcelable ActivityPolicyExemption;
diff --git a/core/java/android/companion/virtual/ActivityPolicyExemption.java b/core/java/android/companion/virtual/ActivityPolicyExemption.java
new file mode 100644
index 000000000000..c81bb43ac1d3
--- /dev/null
+++ b/core/java/android/companion/virtual/ActivityPolicyExemption.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.companion.virtual;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.companion.virtualdevice.flags.Flags;
+import android.content.ComponentName;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.view.Display;
+
+import java.util.Objects;
+
+/**
+ * Specifies an exemption from the current default activity launch policy of a virtual device.
+ *
+ * <p>Note that changing the virtual device's activity launch policy will clear all current
+ * exemptions.</p>
+ *
+ * @see VirtualDeviceParams#POLICY_TYPE_ACTIVITY
+ * @see VirtualDeviceManager.VirtualDevice#setDevicePolicy
+ * @see VirtualDeviceManager.VirtualDevice#addActivityPolicyExemption(ActivityPolicyExemption)
+ * @see VirtualDeviceManager.VirtualDevice#removeActivityPolicyExemption(ActivityPolicyExemption)
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_ACTIVITY_CONTROL_API)
+@SystemApi
+public final class ActivityPolicyExemption implements Parcelable {
+
+ private final @Nullable ComponentName mComponentName;
+ private final @Nullable String mPackageName;
+ private final int mDisplayId;
+
+ private ActivityPolicyExemption(@Nullable ComponentName componentName,
+ @Nullable String packageName, int displayId) {
+ mComponentName = componentName;
+ mPackageName = packageName;
+ mDisplayId = displayId;
+ }
+
+ private ActivityPolicyExemption(@NonNull Parcel parcel) {
+ mComponentName = parcel.readTypedObject(ComponentName.CREATOR);
+ mPackageName = parcel.readString8();
+ mDisplayId = parcel.readInt();
+ }
+
+ /**
+ * Returns the exempt component name if this is a component level exemption, {@code null}
+ * otherwise.
+ *
+ * @see Builder#setComponentName(ComponentName)
+ */
+ public @Nullable ComponentName getComponentName() {
+ return mComponentName;
+ }
+
+ /**
+ * Returns the exempt package name if this is a package level exemption, {@code null} otherwise.
+ *
+ * @see Builder#setPackageName(String)
+ */
+ public @Nullable String getPackageName() {
+ return mPackageName;
+ }
+
+ /**
+ * Returns the display ID relevant for this exemption if it is specific to a single display,
+ * {@link Display#INVALID_DISPLAY} otherwise.
+ *
+ * @see Builder#setDisplayId(int)
+ */
+ public int getDisplayId() {
+ return mDisplayId;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeTypedObject(mComponentName, flags);
+ dest.writeString8(mPackageName);
+ dest.writeInt(mDisplayId);
+ }
+
+ @NonNull
+ public static final Parcelable.Creator<ActivityPolicyExemption> CREATOR =
+ new Parcelable.Creator<>() {
+ public ActivityPolicyExemption createFromParcel(Parcel in) {
+ return new ActivityPolicyExemption(in);
+ }
+
+ public ActivityPolicyExemption[] newArray(int size) {
+ return new ActivityPolicyExemption[size];
+ }
+ };
+
+ /**
+ * Builder for {@link ActivityPolicyExemption}.
+ */
+ public static final class Builder {
+
+ private @Nullable ComponentName mComponentName;
+ private @Nullable String mPackageName;
+ private int mDisplayId = Display.INVALID_DISPLAY;
+
+ /**
+ * Specifies a component level exemption from the current default activity launch policy.
+ *
+ * <p>If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} allows activity
+ * launches by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_DEFAULT}),
+ * then the specified component will be blocked from launching.
+ * If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} blocks activity launches
+ * by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_CUSTOM}), then the
+ * specified component will be allowed to launch.</p>
+ *
+ * <p>Setting a component name will clear any previously set package name.</p>
+ */
+ public @NonNull Builder setComponentName(@NonNull ComponentName componentName) {
+ mComponentName = Objects.requireNonNull(componentName);
+ mPackageName = null;
+ return this;
+ }
+
+ /**
+ * Specifies a package level exemption from the current default activity launch policy.
+ *
+ * <p>If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} allows activity
+ * launches by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_DEFAULT}),
+ * then all activities from the specified package will be blocked from launching.
+ * If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} blocks activity launches
+ * by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_CUSTOM}), then all
+ * activities from the specified package will be allowed to launch.</p>
+ *
+ * <p>Package level exemptions are independent of component level exemptions created via
+ * {@link #setComponentName(ComponentName)}, i.e. removing a package exemption will not
+ * remove any existing component exemptions, even if the component belongs to that package.
+ * </p>
+ *
+ * <p>Setting a package name will clear any previously set component name.</p>
+ */
+ public @NonNull Builder setPackageName(@NonNull String packageName) {
+ mComponentName = null;
+ mPackageName = Objects.requireNonNull(packageName);
+ return this;
+ }
+
+ /**
+ * Makes this exemption specific to the display with the given ID. If unset, or set to
+ * {@link Display#INVALID_DISPLAY}, then the exemption is applied to all displays that
+ * belong to the virtual device.
+ *
+ * @param displayId the ID of the display, for which to apply the exemption. The display
+ * must belong to the virtual device.
+ */
+ public @NonNull Builder setDisplayId(int displayId) {
+ mDisplayId = displayId;
+ return this;
+ }
+
+ /**
+ * Builds the {@link ActivityPolicyExemption} instance.
+ *
+ * @throws IllegalArgumentException if neither the component name nor the package name are
+ * set.
+ */
+ @NonNull
+ public ActivityPolicyExemption build() {
+ if ((mComponentName == null) == (mPackageName == null)) {
+ throw new IllegalArgumentException(
+ "Either component name or package name must be set");
+ }
+ return new ActivityPolicyExemption(mComponentName, mPackageName, mDisplayId);
+ }
+ }
+}
diff --git a/core/java/android/companion/virtual/IVirtualDevice.aidl b/core/java/android/companion/virtual/IVirtualDevice.aidl
index 56d5a74674c9..8916ce27cf68 100644
--- a/core/java/android/companion/virtual/IVirtualDevice.aidl
+++ b/core/java/android/companion/virtual/IVirtualDevice.aidl
@@ -17,6 +17,7 @@
package android.companion.virtual;
import android.app.PendingIntent;
+import android.companion.virtual.ActivityPolicyExemption;
import android.companion.virtual.IVirtualDeviceActivityListener;
import android.companion.virtual.IVirtualDeviceIntentInterceptor;
import android.companion.virtual.IVirtualDeviceSoundEffectListener;
@@ -103,25 +104,13 @@ interface IVirtualDevice {
* Adds an exemption to the default activity launch policy.
*/
@EnforcePermission("CREATE_VIRTUAL_DEVICE")
- void addActivityPolicyExemption(in ComponentName exemption);
+ void addActivityPolicyExemption(in ActivityPolicyExemption exemption);
/**
* Removes an exemption to the default activity launch policy.
*/
@EnforcePermission("CREATE_VIRTUAL_DEVICE")
- void removeActivityPolicyExemption(in ComponentName exemption);
-
- /**
- * Adds a package level exemption to the default activity launch policy.
- */
- @EnforcePermission("CREATE_VIRTUAL_DEVICE")
- void addActivityPolicyPackageExemption(in String exemption);
-
- /**
- * Removes a package level exemption to the default activity launch policy.
- */
- @EnforcePermission("CREATE_VIRTUAL_DEVICE")
- void removeActivityPolicyPackageExemption(in String exemption);
+ void removeActivityPolicyExemption(in ActivityPolicyExemption exemption);
/**
* Specifies a policy for this virtual device on the given display.
@@ -130,30 +119,6 @@ interface IVirtualDevice {
void setDevicePolicyForDisplay(int displayId, int policyType, int devicePolicy);
/**
- * Adds an exemption to the default activity launch policy on the given display.
- */
- @EnforcePermission("CREATE_VIRTUAL_DEVICE")
- void addActivityPolicyExemptionForDisplay(int displayId, in ComponentName exemption);
-
- /**
- * Removes an exemption to the default activity launch policy on the given display.
- */
- @EnforcePermission("CREATE_VIRTUAL_DEVICE")
- void removeActivityPolicyExemptionForDisplay(int displayId, in ComponentName exemption);
-
- /**
- * Adds a package level exemption to the default activity launch policy on the given display.
- */
- @EnforcePermission("CREATE_VIRTUAL_DEVICE")
- void addActivityPolicyPackageExemptionForDisplay(int displayId, in String exemption);
-
- /**
- * Removes a package level exemption to the default activity launch policy on the given display.
- */
- @EnforcePermission("CREATE_VIRTUAL_DEVICE")
- void removeActivityPolicyPackageExemptionForDisplay(int displayId, in String exemption);
-
- /**
* Notifies that an audio session being started.
*/
@EnforcePermission("CREATE_VIRTUAL_DEVICE")
diff --git a/core/java/android/companion/virtual/VirtualDeviceInternal.java b/core/java/android/companion/virtual/VirtualDeviceInternal.java
index e83f46aa62af..b7bf2d16ba2c 100644
--- a/core/java/android/companion/virtual/VirtualDeviceInternal.java
+++ b/core/java/android/companion/virtual/VirtualDeviceInternal.java
@@ -306,39 +306,22 @@ public class VirtualDeviceInternal {
}
}
- void addActivityPolicyExemption(@NonNull ComponentName componentName) {
+ void addActivityPolicyExemption(@NonNull ActivityPolicyExemption exemption) {
try {
- mVirtualDevice.addActivityPolicyExemption(componentName);
+ mVirtualDevice.addActivityPolicyExemption(exemption);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
- void removeActivityPolicyExemption(@NonNull ComponentName componentName) {
+ void removeActivityPolicyExemption(@NonNull ActivityPolicyExemption exemption) {
try {
- mVirtualDevice.removeActivityPolicyExemption(componentName);
+ mVirtualDevice.removeActivityPolicyExemption(exemption);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
- void addActivityPolicyPackageExemption(@NonNull String packageName) {
- try {
- mVirtualDevice.addActivityPolicyPackageExemption(packageName);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- void removeActivityPolicyPackageExemption(@NonNull String packageName) {
- try {
- mVirtualDevice.removeActivityPolicyPackageExemption(packageName);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
-
void setDevicePolicyForDisplay(int displayId,
@VirtualDeviceParams.DynamicDisplayPolicyType int policyType,
@VirtualDeviceParams.DevicePolicy int devicePolicy) {
@@ -358,40 +341,6 @@ public class VirtualDeviceInternal {
}
}
- void addActivityPolicyExemptionForDisplay(int displayId, @NonNull ComponentName componentName) {
- try {
- mVirtualDevice.addActivityPolicyExemptionForDisplay(displayId, componentName);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- void removeActivityPolicyExemptionForDisplay(int displayId,
- @NonNull ComponentName componentName) {
- try {
- mVirtualDevice.removeActivityPolicyExemptionForDisplay(displayId, componentName);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- void addActivityPolicyPackageExemptionForDisplay(int displayId, @NonNull String packageName) {
- try {
- mVirtualDevice.addActivityPolicyPackageExemptionForDisplay(displayId, packageName);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- void removeActivityPolicyPackageExemptionForDisplay(int displayId,
- @NonNull String packageName) {
- try {
- mVirtualDevice.removeActivityPolicyPackageExemptionForDisplay(displayId, packageName);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
@NonNull
VirtualDpad createVirtualDpad(@NonNull VirtualDpadConfig config) {
try {
diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java
index 9e32cbac91eb..40aa6837ad1d 100644
--- a/core/java/android/companion/virtual/VirtualDeviceManager.java
+++ b/core/java/android/companion/virtual/VirtualDeviceManager.java
@@ -765,14 +765,15 @@ public final class VirtualDeviceManager {
* <p>Note that changing the activity launch policy will clear current set of exempt
* components.</p>
*
- * @see #removeActivityPolicyExemption
+ * @see #removeActivityPolicyExemption(ComponentName)
* @see #setDevicePolicy
*/
@FlaggedApi(Flags.FLAG_DYNAMIC_POLICY)
@RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
public void addActivityPolicyExemption(@NonNull ComponentName componentName) {
- mVirtualDeviceInternal.addActivityPolicyExemption(
- Objects.requireNonNull(componentName));
+ addActivityPolicyExemption(new ActivityPolicyExemption.Builder()
+ .setComponentName(componentName)
+ .build());
}
/**
@@ -788,70 +789,54 @@ public final class VirtualDeviceManager {
* <p>Note that changing the activity launch policy will clear current set of exempt
* components.</p>
*
- * @see #addActivityPolicyExemption
+ * @see #addActivityPolicyExemption(ComponentName)
* @see #setDevicePolicy
*/
@FlaggedApi(Flags.FLAG_DYNAMIC_POLICY)
@RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
public void removeActivityPolicyExemption(@NonNull ComponentName componentName) {
- mVirtualDeviceInternal.removeActivityPolicyExemption(
- Objects.requireNonNull(componentName));
+ removeActivityPolicyExemption(new ActivityPolicyExemption.Builder()
+ .setComponentName(componentName)
+ .build());
}
/**
- * Specifies a package name to be exempt from the current activity launch policy.
+ * Specifies an exemption from the current activity launch policy.
*
* <p>If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} allows activity
* launches by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_DEFAULT}),
- * then all activities from the specified package will be blocked from launching.
+ * then all exempt activities be blocked from launching.
* If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} blocks activity launches
* by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_CUSTOM}), then all
- * activities from the specified package will be allowed to launch.</p>
- *
- * <p>Package level exemptions are independent of component level exemptions added via
- * {@link #addActivityPolicyExemption(String)}, i.e. removing a package exemption will not
- * remove any existing component exemptions, even if the component belongs to that package.
- * </p>
+ * exempt activities will be allowed to launch.</p>
*
* <p>Note that changing the activity launch policy will clear current set of exempt
* packages.</p>
+ * <p>Any change to the exemptions will only be applied for new activity launches.</p>
*
- * @see #removeActivityPolicyExemption(String)
+ * @see #removeActivityPolicyExemption(ActivityPolicyExemption)
* @see #setDevicePolicy
*/
@FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ACTIVITY_CONTROL_API)
@RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- public void addActivityPolicyExemption(@NonNull String packageName) {
- mVirtualDeviceInternal.addActivityPolicyPackageExemption(
- Objects.requireNonNull(packageName));
+ public void addActivityPolicyExemption(@NonNull ActivityPolicyExemption exemption) {
+ mVirtualDeviceInternal.addActivityPolicyExemption(Objects.requireNonNull(exemption));
}
/**
- * Makes the specified package name adhere to the default activity launch policy.
- *
- * <p>If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} allows activity
- * launches by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_DEFAULT}),
- * then all activities from the specified package will be allowed to launch.
- * If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} blocks activity launches
- * by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_CUSTOM}), then all
- * activities from the specified package will be blocked from launching.</p>
- *
- * <p>Package level exemptions are independent of component level exemptions added via
- * {@link #addActivityPolicyExemption(String)}, i.e. removing a package exemption will not
- * remove any existing component exemptions, even if the component belongs to that package.
- * </p>
+ * Removes an exemption from the current activity launch policy.
*
* <p>Note that changing the activity launch policy will clear current set of exempt
* packages.</p>
+ * <p>Any change to the exemptions will only be applied for new activity launches.</p>
*
- * @see #addActivityPolicyExemption(String)
+ * @see #addActivityPolicyExemption(ActivityPolicyExemption)
* @see #setDevicePolicy
*/
@FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ACTIVITY_CONTROL_API)
@RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- public void removeActivityPolicyExemption(@NonNull String packageName) {
- mVirtualDeviceInternal.removeActivityPolicyPackageExemption(
- Objects.requireNonNull(packageName));
+ public void removeActivityPolicyExemption(@NonNull ActivityPolicyExemption exemption) {
+ mVirtualDeviceInternal.removeActivityPolicyExemption(Objects.requireNonNull(exemption));
}
/**
@@ -881,142 +866,6 @@ public final class VirtualDeviceManager {
}
/**
- * Specifies a component name to be exempt from the given display's activity launch policy.
- *
- * <p>If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} allows activity
- * launches by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_DEFAULT}),
- * then the specified component will be blocked from launching.
- * If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} blocks activity launches
- * by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_CUSTOM}), then the
- * specified component will be allowed to launch.</p>
- *
- * <p>Note that changing the activity launch policy will clear current set of exempt
- * components.</p>
- * <p>Any change to the exemptions will only be applied for new activity launches.</p>
- *
- * @param componentName the component name to be exempt from the activity launch policy.
- * @param displayId the ID of the display, for which to apply the exemption. The display
- * must belong to the virtual device.
- * @throws IllegalArgumentException if the specified display does not belong to the virtual
- * device.
- *
- * @see #removeActivityPolicyExemption
- * @see #setDevicePolicy
- * @see Display#getDisplayId
- */
- @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ACTIVITY_CONTROL_API)
- @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- public void addActivityPolicyExemption(
- @NonNull ComponentName componentName, int displayId) {
- mVirtualDeviceInternal.addActivityPolicyExemptionForDisplay(
- displayId, Objects.requireNonNull(componentName));
- }
-
- /**
- * Makes the specified component name adhere to the given display's activity launch policy.
- *
- * <p>If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} allows activity
- * launches by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_DEFAULT}),
- * then the specified component will be allowed to launch.
- * If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} blocks activity launches
- * by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_CUSTOM}), then the
- * specified component will be blocked from launching.</p>
- *
- * <p>Note that changing the activity launch policy will clear current set of exempt
- * components.</p>
- *
- * @param componentName the component name to be removed from the exemption list.
- * @param displayId the ID of the display, for which to apply the exemption. The display
- * must belong to the virtual device.
- * @throws IllegalArgumentException if the specified display does not belong to the virtual
- * device.
- *
- * @see #addActivityPolicyExemption
- * @see #setDevicePolicy
- * @see Display#getDisplayId
- */
- @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ACTIVITY_CONTROL_API)
- @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- public void removeActivityPolicyExemption(
- @NonNull ComponentName componentName, int displayId) {
- mVirtualDeviceInternal.removeActivityPolicyExemptionForDisplay(
- displayId, Objects.requireNonNull(componentName));
- }
-
- /**
- * Specifies a package name to be exempt from the given display's activity launch policy.
- *
- * <p>If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} allows activity
- * launches by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_DEFAULT}),
- * then all activities from the specified package will be blocked from launching.
- * If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} blocks activity launches
- * by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_CUSTOM}), then all
- * activities from the specified package will be allowed to launch.</p>
- *
- * <p>Note that changing the activity launch policy will clear current set of exempt
- * packages.</p>
- * <p>Any change to the exemptions will only be applied for new activity launches.</p>
- *
- * <p>Package level exemptions are independent of component level exemptions added via
- * {@link #addActivityPolicyExemption(String, int)}, i.e. removing a package exemption will
- * not remove any existing component exemptions, even if the component belongs to that
- * package.</p>
- *
- * @param packageName the package name to be exempt from the activity launch policy. All
- * activities from that package will be exempt.
- * @param displayId the ID of the display, for which to apply the exemption. The display
- * must belong to the virtual device.
- * @throws IllegalArgumentException if the specified display does not belong to the virtual
- * device.
- *
- * @see #removeActivityPolicyExemption(String, int)
- * @see #setDevicePolicy
- * @see Display#getDisplayId
- */
- @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ACTIVITY_CONTROL_API)
- @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- public void addActivityPolicyExemption(@NonNull String packageName, int displayId) {
- mVirtualDeviceInternal.addActivityPolicyPackageExemptionForDisplay(
- displayId, Objects.requireNonNull(packageName));
- }
-
- /**
- * Makes the specified package name adhere to the given display's activity launch policy.
- *
- * <p>If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} allows activity
- * launches by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_DEFAULT}),
- * then all activities from the specified package will be allowed to launch.
- * If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} blocks activity launches
- * by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_CUSTOM}), then all
- * activities from the specified package will be blocked from launching.</p>
- *
- * <p>Note that changing the activity launch policy will clear current set of exempt
- * packages.</p>
- *
- * <p>Package level exemptions are independent of component level exemptions added via
- * {@link #addActivityPolicyExemption(String, int)}, i.e. removing a package exemption will
- * not remove any existing component exemptions, even if the component belongs to that
- * package.</p>
- *
- * @param packageName the package name to be removed from the exemption list. All activities
- * from that package stop being exempt from the activity launch policy.
- * @param displayId the ID of the display, for which to apply the exemption. The display
- * must belong to the virtual device.
- * @throws IllegalArgumentException if the specified display does not belong to the virtual
- * device.
- *
- * @see #addActivityPolicyExemption(String, int)
- * @see #setDevicePolicy
- * @see Display#getDisplayId
- */
- @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ACTIVITY_CONTROL_API)
- @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- public void removeActivityPolicyExemption(@NonNull String packageName, int displayId) {
- mVirtualDeviceInternal.removeActivityPolicyPackageExemptionForDisplay(
- displayId, Objects.requireNonNull(packageName));
- }
-
- /**
* Creates a virtual dpad.
*
* @param config the configurations of the virtual dpad.
@@ -1401,7 +1250,7 @@ public final class VirtualDeviceManager {
* activity to a different display.
*
* @see VirtualDeviceParams#POLICY_TYPE_ACTIVITY
- * @see VirtualDevice#addActivityPolicyExemption(ComponentName)
+ * @see VirtualDevice#addActivityPolicyExemption(ActivityPolicyExemption)
*/
@FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ACTIVITY_CONTROL_API)
default void onActivityLaunchBlocked(int displayId, @NonNull ComponentName componentName,
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
index f332ed9504c2..4eb50a952c04 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
@@ -41,6 +41,7 @@ import android.app.ActivityOptions;
import android.app.PendingIntent;
import android.app.admin.DevicePolicyManager;
import android.companion.AssociationInfo;
+import android.companion.virtual.ActivityPolicyExemption;
import android.companion.virtual.IVirtualDevice;
import android.companion.virtual.IVirtualDeviceActivityListener;
import android.companion.virtual.IVirtualDeviceIntentInterceptor;
@@ -522,44 +523,37 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
@Override // Binder call
@EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- public void addActivityPolicyExemption(@NonNull ComponentName componentName) {
+ public void addActivityPolicyExemption(@NonNull ActivityPolicyExemption exemption) {
super.addActivityPolicyExemption_enforcePermission();
- synchronized (mVirtualDeviceLock) {
- if (mActivityPolicyExemptions.add(componentName)) {
- for (int i = 0; i < mVirtualDisplays.size(); i++) {
- mVirtualDisplays.valueAt(i).getWindowPolicyController()
- .addActivityPolicyExemption(componentName);
- }
+ final int displayId = exemption.getDisplayId();
+ if (exemption.getComponentName() == null || displayId != Display.INVALID_DISPLAY) {
+ if (!android.companion.virtualdevice.flags.Flags.activityControlApi()) {
+ return;
}
}
- }
-
- @Override // Binder call
- @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- public void removeActivityPolicyExemption(@NonNull ComponentName componentName) {
- super.removeActivityPolicyExemption_enforcePermission();
synchronized (mVirtualDeviceLock) {
- if (mActivityPolicyExemptions.remove(componentName)) {
- for (int i = 0; i < mVirtualDisplays.size(); i++) {
- mVirtualDisplays.valueAt(i).getWindowPolicyController()
- .removeActivityPolicyExemption(componentName);
+ if (displayId != Display.INVALID_DISPLAY) {
+ checkDisplayOwnedByVirtualDeviceLocked(displayId);
+ if (exemption.getComponentName() != null) {
+ mVirtualDisplays.get(displayId).getWindowPolicyController()
+ .addActivityPolicyExemption(exemption.getComponentName());
+ } else if (exemption.getPackageName() != null) {
+ mVirtualDisplays.get(displayId).getWindowPolicyController()
+ .addActivityPolicyExemption(exemption.getPackageName());
}
- }
- }
- }
-
- @Override // Binder call
- @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- public void addActivityPolicyPackageExemption(@NonNull String packageName) {
- super.addActivityPolicyPackageExemption_enforcePermission();
- if (!android.companion.virtualdevice.flags.Flags.activityControlApi()) {
- return;
- }
- synchronized (mVirtualDeviceLock) {
- if (mActivityPolicyPackageExemptions.add(packageName)) {
- for (int i = 0; i < mVirtualDisplays.size(); i++) {
- mVirtualDisplays.valueAt(i).getWindowPolicyController()
- .addActivityPolicyExemption(packageName);
+ } else {
+ if (exemption.getComponentName() != null
+ && mActivityPolicyExemptions.add(exemption.getComponentName())) {
+ for (int i = 0; i < mVirtualDisplays.size(); i++) {
+ mVirtualDisplays.valueAt(i).getWindowPolicyController()
+ .addActivityPolicyExemption(exemption.getComponentName());
+ }
+ } else if (exemption.getPackageName() != null
+ && mActivityPolicyPackageExemptions.add(exemption.getPackageName())) {
+ for (int i = 0; i < mVirtualDisplays.size(); i++) {
+ mVirtualDisplays.valueAt(i).getWindowPolicyController()
+ .addActivityPolicyExemption(exemption.getPackageName());
+ }
}
}
}
@@ -567,81 +561,42 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
@Override // Binder call
@EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- public void removeActivityPolicyPackageExemption(@NonNull String packageName) {
- super.removeActivityPolicyPackageExemption_enforcePermission();
- if (!android.companion.virtualdevice.flags.Flags.activityControlApi()) {
- return;
+ public void removeActivityPolicyExemption(@NonNull ActivityPolicyExemption exemption) {
+ super.removeActivityPolicyExemption_enforcePermission();
+ final int displayId = exemption.getDisplayId();
+ if (exemption.getComponentName() == null || displayId != Display.INVALID_DISPLAY) {
+ if (!android.companion.virtualdevice.flags.Flags.activityControlApi()) {
+ return;
+ }
}
synchronized (mVirtualDeviceLock) {
- if (mActivityPolicyPackageExemptions.remove(packageName)) {
- for (int i = 0; i < mVirtualDisplays.size(); i++) {
- mVirtualDisplays.valueAt(i).getWindowPolicyController()
- .removeActivityPolicyExemption(packageName);
+ if (displayId != Display.INVALID_DISPLAY) {
+ checkDisplayOwnedByVirtualDeviceLocked(displayId);
+ if (exemption.getComponentName() != null) {
+ mVirtualDisplays.get(displayId).getWindowPolicyController()
+ .removeActivityPolicyExemption(exemption.getComponentName());
+ } else if (exemption.getPackageName() != null) {
+ mVirtualDisplays.get(displayId).getWindowPolicyController()
+ .removeActivityPolicyExemption(exemption.getPackageName());
+ }
+ } else {
+ if (exemption.getComponentName() != null
+ && mActivityPolicyExemptions.remove(exemption.getComponentName())) {
+ for (int i = 0; i < mVirtualDisplays.size(); i++) {
+ mVirtualDisplays.valueAt(i).getWindowPolicyController()
+ .removeActivityPolicyExemption(exemption.getComponentName());
+ }
+ } else if (exemption.getPackageName() != null
+ && mActivityPolicyPackageExemptions.remove(exemption.getPackageName())) {
+ for (int i = 0; i < mVirtualDisplays.size(); i++) {
+ mVirtualDisplays.valueAt(i).getWindowPolicyController()
+ .removeActivityPolicyExemption(exemption.getPackageName());
+ }
}
}
}
}
- @Override // Binder call
- @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- public void addActivityPolicyExemptionForDisplay(
- int displayId, @NonNull ComponentName componentName) {
- super.addActivityPolicyExemptionForDisplay_enforcePermission();
- if (!android.companion.virtualdevice.flags.Flags.activityControlApi()) {
- return;
- }
- synchronized (mVirtualDeviceLock) {
- checkDisplayOwnedByVirtualDeviceLocked(displayId);
- mVirtualDisplays.get(displayId).getWindowPolicyController()
- .addActivityPolicyExemption(componentName);
- }
- }
-
- @Override // Binder call
- @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- public void removeActivityPolicyExemptionForDisplay(
- int displayId, @NonNull ComponentName componentName) {
- super.removeActivityPolicyExemptionForDisplay_enforcePermission();
- if (!android.companion.virtualdevice.flags.Flags.activityControlApi()) {
- return;
- }
- synchronized (mVirtualDeviceLock) {
- checkDisplayOwnedByVirtualDeviceLocked(displayId);
- mVirtualDisplays.get(displayId).getWindowPolicyController()
- .removeActivityPolicyExemption(componentName);
- }
- }
-
- @Override // Binder call
- @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- public void addActivityPolicyPackageExemptionForDisplay(
- int displayId, @NonNull String packageName) {
- super.addActivityPolicyPackageExemptionForDisplay_enforcePermission();
- if (!android.companion.virtualdevice.flags.Flags.activityControlApi()) {
- return;
- }
- synchronized (mVirtualDeviceLock) {
- checkDisplayOwnedByVirtualDeviceLocked(displayId);
- mVirtualDisplays.get(displayId).getWindowPolicyController()
- .addActivityPolicyExemption(packageName);
- }
- }
-
- @Override // Binder call
- @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
- public void removeActivityPolicyPackageExemptionForDisplay(
- int displayId, @NonNull String packageName) {
- super.removeActivityPolicyPackageExemptionForDisplay_enforcePermission();
- if (!android.companion.virtualdevice.flags.Flags.activityControlApi()) {
- return;
- }
- synchronized (mVirtualDeviceLock) {
- checkDisplayOwnedByVirtualDeviceLocked(displayId);
- mVirtualDisplays.get(displayId).getWindowPolicyController()
- .removeActivityPolicyExemption(packageName);
- }
- }
-
private void sendPendingIntent(int displayId, PendingIntent pendingIntent)
throws PendingIntent.CanceledException {
final ActivityOptions options = ActivityOptions.makeBasic().setLaunchDisplayId(displayId);