Merge "Fix animation glitch with overlapping orientation changes." into nyc-mr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
2ff503b002
@@ -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
|
@Override
|
||||||
public int[] setNewConfiguration(Configuration config) {
|
public int[] setNewConfiguration(Configuration config) {
|
||||||
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
|
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
|
||||||
|
|||||||
@@ -1353,8 +1353,25 @@ class WindowSurfacePlacer {
|
|||||||
"Checking " + appsCount + " opening apps (frozen="
|
"Checking " + appsCount + " opening apps (frozen="
|
||||||
+ mService.mDisplayFrozen + " timeout="
|
+ mService.mDisplayFrozen + " timeout="
|
||||||
+ mService.mAppTransition.isTimeout() + ")...");
|
+ mService.mAppTransition.isTimeout() + ")...");
|
||||||
|
final ScreenRotationAnimation screenRotationAnimation =
|
||||||
|
mService.mAnimator.getScreenRotationAnimationLocked(
|
||||||
|
Display.DEFAULT_DISPLAY);
|
||||||
|
|
||||||
int reason = APP_TRANSITION_TIMEOUT;
|
int reason = APP_TRANSITION_TIMEOUT;
|
||||||
if (!mService.mAppTransition.isTimeout()) {
|
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++) {
|
for (int i = 0; i < appsCount; i++) {
|
||||||
AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
|
AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
|
||||||
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
|
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
|
||||||
|
|||||||
Reference in New Issue
Block a user