summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/android/src
diff options
context:
space:
mode:
authorPaul Olav Tvete <paul.tvete@digia.com>2013-09-13 13:11:45 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-20 12:02:58 +0200
commit74d2249e37ba8cdefba8d90345a620dc6adfa411 (patch)
tree99252bce8f4d058b6a03b9af2c6a5a9f4e432030 /src/plugins/platforms/android/src
parentdd6b053b6c40feeca845b89af08d026d8d487426 (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')
-rw-r--r--src/plugins/platforms/android/src/androidjnimain.cpp42
-rw-r--r--src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp11
-rw-r--r--src/plugins/platforms/android/src/qandroidplatformintegration.cpp10
-rw-r--r--src/plugins/platforms/android/src/qandroidplatformintegration.h5
-rw-r--r--src/plugins/platforms/android/src/raster/qandroidplatformscreen.cpp10
-rw-r--r--src/plugins/platforms/android/src/raster/qandroidplatformscreen.h2
6 files changed, 69 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) \
diff --git a/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp b/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp
index 0c26aadc53..917942128f 100644
--- a/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp
+++ b/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp
@@ -57,6 +57,8 @@ public:
QSize screenSize() const;
QSizeF physicalScreenSize() const;
QDpi logicalDpi() const;
+ Qt::ScreenOrientation orientation() const;
+ Qt::ScreenOrientation nativeOrientation() const;
int screenDepth() const;
QSurfaceFormat surfaceFormatFor(const QSurfaceFormat &inputFormat) const;
EGLNativeWindowType createNativeWindow(const QSize &size, const QSurfaceFormat &format);
@@ -94,6 +96,15 @@ QDpi QEglFSAndroidHooks::logicalDpi() const
return QDpi(lDpi, lDpi);
}
+Qt::ScreenOrientation QEglFSAndroidHooks::orientation() const
+{
+ return QAndroidPlatformIntegration::m_orientation;
+}
+
+Qt::ScreenOrientation QEglFSAndroidHooks::nativeOrientation() const
+{
+ return QAndroidPlatformIntegration::m_nativeOrientation;
+}
EGLNativeWindowType QEglFSAndroidHooks::createNativeWindow(const QSize &size, const QSurfaceFormat &format)
{
diff --git a/src/plugins/platforms/android/src/qandroidplatformintegration.cpp b/src/plugins/platforms/android/src/qandroidplatformintegration.cpp
index d7ed3499af..358c3caf89 100644
--- a/src/plugins/platforms/android/src/qandroidplatformintegration.cpp
+++ b/src/plugins/platforms/android/src/qandroidplatformintegration.cpp
@@ -76,6 +76,9 @@ int QAndroidPlatformIntegration::m_defaultGeometryHeight = 455;
int QAndroidPlatformIntegration::m_defaultPhysicalSizeWidth = 50;
int QAndroidPlatformIntegration::m_defaultPhysicalSizeHeight = 71;
+Qt::ScreenOrientation QAndroidPlatformIntegration::m_orientation = Qt::PrimaryOrientation;
+Qt::ScreenOrientation QAndroidPlatformIntegration::m_nativeOrientation = Qt::PrimaryOrientation;
+
void *QAndroidPlatformNativeInterface::nativeResourceForIntegration(const QByteArray &resource)
{
if (resource=="JavaVM")
@@ -268,6 +271,13 @@ void QAndroidPlatformIntegration::setDefaultDesktopSize(int gw, int gh)
m_defaultGeometryHeight = gh;
}
+void QAndroidPlatformIntegration::setScreenOrientation(Qt::ScreenOrientation currentOrientation,
+ Qt::ScreenOrientation nativeOrientation)
+{
+ m_orientation = currentOrientation;
+ m_nativeOrientation = nativeOrientation;
+}
+
#ifndef QT_NO_ACCESSIBILITY
QPlatformAccessibility *QAndroidPlatformIntegration::accessibility() const
{
diff --git a/src/plugins/platforms/android/src/qandroidplatformintegration.h b/src/plugins/platforms/android/src/qandroidplatformintegration.h
index 20aa52cf22..e7bb55b3d5 100644
--- a/src/plugins/platforms/android/src/qandroidplatformintegration.h
+++ b/src/plugins/platforms/android/src/qandroidplatformintegration.h
@@ -129,6 +129,8 @@ public:
void resumeApp();
static void setDefaultDisplayMetrics(int gw, int gh, int sw, int sh);
static void setDefaultDesktopSize(int gw, int gh);
+ static void setScreenOrientation(Qt::ScreenOrientation currentOrientation,
+ Qt::ScreenOrientation nativeOrientation);
static QSize defaultDesktopSize()
{
@@ -156,6 +158,9 @@ private:
static int m_defaultPhysicalSizeWidth;
static int m_defaultPhysicalSizeHeight;
+ static Qt::ScreenOrientation m_orientation;
+ static Qt::ScreenOrientation m_nativeOrientation;
+
QPlatformFontDatabase *m_androidFDB;
QImage *m_FbScreenImage;
QPainter *m_compositePainter;
diff --git a/src/plugins/platforms/android/src/raster/qandroidplatformscreen.cpp b/src/plugins/platforms/android/src/raster/qandroidplatformscreen.cpp
index cf24d68ab5..0250a6122c 100644
--- a/src/plugins/platforms/android/src/raster/qandroidplatformscreen.cpp
+++ b/src/plugins/platforms/android/src/raster/qandroidplatformscreen.cpp
@@ -75,3 +75,13 @@ QDpi QAndroidPlatformScreen::logicalDpi() const
qreal lDpi = QtAndroid::scaledDensity() * 72;
return QDpi(lDpi, lDpi);
}
+
+Qt::ScreenOrientation QAndroidPlatformScreen::orientation() const
+{
+ return QAndroidPlatformIntegration::m_orientation;
+}
+
+Qt::ScreenOrientation QAndroidPlatformScreen::nativeOrientation() const
+{
+ return QAndroidPlatformIntegration::m_nativeOrientation;
+}
diff --git a/src/plugins/platforms/android/src/raster/qandroidplatformscreen.h b/src/plugins/platforms/android/src/raster/qandroidplatformscreen.h
index cfd503d611..9f8807b995 100644
--- a/src/plugins/platforms/android/src/raster/qandroidplatformscreen.h
+++ b/src/plugins/platforms/android/src/raster/qandroidplatformscreen.h
@@ -51,6 +51,8 @@ public:
QAndroidPlatformScreen();
void topWindowChanged(QWindow *w);
QDpi logicalDpi() const;
+ Qt::ScreenOrientation orientation() const;
+ Qt::ScreenOrientation nativeOrientation() const;
public slots:
QRegion doRedraw();