| 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 =
|
| + 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>>
|
| + 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;
|
| + 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);
|
| + 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(
|
| + 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));
|
| }
|
|
|