diff options
author | Paul Olav Tvete <paul.tvete@digia.com> | 2013-09-13 13:11:45 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-20 12:02:58 +0200 |
commit | 74d2249e37ba8cdefba8d90345a620dc6adfa411 (patch) | |
tree | 99252bce8f4d058b6a03b9af2c6a5a9f4e432030 /src/plugins/platforms/android/src/androidjnimain.cpp | |
parent | dd6b053b6c40feeca845b89af08d026d8d487426 (diff) |
Android: handle inverted orientations
Add logic to detect InvertedPortrait and InvertedLandscape orientations
and implement QPlatformScreen::nativeOrientation() for Android.
Task-number: QTBUG-32144
Change-Id: I294506714ea0faa9eacd7a15e1cfc45342659964
Reviewed-by: BogDan Vatra <bogdan@kde.org>
Diffstat (limited to 'src/plugins/platforms/android/src/androidjnimain.cpp')
-rw-r--r-- | src/plugins/platforms/android/src/androidjnimain.cpp | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/src/plugins/platforms/android/src/androidjnimain.cpp b/src/plugins/platforms/android/src/androidjnimain.cpp index b426839f3d..5941737fde 100644 --- a/src/plugins/platforms/android/src/androidjnimain.cpp +++ b/src/plugins/platforms/android/src/androidjnimain.cpp @@ -675,17 +675,37 @@ static void updateApplicationState(JNIEnv */*env*/, jobject /*thiz*/, jint state QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationState(state)); } -static void handleOrientationChanged(JNIEnv */*env*/, jobject /*thiz*/, jint newOrientation) +static void handleOrientationChanged(JNIEnv */*env*/, jobject /*thiz*/, jint newRotation, jint nativeOrientation) { - if (m_androidPlatformIntegration == 0) - return; - - Qt::ScreenOrientation screenOrientation = newOrientation == 1 - ? Qt::PortraitOrientation - : Qt::LandscapeOrientation; - QPlatformScreen *screen = m_androidPlatformIntegration->screen(); - QWindowSystemInterface::handleScreenOrientationChange(screen->screen(), - screenOrientation); + // Array of orientations rotated in 90 degree increments, counterclockwise + // (same direction as Android measures angles) + static const Qt::ScreenOrientation orientations[] = { + Qt::PortraitOrientation, + Qt::LandscapeOrientation, + Qt::InvertedPortraitOrientation, + Qt::InvertedLandscapeOrientation + }; + + // The Android API defines the following constants: + // ROTATION_0 : 0 + // ROTATION_90 : 1 + // ROTATION_180 : 2 + // ROTATION_270 : 3 + // ORIENTATION_PORTRAIT : 1 + // ORIENTATION_LANDSCAPE : 2 + + // and newRotation is how much the current orientation is rotated relative to nativeOrientation + + // which means that we can be really clever here :) + Qt::ScreenOrientation screenOrientation = orientations[(nativeOrientation - 1 + newRotation) % 4]; + Qt::ScreenOrientation native = orientations[nativeOrientation - 1]; + + QAndroidPlatformIntegration::setScreenOrientation(screenOrientation, native); + if (m_androidPlatformIntegration) { + QPlatformScreen *screen = m_androidPlatformIntegration->screen(); + QWindowSystemInterface::handleScreenOrientationChange(screen->screen(), + screenOrientation); + } } static JNINativeMethod methods[] = { @@ -702,7 +722,7 @@ static JNINativeMethod methods[] = { {"unlockSurface", "()V", (void *)unlockSurface}, {"updateWindow", "()V", (void *)updateWindow}, {"updateApplicationState", "(I)V", (void *)updateApplicationState}, - {"handleOrientationChanged", "(I)V", (void *)handleOrientationChanged} + {"handleOrientationChanged", "(II)V", (void *)handleOrientationChanged} }; #define FIND_AND_CHECK_CLASS(CLASS_NAME) \ |