Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4208)

Unified Diff: chrome/browser/android/data_usage/external_data_use_reporter.h

Issue 2145863002: Separate data use reporting logic in ExternalDataUseObserver (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed nits Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/android/data_usage/external_data_use_reporter.h
diff --git a/chrome/browser/android/data_usage/external_data_use_observer.h b/chrome/browser/android/data_usage/external_data_use_reporter.h
similarity index 54%
copy from chrome/browser/android/data_usage/external_data_use_observer.h
copy to chrome/browser/android/data_usage/external_data_use_reporter.h
index 671b1d3d25783a92b9efe198b3c83aed14794e59..2c8d12eafe18b3c6613ef37859a744ffbf94b6d1 100644
--- a/chrome/browser/android/data_usage/external_data_use_observer.h
+++ b/chrome/browser/android/data_usage/external_data_use_reporter.h
@@ -1,36 +1,26 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
+// 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 CHROME_BROWSER_ANDROID_DATA_USAGE_EXTERNAL_DATA_USE_OBSERVER_H_
-#define CHROME_BROWSER_ANDROID_DATA_USAGE_EXTERNAL_DATA_USE_OBSERVER_H_
+#ifndef CHROME_BROWSER_ANDROID_DATA_USAGE_EXTERNAL_DATA_USE_REPORTER_H_
+#define CHROME_BROWSER_ANDROID_DATA_USAGE_EXTERNAL_DATA_USE_REPORTER_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;
-}
-
namespace data_usage {
struct DataUse;
}
@@ -39,16 +29,16 @@ namespace chrome {
namespace android {
+class DataUseTabModel;
class ExternalDataUseObserverBridge;
-// 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.
-class ExternalDataUseObserver : public data_usage::DataUseAggregator::Observer {
+// This class receives data use observations from ExternalDataUseObserver,
+// labels the data use using DataUseTabModel, and buffers the data use report.
+// The buffered reports are submitted to the platform when a minimum number of
+// data usage bytes is reached, or when Chromium goes into background, or when
+// the previous report submission times out. This class is not thread safe, and
+// must only be accessed on UI thread.
+class ExternalDataUseReporter {
public:
// Result of data usage report submission. This enum must remain synchronized
// with the enum of the same name in metrics/histograms/histograms.xml.
@@ -64,57 +54,42 @@ class ExternalDataUseObserver : public data_usage::DataUseAggregator::Observer {
DATAUSAGE_REPORT_SUBMISSION_MAX = 4
};
- // External data use observer field trial name.
- static const char kExternalDataUseObserverFieldTrial[];
+ // The caller should guarantee that |data_use_tab_model| and
+ // |external_data_use_observer_bridge| to be non-null during the lifetime of
+ // |this|. |field_trial| is the field trial name to get the various
+ // paramenters from.
+ ExternalDataUseReporter(
+ const char* field_trial,
+ DataUseTabModel* data_use_tab_model,
+ ExternalDataUseObserverBridge* external_data_use_observer_bridge);
+ virtual ~ExternalDataUseReporter();
- ExternalDataUseObserver(
- data_usage::DataUseAggregator* data_use_aggregator,
- const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner,
- const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner);
- ~ExternalDataUseObserver() override;
+ void InitOnUIThread();
- // Returns the pointer to the DataUseTabModel object owned by |this|. The
- // caller does not owns the returned pointer.
- DataUseTabModel* GetDataUseTabModel() const;
+ // Notifies the ExternalDataUseReporter of data usage. The data use is
+ // labeled using |data_use_tab_model_|, buffered and then reported to
+ // |external_data_use_observer_bridge_| later.
+ void OnDataUse(const data_usage::DataUse& data_use);
- // 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);
-
- // Fetches the matching rules asynchronously.
- void FetchMatchingRules();
-
- base::WeakPtr<ExternalDataUseObserver> GetWeakPtr();
-
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);
+ friend class ExternalDataUseReporterTest;
+ FRIEND_TEST_ALL_PREFIXES(ExternalDataUseReporterTest, BufferDataUseReports);
+ FRIEND_TEST_ALL_PREFIXES(ExternalDataUseReporterTest, BufferSize);
+ FRIEND_TEST_ALL_PREFIXES(ExternalDataUseReporterTest, DataUseReportTimedOut);
#if defined(OS_ANDROID)
- FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest,
+ FRIEND_TEST_ALL_PREFIXES(ExternalDataUseReporterTest,
DataUseReportingOnApplicationStatusChange);
#endif
- FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, HashFunction);
- FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest,
+ FRIEND_TEST_ALL_PREFIXES(ExternalDataUseReporterTest, HashFunction);
+ FRIEND_TEST_ALL_PREFIXES(ExternalDataUseReporterTest,
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,
+ FRIEND_TEST_ALL_PREFIXES(ExternalDataUseReporterTest, ReportsMergedCorrectly);
+ FRIEND_TEST_ALL_PREFIXES(ExternalDataUseReporterTest,
TimestampsMergedCorrectly);
- FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, Variations);
+ FRIEND_TEST_ALL_PREFIXES(ExternalDataUseReporterTest, MultipleMatchingRules);
+ FRIEND_TEST_ALL_PREFIXES(ExternalDataUseReporterTest, Variations);
// DataUseReportKey is a unique identifier for a data use report.
struct DataUseReportKey {
@@ -181,29 +156,17 @@ class ExternalDataUseObserver : public data_usage::DataUseAggregator::Observer {
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.
+ // Maximum size of the data use report buffer. Once this limit is reached, new
+ // reports will be ignored.
+ // TODO(rajendrant): Instead of the ignoring the new data use report, remove
+ // the oldest report entry.
static const size_t kMaxBufferSize;
- // 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.
+ // Adds |data_use| to buffered reports. |data_use| is the received data use
+ // report. |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,
@@ -225,18 +188,19 @@ class ExternalDataUseObserver : public data_usage::DataUseAggregator::Observer {
void OnApplicationStateChange(base::android::ApplicationState new_state);
#endif
- // Aggregator that sends data use observations to |this|.
- data_usage::DataUseAggregator* data_use_aggregator_;
-
- // |external_data_use_observer_bridge_| is owned by |this|, and interacts with
- // the Java code. It is created on IO thread but afterwards, should only be
- // accessed on UI thread.
+ // Pointer to the ExternalDataUseObserverBridge in UI thread. Not owned by
+ // |this|.
ExternalDataUseObserverBridge* external_data_use_observer_bridge_;
- // Maintains tab sessions and is owned by |this|. It is created on IO thread
- // but afterwards, should only be accessed on UI thread.
+ // Pointer to the DataUseTabModel in UI thread, Not owned by |this|.
DataUseTabModel* data_use_tab_model_;
+#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
+
// 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.
@@ -246,25 +210,16 @@ class ExternalDataUseObserver : public data_usage::DataUseAggregator::Observer {
// 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_;
-
- // |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.
+ // Time when the data use reports were last received.
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_;
+ // Buffered data reports that need to be submitted to the
+ // |external_data_use_observer_bridge_|.
+ DataUseReports buffered_data_reports_;
// Minimum number of bytes that should be buffered before a data use report is
// submitted.
@@ -274,24 +229,13 @@ class ExternalDataUseObserver : public data_usage::DataUseAggregator::Observer {
// 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_;
-
base::ThreadChecker thread_checker_;
- base::WeakPtrFactory<ExternalDataUseObserver> weak_factory_;
-
- DISALLOW_COPY_AND_ASSIGN(ExternalDataUseObserver);
+ DISALLOW_COPY_AND_ASSIGN(ExternalDataUseReporter);
};
} // namespace android
} // namespace chrome
-#endif // CHROME_BROWSER_ANDROID_DATA_USAGE_EXTERNAL_DATA_USE_OBSERVER_H_
+#endif // CHROME_BROWSER_ANDROID_DATA_USAGE_EXTERNAL_DATA_USE_REPORTER_H_

Powered by Google App Engine
This is Rietveld 408576698