From 111c9923e0e34cb80bcf041985f1a1ef02cadc13 Mon Sep 17 00:00:00 2001 From: Iris Yang Date: Tue, 23 Aug 2022 15:46:34 +0800 Subject: [PATCH] Specify the tasks should be exculded from Recents or not Add API setRecentsPolicy in VirtualDeviceParams to give a display owner to be able to indicate that any activity/task on their display should be excluded from recents or not. Bug: 234075973 Test: atest VirtualDeviceParamsTest Change-Id: Iae71bafbd285c7a9dca07c084e30a7c72f735958 --- core/api/system-current.txt | 3 + .../virtual/VirtualDeviceParams.java | 55 +++++++++++++++++-- .../window/DisplayWindowPolicyController.java | 5 +- .../GenericWindowPolicyController.java | 31 ++++------- .../companion/virtual/VirtualDeviceImpl.java | 4 +- .../com/android/server/wm/DisplayContent.java | 6 +- .../DisplayWindowPolicyControllerHelper.java | 6 +- .../com/android/server/wm/RecentTasks.java | 2 +- .../audio/VirtualAudioControllerTest.java | 6 +- .../DisplayWindowPolicyControllerTests.java | 2 +- .../android/server/wm/RecentTasksTest.java | 2 +- 11 files changed, 80 insertions(+), 42 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 5155b48b2e1da..154dcb70a941e 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -2978,6 +2978,7 @@ 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(); @@ -2994,6 +2995,7 @@ 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_SENSORS = 0; // 0x0 + field public static final int RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS = 1; // 0x1 } public static final class VirtualDeviceParams.Builder { @@ -3004,6 +3006,7 @@ package android.companion.virtual { method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setAllowedCrossTaskNavigations(@NonNull java.util.Set); 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 e2b5c5d74efe4..82cc55a39eef5 100644 --- a/core/java/android/companion/virtual/VirtualDeviceParams.java +++ b/core/java/android/companion/virtual/VirtualDeviceParams.java @@ -147,6 +147,19 @@ public final class VirtualDeviceParams implements Parcelable { */ public static final int POLICY_TYPE_SENSORS = 0; + /** @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. + */ + public static final int RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS = 1 << 0; + private final int mLockState; @NonNull private final ArraySet mUsersWithMatchingAccounts; @NonNull private final ArraySet mAllowedCrossTaskNavigations; @@ -161,6 +174,8 @@ public final class VirtualDeviceParams implements Parcelable { // Mapping of @PolicyType to @DevicePolicy @NonNull private final SparseIntArray mDevicePolicies; @NonNull private final List mVirtualSensorConfigs; + @RecentsPolicy + private final int mDefaultRecentsPolicy; private VirtualDeviceParams( @LockState int lockState, @@ -173,7 +188,8 @@ public final class VirtualDeviceParams implements Parcelable { @ActivityPolicy int defaultActivityPolicy, @Nullable String name, @NonNull SparseIntArray devicePolicies, - @NonNull List virtualSensorConfigs) { + @NonNull List virtualSensorConfigs, + @RecentsPolicy int defaultRecentsPolicy) { mLockState = lockState; mUsersWithMatchingAccounts = new ArraySet<>(Objects.requireNonNull(usersWithMatchingAccounts)); @@ -188,6 +204,7 @@ public final class VirtualDeviceParams implements Parcelable { mName = name; mDevicePolicies = Objects.requireNonNull(devicePolicies); mVirtualSensorConfigs = Objects.requireNonNull(virtualSensorConfigs); + mDefaultRecentsPolicy = defaultRecentsPolicy; } @SuppressWarnings("unchecked") @@ -204,6 +221,7 @@ public final class VirtualDeviceParams implements Parcelable { mDevicePolicies = parcel.readSparseIntArray(); mVirtualSensorConfigs = new ArrayList<>(); parcel.readTypedList(mVirtualSensorConfigs, VirtualSensorConfig.CREATOR); + mDefaultRecentsPolicy = parcel.readInt(); } /** @@ -328,6 +346,16 @@ public final class VirtualDeviceParams implements Parcelable { return mVirtualSensorConfigs; } + /** + * Returns the policy of how to handle activities in recents. + * + * @see RecentsPolicy + */ + @RecentsPolicy + public int getDefaultRecentsPolicy() { + return mDefaultRecentsPolicy; + } + @Override public int describeContents() { return 0; @@ -346,6 +374,7 @@ public final class VirtualDeviceParams implements Parcelable { dest.writeString8(mName); dest.writeSparseIntArray(mDevicePolicies); dest.writeTypedList(mVirtualSensorConfigs); + dest.writeInt(mDefaultRecentsPolicy); } @Override @@ -377,15 +406,17 @@ public final class VirtualDeviceParams implements Parcelable { && Objects.equals(mAllowedActivities, that.mAllowedActivities) && Objects.equals(mBlockedActivities, that.mBlockedActivities) && mDefaultActivityPolicy == that.mDefaultActivityPolicy - && Objects.equals(mName, that.mName); + && Objects.equals(mName, that.mName) + && mDefaultRecentsPolicy == that.mDefaultRecentsPolicy; } @Override public int hashCode() { int hashCode = Objects.hash( mLockState, mUsersWithMatchingAccounts, mAllowedCrossTaskNavigations, - mBlockedCrossTaskNavigations, mDefaultNavigationPolicy, mAllowedActivities, - mBlockedActivities, mDefaultActivityPolicy, mName, mDevicePolicies); + mBlockedCrossTaskNavigations, mDefaultNavigationPolicy, mAllowedActivities, + mBlockedActivities, mDefaultActivityPolicy, mName, mDevicePolicies, + mDefaultRecentsPolicy); for (int i = 0; i < mDevicePolicies.size(); i++) { hashCode = 31 * hashCode + mDevicePolicies.keyAt(i); hashCode = 31 * hashCode + mDevicePolicies.valueAt(i); @@ -407,6 +438,7 @@ public final class VirtualDeviceParams implements Parcelable { + " mDefaultActivityPolicy=" + mDefaultActivityPolicy + " mName=" + mName + " mDevicePolicies=" + mDevicePolicies + + " mDefaultRecentsPolicy=" + mDefaultRecentsPolicy + ")"; } @@ -442,6 +474,7 @@ public final class VirtualDeviceParams implements Parcelable { @Nullable private String mName; @NonNull private SparseIntArray mDevicePolicies = new SparseIntArray(); @NonNull private List mVirtualSensorConfigs = new ArrayList<>(); + private int mDefaultRecentsPolicy; /** * Sets the lock state of the device. The permission {@code ADD_ALWAYS_UNLOCKED_DISPLAY} @@ -646,6 +679,17 @@ 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; + } + /** * Builds the {@link VirtualDeviceParams} instance. * @@ -684,7 +728,8 @@ public final class VirtualDeviceParams implements Parcelable { mDefaultActivityPolicy, mName, mDevicePolicies, - mVirtualSensorConfigs); + mVirtualSensorConfigs, + mDefaultRecentsPolicy); } } } diff --git a/core/java/android/window/DisplayWindowPolicyController.java b/core/java/android/window/DisplayWindowPolicyController.java index f55932eb05fd8..e027934ccb515 100644 --- a/core/java/android/window/DisplayWindowPolicyController.java +++ b/core/java/android/window/DisplayWindowPolicyController.java @@ -128,9 +128,10 @@ public abstract class DisplayWindowPolicyController { ActivityInfo activityInfo, int windowFlags, int systemWindowFlags); /** - * Returns {@code true} if the tasks which is on this virtual display can be showed on Recents. + * Returns {@code true} if the tasks which is on this virtual display can be showed in the + * host device of the recently launched activities list. */ - public abstract boolean canShowTasksInRecents(); + public abstract boolean canShowTasksInHostDeviceRecents(); /** * This is called when the top activity of the display is changed. 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 28141960f1198..f34ffe8311864 100644 --- a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +++ b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java @@ -16,8 +16,7 @@ package com.android.server.companion.virtual; -import static android.companion.AssociationRequest.DEVICE_PROFILE_APP_STREAMING; -import static android.companion.AssociationRequest.DEVICE_PROFILE_AUTOMOTIVE_PROJECTION; +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; @@ -26,10 +25,10 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.WindowConfiguration; import android.app.compat.CompatChanges; -import android.companion.AssociationRequest; 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; @@ -127,10 +126,10 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @GuardedBy("mGenericWindowPolicyControllerLock") private final ArraySet mRunningAppsChangedListeners = new ArraySet<>(); - @Nullable - private final @AssociationRequest.DeviceProfile String mDeviceProfile; @Nullable private final SecureWindowCallback mSecureWindowCallback; @Nullable private final List mDisplayCategories; + @RecentsPolicy + private final int mDefaultRecentsPolicy; /** * Creates a window policy controller that is generic to the different use cases of virtual @@ -156,7 +155,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController * launching. * @param secureWindowCallback Callback that is called when a secure window shows on the * virtual display. - * @param deviceProfile The {@link AssociationRequest.DeviceProfile} of this virtual device. + * @param defaultRecentsPolicy a policy to indicate how to handle activities in recents. */ public GenericWindowPolicyController(int windowFlags, int systemWindowFlags, @NonNull ArraySet allowedUsers, @@ -169,8 +168,8 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @NonNull PipBlockedCallback pipBlockedCallback, @NonNull ActivityBlockedCallback activityBlockedCallback, @NonNull SecureWindowCallback secureWindowCallback, - @AssociationRequest.DeviceProfile String deviceProfile, - @NonNull List displayCategories) { + @NonNull List displayCategories, + @RecentsPolicy int defaultRecentsPolicy) { super(); mAllowedUsers = allowedUsers; mAllowedCrossTaskNavigations = new ArraySet<>(allowedCrossTaskNavigations); @@ -181,10 +180,10 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController mActivityBlockedCallback = activityBlockedCallback; setInterestedWindowFlags(windowFlags, systemWindowFlags); mActivityListener = activityListener; - mDeviceProfile = deviceProfile; mPipBlockedCallback = pipBlockedCallback; mSecureWindowCallback = secureWindowCallback; mDisplayCategories = displayCategories; + mDefaultRecentsPolicy = defaultRecentsPolicy; } /** @@ -318,18 +317,8 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController } @Override - public boolean canShowTasksInRecents() { - if (mDeviceProfile == null) { - return true; - } - // TODO(b/234075973) : Remove this once proper API is ready. - switch (mDeviceProfile) { - case DEVICE_PROFILE_AUTOMOTIVE_PROJECTION: - return false; - case DEVICE_PROFILE_APP_STREAMING: - default: - return true; - } + public boolean canShowTasksInHostDeviceRecents() { + return (mDefaultRecentsPolicy & RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS) != 0; } @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 828f302e631ae..e269ede876d72 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java @@ -701,8 +701,8 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub this::onEnteringPipBlocked, this::onActivityBlocked, this::onSecureWindowShown, - mAssociationInfo.getDeviceProfile(), - displayCategories); + displayCategories, + mParams.getDefaultRecentsPolicy()); gwpc.registerRunningAppsChangedListener(/* listener= */ this); return gwpc; } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index d1122e14c57b9..631eae7d2cb9a 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2095,13 +2095,13 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } /** - * @see DisplayWindowPolicyController#canShowTasksInRecents() + * @see DisplayWindowPolicyController#canShowTasksInHostDeviceRecents() */ - boolean canShowTasksInRecents() { + boolean canShowTasksInHostDeviceRecents() { if (mDwpcHelper == null) { return true; } - return mDwpcHelper.canShowTasksInRecents(); + return mDwpcHelper.canShowTasksInHostDeviceRecents(); } /** diff --git a/services/core/java/com/android/server/wm/DisplayWindowPolicyControllerHelper.java b/services/core/java/com/android/server/wm/DisplayWindowPolicyControllerHelper.java index 6f821b55e54a4..69fd00cc660e7 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowPolicyControllerHelper.java +++ b/services/core/java/com/android/server/wm/DisplayWindowPolicyControllerHelper.java @@ -153,13 +153,13 @@ class DisplayWindowPolicyControllerHelper { } /** - * @see DisplayWindowPolicyController#canShowTasksInRecents() + * @see DisplayWindowPolicyController#canShowTasksInHostDeviceRecents() */ - public final boolean canShowTasksInRecents() { + public final boolean canShowTasksInHostDeviceRecents() { if (mDisplayWindowPolicyController == null) { return true; } - return mDisplayWindowPolicyController.canShowTasksInRecents(); + return mDisplayWindowPolicyController.canShowTasksInHostDeviceRecents(); } /** diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index 1fc061b2ca787..c827062ce70de 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -1393,7 +1393,7 @@ class RecentTasks { // Ignore the task if it is started on a display which is not allow to show its tasks on // Recents. if (task.getDisplayContent() != null - && !task.getDisplayContent().canShowTasksInRecents()) { + && !task.getDisplayContent().canShowTasksInHostDeviceRecents()) { return false; } 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 3ca648cbcc303..aaa13512af251 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 @@ -16,7 +16,6 @@ package com.android.server.companion.virtual.audio; -import static android.companion.AssociationRequest.DEVICE_PROFILE_APP_STREAMING; import static android.media.AudioAttributes.FLAG_SECURE; import static android.media.AudioPlaybackConfiguration.PLAYER_STATE_STARTED; import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; @@ -86,8 +85,9 @@ public class VirtualAudioControllerTest { /* pipBlockedCallback= */ null, /* activityBlockedCallback= */ null, /* secureWindowCallback= */ null, - /* deviceProfile= */ DEVICE_PROFILE_APP_STREAMING, - /* displayCategories= */ new ArrayList<>()); + /* displayCategories= */ new ArrayList<>(), + /* recentsPolicy= */ + VirtualDeviceParams.RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS); } diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowPolicyControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowPolicyControllerTests.java index db1d15a4584af..ba68a25a9fb47 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowPolicyControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowPolicyControllerTests.java @@ -243,7 +243,7 @@ public class DisplayWindowPolicyControllerTests extends WindowTestsBase { } @Override - public boolean canShowTasksInRecents() { + public boolean canShowTasksInHostDeviceRecents() { return true; } diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index ac2df62d6305e..6f2e3f2d32218 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -819,7 +819,7 @@ public class RecentTasksTest extends WindowTestsBase { @Test public void testVisibleTask_displayCanNotShowTaskFromRecents_expectNotVisible() { final DisplayContent displayContent = addNewDisplayContentAt(DisplayContent.POSITION_TOP); - doReturn(false).when(displayContent).canShowTasksInRecents(); + doReturn(false).when(displayContent).canShowTasksInHostDeviceRecents(); final Task task = displayContent.getDefaultTaskDisplayArea().createRootTask( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */); mRecentTasks.add(task);