9#include <QtCore/QJniEnvironment>
11#include <QtCore/qjnitypes.h>
15Q_DECLARE_JNI_CLASS(TimeZone,
"java/util/TimeZone");
20
21
22
23
24
25
26
27
30QAndroidTimeZonePrivate::QAndroidTimeZonePrivate()
34 androidTimeZone = QJniObject::callStaticMethod<QtJniTypes::TimeZone>(
35 QtJniTypes::Traits<QtJniTypes::TimeZone>::className(),
"getDefault");
36 const QJniObject id = androidTimeZone.callMethod<jstring>(
"getID");
37 m_id = id.toString().toUtf8();
41QAndroidTimeZonePrivate::QAndroidTimeZonePrivate(
const QByteArray &ianaId)
47QAndroidTimeZonePrivate::~QAndroidTimeZonePrivate()
52 const QLocale &locale)
54 QJniObject jbcpTag = QJniObject::fromString(locale.bcp47Name());
55 QJniObject jlocale = QJniObject::callStaticMethod<QtJniTypes::Locale>(
56 QtJniTypes::Traits<QtJniTypes::Locale>::className(),
"forLanguageTag",
57 jbcpTag.object<jstring>());
59 return zone.callMethod<jstring>(
"getDisplayName", dst, style,
60 jlocale.object<QtJniTypes::Locale>()).toString();
63void QAndroidTimeZonePrivate::init(
const QByteArray &ianaId)
65 const QString iana = QString::fromUtf8(ianaId);
66 androidTimeZone = QJniObject::callStaticMethod<QtJniTypes::TimeZone>(
67 QtJniTypes::Traits<QtJniTypes::TimeZone>::className(),
"getTimeZone",
68 QJniObject::fromString(iana).object<jstring>());
71 const auto match = [iana](
const QString &name) -> QByteArray {
72 if (iana.compare(name, Qt::CaseInsensitive) == 0)
82 m_id = match(androidTimeZone.callMethod<jstring>(
"getID").toString());
83 for (
int style = 1; m_id.isEmpty() && style >= 0; --style) {
84 for (
int dst = 1; m_id.isEmpty() && dst >= 0; --dst) {
85 for (
int pick = 2; m_id.isEmpty() && pick >= 0; --pick) {
86 QLocale locale = (pick == 0 ? QLocale::system()
87 : pick == 1 ? QLocale() : QLocale::c());
88 m_id = match(getDisplayName(androidTimeZone, style, jboolean(dst), locale));
94QAndroidTimeZonePrivate *QAndroidTimeZonePrivate::clone()
const
96 return new QAndroidTimeZonePrivate(*
this);
100QString QAndroidTimeZonePrivate::displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
101 const QLocale &locale)
const
105 if (androidTimeZone.isValid()) {
106 jboolean daylightTime = (timeType == QTimeZone::DaylightTime);
109 jint style = (nameType == QTimeZone::ShortName ? 0 : 1);
111 name = getDisplayName(androidTimeZone, style, daylightTime, locale);
117QString QAndroidTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch)
const
119 if ( isDaylightTime( atMSecsSinceEpoch ) )
120 return displayName(QTimeZone::DaylightTime, QTimeZone::ShortName, QLocale() );
122 return displayName(QTimeZone::StandardTime, QTimeZone::ShortName, QLocale() );
125int QAndroidTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch)
const
129 if ( androidTimeZone.isValid() ) {
131 return androidTimeZone.callMethod<jint>(
132 "getOffset",
static_cast<jlong>(atMSecsSinceEpoch) ) / 1000;
138int QAndroidTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch)
const
141 Q_UNUSED( atMSecsSinceEpoch );
142 if ( androidTimeZone.isValid() )
144 return androidTimeZone.callMethod<jint>(
"getRawOffset" ) / 1000;
149int QAndroidTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch)
const
151 return ( offsetFromUtc(atMSecsSinceEpoch) - standardTimeOffset(atMSecsSinceEpoch) );
154bool QAndroidTimeZonePrivate::hasDaylightTime()
const
156 if ( androidTimeZone.isValid() )
158 return androidTimeZone.callMethod<jboolean>(
"useDaylightTime" );
163bool QAndroidTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch)
const
165 if ( androidTimeZone.isValid() ) {
166 QJniObject jDate = QJniObject::construct<QtJniTypes::Date>(
167 static_cast<jlong>(atMSecsSinceEpoch));
168 return androidTimeZone.callMethod<jboolean>(
"inDaylightTime",
169 jDate.object<QtJniTypes::Date>());
175QTimeZonePrivate::Data QAndroidTimeZonePrivate::data(qint64 forMSecsSinceEpoch)
const
177 if (androidTimeZone.isValid()) {
178 return Data(abbreviation(forMSecsSinceEpoch), forMSecsSinceEpoch,
179 offsetFromUtc(forMSecsSinceEpoch),
180 standardTimeOffset(forMSecsSinceEpoch));
188QByteArray QAndroidTimeZonePrivate::systemTimeZoneId()
const
191 QJniObject androidSystemTimeZone = QJniObject::callStaticMethod<QtJniTypes::TimeZone>(
192 QtJniTypes::Traits<QtJniTypes::TimeZone>::className(),
"getDefault");
193 const QJniObject id = androidSystemTimeZone.callMethod<jstring>(
"getID");
194 return id.toString().toUtf8();
197bool QAndroidTimeZonePrivate::isTimeZoneIdAvailable(
const QByteArray &ianaId)
const
199 QAndroidTimeZonePrivate probe(ianaId);
200 return probe.isValid();
203QList<QByteArray> QAndroidTimeZonePrivate::availableTimeZoneIds()
const
205 using namespace QtJniTypes;
207 const QJniArray androidAvailableIdList
208 = TimeZone::callStaticMethod<String[]>(
"getAvailableIDs");
211 QList<QByteArray> result;
212 result.reserve(androidAvailableIdList.size());
213 for (
const auto &id : androidAvailableIdList)
214 result.append(id.toString().toUtf8());
217 std::sort(result.begin(), result.end());
218 result.erase(std::unique(result.begin(), result.end()), result.end());
Combined button and popup list for selecting options.
Q_DECLARE_JNI_CLASS(MotionEvent, "android/view/MotionEvent")
static QString getDisplayName(QJniObject zone, jint style, jboolean dst, const QLocale &locale)