diff options
author | cyberta <cyberta@riseup.net> | 2020-01-29 02:55:25 -0600 |
---|---|---|
committer | cyberta <cyberta@riseup.net> | 2020-01-29 02:55:25 -0600 |
commit | 7fbea5459e59de1327f2c76a23f5940d67e4ae8d (patch) | |
tree | c11fbdcb5a51b23e842e785b364a069b3f75c681 /app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java | |
parent | ec4cafb1026db8f461d94908dbdfcd8281d235a4 (diff) |
implement wifi tethering
Diffstat (limited to 'app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java')
-rw-r--r-- | app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java | 70 |
1 files changed, 61 insertions, 9 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java index 0d4f56d8..58d67872 100644 --- a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java +++ b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java @@ -18,12 +18,20 @@ package se.leap.bitmaskclient.tethering; import android.content.Context; import android.content.IntentFilter; +import android.util.Log; +import java.net.Inet4Address; +import java.net.InterfaceAddress; import java.net.NetworkInterface; import java.util.Enumeration; +import java.util.List; import se.leap.bitmaskclient.utils.Cmd; +import static se.leap.bitmaskclient.utils.PreferenceHelper.isBluetoothTetheringAllowed; +import static se.leap.bitmaskclient.utils.PreferenceHelper.isUsbTetheringAllowed; +import static se.leap.bitmaskclient.utils.PreferenceHelper.isWifiTetheringAllowed; + /** * This manager tries to figure out the current tethering states for Wifi, USB and Bluetooth * The default behavior differs for failing attempts to get these states: @@ -55,15 +63,14 @@ public class TetheringStateManager { intentFilter.addAction("android.net.wifi.WIFI_AP_STATE_CHANGED"); context.getApplicationContext().registerReceiver(broadcastReceiver, intentFilter); instance.wifiManager = new WifiManagerWrapper(context); + TetheringObservable.allowVpnWifiTethering(isWifiTetheringAllowed(context)); + TetheringObservable.allowVpnUsbTethering(isUsbTetheringAllowed(context)); + TetheringObservable.allowVpnBluetoothTethering(isBluetoothTetheringAllowed(context)); updateWifiTetheringState(); updateUsbTetheringState(); updateBluetoothTetheringState(); } - private static boolean isWifiApEnabled() throws Exception { - return instance.wifiManager.isWifiAPEnabled(); - } - private static boolean getUsbTetheringState() { try { @@ -82,6 +89,54 @@ public class TetheringStateManager { return false; } + public static String getWifiAddressRange() { + String interfaceAddress = getWifiInterfaceAddress(); + if (interfaceAddress.split("\\.").length == 4) { + String result = interfaceAddress.substring(0, interfaceAddress.lastIndexOf(".")); + result = result + ".0/24"; + Log.d(TAG, "wifiAddressRange = " + result); + return result; + } + return ""; + } + + private static String getWifiInterfaceAddress() { + NetworkInterface networkInterface = getWlanInterface(); + if (networkInterface != null) { + List<InterfaceAddress> ifaceAddresses = networkInterface.getInterfaceAddresses(); + for (InterfaceAddress ifaceAddres : ifaceAddresses) { + if (ifaceAddres.getAddress() instanceof Inet4Address) { + return ifaceAddres.getAddress().getHostAddress(); + } + } + } + return ""; + } + + public static String getWifiInterfaceName() { + NetworkInterface networkInterface = getWlanInterface(); + if (networkInterface != null) { + return networkInterface.getName(); + } + return ""; + } + + private static NetworkInterface getWlanInterface() { + try { + for(Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { + NetworkInterface networkInterface = en.nextElement(); + if(!networkInterface.isLoopback()){ + if(networkInterface.getName().contains("wlan") || networkInterface.getName().contains("eth")){ + return networkInterface; + } + } + } + } catch(Exception e){ + e.printStackTrace(); + } + return null; + } + private static boolean isBluetoothTetheringEnabled() { StringBuilder log = new StringBuilder(); boolean hasBtPan = false; @@ -104,12 +159,9 @@ public class TetheringStateManager { } static void updateWifiTetheringState() { - boolean lastState = TetheringObservable.getInstance().isWifiTetheringEnabled(); + WifiManagerWrapper manager = getInstance().wifiManager; try { - boolean currentState = isWifiApEnabled(); - if (currentState != lastState) { - TetheringObservable.setWifiTethering(currentState); - } + TetheringObservable.setWifiTethering(manager.isWifiAPEnabled(), getWifiAddressRange(), getWifiInterfaceName()); } catch (Exception e) { e.printStackTrace(); } |