diff options
4 files changed, 41 insertions, 0 deletions
diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto index 7467d8f2e961..2de53b97312a 100644 --- a/core/proto/android/server/windowmanagerservice.proto +++ b/core/proto/android/server/windowmanagerservice.proto @@ -319,6 +319,8 @@ message WindowStateProto { optional bool removed = 36; optional bool is_on_screen = 37; optional bool is_visible = 38; + optional bool pending_forced_seamless_rotation = 39; + optional int64 finished_forced_seamless_rotation_frame = 40; } message IdentifierProto { diff --git a/services/core/java/com/android/server/wm/ForcedSeamlessRotator.java b/services/core/java/com/android/server/wm/ForcedSeamlessRotator.java index 3218e83ecc20..f25ec5cd935e 100644 --- a/services/core/java/com/android/server/wm/ForcedSeamlessRotator.java +++ b/services/core/java/com/android/server/wm/ForcedSeamlessRotator.java @@ -24,6 +24,9 @@ import android.view.DisplayInfo; import com.android.server.wm.utils.CoordinateTransforms; +import java.io.PrintWriter; +import java.io.StringWriter; + /** * Helper class for forced seamless rotation. * @@ -36,8 +39,13 @@ public class ForcedSeamlessRotator { private final Matrix mTransform = new Matrix(); private final float[] mFloat9 = new float[9]; + private final int mOldRotation; + private final int mNewRotation; public ForcedSeamlessRotator(int oldRotation, int newRotation, DisplayInfo info) { + mOldRotation = oldRotation; + mNewRotation = newRotation; + final boolean flipped = info.rotation == ROTATION_90 || info.rotation == ROTATION_270; final int h = flipped ? info.logicalWidth : info.logicalHeight; final int w = flipped ? info.logicalHeight : info.logicalWidth; @@ -74,4 +82,16 @@ public class ForcedSeamlessRotator { win.mWinAnimator.mSurfaceController.mSurfaceControl.getHandle(), win.getFrameNumber()); } + + public void dump(PrintWriter pw) { + pw.print("{old="); pw.print(mOldRotation); pw.print(", new="); pw.print(mNewRotation); + pw.print("}"); + } + + @Override + public String toString() { + StringWriter sw = new StringWriter(); + dump(new PrintWriter(sw)); + return "ForcedSeamlessRotator" + sw.toString(); + } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index ef745869b277..e707636a11b9 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -1886,6 +1886,7 @@ public class WindowManagerService extends IWindowManager.Stub if (win.mPendingForcedSeamlessRotate != null && !mWaitingForConfig) { win.mPendingForcedSeamlessRotate.finish(win.mToken, win); + win.mFinishForcedSeamlessRotateFrameNumber = win.getFrameNumber(); win.mPendingForcedSeamlessRotate = null; } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index a7f432db8456..009f3930d02e 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -125,6 +125,7 @@ import static com.android.server.wm.WindowStateProto.DECOR_FRAME; import static com.android.server.wm.WindowStateProto.DESTROYING; import static com.android.server.wm.WindowStateProto.DISPLAY_FRAME; import static com.android.server.wm.WindowStateProto.DISPLAY_ID; +import static com.android.server.wm.WindowStateProto.FINISHED_FORCED_SEAMLESS_ROTATION_FRAME; import static com.android.server.wm.WindowStateProto.FRAME; import static com.android.server.wm.WindowStateProto.GIVEN_CONTENT_INSETS; import static com.android.server.wm.WindowStateProto.HAS_SURFACE; @@ -137,6 +138,7 @@ import static com.android.server.wm.WindowStateProto.OUTSET_FRAME; import static com.android.server.wm.WindowStateProto.OVERSCAN_FRAME; import static com.android.server.wm.WindowStateProto.OVERSCAN_INSETS; import static com.android.server.wm.WindowStateProto.PARENT_FRAME; +import static com.android.server.wm.WindowStateProto.PENDING_FORCED_SEAMLESS_ROTATION; import static com.android.server.wm.WindowStateProto.REMOVED; import static com.android.server.wm.WindowStateProto.REMOVE_ON_EXIT; import static com.android.server.wm.WindowStateProto.REQUESTED_HEIGHT; @@ -287,6 +289,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP */ final boolean mForceSeamlesslyRotate; ForcedSeamlessRotator mPendingForcedSeamlessRotate; + long mFinishForcedSeamlessRotateFrameNumber; private RemoteCallbackList<IWindowFocusObserver> mFocusCallbacks; @@ -3305,6 +3308,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP proto.write(REMOVED, mRemoved); proto.write(IS_ON_SCREEN, isOnScreen()); proto.write(IS_VISIBLE, isVisible()); + if (mForceSeamlesslyRotate) { + proto.write(PENDING_FORCED_SEAMLESS_ROTATION, mPendingForcedSeamlessRotate != null); + proto.write(FINISHED_FORCED_SEAMLESS_ROTATION_FRAME, + mFinishForcedSeamlessRotateFrameNumber); + } proto.end(token); } @@ -3481,6 +3489,16 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP pw.print(prefix); pw.print("mLastFreezeDuration="); TimeUtils.formatDuration(mLastFreezeDuration, pw); pw.println(); } + if (mForceSeamlesslyRotate) { + pw.print(prefix); pw.print("forceSeamlesslyRotate: pending="); + if (mPendingForcedSeamlessRotate != null) { + mPendingForcedSeamlessRotate.dump(pw); + } else { + pw.print("null"); + } + pw.print(" finishedFrameNumber="); pw.print(mFinishForcedSeamlessRotateFrameNumber); + pw.println(); + } if (mHScale != 1 || mVScale != 1) { pw.print(prefix); pw.print("mHScale="); pw.print(mHScale); pw.print(" mVScale="); pw.println(mVScale); |