OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/net/spdyproxy/data_reduction_proxy_settings_android.h" | 5 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <algorithm> | |
10 #include <string> | |
11 #include <unordered_map> | |
12 #include <vector> | |
13 | |
9 #include "base/android/jni_android.h" | 14 #include "base/android/jni_android.h" |
10 #include "base/android/jni_string.h" | 15 #include "base/android/jni_string.h" |
16 #include "base/time/time.h" | |
11 #include "base/values.h" | 17 #include "base/values.h" |
12 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.h" | 18 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.h" |
13 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings_fact ory.h" | 19 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings_fact ory.h" |
14 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
15 #include "chrome/browser/profiles/profile_manager.h" | 21 #include "chrome/browser/profiles/profile_manager.h" |
16 #include "chrome/common/pref_names.h" | 22 #include "chrome/common/pref_names.h" |
23 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_comp ression_stats.h" | |
17 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_metr ics.h" | 24 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_metr ics.h" |
25 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_serv ice.h" | |
18 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_sett ings.h" | 26 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_sett ings.h" |
27 #include "components/data_reduction_proxy/core/browser/data_usage_store.h" | |
19 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_event _store.h" | 28 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_event _store.h" |
20 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_param s.h" | 29 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_param s.h" |
21 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_ names.h" | 30 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_ names.h" |
22 #include "jni/DataReductionProxySettings_jni.h" | 31 #include "jni/DataReductionProxySettings_jni.h" |
23 #include "net/proxy/proxy_server.h" | 32 #include "net/proxy/proxy_server.h" |
24 #include "url/gurl.h" | 33 #include "url/gurl.h" |
25 | 34 |
26 | 35 |
27 using base::android::ConvertUTF8ToJavaString; | 36 using base::android::ConvertUTF8ToJavaString; |
28 using base::android::JavaParamRef; | 37 using base::android::JavaParamRef; |
29 using base::android::ScopedJavaLocalRef; | 38 using base::android::ScopedJavaLocalRef; |
30 using data_reduction_proxy::DataReductionProxySettings; | 39 using data_reduction_proxy::DataReductionProxySettings; |
31 | 40 |
32 DataReductionProxySettingsAndroid::DataReductionProxySettingsAndroid() { | 41 namespace { |
42 | |
43 const int BUCKETS_PER_DAY = | |
sclittle
2017/04/06 23:27:43
nit: Change this to constexpr int kBucketsPerDay =
megjablon
2017/04/07 01:20:03
Done.
| |
44 24 * 60 / data_reduction_proxy::kDataUsageBucketLengthInMinutes; | |
45 | |
46 } // namespace | |
47 | |
48 DataReductionProxySettingsAndroid::DataReductionProxySettingsAndroid() | |
49 : weak_factory_(this) {} | |
50 | |
51 DataReductionProxySettingsAndroid::DataReductionProxySettingsAndroid( | |
52 JNIEnv* env, | |
53 const base::android::JavaParamRef<jobject>& obj) | |
54 : weak_factory_(this) { | |
55 j_settings_obj_.Reset(env, obj); | |
33 } | 56 } |
34 | 57 |
35 DataReductionProxySettingsAndroid::~DataReductionProxySettingsAndroid() { | 58 DataReductionProxySettingsAndroid::~DataReductionProxySettingsAndroid() { |
36 } | 59 } |
37 | 60 |
38 jboolean DataReductionProxySettingsAndroid::IsDataReductionProxyPromoAllowed( | 61 jboolean DataReductionProxySettingsAndroid::IsDataReductionProxyPromoAllowed( |
39 JNIEnv* env, | 62 JNIEnv* env, |
40 const JavaParamRef<jobject>& obj) { | 63 const JavaParamRef<jobject>& obj) { |
41 return Settings()->PromoAllowed(); | 64 return Settings()->PromoAllowed(); |
42 } | 65 } |
(...skipping 16 matching lines...) Expand all Loading... | |
59 jboolean enabled) { | 82 jboolean enabled) { |
60 Settings()->SetDataReductionProxyEnabled(enabled); | 83 Settings()->SetDataReductionProxyEnabled(enabled); |
61 } | 84 } |
62 | 85 |
63 jlong DataReductionProxySettingsAndroid::GetDataReductionLastUpdateTime( | 86 jlong DataReductionProxySettingsAndroid::GetDataReductionLastUpdateTime( |
64 JNIEnv* env, | 87 JNIEnv* env, |
65 const JavaParamRef<jobject>& obj) { | 88 const JavaParamRef<jobject>& obj) { |
66 return Settings()->GetDataReductionLastUpdateTime(); | 89 return Settings()->GetDataReductionLastUpdateTime(); |
67 } | 90 } |
68 | 91 |
92 void DataReductionProxySettingsAndroid::ClearDataSavingStatistics( | |
93 JNIEnv* env, | |
94 const base::android::JavaParamRef<jobject>& obj) { | |
95 Settings()->ClearDataSavingStatistics(); | |
96 } | |
97 | |
69 base::android::ScopedJavaLocalRef<jobject> | 98 base::android::ScopedJavaLocalRef<jobject> |
70 DataReductionProxySettingsAndroid::GetContentLengths( | 99 DataReductionProxySettingsAndroid::GetContentLengths( |
71 JNIEnv* env, | 100 JNIEnv* env, |
72 const JavaParamRef<jobject>& obj) { | 101 const JavaParamRef<jobject>& obj) { |
73 int64_t original_content_length; | 102 int64_t original_content_length; |
74 int64_t received_content_length; | 103 int64_t received_content_length; |
75 int64_t last_update_internal; | 104 int64_t last_update_internal; |
76 Settings()->GetContentLengths( | 105 Settings()->GetContentLengths( |
77 data_reduction_proxy::kNumDaysInHistorySummary, | 106 data_reduction_proxy::kNumDaysInHistorySummary, |
78 &original_content_length, | 107 &original_content_length, |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
167 JNIEnv* env, | 196 JNIEnv* env, |
168 const JavaParamRef<jobject>& obj) { | 197 const JavaParamRef<jobject>& obj) { |
169 data_reduction_proxy::DataReductionProxyEventStore* event_store = | 198 data_reduction_proxy::DataReductionProxyEventStore* event_store = |
170 Settings()->GetEventStore(); | 199 Settings()->GetEventStore(); |
171 if (!event_store) | 200 if (!event_store) |
172 return ConvertUTF8ToJavaString(env, std::string()); | 201 return ConvertUTF8ToJavaString(env, std::string()); |
173 | 202 |
174 return ConvertUTF8ToJavaString(env, event_store->SanitizedLastBypassEvent()); | 203 return ConvertUTF8ToJavaString(env, event_store->SanitizedLastBypassEvent()); |
175 } | 204 } |
176 | 205 |
206 void DataReductionProxySettingsAndroid::QueryDataUsage( | |
207 JNIEnv* env, | |
208 const JavaParamRef<jobject>& obj, | |
209 const JavaParamRef<jobject>& j_result_obj, | |
210 jint num_days) { | |
211 DCHECK(num_days <= data_reduction_proxy::kDataUsageHistoryNumDays); | |
212 j_query_result_obj_.Reset(env, j_result_obj); | |
213 num_day_for_query_ = num_days; | |
214 Settings() | |
215 ->data_reduction_proxy_service() | |
216 ->compression_stats() | |
217 ->GetHistoricalDataUsage(base::Bind( | |
218 &DataReductionProxySettingsAndroid::OnQueryDataUsageComplete, | |
219 weak_factory_.GetWeakPtr())); | |
220 } | |
221 | |
222 void DataReductionProxySettingsAndroid::OnQueryDataUsageComplete( | |
223 std::unique_ptr<std::vector<data_reduction_proxy::DataUsageBucket>> | |
224 data_usage) { | |
225 JNIEnv* env = base::android::AttachCurrentThread(); | |
226 | |
227 int data_usage_size = data_usage->size(); | |
228 int num_buckets_to_display = | |
229 std::min(num_day_for_query_ * BUCKETS_PER_DAY, data_usage_size); | |
230 | |
231 std::unordered_map<std::string, std::unique_ptr<base::DictionaryValue>> | |
sclittle
2017/04/06 23:27:43
Instead of using DictionaryValue here, you could j
megjablon
2017/04/07 01:20:03
Done.
| |
232 per_site_usage_map; | |
233 | |
234 // Data usage is sorted chronologically with the last entry corresponding to | |
235 // |base::Time::Now()|. | |
236 for (int i = data_usage_size - 1; | |
sclittle
2017/04/06 23:27:43
Using signed ints for indices like this seems a bi
megjablon
2017/04/07 01:20:03
Done.
| |
237 i >= data_usage_size - num_buckets_to_display; i--) { | |
238 const auto& data_usage_bucket = data_usage->at(i); | |
239 for (const auto& connection_usage : data_usage_bucket.connection_usage()) { | |
240 for (const auto& site_usage : connection_usage.site_usage()) { | |
241 auto usage = per_site_usage_map.find(site_usage.hostname()); | |
242 if (usage != per_site_usage_map.end()) { | |
243 double data_used; | |
244 double original_size; | |
245 usage->second->GetDouble("data_used", &data_used); | |
sclittle
2017/04/06 23:27:43
Why are these doubles? Could they just be int64s?
megjablon
2017/04/07 01:20:02
This is obsolete.
| |
246 usage->second->GetDouble("original_size", &original_size); | |
247 usage->second->SetDouble("data_used", | |
248 data_used + site_usage.data_used()); | |
249 usage->second->SetDouble("original_size", | |
250 original_size + site_usage.original_size()); | |
251 } else { | |
252 std::unique_ptr<base::DictionaryValue> usageValue = | |
253 base::MakeUnique<base::DictionaryValue>(); | |
254 usageValue->SetDouble("data_used", site_usage.data_used()); | |
255 usageValue->SetDouble("original_size", site_usage.original_size()); | |
256 per_site_usage_map.insert( | |
257 std::make_pair(site_usage.hostname(), std::move(usageValue))); | |
258 } | |
259 } | |
260 } | |
261 } | |
262 | |
263 for (const auto& site_bucket : per_site_usage_map) { | |
264 double data_used; | |
265 double original_size; | |
266 site_bucket.second->GetDouble("data_used", &data_used); | |
267 site_bucket.second->GetDouble("original_size", &original_size); | |
268 Java_DataReductionProxySettings_createDataUseItemAndAddToList( | |
sclittle
2017/04/06 23:27:43
Instead of adding the items one-by-one making a jn
megjablon
2017/04/07 01:20:02
I don't know of a way. I followed the same pattern
| |
269 env, j_query_result_obj_.obj(), | |
270 ConvertUTF8ToJavaString(env, site_bucket.first), (long)data_used, | |
271 (long)original_size); | |
272 } | |
273 | |
274 Java_DataReductionProxySettings_onQueryDataUsageComplete( | |
275 env, j_settings_obj_.obj(), j_query_result_obj_.obj()); | |
276 | |
277 j_query_result_obj_.Release(); | |
278 } | |
279 | |
177 // Used by generated jni code. | 280 // Used by generated jni code. |
178 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 281 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
179 return reinterpret_cast<intptr_t>(new DataReductionProxySettingsAndroid()); | 282 return reinterpret_cast<intptr_t>( |
283 new DataReductionProxySettingsAndroid(env, obj)); | |
180 } | 284 } |
OLD | NEW |