diff --git a/CHANGELOG.md b/CHANGELOG.md
index fdfef9ee9..ef3d9a8e2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,8 @@
* Fix crash when trying to install incompatible apps with the privileged
installer
+* Add option to prompt for unstable updates globally
+
* Add support for free Certificate Authorities: cert.startcom.org and
letsencrypt.org
diff --git a/F-Droid/res/values/strings.xml b/F-Droid/res/values/strings.xml
index 1deafd4ad..3a0b2bd1f 100644
--- a/F-Droid/res/values/strings.xml
+++ b/F-Droid/res/values/strings.xml
@@ -15,6 +15,8 @@
Cache packages
Keep downloaded package files on device
Updates
+ Unstable updates
+ Suggest updates to unstable versions
Other
Last repo scan: %s
Never
diff --git a/F-Droid/res/xml/preferences.xml b/F-Droid/res/xml/preferences.xml
index e038d5963..b647b95c0 100644
--- a/F-Droid/res/xml/preferences.xml
+++ b/F-Droid/res/xml/preferences.xml
@@ -73,6 +73,12 @@
+
updateHistoryListeners = new ArrayList<>();
private final List localRepoNameListeners = new ArrayList<>();
private final List localRepoHttpsListeners = new ArrayList<>();
+ private final List unstableUpdatesListeners = new ArrayList<>();
private boolean isInitialized(String key) {
return initialized.containsKey(key) && initialized.get(key);
@@ -129,6 +132,10 @@ public class Preferences implements SharedPreferences.OnSharedPreferenceChangeLi
return preferences.getBoolean(PREF_CACHE_APK, DEFAULT_CACHE_APK);
}
+ public boolean getUnstableUpdates() {
+ return preferences.getBoolean(PREF_UNSTABLE_UPDATES, DEFAULT_UNSTABLE_UPDATES);
+ }
+
public boolean showIncompatibleVersions() {
return preferences.getBoolean(PREF_INCOMP_VER, DEFAULT_INCOMP_VER);
}
@@ -235,6 +242,14 @@ public class Preferences implements SharedPreferences.OnSharedPreferenceChangeLi
filterAppsRequiringRootListeners.remove(listener);
}
+ public void registerUnstableUpdatesChangeListener(ChangeListener listener) {
+ unstableUpdatesListeners.add(listener);
+ }
+
+ public void unregisterUnstableUpdatesChangeListener(ChangeListener listener) {
+ unstableUpdatesListeners.remove(listener);
+ }
+
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Utils.debugLog(TAG, "Invalidating preference '" + key + "'.");
@@ -265,6 +280,10 @@ public class Preferences implements SharedPreferences.OnSharedPreferenceChangeLi
for (ChangeListener listener : localRepoHttpsListeners) {
listener.onPreferenceChange();
}
+ case PREF_UNSTABLE_UPDATES:
+ for (ChangeListener listener : unstableUpdatesListeners) {
+ listener.onPreferenceChange();
+ }
break;
}
}
diff --git a/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java b/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java
index 305f07b43..c87e832ec 100644
--- a/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java
+++ b/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java
@@ -868,6 +868,8 @@ public class AppProvider extends FDroidProvider {
final String apk = DBHelper.TABLE_APK;
final String app = DBHelper.TABLE_APP;
+ final boolean unstableUpdates = Preferences.get().getUnstableUpdates();
+ String restrictToStable = unstableUpdates ? "" : ( apk + ".vercode <= " + app + ".upstreamVercode AND " );
String updateSql =
"UPDATE " + app +
" SET suggestedVercode = ( " +
@@ -875,7 +877,7 @@ public class AppProvider extends FDroidProvider {
" FROM " + apk +
" WHERE " +
app + ".id = " + apk + ".id AND " +
- apk + ".vercode <= " + app + ".upstreamVercode AND " +
+ restrictToStable +
" ( " + app + ".compatible = 0 OR " + apk + ".compatible = 1 ) ) " +
" WHERE upstreamVercode > 0 ";