diff --git a/app/src/main/java/org/lsposed/manager/ConfigManager.java b/app/src/main/java/org/lsposed/manager/ConfigManager.java index 2034ab52..35e48bfd 100644 --- a/app/src/main/java/org/lsposed/manager/ConfigManager.java +++ b/app/src/main/java/org/lsposed/manager/ConfigManager.java @@ -211,9 +211,9 @@ public class ConfigManager { } } - public static boolean reboot(boolean shutdown) { + public static boolean reboot() { try { - LSPManagerServiceHolder.getService().reboot(shutdown); + LSPManagerServiceHolder.getService().reboot(); return true; } catch (RemoteException e) { Log.e(App.TAG, Log.getStackTraceString(e)); diff --git a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java index b9c65940..d3b739cd 100644 --- a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java +++ b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java @@ -326,7 +326,7 @@ public class ScopeAdapter extends EmptyStateRecyclerView.EmptyStateAdapter ConfigManager.reboot(false)); + fragment.showHint(R.string.reboot_required, true, R.string.reboot, v -> ConfigManager.reboot()); } else if (denyList.contains(appInfo.packageName)) { fragment.showHint(activity.getString(R.string.deny_list, appInfo.label), true); } diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java index a222be42..89c04316 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java @@ -153,7 +153,7 @@ public class SettingsFragment extends BaseFragment { prefDexObfuscate.setEnabled(installed); prefDexObfuscate.setChecked(!installed || ConfigManager.isDexObfuscateEnabled()); prefDexObfuscate.setOnPreferenceChangeListener((preference, newValue) -> { - parentFragment.showHint(R.string.reboot_required, true, R.string.reboot, v -> ConfigManager.reboot(false)); + parentFragment.showHint(R.string.reboot_required, true, R.string.reboot, v -> ConfigManager.reboot()); return ConfigManager.setDexObfuscateEnabled((boolean) newValue); }); } diff --git a/daemon/src/main/java/org/lsposed/lspd/service/LSPManagerService.java b/daemon/src/main/java/org/lsposed/lspd/service/LSPManagerService.java index 888ac647..5345b138 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/LSPManagerService.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/LSPManagerService.java @@ -446,9 +446,8 @@ public class LSPManagerService extends ILSPManagerService.Stub { } @Override - public void reboot(boolean shutdown) { - var value = shutdown ? "shutdown" : "reboot"; - SystemProperties.set("sys.powerctl", value); + public void reboot() throws RemoteException { + PowerService.reboot(false, null, false); } @Override @@ -585,7 +584,7 @@ public class LSPManagerService extends ILSPManagerService.Stub { if (exit == 0) { fdw.write("- Reboot after 5s\n".getBytes()); Thread.sleep(5000); - reboot(false); + reboot(); } else { var s = "! Flash failed, exit with " + exit + "\n"; fdw.write(s.getBytes()); @@ -594,7 +593,7 @@ public class LSPManagerService extends ILSPManagerService.Stub { proc.destroy(); fdw.write("! Timeout, abort\n".getBytes()); } - } catch (IOException | InterruptedException e) { + } catch (IOException | InterruptedException | RemoteException e) { Log.e(TAG, "flashZip: ", e); } } diff --git a/daemon/src/main/java/org/lsposed/lspd/service/PowerService.java b/daemon/src/main/java/org/lsposed/lspd/service/PowerService.java new file mode 100644 index 00000000..7ce1ac5b --- /dev/null +++ b/daemon/src/main/java/org/lsposed/lspd/service/PowerService.java @@ -0,0 +1,63 @@ +/* + * + */ + +package org.lsposed.lspd.service; + +import static android.content.Context.POWER_SERVICE; +import static org.lsposed.lspd.service.ServiceManager.TAG; + +import android.os.IBinder; +import android.os.IPowerManager; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.util.Log; + +public class PowerService { + private static IPowerManager pm = null; + private static IBinder binder = null; + private static final IBinder.DeathRecipient recipient = new IBinder.DeathRecipient() { + @Override + public void binderDied() { + Log.w(TAG, "PowerManager is dead"); + binder.unlinkToDeath(this, 0); + binder = null; + pm = null; + } + }; + + private static IPowerManager getPowerManager() { + if (binder == null || pm == null) { + binder = ServiceManager.getService(POWER_SERVICE); + if (binder == null) return null; + try { + binder.linkToDeath(recipient, 0); + } catch (RemoteException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } + pm = IPowerManager.Stub.asInterface(binder); + } + return pm; + } + + public static void reboot(boolean confirm, String reason, boolean wait) throws RemoteException { + IPowerManager pm = getPowerManager(); + if (pm == null) return; + pm.reboot(confirm, reason, wait); + } +} diff --git a/services/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl b/services/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl index 75d2017d..ca1c0488 100644 --- a/services/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl +++ b/services/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl @@ -46,7 +46,7 @@ interface ILSPManagerService { void forceStopPackage(String packageName, int userId) = 23; - void reboot(boolean shutdown) = 24; + void reboot() = 24; boolean uninstallPackage(String packageName, int userId) = 25;