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

Commit f0150a7f authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Alternative activity policy exemption API" into main

parents 0831e452 761b91c4
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