summaryrefslogtreecommitdiff
path: root/app/src/main/java/se/leap/bitmaskclient/tethering
diff options
context:
space:
mode:
authorcyBerta <cyberta@riseup.net>2020-01-08 05:06:23 +0100
committercyberta <cyberta@riseup.net>2020-01-24 10:38:35 -0600
commite67c55d2d39fea60ee06ca14ca7b61ba638b7f2a (patch)
treeae79cbe449a572542d669f194341ca552d5569fb /app/src/main/java/se/leap/bitmaskclient/tethering
parent01e2f7e8f76248c791bd61429687da7c2cb584b9 (diff)
implement bluetooth tethering detection, refactor TetheringObservable
Diffstat (limited to 'app/src/main/java/se/leap/bitmaskclient/tethering')
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/tethering/TetheringBroadcastReceiver.java13
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObservable.java50
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObserver.java92
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java93
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());
+ }
+
+}