From 01e2f7e8f76248c791bd61429687da7c2cb584b9 Mon Sep 17 00:00:00 2001 From: cyBerta Date: Fri, 3 Jan 2020 02:24:57 +0100 Subject: implement simple detection for usb tethering --- .../java/se/leap/bitmaskclient/BitmaskApp.java | 4 +- .../bitmaskclient/fragments/TetheringDialog.java | 9 ++- .../tethering/TetheringBroadcastReceiver.java | 22 ++++++ .../bitmaskclient/tethering/TetheringObserver.java | 92 ++++++++++++++++++++++ .../tethering/WifiHotspotBroadcastReceiver.java | 20 ----- .../tethering/WifiHotspotObserver.java | 55 ------------- 6 files changed, 121 insertions(+), 81 deletions(-) create mode 100644 app/src/main/java/se/leap/bitmaskclient/tethering/TetheringBroadcastReceiver.java create mode 100644 app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObserver.java delete mode 100644 app/src/main/java/se/leap/bitmaskclient/tethering/WifiHotspotBroadcastReceiver.java delete mode 100644 app/src/main/java/se/leap/bitmaskclient/tethering/WifiHotspotObserver.java diff --git a/app/src/main/java/se/leap/bitmaskclient/BitmaskApp.java b/app/src/main/java/se/leap/bitmaskclient/BitmaskApp.java index 6a657d33..83691802 100644 --- a/app/src/main/java/se/leap/bitmaskclient/BitmaskApp.java +++ b/app/src/main/java/se/leap/bitmaskclient/BitmaskApp.java @@ -8,7 +8,7 @@ import android.support.v7.app.AppCompatDelegate; import com.squareup.leakcanary.LeakCanary; import com.squareup.leakcanary.RefWatcher; -import se.leap.bitmaskclient.tethering.WifiHotspotObserver; +import se.leap.bitmaskclient.tethering.TetheringObserver; import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES; import static se.leap.bitmaskclient.utils.PreferenceHelper.getSavedProviderFromSharedPreferences; @@ -40,7 +40,7 @@ public class BitmaskApp extends MultiDexApplication { providerObservable.updateProvider(getSavedProviderFromSharedPreferences(preferences)); EipSetupObserver.init(this, preferences); AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); - WifiHotspotObserver.init(this); + TetheringObserver.init(this); } /** diff --git a/app/src/main/java/se/leap/bitmaskclient/fragments/TetheringDialog.java b/app/src/main/java/se/leap/bitmaskclient/fragments/TetheringDialog.java index 04d3071f..65287afe 100644 --- a/app/src/main/java/se/leap/bitmaskclient/fragments/TetheringDialog.java +++ b/app/src/main/java/se/leap/bitmaskclient/fragments/TetheringDialog.java @@ -23,7 +23,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; import se.leap.bitmaskclient.R; import se.leap.bitmaskclient.eip.EipCommand; -import se.leap.bitmaskclient.tethering.WifiHotspotObserver; +import se.leap.bitmaskclient.tethering.TetheringObserver; import se.leap.bitmaskclient.utils.PreferenceHelper; import se.leap.bitmaskclient.views.IconCheckboxEntry; @@ -142,7 +142,8 @@ public class TetheringDialog extends AppCompatDialogFragment { @Override public void onResume() { super.onResume(); - dataset[0].enabled = WifiHotspotObserver.getInstance().isEnabled(); + dataset[0].enabled = TetheringObserver.getInstance().isWifiTetheringEnabled(); + dataset[1].enabled = TetheringObserver.getInstance().isUsbTetheringEnabled(); adapter.notifyDataSetChanged(); } @@ -175,11 +176,11 @@ public class TetheringDialog extends AppCompatDialogFragment { new DialogListAdapter.ViewModel(getContext().getResources().getDrawable(R.drawable.ic_wifi), getContext().getString(R.string.tethering_wifi), PreferenceHelper.getWifiTethering(getContext()), - WifiHotspotObserver.getInstance().isEnabled()), + TetheringObserver.getInstance().isWifiTetheringEnabled()), new DialogListAdapter.ViewModel(getContext().getResources().getDrawable(R.drawable.ic_usb), getContext().getString(R.string.tethering_usb), PreferenceHelper.getUsbTethering(getContext()), - true), + TetheringObserver.getInstance().isUsbTetheringEnabled()), new DialogListAdapter.ViewModel(getContext().getResources().getDrawable(R.drawable.ic_bluetooth), getContext().getString(R.string.tethering_bluetooth), PreferenceHelper.getBluetoothTethering(getContext()), diff --git a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringBroadcastReceiver.java b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringBroadcastReceiver.java new file mode 100644 index 00000000..c5840171 --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringBroadcastReceiver.java @@ -0,0 +1,22 @@ +package se.leap.bitmaskclient.tethering; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.net.wifi.WifiManager; + +public class TetheringBroadcastReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if ("android.net.wifi.WIFI_AP_STATE_CHANGED".equals(intent.getAction())) { + int apState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0); + if (WifiHotspotState.WIFI_AP_STATE_ENABLED.ordinal() == apState % 10) { + TetheringObserver.getInstance().setWifiTetheringEnabled(true); + } else { + TetheringObserver.getInstance().setWifiTetheringEnabled(false); + } + } else if ("android.net.conn.TETHER_STATE_CHANGED".equals(intent.getAction())) { + TetheringObserver.getInstance().updateUsbTetheringState(); + } + } +} diff --git a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObserver.java b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObserver.java new file mode 100644 index 00000000..1d1fa951 --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObserver.java @@ -0,0 +1,92 @@ +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 en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { + NetworkInterface networkInterface = en.nextElement(); + for(Enumeration 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/WifiHotspotBroadcastReceiver.java b/app/src/main/java/se/leap/bitmaskclient/tethering/WifiHotspotBroadcastReceiver.java deleted file mode 100644 index 1d81eff5..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/tethering/WifiHotspotBroadcastReceiver.java +++ /dev/null @@ -1,20 +0,0 @@ -package se.leap.bitmaskclient.tethering; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.net.wifi.WifiManager; - -public class WifiHotspotBroadcastReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - if ("android.net.wifi.WIFI_AP_STATE_CHANGED".equals(intent.getAction())) { - int apState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0); - if (WifiHotspotState.WIFI_AP_STATE_ENABLED.ordinal() == apState % 10) { - WifiHotspotObserver.getInstance().setEnabled(true); - } else { - WifiHotspotObserver.getInstance().setEnabled(false); - } - } - } -} diff --git a/app/src/main/java/se/leap/bitmaskclient/tethering/WifiHotspotObserver.java b/app/src/main/java/se/leap/bitmaskclient/tethering/WifiHotspotObserver.java deleted file mode 100644 index 578c5552..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/tethering/WifiHotspotObserver.java +++ /dev/null @@ -1,55 +0,0 @@ -package se.leap.bitmaskclient.tethering; - -import android.content.Context; -import android.content.IntentFilter; -import android.net.wifi.WifiManager; - -import java.lang.reflect.Method; - -public class WifiHotspotObserver { - private static WifiHotspotObserver instance; - - private boolean isEnabled; - private WifiManager wifiManager; - private WifiHotspotBroadcastReceiver broadcastReceiver; - - private WifiHotspotObserver() { - } - - public static void init(Context context) { - if (instance == null) { - instance = new WifiHotspotObserver(); - instance.broadcastReceiver = new WifiHotspotBroadcastReceiver(); - IntentFilter intentFilter = new IntentFilter("android.net.wifi.WIFI_AP_STATE_CHANGED"); - context.getApplicationContext().registerReceiver(instance.broadcastReceiver, intentFilter); - instance.wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); - instance.setEnabled(instance.isWifiApEnabled()); - } - } - - 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; - } - } - - public static WifiHotspotObserver getInstance() { - if (instance == null) { - throw new RuntimeException("Call init() first!"); - } - - return instance; - } - - void setEnabled(boolean enabled) { - isEnabled = enabled; - } - - public boolean isEnabled() { - return isEnabled; - } -} -- cgit v1.2.3