From 85afcfa54d7e86899e4a12bbc6917938236df626 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Wed, 8 Feb 2023 13:41:50 +0000 Subject: [PATCH] Ensure transition is ready after applying display change Previously, the ready state of display change (e.g. rotation) relied on TRANSACT_EFFECTS_LIFECYCLE to call resumeFocusedTasksTopActivities that will call executeAppTransition if all activities are already resumed. But if not, the transition will wait until timeout with message "timed-out because not ready". And because sendNewConfiguration already ensures configuration, visibility of activities and requests traversal, only need to ensure it is ready then the transition animation can start when the sync group is finished. Bug: 266711229 Test: atest DisplayContentTests#testShellTransitRotation Change-Id: I9c441f97e5e0a0bf66c1fa73fae45755890ff463 --- services/core/java/com/android/server/wm/Transition.java | 8 +++----- .../com/android/server/wm/WindowOrganizerController.java | 4 ++-- .../src/com/android/server/wm/DisplayContentTests.java | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 71bb99cbf5154..59bba2331c6e3 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -2010,17 +2010,15 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { return mainWin.getAttrs().rotationAnimation; } - /** Applies the new configuration and returns {@code true} if there is a display change. */ - boolean applyDisplayChangeIfNeeded() { - boolean changed = false; + /** Applies the new configuration for the changed displays. */ + void applyDisplayChangeIfNeeded() { for (int i = mParticipants.size() - 1; i >= 0; --i) { final WindowContainer wc = mParticipants.valueAt(i); final DisplayContent dc = wc.asDisplayContent(); if (dc == null || !mChanges.get(dc).hasChanged()) continue; dc.sendNewConfiguration(); - changed = true; + setReady(dc, true); } - return changed; } boolean getLegacyIsReady() { diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 3faf9e005c5ea..957d99adea3ee 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -494,8 +494,8 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub mService.deferWindowLayout(); mService.mTaskSupervisor.setDeferRootVisibilityUpdate(true /* deferUpdate */); try { - if (transition != null && transition.applyDisplayChangeIfNeeded()) { - effects |= TRANSACT_EFFECTS_LIFECYCLE; + if (transition != null) { + transition.applyDisplayChangeIfNeeded(); } final List hops = t.getHierarchyOps(); final int hopSize = hops.size(); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 1ce8c61fa07ac..bfd99fd38a4b0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -2020,13 +2020,13 @@ public class DisplayContentTests extends WindowTestsBase { assertEquals(origRot, dc.getConfiguration().windowConfiguration.getRotation()); // Once transition starts, rotation is applied and transition shows DC rotating. - testPlayer.start(); + testPlayer.startTransition(); assertNotEquals(origRot, dc.getConfiguration().windowConfiguration.getRotation()); assertNotNull(testPlayer.mLastReady); + assertTrue(testPlayer.mController.isPlaying()); WindowContainerToken dcToken = dc.mRemoteToken.toWindowContainerToken(); assertNotEquals(testPlayer.mLastReady.getChange(dcToken).getEndRotation(), testPlayer.mLastReady.getChange(dcToken).getStartRotation()); - assertTrue(testPlayer.mLastTransit.applyDisplayChangeIfNeeded()); testPlayer.finish(); }