Merge "Add rotation history in dumpsys"

This commit is contained in:
Riddle Hsu
2022-02-10 08:37:41 +00:00
committed by Android (Google) Code Review

View File

@@ -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<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));
}
}
}