diff options
-rw-r--r-- | tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java | 54 | ||||
-rw-r--r-- | ui/src/main/AndroidManifest.xml | 1 |
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" |