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 <assam.boudjelthia@qt.io>bb10
parent
180c7698e2
commit
8ac49acca6
|
|
@ -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<Resources>("getResources");
|
||||
const QJniObject configuration = resources.callMethod<Configuration>("getConfiguration");
|
||||
return configuration.getField<Locale>("locale");
|
||||
} else {
|
||||
return Locale::callStaticMethod<Locale>("getDefault");
|
||||
}
|
||||
}();
|
||||
|
||||
const QString languageCode = javaLocaleObject.callMethod<QString>("getLanguage");
|
||||
const QString countryCode = javaLocaleObject.callMethod<QString>("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<LocaleList>("getDefault");
|
||||
if (localeListObject.isValid()) {
|
||||
QString lang = localeListObject.callObjectMethod("toLanguageTags",
|
||||
"()Ljava/lang/String;").toString();
|
||||
QString lang = localeListObject.callMethod<QString>("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(']')))
|
||||
|
|
|
|||
Loading…
Reference in New Issue