Loading services/core/java/com/android/server/wm/DisplayRotation.java +81 −6 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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. Loading Loading @@ -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; Loading Loading @@ -139,6 +141,8 @@ public class DisplayRotation { @VisibleForTesting int mUpsideDownRotation; // "other" portrait int mLastSensorRotation = -1; private boolean mAllowSeamlessRotationDespiteNavBarMoving; private int mDeferredRotationPauseCount; Loading Loading @@ -351,6 +355,7 @@ public class DisplayRotation { } void applyCurrentRotation(@Surface.Rotation int rotation) { mRotationHistory.addRecord(this, rotation); if (mOrientationListener != null) { mOrientationListener.setCurrentRotation(rotation); } Loading Loading @@ -1149,6 +1154,7 @@ public class DisplayRotation { int sensorRotation = mOrientationListener != null ? mOrientationListener.getProposedRotation() // may be -1 : -1; mLastSensorRotation = sensorRotation; if (sensorRotation < 0) { sensorRotation = lastRotation; } Loading Loading @@ -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) { Loading Loading @@ -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<Record> 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)); } } } Loading
services/core/java/com/android/server/wm/DisplayRotation.java +81 −6 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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. Loading Loading @@ -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; Loading Loading @@ -139,6 +141,8 @@ public class DisplayRotation { @VisibleForTesting int mUpsideDownRotation; // "other" portrait int mLastSensorRotation = -1; private boolean mAllowSeamlessRotationDespiteNavBarMoving; private int mDeferredRotationPauseCount; Loading Loading @@ -351,6 +355,7 @@ public class DisplayRotation { } void applyCurrentRotation(@Surface.Rotation int rotation) { mRotationHistory.addRecord(this, rotation); if (mOrientationListener != null) { mOrientationListener.setCurrentRotation(rotation); } Loading Loading @@ -1149,6 +1154,7 @@ public class DisplayRotation { int sensorRotation = mOrientationListener != null ? mOrientationListener.getProposedRotation() // may be -1 : -1; mLastSensorRotation = sensorRotation; if (sensorRotation < 0) { sensorRotation = lastRotation; } Loading Loading @@ -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) { Loading Loading @@ -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<Record> 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)); } } }