Przeglądaj źródła

Merge pull request #568 from efryntov/master

Bump TunneledWebView sample app target SDK to 29 + NetworkCallback for DNS in PsiphonTunnel.java
Rod Hynes 5 lat temu
rodzic
commit
78d377514a

+ 35 - 3
MobileLibrary/Android/PsiphonTunnel/PsiphonTunnel.java

@@ -23,7 +23,9 @@ import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.Context;
 import android.net.ConnectivityManager;
 import android.net.ConnectivityManager;
 import android.net.LinkProperties;
 import android.net.LinkProperties;
+import android.net.Network;
 import android.net.NetworkInfo;
 import android.net.NetworkInfo;
+import android.net.NetworkRequest;
 import android.net.VpnService;
 import android.net.VpnService;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
 import android.net.wifi.WifiManager;
@@ -60,6 +62,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Locale;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Map;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.atomic.AtomicReference;
@@ -1232,17 +1235,46 @@ public class PsiphonTunnel {
         throw new Exception("no active network DNS resolver");
         throw new Exception("no active network DNS resolver");
     }
     }
 
 
-    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
     private static Collection<InetAddress> getActiveNetworkDnsResolvers(Context context)
     private static Collection<InetAddress> getActiveNetworkDnsResolvers(Context context)
             throws Exception {
             throws Exception {
         final String errorMessage = "getActiveNetworkDnsResolvers failed";
         final String errorMessage = "getActiveNetworkDnsResolvers failed";
         ArrayList<InetAddress> dnsAddresses = new ArrayList<InetAddress>();
         ArrayList<InetAddress> dnsAddresses = new ArrayList<InetAddress>();
+
+        ConnectivityManager connectivityManager =
+                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+        if (connectivityManager == null) {
+            throw new Exception(errorMessage, "Couldn't get ConnectivityManager system service");
+        }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            NetworkRequest networkRequest = new NetworkRequest.Builder().build();
+            final CountDownLatch countDownLatch = new CountDownLatch(1);
+            try {
+                ConnectivityManager.NetworkCallback networkCallback =
+                        new ConnectivityManager.NetworkCallback() {
+                            @Override
+                            public void onLinkPropertiesChanged(Network network,
+                                                                LinkProperties linkProperties) {
+                                dnsAddresses.addAll(linkProperties.getDnsServers());
+                                countDownLatch.countDown();
+                            }
+                        };
+
+                connectivityManager.registerNetworkCallback(networkRequest, networkCallback);
+                countDownLatch.await(1, TimeUnit.SECONDS);
+                connectivityManager.unregisterNetworkCallback(networkCallback);
+            } catch (RuntimeException ignored) {
+                // Failed to register network callback
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+            }
+            if (!dnsAddresses.isEmpty()) {
+                return dnsAddresses;
+            }
+        }
         try {
         try {
             // Hidden API
             // Hidden API
             // - only available in Android 4.0+
             // - only available in Android 4.0+
             // - no guarantee will be available beyond 4.2, or on all vendor devices
             // - no guarantee will be available beyond 4.2, or on all vendor devices
-            ConnectivityManager connectivityManager =
-                    (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
             Class<?> LinkPropertiesClass = Class.forName("android.net.LinkProperties");
             Class<?> LinkPropertiesClass = Class.forName("android.net.LinkProperties");
             Method getActiveLinkPropertiesMethod = ConnectivityManager.class.getMethod("getActiveLinkProperties", new Class []{});
             Method getActiveLinkPropertiesMethod = ConnectivityManager.class.getMethod("getActiveLinkProperties", new Class []{});
             Object linkProperties = getActiveLinkPropertiesMethod.invoke(connectivityManager);
             Object linkProperties = getActiveLinkPropertiesMethod.invoke(connectivityManager);

+ 3 - 3
MobileLibrary/Android/SampleApps/TunneledWebView/app/build.gradle

@@ -1,14 +1,14 @@
 apply plugin: 'com.android.application'
 apply plugin: 'com.android.application'
 
 
 android {
 android {
-    compileSdkVersion 28
+    compileSdkVersion 29
     useLibrary 'org.apache.http.legacy'
     useLibrary 'org.apache.http.legacy'
 
 
 
 
     defaultConfig {
     defaultConfig {
         applicationId "ca.psiphon.tunneledwebview"
         applicationId "ca.psiphon.tunneledwebview"
         minSdkVersion 15
         minSdkVersion 15
-        targetSdkVersion 28
+        targetSdkVersion 29
         versionCode 1
         versionCode 1
         versionName "1.0"
         versionName "1.0"
     }
     }
@@ -36,7 +36,7 @@ repositories {
 dependencies {
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
     implementation fileTree(dir: 'libs', include: ['*.jar'])
     testImplementation 'junit:junit:4.12'
     testImplementation 'junit:junit:4.12'
-    implementation 'com.android.support:appcompat-v7:26.1.0'
+    implementation 'androidx.appcompat:appcompat:1.0.0'
     // always specify exact library version in your real project to avoid non-deterministic builds
     // always specify exact library version in your real project to avoid non-deterministic builds
     implementation 'ca.psiphon:psiphontunnel:2.+'
     implementation 'ca.psiphon:psiphontunnel:2.+'
 }
 }

+ 1 - 1
MobileLibrary/Android/SampleApps/TunneledWebView/app/src/main/java/ca/psiphon/tunneledwebview/MainActivity.java

@@ -7,7 +7,7 @@ package ca.psiphon.tunneledwebview;
 
 
 import android.content.Context;
 import android.content.Context;
 import android.os.Bundle;
 import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
 import android.webkit.WebSettings;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
 import android.webkit.WebView;
 import android.widget.ArrayAdapter;
 import android.widget.ArrayAdapter;

+ 3 - 1
MobileLibrary/Android/SampleApps/TunneledWebView/gradle.properties

@@ -15,4 +15,6 @@
 # When configured, Gradle will run in incubating parallel mode.
 # When configured, Gradle will run in incubating parallel mode.
 # This option should only be used with decoupled projects. More details, visit
 # This option should only be used with decoupled projects. More details, visit
 # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
 # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
+# org.gradle.parallel=true
+android.enableJetifier=true
+android.useAndroidX=true