diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 5c4fa590530be..37f87db7a4180 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -3247,7 +3247,6 @@ package android.companion.virtual { method @NonNull public java.util.Set 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); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setBlockedCrossTaskNavigations(@NonNull java.util.Set); - 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); diff --git a/core/java/android/companion/virtual/VirtualDeviceParams.java b/core/java/android/companion/virtual/VirtualDeviceParams.java index 9f3b60148004b..3a60a695a2947 100644 --- a/core/java/android/companion/virtual/VirtualDeviceParams.java +++ b/core/java/android/companion/virtual/VirtualDeviceParams.java @@ -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 { *
  • {@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. - *
      + *
    */ 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. + * + *
      + *
    • {@link #DEVICE_POLICY_DEFAULT}: Activities launched on VirtualDisplays owned by this + * device will appear in the host device recents. + *
    • {@link #DEVICE_POLICY_CUSTOM}: Activities launched on VirtualDisplays owned by this + * * device will not appear in recents. + *
    */ - 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 mUsersWithMatchingAccounts; @@ -201,8 +201,6 @@ public final class VirtualDeviceParams implements Parcelable { @NonNull private final SparseIntArray mDevicePolicies; @NonNull private final List 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 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); } diff --git a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java index e52f1d9c61db3..1c4602803426f 100644 --- a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +++ b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java @@ -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 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 allowedUsers, @@ -181,7 +179,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @NonNull SecureWindowCallback secureWindowCallback, @NonNull IntentListenerCallback intentListenerCallback, @NonNull List 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 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 ee1b1fd4a500b..2d010cf66e9be 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java @@ -846,7 +846,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; } diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java index 09a84da9406a3..2967c5c53e8ad 100644 --- a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java @@ -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); diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java index 7b5af1e0fe98a..d9e4da73c1c30 100644 --- a/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java @@ -90,8 +90,7 @@ public class VirtualAudioControllerTest { /* secureWindowCallback= */ null, /* intentListenerCallback= */ null, /* displayCategories= */ new ArrayList<>(), - /* recentsPolicy= */ - VirtualDeviceParams.RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS); + /* showTasksInHostDeviceRecents= */ true); }