From 768c49a7e9591011179cae7b38e2cf75654dbf81 Mon Sep 17 00:00:00 2001 From: Volker Krause Date: Mon, 7 Oct 2024 17:27:07 +0200 Subject: [PATCH] Android: Send locale/language change events on system locale changes This enables applications to retranslate or otherwise update their UI when the Android system locale/language settings are changed during their runtime. Change-Id: Id482ca146080d9f3e74990f64e686f6b3504887c Reviewed-by: Assam Boudjelthia (cherry picked from commit 83483b8b200ab5cedf659f418c7296719902ddc4) Reviewed-by: Qt Cherry-pick Bot --- .../src/org/qtproject/qt/android/QtActivityBase.java | 10 ++++++++++ .../jar/src/org/qtproject/qt/android/QtNative.java | 1 + src/plugins/platforms/android/androidjnimain.cpp | 9 ++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java index 544ccf97361..0ae4c2e731a 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java @@ -8,6 +8,7 @@ import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.Intent; +import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.net.Uri; @@ -29,6 +30,7 @@ public class QtActivityBase extends Activity private String m_applicationParams = ""; private boolean m_isCustomThemeSet = false; private boolean m_retainNonConfigurationInstance = false; + private Configuration m_prevConfig; private QtActivityDelegate m_delegate; @@ -122,6 +124,8 @@ public class QtActivityBase extends Activity e.printStackTrace(); showErrorDialog(); } + + m_prevConfig = new Configuration(getResources().getConfiguration()); } @Override @@ -183,6 +187,12 @@ public class QtActivityBase extends Activity { super.onConfigurationChanged(newConfig); m_delegate.handleUiModeChange(newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK); + + int diff = newConfig.diff(m_prevConfig); + if ((diff & ActivityInfo.CONFIG_LOCALE) != 0) + QtNative.updateLocale(); + + m_prevConfig = new Configuration(newConfig); } @Override 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 17e1386efbe..2758005418b 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtNative.java @@ -435,6 +435,7 @@ public class QtNative // application methods static native void updateApplicationState(int state); + static native void updateLocale(); // menu methods static native boolean onPrepareOptionsMenu(Menu menu); diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index b8cf34abf34..f90093a837c 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -633,6 +633,12 @@ static void updateApplicationState(JNIEnv */*env*/, jobject /*thiz*/, jint state } } +static void updateLocale(JNIEnv */*env*/, jobject /*thiz*/) +{ + QCoreApplication::postEvent(QCoreApplication::instance(), new QEvent(QEvent::LocaleChange)); + QCoreApplication::postEvent(QCoreApplication::instance(), new QEvent(QEvent::LanguageChange)); +} + static void handleOrientationChanged(JNIEnv */*env*/, jobject /*thiz*/, jint newRotation, jint nativeOrientation) { // Array of orientations rotated in 90 degree increments, counterclockwise @@ -736,7 +742,8 @@ static JNINativeMethod methods[] = { { "updateApplicationState", "(I)V", (void *)updateApplicationState }, { "onActivityResult", "(IILandroid/content/Intent;)V", (void *)onActivityResult }, { "onNewIntent", "(Landroid/content/Intent;)V", (void *)onNewIntent }, - { "onBind", "(Landroid/content/Intent;)Landroid/os/IBinder;", (void *)onBind } + { "onBind", "(Landroid/content/Intent;)Landroid/os/IBinder;", (void *)onBind }, + { "updateLocale", "()V", (void *)updateLocale }, }; #define FIND_AND_CHECK_CLASS(CLASS_NAME) \