diff options
3 files changed, 36 insertions, 8 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 9e3cf37..260f625 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -430,6 +430,7 @@ class GlobalScreenshot { private MediaActionSound mCameraSound; + private final int mSfHwRotation; /** * @param context everything needs a context :( @@ -496,6 +497,9 @@ class GlobalScreenshot { // Setup the Camera shutter sound mCameraSound = new MediaActionSound(); mCameraSound.load(MediaActionSound.SHUTTER_CLICK); + + // Load hardware rotation from prop + mSfHwRotation = android.os.SystemProperties.getInt("ro.sf.hwrotation",0) / 90; } /** @@ -539,7 +543,10 @@ class GlobalScreenshot { // only in the natural orientation of the device :!) mDisplay.getRealMetrics(mDisplayMetrics); float[] dims = {mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels}; - float degrees = getDegreesForRotation(mDisplay.getRotation()); + int rot = mDisplay.getRotation(); + // Allow for abnormal hardware orientation + rot = (rot + mSfHwRotation) % 4; + float degrees = getDegreesForRotation(rot); boolean requiresRotation = (degrees > 0); if (requiresRotation) { // Get the dimensions of the device in its native orientation diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index 7dd716e..7e5c807 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -51,6 +51,7 @@ class ScreenRotationAnimation { BlackFrame mExitingBlackFrame; BlackFrame mEnteringBlackFrame; int mWidth, mHeight; + int mSnapshotRotation; int mOriginalRotation; int mOriginalWidth, mOriginalHeight; @@ -221,13 +222,26 @@ class ScreenRotationAnimation { originalWidth = displayInfo.logicalWidth; originalHeight = displayInfo.logicalHeight; } - if (originalRotation == Surface.ROTATION_90 - || originalRotation == Surface.ROTATION_270) { - mWidth = originalHeight; - mHeight = originalWidth; + // Allow for abnormal hardware orientation + mSnapshotRotation = (4 - android.os.SystemProperties.getInt("ro.sf.hwrotation",0) / 90) % 4; + if (mSnapshotRotation == Surface.ROTATION_0 || mSnapshotRotation == Surface.ROTATION_180) { + if (originalRotation == Surface.ROTATION_90 + || originalRotation == Surface.ROTATION_270) { + mWidth = originalHeight; + mHeight = originalWidth; + } else { + mWidth = originalWidth; + mHeight = originalHeight; + } } else { - mWidth = originalWidth; - mHeight = originalHeight; + if (originalRotation == Surface.ROTATION_90 + || originalRotation == Surface.ROTATION_270) { + mWidth = originalWidth; + mHeight = originalHeight; + } else { + mWidth = originalHeight; + mHeight = originalWidth; + } } mOriginalRotation = originalRotation; @@ -346,7 +360,7 @@ class ScreenRotationAnimation { // Compute the transformation matrix that must be applied // to the snapshot to make it stay in the same original position // with the current screen rotation. - int delta = DisplayContent.deltaRotation(rotation, Surface.ROTATION_0); + int delta = DisplayContent.deltaRotation(rotation, mSnapshotRotation); createRotationMatrix(delta, mWidth, mHeight, mSnapshotInitialMatrix); if (DEBUG_STATE) Slog.v(TAG, "**** ROTATION: " + delta); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index f0cbbb4..3eca7d5 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -309,6 +309,8 @@ public class WindowManagerService extends IWindowManager.Stub final private KeyguardDisableHandler mKeyguardDisableHandler; + private final int mSfHwRotation; + final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -999,6 +1001,9 @@ public class WindowManagerService extends IWindowManager.Stub SurfaceControl.closeTransaction(); } + // Load hardware rotation from prop + mSfHwRotation = android.os.SystemProperties.getInt("ro.sf.hwrotation",0) / 90; + updateCircularDisplayMaskIfNeeded(); showEmulatorDisplayOverlayIfNeeded(); } @@ -6395,6 +6400,8 @@ public class WindowManagerService extends IWindowManager.Stub // The screenshot API does not apply the current screen rotation. int rot = getDefaultDisplayContentLocked().getDisplay().getRotation(); + // Allow for abnormal hardware orientation + rot = (rot + mSfHwRotation) % 4; if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) { rot = (rot == Surface.ROTATION_90) ? Surface.ROTATION_270 : Surface.ROTATION_90; |