@@ -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