[app] Upgradable first on repo page (#1501)

Fix #1499
This commit is contained in:
LoveSy 2021-12-28 20:21:08 +08:00 committed by GitHub
parent 63808d162a
commit 1975718d3d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 15 deletions

View File

@ -62,6 +62,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import rikka.core.util.LabelComparator;
@ -187,6 +188,7 @@ public class RepoFragment extends BaseFragment implements RepoLoader.RepoListene
} else if (sort == 1) {
menu.findItem(R.id.item_sort_by_update_time).setChecked(true);
}
menu.findItem(R.id.item_upgradable_first).setChecked(App.getPreferences().getBoolean("upgradable_first", true));
}
@Override
@ -238,6 +240,10 @@ public class RepoFragment extends BaseFragment implements RepoLoader.RepoListene
item.setChecked(true);
App.getPreferences().edit().putInt("repo_sort", 1).apply();
adapter.refresh();
} else if (itemId == R.id.item_upgradable_first) {
item.setChecked(!item.isChecked());
App.getPreferences().edit().putBoolean("upgradable_first", item.isChecked()).apply();
adapter.refresh();
}
return super.onOptionsItemSelected(item);
}
@ -257,6 +263,16 @@ public class RepoFragment extends BaseFragment implements RepoLoader.RepoListene
return new RepoAdapter.ViewHolder(ItemOnlinemoduleBinding.inflate(getLayoutInflater(), parent, false));
}
RepoLoader.ModuleVersion getUpgradableVer(OnlineModule module) {
ModuleUtil.InstalledModule installedModule = moduleUtil.getModule(module.getName());
if (installedModule != null) {
var ver = repoLoader.getModuleLatestVersion(installedModule.packageName);
if (ver != null && ver.upgradable(installedModule.versionCode, installedModule.versionName))
return ver;
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RepoAdapter.ViewHolder holder, int position) {
OnlineModule module = showList.get(position);
@ -272,22 +288,19 @@ public class RepoFragment extends BaseFragment implements RepoLoader.RepoListene
holder.appDescription.setVisibility(View.VISIBLE);
holder.appDescription.setText(sb);
sb = new SpannableStringBuilder();
ModuleUtil.InstalledModule installedModule = moduleUtil.getModule(module.getName());
if (installedModule != null) {
var ver = repoLoader.getModuleLatestVersion(installedModule.packageName);
if (ver != null && ver.upgradable(installedModule.versionCode, installedModule.versionName)) {
String hint = getString(R.string.update_available, ver.versionName);
sb.append(hint);
final ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(ResourceUtils.resolveColor(requireActivity().getTheme(), androidx.appcompat.R.attr.colorAccent));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
final TypefaceSpan typefaceSpan = new TypefaceSpan(Typeface.create("sans-serif-medium", Typeface.NORMAL));
sb.setSpan(typefaceSpan, sb.length() - hint.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
} else {
final StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
sb.setSpan(styleSpan, sb.length() - hint.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
sb.setSpan(foregroundColorSpan, sb.length() - hint.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
var upgradableVer = getUpgradableVer(module);
if (upgradableVer != null) {
String hint = getString(R.string.update_available, upgradableVer.versionName);
sb.append(hint);
final ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(ResourceUtils.resolveColor(requireActivity().getTheme(), androidx.appcompat.R.attr.colorAccent));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
final TypefaceSpan typefaceSpan = new TypefaceSpan(Typeface.create("sans-serif-medium", Typeface.NORMAL));
sb.setSpan(typefaceSpan, sb.length() - hint.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
} else {
final StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
sb.setSpan(styleSpan, sb.length() - hint.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
sb.setSpan(foregroundColorSpan, sb.length() - hint.length(), sb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
if (sb.length() > 0) {
holder.hint.setVisibility(View.VISIBLE);
@ -317,8 +330,16 @@ public class RepoFragment extends BaseFragment implements RepoLoader.RepoListene
if (modules == null) return;
setLoaded(false);
int sort = App.getPreferences().getInt("repo_sort", 0);
boolean upgradableFirst = App.getPreferences().getBoolean("upgradable_first", true);
ConcurrentHashMap<String, Boolean> upgradable = new ConcurrentHashMap<>();
fullList = modules.parallelStream().filter((onlineModule -> !onlineModule.isHide() && !onlineModule.getReleases().isEmpty()))
.sorted((a, b) -> {
if (upgradableFirst) {
var aUpgrade = upgradable.computeIfAbsent(a.getName(), n -> getUpgradableVer(a) != null);
var bUpgrade = upgradable.computeIfAbsent(b.getName(), n -> getUpgradableVer(b) != null);
if (aUpgrade && !bUpgrade) return -1;
else if (!aUpgrade && bUpgrade) return 1;
}
if (sort == 0) {
return labelComparator.compare(a.getDescription(), b.getDescription());
} else {

View File

@ -43,6 +43,10 @@
android:id="@+id/item_sort_by_update_time"
android:title="@string/sort_by_update_time" />
</group>
<item
android:id="@+id/item_upgradable_first"
android:checkable="true"
android:title="@string/sort_upgradable_first" />
</menu>
</item>
</menu>

View File

@ -235,4 +235,5 @@
<string name="color_grey">Grey</string>
<string name="color_blue_grey">Blue grey</string>
<string name="feedback_or_suggestion">Feedback or suggestion</string>
<string name="sort_upgradable_first">Upgradable first</string>
</resources>