diff --git a/app/src/main/java/org/lsposed/manager/repo/RepoLoader.java b/app/src/main/java/org/lsposed/manager/repo/RepoLoader.java index 59b8cc4a..49ec1b36 100644 --- a/app/src/main/java/org/lsposed/manager/repo/RepoLoader.java +++ b/app/src/main/java/org/lsposed/manager/repo/RepoLoader.java @@ -21,7 +21,6 @@ package org.lsposed.manager.repo; import android.util.Log; -import android.util.Pair; import androidx.annotation.NonNull; @@ -52,7 +51,21 @@ import okhttp3.ResponseBody; public class RepoLoader { private static RepoLoader instance = null; private Map onlineModules = new HashMap<>(); - private final Map> latestVersion = new ConcurrentHashMap<>(); + + public static class ModuleVersion { + public String versionName; + public long versionCode; + private ModuleVersion(long versionCode, String versionName) { + this.versionName = versionName; + this.versionCode = versionCode; + } + public boolean upgradable(long versionCode, String versionName) { + return this.versionCode > versionCode || (this.versionCode == versionCode && !versionName.equals(this.versionName)); + } + + } + + private final Map latestVersion = new ConcurrentHashMap<>(); private final Path repoFile = Paths.get(App.getInstance().getFilesDir().getAbsolutePath(), "repo.json"); private final List listeners = new CopyOnWriteArrayList<>(); private boolean isLoading = false; @@ -116,16 +129,16 @@ public class RepoLoader { if (release == null || release.isEmpty()) continue; var splits = release.split("-", 2); if (splits.length < 2) continue; - int verCode; + long verCode; String verName; try { - verCode = Integer.parseInt(splits[0]); + verCode = Long.parseLong(splits[0]); verName = splits[1]; } catch (NumberFormatException ignored) { continue; } String pkgName = module.getName(); - latestVersion.put(pkgName, new Pair<>(verCode, verName)); + latestVersion.put(pkgName, new ModuleVersion(verCode, verName)); } onlineModules = modules; @@ -151,7 +164,7 @@ public class RepoLoader { }); } - public Pair getModuleLatestVersion(String packageName) { + public ModuleVersion getModuleLatestVersion(String packageName) { return latestVersion.get(packageName); } diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/HomeFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/HomeFragment.java index 29539458..83c67948 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/HomeFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/HomeFragment.java @@ -40,6 +40,7 @@ import org.lsposed.manager.ConfigManager; import org.lsposed.manager.R; import org.lsposed.manager.databinding.DialogAboutBinding; import org.lsposed.manager.databinding.FragmentHomeBinding; +import org.lsposed.manager.repo.RepoLoader; import org.lsposed.manager.ui.dialog.BlurBehindDialogBuilder; import org.lsposed.manager.ui.dialog.FlashDialogBuilder; import org.lsposed.manager.ui.dialog.InfoDialogBuilder; @@ -50,14 +51,17 @@ import org.lsposed.manager.util.NavUtil; import org.lsposed.manager.util.UpdateUtil; import org.lsposed.manager.util.chrome.LinkTransformationMethod; +import java.util.HashSet; import java.util.Locale; import rikka.core.util.ResourceUtils; -public class HomeFragment extends BaseFragment { +public class HomeFragment extends BaseFragment implements RepoLoader.Listener { private FragmentHomeBinding binding; + private static final RepoLoader repoLoader = RepoLoader.getInstance(); + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -103,6 +107,11 @@ public class HomeFragment extends BaseFragment { binding.issue.setOnClickListener(view -> NavUtil.startURL(activity, "https://github.com/LSPosed/LSPosed/issues")); updateStates(requireActivity(), ConfigManager.isBinderAlive(), UpdateUtil.needUpdate()); + + repoLoader.addListener(this); + if (repoLoader.isRepoLoaded()) { + repoLoaded(); + } return binding.getRoot(); } @@ -185,6 +194,34 @@ public class HomeFragment extends BaseFragment { } } + @Override + public void repoLoaded() { + final int[] count = new int[]{0}; + HashSet processedModules = new HashSet<>(); + ModuleUtil.getInstance().getModules().forEach((k, v) -> { + if (!processedModules.contains(k.first)) { + var ver = repoLoader.getModuleLatestVersion(k.first); + if (ver != null && ver.upgradable(v.versionCode, v.versionName)) { + ++count[0]; + } + processedModules.add(k.first); + } + } + ); + runOnUiThread(() -> { + if (count[0] > 0) { + binding.downloadSummary.setText(getResources().getQuantityString(R.plurals.module_repo_upgradable, count[0], count[0])); + } else { + onThrowable(null); + } + }); + } + + @Override + public void onThrowable(Throwable t) { + runOnUiThread(() -> binding.downloadSummary.setText(getResources().getString(R.string.module_repo_up_to_date))); + } + private class StartFragmentListener implements View.OnClickListener { boolean requireInstalled; int fragment; @@ -219,7 +256,7 @@ public class HomeFragment extends BaseFragment { @Override public void onDestroyView() { super.onDestroyView(); - + repoLoader.removeListener(this); binding = null; } } diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java index 90f3aba6..cad65719 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java @@ -473,9 +473,9 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi } if (repoLoader.isRepoLoaded()) { var ver = repoLoader.getModuleLatestVersion(item.packageName); - if (ver != null && ver.first > item.versionCode) { + if (ver != null && ver.upgradable(item.versionCode, item.versionName)) { if (warningText != null) sb.append("\n"); - String recommended = getString(R.string.update_available, ver.second); + String recommended = getString(R.string.update_available, ver.versionName); sb.append(recommended); final ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(ResourceUtils.resolveColor(requireActivity().getTheme(), androidx.appcompat.R.attr.colorAccent)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java index 0b4fe718..7d9f50fb 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java @@ -205,9 +205,9 @@ public class RepoFragment extends BaseFragment implements RepoLoader.Listener { ModuleUtil.InstalledModule installedModule = ModuleUtil.getInstance().getModule(module.getName()); if (installedModule != null) { var ver = repoLoader.getModuleLatestVersion(installedModule.packageName); - if (ver != null && ver.first > installedModule.versionCode) { + if (ver != null && ver.upgradable(installedModule.versionCode, installedModule.versionName)) { sb.append("\n"); - String recommended = getString(R.string.update_available, ver.second); + String recommended = getString(R.string.update_available, ver.versionName); sb.append(recommended); final ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(ResourceUtils.resolveColor(requireActivity().getTheme(), androidx.appcompat.R.attr.colorAccent)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 0620f176..89c3356c 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -186,7 +186,7 @@ android:layout_height="wrap_content" android:layout_below="@id/download_title" android:layout_alignStart="@id/download_title" - android:text="@string/module_repo_summary" + android:text="@string/module_repo_loading" android:textAppearance="?android:attr/textAppearanceSmall" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5570dc8e..86a75fad 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -31,7 +31,12 @@ About Report issue Repository - Module repository (Beta) + Loading… + All modules up to date + + %d module upgradable + %d modules upgradable + Join our %2$s channel]]> null