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

Side by Side 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: static cast 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/android/data_usage/external_data_use_observer.h" 5 #include "chrome/browser/android/data_usage/external_data_use_observer.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/android/jni_string.h" 9 #include "base/android/jni_string.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "base/metrics/field_trial.h"
12 #include "base/strings/string_number_conversions.h"
11 #include "components/data_usage/core/data_use.h" 13 #include "components/data_usage/core/data_use.h"
14 #include "components/variations/variations_associated_data.h"
12 #include "content/public/browser/browser_thread.h" 15 #include "content/public/browser/browser_thread.h"
13 #include "jni/ExternalDataUseObserver_jni.h" 16 #include "jni/ExternalDataUseObserver_jni.h"
14 #include "third_party/re2/re2/re2.h" 17 #include "third_party/re2/re2/re2.h"
15 #include "url/gurl.h" 18 #include "url/gurl.h"
16 19
17 using base::android::ConvertUTF8ToJavaString; 20 using base::android::ConvertUTF8ToJavaString;
18 using base::android::ToJavaArrayOfStrings; 21 using base::android::ToJavaArrayOfStrings;
19 22
23 namespace {
24
25 // Default duration after which matching rules are periodically fetched. May be
26 // overridden by the field trial.
27 const int kDefaultFetchMatchingRulesDurationSeconds = 60 * 15; // 15 minutes.
28
29 // Default value of the minimum number of bytes that should be buffered before
30 // a data use report is submitted. May be overridden by the field trial.
31 const int64_t kDefaultDataUseReportMinBytes = 100 * 1024; // 100 KB.
32
33 // Populates various parameters from the values specified in the field trial.
34 int32_t GetFetchMatchingRulesDurationSeconds() {
35 int32_t duration_seconds = -1;
36 std::string variation_value = variations::GetVariationParamValue(
37 chrome::android::ExternalDataUseObserver::
38 kExternalDataUseObserverFieldTrial,
39 "fetch_matching_rules_duration_seconds");
40 if (!variation_value.empty() &&
41 base::StringToInt(variation_value, &duration_seconds)) {
42 DCHECK_LE(0, duration_seconds);
43 return duration_seconds;
44 }
45 return kDefaultFetchMatchingRulesDurationSeconds;
46 }
47
48 // Populates various parameters from the values specified in the field trial.
49 int64_t GetMinBytes() {
50 int64_t min_bytes = -1;
51 std::string variation_value = variations::GetVariationParamValue(
52 chrome::android::ExternalDataUseObserver::
53 kExternalDataUseObserverFieldTrial,
54 "data_use_report_min_bytes");
55 if (!variation_value.empty() &&
56 base::StringToInt64(variation_value, &min_bytes)) {
57 DCHECK_LE(0, min_bytes);
58 return min_bytes;
59 }
60 return kDefaultDataUseReportMinBytes;
61 }
62
63 } // namespace
64
20 namespace chrome { 65 namespace chrome {
21 66
22 namespace android { 67 namespace android {
23 68
69 const char ExternalDataUseObserver::kExternalDataUseObserverFieldTrial[] =
70 "ExternalDataUseObserver";
71
24 ExternalDataUseObserver::ExternalDataUseObserver( 72 ExternalDataUseObserver::ExternalDataUseObserver(
25 data_usage::DataUseAggregator* data_use_aggregator, 73 data_usage::DataUseAggregator* data_use_aggregator,
26 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, 74 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
27 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) 75 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner)
28 : data_use_aggregator_(data_use_aggregator), 76 : data_use_aggregator_(data_use_aggregator),
29 matching_rules_fetch_pending_(false), 77 matching_rules_fetch_pending_(false),
30 submit_data_report_pending_(false), 78 submit_data_report_pending_(false),
31 registered_as_observer_(false), 79 registered_as_observer_(false),
32 io_task_runner_(io_task_runner), 80 io_task_runner_(io_task_runner),
33 ui_task_runner_(ui_task_runner), 81 ui_task_runner_(ui_task_runner),
34 previous_report_time_(base::Time::Now()), 82 previous_report_time_(base::Time::Now()),
83 last_matching_rules_fetch_time_(base::TimeTicks::Now()),
84 total_bytes_buffered_(0),
85 fetch_matching_rules_duration_(
86 base::TimeDelta::FromSeconds(GetFetchMatchingRulesDurationSeconds())),
87 data_use_report_min_bytes_(GetMinBytes()),
35 io_weak_factory_(this), 88 io_weak_factory_(this),
36 ui_weak_factory_(this) { 89 ui_weak_factory_(this) {
37 DCHECK(data_use_aggregator_); 90 DCHECK(data_use_aggregator_);
38 DCHECK(io_task_runner_); 91 DCHECK(io_task_runner_);
39 DCHECK(ui_task_runner_); 92 DCHECK(ui_task_runner_);
93
40 ui_task_runner_->PostTask( 94 ui_task_runner_->PostTask(
41 FROM_HERE, 95 FROM_HERE,
42 base::Bind(&ExternalDataUseObserver::CreateJavaObjectOnUIThread, 96 base::Bind(&ExternalDataUseObserver::CreateJavaObjectOnUIThread,
43 GetUIWeakPtr())); 97 GetUIWeakPtr()));
44 98
45 ui_task_runner_->PostTask( 99 ui_task_runner_->PostTask(
46 FROM_HERE, 100 FROM_HERE,
47 base::Bind(&ExternalDataUseObserver::FetchMatchingRulesOnUIThread, 101 base::Bind(&ExternalDataUseObserver::FetchMatchingRulesOnUIThread,
48 GetUIWeakPtr())); 102 GetUIWeakPtr()));
49 103
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 201
148 submit_data_report_pending_ = false; 202 submit_data_report_pending_ = false;
149 203
150 SubmitBufferedDataUseReport(); 204 SubmitBufferedDataUseReport();
151 } 205 }
152 206
153 void ExternalDataUseObserver::OnDataUse( 207 void ExternalDataUseObserver::OnDataUse(
154 const std::vector<const data_usage::DataUse*>& data_use_sequence) { 208 const std::vector<const data_usage::DataUse*>& data_use_sequence) {
155 DCHECK(thread_checker_.CalledOnValidThread()); 209 DCHECK(thread_checker_.CalledOnValidThread());
156 210
211 // If the time when the matching rules were last fetched is more than
212 // |fetch_matching_rules_duration_|, fetch them again.
213 if (base::TimeTicks::Now() - last_matching_rules_fetch_time_ >=
214 fetch_matching_rules_duration_) {
215 last_matching_rules_fetch_time_ = base::TimeTicks::Now();
216 ui_task_runner_->PostTask(
217 FROM_HERE,
218 base::Bind(&ExternalDataUseObserver::FetchMatchingRulesOnUIThread,
219 GetUIWeakPtr()));
220 }
221
157 if (matching_rules_fetch_pending_) { 222 if (matching_rules_fetch_pending_) {
158 // TODO(tbansal): Buffer reports. 223 // TODO(tbansal): Buffer reports.
159 } 224 }
160 225
161 std::string label; 226 std::string label;
162 227
163 for (const data_usage::DataUse* data_use : data_use_sequence) { 228 for (const data_usage::DataUse* data_use : data_use_sequence) {
164 if (!Matches(data_use->url, &label)) 229 if (!Matches(data_use->url, &label))
165 continue; 230 continue;
166 231
(...skipping 25 matching lines...) Expand all
192 DataUseReport report = DataUseReport(start_time, end_time, data_use->rx_bytes, 257 DataUseReport report = DataUseReport(start_time, end_time, data_use->rx_bytes,
193 data_use->tx_bytes); 258 data_use->tx_bytes);
194 259
195 // Check if the |data_use_report_key| is already in the buffered reports. 260 // Check if the |data_use_report_key| is already in the buffered reports.
196 DataUseReports::iterator it = 261 DataUseReports::iterator it =
197 buffered_data_reports_.find(data_use_report_key); 262 buffered_data_reports_.find(data_use_report_key);
198 if (it == buffered_data_reports_.end()) { 263 if (it == buffered_data_reports_.end()) {
199 // Limit the buffer size. 264 // Limit the buffer size.
200 if (buffered_data_reports_.size() == kMaxBufferSize) { 265 if (buffered_data_reports_.size() == kMaxBufferSize) {
201 // TODO(tbansal): Add UMA to track impact of lost reports. 266 // TODO(tbansal): Add UMA to track impact of lost reports.
202 // Remove the first entry. 267 return;
203 buffered_data_reports_.erase(buffered_data_reports_.begin());
204 } 268 }
205 buffered_data_reports_.insert(std::make_pair(data_use_report_key, report)); 269 buffered_data_reports_.insert(std::make_pair(data_use_report_key, report));
206 } else { 270 } else {
207 DataUseReport existing_report = DataUseReport(it->second); 271 DataUseReport existing_report = DataUseReport(it->second);
208 DataUseReport merged_report = DataUseReport( 272 DataUseReport merged_report = DataUseReport(
209 std::min(existing_report.start_time, report.start_time), 273 std::min(existing_report.start_time, report.start_time),
210 std::max(existing_report.end_time, report.end_time), 274 std::max(existing_report.end_time, report.end_time),
211 existing_report.bytes_downloaded + report.bytes_downloaded, 275 existing_report.bytes_downloaded + report.bytes_downloaded,
212 existing_report.bytes_uploaded + report.bytes_uploaded); 276 existing_report.bytes_uploaded + report.bytes_uploaded);
213 buffered_data_reports_.erase(it); 277 buffered_data_reports_.erase(it);
214 buffered_data_reports_.insert( 278 buffered_data_reports_.insert(
215 std::make_pair(data_use_report_key, merged_report)); 279 std::make_pair(data_use_report_key, merged_report));
216 } 280 }
281 total_bytes_buffered_ += (data_use->rx_bytes + data_use->tx_bytes);
217 282
218 DCHECK_LE(buffered_data_reports_.size(), 283 DCHECK_LE(buffered_data_reports_.size(), static_cast<size_t>(kMaxBufferSize));
219 static_cast<size_t>(kMaxBufferSize));
220 } 284 }
221 285
222 void ExternalDataUseObserver::SubmitBufferedDataUseReport() { 286 void ExternalDataUseObserver::SubmitBufferedDataUseReport() {
223 DCHECK(thread_checker_.CalledOnValidThread()); 287 DCHECK(thread_checker_.CalledOnValidThread());
224 288
225 if (submit_data_report_pending_ || buffered_data_reports_.empty()) 289 if (submit_data_report_pending_ || buffered_data_reports_.empty())
226 return; 290 return;
227 291
228 // TODO(tbansal): Keep buffering until enough data has been received. 292 if (total_bytes_buffered_ < data_use_report_min_bytes_)
293 return;
229 294
230 // Send one data use report. 295 // Send one data use report.
231 DataUseReports::iterator it = buffered_data_reports_.begin(); 296 DataUseReports::iterator it = buffered_data_reports_.begin();
232 DataUseReportKey key = it->first; 297 DataUseReportKey key = it->first;
233 DataUseReport report = it->second; 298 DataUseReport report = it->second;
234 299
235 // Remove the entry from the map. 300 // Remove the entry from the map.
236 buffered_data_reports_.erase(it); 301 buffered_data_reports_.erase(it);
302 total_bytes_buffered_ -= (report.bytes_downloaded + report.bytes_uploaded);
237 303
238 submit_data_report_pending_ = true; 304 submit_data_report_pending_ = true;
239 305
240 ui_task_runner_->PostTask( 306 ui_task_runner_->PostTask(
241 FROM_HERE, base::Bind(&ExternalDataUseObserver::ReportDataUseOnUIThread, 307 FROM_HERE, base::Bind(&ExternalDataUseObserver::ReportDataUseOnUIThread,
242 GetIOWeakPtr(), key, report)); 308 GetIOWeakPtr(), key, report));
243 } 309 }
244 310
245 void ExternalDataUseObserver::ReportDataUseOnUIThread( 311 void ExternalDataUseObserver::ReportDataUseOnUIThread(
246 const DataUseReportKey& key, 312 const DataUseReportKey& key,
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 return label_; 400 return label_;
335 } 401 }
336 402
337 bool RegisterExternalDataUseObserver(JNIEnv* env) { 403 bool RegisterExternalDataUseObserver(JNIEnv* env) {
338 return RegisterNativesImpl(env); 404 return RegisterNativesImpl(env);
339 } 405 }
340 406
341 } // namespace android 407 } // namespace android
342 408
343 } // namespace chrome 409 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698