diff --git a/SensorMod/Readme.md b/SensorMod/Readme.md new file mode 100644 index 0000000..31affbf --- /dev/null +++ b/SensorMod/Readme.md @@ -0,0 +1,6 @@ +# SensorMod + +This Module allows you to selectively disable sensors on your android device. +Every sensor is listed and can be selectively disabled at choice. +Supports all sensors reported by Android through the SensorManager API. +Select all apps to disable the sensors for as scope for the module. diff --git a/SensorMod/build.gradle.kts b/SensorMod/build.gradle.kts new file mode 100644 index 0000000..d0d6e9c --- /dev/null +++ b/SensorMod/build.gradle.kts @@ -0,0 +1,21 @@ +plugins { + alias(libs.plugins.buildlogic.android.application) +} + +android { + namespace = "com.programminghoch10.SensorMod" + + defaultConfig { + minSdk = 16 + targetSdk = 35 + multiDexEnabled = true + } + compileOptions { + isCoreLibraryDesugaringEnabled = true + } +} + +dependencies { + implementation(libs.androidx.preference) + coreLibraryDesugaring(libs.android.desugarJdkLibs) +} diff --git a/SensorMod/src/main/AndroidManifest.xml b/SensorMod/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b33a41b --- /dev/null +++ b/SensorMod/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + diff --git a/SensorMod/src/main/assets/xposed_init b/SensorMod/src/main/assets/xposed_init new file mode 100644 index 0000000..1c7c125 --- /dev/null +++ b/SensorMod/src/main/assets/xposed_init @@ -0,0 +1 @@ +com.programminghoch10.SensorMod.Hook diff --git a/SensorMod/src/main/java/com/programminghoch10/SensorMod/Common.java b/SensorMod/src/main/java/com/programminghoch10/SensorMod/Common.java new file mode 100644 index 0000000..5bea55a --- /dev/null +++ b/SensorMod/src/main/java/com/programminghoch10/SensorMod/Common.java @@ -0,0 +1,14 @@ +package com.programminghoch10.SensorMod; + +import android.hardware.Sensor; + +import java.util.Objects; + +public class Common { + + public static boolean DEFAULT_SENSOR_STATE = true; + + public static String getKey(Sensor sensor) { + return "sensor_" + Objects.hash(sensor.getName(), sensor.getId(), sensor.getVendor(), sensor.getVersion(), sensor.getType()); + } +} diff --git a/SensorMod/src/main/java/com/programminghoch10/SensorMod/Hook.java b/SensorMod/src/main/java/com/programminghoch10/SensorMod/Hook.java new file mode 100644 index 0000000..1c2eef5 --- /dev/null +++ b/SensorMod/src/main/java/com/programminghoch10/SensorMod/Hook.java @@ -0,0 +1,38 @@ +package com.programminghoch10.SensorMod; + +import static com.programminghoch10.SensorMod.Common.DEFAULT_SENSOR_STATE; +import static com.programminghoch10.SensorMod.Common.getKey; + +import android.content.SharedPreferences; +import android.hardware.Sensor; +import android.hardware.SensorManager; +import android.util.Log; + +import java.util.List; + +import de.robv.android.xposed.IXposedHookLoadPackage; +import de.robv.android.xposed.XC_MethodHook; +import de.robv.android.xposed.XSharedPreferences; +import de.robv.android.xposed.XposedHelpers; +import de.robv.android.xposed.callbacks.XC_LoadPackage; + +public class Hook implements IXposedHookLoadPackage { + + @Override + public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { + if (lpparam.packageName.equals(BuildConfig.APPLICATION_ID)) return; + SharedPreferences sharedPreferences = new XSharedPreferences(BuildConfig.APPLICATION_ID, "sensors"); + Class systemSensorManager = (Class) XposedHelpers.findClass("android.hardware.SystemSensorManager", lpparam.classLoader); + XposedHelpers.findAndHookMethod(systemSensorManager, "getFullSensorList", new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) throws Throwable { + if (param.hasThrowable()) return; + Log.d("Logger", "afterHookedMethod: filter getFullSensorList"); + List result = (List) param.getResult(); + result = result.stream().filter(sensor -> sharedPreferences.getBoolean(getKey(sensor), DEFAULT_SENSOR_STATE)).toList(); + param.setResult(result); + } + }); + Log.d("Logger", "handleLoadPackage: Hooked SystemSensorManager"); + } +} diff --git a/SensorMod/src/main/java/com/programminghoch10/SensorMod/SettingsActivity.java b/SensorMod/src/main/java/com/programminghoch10/SensorMod/SettingsActivity.java new file mode 100644 index 0000000..1b70f65 --- /dev/null +++ b/SensorMod/src/main/java/com/programminghoch10/SensorMod/SettingsActivity.java @@ -0,0 +1,60 @@ +package com.programminghoch10.SensorMod; + +import static com.programminghoch10.SensorMod.Common.DEFAULT_SENSOR_STATE; +import static com.programminghoch10.SensorMod.Common.getKey; + +import android.annotation.SuppressLint; +import android.app.ActionBar; +import android.hardware.Sensor; +import android.hardware.SensorManager; +import android.os.Bundle; + +import androidx.fragment.app.FragmentActivity; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.PreferenceManager; +import androidx.preference.PreferenceScreen; +import androidx.preference.SwitchPreference; + +import java.util.List; + +public class SettingsActivity extends FragmentActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.settings_activity); + if (savedInstanceState == null) { + getSupportFragmentManager() + .beginTransaction() + .replace(R.id.settings, new SettingsFragment()) + .commit(); + } + ActionBar actionBar = getActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled( + getSupportFragmentManager().getBackStackEntryCount() > 0 + ); + } + } + + public static class SettingsFragment extends PreferenceFragmentCompat { + @SuppressLint("WorldReadableFiles") + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + PreferenceManager preferenceManager = getPreferenceManager(); + setPreferenceScreen(preferenceManager.createPreferenceScreen(requireContext())); + preferenceManager.setSharedPreferencesName("sensors"); + preferenceManager.setSharedPreferencesMode(MODE_WORLD_READABLE); + PreferenceScreen preferenceScreen = getPreferenceScreen(); + SensorManager sensorManager = (SensorManager) requireContext().getSystemService(SENSOR_SERVICE); + List sensors = sensorManager.getSensorList(Sensor.TYPE_ALL); + for (Sensor sensor : sensors) { + SwitchPreference preference = new SwitchPreference(requireContext()); + preference.setDefaultValue(DEFAULT_SENSOR_STATE); + preference.setKey(getKey(sensor)); + preference.setTitle(sensor.getName()); + preference.setSummary(getKey(sensor) + " - " + sensor); + preferenceScreen.addPreference(preference); + } + } + } +} diff --git a/SensorMod/src/main/res/layout/settings_activity.xml b/SensorMod/src/main/res/layout/settings_activity.xml new file mode 100644 index 0000000..620409c --- /dev/null +++ b/SensorMod/src/main/res/layout/settings_activity.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/SensorMod/src/main/res/values-v21/themes.xml b/SensorMod/src/main/res/values-v21/themes.xml new file mode 100644 index 0000000..6ee0359 --- /dev/null +++ b/SensorMod/src/main/res/values-v21/themes.xml @@ -0,0 +1,4 @@ + + + + diff --git a/metadata/com.programminghoch10.SensorMod/en-US/full_description.txt b/metadata/com.programminghoch10.SensorMod/en-US/full_description.txt new file mode 100644 index 0000000..2cb4612 --- /dev/null +++ b/metadata/com.programminghoch10.SensorMod/en-US/full_description.txt @@ -0,0 +1,4 @@ +This Module allows you to selectively disable sensors on your android device. +Every sensor is listed and can be selectively disabled at choice. +Supports all sensors reported by Android through the SensorManager API. +Select all apps to disable the sensors for as scope for the module. diff --git a/metadata/com.programminghoch10.SensorMod/en-US/short_description.txt b/metadata/com.programminghoch10.SensorMod/en-US/short_description.txt new file mode 100644 index 0000000..5ca4797 --- /dev/null +++ b/metadata/com.programminghoch10.SensorMod/en-US/short_description.txt @@ -0,0 +1 @@ +Selectively disable sensors. diff --git a/metadata/com.programminghoch10.SensorMod/en-US/title.txt b/metadata/com.programminghoch10.SensorMod/en-US/title.txt new file mode 100644 index 0000000..452f266 --- /dev/null +++ b/metadata/com.programminghoch10.SensorMod/en-US/title.txt @@ -0,0 +1 @@ +SensorMod diff --git a/modules.gradle.kts b/modules.gradle.kts index 48b5bfc..352f7fa 100644 --- a/modules.gradle.kts +++ b/modules.gradle.kts @@ -17,4 +17,5 @@ include(":PersistentForegroundServiceNotifications") include(":PreventAudioFocus") include(":ResetAllNotificationChannels") include(":RotationControl") +include(":SensorMod") include(":UpsideWifi")