blob: d9105334f2b3d32c8f4faa3732a79e7f9344acd3 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/device/time_zone_monitor/time_zone_monitor.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/strings/string_piece.h"
#include "base/trace_event/trace_event.h"
#include "third_party/icu/source/common/unicode/unistr.h"
#include "third_party/icu/source/i18n/unicode/timezone.h"
namespace device {
TimeZoneMonitor::TimeZoneMonitor()
: timezone_(icu::TimeZone::createDefault()) {}
TimeZoneMonitor::~TimeZoneMonitor() {
DCHECK(thread_checker_.CalledOnValidThread());
}
void TimeZoneMonitor::Bind(
mojo::PendingReceiver<device::mojom::TimeZoneMonitor> receiver) {
DCHECK(thread_checker_.CalledOnValidThread());
receivers_.Add(this, std::move(receiver));
}
void TimeZoneMonitor::NotifyClients(base::StringPiece zone_id_str) {
DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("device", "TimeZoneMonitor::NotifyClients");
VLOG(1) << "timezone reset to " << zone_id_str;
for (auto& client : clients_)
client->OnTimeZoneChange(zone_id_str.as_string());
}
void TimeZoneMonitor::UpdateIcuAndNotifyClients(
std::unique_ptr<icu::TimeZone> new_zone) {
DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("device", "TimeZoneMonitor::UpdateIcuAndNotifyClients");
// Do not notify clients if the timezone didn't change.
if (*timezone_ == *new_zone) {
return;
}
// Keep track of the last timezone sent to clients.
timezone_ = base::WrapUnique(new_zone->clone());
std::string zone_id_str = GetTimeZoneId(*new_zone);
icu::TimeZone::adoptDefault(new_zone.release());
NotifyClients(zone_id_str);
}
// static
std::unique_ptr<icu::TimeZone> TimeZoneMonitor::DetectHostTimeZoneFromIcu() {
return base::WrapUnique(icu::TimeZone::detectHostTimeZone());
}
// static
std::string TimeZoneMonitor::GetTimeZoneId(const icu::TimeZone& zone) {
icu::UnicodeString zone_id;
std::string zone_id_str;
zone.getID(zone_id).toUTF8String(zone_id_str);
return zone_id_str;
}
void TimeZoneMonitor::AddClient(
mojo::PendingRemote<device::mojom::TimeZoneMonitorClient> client) {
DCHECK(thread_checker_.CalledOnValidThread());
clients_.Add(std::move(client));
}
} // namespace device