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

Side by Side Diff: chrome/browser/android/data_usage/external_data_use_observer.h

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 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 #ifndef CHROME_BROWSER_ANDROID_DATA_USAGE_EXTERNAL_DATA_USE_OBSERVER_H_ 5 #ifndef CHROME_BROWSER_ANDROID_DATA_USAGE_EXTERNAL_DATA_USE_OBSERVER_H_
6 #define CHROME_BROWSER_ANDROID_DATA_USAGE_EXTERNAL_DATA_USE_OBSERVER_H_ 6 #define CHROME_BROWSER_ANDROID_DATA_USAGE_EXTERNAL_DATA_USE_OBSERVER_H_
7 7
8 #include <jni.h> 8 #include <jni.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 const base::android::JavaParamRef<jobjectArray>& app_package_name, 73 const base::android::JavaParamRef<jobjectArray>& app_package_name,
74 const base::android::JavaParamRef<jobjectArray>& domain_path_regex, 74 const base::android::JavaParamRef<jobjectArray>& domain_path_regex,
75 const base::android::JavaParamRef<jobjectArray>& label); 75 const base::android::JavaParamRef<jobjectArray>& label);
76 76
77 // Called by Java when the reporting of data usage has finished. This may be 77 // Called by Java when the reporting of data usage has finished. This may be
78 // called on a different thread. |success| is true if the request was 78 // called on a different thread. |success| is true if the request was
79 // successfully submitted to the external data use observer by Java. Must be 79 // successfully submitted to the external data use observer by Java. Must be
80 // called on UI thread. 80 // called on UI thread.
81 void OnReportDataUseDone(JNIEnv* env, jobject obj, bool success); 81 void OnReportDataUseDone(JNIEnv* env, jobject obj, bool success);
82 82
83 // Returns the external data use observer field trial name.
84 const std::string GetExternalDataUseObserverFieldTrialName() const;
sclittle 2015/11/06 23:42:50 Make this a static constant.
tbansal1 2015/11/07 01:32:43 This function would be used by Raj to control othe
sclittle 2015/11/07 02:05:32 Could it just be a publicly visible static constan
tbansal1 2015/11/07 02:33:02 Done.
85
83 private: 86 private:
84 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, SingleRegex); 87 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, SingleRegex);
85 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, TwoRegex); 88 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, TwoRegex);
86 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, MultipleRegex); 89 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, MultipleRegex);
87 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, ChangeRegex); 90 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, ChangeRegex);
88 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, 91 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest,
89 AtMostOneDataUseSubmitRequest); 92 AtMostOneDataUseSubmitRequest);
90 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, MultipleMatchingRules); 93 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, MultipleMatchingRules);
91 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, ReportsMergedCorrectly); 94 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, ReportsMergedCorrectly);
92 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, 95 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest,
93 TimestampsMergedCorrectly); 96 TimestampsMergedCorrectly);
94 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, HashFunction); 97 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, HashFunction);
95 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, BufferSize); 98 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, BufferSize);
99 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest,
100 PeriodicFetchMatchingRules);
101 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, BufferDataUseReports);
102 FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, Variations);
96 103
97 // DataUseReportKey is a unique identifier for a data use report. 104 // DataUseReportKey is a unique identifier for a data use report.
98 struct DataUseReportKey { 105 struct DataUseReportKey {
99 DataUseReportKey(const std::string& label, 106 DataUseReportKey(const std::string& label,
100 net::NetworkChangeNotifier::ConnectionType connection_type, 107 net::NetworkChangeNotifier::ConnectionType connection_type,
101 const std::string& mcc_mnc) 108 const std::string& mcc_mnc)
102 : label(label), connection_type(connection_type), mcc_mnc(mcc_mnc) {} 109 : label(label), connection_type(connection_type), mcc_mnc(mcc_mnc) {}
103 110
104 DataUseReportKey(const DataUseReportKey& other) 111 DataUseReportKey(const DataUseReportKey& other)
105 : label(other.label), 112 : label(other.label),
(...skipping 17 matching lines...) Expand all
123 // mcc_mnc operator of the provider of the SIM as obtained from 130 // mcc_mnc operator of the provider of the SIM as obtained from
124 // TelephonyManager#getNetworkOperator() Java API in Android. 131 // TelephonyManager#getNetworkOperator() Java API in Android.
125 const std::string mcc_mnc; 132 const std::string mcc_mnc;
126 }; 133 };
127 134
128 // DataUseReport is paired with a DataUseReportKey object. DataUseReport 135 // DataUseReport is paired with a DataUseReportKey object. DataUseReport
129 // contains the bytes send/received during a specific interval. Only the bytes 136 // contains the bytes send/received during a specific interval. Only the bytes
130 // from the data use reports that have the |label|, |connection_type|, and 137 // from the data use reports that have the |label|, |connection_type|, and
131 // |mcc_mnc| specified in the corresponding DataUseReportKey object are 138 // |mcc_mnc| specified in the corresponding DataUseReportKey object are
132 // counted in the DataUseReport. 139 // counted in the DataUseReport.
133 struct DataUseReport { 140 struct DataUseReport {
sclittle 2015/11/06 23:42:50 For a future CL: This DataUseReport stuff should r
tbansal1 2015/11/07 01:32:43 Agree with moving the implementation to .cc but wh
sclittle 2015/11/07 02:05:32 Good point, it might make sense to move them to se
tbansal1 2015/11/07 02:33:02 Acknowledged.
134 // |start_time| and |end_time| are the start and end timestamps (in UTC 141 // |start_time| and |end_time| are the start and end timestamps (in UTC
135 // since the standard Java epoch of 1970-01-01 00:00:00) of the interval 142 // since the standard Java epoch of 1970-01-01 00:00:00) of the interval
136 // that this data report covers. |bytes_downloaded| and |bytes_uploaded| are 143 // that this data report covers. |bytes_downloaded| and |bytes_uploaded| are
137 // the total bytes received and send during this interval. 144 // the total bytes received and send during this interval.
138 DataUseReport(const base::Time& start_time, 145 DataUseReport(const base::Time& start_time,
139 const base::Time& end_time, 146 const base::Time& end_time,
140 int64_t bytes_downloaded, 147 int64_t bytes_downloaded,
141 int64_t bytes_uploaded) 148 int64_t bytes_uploaded)
142 : start_time(start_time), 149 : start_time(start_time),
143 end_time(end_time), 150 end_time(end_time),
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 size_t operator()(const DataUseReportKey& k) const { 182 size_t operator()(const DataUseReportKey& k) const {
176 std::hash<std::string> hash_function; 183 std::hash<std::string> hash_function;
177 size_t hash = 1; 184 size_t hash = 1;
178 hash = hash * 23 + hash_function(k.label); 185 hash = hash * 23 + hash_function(k.label);
179 hash = hash * 43 + k.connection_type; 186 hash = hash * 43 + k.connection_type;
180 hash = hash * 83 + hash_function(k.mcc_mnc); 187 hash = hash * 83 + hash_function(k.mcc_mnc);
181 return hash; 188 return hash;
182 } 189 }
183 }; 190 };
184 191
185 typedef std::unordered_map<DataUseReportKey, 192 typedef std::unordered_map<DataUseReportKey,
sclittle 2015/11/06 23:42:50 Change this to use base::hash_map from https://cod
tbansal1 2015/11/07 01:32:43 Interesting. Fixed it.
186 DataUseReport, 193 DataUseReport,
187 DataUseReportKeyHash> DataUseReports; 194 DataUseReportKeyHash> DataUseReports;
188 195
189 // Stores the matching rules. 196 // Stores the matching rules.
190 class MatchingRule { 197 class MatchingRule {
191 public: 198 public:
192 MatchingRule(const std::string& app_package_name, 199 MatchingRule(const std::string& app_package_name,
193 scoped_ptr<re2::RE2> pattern, 200 scoped_ptr<re2::RE2> pattern,
194 const std::string& label); 201 const std::string& label);
195 ~MatchingRule(); 202 ~MatchingRule();
(...skipping 11 matching lines...) Expand all
207 // Opaque label that uniquely identifies this matching rule. 214 // Opaque label that uniquely identifies this matching rule.
208 const std::string label_; 215 const std::string label_;
209 216
210 DISALLOW_COPY_AND_ASSIGN(MatchingRule); 217 DISALLOW_COPY_AND_ASSIGN(MatchingRule);
211 }; 218 };
212 219
213 // Maximum buffer size. If an entry needs to be added to the buffer that has 220 // Maximum buffer size. If an entry needs to be added to the buffer that has
214 // size |kMaxBufferSize|, then the oldest entry will be removed. 221 // size |kMaxBufferSize|, then the oldest entry will be removed.
215 static const size_t kMaxBufferSize = 100; 222 static const size_t kMaxBufferSize = 100;
216 223
224 // Populates various parameters from the values specified in the field trial.
225 void PopulateFieldTrialParams();
sclittle 2015/11/06 23:42:50 Could this just be a few anonymous functions in th
tbansal1 2015/11/07 01:32:43 Done.
226
217 // Creates Java object. Must be called on the UI thread. 227 // Creates Java object. Must be called on the UI thread.
218 void CreateJavaObjectOnUIThread(); 228 void CreateJavaObjectOnUIThread();
219 229
220 // data_usage::DataUseAggregator::Observer implementation: 230 // data_usage::DataUseAggregator::Observer implementation:
221 void OnDataUse(const std::vector<const data_usage::DataUse*>& 231 void OnDataUse(const std::vector<const data_usage::DataUse*>&
222 data_use_sequence) override; 232 data_use_sequence) override;
223 233
224 // Fetches matching rules from Java. Must be called on the UI thread. Returns 234 // Fetches matching rules from Java. Must be called on the UI thread. Returns
225 // result asynchronously on UI thread via FetchMatchingRulesCallback. 235 // result asynchronously on UI thread via FetchMatchingRulesCallback.
226 void FetchMatchingRulesOnUIThread() const; 236 void FetchMatchingRulesOnUIThread() const;
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; 315 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
306 316
307 // |ui_task_runner_| is used to call Java code on UI thread. This ensures 317 // |ui_task_runner_| is used to call Java code on UI thread. This ensures
308 // that Java code is safely called only on a single thread, and eliminates 318 // that Java code is safely called only on a single thread, and eliminates
309 // the need for locks in Java. 319 // the need for locks in Java.
310 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; 320 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
311 321
312 // Time when the data use reports were last received from DataUseAggregator. 322 // Time when the data use reports were last received from DataUseAggregator.
313 base::Time previous_report_time_; 323 base::Time previous_report_time_;
314 324
325 // Time when the matching rules were last fetched.
326 base::TimeTicks last_matching_rules_fetch_time_;
327
328 // Total number of bytes transmitted or received across all the buffered
329 // reports.
330 int64_t total_bytes_buffered_;
331
332 // Duration after which matching rules are periodically fetched.
333 base::TimeDelta fetch_matching_rules_duration_;
334
335 // Minimum number of bytes that should be buffered before a data use report is
336 // submitted.
337 int64_t data_use_report_min_bytes_;
338
315 base::ThreadChecker thread_checker_; 339 base::ThreadChecker thread_checker_;
316 340
317 // |io_weak_factory_| and |ui_weak_factory_| are used for posting tasks on the 341 // |io_weak_factory_| and |ui_weak_factory_| are used for posting tasks on the
318 // IO and UI thread, respectively. 342 // IO and UI thread, respectively.
319 base::WeakPtrFactory<ExternalDataUseObserver> io_weak_factory_; 343 base::WeakPtrFactory<ExternalDataUseObserver> io_weak_factory_;
320 base::WeakPtrFactory<ExternalDataUseObserver> ui_weak_factory_; 344 base::WeakPtrFactory<ExternalDataUseObserver> ui_weak_factory_;
321 345
322 DISALLOW_COPY_AND_ASSIGN(ExternalDataUseObserver); 346 DISALLOW_COPY_AND_ASSIGN(ExternalDataUseObserver);
323 }; 347 };
324 348
325 bool RegisterExternalDataUseObserver(JNIEnv* env); 349 bool RegisterExternalDataUseObserver(JNIEnv* env);
326 350
327 } // namespace android 351 } // namespace android
328 352
329 } // namespace chrome 353 } // namespace chrome
330 354
331 #endif // CHROME_BROWSER_ANDROID_DATA_USAGE_EXTERNAL_DATA_USE_OBSERVER_H_ 355 #endif // CHROME_BROWSER_ANDROID_DATA_USAGE_EXTERNAL_DATA_USE_OBSERVER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698