8#include <QtCore/QJniEnvironment>
10#include <QtCore/qjnitypes.h>
14Q_DECLARE_JNI_CLASS(TimeZone,
"java/util/TimeZone");
19
20
21
22
23
24
25
26
29QAndroidTimeZonePrivate::QAndroidTimeZonePrivate()
33 androidTimeZone = QJniObject::callStaticMethod<QtJniTypes::TimeZone>(
34 QtJniTypes::Traits<QtJniTypes::TimeZone>::className(),
"getDefault");
35 const QJniObject id = androidTimeZone.callMethod<jstring>(
"getID");
36 m_id = id.toString().toUtf8();
40QAndroidTimeZonePrivate::QAndroidTimeZonePrivate(
const QByteArray &ianaId)
46QAndroidTimeZonePrivate::~QAndroidTimeZonePrivate()
51 const QLocale &locale)
53 QJniObject jbcpTag = QJniObject::fromString(locale.bcp47Name());
54 QJniObject jlocale = QJniObject::callStaticMethod<QtJniTypes::Locale>(
55 QtJniTypes::Traits<QtJniTypes::Locale>::className(),
"forLanguageTag",
56 jbcpTag.object<jstring>());
58 return zone.callMethod<jstring>(
"getDisplayName", dst, style,
59 jlocale.object<QtJniTypes::Locale>()).toString();
62void QAndroidTimeZonePrivate::init(
const QByteArray &ianaId)
64 const QString iana = QString::fromUtf8(ianaId);
65 androidTimeZone = QJniObject::callStaticMethod<QtJniTypes::TimeZone>(
66 QtJniTypes::Traits<QtJniTypes::TimeZone>::className(),
"getTimeZone",
67 QJniObject::fromString(iana).object<jstring>());
70 const auto match = [iana](
const QString &name) -> QByteArray {
71 if (iana.compare(name, Qt::CaseInsensitive) == 0)
81 m_id = match(androidTimeZone.callMethod<jstring>(
"getID").toString());
82 for (
int style = 1; m_id.isEmpty() && style >= 0; --style) {
83 for (
int dst = 1; m_id.isEmpty() && dst >= 0; --dst) {
84 for (
int pick = 2; m_id.isEmpty() && pick >= 0; --pick) {
85 QLocale locale = (pick == 0 ? QLocale::system()
86 : pick == 1 ? QLocale() : QLocale::c());
87 m_id = match(getDisplayName(androidTimeZone, style, jboolean(dst), locale));
93QAndroidTimeZonePrivate *QAndroidTimeZonePrivate::clone()
const
95 return new QAndroidTimeZonePrivate(*
this);
99QString QAndroidTimeZonePrivate::displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
100 const QLocale &locale)
const
104 if (androidTimeZone.isValid()) {
105 jboolean daylightTime = (timeType == QTimeZone::DaylightTime);
108 jint style = (nameType == QTimeZone::ShortName ? 0 : 1);
110 name = getDisplayName(androidTimeZone, style, daylightTime, locale);
116QString QAndroidTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch)
const
118 if ( isDaylightTime( atMSecsSinceEpoch ) )
119 return displayName(QTimeZone::DaylightTime, QTimeZone::ShortName, QLocale() );
121 return displayName(QTimeZone::StandardTime, QTimeZone::ShortName, QLocale() );
124int QAndroidTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch)
const
128 if ( androidTimeZone.isValid() ) {
130 return androidTimeZone.callMethod<jint>(
131 "getOffset",
static_cast<jlong>(atMSecsSinceEpoch) ) / 1000;
137int QAndroidTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch)
const
140 Q_UNUSED( atMSecsSinceEpoch );
141 if ( androidTimeZone.isValid() )
143 return androidTimeZone.callMethod<jint>(
"getRawOffset" ) / 1000;
148int QAndroidTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch)
const
150 return ( offsetFromUtc(atMSecsSinceEpoch) - standardTimeOffset(atMSecsSinceEpoch) );
153bool QAndroidTimeZonePrivate::hasDaylightTime()
const
155 if ( androidTimeZone.isValid() )
157 return androidTimeZone.callMethod<jboolean>(
"useDaylightTime" );
162bool QAndroidTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch)
const
164 if ( androidTimeZone.isValid() ) {
165 QJniObject jDate = QJniObject::construct<QtJniTypes::Date>(
166 static_cast<jlong>(atMSecsSinceEpoch));
167 return androidTimeZone.callMethod<jboolean>(
"inDaylightTime",
168 jDate.object<QtJniTypes::Date>());
174QTimeZonePrivate::Data QAndroidTimeZonePrivate::data(qint64 forMSecsSinceEpoch)
const
176 if (androidTimeZone.isValid()) {
177 return Data(abbreviation(forMSecsSinceEpoch), forMSecsSinceEpoch,
178 offsetFromUtc(forMSecsSinceEpoch),
179 standardTimeOffset(forMSecsSinceEpoch));
187QByteArray QAndroidTimeZonePrivate::systemTimeZoneId()
const
190 QJniObject androidSystemTimeZone = QJniObject::callStaticMethod<QtJniTypes::TimeZone>(
191 QtJniTypes::Traits<QtJniTypes::TimeZone>::className(),
"getDefault");
192 const QJniObject id = androidSystemTimeZone.callMethod<jstring>(
"getID");
193 return id.toString().toUtf8();
196bool QAndroidTimeZonePrivate::isTimeZoneIdAvailable(
const QByteArray &ianaId)
const
198 QAndroidTimeZonePrivate probe(ianaId);
199 return probe.isValid();
202QList<QByteArray> QAndroidTimeZonePrivate::availableTimeZoneIds()
const
204 using namespace QtJniTypes;
206 const QJniArray androidAvailableIdList
207 = TimeZone::callStaticMethod<String[]>(
"getAvailableIDs");
210 QList<QByteArray> result;
211 result.reserve(androidAvailableIdList.size());
212 for (
const auto &id : androidAvailableIdList)
213 result.append(id.toString().toUtf8());
216 std::sort(result.begin(), result.end());
217 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)