Merge "Don't copy null surface control and remove lingering references to leashes" into tm-qpr-dev am: 9693a78322
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19125218 Change-Id: Iaa6c9b3eb737b04b0268e9201c76b04e7df60f3d Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -85,6 +85,8 @@ public class RootDisplayAreaOrganizer extends DisplayAreaOrganizer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mDisplayAreasInfo.remove(displayId);
|
mDisplayAreasInfo.remove(displayId);
|
||||||
|
mLeashes.get(displayId).release();
|
||||||
|
mLeashes.remove(displayId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -529,7 +529,11 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
final int taskId = taskInfo.taskId;
|
final int taskId = taskInfo.taskId;
|
||||||
final TaskListener listener = getTaskListener(mTasks.get(taskId).getTaskInfo());
|
final TaskAppearedInfo appearedInfo = mTasks.get(taskId);
|
||||||
|
final TaskListener listener = getTaskListener(appearedInfo.getTaskInfo());
|
||||||
|
if (appearedInfo.getLeash() != null) {
|
||||||
|
appearedInfo.getLeash().release();
|
||||||
|
}
|
||||||
mTasks.remove(taskId);
|
mTasks.remove(taskId);
|
||||||
if (listener != null) {
|
if (listener != null) {
|
||||||
listener.onTaskVanished(taskInfo);
|
listener.onTaskVanished(taskInfo);
|
||||||
|
|||||||
@@ -128,9 +128,10 @@ class HideDisplayCutoutOrganizer extends DisplayAreaOrganizer {
|
|||||||
|
|
||||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||||
final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
|
final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
|
||||||
applyBoundsAndOffsets(
|
final SurfaceControl leash = mDisplayAreaMap.get(displayAreaInfo.token);
|
||||||
displayAreaInfo.token, mDisplayAreaMap.get(displayAreaInfo.token), wct, t);
|
applyBoundsAndOffsets(displayAreaInfo.token, leash, wct, t);
|
||||||
applyTransaction(wct, t);
|
applyTransaction(wct, t);
|
||||||
|
leash.release();
|
||||||
mDisplayAreaMap.remove(displayAreaInfo.token);
|
mDisplayAreaMap.remove(displayAreaInfo.token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -159,6 +159,10 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {
|
public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {
|
||||||
|
final SurfaceControl leash = mDisplayAreaTokenMap.get(displayAreaInfo.token);
|
||||||
|
if (leash != null) {
|
||||||
|
leash.release();
|
||||||
|
}
|
||||||
mDisplayAreaTokenMap.remove(displayAreaInfo.token);
|
mDisplayAreaTokenMap.remove(displayAreaInfo.token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -943,6 +943,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
|||||||
mPipBoundsState.setBounds(new Rect());
|
mPipBoundsState.setBounds(new Rect());
|
||||||
mPipUiEventLoggerLogger.setTaskInfo(null);
|
mPipUiEventLoggerLogger.setTaskInfo(null);
|
||||||
mMainExecutor.executeDelayed(() -> mPipMenuController.detach(), 0);
|
mMainExecutor.executeDelayed(() -> mPipMenuController.detach(), 0);
|
||||||
|
mLeash = null;
|
||||||
|
|
||||||
if (info.displayId != Display.DEFAULT_DISPLAY && mOnDisplayIdChangeCallback != null) {
|
if (info.displayId != Display.DEFAULT_DISPLAY && mOnDisplayIdChangeCallback != null) {
|
||||||
mOnDisplayIdChangeCallback.accept(Display.DEFAULT_DISPLAY);
|
mOnDisplayIdChangeCallback.accept(Display.DEFAULT_DISPLAY);
|
||||||
|
|||||||
@@ -434,7 +434,15 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
}
|
}
|
||||||
|
|
||||||
RemoteAnimationTarget[] onStartingSplitLegacy(RemoteAnimationTarget[] apps) {
|
RemoteAnimationTarget[] onStartingSplitLegacy(RemoteAnimationTarget[] apps) {
|
||||||
return reparentSplitTasksForAnimation(apps, false /*splitExpectedToBeVisible*/);
|
try {
|
||||||
|
return reparentSplitTasksForAnimation(apps, false /*splitExpectedToBeVisible*/);
|
||||||
|
} finally {
|
||||||
|
for (RemoteAnimationTarget appTarget : apps) {
|
||||||
|
if (appTarget.leash != null) {
|
||||||
|
appTarget.leash.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private RemoteAnimationTarget[] reparentSplitTasksForAnimation(RemoteAnimationTarget[] apps,
|
private RemoteAnimationTarget[] reparentSplitTasksForAnimation(RemoteAnimationTarget[] apps,
|
||||||
|
|||||||
@@ -1022,6 +1022,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
|||||||
}
|
}
|
||||||
|
|
||||||
mRootTaskInfo = null;
|
mRootTaskInfo = null;
|
||||||
|
mRootTaskLeash = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -242,6 +242,7 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener {
|
|||||||
if (mRootTaskInfo.taskId == taskId) {
|
if (mRootTaskInfo.taskId == taskId) {
|
||||||
mCallbacks.onRootTaskVanished();
|
mCallbacks.onRootTaskVanished();
|
||||||
mRootTaskInfo = null;
|
mRootTaskInfo = null;
|
||||||
|
mRootLeash = null;
|
||||||
mSyncQueue.runInSync(t -> {
|
mSyncQueue.runInSync(t -> {
|
||||||
t.remove(mDimLayer);
|
t.remove(mDimLayer);
|
||||||
mSplitDecorManager.release(t);
|
mSplitDecorManager.release(t);
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import android.os.IBinder;
|
|||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
import android.view.SurfaceControl;
|
import android.view.SurfaceControl;
|
||||||
|
import android.view.SurfaceSession;
|
||||||
import android.window.ITaskOrganizer;
|
import android.window.ITaskOrganizer;
|
||||||
import android.window.ITaskOrganizerController;
|
import android.window.ITaskOrganizerController;
|
||||||
import android.window.TaskAppearedInfo;
|
import android.window.TaskAppearedInfo;
|
||||||
@@ -137,12 +138,24 @@ public class ShellTaskOrganizerTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void registerOrganizer_sendRegisterTaskOrganizer() throws RemoteException {
|
public void testRegisterOrganizer_sendRegisterTaskOrganizer() throws RemoteException {
|
||||||
mOrganizer.registerOrganizer();
|
mOrganizer.registerOrganizer();
|
||||||
|
|
||||||
verify(mTaskOrganizerController).registerTaskOrganizer(any(ITaskOrganizer.class));
|
verify(mTaskOrganizerController).registerTaskOrganizer(any(ITaskOrganizer.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTaskLeashReleasedAfterVanished() throws RemoteException {
|
||||||
|
RunningTaskInfo taskInfo = createTaskInfo(1, WINDOWING_MODE_MULTI_WINDOW);
|
||||||
|
SurfaceControl taskLeash = new SurfaceControl.Builder(new SurfaceSession())
|
||||||
|
.setName("task").build();
|
||||||
|
mOrganizer.registerOrganizer();
|
||||||
|
mOrganizer.onTaskAppeared(taskInfo, taskLeash);
|
||||||
|
assertTrue(taskLeash.isValid());
|
||||||
|
mOrganizer.onTaskVanished(taskInfo);
|
||||||
|
assertTrue(!taskLeash.isValid());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testOneListenerPerType() {
|
public void testOneListenerPerType() {
|
||||||
mOrganizer.addListenerForType(new TrackingTaskListener(), TASK_LISTENER_TYPE_MULTI_WINDOW);
|
mOrganizer.addListenerForType(new TrackingTaskListener(), TASK_LISTENER_TYPE_MULTI_WINDOW);
|
||||||
|
|||||||
@@ -527,11 +527,12 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
|
|||||||
mService.mRootWindowContainer.forAllTasks((task) -> {
|
mService.mRootWindowContainer.forAllTasks((task) -> {
|
||||||
boolean returnTask = !task.mCreatedByOrganizer;
|
boolean returnTask = !task.mCreatedByOrganizer;
|
||||||
task.updateTaskOrganizerState(returnTask /* skipTaskAppeared */);
|
task.updateTaskOrganizerState(returnTask /* skipTaskAppeared */);
|
||||||
if (returnTask) {
|
// It is possible for the task to not yet have a surface control, so ensure that
|
||||||
SurfaceControl outSurfaceControl = state.addTaskWithoutCallback(task,
|
// the update succeeded in setting the organizer for the task before returning
|
||||||
|
if (task.isOrganized() && returnTask) {
|
||||||
|
SurfaceControl taskLeash = state.addTaskWithoutCallback(task,
|
||||||
"TaskOrganizerController.registerTaskOrganizer");
|
"TaskOrganizerController.registerTaskOrganizer");
|
||||||
taskInfos.add(
|
taskInfos.add(new TaskAppearedInfo(task.getTaskInfo(), taskLeash));
|
||||||
new TaskAppearedInfo(task.getTaskInfo(), outSurfaceControl));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -458,6 +458,23 @@ public class WindowOrganizerTests extends WindowTestsBase {
|
|||||||
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
|
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRegisterTaskOrganizerWithExistingTasks_noSurfaceControl()
|
||||||
|
throws RemoteException {
|
||||||
|
final Task rootTask = createRootTask();
|
||||||
|
final Task task = createTask(rootTask);
|
||||||
|
final Task rootTask2 = createRootTask();
|
||||||
|
final Task task2 = createTask(rootTask2);
|
||||||
|
rootTask2.setSurfaceControl(null);
|
||||||
|
ArrayList<TaskAppearedInfo> existingTasks = new ArrayList<>();
|
||||||
|
final ITaskOrganizer organizer = registerMockOrganizer(existingTasks);
|
||||||
|
assertContainsTasks(existingTasks, rootTask);
|
||||||
|
|
||||||
|
// Verify we don't get onTaskAppeared if we are returned the tasks
|
||||||
|
verify(organizer, never())
|
||||||
|
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testTaskTransaction() {
|
public void testTaskTransaction() {
|
||||||
removeGlobalMinSizeRestriction();
|
removeGlobalMinSizeRestriction();
|
||||||
|
|||||||
Reference in New Issue
Block a user