From 8ac49acca637940842f2f3ab702cd52d0a343283 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Thu, 26 Oct 2023 16:32:20 +0200 Subject: [PATCH] Android: Modernize the QAndroidSystemLocale implementation Declare the Java classes we use, and use the modern template API to call methods and access fields. Make use of the implicit conversion to QString. As a drive-by, limit the write-locking of the mutex that protects the data to the write access to that data. The rest of the function operates on objects on the stack. Change-Id: I3991c3804339f005aaf8e81a697363ab39306a2f Reviewed-by: Assam Boudjelthia --- .../android/qandroidsystemlocale.cpp | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/plugins/platforms/android/qandroidsystemlocale.cpp b/src/plugins/platforms/android/qandroidsystemlocale.cpp index ab1ece7d39..d1e9dd81c2 100644 --- a/src/plugins/platforms/android/qandroidsystemlocale.cpp +++ b/src/plugins/platforms/android/qandroidsystemlocale.cpp @@ -12,28 +12,34 @@ QT_BEGIN_NAMESPACE +Q_DECLARE_JNI_CLASS(Locale, "java/util/Locale") +Q_DECLARE_JNI_CLASS(Resources, "android/content/res/Resources") +Q_DECLARE_JNI_CLASS(Configuration, "android/content/res/Configuration") +Q_DECLARE_JNI_CLASS(LocaleList, "android/os/LocaleList") + +using namespace QtJniTypes; + QAndroidSystemLocale::QAndroidSystemLocale() : m_locale(QLocale::C) { } void QAndroidSystemLocale::getLocaleFromJava() const { + const Locale javaLocaleObject = []{ + const QJniObject javaContext = QtAndroidPrivate::context(); + if (javaContext.isValid()) { + const QJniObject resources = javaContext.callMethod("getResources"); + const QJniObject configuration = resources.callMethod("getConfiguration"); + return configuration.getField("locale"); + } else { + return Locale::callStaticMethod("getDefault"); + } + }(); + + const QString languageCode = javaLocaleObject.callMethod("getLanguage"); + const QString countryCode = javaLocaleObject.callMethod("getCountry"); + QWriteLocker locker(&m_lock); - - QJniObject javaLocaleObject; - const QJniObject javaContext = QtAndroidPrivate::context(); - if (javaContext.isValid()) { - QJniObject resources = javaContext.callObjectMethod("getResources", "()Landroid/content/res/Resources;"); - QJniObject configuration = resources.callObjectMethod("getConfiguration", "()Landroid/content/res/Configuration;"); - - javaLocaleObject = configuration.getObjectField("locale", "Ljava/util/Locale;"); - } else { - javaLocaleObject = QJniObject::callStaticObjectMethod("java/util/Locale", "getDefault", "()Ljava/util/Locale;"); - } - - QString languageCode = javaLocaleObject.callObjectMethod("getLanguage", "()Ljava/lang/String;").toString(); - QString countryCode = javaLocaleObject.callObjectMethod("getCountry", "()Ljava/lang/String;").toString(); - m_locale = QLocale(languageCode + u'_' + countryCode); } @@ -140,12 +146,9 @@ QVariant QAndroidSystemLocale::query(QueryType type, QVariant in) const Q_ASSERT_X(false, Q_FUNC_INFO, "This can't happen."); case UILanguages: { if (QtAndroidPrivate::androidSdkVersion() >= 24) { - QJniObject localeListObject = - QJniObject::callStaticObjectMethod("android/os/LocaleList", "getDefault", - "()Landroid/os/LocaleList;"); + LocaleList localeListObject = LocaleList::callStaticMethod("getDefault"); if (localeListObject.isValid()) { - QString lang = localeListObject.callObjectMethod("toLanguageTags", - "()Ljava/lang/String;").toString(); + QString lang = localeListObject.callMethod("toLanguageTags"); // Some devices return with it enclosed in []'s so check if both exists before // removing to ensure it is formatted correctly if (lang.startsWith(QChar('[')) && lang.endsWith(QChar(']')))