|  | // Copyright 2016 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. | 
|  |  | 
|  | #ifndef COMPONENTS_METRICS_DATA_USE_TRACKER_H_ | 
|  | #define COMPONENTS_METRICS_DATA_USE_TRACKER_H_ | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "base/callback.h" | 
|  | #include "base/gtest_prod_util.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/sequence_checker.h" | 
|  | #include "base/time/time.h" | 
|  | #include "components/prefs/pref_registry_simple.h" | 
|  | #include "components/prefs/pref_service.h" | 
|  |  | 
|  | namespace metrics { | 
|  |  | 
|  | typedef base::Callback<void(const std::string&, int, bool)> | 
|  | UpdateUsagePrefCallbackType; | 
|  |  | 
|  | // Records the data use of user traffic and UMA traffic in user prefs. Taking | 
|  | // into account those prefs it can verify whether certain UMA log upload is | 
|  | // allowed. | 
|  | class DataUseTracker { | 
|  | public: | 
|  | explicit DataUseTracker(PrefService* local_state); | 
|  | virtual ~DataUseTracker(); | 
|  |  | 
|  | // Returns an instance of |DataUseTracker| with provided |local_state| if | 
|  | // users data use should be tracked and null pointer otherwise. | 
|  | static std::unique_ptr<DataUseTracker> Create(PrefService* local_state); | 
|  |  | 
|  | // Registers data use prefs using provided |registry|. | 
|  | static void RegisterPrefs(PrefRegistrySimple* registry); | 
|  |  | 
|  | // Updates data usage tracking prefs with the specified values. | 
|  | void UpdateMetricsUsagePrefs(const std::string& service_name, | 
|  | int message_size, | 
|  | bool is_cellular); | 
|  |  | 
|  | // Returns whether a log with provided |log_bytes| can be uploaded according | 
|  | // to data use ratio and UMA quota provided by variations. | 
|  | bool ShouldUploadLogOnCellular(int log_bytes); | 
|  |  | 
|  | private: | 
|  | FRIEND_TEST_ALL_PREFIXES(DataUseTrackerTest, CheckUpdateUsagePref); | 
|  | FRIEND_TEST_ALL_PREFIXES(DataUseTrackerTest, CheckRemoveExpiredEntries); | 
|  | FRIEND_TEST_ALL_PREFIXES(DataUseTrackerTest, CheckComputeTotalDataUse); | 
|  | FRIEND_TEST_ALL_PREFIXES(DataUseTrackerTest, CheckCanUploadUMALog); | 
|  |  | 
|  | // Updates provided |pref_name| for a current date with the given message | 
|  | // size. | 
|  | void UpdateUsagePref(const std::string& pref_name, int message_size); | 
|  |  | 
|  | // Removes entries from the all data use  prefs. | 
|  | void RemoveExpiredEntries(); | 
|  |  | 
|  | // Removes entries from the given |pref_name| if they are more than 7 days | 
|  | // old. | 
|  | void RemoveExpiredEntriesForPref(const std::string& pref_name); | 
|  |  | 
|  | // Computes data usage according to all the entries in the given dictionary | 
|  | // pref. | 
|  | int ComputeTotalDataUse(const std::string& pref_name); | 
|  |  | 
|  | // Returns the weekly allowed quota for UMA data use. | 
|  | virtual bool GetUmaWeeklyQuota(int* uma_weekly_quota_bytes) const; | 
|  |  | 
|  | // Returns the allowed ratio for UMA data use over overall data use. | 
|  | virtual bool GetUmaRatio(double* ratio) const; | 
|  |  | 
|  | // Returns the current date for measurement. | 
|  | virtual base::Time GetCurrentMeasurementDate() const; | 
|  |  | 
|  | // Returns the current date as a string with a proper formatting. | 
|  | virtual std::string GetCurrentMeasurementDateAsString() const; | 
|  |  | 
|  | PrefService* local_state_; | 
|  |  | 
|  | SEQUENCE_CHECKER(sequence_checker_); | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(DataUseTracker); | 
|  | }; | 
|  |  | 
|  | }  // namespace metrics | 
|  | #endif  // COMPONENTS_METRICS_DATA_USE_TRACKER_H_ |