From 94e5519d23831e5a17a7cd0d32e100baaa47e009 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 24 Apr 2018 18:12:46 +0200 Subject: [PATCH] migrate "Only on Wifi" preference to "Over Wi-Fi" and "Over data" This migrates the old "Only on Wifi" checkbox to something similar with the new preferences layout. --- .../java/org/fdroid/fdroid/Preferences.java | 49 ++++++++++++++++--- .../views/fragments/PreferencesFragment.java | 2 +- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/Preferences.java b/app/src/main/java/org/fdroid/fdroid/Preferences.java index 1ef4f5ebd..65bc50821 100644 --- a/app/src/main/java/org/fdroid/fdroid/Preferences.java +++ b/app/src/main/java/org/fdroid/fdroid/Preferences.java @@ -1,5 +1,6 @@ package org.fdroid.fdroid; +import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.os.Build; @@ -193,14 +194,26 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh } } + /** + * Migrate old preferences to new preferences. These need to be processed + * and committed before {@code preferences.xml} is loaded. + */ + @SuppressLint("ApplySharedPref") + public void migrateOldPreferences() { + SharedPreferences.Editor editor = preferences.edit(); + if (migrateUpdateIntervalStringToInt(editor) || migrateOnlyOnWifi(editor)) { + editor.commit(); + } + } + /** * The original preference was a {@link String}, now it must be a {@link Integer} * since {@link android.support.v7.preference.SeekBarPreference} uses it * directly. */ - public void migrateUpdateIntervalStringToInt() { + private boolean migrateUpdateIntervalStringToInt(SharedPreferences.Editor editor) { if (!preferences.contains(OLD_PREF_UPDATE_INTERVAL)) { - return; // already completed + return false; // already completed } int updateInterval = DEFAULT_UPDATE_INTERVAL; String value = preferences.getString(OLD_PREF_UPDATE_INTERVAL, String.valueOf(24)); @@ -219,13 +232,33 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh } else if ("0".equals(value)) { // never updateInterval = 0; } - - // TODO migrate OLD_PREF_UPDATE_ON_WIFI_ONLY - - preferences.edit() + editor .putInt(PREF_UPDATE_INTERVAL, updateInterval) - .remove(OLD_PREF_UPDATE_INTERVAL) - .apply(); + .remove(OLD_PREF_UPDATE_INTERVAL); + return true; + } + + /** + * The original preference was just a "Only on Wifi" checkbox. + */ + private boolean migrateOnlyOnWifi(SharedPreferences.Editor editor) { + if (!preferences.contains(OLD_PREF_UPDATE_ON_WIFI_ONLY)) { + return false; // already completed + } + int wifi; + int data; + if (preferences.getBoolean(OLD_PREF_UPDATE_ON_WIFI_ONLY, true)) { + wifi = OVER_NETWORK_ALWAYS; + data = OVER_NETWORK_NEVER; + } else { + wifi = OVER_NETWORK_ALWAYS; + data = OVER_NETWORK_ON_DEMAND; + } + editor + .putInt(PREF_OVER_WIFI, wifi) + .putInt(PREF_OVER_DATA, data) + .remove(OLD_PREF_UPDATE_ON_WIFI_ONLY); + return true; } /** diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java index 3b0d931f8..b8d5df5c8 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java +++ b/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java @@ -79,7 +79,7 @@ public class PreferencesFragment extends PreferenceFragment @Override public void onCreatePreferences(Bundle bundle, String s) { - Preferences.get().migrateUpdateIntervalStringToInt(); + Preferences.get().migrateOldPreferences(); addPreferencesFromResource(R.xml.preferences); useTorCheckPref = (SwitchPreference) findPreference(Preferences.PREF_USE_TOR);