Skip to content

Commit cab6522

Browse files
committed
New hook for API24 and newer.
This is untested as I do not have Xposed on my Nougat device, but it should work.
1 parent ede1d84 commit cab6522

5 files changed

Lines changed: 88 additions & 6 deletions

File tree

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ android {
88
applicationId "fr.frazew.virtualgyroscope"
99
minSdkVersion 16
1010
targetSdkVersion 23
11-
versionCode 150
12-
versionName "1.5"
11+
versionCode 151
12+
versionName "1.5.1"
1313
resConfigs "nodpi", "hdpi"
1414
}
1515
buildTypes {

app/src/main/java/fr/frazew/virtualgyroscope/XposedMod.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
6767
}
6868

6969
private void hookSensorValues(final LoadPackageParam lpparam) {
70-
if (Build.VERSION.SDK_INT >= 23)
70+
if (Build.VERSION.SDK_INT >= 24)
71+
XposedHelpers.findAndHookMethod("android.hardware.SystemSensorManager$SensorEventQueue",
72+
lpparam.classLoader, "dispatchSensorEvent", int.class, float[].class, int.class, long.class,
73+
new fr.frazew.virtualgyroscope.hooks.sensorchange.API24());
74+
else if (Build.VERSION.SDK_INT == 23)
7175
XposedHelpers.findAndHookMethod("android.hardware.SystemSensorManager$SensorEventQueue",
7276
lpparam.classLoader, "dispatchSensorEvent", int.class, float[].class, int.class, long.class,
7377
new fr.frazew.virtualgyroscope.hooks.sensorchange.API23());
@@ -84,7 +88,11 @@ else if (Build.VERSION.SDK_INT >= 16)
8488

8589
@SuppressWarnings("unchecked")
8690
private void addSensors(final LoadPackageParam lpparam) {
87-
if (Build.VERSION.SDK_INT >= 23)
91+
if (Build.VERSION.SDK_INT >= 24)
92+
XposedHelpers.findAndHookConstructor("android.hardware.SystemSensorManager",
93+
lpparam.classLoader, android.content.Context.class, android.os.Looper.class,
94+
new fr.frazew.virtualgyroscope.hooks.constructor.API24(lpparam));
95+
else if (Build.VERSION.SDK_INT == 23)
8896
XposedHelpers.findAndHookConstructor("android.hardware.SystemSensorManager",
8997
lpparam.classLoader, android.content.Context.class, android.os.Looper.class,
9098
new fr.frazew.virtualgyroscope.hooks.constructor.API23(lpparam));

app/src/main/java/fr/frazew/virtualgyroscope/hooks/SystemSensorManagerHook.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.lang.reflect.InvocationTargetException;
88
import java.util.ArrayList;
9+
import java.util.HashMap;
910
import java.util.Iterator;
1011
import java.util.List;
1112

@@ -22,7 +23,7 @@ public SystemSensorManagerHook(XC_LoadPackage.LoadPackageParam lpparam) {
2223
SYSTEM_SENSOR_MANAGER = XposedHelpers.findClass("android.hardware.SystemSensorManager", lpparam.classLoader);
2324
}
2425

25-
public void fillSensorLists(ArrayList<Sensor> fullSensorList, SparseArray<Sensor> handleToSensor) throws IllegalAccessException, InstantiationException, InvocationTargetException {
26+
public void fillSensorLists(ArrayList<Sensor> fullSensorList, Object handleToSensor) throws IllegalAccessException, InstantiationException, InvocationTargetException {
2627
Iterator<Sensor> iterator = fullSensorList.iterator();
2728

2829
int minDelayAccelerometer = 0;
@@ -73,7 +74,8 @@ public void fillSensorLists(ArrayList<Sensor> fullSensorList, SparseArray<Sensor
7374
XposedHelpers.setObjectField(s, "mRequiredPermission", model.permission);
7475

7576
fullSensorList.add(s);
76-
handleToSensor.put(model.handle, s);
77+
if (handleToSensor.getClass() == SparseArray.class) ((SparseArray) handleToSensor).put(model.handle, s);
78+
else if (handleToSensor.getClass() == HashMap.class) ((HashMap) handleToSensor).put(model.handle, s);
7779
}
7880
}
7981
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package fr.frazew.virtualgyroscope.hooks.constructor;
2+
3+
import android.hardware.Sensor;
4+
5+
import java.util.ArrayList;
6+
import java.util.HashMap;
7+
8+
import de.robv.android.xposed.XC_MethodHook;
9+
import de.robv.android.xposed.XposedHelpers;
10+
import de.robv.android.xposed.callbacks.XC_LoadPackage;
11+
import fr.frazew.virtualgyroscope.hooks.SystemSensorManagerHook;
12+
13+
public class API24 extends XC_MethodHook {
14+
private SystemSensorManagerHook mSystemSensorManagerHook;
15+
16+
public API24(XC_LoadPackage.LoadPackageParam lpparam) {
17+
this.mSystemSensorManagerHook = new SystemSensorManagerHook(lpparam);
18+
}
19+
20+
@Override
21+
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
22+
super.afterHookedMethod(param);
23+
ArrayList<Sensor> mFullSensorsList = (ArrayList<Sensor>) XposedHelpers.getObjectField(param.thisObject, "mFullSensorsList");
24+
HashMap<Integer, Sensor> mHandleToSensor = (HashMap<Integer, Sensor>)((HashMap<Integer, Sensor>) XposedHelpers.getObjectField(param.thisObject, "mHandleToSensor")).clone();
25+
26+
XposedHelpers.findField(SystemSensorManagerHook.SYSTEM_SENSOR_MANAGER, "mFullSensorsList").setAccessible(true);
27+
XposedHelpers.findField(SystemSensorManagerHook.SYSTEM_SENSOR_MANAGER, "mHandleToSensor").setAccessible(true);
28+
29+
this.mSystemSensorManagerHook.fillSensorLists(mFullSensorsList, mHandleToSensor);
30+
XposedHelpers.setObjectField(param.thisObject, "mHandleToSensor", mHandleToSensor.clone());
31+
XposedHelpers.setObjectField(param.thisObject, "mFullSensorsList", mFullSensorsList.clone());
32+
}
33+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package fr.frazew.virtualgyroscope.hooks.sensorchange;
2+
3+
import android.hardware.Sensor;
4+
import android.hardware.SensorEventListener;
5+
6+
import java.util.HashMap;
7+
8+
import de.robv.android.xposed.XC_MethodHook;
9+
import de.robv.android.xposed.XposedHelpers;
10+
import fr.frazew.virtualgyroscope.VirtualSensorListener;
11+
import fr.frazew.virtualgyroscope.XposedMod;
12+
import fr.frazew.virtualgyroscope.hooks.SensorChange;
13+
14+
@SuppressWarnings("unchecked")
15+
public class API24 extends XC_MethodHook {
16+
private SensorChange mSensorChange;
17+
18+
public API24() {
19+
super(XC_MethodHook.PRIORITY_HIGHEST);
20+
this.mSensorChange = new SensorChange();
21+
}
22+
23+
@Override
24+
protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
25+
SensorEventListener listener = (SensorEventListener) XposedHelpers.getObjectField(param.thisObject, "mListener");
26+
int handle = (int) param.args[0];
27+
Object mgr = XposedHelpers.getObjectField(param.thisObject, "mManager");
28+
HashMap<Integer, Sensor> sensors = (HashMap<Integer, Sensor>) XposedHelpers.getObjectField(mgr, "mHandleToSensor");
29+
Sensor s = sensors.get(handle);
30+
31+
if (listener instanceof VirtualSensorListener) {
32+
float[] values = this.mSensorChange.handleListener(s, (VirtualSensorListener) listener, ((float[]) param.args[1]).clone(), (int) param.args[2], (long) param.args[3], XposedMod.ACCELEROMETER_RESOLUTION, XposedMod.MAGNETIC_RESOLUTION);
33+
if (values != null) {
34+
System.arraycopy(values, 0, param.args[1], 0, values.length);
35+
param.args[0] = XposedMod.sensorTypetoHandle.get(((VirtualSensorListener) listener).getSensor().getType());
36+
}// else param.setResult(null);
37+
}
38+
}
39+
}

0 commit comments

Comments
 (0)