diff options
4 files changed, 17 insertions, 6 deletions
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 1b37ed47c392..eb6b17e08f46 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -1581,6 +1581,15 @@ public interface WindowManager extends ViewManager { public static final int ROTATION_ANIMATION_JUMPCUT = 2; /** + * Value for {@link #rotationAnimation} to specify seamless rotation mode. + * This works like JUMPCUT but will fall back to CROSSFADE if rotation + * can't be applied without pausing the screen. + * + * @hide + */ + public static final int ROTATION_ANIMATION_SEAMLESS = 3; + + /** * Define the exit and entry animations used on this window when the device is rotated. * This only has an affect if the incoming and outgoing topmost * opaque windows have the #FLAG_FULLSCREEN bit set and are not covered diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index 048c4bd4a770..8cabfb93bf32 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -461,7 +461,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL // happens to occur during the launch. ActivityOptions o = ActivityOptions.makeBasic(); o.setRotationAnimationHint( - WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE); + WindowManager.LayoutParams.ROTATION_ANIMATION_SEAMLESS); try { result = ActivityManagerNative.getDefault().startActivityAsUser( null, getContext().getBasePackageName(), diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index b4368d69343d..447a343897b3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -3419,7 +3419,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // force the crossfade animation if an orientation change // happens to occur during the launch. options.setRotationAnimationHint( - WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE); + WindowManager.LayoutParams.ROTATION_ANIMATION_SEAMLESS); } try { result = ActivityManagerNative.getDefault().startActivityAsUser( diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index f7454a3a5170..0b07902eb440 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2891,6 +2891,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } switch (animationHint) { case ROTATION_ANIMATION_CROSSFADE: + case ROTATION_ANIMATION_SEAMLESS: // Crossfade is fallback for seamless. anim[0] = R.anim.rotation_animation_xfade_exit; anim[1] = R.anim.rotation_animation_enter; break; @@ -7751,14 +7752,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { return false; } + final WindowState w = mTopFullscreenOpaqueWindowState; + // We only enable seamless rotation if the top window has requested // it and is in the fullscreen opaque state. Seamless rotation // requires freezing various Surface states and won't work well // with animations, so we disable it in the animation case for now. - if (mTopFullscreenOpaqueWindowState != null && mTopIsFullscreen && - !mTopFullscreenOpaqueWindowState.isAnimatingLw() && - mTopFullscreenOpaqueWindowState.getAttrs().rotationAnimation == - ROTATION_ANIMATION_JUMPCUT) { + if (w != null && mTopIsFullscreen && !w.isAnimatingLw() && + ((w.getAttrs().rotationAnimation == ROTATION_ANIMATION_JUMPCUT) || + (w.getAttrs().rotationAnimation == ROTATION_ANIMATION_SEAMLESS))) { return true; } return false; |