date_changed_helper.cc 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/metrics/date_changed_helper.h"
  5. #include "base/time/time.h"
  6. #include "components/prefs/pref_registry_simple.h"
  7. #include "components/prefs/pref_service.h"
  8. namespace metrics {
  9. namespace {
  10. base::Time GetCurrentDate(base::Time now) {
  11. // Use local midnight to ensure reporting is for calendar days, not UTC, and
  12. // avoid storing extra information about when this was called.
  13. return now.LocalMidnight();
  14. }
  15. void UpdateStoredDate(PrefService* prefs,
  16. const char* pref_name,
  17. base::Time now) {
  18. prefs->SetTime(pref_name, GetCurrentDate(now));
  19. }
  20. bool IsStoredDateToday(PrefService* prefs,
  21. const char* pref_name,
  22. base::Time now) {
  23. base::Time stored_date = prefs->GetTime(pref_name);
  24. if (stored_date.is_null()) {
  25. // Consider date unchanged if pref has never been set.
  26. UpdateStoredDate(prefs, pref_name, GetCurrentDate(now));
  27. return true;
  28. }
  29. // Ignore small changes in midnight such as time zone changes.
  30. return std::abs((stored_date - GetCurrentDate(now)).InHours()) < 12;
  31. }
  32. } // namespace
  33. namespace date_changed_helper {
  34. bool HasDateChangedSinceLastCall(PrefService* prefs, const char* pref_name) {
  35. DCHECK(prefs);
  36. DCHECK(pref_name);
  37. base::Time now = base::Time::Now();
  38. if (IsStoredDateToday(prefs, pref_name, now))
  39. return false;
  40. UpdateStoredDate(prefs, pref_name, now);
  41. return true;
  42. }
  43. void RegisterPref(PrefRegistrySimple* registry, const char* pref_name) {
  44. registry->RegisterTimePref(pref_name, base::Time());
  45. }
  46. } // namespace date_changed_helper
  47. } // namespace metrics