- Intent intent = new Intent(Proxy.PROXY_CHANGE_ACTION);
- onReceiveMethod.invoke(receiver, privacyBrowserContext, intent);
+
+ // Create a proxy change intent.
+ Intent proxyChangeIntent = new Intent(Proxy.PROXY_CHANGE_ACTION);
+
+ if (Build.VERSION.SDK_INT >= 21) {
+ // Get a proxy info class.
+ // `Class<?>`, which is an `unbounded wildcard parameterized type`, must be used instead of `Class`, which is a `raw type`. Otherwise, `proxyInfoClass.getMethod()` is unhappy.
+ Class<?> proxyInfoClass = Class.forName("android.net.ProxyInfo");
+
+ // Get the build direct proxy method from the proxy info class.
+ Method buildDirectProxyMethod = proxyInfoClass.getMethod("buildDirectProxy", String.class, Integer.TYPE);
+
+ // Populate a proxy info object with the new proxy information.
+ Object proxyInfoObject = buildDirectProxyMethod.invoke(proxyInfoClass, proxyHost, Integer.valueOf(proxyPort));
+
+ // Add the proxy info object into the proxy change intent.
+ proxyChangeIntent.putExtra("proxy", (Parcelable) proxyInfoObject);
+ }
+
+ // Pass the proxy change intent to the `onReceive` method of the receiver class.
+ onReceiveMethod.invoke(receiver, privacyBrowserContext, proxyChangeIntent);