parent
63808d162a
commit
1975718d3d
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue