diff options
Diffstat (limited to 'app/src')
4 files changed, 52 insertions, 1 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/BitmaskApp.java b/app/src/main/java/se/leap/bitmaskclient/base/BitmaskApp.java index 6c8e3115..3f73e49d 100644 --- a/app/src/main/java/se/leap/bitmaskclient/base/BitmaskApp.java +++ b/app/src/main/java/se/leap/bitmaskclient/base/BitmaskApp.java @@ -43,6 +43,7 @@ import static se.leap.bitmaskclient.base.models.Constants.SHARED_PREFERENCES; import static se.leap.bitmaskclient.appUpdate.DownloadBroadcastReceiver.ACTION_DOWNLOAD; import static se.leap.bitmaskclient.appUpdate.DownloadServiceCommand.CHECK_VERSION_FILE; import static se.leap.bitmaskclient.appUpdate.DownloadServiceCommand.DOWNLOAD_UPDATE; +import static se.leap.bitmaskclient.base.utils.ConfigHelper.isCalyxOSWithTetheringSupport; import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getSavedProviderFromSharedPreferences; /** @@ -75,7 +76,9 @@ public class BitmaskApp extends MultiDexApplication { torStatusObservable = TorStatusObservable.getInstance(); EipSetupObserver.init(this, preferences); AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); - TetheringStateManager.getInstance().init(this); + if (!isCalyxOSWithTetheringSupport(this)) { + TetheringStateManager.getInstance().init(this); + } if (BuildConfig.FLAVOR.contains("Fatweb")) { downloadBroadcastReceiver = new DownloadBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(BROADCAST_DOWNLOAD_SERVICE_EVENT); diff --git a/app/src/main/java/se/leap/bitmaskclient/base/fragments/SettingsFragment.java b/app/src/main/java/se/leap/bitmaskclient/base/fragments/SettingsFragment.java index 94f737b4..9d15f839 100644 --- a/app/src/main/java/se/leap/bitmaskclient/base/fragments/SettingsFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/base/fragments/SettingsFragment.java @@ -11,6 +11,7 @@ import static se.leap.bitmaskclient.base.models.Constants.USE_BRIDGES; import static se.leap.bitmaskclient.base.models.Constants.USE_IPv6_FIREWALL; import static se.leap.bitmaskclient.base.utils.ConfigHelper.ObfsVpnHelper.useObfsVpn; import static se.leap.bitmaskclient.base.utils.PreferenceHelper.allowExperimentalTransports; +import static se.leap.bitmaskclient.base.utils.ConfigHelper.isCalyxOSWithTetheringSupport; import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getPreferUDP; import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getShowAlwaysOnDialog; import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getUseBridges; @@ -213,6 +214,12 @@ public class SettingsFragment extends Fragment implements SharedPreferences.OnSh private void initTetheringEntry(View rootView) { tethering = rootView.findViewById(R.id.tethering); + + if (isCalyxOSWithTetheringSupport(this.getContext())) { + tethering.setVisibility(GONE); + return; + } + tethering.setOnClickListener((buttonView) -> { showTetheringAlert(); }); diff --git a/app/src/main/java/se/leap/bitmaskclient/base/utils/ConfigHelper.java b/app/src/main/java/se/leap/bitmaskclient/base/utils/ConfigHelper.java index 8ac5baf0..102756c4 100644 --- a/app/src/main/java/se/leap/bitmaskclient/base/utils/ConfigHelper.java +++ b/app/src/main/java/se/leap/bitmaskclient/base/utils/ConfigHelper.java @@ -273,6 +273,11 @@ public class ConfigHelper { Matcher matcher = IPv4_PATTERN.matcher(ipv4); return matcher.matches(); } + + public static boolean isCalyxOSWithTetheringSupport(Context context) { + return SystemPropertiesHelper.contains("ro.calyxos.version", context) && + Build.VERSION.SDK_INT >= Build.VERSION_CODES.R; + } // ObfsVpnHelper class allows us to mock BuildConfig.use_obfsvpn while // not mocking the whole ConfigHelper class diff --git a/app/src/main/java/se/leap/bitmaskclient/base/utils/SystemPropertiesHelper.java b/app/src/main/java/se/leap/bitmaskclient/base/utils/SystemPropertiesHelper.java new file mode 100644 index 00000000..b148f685 --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/base/utils/SystemPropertiesHelper.java @@ -0,0 +1,36 @@ +package se.leap.bitmaskclient.base.utils; + +import android.content.Context; + +import java.lang.reflect.Method; + + +public class SystemPropertiesHelper { + + /** + * Checks if SystemProperties contains a given key using reflection + * @return true if reflection was successful and the key was found + */ + public static boolean contains(String key, Context context) { + String result = null; + try { + ClassLoader cl = context.getClassLoader(); + @SuppressWarnings("rawtypes") + Class SystemProperties = cl.loadClass("android.os.SystemProperties"); + @SuppressWarnings("rawtypes") + Class[] paramTypes= new Class[1]; + paramTypes[0]= String.class; + + Method get = SystemProperties.getMethod("get", paramTypes); + Object[] params= new Object[1]; + params[0]= key; + + result = (String) get.invoke(SystemProperties, params); + } catch (Exception e) { + e.printStackTrace(); + } + + return result != null; + } +} + |