From 7d372f6e7ab81171d7cfc44897cf66f03ba0545b Mon Sep 17 00:00:00 2001 From: Bartlomiej Moskal Date: Tue, 2 Aug 2022 12:09:36 +0200 Subject: 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 (cherry picked from commit 76abdaafb540be90e87c6689cc64040e95147777) --- .../src/org/qtproject/qt/android/QtActivityDelegate.java | 15 +++++++++++++++ .../jar/src/org/qtproject/qt/android/QtNative.java | 1 + src/plugins/platforms/android/androidjnimain.cpp | 7 +++++++ .../platforms/android/qandroidplatformintegration.cpp | 9 +++++++++ .../platforms/android/qandroidplatformintegration.h | 5 +++++ src/plugins/platforms/android/qandroidplatformtheme.cpp | 5 +++++ src/plugins/platforms/android/qandroidplatformtheme.h | 1 + 7 files changed, 43 insertions(+) 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 b7415f2244..63298c0730 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java @@ -849,6 +849,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(); @@ -969,6 +971,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 { @@ -976,6 +990,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 e67990becc..9cd1582c8b 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtNative.java @@ -1404,6 +1404,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 78f45949bb..a7300484f2 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -755,6 +755,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, @@ -784,6 +790,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 19a7326115..0020fa3761 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp @@ -488,6 +488,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 6e87c9c02b..1b26710d73 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.h +++ b/src/plugins/platforms/android/qandroidplatformintegration.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -103,6 +104,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 @@ -115,6 +118,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 c5b9ba9dee..73cff62e81 100644 --- a/src/plugins/platforms/android/qandroidplatformtheme.cpp +++ b/src/plugins/platforms/android/qandroidplatformtheme.cpp @@ -358,6 +358,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 ec39ed4794..e495e6d5cc 100644 --- a/src/plugins/platforms/android/qandroidplatformtheme.h +++ b/src/plugins/platforms/android/qandroidplatformtheme.h @@ -35,6 +35,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; -- cgit v1.2.3