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 <assam.boudjelthia@qt.io>
(cherry picked from commit 83483b8b200ab5cedf659f418c7296719902ddc4)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Volker Krause 2024-10-07 17:27:07 +02:00 committed by Qt Cherry-pick Bot
parent a012e558d5
commit 768c49a7e9
3 changed files with 19 additions and 1 deletions

View File

@ -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

View File

@ -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);

View File

@ -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) \