61 lines
1.7 KiB
C++
61 lines
1.7 KiB
C++
// Copyright 2020 The Chromium Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "components/metrics/date_changed_helper.h"
|
|
|
|
#include "base/time/time.h"
|
|
#include "components/prefs/pref_registry_simple.h"
|
|
#include "components/prefs/pref_service.h"
|
|
|
|
namespace metrics {
|
|
|
|
namespace {
|
|
|
|
base::Time GetCurrentDate(base::Time now) {
|
|
// Use local midnight to ensure reporting is for calendar days, not UTC, and
|
|
// avoid storing extra information about when this was called.
|
|
return now.LocalMidnight();
|
|
}
|
|
|
|
void UpdateStoredDate(PrefService* prefs,
|
|
const char* pref_name,
|
|
base::Time now) {
|
|
prefs->SetTime(pref_name, GetCurrentDate(now));
|
|
}
|
|
|
|
bool IsStoredDateToday(PrefService* prefs,
|
|
const char* pref_name,
|
|
base::Time now) {
|
|
base::Time stored_date = prefs->GetTime(pref_name);
|
|
if (stored_date.is_null()) {
|
|
// Consider date unchanged if pref has never been set.
|
|
UpdateStoredDate(prefs, pref_name, GetCurrentDate(now));
|
|
return true;
|
|
}
|
|
// Ignore small changes in midnight such as time zone changes.
|
|
return std::abs((stored_date - GetCurrentDate(now)).InHours()) < 12;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
namespace date_changed_helper {
|
|
|
|
bool HasDateChangedSinceLastCall(PrefService* prefs, const char* pref_name) {
|
|
DCHECK(prefs);
|
|
DCHECK(pref_name);
|
|
base::Time now = base::Time::Now();
|
|
if (IsStoredDateToday(prefs, pref_name, now))
|
|
return false;
|
|
UpdateStoredDate(prefs, pref_name, now);
|
|
return true;
|
|
}
|
|
|
|
void RegisterPref(PrefRegistrySimple* registry, const char* pref_name) {
|
|
registry->RegisterTimePref(pref_name, base::Time());
|
|
}
|
|
|
|
} // namespace date_changed_helper
|
|
|
|
} // namespace metrics
|