From e6ec5ee2420aa4148130da9c7eca62a3e176f261 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Wed, 19 Feb 2014 18:11:32 +0100 Subject: [PATCH] Add support for filtering apk compatibility by maxSdkVersion For now it's enforced like minSdkVersion. It is possible to try and install incompatible apks by enabling "Incompatible Versions" and agreeing to the warning shown when clicking on such a version. --- res/values/strings.xml | 4 +++- src/org/fdroid/fdroid/AppDetails.java | 15 ++++++++++++--- src/org/fdroid/fdroid/CompatibilityChecker.java | 4 ++-- src/org/fdroid/fdroid/RepoXMLHandler.java | 6 ++++++ src/org/fdroid/fdroid/compat/Compatibility.java | 6 ++++++ src/org/fdroid/fdroid/data/Apk.java | 4 ++++ src/org/fdroid/fdroid/data/ApkProvider.java | 7 ++++--- src/org/fdroid/fdroid/data/DBHelper.java | 3 ++- 8 files changed, 39 insertions(+), 10 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 680cd375d..e0708d046 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -200,7 +200,9 @@ Disabled "%1$s".\n\nYou will need to re-enable this repository to install apps from it. - Android %s or later + %s or later + up to %s + %1$s up to %2$s Your device is not on the same WiFi as the local repo you just added! Try joining this network: %s Requires: %1$s diff --git a/src/org/fdroid/fdroid/AppDetails.java b/src/org/fdroid/fdroid/AppDetails.java index 2976fd462..0cafa5e91 100644 --- a/src/org/fdroid/fdroid/AppDetails.java +++ b/src/org/fdroid/fdroid/AppDetails.java @@ -145,12 +145,21 @@ public class AppDetails extends ListActivity { holder.size.setVisibility(View.GONE); } - if (pref_expert && apk.minSdkVersion > 0) { + if (!pref_expert) { + holder.api.setVisibility(View.GONE); + } else if (apk.minSdkVersion > 0 && apk.maxSdkVersion > 0) { + holder.api.setText(getString(R.string.minsdk_up_to_maxsdk, + Utils.getAndroidVersionName(apk.minSdkVersion), + Utils.getAndroidVersionName(apk.maxSdkVersion))); + holder.api.setVisibility(View.VISIBLE); + } else if (apk.minSdkVersion > 0) { holder.api.setText(getString(R.string.minsdk_or_later, Utils.getAndroidVersionName(apk.minSdkVersion))); holder.api.setVisibility(View.VISIBLE); - } else { - holder.api.setVisibility(View.GONE); + } else if (apk.maxSdkVersion > 0) { + holder.api.setText(getString(R.string.up_to_maxsdk, + Utils.getAndroidVersionName(apk.maxSdkVersion))); + holder.api.setVisibility(View.VISIBLE); } if (apk.srcname != null) { diff --git a/src/org/fdroid/fdroid/CompatibilityChecker.java b/src/org/fdroid/fdroid/CompatibilityChecker.java index 5aa4ac31c..c17565120 100644 --- a/src/org/fdroid/fdroid/CompatibilityChecker.java +++ b/src/org/fdroid/fdroid/CompatibilityChecker.java @@ -69,7 +69,7 @@ public class CompatibilityChecker extends Compatibility { List incompatibleReasons = new ArrayList(); - if (!hasApi(apk.minSdkVersion)) { + if (!hasApi(apk.minSdkVersion) || !upToApi(apk.maxSdkVersion)) { incompatibleReasons.add( context.getResources().getString( R.string.minsdk_or_later, @@ -100,4 +100,4 @@ public class CompatibilityChecker extends Compatibility { return incompatibleReasons; } -} \ No newline at end of file +} diff --git a/src/org/fdroid/fdroid/RepoXMLHandler.java b/src/org/fdroid/fdroid/RepoXMLHandler.java index 5f0e2e046..a123c70ed 100644 --- a/src/org/fdroid/fdroid/RepoXMLHandler.java +++ b/src/org/fdroid/fdroid/RepoXMLHandler.java @@ -158,6 +158,12 @@ public class RepoXMLHandler extends DefaultHandler { } catch (NumberFormatException ex) { curapk.minSdkVersion = 0; } + } else if (curel.equals("maxsdkver")) { + try { + curapk.maxSdkVersion = Integer.parseInt(str); + } catch (NumberFormatException ex) { + curapk.maxSdkVersion = 0; + } } else if (curel.equals("added")) { try { curapk.added = str.length() == 0 ? null : Utils.DATE_FORMAT diff --git a/src/org/fdroid/fdroid/compat/Compatibility.java b/src/org/fdroid/fdroid/compat/Compatibility.java index 5fe507bba..388c7e085 100644 --- a/src/org/fdroid/fdroid/compat/Compatibility.java +++ b/src/org/fdroid/fdroid/compat/Compatibility.java @@ -4,10 +4,16 @@ import android.os.Build; public abstract class Compatibility { + // like minSdkVersion protected static boolean hasApi(int apiLevel) { return getApi() >= apiLevel; } + // like maxSdkVersion + protected static boolean upToApi(int apiLevel) { + return (apiLevel < 1 || getApi() <= apiLevel); + } + protected static int getApi() { return Build.VERSION.SDK_INT; } diff --git a/src/org/fdroid/fdroid/data/Apk.java b/src/org/fdroid/fdroid/data/Apk.java index 9f6b305f1..95ff15f65 100644 --- a/src/org/fdroid/fdroid/data/Apk.java +++ b/src/org/fdroid/fdroid/data/Apk.java @@ -16,6 +16,7 @@ public class Apk extends ValueObject implements Comparable { public String hash; public String hashType; public int minSdkVersion; // 0 if unknown + public int maxSdkVersion; // 0 if none public Date added; public Utils.CommaSeparatedList permissions; // null if empty or // unknown @@ -75,6 +76,8 @@ public class Apk extends ValueObject implements Comparable { compatible = cursor.getInt(i) == 1; } else if (column.equals(ApkProvider.DataColumns.MIN_SDK_VERSION)) { minSdkVersion = cursor.getInt(i); + } else if (column.equals(ApkProvider.DataColumns.MAX_SDK_VERSION)) { + maxSdkVersion = cursor.getInt(i); } else if (column.equals(ApkProvider.DataColumns.NAME)) { apkName = cursor.getString(i); } else if (column.equals(ApkProvider.DataColumns.PERMISSIONS)) { @@ -121,6 +124,7 @@ public class Apk extends ValueObject implements Comparable { values.put(ApkProvider.DataColumns.SIZE, size); values.put(ApkProvider.DataColumns.NAME, apkName); values.put(ApkProvider.DataColumns.MIN_SDK_VERSION, minSdkVersion); + values.put(ApkProvider.DataColumns.MAX_SDK_VERSION, maxSdkVersion); values.put(ApkProvider.DataColumns.ADDED_DATE, added == null ? "" : Utils.DATE_FORMAT.format(added)); values.put(ApkProvider.DataColumns.PERMISSIONS, Utils.CommaSeparatedList.str(permissions)); values.put(ApkProvider.DataColumns.FEATURES, Utils.CommaSeparatedList.str(features)); diff --git a/src/org/fdroid/fdroid/data/ApkProvider.java b/src/org/fdroid/fdroid/data/ApkProvider.java index e86deb5a1..8e7be5ed9 100644 --- a/src/org/fdroid/fdroid/data/ApkProvider.java +++ b/src/org/fdroid/fdroid/data/ApkProvider.java @@ -149,6 +149,7 @@ public class ApkProvider extends FDroidProvider { public static String SIGNATURE = "sig"; public static String SOURCE_NAME = "srcname"; public static String MIN_SDK_VERSION = "minSdkVersion"; + public static String MAX_SDK_VERSION = "maxSdkVersion"; public static String PERMISSIONS = "permissions"; public static String FEATURES = "features"; public static String NATIVE_CODE = "nativecode"; @@ -161,9 +162,9 @@ public class ApkProvider extends FDroidProvider { public static String[] ALL = { _ID, APK_ID, VERSION, REPO_ID, HASH, VERSION_CODE, NAME, SIZE, - SIGNATURE, SOURCE_NAME, MIN_SDK_VERSION, PERMISSIONS, FEATURES, - NATIVE_CODE, HASH_TYPE, ADDED_DATE, IS_COMPATIBLE, - REPO_VERSION, REPO_ADDRESS, INCOMPATIBLE_REASONS + SIGNATURE, SOURCE_NAME, MIN_SDK_VERSION, MAX_SDK_VERSION, + PERMISSIONS, FEATURES, NATIVE_CODE, HASH_TYPE, ADDED_DATE, + IS_COMPATIBLE, REPO_VERSION, REPO_ADDRESS, INCOMPATIBLE_REASONS }; } diff --git a/src/org/fdroid/fdroid/data/DBHelper.java b/src/org/fdroid/fdroid/data/DBHelper.java index df872d2c9..db273fa29 100644 --- a/src/org/fdroid/fdroid/data/DBHelper.java +++ b/src/org/fdroid/fdroid/data/DBHelper.java @@ -46,6 +46,7 @@ public class DBHelper extends SQLiteOpenHelper { + "sig string, " + "srcname string, " + "minSdkVersion integer, " + + "maxSdkVersion integer, " + "permissions string, " + "features string, " + "nativecode string, " @@ -86,7 +87,7 @@ public class DBHelper extends SQLiteOpenHelper { + "iconUrl text, " + "primary key(id));"; - private static final int DB_VERSION = 39; + private static final int DB_VERSION = 40; private Context context;