summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java54
-rw-r--r--ui/src/main/AndroidManifest.xml1
2 files changed, 54 insertions, 1 deletions
diff --git a/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java b/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java
index 5d544f56..0ecf82be 100644
--- a/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java
+++ b/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java
@@ -5,11 +5,17 @@
package com.wireguard.android.backend;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
import android.net.LocalSocketAddress;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.NetworkRequest;
import android.net.ProxyInfo;
import android.net.Uri;
import android.os.Build;
@@ -17,6 +23,7 @@ import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.system.OsConstants;
import android.util.Log;
+import android.widget.Toast;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
@@ -94,6 +101,8 @@ public final class GoBackend implements Backend {
private int currentTunnelHandle = -1;
private ManagedChannel channel;
private ConnectivityManager connectivityManager;
+ private BroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
+ private ConnectivityManager.NetworkCallback myNetworkCallback = new MyNetworkCallback();
/**
* Public constructor for GoBackend.
@@ -532,6 +541,13 @@ public final class GoBackend implements Backend {
throw new BackendException(Reason.TUN_CREATION_ERROR);
Log.d(TAG, "Go backend " + wgVersion());
currentTunnelHandle = wgTurnOn(tunnel.getName(), tun.detachFd(), goConfig);
+ if (currentTunnelHandle >= 0) {
+// IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
+// context.registerReceiver(myBroadcastReceiver, filter);
+
+// NetworkRequest req = new NetworkRequest.Builder().addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN).build();
+// connectivityManager.registerNetworkCallback(req, myNetworkCallback);
+ }
}
if (currentTunnelHandle < 0)
throw new BackendException(Reason.GO_ACTIVATION_ERROR_CODE, currentTunnelHandle);
@@ -551,6 +567,8 @@ public final class GoBackend implements Backend {
currentTunnelHandle = -1;
currentConfig = null;
stopHttpProxy();
+// context.unregisterReceiver(myBroadcastReceiver);
+// connectivityManager.unregisterNetworkCallback(myNetworkCallback);
wgTurnOff(handleToClose);
}
@@ -616,8 +634,11 @@ public final class GoBackend implements Backend {
owner.stopHttpProxy();
final Tunnel tunnel = owner.currentTunnel;
if (tunnel != null) {
- if (owner.currentTunnelHandle != -1)
+ if (owner.currentTunnelHandle != -1) {
+// owner.context.unregisterReceiver(owner.myBroadcastReceiver);
+// owner.connectivityManager.unregisterNetworkCallback(owner.myNetworkCallback);
wgTurnOff(owner.currentTunnelHandle);
+ }
owner.currentTunnel = null;
owner.currentTunnelHandle = -1;
owner.currentConfig = null;
@@ -643,4 +664,35 @@ public final class GoBackend implements Backend {
this.owner = owner;
}
}
+
+ // TODO: request NETWORK_STATE perm
+ // In callback
+ // check if local IP address has changed to current endpoints.
+ // resolve endpoints if required.
+ // check LinkProperties.nat64prefix!
+
+ private class MyNetworkCallback extends ConnectivityManager.NetworkCallback {
+ @Override
+ public void onAvailable(Network network) {
+ NetworkInfo info = connectivityManager.getNetworkInfo(network);
+ Toast.makeText(context, "onAvailable: " + info.toString(), Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ private static class MyBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent == null)
+ return;
+ if (ConnectivityManager.CONNECTIVITY_ACTION == intent.getAction()) {
+ NetworkInfo info = (NetworkInfo)intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
+ Boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
+ if (noConnectivity) {
+ Toast.makeText(context, "Disconnected", Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(context, "Connected: " + info.toString(), Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+ }
}
diff --git a/ui/src/main/AndroidManifest.xml b/ui/src/main/AndroidManifest.xml
index 4dd38cb2..6eedc730 100644
--- a/ui/src/main/AndroidManifest.xml
+++ b/ui/src/main/AndroidManifest.xml
@@ -6,6 +6,7 @@
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"