From c941440a3464e378647fcfce4be0211667667d52 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner <hans@eds.org>
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 e5469633d..8ce979ab9 100644
--- a/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java
+++ b/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java
@@ -125,10 +125,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<Apk> {
 
     // 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<Apk> {
     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 f45a92656..0810a3da1 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;
@@ -451,9 +452,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);