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

View File

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

View File

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