1// Copyright (c) 2012 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.
4
5#ifndef NET_PROXY_PROXY_CONFIG_SERVICE_ANDROID_H_
6#define NET_PROXY_PROXY_CONFIG_SERVICE_ANDROID_H_
7
8#include <string>
9
10#include "base/android/jni_android.h"
11#include "base/basictypes.h"
12#include "base/callback_forward.h"
13#include "base/compiler_specific.h"
14#include "base/memory/ref_counted.h"
15#include "net/base/net_export.h"
16#include "net/proxy/proxy_config_service.h"
17
18namespace base {
19class SequencedTaskRunner;
20}
21
22namespace net {
23
24class ProxyConfig;
25
26class NET_EXPORT ProxyConfigServiceAndroid : public ProxyConfigService {
27 public:
28  // Callback that returns the value of the property identified by the provided
29  // key. If it was not found, an empty string is returned. Note that this
30  // interface does not let you distinguish an empty property from a
31  // non-existing property. This callback is invoked on the JNI thread.
32  typedef base::Callback<std::string (const std::string& property)>
33      GetPropertyCallback;
34
35  // Separate class whose instance is owned by the Delegate class implemented in
36  // the .cc file.
37  class JNIDelegate {
38   public:
39    virtual ~JNIDelegate() {}
40
41    // Called from Java (on JNI thread) to signal that the proxy settings have
42    // changed. The string and int arguments (the host/port pair for the proxy)
43    // are either a host/port pair or ("", 0) to indicate "no proxy".
44    // The third argument indicates the PAC url.
45    // The fourth argument is the proxy exclusion list.
46    virtual void ProxySettingsChangedTo(JNIEnv*,
47                                        jobject,
48                                        jstring,
49                                        jint,
50                                        jstring,
51                                        jobjectArray) = 0;
52
53    // Called from Java (on JNI thread) to signal that the proxy settings have
54    // changed. New proxy settings are fetched from the system property store.
55    virtual void ProxySettingsChanged(JNIEnv*, jobject) = 0;
56  };
57
58  ProxyConfigServiceAndroid(
59      const scoped_refptr<base::SequencedTaskRunner>& network_task_runner,
60      const scoped_refptr<base::SequencedTaskRunner>& jni_task_runner);
61
62  virtual ~ProxyConfigServiceAndroid();
63
64  // Register JNI bindings.
65  static bool Register(JNIEnv* env);
66
67  // Android provides a local HTTP proxy that does PAC resolution. When this
68  // setting is enabled, the proxy config service ignores the PAC URL and uses
69  // the local proxy for all proxy resolution.
70  void set_exclude_pac_url(bool enabled);
71
72  // ProxyConfigService:
73  // Called only on the network thread.
74  virtual void AddObserver(Observer* observer) OVERRIDE;
75  virtual void RemoveObserver(Observer* observer) OVERRIDE;
76  virtual ConfigAvailability GetLatestProxyConfig(ProxyConfig* config) OVERRIDE;
77
78 private:
79  friend class ProxyConfigServiceAndroidTestBase;
80  class Delegate;
81
82  // For tests.
83  ProxyConfigServiceAndroid(
84      const scoped_refptr<base::SequencedTaskRunner>& network_task_runner,
85      const scoped_refptr<base::SequencedTaskRunner>& jni_task_runner,
86      GetPropertyCallback get_property_callback);
87
88  // For tests.
89  void ProxySettingsChanged();
90
91  scoped_refptr<Delegate> delegate_;
92
93  DISALLOW_COPY_AND_ASSIGN(ProxyConfigServiceAndroid);
94};
95
96} // namespace net
97
98#endif // NET_PROXY_PROXY_CONFIG_SERVICE_ANDROID_H_
99