From 02d98826a935db79dc3c141a317dcb3f52608a7f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 23 May 2016 16:05:57 +0200 Subject: [PATCH] when parsing APKs for the local repo, correctly set maxSdkVersion The original logic had maxSdkVersion=0 meaning infinity. That was changed to be a very large value SDK_VERSION_MAX_VALUE, but getMinMaxSdkVersion() was still returning 0 for APKs where maxSdkVersion was not set. This is a follow up on fc0df0dcf4dd0d5f13de82d7cd9254b2b48cb62d --- .../main/java/org/fdroid/fdroid/RepoXMLHandler.java | 8 ++++++-- app/src/main/java/org/fdroid/fdroid/Utils.java | 11 ++++++----- app/src/main/java/org/fdroid/fdroid/data/Apk.java | 3 ++- .../org/fdroid/fdroid/localrepo/LocalRepoManager.java | 9 +++++++-- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java b/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java index ca2d5ed9c..521ce3764 100644 --- a/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java +++ b/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java @@ -126,10 +126,14 @@ public class RepoXMLHandler extends DefaultHandler { curapk.apkName = str; break; case "sdkver": - curapk.minSdkVersion = Utils.parseInt(str, 0); + curapk.minSdkVersion = Utils.parseInt(str, Apk.SDK_VERSION_MIN_VALUE); break; case "maxsdkver": - curapk.maxSdkVersion = Utils.parseInt(str, 0); + curapk.maxSdkVersion = Utils.parseInt(str, Apk.SDK_VERSION_MAX_VALUE); + if (curapk.maxSdkVersion == 0) { + // before fc0df0dcf4dd0d5f13de82d7cd9254b2b48cb62d, this could be 0 + curapk.maxSdkVersion = Apk.SDK_VERSION_MAX_VALUE; + } break; case "added": curapk.added = Utils.parseDate(str, null); diff --git a/app/src/main/java/org/fdroid/fdroid/Utils.java b/app/src/main/java/org/fdroid/fdroid/Utils.java index 733280f52..a190af20b 100644 --- a/app/src/main/java/org/fdroid/fdroid/Utils.java +++ b/app/src/main/java/org/fdroid/fdroid/Utils.java @@ -39,6 +39,7 @@ import com.nostra13.universalimageloader.utils.StorageUtils; import org.apache.commons.io.FileUtils; import org.fdroid.fdroid.compat.FileCompat; +import org.fdroid.fdroid.data.Apk; import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.SanitizedFile; import org.xml.sax.XMLReader; @@ -226,8 +227,8 @@ public final class Utils { /* PackageManager doesn't give us the min and max sdk versions, so we have * to parse it */ - private static int getMinMaxSdkVersion(Context context, String packageName, - String attrName) { + private static int getSdkVersion(Context context, String packageName, + String attrName, final int defaultValue) { try { AssetManager am = context.createPackageContext(packageName, 0).getAssets(); XmlResourceParser xml = am.openXmlResourceParser("AndroidManifest.xml"); @@ -245,15 +246,15 @@ public final class Utils { } catch (PackageManager.NameNotFoundException | IOException | XmlPullParserException e) { Log.e(TAG, "Could not get min/max sdk version", e); } - return 0; + return defaultValue; } public static int getMinSdkVersion(Context context, String packageName) { - return getMinMaxSdkVersion(context, packageName, "minSdkVersion"); + return getSdkVersion(context, packageName, "minSdkVersion", Apk.SDK_VERSION_MIN_VALUE); } public static int getMaxSdkVersion(Context context, String packageName) { - return getMinMaxSdkVersion(context, packageName, "maxSdkVersion"); + return getSdkVersion(context, packageName, "maxSdkVersion", Apk.SDK_VERSION_MAX_VALUE); } // return a fingerprint formatted for display diff --git a/app/src/main/java/org/fdroid/fdroid/data/Apk.java b/app/src/main/java/org/fdroid/fdroid/data/Apk.java index 377bf37bf..98844f15b 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Apk.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Apk.java @@ -14,6 +14,7 @@ public class Apk extends ValueObject implements Comparable { // Using only byte-range keeps it only 8-bits in the SQLite database public static final int SDK_VERSION_MAX_VALUE = Byte.MAX_VALUE; + public static final int SDK_VERSION_MIN_VALUE = 0; public String packageName; public String versionName; @@ -22,7 +23,7 @@ public class Apk extends ValueObject implements Comparable { public long repo; // ID of the repo it comes from public String hash; public String hashType; - public int minSdkVersion; // 0 if unknown + public int minSdkVersion = SDK_VERSION_MIN_VALUE; // 0 if unknown public int maxSdkVersion = SDK_VERSION_MAX_VALUE; // "infinity" if not set public Date added; public Utils.CommaSeparatedList permissions; // null if empty or diff --git a/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java b/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java index 5826ba062..9b49f0ba1 100644 --- a/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java +++ b/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java @@ -23,6 +23,7 @@ import org.fdroid.fdroid.Hasher; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.R; import org.fdroid.fdroid.Utils; +import org.fdroid.fdroid.data.Apk; import org.fdroid.fdroid.data.App; import org.fdroid.fdroid.data.SanitizedFile; import org.xmlpull.v1.XmlPullParserException; @@ -452,9 +453,13 @@ public final class LocalRepoManager { tagHash(app); tag("sig", app.installedApk.sig.toLowerCase(Locale.US)); tag("size", app.installedApk.installedFile.length()); - tag("sdkver", app.installedApk.minSdkVersion); - tag("maxsdkver", app.installedApk.maxSdkVersion); tag("added", app.installedApk.added); + if (app.installedApk.minSdkVersion > Apk.SDK_VERSION_MIN_VALUE) { + tag("sdkver", app.installedApk.minSdkVersion); + } + if (app.installedApk.maxSdkVersion < Apk.SDK_VERSION_MAX_VALUE) { + tag("maxsdkver", app.installedApk.maxSdkVersion); + } tagFeatures(app); tagPermissions(app); tagNativecode(app);