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

Commit 759b447e authored by Antony Sargent's avatar Antony Sargent
Browse files

Small cleanups to VirtualDeviceParams recents API

This addresses some API council feedback on the previous approach, by
switching to using a new @PolicyType POLICY_TYPE_RECENTS for use with
the more generic setDevicePolicy/getDevicePolicy methods instead of
having separate methods just for recents policy.

Bug: 261697036
Test: atest VirtualDeviceManagerServiceTest CtsVirtualDevicesTestCases#VirtualDeviceParamsTest
Change-Id: I824549cf89048032045303d797637cd491c2c195
parent 1d837f7f
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -3247,7 +3247,6 @@ package android.companion.virtual {
    method @NonNull public java.util.Set<android.content.ComponentName> getBlockedCrossTaskNavigations();
    method public int getDefaultActivityPolicy();
    method public int getDefaultNavigationPolicy();
    method public int getDefaultRecentsPolicy();
    method public int getDevicePolicy(int);
    method public int getLockState();
    method @Nullable public String getName();
@@ -3264,8 +3263,8 @@ package android.companion.virtual {
    field public static final int NAVIGATION_POLICY_DEFAULT_ALLOWED = 0; // 0x0
    field public static final int NAVIGATION_POLICY_DEFAULT_BLOCKED = 1; // 0x1
    field public static final int POLICY_TYPE_AUDIO = 1; // 0x1
    field public static final int POLICY_TYPE_RECENTS = 2; // 0x2
    field public static final int POLICY_TYPE_SENSORS = 0; // 0x0
    field public static final int RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS = 1; // 0x1
  }
  public static final class VirtualDeviceParams.Builder {
@@ -3278,7 +3277,6 @@ package android.companion.virtual {
    method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setAudioRecordingSessionId(int);
    method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setBlockedActivities(@NonNull java.util.Set<android.content.ComponentName>);
    method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setBlockedCrossTaskNavigations(@NonNull java.util.Set<android.content.ComponentName>);
    method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setDefaultRecentsPolicy(int);
    method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setDevicePolicy(int, int);
    method @NonNull @RequiresPermission(value=android.Manifest.permission.ADD_ALWAYS_UNLOCKED_DISPLAY, conditional=true) public android.companion.virtual.VirtualDeviceParams.Builder setLockState(int);
    method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setName(@NonNull String);
+13 −45
Original line number Diff line number Diff line
@@ -140,7 +140,8 @@ public final class VirtualDeviceParams implements Parcelable {
     * a given policy type.
     * @hide
     */
    @IntDef(prefix = "POLICY_TYPE_",  value = {POLICY_TYPE_SENSORS, POLICY_TYPE_AUDIO})
    @IntDef(prefix = "POLICY_TYPE_", value = {POLICY_TYPE_SENSORS, POLICY_TYPE_AUDIO,
            POLICY_TYPE_RECENTS})
    @Retention(RetentionPolicy.SOURCE)
    @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
    public @interface PolicyType {}
@@ -169,22 +170,21 @@ public final class VirtualDeviceParams implements Parcelable {
     *     <li>{@link #DEVICE_POLICY_CUSTOM}: audio framework will assign device specific session
     *     ids to players and recorders constructed within device context. The session ids are
     *     used to re-route corresponding audio streams to VirtualAudioDevice.
     * <ul/>
     * </ul>
     */
    public static final int POLICY_TYPE_AUDIO = 1;

    /** @hide */
    @IntDef(flag = true, prefix = "RECENTS_POLICY_",
            value = {RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS})
    @Retention(RetentionPolicy.SOURCE)
    @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
    public @interface RecentsPolicy {}

    /**
     * If set, activities launched on this virtual device are allowed to appear in the host device
     * of the recently launched activities list.
     * Tells the activity manager how to handle recents entries for activities run on this device.
     *
     * <ul>
     *     <li>{@link #DEVICE_POLICY_DEFAULT}: Activities launched on VirtualDisplays owned by this
     *     device will appear in the host device recents.
     *     <li>{@link #DEVICE_POLICY_CUSTOM}: Activities launched on VirtualDisplays owned by this
     *      *     device will not appear in recents.
     * </ul>
     */
    public static final int RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS = 1 << 0;
    public static final int POLICY_TYPE_RECENTS = 2;

    private final int mLockState;
    @NonNull private final ArraySet<UserHandle> mUsersWithMatchingAccounts;
@@ -201,8 +201,6 @@ public final class VirtualDeviceParams implements Parcelable {
    @NonNull private final SparseIntArray mDevicePolicies;
    @NonNull private final List<VirtualSensorConfig> mVirtualSensorConfigs;
    @Nullable private final IVirtualSensorCallback mVirtualSensorCallback;
    @RecentsPolicy
    private final int mDefaultRecentsPolicy;
    private final int mAudioPlaybackSessionId;
    private final int mAudioRecordingSessionId;

@@ -219,7 +217,6 @@ public final class VirtualDeviceParams implements Parcelable {
            @NonNull SparseIntArray devicePolicies,
            @NonNull List<VirtualSensorConfig> virtualSensorConfigs,
            @Nullable IVirtualSensorCallback virtualSensorCallback,
            @RecentsPolicy int defaultRecentsPolicy,
            int audioPlaybackSessionId,
            int audioRecordingSessionId) {
        mLockState = lockState;
@@ -237,10 +234,8 @@ public final class VirtualDeviceParams implements Parcelable {
        mDevicePolicies = Objects.requireNonNull(devicePolicies);
        mVirtualSensorConfigs = Objects.requireNonNull(virtualSensorConfigs);
        mVirtualSensorCallback = virtualSensorCallback;
        mDefaultRecentsPolicy = defaultRecentsPolicy;
        mAudioPlaybackSessionId = audioPlaybackSessionId;
        mAudioRecordingSessionId = audioRecordingSessionId;

    }

    @SuppressWarnings("unchecked")
@@ -259,7 +254,6 @@ public final class VirtualDeviceParams implements Parcelable {
        parcel.readTypedList(mVirtualSensorConfigs, VirtualSensorConfig.CREATOR);
        mVirtualSensorCallback =
                IVirtualSensorCallback.Stub.asInterface(parcel.readStrongBinder());
        mDefaultRecentsPolicy = parcel.readInt();
        mAudioPlaybackSessionId = parcel.readInt();
        mAudioRecordingSessionId = parcel.readInt();
    }
@@ -395,16 +389,6 @@ public final class VirtualDeviceParams implements Parcelable {
        return mVirtualSensorCallback;
    }

    /**
     * Returns the policy of how to handle activities in recents.
     *
     * @see RecentsPolicy
     */
    @RecentsPolicy
    public int getDefaultRecentsPolicy() {
        return mDefaultRecentsPolicy;
    }

    /**
     * Returns device-specific audio session id for playback.
     *
@@ -443,7 +427,6 @@ public final class VirtualDeviceParams implements Parcelable {
        dest.writeTypedList(mVirtualSensorConfigs);
        dest.writeStrongBinder(
                mVirtualSensorCallback != null ? mVirtualSensorCallback.asBinder() : null);
        dest.writeInt(mDefaultRecentsPolicy);
        dest.writeInt(mAudioPlaybackSessionId);
        dest.writeInt(mAudioRecordingSessionId);
    }
@@ -478,7 +461,6 @@ public final class VirtualDeviceParams implements Parcelable {
                && Objects.equals(mBlockedActivities, that.mBlockedActivities)
                && mDefaultActivityPolicy == that.mDefaultActivityPolicy
                && Objects.equals(mName, that.mName)
                && mDefaultRecentsPolicy == that.mDefaultRecentsPolicy
                && mAudioPlaybackSessionId == that.mAudioPlaybackSessionId
                && mAudioRecordingSessionId == that.mAudioRecordingSessionId;
    }
@@ -489,7 +471,7 @@ public final class VirtualDeviceParams implements Parcelable {
                mLockState, mUsersWithMatchingAccounts, mAllowedCrossTaskNavigations,
                mBlockedCrossTaskNavigations, mDefaultNavigationPolicy, mAllowedActivities,
                mBlockedActivities, mDefaultActivityPolicy, mName, mDevicePolicies,
                mDefaultRecentsPolicy, mAudioPlaybackSessionId, mAudioRecordingSessionId);
                mAudioPlaybackSessionId, mAudioRecordingSessionId);
        for (int i = 0; i < mDevicePolicies.size(); i++) {
            hashCode = 31 * hashCode + mDevicePolicies.keyAt(i);
            hashCode = 31 * hashCode + mDevicePolicies.valueAt(i);
@@ -511,7 +493,6 @@ public final class VirtualDeviceParams implements Parcelable {
                + " mDefaultActivityPolicy=" + mDefaultActivityPolicy
                + " mName=" + mName
                + " mDevicePolicies=" + mDevicePolicies
                + " mDefaultRecentsPolicy=" + mDefaultRecentsPolicy
                + " mAudioPlaybackSessionId=" + mAudioPlaybackSessionId
                + " mAudioRecordingSessionId=" + mAudioRecordingSessionId
                + ")";
@@ -548,7 +529,6 @@ public final class VirtualDeviceParams implements Parcelable {
        private boolean mDefaultActivityPolicyConfigured = false;
        @Nullable private String mName;
        @NonNull private SparseIntArray mDevicePolicies = new SparseIntArray();
        private int mDefaultRecentsPolicy;
        private int mAudioPlaybackSessionId = AUDIO_SESSION_ID_GENERATE;
        private int mAudioRecordingSessionId = AUDIO_SESSION_ID_GENERATE;

@@ -820,17 +800,6 @@ public final class VirtualDeviceParams implements Parcelable {
            return this;
        }

        /**
         * Sets the policy to indicate how activities are handled in recents.
         *
         * @param defaultRecentsPolicy A policy specifying how to handle activities in recents.
         */
        @NonNull
        public Builder setDefaultRecentsPolicy(@RecentsPolicy int defaultRecentsPolicy) {
            mDefaultRecentsPolicy = defaultRecentsPolicy;
            return this;
        }

        /**
         * Sets audio playback session id specific for this virtual device.
         *
@@ -933,7 +902,6 @@ public final class VirtualDeviceParams implements Parcelable {
                    mDevicePolicies,
                    mVirtualSensorConfigs,
                    mVirtualSensorCallback,
                    mDefaultRecentsPolicy,
                    mAudioPlaybackSessionId,
                    mAudioRecordingSessionId);
        }
+6 −8
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.server.companion.virtual;

import static android.companion.virtual.VirtualDeviceParams.RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS;
import static android.content.pm.ActivityInfo.FLAG_CAN_DISPLAY_ON_REMOTE_DEVICES;
import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
@@ -29,7 +28,6 @@ import android.app.compat.CompatChanges;
import android.companion.virtual.VirtualDeviceManager.ActivityListener;
import android.companion.virtual.VirtualDeviceParams;
import android.companion.virtual.VirtualDeviceParams.ActivityPolicy;
import android.companion.virtual.VirtualDeviceParams.RecentsPolicy;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledSince;
import android.content.ComponentName;
@@ -137,8 +135,8 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
            new ArraySet<>();
    @Nullable private final SecureWindowCallback mSecureWindowCallback;
    @Nullable private final List<String> mDisplayCategories;
    @RecentsPolicy
    private final int mDefaultRecentsPolicy;

    private final boolean mShowTasksInHostDeviceRecents;

    /**
     * Creates a window policy controller that is generic to the different use cases of virtual
@@ -166,7 +164,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
     *   virtual display.
     * @param intentListenerCallback Callback that is called to intercept intents when matching
     *   passed in filters.
     * @param defaultRecentsPolicy a policy to indicate how to handle activities in recents.
     * @param showTasksInHostDeviceRecents whether to show activities in recents on the host device.
     */
    public GenericWindowPolicyController(int windowFlags, int systemWindowFlags,
            @NonNull ArraySet<UserHandle> allowedUsers,
@@ -181,7 +179,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
            @NonNull SecureWindowCallback secureWindowCallback,
            @NonNull IntentListenerCallback intentListenerCallback,
            @NonNull List<String> displayCategories,
            @RecentsPolicy int defaultRecentsPolicy) {
            boolean showTasksInHostDeviceRecents) {
        super();
        mAllowedUsers = allowedUsers;
        mAllowedCrossTaskNavigations = new ArraySet<>(allowedCrossTaskNavigations);
@@ -196,7 +194,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
        mSecureWindowCallback = secureWindowCallback;
        mIntentListenerCallback = intentListenerCallback;
        mDisplayCategories = displayCategories;
        mDefaultRecentsPolicy = defaultRecentsPolicy;
        mShowTasksInHostDeviceRecents = showTasksInHostDeviceRecents;
    }

    /**
@@ -337,7 +335,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController

    @Override
    public boolean canShowTasksInHostDeviceRecents() {
        return (mDefaultRecentsPolicy & RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS) != 0;
        return mShowTasksInHostDeviceRecents;
    }

    @Override
+3 −1
Original line number Diff line number Diff line
@@ -847,7 +847,9 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
                        this::onSecureWindowShown,
                        this::shouldInterceptIntent,
                        displayCategories,
                        mParams.getDefaultRecentsPolicy());
                        mParams.getDevicePolicy(
                                VirtualDeviceParams.POLICY_TYPE_RECENTS)
                                == VirtualDeviceParams.DEVICE_POLICY_DEFAULT);
        gwpc.registerRunningAppsChangedListener(/* listener= */ this);
        return gwpc;
    }
+38 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.companion.virtual;

import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM;
import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT;
import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_RECENTS;
import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_SENSORS;
import static android.content.Context.DEVICE_ID_DEFAULT;
import static android.content.Context.DEVICE_ID_INVALID;
@@ -117,6 +118,7 @@ import com.android.server.sensors.SensorManagerInternal;

import com.google.android.collect.Sets;

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -372,6 +374,11 @@ public class VirtualDeviceManagerServiceTest {
        mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1);
    }

    @After
    public void tearDown() {
        mDeviceImpl.close();
    }

    @Test
    public void getDeviceIdForDisplayId_invalidDisplayId_returnsDefault() {
        assertThat(mVdm.getDeviceIdForDisplayId(Display.INVALID_DISPLAY))
@@ -444,12 +451,42 @@ public class VirtualDeviceManagerServiceTest {
                .setBlockedActivities(getBlockedActivities())
                .setDevicePolicy(POLICY_TYPE_SENSORS, DEVICE_POLICY_CUSTOM)
                .build();
        mDeviceImpl.close();
        mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1, params);

        assertThat(mVdm.getDevicePolicy(mDeviceImpl.getDeviceId(), POLICY_TYPE_SENSORS))
                .isEqualTo(DEVICE_POLICY_CUSTOM);
    }

    @Test
    public void getDevicePolicy_defaultRecentsPolicy_gwpcCanShowRecentsOnHostDevice() {
        VirtualDeviceParams params = new VirtualDeviceParams
                .Builder()
                .build();
        mDeviceImpl.close();
        mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1, params);
        addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1);

        GenericWindowPolicyController gwpc =
                mDeviceImpl.getDisplayWindowPolicyControllerForTest(DISPLAY_ID_1);
        assertThat(gwpc.canShowTasksInHostDeviceRecents()).isTrue();
    }

    @Test
    public void getDevicePolicy_customRecentsPolicy_gwpcCannotShowRecentsOnHostDevice() {
        VirtualDeviceParams params = new VirtualDeviceParams
                .Builder()
                .setDevicePolicy(POLICY_TYPE_RECENTS, DEVICE_POLICY_CUSTOM)
                .build();
        mDeviceImpl.close();
        mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1, params);
        addVirtualDisplay(mDeviceImpl, DISPLAY_ID_1);

        GenericWindowPolicyController gwpc =
                mDeviceImpl.getDisplayWindowPolicyControllerForTest(DISPLAY_ID_1);
        assertThat(gwpc.canShowTasksInHostDeviceRecents()).isFalse();
    }

    @Test
    public void getDeviceOwnerUid_oneDevice_returnsCorrectId() {
        int ownerUid = mLocalService.getDeviceOwnerUid(mDeviceImpl.getDeviceId());
@@ -501,6 +538,7 @@ public class VirtualDeviceManagerServiceTest {

        doReturn(SENSOR_HANDLE).when(mSensorManagerInternalMock).createRuntimeSensor(
                anyInt(), anyInt(), anyString(), anyString(), anyInt(), any());
        mDeviceImpl.close();
        mDeviceImpl = createVirtualDevice(VIRTUAL_DEVICE_ID_1, DEVICE_OWNER_UID_1, params);

        VirtualSensor sensor = mLocalService.getVirtualSensor(VIRTUAL_DEVICE_ID_1, SENSOR_HANDLE);
Loading