Index: net/android/java/src/org/chromium/net/ProxyChangeListener.java |
diff --git a/net/android/java/src/org/chromium/net/ProxyChangeListener.java b/net/android/java/src/org/chromium/net/ProxyChangeListener.java |
index f1362d35f1abfffa42386d1ee8487c9297843c35..b1aa4ddc8d7415d76abbd9b488c6550ff0352eec 100644 |
--- a/net/android/java/src/org/chromium/net/ProxyChangeListener.java |
+++ b/net/android/java/src/org/chromium/net/ProxyChangeListener.java |
@@ -11,9 +11,12 @@ import android.content.IntentFilter; |
import android.net.Proxy; |
import android.net.Uri; |
import android.os.Build; |
+import android.os.Handler; |
+import android.os.Looper; |
import android.text.TextUtils; |
import android.util.Log; |
+import org.chromium.base.BuildConfig; |
import org.chromium.base.annotations.CalledByNative; |
import org.chromium.base.annotations.JNINamespace; |
import org.chromium.base.annotations.NativeClassQualifiedName; |
@@ -30,8 +33,11 @@ public class ProxyChangeListener { |
private static final String TAG = "ProxyChangeListener"; |
private static boolean sEnabled = true; |
+ private final Context mContext; |
+ private final Looper mLooper; |
+ private final Handler mHandler; |
+ |
private long mNativePtr; |
- private Context mContext; |
private ProxyReceiver mProxyReceiver; |
private Delegate mDelegate; |
@@ -57,6 +63,8 @@ public class ProxyChangeListener { |
private ProxyChangeListener(Context context) { |
mContext = context; |
+ mLooper = Looper.myLooper(); |
+ mHandler = new Handler(mLooper); |
} |
public static void setEnabled(boolean enabled) { |
@@ -79,6 +87,7 @@ public class ProxyChangeListener { |
@CalledByNative |
public void start(long nativePtr) { |
+ assertOnThread(); |
assert mNativePtr == 0; |
mNativePtr = nativePtr; |
registerReceiver(); |
@@ -86,15 +95,21 @@ public class ProxyChangeListener { |
@CalledByNative |
public void stop() { |
+ assertOnThread(); |
mNativePtr = 0; |
unregisterReceiver(); |
} |
private class ProxyReceiver extends BroadcastReceiver { |
@Override |
- public void onReceive(Context context, Intent intent) { |
+ public void onReceive(Context context, final Intent intent) { |
if (intent.getAction().equals(Proxy.PROXY_CHANGE_ACTION)) { |
- proxySettingsChanged(extractNewProxy(intent)); |
+ runOnThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ proxySettingsChanged(ProxyReceiver.this, extractNewProxy(intent)); |
+ } |
+ }); |
} |
} |
@@ -175,8 +190,8 @@ public class ProxyChangeListener { |
} |
} |
- private void proxySettingsChanged(ProxyConfig cfg) { |
- if (!sEnabled) { |
+ private void proxySettingsChanged(ProxyReceiver proxyReceiver, ProxyConfig cfg) { |
+ if (!sEnabled || proxyReceiver != mProxyReceiver) { |
xunjieli
2017/04/13 18:44:54
Same here. Maybe add a comment on we need this ext
pauljensen
2017/05/01 15:35:53
Done.
|
return; |
} |
if (mDelegate != null) { |
@@ -213,6 +228,25 @@ public class ProxyChangeListener { |
mProxyReceiver = null; |
} |
+ private boolean onThread() { |
+ return mLooper == Looper.myLooper(); |
+ } |
+ |
+ private void assertOnThread() { |
+ if (BuildConfig.DCHECK_IS_ON && !onThread()) { |
+ throw new IllegalStateException( |
+ "Must be called on NetworkChangeNotifierAutoDetect thread."); |
xunjieli
2017/04/13 18:44:54
nit: s/NetworkChangeNotifierAutoDetect/ProxyChange
pauljensen
2017/05/01 15:35:53
Done.
|
+ } |
+ } |
+ |
+ private void runOnThread(Runnable r) { |
+ if (onThread()) { |
+ r.run(); |
+ } else { |
+ mHandler.post(r); |
+ } |
+ } |
+ |
/** |
* See net/proxy/proxy_config_service_android.cc |
*/ |