+ // Apply the new proxy settings to any classes whose names contain `ProxyChangeListener`.
+ if (receiverClass.getName().contains("ProxyChangeListener")) {
+ // Get the `onReceive` method from the class.
+ Method onReceiveMethod = receiverClass.getDeclaredMethod("onReceive", Context.class, Intent.class);
+
+ // Create a proxy change intent.
+ Intent proxyChangeIntent = new Intent(Proxy.PROXY_CHANGE_ACTION);
+
+ // 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);