diff options
author | Bartlomiej Moskal <bartlomiej.moskal@qt.io> | 2022-08-02 12:09:36 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-09-10 06:39:07 +0000 |
commit | 50a072e05f255c161f78714b774c3c59d598d3ca (patch) | |
tree | 42f3566880b316c66204ae2aeeb2498d0d94c322 | |
parent | d9561136ea80d62ebd2072321aa0800a42b22a28 (diff) |
Android: Light/dark modes detection
After commit: 2248487c6ca9d5459c70a16868d5aeee07d96157 light/dark mode
detection is supported by Windows and macOS. This commit add similar
implementation on the Android side.
Task-number: QTBUG-83185
Change-Id: Id1ece98e91a31759b58d651ef62b3715ea25d85f
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
(cherry picked from commit 76abdaafb540be90e87c6689cc64040e95147777)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
7 files changed, 43 insertions, 0 deletions
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java index 560def9e9e..c48c110b8f 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java @@ -903,6 +903,8 @@ public class QtActivityDelegate QtNative.handleOrientationChanged(rotation, m_nativeOrientation); m_currentRotation = rotation; + handleUiModeChange(m_activity.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK); + float refreshRate = (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) ? m_activity.getWindowManager().getDefaultDisplay().getRefreshRate() : m_activity.getDisplay().getRefreshRate(); @@ -1015,6 +1017,18 @@ public class QtActivityDelegate updateFullScreen(); } + private void handleUiModeChange(int uiMode) + { + switch (uiMode) { + case Configuration.UI_MODE_NIGHT_NO: + QtNative.handleUiDarkModeChanged(0); + break; + case Configuration.UI_MODE_NIGHT_YES: + QtNative.handleUiDarkModeChanged(1); + break; + } + } + public void onConfigurationChanged(Configuration configuration) { try { @@ -1022,6 +1036,7 @@ public class QtActivityDelegate } catch (Exception e) { e.printStackTrace(); } + handleUiModeChange(configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK); } public void onDestroy() diff --git a/src/android/jar/src/org/qtproject/qt/android/QtNative.java b/src/android/jar/src/org/qtproject/qt/android/QtNative.java index 5a09c90e64..2b52be9355 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtNative.java @@ -1393,6 +1393,7 @@ public class QtNative public static native void handleOrientationChanged(int newRotation, int nativeOrientation); public static native void handleRefreshRateChanged(float refreshRate); // screen methods + public static native void handleUiDarkModeChanged(int newUiMode); // pointer methods public static native void mouseDown(int winId, int x, int y); diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index 37dfc31978..fcfe91b307 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -792,6 +792,12 @@ static void handleRefreshRateChanged(JNIEnv */*env*/, jclass /*cls*/, jfloat ref m_androidPlatformIntegration->setRefreshRate(refreshRate); } +static void handleUiDarkModeChanged(JNIEnv */*env*/, jobject /*thiz*/, jint newUiMode) +{ + QAndroidPlatformIntegration::setAppearance( + (newUiMode == 1 ) ? QPlatformTheme::Appearance::Dark : QPlatformTheme::Appearance::Light); +} + static void onActivityResult(JNIEnv */*env*/, jclass /*cls*/, jint requestCode, jint resultCode, @@ -822,6 +828,7 @@ static JNINativeMethod methods[] = { { "setSurface", "(ILjava/lang/Object;II)V", (void *)setSurface }, { "updateWindow", "()V", (void *)updateWindow }, { "updateApplicationState", "(I)V", (void *)updateApplicationState }, + { "handleUiDarkModeChanged", "(I)V", (void *)handleUiDarkModeChanged }, { "handleOrientationChanged", "(II)V", (void *)handleOrientationChanged }, { "onActivityResult", "(IILandroid/content/Intent;)V", (void *)onActivityResult }, { "onNewIntent", "(Landroid/content/Intent;)V", (void *)onNewIntent }, diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp index 00175bf9d0..d2ea4beb8a 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp @@ -522,6 +522,15 @@ void QAndroidPlatformIntegration::setScreenSize(int width, int height) QMetaObject::invokeMethod(m_primaryScreen, "setSize", Qt::AutoConnection, Q_ARG(QSize, QSize(width, height))); } +QPlatformTheme::Appearance QAndroidPlatformIntegration::m_appearance = QPlatformTheme::Appearance::Light; + +void QAndroidPlatformIntegration::setAppearance(QPlatformTheme::Appearance newAppearance) +{ + if (m_appearance == newAppearance) + return; + m_appearance = newAppearance; +} + void QAndroidPlatformIntegration::setScreenSizeParameters(const QSize &physicalSize, const QSize &screenSize, const QRect &availableGeometry) diff --git a/src/plugins/platforms/android/qandroidplatformintegration.h b/src/plugins/platforms/android/qandroidplatformintegration.h index 8ca36b410f..19a6c8f8ee 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.h +++ b/src/plugins/platforms/android/qandroidplatformintegration.h @@ -49,6 +49,7 @@ #include <qpa/qplatformnativeinterface.h> #include <qpa/qplatformopenglcontext.h> #include <qpa/qplatformoffscreensurface.h> +#include <qpa/qplatformtheme.h> #include <EGL/egl.h> #include <memory> @@ -139,6 +140,8 @@ public: void flushPendingUpdates(); + static void setAppearance(QPlatformTheme::Appearance newAppearance); + static QPlatformTheme::Appearance appearance() { return m_appearance; } #if QT_CONFIG(vulkan) QPlatformVulkanInstance *createPlatformVulkanInstance(QVulkanInstance *instance) const override; #endif @@ -151,6 +154,8 @@ private: QThread *m_mainThread; + static QPlatformTheme::Appearance m_appearance; + static QRect m_defaultAvailableGeometry; static QSize m_defaultPhysicalSize; static QSize m_defaultScreenSize; diff --git a/src/plugins/platforms/android/qandroidplatformtheme.cpp b/src/plugins/platforms/android/qandroidplatformtheme.cpp index 5e7fb9d0ce..5d7d7a2c70 100644 --- a/src/plugins/platforms/android/qandroidplatformtheme.cpp +++ b/src/plugins/platforms/android/qandroidplatformtheme.cpp @@ -392,6 +392,11 @@ void QAndroidPlatformTheme::showPlatformMenuBar() QtAndroidMenu::openOptionsMenu(); } +QPlatformTheme::Appearance QAndroidPlatformTheme::appearance() const +{ + return QAndroidPlatformIntegration::appearance(); +} + static inline int paletteType(QPlatformTheme::Palette type) { switch (type) { diff --git a/src/plugins/platforms/android/qandroidplatformtheme.h b/src/plugins/platforms/android/qandroidplatformtheme.h index 4dd53f5dad..5bff36aecf 100644 --- a/src/plugins/platforms/android/qandroidplatformtheme.h +++ b/src/plugins/platforms/android/qandroidplatformtheme.h @@ -69,6 +69,7 @@ public: QPlatformMenu *createPlatformMenu() const override; QPlatformMenuItem *createPlatformMenuItem() const override; void showPlatformMenuBar() override; + Appearance appearance() const override; const QPalette *palette(Palette type = SystemPalette) const override; const QFont *font(Font type = SystemFont) const override; QVariant themeHint(ThemeHint hint) const override; |