Merge "Tweak screenshot animation for display resolution changed"
This commit is contained in:
@@ -108,15 +108,12 @@ class ScreenRotationAnimation {
|
||||
*/
|
||||
private SurfaceControl mBackColorSurface;
|
||||
private BlackFrame mEnteringBlackFrame;
|
||||
private int mWidth, mHeight;
|
||||
|
||||
private final int mOriginalRotation;
|
||||
private final int mOriginalWidth;
|
||||
private final int mOriginalHeight;
|
||||
private int mCurRotation;
|
||||
|
||||
private Rect mOriginalDisplayRect = new Rect();
|
||||
private Rect mCurrentDisplayRect = new Rect();
|
||||
// The current active animation to move from the old to the new rotated
|
||||
// state. Which animation is run here will depend on the old and new
|
||||
// rotations.
|
||||
@@ -127,7 +124,6 @@ class ScreenRotationAnimation {
|
||||
private boolean mAnimRunning;
|
||||
private boolean mFinishAnimReady;
|
||||
private long mFinishAnimStartTime;
|
||||
private boolean mForceDefaultOrientation;
|
||||
private SurfaceRotationAnimationController mSurfaceRotationAnimationController;
|
||||
/** Intensity of light/whiteness of the layout before rotation occurs. */
|
||||
private float mStartLuma;
|
||||
@@ -138,25 +134,13 @@ class ScreenRotationAnimation {
|
||||
mService = displayContent.mWmService;
|
||||
mContext = mService.mContext;
|
||||
mDisplayContent = displayContent;
|
||||
displayContent.getBounds(mOriginalDisplayRect);
|
||||
final Rect currentBounds = displayContent.getBounds();
|
||||
final int width = currentBounds.width();
|
||||
final int height = currentBounds.height();
|
||||
|
||||
// Screenshot does NOT include rotation!
|
||||
final DisplayInfo displayInfo = displayContent.getDisplayInfo();
|
||||
final int realOriginalRotation = displayInfo.rotation;
|
||||
final int originalWidth;
|
||||
final int originalHeight;
|
||||
if (displayContent.getDisplayRotation().isFixedToUserRotation()) {
|
||||
// Emulated orientation.
|
||||
mForceDefaultOrientation = true;
|
||||
originalWidth = displayContent.mBaseDisplayWidth;
|
||||
originalHeight = displayContent.mBaseDisplayHeight;
|
||||
} else {
|
||||
// Normal situation
|
||||
originalWidth = displayInfo.logicalWidth;
|
||||
originalHeight = displayInfo.logicalHeight;
|
||||
}
|
||||
mWidth = originalWidth;
|
||||
mHeight = originalHeight;
|
||||
|
||||
mOriginalRotation = originalRotation;
|
||||
// If the delta is not zero, the rotation of display may not change, but we still want to
|
||||
@@ -165,8 +149,8 @@ class ScreenRotationAnimation {
|
||||
// when restoring the rotated app to the same rotation as current display.
|
||||
final int delta = deltaRotation(originalRotation, realOriginalRotation);
|
||||
final boolean flipped = delta == Surface.ROTATION_90 || delta == Surface.ROTATION_270;
|
||||
mOriginalWidth = flipped ? originalHeight : originalWidth;
|
||||
mOriginalHeight = flipped ? originalWidth : originalHeight;
|
||||
mOriginalWidth = flipped ? height : width;
|
||||
mOriginalHeight = flipped ? width : height;
|
||||
mSurfaceRotationAnimationController = new SurfaceRotationAnimationController();
|
||||
|
||||
// Check whether the current screen contains any secure content.
|
||||
@@ -179,7 +163,7 @@ class ScreenRotationAnimation {
|
||||
new SurfaceControl.LayerCaptureArgs.Builder(displayContent.getSurfaceControl())
|
||||
.setCaptureSecureLayers(true)
|
||||
.setAllowProtected(true)
|
||||
.setSourceCrop(new Rect(0, 0, mWidth, mHeight))
|
||||
.setSourceCrop(new Rect(0, 0, width, height))
|
||||
.build();
|
||||
SurfaceControl.ScreenshotHardwareBuffer screenshotBuffer =
|
||||
SurfaceControl.captureLayers(args);
|
||||
@@ -244,6 +228,19 @@ class ScreenRotationAnimation {
|
||||
Slog.w(TAG, "Unable to allocate freeze surface", e);
|
||||
}
|
||||
|
||||
// If display size is changed with the same orientation, map the bounds of screenshot to
|
||||
// the new logical display size. Currently pending transaction and RWC#mDisplayTransaction
|
||||
// are merged to global transaction, so it can be synced with display change when calling
|
||||
// DisplayManagerInternal#performTraversal(transaction).
|
||||
final int logicalWidth = displayInfo.logicalWidth;
|
||||
final int logicalHeight = displayInfo.logicalHeight;
|
||||
if (logicalWidth > mOriginalWidth == logicalHeight > mOriginalHeight
|
||||
&& (logicalWidth != mOriginalWidth || logicalHeight != mOriginalHeight)) {
|
||||
displayContent.getPendingTransaction().setGeometry(mScreenshotLayer,
|
||||
new Rect(0, 0, mOriginalWidth, mOriginalHeight),
|
||||
new Rect(0, 0, logicalWidth, logicalHeight), Surface.ROTATION_0);
|
||||
}
|
||||
|
||||
ProtoLog.i(WM_SHOW_SURFACE_ALLOC,
|
||||
" FREEZE %s: CREATE", mScreenshotLayer);
|
||||
if (originalRotation == realOriginalRotation) {
|
||||
@@ -277,11 +274,6 @@ class ScreenRotationAnimation {
|
||||
matrix.getValues(mTmpFloats);
|
||||
float x = mTmpFloats[Matrix.MTRANS_X];
|
||||
float y = mTmpFloats[Matrix.MTRANS_Y];
|
||||
if (mForceDefaultOrientation) {
|
||||
mDisplayContent.getBounds(mCurrentDisplayRect);
|
||||
x -= mCurrentDisplayRect.left;
|
||||
y -= mCurrentDisplayRect.top;
|
||||
}
|
||||
t.setPosition(mScreenshotLayer, x, y);
|
||||
t.setMatrix(mScreenshotLayer,
|
||||
mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y],
|
||||
@@ -293,8 +285,6 @@ class ScreenRotationAnimation {
|
||||
|
||||
public void printTo(String prefix, PrintWriter pw) {
|
||||
pw.print(prefix); pw.print("mSurface="); pw.print(mScreenshotLayer);
|
||||
pw.print(" mWidth="); pw.print(mWidth);
|
||||
pw.print(" mHeight="); pw.println(mHeight);
|
||||
pw.print(prefix);
|
||||
pw.print("mEnteringBlackFrame=");
|
||||
pw.println(mEnteringBlackFrame);
|
||||
@@ -315,11 +305,6 @@ class ScreenRotationAnimation {
|
||||
pw.print(" "); mRotateEnterTransformation.printShortString(pw); pw.println();
|
||||
pw.print(prefix); pw.print("mSnapshotInitialMatrix=");
|
||||
mSnapshotInitialMatrix.dump(pw); pw.println();
|
||||
pw.print(prefix); pw.print("mForceDefaultOrientation="); pw.print(mForceDefaultOrientation);
|
||||
if (mForceDefaultOrientation) {
|
||||
pw.print(" mOriginalDisplayRect="); pw.print(mOriginalDisplayRect.toShortString());
|
||||
pw.print(" mCurrentDisplayRect="); pw.println(mCurrentDisplayRect.toShortString());
|
||||
}
|
||||
}
|
||||
|
||||
public void setRotation(SurfaceControl.Transaction t, int rotation) {
|
||||
@@ -329,7 +314,8 @@ class ScreenRotationAnimation {
|
||||
// to the snapshot to make it stay in the same original position
|
||||
// with the current screen rotation.
|
||||
int delta = deltaRotation(rotation, mOriginalRotation);
|
||||
RotationAnimationUtils.createRotationMatrix(delta, mWidth, mHeight, mSnapshotInitialMatrix);
|
||||
RotationAnimationUtils.createRotationMatrix(delta, mOriginalWidth, mOriginalHeight,
|
||||
mSnapshotInitialMatrix);
|
||||
setRotationTransform(t, mSnapshotInitialMatrix);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user