Index: chrome/browser/android/data_usage/external_data_use_observer.h |
diff --git a/chrome/browser/android/data_usage/external_data_use_observer.h b/chrome/browser/android/data_usage/external_data_use_observer.h |
index 671b1d3d25783a92b9efe198b3c83aed14794e59..9037c2fcbc1aad26bccca8fc682e43f48e184dac 100644 |
--- a/chrome/browser/android/data_usage/external_data_use_observer.h |
+++ b/chrome/browser/android/data_usage/external_data_use_observer.h |
@@ -5,27 +5,13 @@ |
#ifndef CHROME_BROWSER_ANDROID_DATA_USAGE_EXTERNAL_DATA_USE_OBSERVER_H_ |
#define CHROME_BROWSER_ANDROID_DATA_USAGE_EXTERNAL_DATA_USE_OBSERVER_H_ |
-#include <stddef.h> |
-#include <stdint.h> |
- |
-#include <memory> |
-#include <string> |
-#include <vector> |
- |
-#include "base/containers/hash_tables.h" |
#include "base/gtest_prod_util.h" |
#include "base/macros.h" |
#include "base/memory/ref_counted.h" |
#include "base/memory/weak_ptr.h" |
#include "base/threading/thread_checker.h" |
#include "base/time/time.h" |
-#include "chrome/browser/android/data_usage/data_use_tab_model.h" |
#include "components/data_usage/core/data_use_aggregator.h" |
-#include "net/base/network_change_notifier.h" |
- |
-#if defined(OS_ANDROID) |
-#include "base/android/application_status_listener.h" |
-#endif |
namespace base { |
class SingleThreadTaskRunner; |
@@ -39,31 +25,20 @@ namespace chrome { |
namespace android { |
+class DataUseTabModel; |
class ExternalDataUseObserverBridge; |
+class ExternalDataUseReporter; |
// This class allows platform APIs that are external to Chromium to observe how |
// much data is used by Chromium on the current Android device. This class |
// registers as a data use observer with DataUseAggregator (as long as there is |
-// at least one valid matching rule is present), filters the received |
-// observations by applying the regex matching to the URLs of the requests, and |
-// notifies the filtered data use to the platform. This class is not thread |
-// safe, and must only be accessed on IO thread. |
+// at least one valid matching rule is present), collects a batch of data |
+// use observations and passes them to ExternalDataUseReporter for labeling the |
+// data usage and reporting to the platform. This class also fetches the |
+// matching rules from external platform APIs, on demand and periodically. This |
+// class is not thread safe, and must only be accessed on IO thread. |
class ExternalDataUseObserver : public data_usage::DataUseAggregator::Observer { |
public: |
- // Result of data usage report submission. This enum must remain synchronized |
- // with the enum of the same name in metrics/histograms/histograms.xml. |
- enum DataUsageReportSubmissionResult { |
- // Submission of data use report to the external observer was successful. |
- DATAUSAGE_REPORT_SUBMISSION_SUCCESSFUL = 0, |
- // Submission of data use report to the external observer returned error. |
- DATAUSAGE_REPORT_SUBMISSION_FAILED = 1, |
- // Submission of data use report to the external observer timed out. |
- DATAUSAGE_REPORT_SUBMISSION_TIMED_OUT = 2, |
- // Data use report was lost before an attempt was made to submit it. |
- DATAUSAGE_REPORT_SUBMISSION_LOST = 3, |
- DATAUSAGE_REPORT_SUBMISSION_MAX = 4 |
- }; |
- |
// External data use observer field trial name. |
static const char kExternalDataUseObserverFieldTrial[]; |
@@ -77,11 +52,6 @@ class ExternalDataUseObserver : public data_usage::DataUseAggregator::Observer { |
// caller does not owns the returned pointer. |
DataUseTabModel* GetDataUseTabModel() const; |
- // Called by ExternalDataUseObserverBridge::OnReportDataUseDone when a data |
- // use report has been submitted. |success| is true if the request was |
- // successfully submitted to the external data use observer by Java. |
- void OnReportDataUseDone(bool success); |
- |
// Called by ExternalDataUseObserverBridge. |should_register| is true if |
// |this| should register as a data use observer. |
void ShouldRegisterAsDataUseObserver(bool should_register); |
@@ -91,140 +61,33 @@ class ExternalDataUseObserver : public data_usage::DataUseAggregator::Observer { |
base::WeakPtr<ExternalDataUseObserver> GetWeakPtr(); |
+ // Called by ExternalDataUseObserverBridge::OnReportDataUseDone when a data |
+ // use report has been submitted. |success| is true if the request was |
+ // successfully submitted to the external data use observer by Java. |
+ // TODO(rajendrant): Move this callback to ExternalDataUseReporter. In order |
+ // to move this, ExternalDataUseObserverBridge needs to hold a pointer to |
+ // ExternalDataUseReporter. This is currently not doable, since this creates |
+ // a circular dependency between ExternalDataUseReporter, DataUseTabModel and |
+ // ExternalDataUseObserverBridge, which creates issues during desctruction. |
+ void OnReportDataUseDone(bool success); |
+ |
private: |
friend class DataUseTabModelTest; |
friend class DataUseUITabModelTest; |
friend class ExternalDataUseObserverTest; |
- FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, BufferDataUseReports); |
- FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, BufferSize); |
- FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, DataUseReportTimedOut); |
-#if defined(OS_ANDROID) |
- FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, |
- DataUseReportingOnApplicationStatusChange); |
-#endif |
- FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, HashFunction); |
+ friend class ExternalDataUseReporterTest; |
tbansal1
2016/07/15 16:26:30
reporter tests should not be poking in EDUO.
Raj
2016/07/15 18:54:41
Done. Created GetExternalDataUseReporterForTests()
|
FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, |
MatchingRuleFetchOnControlAppInstall); |
- FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, MultipleMatchingRules); |
FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, |
PeriodicFetchMatchingRules); |
FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, |
RegisteredAsDataUseObserver); |
- FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, ReportsMergedCorrectly); |
- FRIEND_TEST_ALL_PREFIXES(DataUseUITabModelTest, ReportTabEventsTest); |
- FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, |
- TimestampsMergedCorrectly); |
FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, Variations); |
- |
- // DataUseReportKey is a unique identifier for a data use report. |
- struct DataUseReportKey { |
- DataUseReportKey(const std::string& label, |
- const std::string& tag, |
- net::NetworkChangeNotifier::ConnectionType connection_type, |
- const std::string& mcc_mnc); |
- |
- DataUseReportKey(const DataUseReportKey& other); |
- |
- bool operator==(const DataUseReportKey& other) const; |
- |
- // Label provided by the matching rules. |
- const std::string label; |
- |
- // Tag to report for the data usage. |
- const std::string tag; |
- |
- // Type of network used by the request. |
- const net::NetworkChangeNotifier::ConnectionType connection_type; |
- |
- // mcc_mnc operator of the provider of the SIM as obtained from |
- // TelephonyManager#getNetworkOperator() Java API in Android. |
- const std::string mcc_mnc; |
- }; |
- |
- // DataUseReport is paired with a DataUseReportKey object. DataUseReport |
- // contains the bytes send/received during a specific interval. Only the bytes |
- // from the data use reports that have the |label|, |connection_type|, and |
- // |mcc_mnc| specified in the corresponding DataUseReportKey object are |
- // counted in the DataUseReport. |
- struct DataUseReport { |
- // |start_time| and |end_time| are the start and end timestamps (in UTC |
- // since the standard Java epoch of 1970-01-01 00:00:00) of the interval |
- // that this data report covers. |bytes_downloaded| and |bytes_uploaded| are |
- // the total bytes received and send during this interval. |
- DataUseReport(const base::Time& start_time, |
- const base::Time& end_time, |
- int64_t bytes_downloaded, |
- int64_t bytes_uploaded); |
- |
- // Start time of |this| data report (in UTC since the standard Java epoch of |
- // 1970-01-01 00:00:00). |
- const base::Time start_time; |
- |
- // End time of |this| data report (in UTC since the standard Java epoch of |
- // 1970-01-01 00:00:00) |
- const base::Time end_time; |
- |
- // Number of bytes downloaded and uploaded by Chromium from |start_time| to |
- // |end_time|. |
- const int64_t bytes_downloaded; |
- const int64_t bytes_uploaded; |
- }; |
- |
- // Class that implements hash operator on DataUseReportKey. |
- class DataUseReportKeyHash { |
- public: |
- // A simple heuristical hash function that satisifes the property that two |
- // equal data structures have the same hash value. |
- size_t operator()(const DataUseReportKey& k) const; |
- }; |
- |
- typedef base::hash_map<DataUseReportKey, DataUseReport, DataUseReportKeyHash> |
- DataUseReports; |
- |
- // Maximum buffer size. If an entry needs to be added to the buffer that has |
- // size |kMaxBufferSize|, then the oldest entry will be removed. |
- static const size_t kMaxBufferSize; |
+ FRIEND_TEST_ALL_PREFIXES(DataUseUITabModelTest, ReportTabEventsTest); |
// data_usage::DataUseAggregator::Observer implementation: |
void OnDataUse(const data_usage::DataUse& data_use) override; |
- // Called by DataUseTabModel when tracking info has been retrieved for the |
- // |data_use| object. |tracking_info_valid| is true if |tracking_info| is |
- // populated that applies to the |data_use| object. |tracking_info| is owned |
- // by the caller. |
- void DataUseTrackingInfoRetrieved( |
- const data_usage::DataUse& data_use, |
- const base::Time& start_time, |
- const base::Time& end_time, |
- const DataUseTabModel::TrackingInfo* tracking_info, |
- bool tracking_info_valid); |
- |
- // Adds |data_use| to buffered reports. |data_use| is the data use report |
- // received from DataUseAggregator. |label| is a non-empty label that applies |
- // to |data_use|. |tag| is the tag to be applied for this data use. |
- // |start_time| and |end_time| are the start, and end times of the interval |
- // during which bytes reported in |data_use| went over the network. |
- void BufferDataUseReport(const data_usage::DataUse& data_use, |
- const std::string& label, |
- const std::string& tag, |
- const base::Time& start_time, |
- const base::Time& end_time); |
- |
- // Submits the first data report among the buffered data reports in |
- // |buffered_data_reports_|. Since an unordered map is used to buffer the |
- // reports, the order of reports may change. The reports are buffered in an |
- // arbitrary order and there are no guarantees that the next report to be |
- // submitted is the oldest one buffered. |immediate| indicates whether to |
- // submit the report immediately or to wait until |data_use_report_min_bytes_| |
- // unreported bytes are buffered. |
- void SubmitBufferedDataUseReport(bool immediate); |
- |
-#if defined(OS_ANDROID) |
- // Called whenever the application transitions from foreground to background |
- // or vice versa. |
- void OnApplicationStateChange(base::android::ApplicationState new_state); |
-#endif |
- |
// Aggregator that sends data use observations to |this|. |
data_usage::DataUseAggregator* data_use_aggregator_; |
@@ -237,49 +100,19 @@ class ExternalDataUseObserver : public data_usage::DataUseAggregator::Observer { |
// but afterwards, should only be accessed on UI thread. |
DataUseTabModel* data_use_tab_model_; |
- // Time when the currently pending data use report was submitted. |
- // |last_data_report_submitted_ticks_| is null if no data use report is |
- // currently pending. |
- base::TimeTicks last_data_report_submitted_ticks_; |
- |
- // |pending_report_bytes_| is the total byte count in the data use report that |
- // is currently pending. |
- int64_t pending_report_bytes_; |
- |
- // Buffered data reports that need to be submitted to the |
- // |external_data_use_observer_bridge_|. |
- DataUseReports buffered_data_reports_; |
+ // Labels, buffers and reports the data usage. It is owned by |this|. It is |
+ // created on IO thread but afterwards, should only be accessed on UI thread. |
+ ExternalDataUseReporter* external_data_use_reporter_; |
// |ui_task_runner_| is used to call methods on UI thread. |
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; |
- // Time when the data use reports were last received from DataUseAggregator. |
- base::Time previous_report_time_; |
- |
// Time when the matching rules were last fetched. |
base::TimeTicks last_matching_rules_fetch_time_; |
- // Total number of bytes transmitted or received across all the buffered |
- // reports. |
- int64_t total_bytes_buffered_; |
- |
// Duration after which matching rules are periodically fetched. |
const base::TimeDelta fetch_matching_rules_duration_; |
- // Minimum number of bytes that should be buffered before a data use report is |
- // submitted. |
- const int64_t data_use_report_min_bytes_; |
- |
- // If a data use report is pending for more than |data_report_submit_timeout_| |
- // duration, it is considered as timed out. |
- const base::TimeDelta data_report_submit_timeout_; |
- |
-#if defined(OS_ANDROID) |
- // Listens to when Chromium gets backgrounded and submits buffered data use |
- // reports. |
- std::unique_ptr<base::android::ApplicationStatusListener> app_state_listener_; |
-#endif |
- |
// True if |this| is currently registered as a data use observer. |
bool registered_as_data_use_observer_; |