diff options
author | cyBerta <cyberta@riseup.net> | 2020-01-08 05:06:23 +0100 |
---|---|---|
committer | cyberta <cyberta@riseup.net> | 2020-01-24 10:38:35 -0600 |
commit | e67c55d2d39fea60ee06ca14ca7b61ba638b7f2a (patch) | |
tree | ae79cbe449a572542d669f194341ca552d5569fb /app/src/main/java/se/leap/bitmaskclient/tethering | |
parent | 01e2f7e8f76248c791bd61429687da7c2cb584b9 (diff) |
implement bluetooth tethering detection, refactor TetheringObservable
Diffstat (limited to 'app/src/main/java/se/leap/bitmaskclient/tethering')
4 files changed, 153 insertions, 95 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringBroadcastReceiver.java b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringBroadcastReceiver.java index c5840171..54c312d7 100644 --- a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringBroadcastReceiver.java +++ b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringBroadcastReceiver.java @@ -4,19 +4,26 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.wifi.WifiManager; +import android.util.Log; public class TetheringBroadcastReceiver extends BroadcastReceiver { + private static final String TAG = TetheringBroadcastReceiver.class.getSimpleName(); + @Override public void onReceive(Context context, Intent intent) { if ("android.net.wifi.WIFI_AP_STATE_CHANGED".equals(intent.getAction())) { + Log.d(TAG, "TETHERING WIFI_AP_STATE_CHANGED"); int apState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0); if (WifiHotspotState.WIFI_AP_STATE_ENABLED.ordinal() == apState % 10) { - TetheringObserver.getInstance().setWifiTetheringEnabled(true); + TetheringObservable.setWifiTethering(true); } else { - TetheringObserver.getInstance().setWifiTetheringEnabled(false); + TetheringObservable.setWifiTethering(false); } } else if ("android.net.conn.TETHER_STATE_CHANGED".equals(intent.getAction())) { - TetheringObserver.getInstance().updateUsbTetheringState(); + Log.d(TAG, "TETHERING TETHER_STATE_CHANGED"); + TetheringStateManager.updateUsbTetheringState(); + TetheringStateManager.updateBluetoothTetheringState(); + TetheringStateManager.updateWifiTetheringState(); } } } diff --git a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObservable.java b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObservable.java new file mode 100644 index 00000000..594258bf --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObservable.java @@ -0,0 +1,50 @@ +package se.leap.bitmaskclient.tethering; + +import java.util.Observable; + +public class TetheringObservable extends Observable { + private static TetheringObservable instance; + + private boolean isWifiTetheringEnabled; + private boolean isUsbTetheringEnabled; + private boolean isBluetoothTetheringEnabled; + + private TetheringObservable() { } + + public static TetheringObservable getInstance() { + if (instance == null) { + instance = new TetheringObservable(); + } + return instance; + } + + static void setWifiTethering(boolean enabled) { + getInstance().isWifiTetheringEnabled = enabled; + getInstance().setChanged(); + getInstance().notifyObservers(); + } + + static void setUsbTethering(boolean enabled) { + getInstance().isUsbTetheringEnabled = enabled; + getInstance().setChanged(); + getInstance().notifyObservers(); + } + + static void setBluetoothTethering(boolean enabled) { + getInstance().isBluetoothTetheringEnabled = enabled; + getInstance().setChanged(); + getInstance().notifyObservers(); + } + + public boolean isBluetoothTetheringEnabled() { + return isBluetoothTetheringEnabled; + } + + public boolean isUsbTetheringEnabled() { + return isUsbTetheringEnabled; + } + + public boolean isWifiTetheringEnabled() { + return isWifiTetheringEnabled; + } +} diff --git a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObserver.java b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObserver.java deleted file mode 100644 index 1d1fa951..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObserver.java +++ /dev/null @@ -1,92 +0,0 @@ -package se.leap.bitmaskclient.tethering; - -import android.content.Context; -import android.content.IntentFilter; -import android.net.ConnectivityManager; -import android.net.wifi.WifiManager; - -import java.lang.reflect.Method; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.util.Enumeration; - -public class TetheringObserver { - private static TetheringObserver instance; - - private boolean isWifiTetheringEnabled; - private boolean isUsbTetheringEnabled; - private WifiManager wifiManager; - private ConnectivityManager connectivityManager; - private TetheringBroadcastReceiver broadcastReceiver; - - private TetheringObserver() { - } - - public static void init(Context context) { - if (instance == null) { - instance = new TetheringObserver(); - instance.broadcastReceiver = new TetheringBroadcastReceiver(); - IntentFilter intentFilter = new IntentFilter("android.net.wifi.WIFI_AP_STATE_CHANGED"); - intentFilter.addAction("android.net.conn.TETHER_STATE_CHANGED"); - context.getApplicationContext().registerReceiver(instance.broadcastReceiver, intentFilter); - instance.wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); - instance.setWifiTetheringEnabled(instance.isWifiApEnabled()); - instance.connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); - } - } - - private boolean isWifiApEnabled() { - try { - Method method = instance.wifiManager.getClass().getMethod("getWifiApState"); - int tmp = ((Integer) method.invoke(wifiManager)); - return WifiHotspotState.WIFI_AP_STATE_ENABLED.ordinal() == tmp % 10; - } catch (Exception e) { - return false; - } - } - - private boolean getUsbTetheringState() { - try { - - for(Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { - NetworkInterface networkInterface = en.nextElement(); - for(Enumeration<InetAddress> enumIpAddr = networkInterface.getInetAddresses(); enumIpAddr.hasMoreElements();){ - InetAddress inetAddress = enumIpAddr.nextElement(); - if(!networkInterface.isLoopback()){ - if(networkInterface.getName().contains("rndis") || networkInterface.getName().contains("usb")){ - return true; - } - } - } - } - } catch(Exception e){ - e.printStackTrace(); - } - - return false; - } - - public static TetheringObserver getInstance() { - if (instance == null) { - throw new RuntimeException("Call init() first!"); - } - - return instance; - } - - void setWifiTetheringEnabled(boolean enabled) { - isWifiTetheringEnabled = enabled; - } - - public boolean isWifiTetheringEnabled() { - return isWifiTetheringEnabled; - } - - void updateUsbTetheringState() { - isUsbTetheringEnabled = getUsbTetheringState(); - } - - public boolean isUsbTetheringEnabled() { - return isUsbTetheringEnabled; - } -} diff --git a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java new file mode 100644 index 00000000..1e2521b8 --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java @@ -0,0 +1,93 @@ +package se.leap.bitmaskclient.tethering; + +import android.content.Context; +import android.content.IntentFilter; +import android.net.wifi.WifiManager; + +import java.lang.reflect.Method; +import java.net.NetworkInterface; +import java.util.Enumeration; + +import se.leap.bitmaskclient.utils.Cmd; + +public class TetheringStateManager { + private static final String TAG = TetheringStateManager.class.getSimpleName(); + private static TetheringStateManager instance; + + private WifiManager wifiManager; + + private TetheringStateManager() { } + + public static TetheringStateManager getInstance() { + if (instance == null) { + instance = new TetheringStateManager(); + } + return instance; + } + + public void init(Context context) { + TetheringBroadcastReceiver broadcastReceiver = new TetheringBroadcastReceiver(); + IntentFilter intentFilter = new IntentFilter("android.net.conn.TETHER_STATE_CHANGED"); + intentFilter.addAction("android.net.wifi.WIFI_AP_STATE_CHANGED"); + context.getApplicationContext().registerReceiver(broadcastReceiver, intentFilter); + instance.wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); + updateWifiTetheringState(); + updateUsbTetheringState(); + updateBluetoothTetheringState(); + } + + private static boolean isWifiApEnabled() { + try { + Method method = instance.wifiManager.getClass().getMethod("getWifiApState"); + int tmp = ((Integer) method.invoke(instance.wifiManager)); + return WifiHotspotState.WIFI_AP_STATE_ENABLED.ordinal() == tmp % 10; + } catch (Exception e) { + return false; + } + } + + + private static boolean getUsbTetheringState() { + try { + for(Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { + NetworkInterface networkInterface = en.nextElement(); + if(!networkInterface.isLoopback()){ + if(networkInterface.getName().contains("rndis") || networkInterface.getName().contains("usb")){ + return true; + } + } + } + } catch(Exception e){ + e.printStackTrace(); + } + + return false; + } + + // Check whether Bluetooth tethering is enabled. + private static boolean isBluetoothTetheringEnabled() { + StringBuilder log = new StringBuilder(); + boolean hasBtPan = false; + try { + hasBtPan = Cmd.runBlockingCmd(new String[] {"ifconfig bt-pan"}, log) == 0; + //Log.d(TAG, "ifconfig result: " + log.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + return hasBtPan; + + } + + static void updateUsbTetheringState() { + TetheringObservable.setUsbTethering(getUsbTetheringState()); + } + + static void updateBluetoothTetheringState() { + TetheringObservable.setBluetoothTethering(isBluetoothTetheringEnabled()); + } + + static void updateWifiTetheringState() { + TetheringObservable.setWifiTethering(isWifiApEnabled()); + } + +} |