Allow CTS test to control organized tasks
Changes to allow CTS test to control organized task so we can have the tests run the same way sys-ui is driving things now. Control is given back to sys-ui once the test is done running. Bug: 149338177 Test: atest CtsWindowManagerDeviceTestCases:SplitScreenTests Change-Id: I74a03ee3411f5b10ea4e26c1cc3c663dc394dd97
This commit is contained in:
@@ -503,6 +503,11 @@ package android.app {
|
||||
method public boolean isStatusBarExpansionDisabled();
|
||||
}
|
||||
|
||||
public class TaskInfo {
|
||||
method @NonNull public android.content.res.Configuration getConfiguration();
|
||||
method @NonNull public android.window.WindowContainerToken getToken();
|
||||
}
|
||||
|
||||
public class TimePickerDialog extends android.app.AlertDialog implements android.content.DialogInterface.OnClickListener android.widget.TimePicker.OnTimeChangedListener {
|
||||
method public android.widget.TimePicker getTimePicker();
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.annotation.TestApi;
|
||||
import android.compat.annotation.UnsupportedAppUsage;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
@@ -196,6 +197,20 @@ public class TaskInfo {
|
||||
return resizeMode != RESIZE_MODE_UNRESIZEABLE;
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
@NonNull
|
||||
@TestApi
|
||||
public WindowContainerToken getToken() {
|
||||
return token;
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
@NonNull
|
||||
@TestApi
|
||||
public Configuration getConfiguration() {
|
||||
return configuration;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the TaskInfo from a parcel.
|
||||
*/
|
||||
|
||||
@@ -4318,19 +4318,20 @@ class Task extends WindowContainer<WindowContainer> {
|
||||
// Let the old organizer know it has lost control.
|
||||
sendTaskVanished();
|
||||
mTaskOrganizer = organizer;
|
||||
sendTaskAppeared();
|
||||
onTaskOrganizerChanged();
|
||||
return true;
|
||||
}
|
||||
|
||||
void taskOrganizerUnregistered() {
|
||||
mTaskOrganizer = null;
|
||||
mTaskAppearedSent = false;
|
||||
mLastTaskOrganizerWindowingMode = -1;
|
||||
onTaskOrganizerChanged();
|
||||
if (mCreatedByOrganizer) {
|
||||
removeImmediately();
|
||||
if (mTaskOrganizer != null) {
|
||||
sendTaskAppeared();
|
||||
} else {
|
||||
// No longer managed by any organizer.
|
||||
mTaskAppearedSent = false;
|
||||
mLastTaskOrganizerWindowingMode = -1;
|
||||
setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, false /* set */);
|
||||
if (mCreatedByOrganizer) {
|
||||
removeImmediately();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -4367,14 +4368,6 @@ class Task extends WindowContainer<WindowContainer> {
|
||||
return result;
|
||||
}
|
||||
|
||||
private void onTaskOrganizerChanged() {
|
||||
if (mTaskOrganizer == null) {
|
||||
// If this task is no longer controlled by a task organizer, then reset the force hidden
|
||||
// state
|
||||
setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, false /* set */);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
void setSurfaceControl(SurfaceControl sc) {
|
||||
super.setSurfaceControl(sc);
|
||||
|
||||
@@ -218,18 +218,24 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
|
||||
}
|
||||
|
||||
void dispose() {
|
||||
releaseTasks();
|
||||
// Move organizer from managing specific windowing modes
|
||||
for (int i = mTaskOrganizersForWindowingMode.size() - 1; i >= 0; --i) {
|
||||
mTaskOrganizersForWindowingMode.valueAt(i).remove(mOrganizer.getBinder());
|
||||
}
|
||||
}
|
||||
|
||||
private void releaseTasks() {
|
||||
for (int i = mOrganizedTasks.size() - 1; i >= 0; i--) {
|
||||
final Task t = mOrganizedTasks.get(i);
|
||||
removeTask(t);
|
||||
t.taskOrganizerUnregistered();
|
||||
// Update tasks currently managed by this organizer to the next one available if
|
||||
// possible.
|
||||
while (!mOrganizedTasks.isEmpty()) {
|
||||
final Task t = mOrganizedTasks.get(0);
|
||||
t.updateTaskOrganizerState(true /* forceUpdate */);
|
||||
if (mOrganizedTasks.contains(t)) {
|
||||
removeTask(t);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove organizer state after removing tasks so we get a chance to send
|
||||
// onTaskVanished.
|
||||
mTaskOrganizerStates.remove(asBinder());
|
||||
}
|
||||
|
||||
void unlinkDeath() {
|
||||
@@ -313,16 +319,11 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
|
||||
new TaskOrganizerState(organizer, uid));
|
||||
}
|
||||
|
||||
if (orgs.size() == 1) {
|
||||
// Only in the case where this is the root task organizer for the given
|
||||
// windowing mode, we add report all existing tasks in that mode to the new
|
||||
// task organizer.
|
||||
mService.mRootWindowContainer.forAllTasks((task) -> {
|
||||
if (task.getWindowingMode() == windowingMode) {
|
||||
task.updateTaskOrganizerState(true /* forceUpdate */);
|
||||
}
|
||||
});
|
||||
}
|
||||
mService.mRootWindowContainer.forAllTasks((task) -> {
|
||||
if (task.getWindowingMode() == windowingMode) {
|
||||
task.updateTaskOrganizerState(true /* forceUpdate */);
|
||||
}
|
||||
});
|
||||
}
|
||||
} finally {
|
||||
Binder.restoreCallingIdentity(origId);
|
||||
@@ -335,7 +336,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
|
||||
final long origId = Binder.clearCallingIdentity();
|
||||
try {
|
||||
synchronized (mGlobalLock) {
|
||||
final TaskOrganizerState state = mTaskOrganizerStates.remove(organizer.asBinder());
|
||||
final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder());
|
||||
if (state == null) {
|
||||
return;
|
||||
}
|
||||
@@ -367,7 +368,9 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
|
||||
|
||||
void onTaskVanished(ITaskOrganizer organizer, Task task) {
|
||||
final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder());
|
||||
state.removeTask(task);
|
||||
if (state != null) {
|
||||
state.removeTask(task);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -82,7 +82,7 @@ import java.util.List;
|
||||
* Test class for {@link ITaskOrganizer} and {@link android.window.ITaskOrganizerController}.
|
||||
*
|
||||
* Build/Install/Run:
|
||||
* atest WmTests:TaskOrganizerTests
|
||||
* atest WmTests:WindowOrganizerTests
|
||||
*/
|
||||
@SmallTest
|
||||
@Presubmit
|
||||
@@ -265,15 +265,22 @@ public class WindowOrganizerTests extends WindowTestsBase {
|
||||
// newly entering the windowing mode.
|
||||
final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
|
||||
stack2.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
|
||||
verify(organizer2).onTaskAppeared(any());
|
||||
// One each for task and task2
|
||||
verify(organizer2, times(2)).onTaskAppeared(any());
|
||||
verify(organizer2, times(0)).onTaskVanished(any());
|
||||
// One for task
|
||||
verify(organizer).onTaskVanished(any());
|
||||
assertTrue(stack2.isOrganized());
|
||||
|
||||
// Now we unregister the second one, the first one should automatically be reregistered
|
||||
// so we verify that it's now seeing changes.
|
||||
mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer2);
|
||||
verify(organizer, times(3)).onTaskAppeared(any());
|
||||
verify(organizer2, times(2)).onTaskVanished(any());
|
||||
|
||||
stack3.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
|
||||
verify(organizer, times(2)).onTaskAppeared(any());
|
||||
verify(organizer, times(4)).onTaskAppeared(any());
|
||||
verify(organizer2, times(2)).onTaskVanished(any());
|
||||
assertTrue(stack3.isOrganized());
|
||||
}
|
||||
|
||||
@@ -905,12 +912,13 @@ public class WindowOrganizerTests extends WindowTestsBase {
|
||||
task.setHasBeenVisible(true);
|
||||
verify(organizer, times(1)).onTaskAppeared(any());
|
||||
|
||||
task.taskOrganizerUnregistered();
|
||||
task.setTaskOrganizer(null);
|
||||
verify(organizer, times(1)).onTaskVanished(any());
|
||||
task.setTaskOrganizer(organizer);
|
||||
verify(organizer, times(2)).onTaskAppeared(any());
|
||||
|
||||
task.removeImmediately();
|
||||
verify(organizer).onTaskVanished(any());
|
||||
verify(organizer, times(2)).onTaskVanished(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user