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..577865841869fd9df2767b2c4f8f18ccb7541966 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> |
| +#include <string> |
| +#include <unordered_map> |
| +#include <vector> |
| + |
| #include "base/android/jni_android.h" |
| #include "base/android/jni_string.h" |
| +#include "base/time/time.h" |
| #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,21 @@ using base::android::JavaParamRef; |
| using base::android::ScopedJavaLocalRef; |
| using data_reduction_proxy::DataReductionProxySettings; |
| -DataReductionProxySettingsAndroid::DataReductionProxySettingsAndroid() { |
| +namespace { |
| + |
| +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.
|
| + 24 * 60 / data_reduction_proxy::kDataUsageBucketLengthInMinutes; |
| + |
| +} // 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 +89,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 +203,82 @@ 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(); |
| + |
| + int data_usage_size = data_usage->size(); |
| + int num_buckets_to_display = |
| + std::min(num_day_for_query_ * BUCKETS_PER_DAY, data_usage_size); |
| + |
| + 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.
|
| + per_site_usage_map; |
| + |
| + // Data usage is sorted chronologically with the last entry corresponding to |
| + // |base::Time::Now()|. |
| + 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.
|
| + i >= data_usage_size - num_buckets_to_display; i--) { |
| + const auto& data_usage_bucket = data_usage->at(i); |
| + for (const auto& connection_usage : data_usage_bucket.connection_usage()) { |
| + for (const auto& site_usage : connection_usage.site_usage()) { |
| + auto usage = per_site_usage_map.find(site_usage.hostname()); |
| + if (usage != per_site_usage_map.end()) { |
| + double data_used; |
| + double original_size; |
| + 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.
|
| + usage->second->GetDouble("original_size", &original_size); |
| + usage->second->SetDouble("data_used", |
| + data_used + site_usage.data_used()); |
| + usage->second->SetDouble("original_size", |
| + original_size + site_usage.original_size()); |
| + } else { |
| + std::unique_ptr<base::DictionaryValue> usageValue = |
| + base::MakeUnique<base::DictionaryValue>(); |
| + usageValue->SetDouble("data_used", site_usage.data_used()); |
| + usageValue->SetDouble("original_size", site_usage.original_size()); |
| + per_site_usage_map.insert( |
| + std::make_pair(site_usage.hostname(), std::move(usageValue))); |
| + } |
| + } |
| + } |
| + } |
| + |
| + for (const auto& site_bucket : per_site_usage_map) { |
| + double data_used; |
| + double original_size; |
| + site_bucket.second->GetDouble("data_used", &data_used); |
| + site_bucket.second->GetDouble("original_size", &original_size); |
| + 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
|
| + env, j_query_result_obj_.obj(), |
| + ConvertUTF8ToJavaString(env, site_bucket.first), (long)data_used, |
| + (long)original_size); |
| + } |
| + |
| + 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)); |
| } |