Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ public void onRepoLoaded() {
modules.forEach((k, v) -> {
if (!processedModules.contains(k.first)) {
var ver = repoLoader.getModuleLatestVersion(k.first);
if (ver != null && ver.upgradable(v.versionCode, v.versionName)) {
if (!ModuleUtil.isUpdateIgnored(k.first) && ver != null && ver.upgradable(v.versionCode, v.versionName)) {
++count[0];
}
processedModules.add(k.first);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,11 @@ public boolean onContextItemSelected(@NonNull MenuItem item) {
new Uri.Builder().scheme("lsposed").authority("repo").appendQueryParameter("modulePackageName", selectedModule.packageName).build(),
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());
return true;
} else if (itemId == R.id.menu_ignore_update) {
boolean ignored = ModuleUtil.isUpdateIgnored(selectedModule.packageName);
ModuleUtil.setUpdateIgnored(selectedModule.packageName, !ignored);
forEachAdaptor(ModuleAdapter::refresh);
return true;
} else if (itemId == R.id.menu_compile_speed) {
CompileDialogFragment.speed(getChildFragmentManager(), selectedModule.pkg.applicationInfo);
}
Expand Down Expand Up @@ -583,7 +588,7 @@ public void onLoadCleared(@Nullable Drawable placeholder) {
sb.setSpan(foregroundColorSpan, sb.length() - warningText.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
var ver = repoLoader.getModuleLatestVersion(item.packageName);
if (ver != null && ver.upgradable(item.versionCode, item.versionName)) {
if (!ModuleUtil.isUpdateIgnored(item.packageName) && ver != null && ver.upgradable(item.versionCode, item.versionName)) {
if (warningText != null) sb.append("\n");
String recommended = getString(R.string.update_available, ver.versionName);
sb.append(recommended);
Expand Down Expand Up @@ -626,6 +631,13 @@ public void onLoadCleared(@Nullable Drawable placeholder) {
}
if (repoLoader.getOnlineModule(item.packageName) == null) {
menu.removeItem(R.id.menu_repo);
menu.removeItem(R.id.menu_ignore_update);
} else {
var ignoreItem = menu.findItem(R.id.menu_ignore_update);
if (ignoreItem != null) {
boolean ignored = ModuleUtil.isUpdateIgnored(item.packageName);
ignoreItem.setTitle(ignored ? R.string.allow_updates : R.string.ignore_updates);
}
}
if (item.userId == 0) {
var users = ConfigManager.getUsers();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ private void updateRepoSummary() {
modules.forEach((k, v) -> {
if (!processedModules.contains(k.first)) {
var ver = repoLoader.getModuleLatestVersion(k.first);
if (ver != null && ver.upgradable(v.versionCode, v.versionName)) {
if (!ModuleUtil.isUpdateIgnored(k.first) && ver != null && ver.upgradable(v.versionCode, v.versionName)) {
++count[0];
}
processedModules.add(k.first);
Expand Down Expand Up @@ -287,6 +287,9 @@ public RepoAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int
}

RepoLoader.ModuleVersion getUpgradableVer(OnlineModule module) {
if (ModuleUtil.isUpdateIgnored(module.getName())) {
return null;
}
ModuleUtil.InstalledModule installedModule = moduleUtil.getModule(module.getName());
if (installedModule != null) {
var ver = repoLoader.getModuleLatestVersion(installedModule.packageName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,18 @@
import org.lsposed.manager.databinding.FragmentSettingsBinding;
import org.lsposed.manager.repo.RepoLoader;
import org.lsposed.manager.ui.activity.MainActivity;
import org.lsposed.manager.ui.dialog.BlurBehindDialogBuilder;
import org.lsposed.manager.util.BackupUtils;
import org.lsposed.manager.util.CloudflareDNS;
import org.lsposed.manager.util.LangList;
import org.lsposed.manager.util.ModuleUtil;
import org.lsposed.manager.util.NavUtil;
import org.lsposed.manager.util.ShortcutUtil;
import org.lsposed.manager.util.ThemeUtil;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Locale;

import rikka.core.util.ResourceUtils;
Expand Down Expand Up @@ -146,6 +149,66 @@ private boolean setNotificationPreferenceEnabled(MaterialSwitchPreference notifi
return notificationEnabled;
}

private void updateIgnoredUpdatesSummary(@Nullable Preference ignoredUpdatesPref) {
if (ignoredUpdatesPref == null) return;
int count = ModuleUtil.getIgnoredUpdates().size();
if (count == 0) {
ignoredUpdatesPref.setSummary(R.string.settings_ignored_updates_summary_empty);
} else {
ignoredUpdatesPref.setSummary(getString(R.string.settings_ignored_updates_summary, count));
}
}

private void showIgnoredUpdatesDialog(@NonNull Preference ignoredUpdatesPref) {
var ignored = new ArrayList<>(ModuleUtil.getIgnoredUpdates());
if (ignored.isEmpty()) {
new BlurBehindDialogBuilder(requireActivity(), R.style.ThemeOverlay_MaterialAlertDialog_Centered_FullWidthButtons)
.setTitle(R.string.settings_ignored_updates_title)
.setMessage(R.string.settings_ignored_updates_empty)
.setPositiveButton(android.R.string.ok, null)
.show();
return;
}

var modules = ModuleUtil.getInstance().getModules();
var labels = new ArrayList<CharSequence>(ignored.size());
for (var pkg : ignored) {
String label = pkg;
if (modules != null) {
for (var module : modules.values()) {
if (pkg.equals(module.packageName)) {
label = module.getAppName() + " (" + pkg + ")";
break;
}
}
}
if (label.equals(pkg)) {
label = pkg + " (" + getString(R.string.not_installed) + ")";
}
labels.add(label);
}
boolean[] checked = new boolean[ignored.size()];
for (int i = 0; i < checked.length; i++) {
checked[i] = true;
}

new BlurBehindDialogBuilder(requireActivity(), R.style.ThemeOverlay_MaterialAlertDialog_Centered_FullWidthButtons)
.setTitle(R.string.settings_ignored_updates_title)
.setMultiChoiceItems(labels.toArray(new CharSequence[0]), checked, (dialog, which, isChecked) -> checked[which] = isChecked)
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
var updated = new HashSet<String>();
for (int i = 0; i < checked.length; i++) {
if (checked[i]) {
updated.add(ignored.get(i));
}
}
ModuleUtil.setIgnoredUpdates(updated);
updateIgnoredUpdatesSummary(ignoredUpdatesPref);
})
.setNegativeButton(android.R.string.cancel, null)
.show();
}

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
final String SYSTEM = "SYSTEM";
Expand Down Expand Up @@ -379,6 +442,15 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
return true;
});
}

Preference ignoredUpdates = findPreference("ignored_updates");
if (ignoredUpdates != null) {
updateIgnoredUpdatesSummary(ignoredUpdates);
ignoredUpdates.setOnPreferenceClickListener(preference -> {
showIgnoredUpdatesDialog(ignoredUpdates);
return true;
});
}
}

@NonNull
Expand Down
48 changes: 48 additions & 0 deletions app/src/main/java/org/lsposed/manager/util/ModuleUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
public final class ModuleUtil {
// xposedminversion below this
public static int MIN_MODULE_VERSION = 2; // reject modules with
private static final String PREF_IGNORED_UPDATES = "ignored_module_updates";
private static ModuleUtil instance = null;
private final PackageManager pm;
private final Set<ModuleListener> listeners = ConcurrentHashMap.newKeySet();
Expand Down Expand Up @@ -85,6 +86,53 @@ public static synchronized ModuleUtil getInstance() {
return instance;
}

public static boolean isUpdateIgnored(@Nullable String packageName) {
if (packageName == null) return false;
var ignored = App.getPreferences().getStringSet(PREF_IGNORED_UPDATES, Collections.emptySet());
return ignored != null && ignored.contains(packageName);
}

@NonNull
public static Set<String> getIgnoredUpdates() {
var ignored = App.getPreferences().getStringSet(PREF_IGNORED_UPDATES, Collections.emptySet());
if (ignored == null || ignored.isEmpty()) {
return Collections.emptySet();
}
return new HashSet<>(ignored);
}

public static void setIgnoredUpdates(@Nullable Set<String> packageNames) {
var pref = App.getPreferences();
if (packageNames == null || packageNames.isEmpty()) {
pref.edit().remove(PREF_IGNORED_UPDATES).apply();
notifyIgnoredUpdatesChanged();
return;
}
pref.edit().putStringSet(PREF_IGNORED_UPDATES, new HashSet<>(packageNames)).apply();
notifyIgnoredUpdatesChanged();
}

public static void setUpdateIgnored(@Nullable String packageName, boolean ignored) {
if (packageName == null) return;
var pref = App.getPreferences();
var current = pref.getStringSet(PREF_IGNORED_UPDATES, Collections.emptySet());
var updated = new HashSet<>(current != null ? current : Collections.emptySet());
if (ignored) {
updated.add(packageName);
} else {
updated.remove(packageName);
}
pref.edit().putStringSet(PREF_IGNORED_UPDATES, updated).apply();
notifyIgnoredUpdatesChanged();
}

private static void notifyIgnoredUpdatesChanged() {
ModuleUtil local = instance;
if (local != null) {
local.listeners.forEach(ModuleListener::onModulesReloaded);
}
}

public static int extractIntPart(String str) {
int result = 0, length = str.length();
for (int offset = 0; offset < length; offset++) {
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/menu/context_menu_modules.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@
<item
android:id="@+id/menu_repo"
android:title="@string/view_in_repo" />
<item
android:id="@+id/menu_ignore_update"
android:title="@string/ignore_updates" />
<item
android:id="@+id/menu_app_info"
android:title="@string/module_app_info" />
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/res/values-zh-rCN/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,10 @@ JingMatrix</string>
<string name="settings_translation_summary">帮助我们把 %s 翻译到你的语言</string>
<string name="settings_create_shortcut_summary">创建一个能打开寄生管理器的快捷方式</string>
<string name="settings_shortcut_pinned_hint">已创建快捷方式</string>
<string name="settings_ignored_updates_title">已忽略的模块更新</string>
<string name="settings_ignored_updates_summary">已忽略模块:%1$d</string>
<string name="settings_ignored_updates_summary_empty">没有忽略的模块</string>
<string name="settings_ignored_updates_empty">没有忽略的模块。</string>
<string name="settings_unsupported_pin_shortcut_summary">当前默认桌面不支持固定快捷方式</string>
<string name="settings_enable_status_notification">状态通知</string>
<string name="settings_enable_status_notification_summary">显示一个通知以打开寄生管理器</string>
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/res/values-zh-rHK/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,10 @@
<string name="settings_translation_contributors">譯者</string>
<string name="settings_translation">參與翻譯</string>
<string name="settings_translation_summary">幫助我們翻譯 %s 到您的語言</string>
<string name="settings_ignored_updates_title">已忽略的模組更新</string>
<string name="settings_ignored_updates_summary">已忽略模組:%1$d</string>
<string name="settings_ignored_updates_summary_empty">沒有忽略的模組</string>
<string name="settings_ignored_updates_empty">沒有忽略的模組。</string>
<string name="settings_create_shortcut_summary">建立可以開啟寄生管理員的捷徑</string>
<string name="settings_shortcut_pinned_hint">捷徑已釘選</string>
<string name="settings_unsupported_pin_shortcut_summary">目前的預設啟動器不支援釘選捷徑</string>
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/res/values-zh-rTW/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,10 @@
<string name="settings_translation_contributors">譯者</string>
<string name="settings_translation">參與翻譯</string>
<string name="settings_translation_summary">幫助我們翻譯 %s 到您的語言</string>
<string name="settings_ignored_updates_title">已忽略的模組更新</string>
<string name="settings_ignored_updates_summary">已忽略模組:%1$d</string>
<string name="settings_ignored_updates_summary_empty">沒有忽略的模組</string>
<string name="settings_ignored_updates_empty">沒有忽略的模組。</string>
<string name="settings_create_shortcut_summary">建立可以開啟寄生管理員的捷徑</string>
<string name="settings_shortcut_pinned_hint">捷徑已釘選</string>
<string name="settings_unsupported_pin_shortcut_summary">目前的預設啟動器不支援釘選捷徑</string>
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,8 @@
<string name="module_is_not_activated_yet">Xposed module is not activated yet</string>
<string name="requested_by_module">Recommended</string>
<string name="update_available">Update available: %1$s</string>
<string name="ignore_updates">Ignore updates</string>
<string name="allow_updates">Allow updates</string>
<string name="module_disabled_no_selection">Module %s has been disabled since no app selected.</string>
<string name="android_framework">System Framework</string>
<string name="menu_backup_and_restore">Backup</string>
Expand Down Expand Up @@ -207,6 +209,10 @@
<string name="update_channel_stable">Stable</string>
<string name="update_channel_bate">Beta</string>
<string name="update_channel_nightly">Nightly build</string>
<string name="settings_ignored_updates_title">Ignored module updates</string>
<string name="settings_ignored_updates_summary">Ignored modules: %1$d</string>
<string name="settings_ignored_updates_summary_empty">No ignored modules</string>
<string name="settings_ignored_updates_empty">There are no ignored modules.</string>
<string name="settings_xposed_api_call_protection">Xposed API call protection</string>
<string name="settings_xposed_api_call_protection_summary">Block dynamically loaded module code to use Xposed API, this may break some modules but benefit security</string>
<!-- Module Repo -->
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/xml/prefs.xml
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,11 @@
android:key="update_channel"
android:summary="%s"
android:title="@string/settings_update_channel" />
<Preference
android:icon="@drawable/ic_round_update_24"
android:key="ignored_updates"
android:summary="@string/settings_ignored_updates_summary_empty"
android:title="@string/settings_ignored_updates_title" />
</PreferenceCategory>

<PreferenceCategory android:title="@string/settings_backup_and_restore">
Expand Down