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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -243,7 +243,7 @@ public class DisplayWindowPolicyControllerTests extends WindowTestsBase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canShowTasksInRecents() {
|
||||
public boolean canShowTasksInHostDeviceRecents() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user