Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 761b91c4 authored by Vladimir Komsiyski's avatar Vladimir Komsiyski
Browse files

Alternative activity policy exemption API

Bug: 333443509
Test: presubmit, CTS
Flag: android.companion.virtualdevice.flags.activity_control_api

Change-Id: Iabb314d0ace63c2178c6f26402fa991f566df3ab
parent 9170c939
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -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);
+19 −0
Original line number Diff line number Diff line
/*
 * 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;
+196 −0
Original line number Diff line number Diff line
/*
 * 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);
        }
    }
}
+3 −38
Original line number Diff line number Diff line
@@ -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.
@@ -129,30 +118,6 @@ interface IVirtualDevice {
    @EnforcePermission("CREATE_VIRTUAL_DEVICE")
    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.
     */
+4 −55
Original line number Diff line number Diff line
@@ -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 {
Loading