Merge "Allow CTS test to control organized tasks" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
201af5078f
@@ -505,6 +505,11 @@ package android.app {
|
|||||||
method public boolean isStatusBarExpansionDisabled();
|
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 {
|
public class TimePickerDialog extends android.app.AlertDialog implements android.content.DialogInterface.OnClickListener android.widget.TimePicker.OnTimeChangedListener {
|
||||||
method public android.widget.TimePicker getTimePicker();
|
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.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
|
import android.annotation.TestApi;
|
||||||
import android.compat.annotation.UnsupportedAppUsage;
|
import android.compat.annotation.UnsupportedAppUsage;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -196,6 +197,20 @@ public class TaskInfo {
|
|||||||
return resizeMode != RESIZE_MODE_UNRESIZEABLE;
|
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.
|
* Reads the TaskInfo from a parcel.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -4435,19 +4435,20 @@ class Task extends WindowContainer<WindowContainer> {
|
|||||||
// Let the old organizer know it has lost control.
|
// Let the old organizer know it has lost control.
|
||||||
sendTaskVanished();
|
sendTaskVanished();
|
||||||
mTaskOrganizer = organizer;
|
mTaskOrganizer = organizer;
|
||||||
sendTaskAppeared();
|
|
||||||
onTaskOrganizerChanged();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void taskOrganizerUnregistered() {
|
if (mTaskOrganizer != null) {
|
||||||
mTaskOrganizer = null;
|
sendTaskAppeared();
|
||||||
mTaskAppearedSent = false;
|
} else {
|
||||||
mLastTaskOrganizerWindowingMode = -1;
|
// No longer managed by any organizer.
|
||||||
onTaskOrganizerChanged();
|
mTaskAppearedSent = false;
|
||||||
if (mCreatedByOrganizer) {
|
mLastTaskOrganizerWindowingMode = -1;
|
||||||
removeImmediately();
|
setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, false /* set */);
|
||||||
|
if (mCreatedByOrganizer) {
|
||||||
|
removeImmediately();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -4484,14 +4485,6 @@ class Task extends WindowContainer<WindowContainer> {
|
|||||||
return result;
|
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
|
@Override
|
||||||
void setSurfaceControl(SurfaceControl sc) {
|
void setSurfaceControl(SurfaceControl sc) {
|
||||||
super.setSurfaceControl(sc);
|
super.setSurfaceControl(sc);
|
||||||
|
|||||||
@@ -218,18 +218,24 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void dispose() {
|
void dispose() {
|
||||||
releaseTasks();
|
// Move organizer from managing specific windowing modes
|
||||||
for (int i = mTaskOrganizersForWindowingMode.size() - 1; i >= 0; --i) {
|
for (int i = mTaskOrganizersForWindowingMode.size() - 1; i >= 0; --i) {
|
||||||
mTaskOrganizersForWindowingMode.valueAt(i).remove(mOrganizer.getBinder());
|
mTaskOrganizersForWindowingMode.valueAt(i).remove(mOrganizer.getBinder());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private void releaseTasks() {
|
// Update tasks currently managed by this organizer to the next one available if
|
||||||
for (int i = mOrganizedTasks.size() - 1; i >= 0; i--) {
|
// possible.
|
||||||
final Task t = mOrganizedTasks.get(i);
|
while (!mOrganizedTasks.isEmpty()) {
|
||||||
removeTask(t);
|
final Task t = mOrganizedTasks.get(0);
|
||||||
t.taskOrganizerUnregistered();
|
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() {
|
void unlinkDeath() {
|
||||||
@@ -313,16 +319,11 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
|
|||||||
new TaskOrganizerState(organizer, uid));
|
new TaskOrganizerState(organizer, uid));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (orgs.size() == 1) {
|
mService.mRootWindowContainer.forAllTasks((task) -> {
|
||||||
// Only in the case where this is the root task organizer for the given
|
if (task.getWindowingMode() == windowingMode) {
|
||||||
// windowing mode, we add report all existing tasks in that mode to the new
|
task.updateTaskOrganizerState(true /* forceUpdate */);
|
||||||
// task organizer.
|
}
|
||||||
mService.mRootWindowContainer.forAllTasks((task) -> {
|
});
|
||||||
if (task.getWindowingMode() == windowingMode) {
|
|
||||||
task.updateTaskOrganizerState(true /* forceUpdate */);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
Binder.restoreCallingIdentity(origId);
|
Binder.restoreCallingIdentity(origId);
|
||||||
@@ -335,7 +336,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
|
|||||||
final long origId = Binder.clearCallingIdentity();
|
final long origId = Binder.clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
synchronized (mGlobalLock) {
|
synchronized (mGlobalLock) {
|
||||||
final TaskOrganizerState state = mTaskOrganizerStates.remove(organizer.asBinder());
|
final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder());
|
||||||
if (state == null) {
|
if (state == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -367,7 +368,9 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
|
|||||||
|
|
||||||
void onTaskVanished(ITaskOrganizer organizer, Task task) {
|
void onTaskVanished(ITaskOrganizer organizer, Task task) {
|
||||||
final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder());
|
final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder());
|
||||||
state.removeTask(task);
|
if (state != null) {
|
||||||
|
state.removeTask(task);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ import java.util.List;
|
|||||||
* Test class for {@link ITaskOrganizer} and {@link android.window.ITaskOrganizerController}.
|
* Test class for {@link ITaskOrganizer} and {@link android.window.ITaskOrganizerController}.
|
||||||
*
|
*
|
||||||
* Build/Install/Run:
|
* Build/Install/Run:
|
||||||
* atest WmTests:TaskOrganizerTests
|
* atest WmTests:WindowOrganizerTests
|
||||||
*/
|
*/
|
||||||
@SmallTest
|
@SmallTest
|
||||||
@Presubmit
|
@Presubmit
|
||||||
@@ -264,15 +264,22 @@ public class WindowOrganizerTests extends WindowTestsBase {
|
|||||||
// newly entering the windowing mode.
|
// newly entering the windowing mode.
|
||||||
final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
|
final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
|
||||||
stack2.setWindowingMode(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());
|
assertTrue(stack2.isOrganized());
|
||||||
|
|
||||||
// Now we unregister the second one, the first one should automatically be reregistered
|
// Now we unregister the second one, the first one should automatically be reregistered
|
||||||
// so we verify that it's now seeing changes.
|
// so we verify that it's now seeing changes.
|
||||||
mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer2);
|
mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer2);
|
||||||
|
verify(organizer, times(3)).onTaskAppeared(any());
|
||||||
|
verify(organizer2, times(2)).onTaskVanished(any());
|
||||||
|
|
||||||
stack3.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
|
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());
|
assertTrue(stack3.isOrganized());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -902,12 +909,13 @@ public class WindowOrganizerTests extends WindowTestsBase {
|
|||||||
task.setHasBeenVisible(true);
|
task.setHasBeenVisible(true);
|
||||||
verify(organizer, times(1)).onTaskAppeared(any());
|
verify(organizer, times(1)).onTaskAppeared(any());
|
||||||
|
|
||||||
task.taskOrganizerUnregistered();
|
task.setTaskOrganizer(null);
|
||||||
|
verify(organizer, times(1)).onTaskVanished(any());
|
||||||
task.setTaskOrganizer(organizer);
|
task.setTaskOrganizer(organizer);
|
||||||
verify(organizer, times(2)).onTaskAppeared(any());
|
verify(organizer, times(2)).onTaskAppeared(any());
|
||||||
|
|
||||||
task.removeImmediately();
|
task.removeImmediately();
|
||||||
verify(organizer).onTaskVanished(any());
|
verify(organizer, times(2)).onTaskVanished(any());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user