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
This commit is contained in:
Iris Yang
2022-08-23 15:46:34 +08:00
parent 7d87534508
commit 111c9923e0
11 changed files with 80 additions and 42 deletions

View File

@@ -2978,6 +2978,7 @@ 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();
@@ -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<android.content.ComponentName>);
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);

View File

@@ -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<UserHandle> mUsersWithMatchingAccounts;
@NonNull private final ArraySet<ComponentName> 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<VirtualSensorConfig> 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<VirtualSensorConfig> virtualSensorConfigs) {
@NonNull List<VirtualSensorConfig> 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<VirtualSensorConfig> 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);
}
}
}

View File

@@ -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.

View File

@@ -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<RunningAppsChangedListener> mRunningAppsChangedListeners =
new ArraySet<>();
@Nullable
private final @AssociationRequest.DeviceProfile String mDeviceProfile;
@Nullable private final SecureWindowCallback mSecureWindowCallback;
@Nullable private final List<String> 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<UserHandle> 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<String> displayCategories) {
@NonNull List<String> 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

View File

@@ -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;
}

View File

@@ -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();
}
/**

View File

@@ -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();
}
/**

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -243,7 +243,7 @@ public class DisplayWindowPolicyControllerTests extends WindowTestsBase {
}
@Override
public boolean canShowTasksInRecents() {
public boolean canShowTasksInHostDeviceRecents() {
return true;
}

View File

@@ -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);