From c191397dc0f031d5b52a714dc71f98760664036e Mon Sep 17 00:00:00 2001 From: Nullptr Date: Wed, 9 Nov 2022 13:09:50 +0800 Subject: [PATCH] Add foreground keep alive option --- manager/src/main/AndroidManifest.xml | 1 + .../org/lsposed/lspatch/LSPApplication.kt | 5 ++- .../org/lsposed/lspatch/config/Configs.kt | 12 +++++++ .../lsposed/lspatch/manager/ModuleService.kt | 19 +++++++++++ .../lsposed/lspatch/ui/page/SettingsScreen.kt | 34 +++++++++++++++++++ .../lsposed/lspatch/util/LSPPackageManager.kt | 3 +- manager/src/main/res/values/strings.xml | 4 +++ .../service/RemoteApplicationService.java | 3 +- 8 files changed, 76 insertions(+), 5 deletions(-) diff --git a/manager/src/main/AndroidManifest.xml b/manager/src/main/AndroidManifest.xml index 1ba125d..9ff9eba 100644 --- a/manager/src/main/AndroidManifest.xml +++ b/manager/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" /> + R.string.settings_keep_alive to R.string.off + Configs.KeepAlive.FOREGROUND -> R.string.settings_keep_alive_foreground to R.string.settings_keep_alive_foreground_desc + } + SettingsItem( + icon = Icons.Outlined.HourglassEmpty, + title = stringResource(title), + desc = stringResource(desc) + ) + } + ) { + DropdownMenuItem( + text = { Text(stringResource(R.string.off)) }, + onClick = { Configs.keepAlive = Configs.KeepAlive.OFF } + ) + DropdownMenuItem( + text = { Text(stringResource(R.string.settings_keep_alive_foreground)) }, + onClick = { Configs.keepAlive = Configs.KeepAlive.FOREGROUND } + ) + } +} diff --git a/manager/src/main/java/org/lsposed/lspatch/util/LSPPackageManager.kt b/manager/src/main/java/org/lsposed/lspatch/util/LSPPackageManager.kt index 09efbff..7aedd3c 100644 --- a/manager/src/main/java/org/lsposed/lspatch/util/LSPPackageManager.kt +++ b/manager/src/main/java/org/lsposed/lspatch/util/LSPPackageManager.kt @@ -83,8 +83,7 @@ object LSPPackageManager { var message: String? = null withContext(Dispatchers.IO) { runCatching { - val params = PackageInstaller.SessionParams::class.java.getConstructor(Int::class.javaPrimitiveType) - .newInstance(PackageInstaller.SessionParams.MODE_FULL_INSTALL) + val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) var flags = HiddenApiBridge.PackageInstaller_SessionParams_installFlags(params) flags = flags or 0x00000004 /* PackageManager.INSTALL_ALLOW_TEST */ or 0x00000002 /* PackageManager.INSTALL_REPLACE_EXISTING */ HiddenApiBridge.PackageInstaller_SessionParams_installFlags(params, flags) diff --git a/manager/src/main/res/values/strings.xml b/manager/src/main/res/values/strings.xml index d71ae10..4571138 100644 --- a/manager/src/main/res/values/strings.xml +++ b/manager/src/main/res/values/strings.xml @@ -11,6 +11,7 @@ Shizuku service not connected Repo Logs + Off Some functions unavailable @@ -87,4 +88,7 @@ Wrong alias name Wrong alias password Detail patch logs + Keep alive + Foreground + Create a notification to keep manager alive diff --git a/patch-loader/src/main/java/org/lsposed/lspatch/service/RemoteApplicationService.java b/patch-loader/src/main/java/org/lsposed/lspatch/service/RemoteApplicationService.java index e080de6..44f4626 100644 --- a/patch-loader/src/main/java/org/lsposed/lspatch/service/RemoteApplicationService.java +++ b/patch-loader/src/main/java/org/lsposed/lspatch/service/RemoteApplicationService.java @@ -60,7 +60,6 @@ public class RemoteApplicationService implements ILSPApplicationService { } }; Log.i(TAG, "Request manager binder"); - context.startService(intent); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { context.bindService(intent, Context.BIND_AUTO_CREATE, Executors.newSingleThreadExecutor(), conn); } else { @@ -74,7 +73,7 @@ public class RemoteApplicationService implements ILSPApplicationService { var userHandle = (UserHandle) getUserMethod.invoke(context); bindServiceAsUserMethod.invoke(context, intent, conn, Context.BIND_AUTO_CREATE, handler, userHandle); } - boolean success = latch.await(5, TimeUnit.SECONDS); + boolean success = latch.await(1, TimeUnit.SECONDS); if (!success) throw new TimeoutException("Bind service timeout"); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InterruptedException | TimeoutException e) { Toast.makeText(context, "Manager died", Toast.LENGTH_SHORT).show();