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/SensorMod/src/main/res/values/strings.xml b/SensorMod/src/main/res/values/strings.xml
new file mode 100644
index 0000000..359a86e
--- /dev/null
+++ b/SensorMod/src/main/res/values/strings.xml
@@ -0,0 +1,5 @@
+
+ SensorMod
+ Selectively disable sensors.
+ SensorMod Settings
+
diff --git a/SensorMod/src/main/res/values/themes.xml b/SensorMod/src/main/res/values/themes.xml
new file mode 100644
index 0000000..1b28f45
--- /dev/null
+++ b/SensorMod/src/main/res/values/themes.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
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")