Fix rotation shell transition
The old freeze/legacy display rotation logic was running with
shell transitions enabled. Additionally, WindowState.removeImmediately
was removing its child surface in the wrong order causing it to not
be removed on the sync transaction and yielding several frames of
blackness.
Bug: 190002115
Test: enable shell transitions, launch a rotatable app (like messages),
rotate device. Observe a jumpcut without black flicker.
Change-Id: Ia2ce00b1cf4317c6678e6b5f91407296b23cc87e
This commit is contained in:
@@ -8151,7 +8151,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
||||
if (shouldRelaunchLocked(changes, mTmpConfig) || forceNewConfig) {
|
||||
// Aha, the activity isn't handling the change, so DIE DIE DIE.
|
||||
configChangeFlags |= changes;
|
||||
startFreezingScreenLocked(globalChanges);
|
||||
if (!mAtmService.getTransitionController().isShellTransitionsEnabled()) {
|
||||
startFreezingScreenLocked(globalChanges);
|
||||
}
|
||||
forceNewConfig = false;
|
||||
preserveWindow &= isResizeOnlyChange(changes);
|
||||
final boolean hasResizeChange = hasResizeChange(changes & ~info.getRealConfigChanged());
|
||||
|
||||
@@ -2390,6 +2390,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
|
||||
@Override
|
||||
void removeImmediately() {
|
||||
if (!mRemoved) {
|
||||
// Destroy surface before super call. The general pattern is that the children need
|
||||
// to be removed before the parent (so that the sync-engine tracking works). Since
|
||||
// WindowStateAnimator is a "virtual" child, we have to do it manually here.
|
||||
mWinAnimator.destroySurfaceLocked(getSyncTransaction());
|
||||
}
|
||||
super.removeImmediately();
|
||||
|
||||
if (mRemoved) {
|
||||
@@ -2431,8 +2437,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
|
||||
disposeInputChannel();
|
||||
|
||||
mWinAnimator.destroySurfaceLocked(mTmpTransaction);
|
||||
mTmpTransaction.apply();
|
||||
mSession.windowRemovedLocked();
|
||||
try {
|
||||
mClient.asBinder().unlinkToDeath(mDeathRecipient, 0);
|
||||
|
||||
Reference in New Issue
Block a user