From 219fbe7b21252a82aec396c4113ee8bf779ea062 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Tue, 6 Feb 2024 14:14:11 +0100 Subject: [PATCH] Implement QTZP::isTimeZoneIdAvailable() on Android The QTZP base implementation of the availability check was to construct the list of all available IDs, then see whether the given ID appears in it. This can be very inefficient. The ICU backend has recently grown a more efficient solution than that, matching the TZ and Darwin backends. For Android this was still very inefficient, but its instantiation is cheaper, so simply instantiate and see if the result is valid. For MS, the backend caches the list of available zones, so searching the list is a reasonable solution, given the complexity of its constructor. Add an implementation for Android and document, in the base-class, that the fall-back is only suitable for use if the list is cached. Pick-to: 6.6 6.5 Change-Id: I9dc2ba4be1492ec811c8db6cff9490ac0303115d Reviewed-by: Volker Krause Reviewed-by: Assam Boudjelthia Reviewed-by: Qt CI Bot (cherry picked from commit 7c502391cf73e3fa5bc02ea0b46261f0b5be0b84) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/time/qtimezoneprivate.cpp | 3 ++- src/corelib/time/qtimezoneprivate_android.cpp | 6 ++++++ src/corelib/time/qtimezoneprivate_p.h | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/corelib/time/qtimezoneprivate.cpp b/src/corelib/time/qtimezoneprivate.cpp index 71b1674b846..33770b0f2d4 100644 --- a/src/corelib/time/qtimezoneprivate.cpp +++ b/src/corelib/time/qtimezoneprivate.cpp @@ -465,7 +465,8 @@ QByteArray QTimeZonePrivate::systemTimeZoneId() const bool QTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray& ianaId) const { - // Fall-back implementation, can be made faster in subclasses + // Fall-back implementation, can be made faster in subclasses. + // Backends that don't cache the available list SHOULD override this. const QList tzIds = availableTimeZoneIds(); return std::binary_search(tzIds.begin(), tzIds.end(), ianaId); } diff --git a/src/corelib/time/qtimezoneprivate_android.cpp b/src/corelib/time/qtimezoneprivate_android.cpp index 05b4bd8cbc1..0194352f5ea 100644 --- a/src/corelib/time/qtimezoneprivate_android.cpp +++ b/src/corelib/time/qtimezoneprivate_android.cpp @@ -206,6 +206,12 @@ QByteArray QAndroidTimeZonePrivate::systemTimeZoneId() const return id.toString().toUtf8(); } +bool QAndroidTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const +{ + QAndroidTimeZonePrivate probe(ianaId); + return probe.isValid(); +} + QList QAndroidTimeZonePrivate::availableTimeZoneIds() const { QList availableTimeZoneIdList; diff --git a/src/corelib/time/qtimezoneprivate_p.h b/src/corelib/time/qtimezoneprivate_p.h index 4942ecd477a..f04157a654c 100644 --- a/src/corelib/time/qtimezoneprivate_p.h +++ b/src/corelib/time/qtimezoneprivate_p.h @@ -463,7 +463,7 @@ public: Data data(qint64 forMSecsSinceEpoch) const override; QByteArray systemTimeZoneId() const override; - + bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override; QList availableTimeZoneIds() const override; private: