Skip to content

Commit 21cf028

Browse files
authored
Update BatteryHook.java
The Fix: Hook BatteryService Directly
1 parent 43bb4a6 commit 21cf028

1 file changed

Lines changed: 34 additions & 43 deletions

File tree

app/src/main/java/com/github/dhangofa/batteryremapper/BatteryHook.java

Lines changed: 34 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -33,62 +33,53 @@ public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
3333
// ------------------------------------------------------------------
3434
// HOOK 1: SYSTEM SERVER (android)
3535
// ------------------------------------------------------------------
36-
if (lpparam.packageName.equals("android")) {
36+
if (lpparam.packageName.equals("android")) {
3737
try {
38-
Class<?> amsClass = XposedHelpers.findClass("com.android.server.am.ActivityManagerService", lpparam.classLoader);
38+
// Hook the BatteryService class directly
39+
Class<?> batteryServiceClass = XposedHelpers.findClass("com.android.server.BatteryService", lpparam.classLoader);
3940

40-
XposedBridge.hookAllMethods(amsClass, "broadcastIntent", new XC_MethodHook() {
41+
// processValuesLocked is the method that updates battery status internally
42+
XposedBridge.hookAllMethods(batteryServiceClass, "processValuesLocked", new XC_MethodHook() {
4143
@Override
4244
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
43-
if (param.args == null || param.args.length < 2) return;
45+
// Get the BatteryProperties object (the 3rd argument in the method)
46+
Object mBatteryProps = param.args[2];
47+
48+
// Reflection to get the current level from BatteryProperties
49+
int originalLevel = (int) XposedHelpers.getIntField(mBatteryProps, "batteryLevel");
50+
int plugged = (int) XposedHelpers.getIntField(mBatteryProps, "chargerAcOnline") == 1 ? 1 : 0;
51+
if (plugged == 0) plugged = (int) XposedHelpers.getIntField(mBatteryProps, "chargerUsbOnline") == 1 ? 2 : 0;
4452

45-
Intent intent = null;
46-
if (param.args[1] instanceof Intent) {
47-
intent = (Intent) param.args[1];
48-
} else {
49-
for (Object arg : param.args) {
50-
if (arg instanceof Intent) {
51-
intent = (Intent) arg;
52-
break;
53-
}
54-
}
55-
}
53+
int remappedLevel = remapBattery(originalLevel);
54+
55+
// DEBUG LOG
56+
XposedBridge.log("BatteryRemapper-Debug: BatteryService processed. Physical:" + originalLevel + " Remapped:" + remappedLevel);
5657

57-
if (intent != null && Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {
58-
int originalLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
59-
if (originalLevel != -1) {
60-
int remappedLevel = remapBattery(originalLevel);
61-
62-
intent.putExtra(BatteryManager.EXTRA_LEVEL, remappedLevel);
58+
// Overwrite the level
59+
XposedHelpers.setIntField(mBatteryProps, "batteryLevel", remappedLevel);
6360

64-
// FEATURE: SMART HYSTERESIS BATTERY SAVER
65-
int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
66-
67-
if (remappedLevel <= 20) {
68-
isSaverTargetOn = true;
69-
} else if (remappedLevel >= 51) {
70-
isSaverTargetOn = false;
71-
}
61+
// FEATURE: TRIGGER SAVER
62+
if (remappedLevel <= 20) {
63+
isSaverTargetOn = true;
64+
} else if (remappedLevel >= 51) {
65+
isSaverTargetOn = false;
66+
}
7267

73-
if (plugged == 0) {
74-
if (isSaverTargetOn && appliedSaverState != 1) {
75-
enableBatterySaver();
76-
appliedSaverState = 1;
77-
} else if (!isSaverTargetOn && appliedSaverState != 0) {
78-
disableBatterySaver();
79-
appliedSaverState = 0;
80-
}
81-
} else {
82-
appliedSaverState = -1;
83-
}
68+
if (plugged == 0) {
69+
if (isSaverTargetOn && appliedSaverState != 1) {
70+
enableBatterySaver();
71+
appliedSaverState = 1;
72+
} else if (!isSaverTargetOn && appliedSaverState != 0) {
73+
disableBatterySaver();
74+
appliedSaverState = 0;
8475
}
76+
} else {
77+
appliedSaverState = -1;
8578
}
8679
}
8780
});
8881

89-
// ADDED BACK: Startup confirmation log for the System Server
90-
XposedBridge.log("BatteryRemapper: Android 16 System Server hooked successfully.");
91-
82+
XposedBridge.log("BatteryRemapper: BatteryService hooked successfully.");
9283
} catch (Throwable t) {
9384
XposedBridge.log("BatteryRemapper Core Hook Failure: " + t.getMessage());
9485
}

0 commit comments

Comments
 (0)