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

Unified Diff: chrome/browser/android/data_usage/external_data_use_observer.cc

Issue 1412813007: ExternalDataUseObserver JNI integration (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: First patch set Created 5 years, 1 month 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_observer.cc
diff --git a/chrome/browser/android/data_usage/external_data_use_observer.cc b/chrome/browser/android/data_usage/external_data_use_observer.cc
index 2ffa3ff0914f875aed67afa3d6ea08f1c98c5686..036d861f0298f48511ef1767a115215525a8005b 100644
--- a/chrome/browser/android/data_usage/external_data_use_observer.cc
+++ b/chrome/browser/android/data_usage/external_data_use_observer.cc
@@ -8,7 +8,10 @@
#include "base/android/jni_string.h"
#include "base/message_loop/message_loop.h"
+#include "base/metrics/field_trial.h"
+#include "base/strings/string_number_conversions.h"
#include "components/data_usage/core/data_use.h"
+#include "components/variations/variations_associated_data.h"
#include "content/public/browser/browser_thread.h"
#include "jni/ExternalDataUseObserver_jni.h"
#include "third_party/re2/re2/re2.h"
@@ -17,6 +20,20 @@
using base::android::ConvertUTF8ToJavaString;
using base::android::ToJavaArrayOfStrings;
+namespace {
+
+const char kExternalDataUseObserverFieldTrial[] = "ExternalDataUseObserver";
+
+// Default duration after which matching rules are periodically fetched. May be
+// overridden by the field trial.
+const int kDefaultFetchMatchingRulesDurationSeconds = 60 * 15; // 15 minutes
sclittle 2015/11/06 23:42:49 nit: add period at the end of the comment.
tbansal1 2015/11/07 01:32:43 Done.
+
+// Default value of the minimum number of bytes that should be buffered before
+// a data use report is submitted. May be overridden by the field trial.
+const int64_t kDefaultDataUseReportMinBytes = 100 * 1000; // 100 KB.
sclittle 2015/11/06 23:42:48 nit: 1 KB = 1024 bytes
tbansal1 2015/11/07 01:32:43 Done.
+
+} // namespace
+
namespace chrome {
namespace android {
@@ -32,11 +49,19 @@ ExternalDataUseObserver::ExternalDataUseObserver(
io_task_runner_(io_task_runner),
ui_task_runner_(ui_task_runner),
previous_report_time_(base::Time::Now()),
+ last_matching_rules_fetch_time_(base::TimeTicks::Now()),
+ total_bytes_buffered_(0),
+ fetch_matching_rules_duration_(base::TimeDelta::FromSeconds(
+ kDefaultFetchMatchingRulesDurationSeconds)),
+ data_use_report_min_bytes_(kDefaultDataUseReportMinBytes),
io_weak_factory_(this),
ui_weak_factory_(this) {
DCHECK(data_use_aggregator_);
DCHECK(io_task_runner_);
DCHECK(ui_task_runner_);
+
+ PopulateFieldTrialParams();
+
ui_task_runner_->PostTask(
FROM_HERE,
base::Bind(&ExternalDataUseObserver::CreateJavaObjectOnUIThread,
@@ -52,6 +77,35 @@ ExternalDataUseObserver::ExternalDataUseObserver(
registered_as_observer_ = true;
}
+const std::string
+ExternalDataUseObserver::GetExternalDataUseObserverFieldTrialName() const {
+ return kExternalDataUseObserverFieldTrial;
+}
+
+void ExternalDataUseObserver::PopulateFieldTrialParams() {
+ std::string field_trial = GetExternalDataUseObserverFieldTrialName();
+
+ int32_t fetch_matching_rules_duration_seconds = -1;
+ std::string variation_value = variations::GetVariationParamValue(
+ field_trial, "fetch_matching_rules_duration_seconds");
+ if (!variation_value.empty() &&
+ base::StringToInt(variation_value,
+ &fetch_matching_rules_duration_seconds)) {
+ fetch_matching_rules_duration_ =
+ base::TimeDelta::FromSeconds(fetch_matching_rules_duration_seconds);
+ }
+ DCHECK_GE(fetch_matching_rules_duration_, base::TimeDelta());
+
+ uint64_t data_use_report_min_bytes = 0;
sclittle 2015/11/06 23:42:50 Use an int64_t here instead of a uint64_t.
tbansal1 2015/11/07 01:32:43 Done.
+ variation_value = variations::GetVariationParamValue(
+ field_trial, "data_use_report_min_bytes");
+ if (!variation_value.empty() &&
+ base::StringToUint64(variation_value, &data_use_report_min_bytes)) {
+ data_use_report_min_bytes_ = data_use_report_min_bytes;
sclittle 2015/11/06 23:42:50 Please don't convert a uint64_t to an int64_t with
tbansal1 2015/11/07 01:32:43 Done.
+ }
+ DCHECK_GE(data_use_report_min_bytes_, 0);
+}
+
void ExternalDataUseObserver::CreateJavaObjectOnUIThread() {
DCHECK(ui_task_runner_->BelongsToCurrentThread());
JNIEnv* env = base::android::AttachCurrentThread();
@@ -154,6 +208,15 @@ void ExternalDataUseObserver::OnDataUse(
const std::vector<const data_usage::DataUse*>& data_use_sequence) {
DCHECK(thread_checker_.CalledOnValidThread());
+ if (base::TimeTicks::Now() - last_matching_rules_fetch_time_ >=
+ fetch_matching_rules_duration_) {
+ last_matching_rules_fetch_time_ = base::TimeTicks::Now();
sclittle 2015/11/06 23:42:50 Could you add a quick comment around here describi
tbansal1 2015/11/07 01:32:43 Done.
+ ui_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&ExternalDataUseObserver::FetchMatchingRulesOnUIThread,
+ GetUIWeakPtr()));
+ }
+
if (matching_rules_fetch_pending_) {
// TODO(tbansal): Buffer reports.
}
@@ -191,6 +254,7 @@ void ExternalDataUseObserver::BufferDataUseReport(
DataUseReport report = DataUseReport(start_time, end_time, data_use->rx_bytes,
data_use->tx_bytes);
+ total_bytes_buffered_ += (data_use->rx_bytes + data_use->tx_bytes);
// Check if the |data_use_report_key| is already in the buffered reports.
DataUseReports::iterator it =
@@ -200,6 +264,9 @@ void ExternalDataUseObserver::BufferDataUseReport(
if (buffered_data_reports_.size() == kMaxBufferSize) {
// TODO(tbansal): Add UMA to track impact of lost reports.
// Remove the first entry.
sclittle 2015/11/06 23:42:49 Why do you remove the first entry? They aren't in
tbansal1 2015/11/07 01:32:43 Done.
+ total_bytes_buffered_ -=
+ (buffered_data_reports_.begin()->second.bytes_downloaded +
+ buffered_data_reports_.begin()->second.bytes_uploaded);
buffered_data_reports_.erase(buffered_data_reports_.begin());
}
buffered_data_reports_.insert(std::make_pair(data_use_report_key, report));
@@ -225,6 +292,9 @@ void ExternalDataUseObserver::SubmitBufferedDataUseReport() {
if (submit_data_report_pending_ || buffered_data_reports_.empty())
return;
+ if (total_bytes_buffered_ < data_use_report_min_bytes_)
+ return;
+
// TODO(tbansal): Keep buffering until enough data has been received.
// Send one data use report.
@@ -234,6 +304,7 @@ void ExternalDataUseObserver::SubmitBufferedDataUseReport() {
// Remove the entry from the map.
buffered_data_reports_.erase(it);
+ total_bytes_buffered_ -= (report.bytes_downloaded + report.bytes_uploaded);
submit_data_report_pending_ = true;

Powered by Google App Engine
This is Rietveld 408576698