Chromium Code Reviews| Index: chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.cc |
| diff --git a/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.cc b/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.cc |
| index d6370f9866d02d177648dbf48995e7dbc6570047..09dddb0f584422e3598f6cb7a2a593c552941dd0 100644 |
| --- a/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.cc |
| +++ b/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.cc |
| @@ -6,16 +6,25 @@ |
| #include <stdint.h> |
| +#include <algorithm> |
|
sclittle
2017/04/07 20:44:16
nit: remove unnecessary include
megjablon
2017/04/08 01:52:57
Done.
|
| +#include <string> |
| +#include <unordered_map> |
|
sclittle
2017/04/07 20:44:16
nit: remove unnecessary include
megjablon
2017/04/08 01:52:57
Done.
|
| +#include <vector> |
|
sclittle
2017/04/07 20:44:16
nit: Move this include to the .h file
megjablon
2017/04/08 01:52:57
Done.
|
| + |
| #include "base/android/jni_android.h" |
| #include "base/android/jni_string.h" |
| +#include "base/time/time.h" |
|
sclittle
2017/04/07 20:44:16
nit: Is this include necessary?
megjablon
2017/04/08 01:52:57
Done.
|
| #include "base/values.h" |
| #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.h" |
| #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| #include "chrome/common/pref_names.h" |
| +#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h" |
| #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.h" |
| +#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h" |
| #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h" |
| +#include "components/data_reduction_proxy/core/browser/data_usage_store.h" |
| #include "components/data_reduction_proxy/core/common/data_reduction_proxy_event_store.h" |
| #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h" |
| #include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h" |
| @@ -29,7 +38,28 @@ using base::android::JavaParamRef; |
| using base::android::ScopedJavaLocalRef; |
| using data_reduction_proxy::DataReductionProxySettings; |
| -DataReductionProxySettingsAndroid::DataReductionProxySettingsAndroid() { |
| +namespace { |
| + |
| +constexpr int kBucketsPerDay = |
|
sclittle
2017/04/07 20:44:16
minor style nit: I'd recommend explicitly making t
megjablon
2017/04/08 01:52:57
Done.
|
| + 24 * 60 / data_reduction_proxy::kDataUsageBucketLengthInMinutes; |
| + |
| +struct DataUsageForHost { |
| + DataUsageForHost() : data_used(0), original_size(0) {} |
| + |
| + int64_t data_used; |
| + int64_t original_size; |
| +}; |
| + |
| +} // namespace |
| + |
| +DataReductionProxySettingsAndroid::DataReductionProxySettingsAndroid() |
| + : weak_factory_(this) {} |
| + |
| +DataReductionProxySettingsAndroid::DataReductionProxySettingsAndroid( |
| + JNIEnv* env, |
| + const base::android::JavaParamRef<jobject>& obj) |
| + : weak_factory_(this) { |
| + j_settings_obj_.Reset(env, obj); |
| } |
| DataReductionProxySettingsAndroid::~DataReductionProxySettingsAndroid() { |
| @@ -66,6 +96,12 @@ jlong DataReductionProxySettingsAndroid::GetDataReductionLastUpdateTime( |
| return Settings()->GetDataReductionLastUpdateTime(); |
| } |
| +void DataReductionProxySettingsAndroid::ClearDataSavingStatistics( |
| + JNIEnv* env, |
| + const base::android::JavaParamRef<jobject>& obj) { |
| + Settings()->ClearDataSavingStatistics(); |
| +} |
| + |
| base::android::ScopedJavaLocalRef<jobject> |
| DataReductionProxySettingsAndroid::GetContentLengths( |
| JNIEnv* env, |
| @@ -174,7 +210,61 @@ DataReductionProxySettingsAndroid::GetLastBypassEvent( |
| return ConvertUTF8ToJavaString(env, event_store->SanitizedLastBypassEvent()); |
| } |
| +void DataReductionProxySettingsAndroid::QueryDataUsage( |
| + JNIEnv* env, |
| + const JavaParamRef<jobject>& obj, |
| + const JavaParamRef<jobject>& j_result_obj, |
| + jint num_days) { |
| + DCHECK(num_days <= data_reduction_proxy::kDataUsageHistoryNumDays); |
| + j_query_result_obj_.Reset(env, j_result_obj); |
| + num_day_for_query_ = num_days; |
| + Settings() |
| + ->data_reduction_proxy_service() |
| + ->compression_stats() |
| + ->GetHistoricalDataUsage(base::Bind( |
| + &DataReductionProxySettingsAndroid::OnQueryDataUsageComplete, |
| + weak_factory_.GetWeakPtr())); |
| +} |
| + |
| +void DataReductionProxySettingsAndroid::OnQueryDataUsageComplete( |
| + std::unique_ptr<std::vector<data_reduction_proxy::DataUsageBucket>> |
| + data_usage) { |
| + JNIEnv* env = base::android::AttachCurrentThread(); |
| + |
| + std::map<base::StringPiece, DataUsageForHost> per_site_usage_map; |
|
sclittle
2017/04/07 20:44:16
nit: Could you add includes for <map> and base/str
megjablon
2017/04/08 01:52:57
I've gotten too use to Eclipse taking care of this
|
| + |
| + // Data usage is sorted chronologically with the last entry corresponding to |
| + // |base::Time::Now()|. |
| + const size_t num_buckets_to_display = num_day_for_query_ * kBucketsPerDay; |
| + for (auto data_usage_it = data_usage->size() > num_buckets_to_display |
| + ? data_usage->end() - num_buckets_to_display |
| + : data_usage->begin(); |
| + data_usage_it != data_usage->end(); ++data_usage_it) { |
| + for (const auto& connection_usage : (*data_usage_it).connection_usage()) { |
|
sclittle
2017/04/07 20:44:16
micro style nit: you could use data_usage_it->conn
megjablon
2017/04/08 01:52:57
Done.
|
| + for (const auto& site_usage : connection_usage.site_usage()) { |
| + DataUsageForHost& usage = per_site_usage_map[site_usage.hostname()]; |
| + usage.data_used += site_usage.data_used(); |
| + usage.original_size += site_usage.original_size(); |
| + } |
| + } |
| + } |
| + |
| + for (const auto& site_bucket : per_site_usage_map) { |
| + Java_DataReductionProxySettings_createDataUseItemAndAddToList( |
|
sclittle
2017/04/07 20:44:16
In order to send all the counts at once instead of
megjablon
2017/04/08 01:52:57
I'm not a huge fan of this option. It doesn't seem
sclittle
2017/04/11 00:36:19
Acknowledged.
|
| + env, j_query_result_obj_.obj(), |
| + ConvertUTF8ToJavaString(env, site_bucket.first), |
| + (long)site_bucket.second.data_used, |
|
sclittle
2017/04/07 20:44:16
Do you need to cast these to long here? |long| in
megjablon
2017/04/08 01:52:57
Removed cast. Tried it out and it works as expecte
|
| + (long)site_bucket.second.original_size); |
| + } |
| + |
|
gone
2017/04/07 20:21:58
Should you check if either of the java object poin
megjablon
2017/04/08 01:52:57
The Settings object is a singleton. It has the cal
|
| + Java_DataReductionProxySettings_onQueryDataUsageComplete( |
| + env, j_settings_obj_.obj(), j_query_result_obj_.obj()); |
| + |
| + j_query_result_obj_.Release(); |
| +} |
| + |
| // Used by generated jni code. |
| static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
| - return reinterpret_cast<intptr_t>(new DataReductionProxySettingsAndroid()); |
| + return reinterpret_cast<intptr_t>( |
| + new DataReductionProxySettingsAndroid(env, obj)); |
| } |