summaryrefslogtreecommitdiffstats
path: root/src/corelib/time/qtimezoneprivate_android.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/time/qtimezoneprivate_android.cpp')
-rw-r--r--src/corelib/time/qtimezoneprivate_android.cpp53
1 files changed, 23 insertions, 30 deletions
diff --git a/src/corelib/time/qtimezoneprivate_android.cpp b/src/corelib/time/qtimezoneprivate_android.cpp
index c4ca0e4214..e80d15fab1 100644
--- a/src/corelib/time/qtimezoneprivate_android.cpp
+++ b/src/corelib/time/qtimezoneprivate_android.cpp
@@ -7,13 +7,14 @@
#include <QtCore/QJniEnvironment>
#include <QtCore/QSet>
+#include <QtCore/qjnitypes.h>
QT_BEGIN_NAMESPACE
Q_DECLARE_JNI_CLASS(TimeZone, "java/util/TimeZone");
Q_DECLARE_JNI_CLASS(Locale, "java/util/Locale");
Q_DECLARE_JNI_CLASS(Date, "java/util/Date");
-Q_DECLARE_JNI_TYPE(StringArray, "[Ljava/lang/String;")
+Q_DECLARE_JNI_CLASS(String, "java/lang/String")
/*
Private
@@ -31,7 +32,7 @@ QAndroidTimeZonePrivate::QAndroidTimeZonePrivate()
{
// Keep in sync with systemTimeZoneId():
androidTimeZone = QJniObject::callStaticMethod<QtJniTypes::TimeZone>(
- QtJniTypes::className<QtJniTypes::TimeZone>(), "getDefault");
+ QtJniTypes::Traits<QtJniTypes::TimeZone>::className(), "getDefault");
const QJniObject id = androidTimeZone.callMethod<jstring>("getID");
m_id = id.toString().toUtf8();
}
@@ -59,7 +60,7 @@ static QString getDisplayName(QJniObject zone, jint style, jboolean dst,
{
QJniObject jbcpTag = QJniObject::fromString(locale.bcp47Name());
QJniObject jlocale = QJniObject::callStaticMethod<QtJniTypes::Locale>(
- QtJniTypes::className<QtJniTypes::Locale>(), "forLanguageTag",
+ QtJniTypes::Traits<QtJniTypes::Locale>::className(), "forLanguageTag",
jbcpTag.object<jstring>());
return zone.callMethod<jstring>("getDisplayName", dst, style,
@@ -70,7 +71,7 @@ void QAndroidTimeZonePrivate::init(const QByteArray &ianaId)
{
const QString iana = QString::fromUtf8(ianaId);
androidTimeZone = QJniObject::callStaticMethod<QtJniTypes::TimeZone>(
- QtJniTypes::className<QtJniTypes::TimeZone>(), "getTimeZone",
+ QtJniTypes::Traits<QtJniTypes::TimeZone>::className(), "getTimeZone",
QJniObject::fromString(iana).object<jstring>());
// The ID or display name of the zone we've got, if it looks like what we asked for:
@@ -181,16 +182,11 @@ bool QAndroidTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
QTimeZonePrivate::Data QAndroidTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
{
if (androidTimeZone.isValid()) {
- Data data;
- data.atMSecsSinceEpoch = forMSecsSinceEpoch;
- data.standardTimeOffset = standardTimeOffset(forMSecsSinceEpoch);
- data.offsetFromUtc = offsetFromUtc(forMSecsSinceEpoch);
- data.daylightTimeOffset = data.offsetFromUtc - data.standardTimeOffset;
- data.abbreviation = abbreviation(forMSecsSinceEpoch);
- return data;
- } else {
- return invalidData();
+ return Data(abbreviation(forMSecsSinceEpoch), forMSecsSinceEpoch,
+ offsetFromUtc(forMSecsSinceEpoch),
+ standardTimeOffset(forMSecsSinceEpoch));
}
+ return {};
}
// java.util.TimeZone does not directly provide transitions,
@@ -200,30 +196,27 @@ QByteArray QAndroidTimeZonePrivate::systemTimeZoneId() const
{
// Keep in sync with default constructor:
QJniObject androidSystemTimeZone = QJniObject::callStaticMethod<QtJniTypes::TimeZone>(
- QtJniTypes::className<QtJniTypes::TimeZone>(), "getDefault");
+ QtJniTypes::Traits<QtJniTypes::TimeZone>::className(), "getDefault");
const QJniObject id = androidSystemTimeZone.callMethod<jstring>("getID");
return id.toString().toUtf8();
}
+bool QAndroidTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const
+{
+ QAndroidTimeZonePrivate probe(ianaId);
+ return probe.isValid();
+}
+
QList<QByteArray> QAndroidTimeZonePrivate::availableTimeZoneIds() const
{
+ using namespace QtJniTypes;
+
+ const QJniArray androidAvailableIdList = TimeZone::callStaticMethod<String[]>("getAvailableIDs");
+
QList<QByteArray> availableTimeZoneIdList;
- QJniObject androidAvailableIdList = QJniObject::callStaticMethod<QtJniTypes::StringArray>(
- QtJniTypes::className<QtJniTypes::TimeZone>(), "getAvailableIDs");
-
- QJniEnvironment jniEnv;
- int androidTZcount = jniEnv->GetArrayLength(androidAvailableIdList.object<jarray>());
-
- // need separate jobject and QJniObject here so that we can delete (DeleteLocalRef) the reference to the jobject
- // (or else the JNI reference table fills after 512 entries from GetObjectArrayElement)
- jobject androidTZobject;
- QJniObject androidTZ;
- for (int i = 0; i < androidTZcount; i++) {
- androidTZobject = jniEnv->GetObjectArrayElement(androidAvailableIdList.object<jobjectArray>(), i);
- androidTZ = androidTZobject;
- availableTimeZoneIdList.append(androidTZ.toString().toUtf8());
- jniEnv->DeleteLocalRef(androidTZobject);
- }
+ availableTimeZoneIdList.reserve(androidAvailableIdList.size());
+ for (const auto &id : androidAvailableIdList)
+ availableTimeZoneIdList.append(id.toString().toUtf8());
return availableTimeZoneIdList;
}