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;