1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.h"
7 #include "base/android/build_info.h"
8 #include "base/android/jni_android.h"
9 #include "base/android/jni_string.h"
10 #include "base/bind.h"
11 #include "base/command_line.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/metrics/field_trial.h"
14 #include "base/metrics/histogram.h"
15 #include "base/prefs/pref_member.h"
16 #include "base/prefs/pref_service.h"
17 #include "base/strings/string_number_conversions.h"
18 #include "base/strings/utf_string_conversions.h"
19 #include "chrome/browser/browser_process.h"
20 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_configurator.h"
21 #include "chrome/browser/prefs/proxy_prefs.h"
22 #include "chrome/browser/profiles/profile.h"
23 #include "chrome/browser/profiles/profile_manager.h"
24 #include "chrome/common/chrome_switches.h"
25 #include "chrome/common/pref_names.h"
26 #include "components/data_reduction_proxy/browser/data_reduction_proxy_configurator.h"
27 #include "components/data_reduction_proxy/browser/data_reduction_proxy_settings.h"
28 #include "jni/DataReductionProxySettings_jni.h"
29 #include "net/base/auth.h"
30 #include "net/base/host_port_pair.h"
31 #include "net/base/load_flags.h"
32 #include "net/base/net_errors.h"
33 #include "net/url_request/url_fetcher.h"
34 #include "net/url_request/url_fetcher_delegate.h"
35 #include "net/url_request/url_request_status.h"
37 using base::android::CheckException;
38 using base::android::ConvertJavaStringToUTF8;
39 using base::android::ConvertUTF16ToJavaString;
40 using base::android::ConvertUTF8ToJavaString;
41 using base::android::ScopedJavaLocalRef;
42 using data_reduction_proxy::DataReductionProxySettings;
46 // The C++ definition of enum SpdyProxyAuthState defined in
47 // tools/histograms/histograms.xml.
48 // New values should be added at the end before |NUM_SPDY_PROXY_AUTH_STATE|.
51 SPDY_PROXY_AUTH_ON_AT_STARTUP,
52 SPDY_PROXY_AUTH_ON_BY_USER,
53 SPDY_PROXY_AUTH_OFF_BY_USER,
54 // Used by UMA histograms and should always be the last value.
55 NUM_SPDY_PROXY_AUTH_STATE
58 const char kEnabled[] = "Enabled";
62 DataReductionProxySettingsAndroid::DataReductionProxySettingsAndroid(
63 JNIEnv* env, jobject obj) : DataReductionProxySettings() {
64 #if defined(SPDY_PROXY_AUTH_VALUE)
65 set_key(SPDY_PROXY_AUTH_VALUE);
67 SetAllowed(IsIncludedInFieldTrialOrFlags());
68 SetPromoAllowed(base::FieldTrialList::FindFullName(
69 "DataCompressionProxyPromoVisibility") == kEnabled);
72 DataReductionProxySettingsAndroid::DataReductionProxySettingsAndroid() {
73 #if defined(SPDY_PROXY_AUTH_VALUE)
74 set_key(SPDY_PROXY_AUTH_VALUE);
78 DataReductionProxySettingsAndroid::~DataReductionProxySettingsAndroid() {
81 void DataReductionProxySettingsAndroid::InitDataReductionProxySettings(
84 PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs();
86 scoped_ptr<data_reduction_proxy::DataReductionProxyConfigurator>
87 configurator(new DataReductionProxyChromeConfigurator(prefs));
88 SetProxyConfigurator(configurator.Pass());
89 DataReductionProxySettings::InitDataReductionProxySettings(
91 g_browser_process->local_state(),
92 ProfileManager::GetActiveUserProfile()->GetRequestContext());
95 void DataReductionProxySettingsAndroid::BypassHostPattern(
96 JNIEnv* env, jobject obj, jstring pattern) {
97 config()->AddHostPatternToBypass(
98 ConvertJavaStringToUTF8(env, pattern));
100 void DataReductionProxySettingsAndroid::BypassURLPattern(
101 JNIEnv* env, jobject obj, jstring pattern) {
102 config()->AddURLPatternToBypass(ConvertJavaStringToUTF8(env, pattern));
105 jboolean DataReductionProxySettingsAndroid::IsDataReductionProxyAllowed(
106 JNIEnv* env, jobject obj) {
107 return DataReductionProxySettings::IsDataReductionProxyAllowed();
110 jboolean DataReductionProxySettingsAndroid::IsDataReductionProxyPromoAllowed(
111 JNIEnv* env, jobject obj) {
112 return DataReductionProxySettings::IsDataReductionProxyPromoAllowed();
115 ScopedJavaLocalRef<jstring>
116 DataReductionProxySettingsAndroid::GetDataReductionProxyOrigin(
117 JNIEnv* env, jobject obj) {
118 return ConvertUTF8ToJavaString(
119 env, DataReductionProxySettings::GetDataReductionProxyOrigin());
122 jboolean DataReductionProxySettingsAndroid::IsDataReductionProxyEnabled(
123 JNIEnv* env, jobject obj) {
124 return DataReductionProxySettings::IsDataReductionProxyEnabled();
127 jboolean DataReductionProxySettingsAndroid::IsDataReductionProxyManaged(
128 JNIEnv* env, jobject obj) {
129 return DataReductionProxySettings::IsDataReductionProxyManaged();
132 void DataReductionProxySettingsAndroid::SetDataReductionProxyEnabled(
136 DataReductionProxySettings::SetDataReductionProxyEnabled(enabled);
139 jlong DataReductionProxySettingsAndroid::GetDataReductionLastUpdateTime(
140 JNIEnv* env, jobject obj) {
141 return DataReductionProxySettings::GetDataReductionLastUpdateTime();
144 base::android::ScopedJavaLocalRef<jobject>
145 DataReductionProxySettingsAndroid::GetContentLengths(JNIEnv* env,
147 int64 original_content_length;
148 int64 received_content_length;
149 int64 last_update_internal;
150 DataReductionProxySettings::GetContentLengths(
151 data_reduction_proxy::kNumDaysInHistorySummary,
152 &original_content_length,
153 &received_content_length,
154 &last_update_internal);
156 return Java_ContentLengths_create(env,
157 original_content_length,
158 received_content_length);
161 jboolean DataReductionProxySettingsAndroid::IsAcceptableAuthChallenge(
166 scoped_refptr<net::AuthChallengeInfo> auth_info(new net::AuthChallengeInfo);
167 auth_info->realm = ConvertJavaStringToUTF8(env, realm);
168 auth_info->challenger =
169 net::HostPortPair::FromString(ConvertJavaStringToUTF8(env, host));
170 return DataReductionProxySettings::IsAcceptableAuthChallenge(auth_info.get());
173 ScopedJavaLocalRef<jstring>
174 DataReductionProxySettingsAndroid::GetTokenForAuthChallenge(JNIEnv* env,
178 scoped_refptr<net::AuthChallengeInfo> auth_info(new net::AuthChallengeInfo);
179 auth_info->realm = ConvertJavaStringToUTF8(env, realm);
180 auth_info->challenger =
181 net::HostPortPair::FromString(ConvertJavaStringToUTF8(env, host));
183 // If an empty string != null in Java, then here we should test for the
184 // token being empty and return a java null.
185 return ConvertUTF16ToJavaString(env,
186 DataReductionProxySettings::GetTokenForAuthChallenge(auth_info.get()));
189 ScopedJavaLocalRef<jlongArray>
190 DataReductionProxySettingsAndroid::GetDailyOriginalContentLengths(
191 JNIEnv* env, jobject obj) {
192 return GetDailyContentLengths(
193 env, data_reduction_proxy::prefs::kDailyHttpOriginalContentLength);
196 ScopedJavaLocalRef<jlongArray>
197 DataReductionProxySettingsAndroid::GetDailyReceivedContentLengths(
198 JNIEnv* env, jobject obj) {
199 return GetDailyContentLengths(
200 env, data_reduction_proxy::prefs::kDailyHttpReceivedContentLength);
204 bool DataReductionProxySettingsAndroid::Register(JNIEnv* env) {
205 bool register_natives_impl_result = RegisterNativesImpl(env);
206 return register_natives_impl_result;
209 void DataReductionProxySettingsAndroid::AddDefaultProxyBypassRules() {
210 DataReductionProxySettings::AddDefaultProxyBypassRules();
211 // Chrome cannot authenticate with the data reduction proxy when fetching URLs
212 // from the settings menu.
213 config()->AddURLPatternToBypass("http://www.google.com/policies/privacy*");
216 void DataReductionProxySettingsAndroid::SetProxyConfigs(bool enabled,
219 // Sanity check: If there's no fallback proxy, we can't do a restricted mode.
220 std::string fallback = GetDataReductionProxyFallback();
221 if (fallback.empty() && enabled && restricted)
224 LogProxyState(enabled, restricted, at_startup);
227 config()->Enable(restricted,
229 DataReductionProxySettings::GetDataReductionProxyOrigin(),
230 GetDataReductionProxyFallback());
236 ScopedJavaLocalRef<jlongArray>
237 DataReductionProxySettingsAndroid::GetDailyContentLengths(
238 JNIEnv* env, const char* pref_name) {
239 jlongArray result = env->NewLongArray(
240 data_reduction_proxy::kNumDaysInHistory);
242 DataReductionProxySettings::ContentLengthList lengths =
243 DataReductionProxySettings::GetDailyContentLengths(pref_name);
245 if (!lengths.empty()) {
246 DCHECK_EQ(lengths.size(), data_reduction_proxy::kNumDaysInHistory);
247 env->SetLongArrayRegion(result, 0, lengths.size(), &lengths[0]);
248 return ScopedJavaLocalRef<jlongArray>(env, result);
251 return ScopedJavaLocalRef<jlongArray>(env, result);
256 // Used by generated jni code.
257 static jlong Init(JNIEnv* env, jobject obj) {
258 DataReductionProxySettingsAndroid* settings =
259 new DataReductionProxySettingsAndroid(env, obj);
260 return reinterpret_cast<intptr_t>(settings);