diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index 2a05d05d47863..6438d79e57610 100644 --- a/services/core/java/com/android/server/wm/DisplayRotation.java +++ b/services/core/java/com/android/server/wm/DisplayRotation.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.util.RotationUtils.deltaRotation; import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE; @@ -39,7 +40,6 @@ import static com.android.server.wm.WindowManagerService.WINDOW_FREEZE_TIMEOUT_D import android.annotation.AnimRes; import android.annotation.IntDef; -import android.annotation.UserIdInt; import android.app.ActivityManager; import android.content.ContentResolver; import android.content.Context; @@ -50,7 +50,6 @@ import android.content.pm.PackageManager; import android.content.res.Resources; import android.database.ContentObserver; import android.hardware.power.Boost; -import android.net.Uri; import android.os.Handler; import android.os.RemoteException; import android.os.SystemProperties; @@ -58,6 +57,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.util.Slog; import android.util.SparseArray; +import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; import android.view.IDisplayWindowRotationCallback; import android.view.IWindowManager; @@ -77,6 +77,7 @@ import com.android.server.statusbar.StatusBarManagerInternal; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.ArrayDeque; /** * Defines the mapping between orientation and rotation of a display. @@ -106,6 +107,7 @@ public class DisplayRotation { private final int mDeskDockRotation; private final int mUndockedHdmiRotation; private final RotationAnimationPair mTmpRotationAnim = new RotationAnimationPair(); + private final RotationHistory mRotationHistory = new RotationHistory(); private OrientationListener mOrientationListener; private StatusBarManagerInternal mStatusBarManagerInternal; @@ -139,6 +141,8 @@ public class DisplayRotation { @VisibleForTesting int mUpsideDownRotation; // "other" portrait + int mLastSensorRotation = -1; + private boolean mAllowSeamlessRotationDespiteNavBarMoving; private int mDeferredRotationPauseCount; @@ -351,6 +355,7 @@ public class DisplayRotation { } void applyCurrentRotation(@Surface.Rotation int rotation) { + mRotationHistory.addRecord(this, rotation); if (mOrientationListener != null) { mOrientationListener.setCurrentRotation(rotation); } @@ -1149,6 +1154,7 @@ public class DisplayRotation { int sensorRotation = mOrientationListener != null ? mOrientationListener.getProposedRotation() // may be -1 : -1; + mLastSensorRotation = sensorRotation; if (sensorRotation < 0) { sensorRotation = lastRotation; } @@ -1537,6 +1543,15 @@ public class DisplayRotation { pw.println(" mUndockedHdmiRotation=" + Surface.rotationToString(mUndockedHdmiRotation)); pw.println(prefix + " mLidOpenRotation=" + Surface.rotationToString(mLidOpenRotation)); pw.println(prefix + " mFixedToUserRotation=" + isFixedToUserRotation()); + + if (!mRotationHistory.mRecords.isEmpty()) { + pw.println(); + pw.println(prefix + " RotationHistory"); + prefix = " " + prefix; + for (RotationHistory.Record r : mRotationHistory.mRecords) { + r.dump(prefix, pw); + } + } } void dumpDebug(ProtoOutputStream proto, long fieldId) { @@ -1650,9 +1665,69 @@ public class DisplayRotation { } } - @VisibleForTesting - interface ContentObserverRegister { - void registerContentObserver(Uri uri, boolean notifyForDescendants, - ContentObserver observer, @UserIdInt int userHandle); + private static class RotationHistory { + private static final int MAX_SIZE = 8; + private static class Record { + final @Surface.Rotation int mFromRotation; + final @Surface.Rotation int mToRotation; + final @Surface.Rotation int mUserRotation; + final @WindowManagerPolicy.UserRotationMode int mUserRotationMode; + final int mSensorRotation; + final boolean mIgnoreOrientationRequest; + final String mNonDefaultRequestingTaskDisplayArea; + final String mLastOrientationSource; + final @ActivityInfo.ScreenOrientation int mSourceOrientation; + final long mTimestamp = System.currentTimeMillis(); + + Record(DisplayRotation dr, int fromRotation, int toRotation) { + mFromRotation = fromRotation; + mToRotation = toRotation; + mUserRotation = dr.mUserRotation; + mUserRotationMode = dr.mUserRotationMode; + final OrientationListener listener = dr.mOrientationListener; + mSensorRotation = (listener == null || !listener.mEnabled) + ? -2 /* disabled */ : dr.mLastSensorRotation; + final DisplayContent dc = dr.mDisplayContent; + mIgnoreOrientationRequest = dc.mIgnoreOrientationRequest; + final TaskDisplayArea requestingTda = dc.getOrientationRequestingTaskDisplayArea(); + mNonDefaultRequestingTaskDisplayArea = requestingTda == null + ? "none" : requestingTda != dc.getDefaultTaskDisplayArea() + ? requestingTda.toString() : null; + final WindowContainer source = dc.getLastOrientationSource(); + if (source != null) { + mLastOrientationSource = source.toString(); + mSourceOrientation = source.mOrientation; + } else { + mLastOrientationSource = null; + mSourceOrientation = SCREEN_ORIENTATION_UNSET; + } + } + + void dump(String prefix, PrintWriter pw) { + pw.println(prefix + TimeUtils.logTimeOfDay(mTimestamp) + + " " + Surface.rotationToString(mFromRotation) + + " to " + Surface.rotationToString(mToRotation)); + pw.println(prefix + " source=" + mLastOrientationSource + + " " + ActivityInfo.screenOrientationToString(mSourceOrientation)); + pw.println(prefix + " mode=" + + WindowManagerPolicy.userRotationModeToString(mUserRotationMode) + + " user=" + Surface.rotationToString(mUserRotation) + + " sensor=" + Surface.rotationToString(mSensorRotation)); + if (mIgnoreOrientationRequest) pw.println(prefix + " ignoreRequest=true"); + if (mNonDefaultRequestingTaskDisplayArea != null) { + pw.println(prefix + " requestingTda=" + mNonDefaultRequestingTaskDisplayArea); + } + } + } + + final ArrayDeque mRecords = new ArrayDeque<>(MAX_SIZE); + + void addRecord(DisplayRotation dr, int toRotation) { + if (mRecords.size() >= MAX_SIZE) { + mRecords.removeFirst(); + } + final int fromRotation = dr.mDisplayContent.getWindowConfiguration().getRotation(); + mRecords.addLast(new Record(dr, fromRotation, toRotation)); + } } }