From e1d37ce02febd05d91e1a1133bd1dcbcf5b978b8 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Sat, 24 Jul 2021 22:22:37 +0530 Subject: [PATCH] InstalledAppProvider: Fix Trichrome Library install * The way Trichrome library (which is a static shared library) is implemented means that the PackageManager ends up with two entries for it, one for the system-installed version, and another for the upgrade installed on /data. * The previous implementation which only relied on packageName would sometimes pick the older version, which meant that even after installing an update it'd still keep trying to re-install the same version over and over again since in F-Droid's internal database it still thought that an older version was installed. * Always using the newer version / higher version code should hopefully fix this. Fixes: b52c7ca39a485d552605028437dbebea4107152a "Remove duplicate entries from installed packages list" Issue: https://gitlab.com/fdroid/fdroidclient/-/issues/2184 Issue: calyxos#406 --- .../data/InstalledAppProviderService.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java index 7deee2545..a285d680f 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java +++ b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java @@ -23,6 +23,7 @@ import org.fdroid.fdroid.privileged.IPrivilegedService; import java.io.File; import java.io.FilenameFilter; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.TreeSet; @@ -220,12 +221,28 @@ public class InstalledAppProviderService extends JobIntentService { } } + private static class PackageInfoComparator implements Comparator { + @Override + public int compare(PackageInfo o1, PackageInfo o2) { + // There are two trichrome library entries in the list, + // one for each version. We only want the newest here. + String[] duplicateList = new String[]{"org.chromium.trichromelibrary"}; + for (String dup : duplicateList) { + if (o1.packageName.contentEquals(dup) + && o2.packageName.contentEquals(dup)) { + return Integer.compare(o1.versionCode, o2.versionCode); + } + } + return o1.packageName.compareTo(o2.packageName); + } + } + private static void compareToPackageManager(Context context, List packageInfoList) { if (packageInfoList == null || packageInfoList.isEmpty()) { packageInfoList = context.getPackageManager().getInstalledPackages(PackageManager.GET_SIGNATURES); } Map cachedInfo = InstalledAppProvider.Helper.lastUpdateTimes(context); - TreeSet packageInfoSet = new TreeSet<>((o1, o2) -> o1.packageName.compareTo(o2.packageName)); + TreeSet packageInfoSet = new TreeSet<>(new PackageInfoComparator()); packageInfoSet.addAll(packageInfoList); for (PackageInfo packageInfo : packageInfoSet) { if (cachedInfo.containsKey(packageInfo.packageName)) {