Fix light bar flickers

There was a time in which no window was mTopFullscreenOpaqueWS
when switching between two apps because the previous one was
exiting already before the next one was shown. Fix this by only
considering a window to be exiting after the animation actually
has started. In that case the surface of the incoming window will
be visible already.

Test: go/wm-smoke
Test: Open Cast settings, go home with light wallpaper set
Change-Id: I89a85d5fbfe1618940b398cd26a8d5fe53be12fb
Fixes: 64291272
This commit is contained in:
Jorim Jaggi
2017-08-04 16:05:02 +02:00
parent 19be605910
commit c0c9324fcb
2 changed files with 20 additions and 2 deletions

View File

@@ -198,6 +198,14 @@ public class AppWindowAnimator {
return animation != null || mAppToken.inPendingTransaction;
}
/**
* @return whether an animation is about to start, i.e. the animation is set already but we
* haven't processed the first frame yet.
*/
boolean isAnimationStarting() {
return animation != null && !animating;
}
public int getTransit() {
return mTransit;
}

View File

@@ -1457,8 +1457,18 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
@Override
public boolean canAffectSystemUiFlags() {
final boolean shown = mWinAnimator.getShown();
final boolean exiting = mAnimatingExit || mDestroying
|| mAppToken != null && mAppToken.hidden;
// We only consider the app to be exiting when the animation has started. After the app
// transition is executed the windows are marked exiting before the new windows have been
// shown. Thus, wait considering a window to be exiting after the animation has actually
// started.
final boolean appAnimationStarting = mAppToken != null
&& mAppToken.mAppAnimator.isAnimationStarting();
final boolean exitingSelf = mAnimatingExit && (!mWinAnimator.isAnimationStarting()
&& !appAnimationStarting);
final boolean appExiting = mAppToken != null && mAppToken.hidden && !appAnimationStarting;
final boolean exiting = exitingSelf || mDestroying || appExiting;
final boolean translucent = mAttrs.alpha == 0.0f;
return shown && !exiting && !translucent;
}