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;