Skip to content
This repository was archived by the owner on Jul 6, 2026. It is now read-only.

Commit 0fee514

Browse files
committed
PR JingMatrix#499: 忽略模块更新功能
添加忽略指定模块更新的功能,可在模块上下文菜单中忽略/取消忽略。 设置页面新增被忽略模块列表管理。 来源: AlliotTech/Vector (JingMatrix#499)
1 parent 6b7e490 commit 0fee514

11 files changed

Lines changed: 164 additions & 3 deletions

File tree

app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ public void onRepoLoaded() {
203203
modules.forEach((k, v) -> {
204204
if (!processedModules.contains(k.first)) {
205205
var ver = repoLoader.getModuleLatestVersion(k.first);
206-
if (ver != null && ver.upgradable(v.versionCode, v.versionName)) {
206+
if (!ModuleUtil.isUpdateIgnored(k.first) && ver != null && ver.upgradable(v.versionCode, v.versionName)) {
207207
++count[0];
208208
}
209209
processedModules.add(k.first);

app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,11 @@ public boolean onContextItemSelected(@NonNull MenuItem item) {
365365
new Uri.Builder().scheme("lsposed").authority("repo").appendQueryParameter("modulePackageName", selectedModule.packageName).build(),
366366
new NavOptions.Builder().setEnterAnim(R.anim.fragment_enter).setExitAnim(R.anim.fragment_exit).setPopEnterAnim(R.anim.fragment_enter_pop).setPopExitAnim(R.anim.fragment_exit_pop).setLaunchSingleTop(true).setPopUpTo(getNavController().getGraph().getStartDestinationId(), false, true).build());
367367
return true;
368+
} else if (itemId == R.id.menu_ignore_update) {
369+
boolean ignored = ModuleUtil.isUpdateIgnored(selectedModule.packageName);
370+
ModuleUtil.setUpdateIgnored(selectedModule.packageName, !ignored);
371+
forEachAdaptor(ModuleAdapter::refresh);
372+
return true;
368373
} else if (itemId == R.id.menu_compile_speed) {
369374
CompileDialogFragment.speed(getChildFragmentManager(), selectedModule.pkg.applicationInfo);
370375
}
@@ -606,7 +611,7 @@ public void onLoadCleared(@Nullable Drawable placeholder) {
606611
sb.setSpan(foregroundColorSpan, sb.length() - warningText.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
607612
}
608613
var ver = repoLoader.getModuleLatestVersion(item.packageName);
609-
if (ver != null && ver.upgradable(item.versionCode, item.versionName)) {
614+
if (!ModuleUtil.isUpdateIgnored(item.packageName) && ver != null && ver.upgradable(item.versionCode, item.versionName)) {
610615
if (warningText != null) sb.append("\n");
611616
String recommended = getString(R.string.update_available, ver.versionName);
612617
sb.append(recommended);
@@ -649,6 +654,13 @@ public void onLoadCleared(@Nullable Drawable placeholder) {
649654
}
650655
if (repoLoader.getOnlineModule(item.packageName) == null) {
651656
menu.removeItem(R.id.menu_repo);
657+
menu.removeItem(R.id.menu_ignore_update);
658+
} else {
659+
var ignoreItem = menu.findItem(R.id.menu_ignore_update);
660+
if (ignoreItem != null) {
661+
boolean ignored = ModuleUtil.isUpdateIgnored(item.packageName);
662+
ignoreItem.setTitle(ignored ? R.string.allow_updates : R.string.ignore_updates);
663+
}
652664
}
653665
if (item.userId == 0) {
654666
var users = ConfigManager.getUsers();

app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ private void updateRepoSummary() {
150150
modules.forEach((k, v) -> {
151151
if (!processedModules.contains(k.first)) {
152152
var ver = repoLoader.getModuleLatestVersion(k.first);
153-
if (ver != null && ver.upgradable(v.versionCode, v.versionName)) {
153+
if (!ModuleUtil.isUpdateIgnored(k.first) && ver != null && ver.upgradable(v.versionCode, v.versionName)) {
154154
++count[0];
155155
}
156156
processedModules.add(k.first);
@@ -287,6 +287,9 @@ public RepoAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int
287287
}
288288

289289
RepoLoader.ModuleVersion getUpgradableVer(OnlineModule module) {
290+
if (ModuleUtil.isUpdateIgnored(module.getName())) {
291+
return null;
292+
}
290293
ModuleUtil.InstalledModule installedModule = moduleUtil.getModule(module.getName());
291294
if (installedModule != null) {
292295
var ver = repoLoader.getModuleLatestVersion(installedModule.packageName);

app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,18 @@
4848
import org.lsposed.manager.databinding.FragmentSettingsBinding;
4949
import org.lsposed.manager.repo.RepoLoader;
5050
import org.lsposed.manager.ui.activity.MainActivity;
51+
import org.lsposed.manager.ui.dialog.BlurBehindDialogBuilder;
5152
import org.lsposed.manager.util.BackupUtils;
5253
import org.lsposed.manager.util.CloudflareDNS;
5354
import org.lsposed.manager.util.LangList;
55+
import org.lsposed.manager.util.ModuleUtil;
5456
import org.lsposed.manager.util.NavUtil;
5557
import org.lsposed.manager.util.ShortcutUtil;
5658
import org.lsposed.manager.util.ThemeUtil;
5759

5860
import java.time.LocalDateTime;
5961
import java.util.ArrayList;
62+
import java.util.HashSet;
6063
import java.util.Locale;
6164

6265
import rikka.core.util.ResourceUtils;
@@ -134,6 +137,66 @@ public void onDetach() {
134137
parentFragment = null;
135138
}
136139

140+
private void updateIgnoredUpdatesSummary(@Nullable Preference ignoredUpdatesPref) {
141+
if (ignoredUpdatesPref == null) return;
142+
int count = ModuleUtil.getIgnoredUpdates().size();
143+
if (count == 0) {
144+
ignoredUpdatesPref.setSummary(R.string.settings_ignored_updates_summary_empty);
145+
} else {
146+
ignoredUpdatesPref.setSummary(getString(R.string.settings_ignored_updates_summary, count));
147+
}
148+
}
149+
150+
private void showIgnoredUpdatesDialog(@NonNull Preference ignoredUpdatesPref) {
151+
var ignored = new ArrayList<>(ModuleUtil.getIgnoredUpdates());
152+
if (ignored.isEmpty()) {
153+
new BlurBehindDialogBuilder(requireActivity(), R.style.ThemeOverlay_MaterialAlertDialog_Centered_FullWidthButtons)
154+
.setTitle(R.string.settings_ignored_updates_title)
155+
.setMessage(R.string.settings_ignored_updates_empty)
156+
.setPositiveButton(android.R.string.ok, null)
157+
.show();
158+
return;
159+
}
160+
161+
var modules = ModuleUtil.getInstance().getModules();
162+
var labels = new ArrayList<CharSequence>(ignored.size());
163+
for (var pkg : ignored) {
164+
String label = pkg;
165+
if (modules != null) {
166+
for (var module : modules.values()) {
167+
if (pkg.equals(module.packageName)) {
168+
label = module.getAppName() + " (" + pkg + ")";
169+
break;
170+
}
171+
}
172+
}
173+
if (label.equals(pkg)) {
174+
label = pkg + " (" + getString(R.string.not_installed) + ")";
175+
}
176+
labels.add(label);
177+
}
178+
boolean[] checked = new boolean[ignored.size()];
179+
for (int i = 0; i < checked.length; i++) {
180+
checked[i] = true;
181+
}
182+
183+
new BlurBehindDialogBuilder(requireActivity(), R.style.ThemeOverlay_MaterialAlertDialog_Centered_FullWidthButtons)
184+
.setTitle(R.string.settings_ignored_updates_title)
185+
.setMultiChoiceItems(labels.toArray(new CharSequence[0]), checked, (dialog, which, isChecked) -> checked[which] = isChecked)
186+
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
187+
var updated = new HashSet<String>();
188+
for (int i = 0; i < checked.length; i++) {
189+
if (checked[i]) {
190+
updated.add(ignored.get(i));
191+
}
192+
}
193+
ModuleUtil.setIgnoredUpdates(updated);
194+
updateIgnoredUpdatesSummary(ignoredUpdatesPref);
195+
})
196+
.setNegativeButton(android.R.string.cancel, null)
197+
.show();
198+
}
199+
137200
@Override
138201
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
139202
final String SYSTEM = "SYSTEM";
@@ -346,6 +409,15 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
346409
return true;
347410
});
348411
}
412+
413+
Preference ignoredUpdates = findPreference("ignored_updates");
414+
if (ignoredUpdates != null) {
415+
updateIgnoredUpdatesSummary(ignoredUpdates);
416+
ignoredUpdates.setOnPreferenceClickListener(preference -> {
417+
showIgnoredUpdatesDialog(ignoredUpdates);
418+
return true;
419+
});
420+
}
349421
}
350422

351423
@NonNull

app/src/main/java/org/lsposed/manager/util/ModuleUtil.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
public final class ModuleUtil {
5858
// xposedminversion below this
5959
public static int MIN_MODULE_VERSION = 2; // reject modules with
60+
private static final String PREF_IGNORED_UPDATES = "ignored_module_updates";
6061
private static ModuleUtil instance = null;
6162
private final PackageManager pm;
6263
private final Set<ModuleListener> listeners = ConcurrentHashMap.newKeySet();
@@ -85,6 +86,53 @@ public static synchronized ModuleUtil getInstance() {
8586
return instance;
8687
}
8788

89+
public static boolean isUpdateIgnored(@Nullable String packageName) {
90+
if (packageName == null) return false;
91+
var ignored = App.getPreferences().getStringSet(PREF_IGNORED_UPDATES, Collections.emptySet());
92+
return ignored != null && ignored.contains(packageName);
93+
}
94+
95+
@NonNull
96+
public static Set<String> getIgnoredUpdates() {
97+
var ignored = App.getPreferences().getStringSet(PREF_IGNORED_UPDATES, Collections.emptySet());
98+
if (ignored == null || ignored.isEmpty()) {
99+
return Collections.emptySet();
100+
}
101+
return new HashSet<>(ignored);
102+
}
103+
104+
public static void setIgnoredUpdates(@Nullable Set<String> packageNames) {
105+
var pref = App.getPreferences();
106+
if (packageNames == null || packageNames.isEmpty()) {
107+
pref.edit().remove(PREF_IGNORED_UPDATES).apply();
108+
notifyIgnoredUpdatesChanged();
109+
return;
110+
}
111+
pref.edit().putStringSet(PREF_IGNORED_UPDATES, new HashSet<>(packageNames)).apply();
112+
notifyIgnoredUpdatesChanged();
113+
}
114+
115+
public static void setUpdateIgnored(@Nullable String packageName, boolean ignored) {
116+
if (packageName == null) return;
117+
var pref = App.getPreferences();
118+
var current = pref.getStringSet(PREF_IGNORED_UPDATES, Collections.emptySet());
119+
var updated = new HashSet<>(current != null ? current : Collections.emptySet());
120+
if (ignored) {
121+
updated.add(packageName);
122+
} else {
123+
updated.remove(packageName);
124+
}
125+
pref.edit().putStringSet(PREF_IGNORED_UPDATES, updated).apply();
126+
notifyIgnoredUpdatesChanged();
127+
}
128+
129+
private static void notifyIgnoredUpdatesChanged() {
130+
ModuleUtil local = instance;
131+
if (local != null) {
132+
local.listeners.forEach(ModuleListener::onModulesReloaded);
133+
}
134+
}
135+
88136
public static int extractIntPart(String str) {
89137
int result = 0, length = str.length();
90138
for (int offset = 0; offset < length; offset++) {

app/src/main/res/menu/context_menu_modules.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
<item
3030
android:id="@+id/menu_repo"
3131
android:title="@string/view_in_repo" />
32+
<item
33+
android:id="@+id/menu_ignore_update"
34+
android:title="@string/ignore_updates" />
3235
<item
3336
android:id="@+id/menu_app_info"
3437
android:title="@string/module_app_info" />

app/src/main/res/values-zh-rCN/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,10 @@ JingMatrix</string>
193193
<string name="settings_translation_summary">帮助我们把 %s 翻译到你的语言</string>
194194
<string name="settings_create_shortcut_summary">创建一个能打开寄生管理器的快捷方式</string>
195195
<string name="settings_shortcut_pinned_hint">已创建快捷方式</string>
196+
<string name="settings_ignored_updates_title">已忽略的模块更新</string>
197+
<string name="settings_ignored_updates_summary">已忽略模块:%1$d</string>
198+
<string name="settings_ignored_updates_summary_empty">没有忽略的模块</string>
199+
<string name="settings_ignored_updates_empty">没有忽略的模块。</string>
196200
<string name="settings_unsupported_pin_shortcut_summary">当前默认桌面不支持固定快捷方式</string>
197201
<string name="settings_enable_status_notification">状态通知</string>
198202
<string name="settings_enable_status_notification_summary">显示一个通知以打开寄生管理器</string>

app/src/main/res/values-zh-rHK/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,10 @@
190190
<string name="settings_translation_contributors">譯者</string>
191191
<string name="settings_translation">參與翻譯</string>
192192
<string name="settings_translation_summary">幫助我們翻譯 %s 到您的語言</string>
193+
<string name="settings_ignored_updates_title">已忽略的模組更新</string>
194+
<string name="settings_ignored_updates_summary">已忽略模組:%1$d</string>
195+
<string name="settings_ignored_updates_summary_empty">沒有忽略的模組</string>
196+
<string name="settings_ignored_updates_empty">沒有忽略的模組。</string>
193197
<string name="settings_create_shortcut_summary">建立可以開啟寄生管理員的捷徑</string>
194198
<string name="settings_shortcut_pinned_hint">捷徑已釘選</string>
195199
<string name="settings_unsupported_pin_shortcut_summary">目前的預設啟動器不支援釘選捷徑</string>

app/src/main/res/values-zh-rTW/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,10 @@
186186
<string name="settings_translation_contributors">譯者</string>
187187
<string name="settings_translation">參與翻譯</string>
188188
<string name="settings_translation_summary">幫助我們翻譯 %s 到您的語言</string>
189+
<string name="settings_ignored_updates_title">已忽略的模組更新</string>
190+
<string name="settings_ignored_updates_summary">已忽略模組:%1$d</string>
191+
<string name="settings_ignored_updates_summary_empty">沒有忽略的模組</string>
192+
<string name="settings_ignored_updates_empty">沒有忽略的模組。</string>
189193
<string name="settings_create_shortcut_summary">建立可以開啟寄生管理員的捷徑</string>
190194
<string name="settings_shortcut_pinned_hint">捷徑已釘選</string>
191195
<string name="settings_unsupported_pin_shortcut_summary">目前的預設啟動器不支援釘選捷徑</string>

app/src/main/res/values/strings.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@
150150
<string name="module_is_not_activated_yet">Xposed module is not activated yet</string>
151151
<string name="requested_by_module">Recommended</string>
152152
<string name="update_available">Update available: %1$s</string>
153+
<string name="ignore_updates">Ignore updates</string>
154+
<string name="allow_updates">Allow updates</string>
153155
<string name="module_disabled_no_selection">Module %s has been disabled since no app selected.</string>
154156
<string name="android_framework">System Framework</string>
155157
<string name="menu_backup_and_restore">Backup</string>
@@ -206,6 +208,10 @@
206208
<string name="update_channel_nightly">Nightly build</string>
207209
<!-- Module Repo -->
208210
<string name="module_readme">Readme</string>
211+
<string name="settings_ignored_updates_title">Ignored module updates</string>
212+
<string name="settings_ignored_updates_summary">Ignored modules: %1$d</string>
213+
<string name="settings_ignored_updates_summary_empty">No ignored modules</string>
214+
<string name="settings_ignored_updates_empty">There are no ignored modules.</string>
209215
<string name="module_releases">Releases</string>
210216
<string name="module_information">Info</string>
211217
<string name="module_information_homepage">Homepage</string>

0 commit comments

Comments
 (0)