Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1767)

Unified Diff: chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.cc

Issue 2781323004: Create a new Data Saver settings page that adds the site breakdown (Closed)
Patch Set: move comparator Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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));
}

Powered by Google App Engine
This is Rietveld 408576698