| // Copyright 2018 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 "chrome/browser/android/explore_sites/history_statistics_reporter.h" |
| |
| #include <memory> |
| #include <utility> |
| #include "base/bind.h" |
| #include "base/metrics/histogram_macros.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| #include "chrome/common/pref_names.h" |
| #include "components/history/core/browser/history_service.h" |
| #include "components/history/core/browser/history_types.h" |
| |
| namespace { |
| // Delay between the scheduling and actual computing/reporting of stats. |
| const int kComputeStatisticsDelaySeconds = 5; |
| |
| // Pref name for the persistent timestamp of the last stats reporting. |
| const char kWeeklyStatsReportingTimestamp[] = |
| "explore_sites.weekly_stats_reporting_timestamp"; |
| } // namespace |
| |
| namespace explore_sites { |
| |
| // static |
| void HistoryStatisticsReporter::RegisterPrefs(PrefRegistrySimple* registry) { |
| registry->RegisterTimePref(kWeeklyStatsReportingTimestamp, base::Time()); |
| } |
| |
| // TODO(dimich): remove the need to have CancelableTaskTracker (by removing it |
| // from HistoryService::CountUniqueHostsVisitedLastMonth) |
| HistoryStatisticsReporter::HistoryStatisticsReporter( |
| history::HistoryService* history_service, |
| PrefService* prefs, |
| base::Clock* clock) |
| : history_service_(history_service), |
| prefs_(prefs), |
| clock_(clock), |
| cancelable_task_tracker_(new base::CancelableTaskTracker()), |
| history_service_observer_(this), |
| weak_ptr_factory_(this) {} |
| |
| HistoryStatisticsReporter::~HistoryStatisticsReporter() { |
| history_service_observer_.RemoveAll(); |
| } |
| |
| void HistoryStatisticsReporter::ScheduleReportStatistics() { |
| // Only try to report stats once per session. |
| if (attempted_to_report_once_ || !history_service_ || !prefs_) |
| return; |
| attempted_to_report_once_ = true; |
| |
| // If we've already reported metrics during last week, bail out. |
| base::Time last_report_time = prefs_->GetTime(kWeeklyStatsReportingTimestamp); |
| if (last_report_time > clock_->Now() - base::TimeDelta::FromDays(7)) |
| return; |
| prefs_->SetTime(kWeeklyStatsReportingTimestamp, clock_->Now()); |
| |
| base::TimeDelta computeStatisticsDelay = |
| base::TimeDelta::FromSeconds(kComputeStatisticsDelaySeconds); |
| |
| base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| FROM_HERE, |
| base::BindOnce(&HistoryStatisticsReporter::MaybeReportStatistics, |
| weak_ptr_factory_.GetWeakPtr()), |
| computeStatisticsDelay); |
| } |
| |
| void HistoryStatisticsReporter::OnHistoryServiceLoaded( |
| history::HistoryService* history_service) { |
| DCHECK(history_service == history_service_); |
| ComputeStatistics(); |
| } |
| |
| void HistoryStatisticsReporter::HistoryServiceBeingDeleted( |
| history::HistoryService* history_service) { |
| history_service_observer_.RemoveAll(); |
| } |
| |
| void HistoryStatisticsReporter::MaybeReportStatistics() { |
| if (history_service_->BackendLoaded()) { |
| // HistoryService is already loaded. Continue with Initialization. |
| ComputeStatistics(); |
| } else { |
| // Register for HistoryServiceLoading in case HistoryService is not yet |
| // ready. |
| DCHECK(!history_service_observer_.IsObserving(history_service_)); |
| history_service_observer_.Add(history_service_); |
| } |
| } |
| |
| void HistoryStatisticsReporter::ComputeStatistics() { |
| history_service_->CountUniqueHostsVisitedLastMonth( |
| base::BindRepeating(&HistoryStatisticsReporter::ReportStatistics, |
| weak_ptr_factory_.GetWeakPtr()), |
| cancelable_task_tracker_.get()); |
| } |
| |
| void HistoryStatisticsReporter::ReportStatistics( |
| history::HistoryCountResult result) { |
| if (!result.success) |
| return; |
| UMA_HISTOGRAM_COUNTS_1000("ExploreSites.MonthlyHostCount", result.count); |
| } |
| } // namespace explore_sites |