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:
Wale Ogunwale
2020-04-13 07:30:59 -07:00
parent 9bca3a380d
commit 20ab6d4999
5 changed files with 67 additions and 43 deletions

View File

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

View File

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

View File

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

View File

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

View File

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