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)); |
} |