diff options
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); |