Merge "Use DeviceProfile to determine whether to exclude tasks from Recent" into tm-dev
This commit is contained in:
@@ -125,6 +125,11 @@ public abstract class DisplayWindowPolicyController {
|
|||||||
public abstract boolean keepActivityOnWindowFlagsChanged(
|
public abstract boolean keepActivityOnWindowFlagsChanged(
|
||||||
ActivityInfo activityInfo, int windowFlags, int systemWindowFlags);
|
ActivityInfo activityInfo, int windowFlags, int systemWindowFlags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns {@code true} if the tasks which is on this virtual display can be showed on Recents.
|
||||||
|
*/
|
||||||
|
public abstract boolean canShowTasksInRecents();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is called when the top activity of the display is changed.
|
* This is called when the top activity of the display is changed.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.server.companion.virtual;
|
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.content.pm.ActivityInfo.FLAG_CAN_DISPLAY_ON_REMOTE_DEVICES;
|
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.FLAG_SECURE;
|
||||||
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
|
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
|
||||||
@@ -24,6 +26,7 @@ import android.annotation.NonNull;
|
|||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.app.WindowConfiguration;
|
import android.app.WindowConfiguration;
|
||||||
import android.app.compat.CompatChanges;
|
import android.app.compat.CompatChanges;
|
||||||
|
import android.companion.AssociationRequest;
|
||||||
import android.companion.virtual.VirtualDeviceManager.ActivityListener;
|
import android.companion.virtual.VirtualDeviceManager.ActivityListener;
|
||||||
import android.companion.virtual.VirtualDeviceParams;
|
import android.companion.virtual.VirtualDeviceParams;
|
||||||
import android.companion.virtual.VirtualDeviceParams.ActivityPolicy;
|
import android.companion.virtual.VirtualDeviceParams.ActivityPolicy;
|
||||||
@@ -95,6 +98,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
|
|||||||
private final Handler mHandler = new Handler(Looper.getMainLooper());
|
private final Handler mHandler = new Handler(Looper.getMainLooper());
|
||||||
private final ArraySet<RunningAppsChangedListener> mRunningAppsChangedListener =
|
private final ArraySet<RunningAppsChangedListener> mRunningAppsChangedListener =
|
||||||
new ArraySet<>();
|
new ArraySet<>();
|
||||||
|
private final @AssociationRequest.DeviceProfile String mDeviceProfile;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a window policy controller that is generic to the different use cases of virtual
|
* Creates a window policy controller that is generic to the different use cases of virtual
|
||||||
@@ -119,6 +123,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
|
|||||||
* is not populated in this callback and is always {@link Display#INVALID_DISPLAY}.
|
* is not populated in this callback and is always {@link Display#INVALID_DISPLAY}.
|
||||||
* @param activityBlockedCallback Callback that is called when an activity is blocked from
|
* @param activityBlockedCallback Callback that is called when an activity is blocked from
|
||||||
* launching.
|
* launching.
|
||||||
|
* @param deviceProfile The {@link AssociationRequest.DeviceProfile} of this virtual device.
|
||||||
*/
|
*/
|
||||||
public GenericWindowPolicyController(int windowFlags, int systemWindowFlags,
|
public GenericWindowPolicyController(int windowFlags, int systemWindowFlags,
|
||||||
@NonNull ArraySet<UserHandle> allowedUsers,
|
@NonNull ArraySet<UserHandle> allowedUsers,
|
||||||
@@ -128,7 +133,8 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
|
|||||||
@NonNull Set<ComponentName> blockedActivities,
|
@NonNull Set<ComponentName> blockedActivities,
|
||||||
@ActivityPolicy int defaultActivityPolicy,
|
@ActivityPolicy int defaultActivityPolicy,
|
||||||
@NonNull ActivityListener activityListener,
|
@NonNull ActivityListener activityListener,
|
||||||
@NonNull Consumer<ActivityInfo> activityBlockedCallback) {
|
@NonNull Consumer<ActivityInfo> activityBlockedCallback,
|
||||||
|
@AssociationRequest.DeviceProfile String deviceProfile) {
|
||||||
super();
|
super();
|
||||||
mAllowedUsers = allowedUsers;
|
mAllowedUsers = allowedUsers;
|
||||||
mAllowedCrossTaskNavigations = new ArraySet<>(allowedCrossTaskNavigations);
|
mAllowedCrossTaskNavigations = new ArraySet<>(allowedCrossTaskNavigations);
|
||||||
@@ -139,6 +145,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
|
|||||||
mActivityBlockedCallback = activityBlockedCallback;
|
mActivityBlockedCallback = activityBlockedCallback;
|
||||||
setInterestedWindowFlags(windowFlags, systemWindowFlags);
|
setInterestedWindowFlags(windowFlags, systemWindowFlags);
|
||||||
mActivityListener = activityListener;
|
mActivityListener = activityListener;
|
||||||
|
mDeviceProfile = deviceProfile;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Register a listener for running applications changes. */
|
/** Register a listener for running applications changes. */
|
||||||
@@ -248,6 +255,18 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canShowTasksInRecents() {
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if an app with the given UID has an activity running on the virtual display for
|
* Returns true if an app with the given UID has an activity running on the virtual display for
|
||||||
* this controller.
|
* this controller.
|
||||||
|
|||||||
@@ -557,7 +557,8 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
|
|||||||
mParams.getBlockedActivities(),
|
mParams.getBlockedActivities(),
|
||||||
mParams.getDefaultActivityPolicy(),
|
mParams.getDefaultActivityPolicy(),
|
||||||
createListenerAdapter(displayId),
|
createListenerAdapter(displayId),
|
||||||
activityInfo -> onActivityBlocked(displayId, activityInfo));
|
activityInfo -> onActivityBlocked(displayId, activityInfo),
|
||||||
|
mAssociationInfo.getDeviceProfile());
|
||||||
gwpc.registerRunningAppsChangedListener(/* listener= */ this);
|
gwpc.registerRunningAppsChangedListener(/* listener= */ this);
|
||||||
mWindowPolicyControllers.put(displayId, gwpc);
|
mWindowPolicyControllers.put(displayId, gwpc);
|
||||||
return gwpc;
|
return gwpc;
|
||||||
|
|||||||
@@ -225,6 +225,7 @@ import android.view.WindowInsets;
|
|||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.view.WindowManager.DisplayImePolicy;
|
import android.view.WindowManager.DisplayImePolicy;
|
||||||
import android.view.WindowManagerPolicyConstants.PointerEventListener;
|
import android.view.WindowManagerPolicyConstants.PointerEventListener;
|
||||||
|
import android.window.DisplayWindowPolicyController;
|
||||||
import android.window.IDisplayAreaOrganizer;
|
import android.window.IDisplayAreaOrganizer;
|
||||||
import android.window.TransitionRequestInfo;
|
import android.window.TransitionRequestInfo;
|
||||||
|
|
||||||
@@ -1959,6 +1960,16 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
|||||||
return mDisplayRotation.updateRotationUnchecked(false /* forceUpdate */);
|
return mDisplayRotation.updateRotationUnchecked(false /* forceUpdate */);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see DisplayWindowPolicyController#canShowTasksInRecents()
|
||||||
|
*/
|
||||||
|
boolean canShowTasksInRecents() {
|
||||||
|
if (mDwpcHelper == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return mDwpcHelper.canShowTasksInRecents();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies the rotation transaction. This must be called after {@link #updateRotationUnchecked}
|
* Applies the rotation transaction. This must be called after {@link #updateRotationUnchecked}
|
||||||
* (if it returned {@code true}) to actually finish the rotation.
|
* (if it returned {@code true}) to actually finish the rotation.
|
||||||
|
|||||||
@@ -152,6 +152,16 @@ class DisplayWindowPolicyControllerHelper {
|
|||||||
return mDisplayWindowPolicyController.isWindowingModeSupported(windowingMode);
|
return mDisplayWindowPolicyController.isWindowingModeSupported(windowingMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see DisplayWindowPolicyController#canShowTasksInRecents()
|
||||||
|
*/
|
||||||
|
public final boolean canShowTasksInRecents() {
|
||||||
|
if (mDisplayWindowPolicyController == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return mDisplayWindowPolicyController.canShowTasksInRecents();
|
||||||
|
}
|
||||||
|
|
||||||
void dump(String prefix, PrintWriter pw) {
|
void dump(String prefix, PrintWriter pw) {
|
||||||
if (mDisplayWindowPolicyController != null) {
|
if (mDisplayWindowPolicyController != null) {
|
||||||
pw.println();
|
pw.println();
|
||||||
|
|||||||
@@ -1390,6 +1390,13 @@ class RecentTasks {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1399,13 +1406,19 @@ class RecentTasks {
|
|||||||
private boolean isInVisibleRange(Task task, int taskIndex, int numVisibleTasks,
|
private boolean isInVisibleRange(Task task, int taskIndex, int numVisibleTasks,
|
||||||
boolean skipExcludedCheck) {
|
boolean skipExcludedCheck) {
|
||||||
if (!skipExcludedCheck) {
|
if (!skipExcludedCheck) {
|
||||||
// Keep the most recent task even if it is excluded from recents
|
// Keep the most recent task of home display even if it is excluded from recents.
|
||||||
final boolean isExcludeFromRecents =
|
final boolean isExcludeFromRecents =
|
||||||
(task.getBaseIntent().getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
|
(task.getBaseIntent().getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
|
||||||
== FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
|
== FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
|
||||||
if (isExcludeFromRecents) {
|
if (isExcludeFromRecents) {
|
||||||
if (DEBUG_RECENTS_TRIM_TASKS) Slog.d(TAG, "\texcludeFromRecents=true");
|
if (DEBUG_RECENTS_TRIM_TASKS) {
|
||||||
return taskIndex == 0;
|
Slog.d(TAG,
|
||||||
|
"\texcludeFromRecents=true, taskIndex = " + taskIndex
|
||||||
|
+ ", isOnHomeDisplay: " + task.isOnHomeDisplay());
|
||||||
|
}
|
||||||
|
// The Recents is only supported on default display now, we should only keep the
|
||||||
|
// most recent task of home display.
|
||||||
|
return (task.isOnHomeDisplay() && taskIndex == 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.server.companion.virtual.audio;
|
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.AudioAttributes.FLAG_SECURE;
|
||||||
import static android.media.AudioPlaybackConfiguration.PLAYER_STATE_STARTED;
|
import static android.media.AudioPlaybackConfiguration.PLAYER_STATE_STARTED;
|
||||||
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
|
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
|
||||||
@@ -81,7 +82,8 @@ public class VirtualAudioControllerTest {
|
|||||||
/* blockedActivities= */ new ArraySet<>(),
|
/* blockedActivities= */ new ArraySet<>(),
|
||||||
VirtualDeviceParams.ACTIVITY_POLICY_DEFAULT_ALLOWED,
|
VirtualDeviceParams.ACTIVITY_POLICY_DEFAULT_ALLOWED,
|
||||||
/* activityListener= */ null,
|
/* activityListener= */ null,
|
||||||
/* activityBlockedCallback= */ null);
|
/* activityBlockedCallback= */ null,
|
||||||
|
/* deviceProfile= */ DEVICE_PROFILE_APP_STREAMING);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -242,5 +242,10 @@ public class DisplayWindowPolicyControllerTests extends WindowTestsBase {
|
|||||||
mRunningUids.clear();
|
mRunningUids.clear();
|
||||||
mRunningUids.addAll(runningUids);
|
mRunningUids.addAll(runningUids);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canShowTasksInRecents() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -690,6 +690,20 @@ public class RecentTasksTest extends WindowTestsBase {
|
|||||||
assertGetRecentTasksOrder(0 /* flags */, excludedTask1);
|
assertGetRecentTasksOrder(0 /* flags */, excludedTask1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testVisibleTasks_excludedFromRecents_nonDefaultDisplayTaskNotVisible() {
|
||||||
|
Task excludedTaskOnVirtualDisplay = createTaskBuilder(".excludedTaskOnVirtualDisplay")
|
||||||
|
.setFlags(FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
|
||||||
|
.build();
|
||||||
|
excludedTaskOnVirtualDisplay.mUserSetupComplete = true;
|
||||||
|
doReturn(false).when(excludedTaskOnVirtualDisplay).isOnHomeDisplay();
|
||||||
|
mRecentTasks.add(mTasks.get(0));
|
||||||
|
mRecentTasks.add(excludedTaskOnVirtualDisplay);
|
||||||
|
|
||||||
|
// Expect that the first visible excluded-from-recents task is visible
|
||||||
|
assertGetRecentTasksOrder(0 /* flags */, mTasks.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testVisibleTasks_excludedFromRecents_withExcluded() {
|
public void testVisibleTasks_excludedFromRecents_withExcluded() {
|
||||||
// Create some set of tasks, some of which are visible and some are not
|
// Create some set of tasks, some of which are visible and some are not
|
||||||
@@ -801,6 +815,17 @@ public class RecentTasksTest extends WindowTestsBase {
|
|||||||
mRecentTasks.isVisibleRecentTask(task));
|
mRecentTasks.isVisibleRecentTask(task));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testVisibleTask_displayCanNotShowTaskFromRecents_expectNotVisible() {
|
||||||
|
final DisplayContent displayContent = addNewDisplayContentAt(DisplayContent.POSITION_TOP);
|
||||||
|
doReturn(false).when(displayContent).canShowTasksInRecents();
|
||||||
|
final Task task = displayContent.getDefaultTaskDisplayArea().createRootTask(
|
||||||
|
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */);
|
||||||
|
mRecentTasks.add(task);
|
||||||
|
|
||||||
|
assertFalse(mRecentTasks.isVisibleRecentTask(task));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFreezeTaskListOrder_reorderExistingTask() {
|
public void testFreezeTaskListOrder_reorderExistingTask() {
|
||||||
// Add some tasks
|
// Add some tasks
|
||||||
|
|||||||
Reference in New Issue
Block a user