Merge "Fix animation glitch with overlapping orientation changes." into nyc-mr1-dev

This commit is contained in:
TreeHugger Robot
2016-09-22 21:22:20 +00:00
committed by Android (Google) Code Review
2 changed files with 30 additions and 0 deletions

View File

@@ -3859,6 +3859,19 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
// If this is true we have updated our desired orientation, but not yet
// changed the real orientation our applied our screen rotation animation.
// For example, because a previous screen rotation was in progress.
boolean rotationNeedsUpdateLocked() {
int rotation = mPolicy.rotationForOrientationLw(mLastOrientation, mRotation);
boolean altOrientation = !mPolicy.rotationHasCompatibleMetricsLw(
mLastOrientation, rotation);
if (mRotation == rotation && mAltOrientation == altOrientation) {
return false;
}
return true;
}
@Override
public int[] setNewConfiguration(Configuration config) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,

View File

@@ -1353,8 +1353,25 @@ class WindowSurfacePlacer {
"Checking " + appsCount + " opening apps (frozen="
+ mService.mDisplayFrozen + " timeout="
+ mService.mAppTransition.isTimeout() + ")...");
final ScreenRotationAnimation screenRotationAnimation =
mService.mAnimator.getScreenRotationAnimationLocked(
Display.DEFAULT_DISPLAY);
int reason = APP_TRANSITION_TIMEOUT;
if (!mService.mAppTransition.isTimeout()) {
// Imagine the case where we are changing orientation due to an app transition, but a previous
// orientation change is still in progress. We won't process the orientation change
// for our transition because we need to wait for the rotation animation to finish.
// If we start the app transition at this point, we will interrupt it halfway with a new rotation
// animation after the old one finally finishes. It's better to defer the
// app transition.
if (screenRotationAnimation != null && screenRotationAnimation.isAnimating() &&
mService.rotationNeedsUpdateLocked()) {
if (DEBUG_APP_TRANSITIONS) {
Slog.v(TAG, "Delaying app transition for screen rotation animation to finish");
}
return false;
}
for (int i = 0; i < appsCount; i++) {
AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,