diff --git a/app/src/main/java/org/lsposed/manager/ConfigManager.java b/app/src/main/java/org/lsposed/manager/ConfigManager.java index 3e68f629..99ac291b 100644 --- a/app/src/main/java/org/lsposed/manager/ConfigManager.java +++ b/app/src/main/java/org/lsposed/manager/ConfigManager.java @@ -156,6 +156,25 @@ public class ConfigManager { } } + public static boolean isAddShortcut() { + try { + return LSPManagerServiceHolder.getService().isAddShortcut(); + } catch (RemoteException e) { + Log.e(App.TAG, Log.getStackTraceString(e)); + return false; + } + } + + public static boolean setAddShortcut(boolean enabled) { + try { + LSPManagerServiceHolder.getService().setAddShortcut(enabled); + return true; + } catch (RemoteException e) { + Log.e(App.TAG, Log.getStackTraceString(e)); + return false; + } + } + public static boolean isVerboseLogEnabled() { try { return LSPManagerServiceHolder.getService().isVerboseLog(); 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 79132d17..5ea78caa 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 @@ -160,6 +160,14 @@ public class SettingsFragment extends BaseFragment { prefEnableResources.setOnPreferenceChangeListener((preference, newValue) -> ConfigManager.setResourceHookEnabled((boolean) newValue)); } + SwitchPreference prefEnableShortcut = findPreference("enable_auto_add_shortcut"); + if (prefEnableShortcut != null) { + prefEnableShortcut.setEnabled(installed); + prefEnableShortcut.setVisible(!App.isParasitic()); + prefEnableShortcut.setChecked(installed && ConfigManager.isAddShortcut()); + prefEnableShortcut.setOnPreferenceChangeListener((preference, newValue) -> ConfigManager.setAddShortcut((boolean) newValue)); + } + Preference backup = findPreference("backup"); if (backup != null) { backup.setEnabled(installed); diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 031c2e38..472c74ef 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -164,6 +164,8 @@ 翻译贡献者 参与翻译 帮助我们把 %s 翻译到你的语言 + 自动新增快捷方式 + 在非寄生的管理器中禁用后将不会新增快捷 自述文件 版本 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d531776a..b41d6dc1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -172,6 +172,8 @@ Translation contributors Participate in translation Help us translate %s into your language + Automatically add a shortcut + No new shortcuts will be added when disabled in the non-parasitic manager Readme diff --git a/app/src/main/res/xml-v29/prefs.xml b/app/src/main/res/xml-v29/prefs.xml index f46537d2..cdcaac18 100644 --- a/app/src/main/res/xml-v29/prefs.xml +++ b/app/src/main/res/xml-v29/prefs.xml @@ -35,8 +35,8 @@ android:defaultValue="SYSTEM" android:entries="@array/language" android:icon="@drawable/ic_baseline_translate_24" - android:summary="%s" android:key="language" + android:summary="%s" android:title="@string/settings_language" /> + + + + createOrUpdateShortcutInternal(force)); + workerHandler.post(() -> createOrUpdateShortcutInternal(force, true)); } - private synchronized static void createOrUpdateShortcutInternal(boolean force) { + public static void createOrUpdateShortcut(boolean force, boolean shouldCreate) { + workerHandler.post(() -> createOrUpdateShortcutInternal(force, shouldCreate)); + } + + private synchronized static void createOrUpdateShortcutInternal(boolean force, boolean shouldCreate) { try { - if (!force && ConfigManager.getInstance().isManagerInstalled()) { - Log.d(TAG, "Manager has installed, skip adding shortcut"); - return; - } while (!UserService.isUserUnlocked(0)) { Log.d(TAG, "user is not yet unlocked, waiting for 1s..."); Thread.sleep(1000); @@ -316,9 +314,18 @@ public class LSPManagerService extends ILSPManagerService.Stub { return; } } - - sm.requestPinShortcut(shortcut, null); - Log.d(TAG, "done add shortcut"); + var configManager = ConfigManager.getInstance(); + if (!force && configManager.isManagerInstalled()) { + Log.d(TAG, "Manager has installed, skip adding shortcut"); + return; + } + // Only existing shortcuts are updated when system settings + // are changed and no new shortcuts are requested + if (!force && !shouldCreate) return; + if (configManager.isAddShortcut()) { + sm.requestPinShortcut(shortcut, null); + Log.d(TAG, "done add shortcut"); + } } catch (Throwable e) { Log.e(TAG, "add shortcut", e); } @@ -544,6 +551,17 @@ public class LSPManagerService extends ILSPManagerService.Stub { ConfigManager.getInstance().setResourceHook(enabled); } + @Override + public boolean isAddShortcut() { + return ConfigManager.getInstance().isAddShortcut(); + } + + @Override + public void setAddShortcut(boolean enabled) { + ConfigManager.getInstance().setAddShortcut(enabled); + if (enabled) createOrUpdateShortcut(true); + } + @Override public boolean isVerboseLog() { return ConfigManager.getInstance().verboseLog(); @@ -683,5 +701,6 @@ public class LSPManagerService extends ILSPManagerService.Stub { @Override public void createShortcut() { createOrUpdateShortcut(true); + setAddShortcut(true); } } diff --git a/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java b/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java index 35d9f1f7..b973cbe9 100644 --- a/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java +++ b/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java @@ -180,7 +180,7 @@ public class LSPosedService extends ILSPosedService.Stub { synchronized public void dispatchConfigurationChanged(Intent intent) { try { ConfigFileManager.reloadConfiguration(); - LSPManagerService.createOrUpdateShortcut(false); + LSPManagerService.createOrUpdateShortcut(false, false); } catch (Throwable e) { Log.e(TAG, "dispatch configuration changed", e); } diff --git a/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl b/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl index cba181f0..c24d5c41 100644 --- a/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl +++ b/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl @@ -67,4 +67,8 @@ interface ILSPManagerService { void restartFor(in Intent intent) = 35; void createShortcut() = 36; + + boolean isAddShortcut() = 37; + + void setAddShortcut(boolean enabled) = 38; }