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