summaryrefslogtreecommitdiffstats
path: root/src/corelib/time
diff options
context:
space:
mode:
authorEdward Welbourne <edward.welbourne@qt.io>2020-02-12 11:01:51 +0100
committerEdward Welbourne <edward.welbourne@qt.io>2020-04-16 13:52:11 +0200
commitb34158d7a1e89e5e7b32d3425c3df52aacedbb31 (patch)
treeb9fa377b4c62b223f0bd35106df6de0610974cfe /src/corelib/time
parent8138c812cbd65233a61d6e2e2f783d060c02de60 (diff)
Fix display-name calls in QAndroidTimeZonePrivate::init()
Following up on commits 4fa8dfee5dd31433d22fdb449c1783e256931c8f and c20c7efea96046bebcb8ff7823d3a7e227f92e73, where I apparently got the call to Java's getDisplayName() method wrong. Use the same code as our own displayName() method used for this, pulled out as a function to be shared by the two callers. This requires a locale and it's not immediately obvious which to use, so try the three most plausible candidates: C locale because IANA IDs are typically in it; default because that's most likely what language a user-supplied locale name might be in; and system because the name may have come from the system, not the user. In the process fixed some loops that didn't visit all the values they thought they did. Fixes: QTBUG-81975 Change-Id: I7867ca6f46951315a41c389107439acb439eaf08 Reviewed-by: BogDan Vatra <bogdan@kdab.com>
Diffstat (limited to 'src/corelib/time')
-rw-r--r--src/corelib/time/qtimezoneprivate_android.cpp42
1 files changed, 29 insertions, 13 deletions
diff --git a/src/corelib/time/qtimezoneprivate_android.cpp b/src/corelib/time/qtimezoneprivate_android.cpp
index fc3653752a..ba87cf79fe 100644
--- a/src/corelib/time/qtimezoneprivate_android.cpp
+++ b/src/corelib/time/qtimezoneprivate_android.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Copyright (C) 2014 Drew Parsons <dparsons@emerall.com>
** Contact: https://www.qt.io/licensing/
**
@@ -78,6 +78,26 @@ QAndroidTimeZonePrivate::~QAndroidTimeZonePrivate()
{
}
+static QJNIObjectPrivate getDisplayName(QJNIObjectPrivate zone, jint style, jboolean dst,
+ const QLocale &locale)
+{
+ QJNIObjectPrivate jlanguage
+ = QJNIObjectPrivate::fromString(QLocale::languageToString(locale.language()));
+ QJNIObjectPrivate jcountry
+ = QJNIObjectPrivate::fromString(QLocale::countryToString(locale.country()));
+ QJNIObjectPrivate
+ jvariant = QJNIObjectPrivate::fromString(QLocale::scriptToString(locale.script()));
+ QJNIObjectPrivate jlocale("java.util.Locale",
+ "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
+ static_cast<jstring>(jlanguage.object()),
+ static_cast<jstring>(jcountry.object()),
+ static_cast<jstring>(jvariant.object()));
+
+ return zone.callObjectMethod("getDisplayName",
+ "(ZILjava/util/Locale;)Ljava/lang/String;",
+ dst, style, jlocale.object());
+}
+
void QAndroidTimeZonePrivate::init(const QByteArray &ianaId)
{
const QString iana = QString::fromUtf8(ianaId);
@@ -99,10 +119,13 @@ void QAndroidTimeZonePrivate::init(const QByteArray &ianaId)
// the zone object we got and ignore the zone if not.
// Try checking ianaId against getID(), getDisplayName():
m_id = match(androidTimeZone.callObjectMethod("getID", "()Ljava/lang/String;"));
- for (int style = 1; m_id.isEmpty() && style-- > 0;) {
- for (int dst = 1; m_id.isEmpty() && dst-- > 0;) {
- m_id = match(androidTimeZone.callObjectMethod(
- "getDisplayName", "(ZI)Ljava/lang/String;", bool(dst), style));
+ for (int style = 1; m_id.isEmpty() && style >= 0; --style) {
+ for (int dst = 1; m_id.isEmpty() && dst >= 0; --dst) {
+ for (int pick = 2; m_id.isEmpty() && pick >= 0; --pick) {
+ QLocale locale = (pick == 0 ? QLocale::system()
+ : pick == 1 ? QLocale() : QLocale::c());
+ m_id = match(getDisplayName(androidTimeZone, style, jboolean(dst), locale));
+ }
}
}
}
@@ -124,14 +147,7 @@ QString QAndroidTimeZonePrivate::displayName(QTimeZone::TimeType timeType, QTime
// treat all NameTypes as java TimeZone style LONG (value 1), except of course QTimeZone::ShortName which is style SHORT (value 0);
jint style = (nameType == QTimeZone::ShortName ? 0 : 1);
- QJNIObjectPrivate jlanguage = QJNIObjectPrivate::fromString(QLocale::languageToString(locale.language()));
- QJNIObjectPrivate jcountry = QJNIObjectPrivate::fromString(QLocale::countryToString(locale.country()));
- QJNIObjectPrivate jvariant = QJNIObjectPrivate::fromString(QLocale::scriptToString(locale.script()));
- QJNIObjectPrivate jlocale("java.util.Locale", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", static_cast<jstring>(jlanguage.object()), static_cast<jstring>(jcountry.object()), static_cast<jstring>(jvariant.object()));
-
- QJNIObjectPrivate jname = androidTimeZone.callObjectMethod("getDisplayName", "(ZILjava/util/Locale;)Ljava/lang/String;", daylightTime, style, jlocale.object());
-
- name = jname.toString();
+ name = getDisplayName(androidTimeZone, style, daylightTime, locale).toString();
}
return name;