From e70cecf76b5c2aee0bd50fbacfbae6ae5f1dcf57 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Fri, 22 May 2015 09:46:05 +0200 Subject: Working SharedPreferencesStorageProvider --- .../java/org/rssin/android/FilterActivity.java | 2 +- .../org/rssin/android/FilterSettingsActivity.java | 2 +- .../main/java/org/rssin/android/FiltersList.java | 6 +- .../android/SharedPreferencesStorageProvider.java | 98 ++++++++++++++++++++++ app/src/main/java/org/rssin/rssin/Filter.java | 2 - 5 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java (limited to 'app/src/main/java') diff --git a/app/src/main/java/org/rssin/android/FilterActivity.java b/app/src/main/java/org/rssin/android/FilterActivity.java index cbe5382..5afa3ff 100644 --- a/app/src/main/java/org/rssin/android/FilterActivity.java +++ b/app/src/main/java/org/rssin/android/FilterActivity.java @@ -49,7 +49,7 @@ public class FilterActivity extends ActionBarActivity { // @todo Check on -1? Shouldn't happen anyway. filter = filtersList.getFilterFromHashCode(filterHashCode); - filter.ensureFeedSorter(InternalStorageProvider.getInstance(this)); + filter.ensureFeedSorter(SharedPreferencesStorageProvider.getInstance(this)); setTitle(filter.getTitle()); diff --git a/app/src/main/java/org/rssin/android/FilterSettingsActivity.java b/app/src/main/java/org/rssin/android/FilterSettingsActivity.java index b0791a3..1893579 100644 --- a/app/src/main/java/org/rssin/android/FilterSettingsActivity.java +++ b/app/src/main/java/org/rssin/android/FilterSettingsActivity.java @@ -195,7 +195,7 @@ public class FilterSettingsActivity extends ActionBarActivity { Keyword k = new Keyword(keyword); filter.getKeywords().add(k); try { - filter.store(InternalStorageProvider.getInstance()); + filter.store(SharedPreferencesStorageProvider.getInstance()); keywordAdapter.notifyDataSetChanged(); editText.setText(""); } catch (Exception e) { diff --git a/app/src/main/java/org/rssin/android/FiltersList.java b/app/src/main/java/org/rssin/android/FiltersList.java index 020e1e0..9448584 100755 --- a/app/src/main/java/org/rssin/android/FiltersList.java +++ b/app/src/main/java/org/rssin/android/FiltersList.java @@ -23,8 +23,8 @@ public class FiltersList { * @throws IOException if data is corrupted, and deserializing fails */ protected FiltersList(Context context) throws IOException { - InternalStorageProvider internalStorageProvider = InternalStorageProvider.getInstance(context); - filters = internalStorageProvider.allFilters(); + SharedPreferencesStorageProvider sharedPreferencesStorageProvider = SharedPreferencesStorageProvider.getInstance(context); + filters = sharedPreferencesStorageProvider.allFilters(); } public static FiltersList getInstance(Context context) throws IOException { @@ -49,7 +49,7 @@ public class FiltersList { Exception e = null; for (Filter filter : filters) { try { - filter.store(InternalStorageProvider.getInstance()); + filter.store(SharedPreferencesStorageProvider.getInstance()); } catch (Exception ex) { e = ex; } diff --git a/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java b/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java new file mode 100644 index 0000000..d394343 --- /dev/null +++ b/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java @@ -0,0 +1,98 @@ +package org.rssin.android; + +import android.content.Context; +import android.preference.PreferenceManager; +import android.util.Base64; +import android.util.Log; + +import org.rssin.rssin.Filter; +import org.rssin.storage.FilterStorageProvider; +import org.rssin.storage.Storable; +import org.rssin.storage.StorageProvider; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Created by camilstaps on 22-5-15. + */ +public class SharedPreferencesStorageProvider implements StorageProvider, FilterStorageProvider { + + private static final String ADMIN_PREF_KEY = "administration"; + + private static SharedPreferencesStorageProvider instance; + + private Context context; + + protected SharedPreferencesStorageProvider(Context context) { + this.context = context; + } + + public static SharedPreferencesStorageProvider getInstance(Context context) { + if (instance == null) { + instance = new SharedPreferencesStorageProvider(context); + } + + return instance; + } + + public static SharedPreferencesStorageProvider getInstance() { + return instance; + } + + @Override + public void store(Object key, Storable element) throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(element); + oos.close(); + String string = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT); + + context.getSharedPreferences(key.toString(), Context.MODE_PRIVATE).edit().putString(element.getClass().getName(), string).commit(); + } + + @Override + public Storable fetch(Object key, Class className) throws Exception { + String serialized = context.getSharedPreferences(key.toString(), Context.MODE_PRIVATE).getString(className.getName(), null); + if (serialized == null) { + throw new IOException("No sharedPreference with key " + key.toString() + " and class " + className.getName()); + } + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(Base64.decode(serialized, Base64.DEFAULT))); + return (Storable) className.cast(ois.readObject()); + } + + @Override + public Object uniqueKey() { + return Integer.toString((int) System.currentTimeMillis()); + } + + @Override + public List allFilters() { + Set names = context.getSharedPreferences(ADMIN_PREF_KEY, Context.MODE_PRIVATE).getStringSet("filters", new HashSet()); + List filters = new ArrayList<>(); + for (String name : names) { + Filter filter = getFilter(name); + if (filter != null) { + filters.add(filter); + } + } + return filters; + } + + @Override + public Filter getFilter(Object key) { + try { + return (Filter) fetch(key.toString(), Filter.class); + } catch (Exception e) { + Log.e("SPSP", "Failed fetching filter", e); + return null; + } + } +} diff --git a/app/src/main/java/org/rssin/rssin/Filter.java b/app/src/main/java/org/rssin/rssin/Filter.java index 77b114e..c135586 100755 --- a/app/src/main/java/org/rssin/rssin/Filter.java +++ b/app/src/main/java/org/rssin/rssin/Filter.java @@ -2,12 +2,10 @@ package org.rssin.rssin; import android.text.TextUtils; -import org.rssin.android.InternalStorageProvider; import org.rssin.neurons.FeedSorter; import org.rssin.storage.Storable; import org.rssin.storage.StorageProvider; -import java.io.Serializable; import java.util.ArrayList; import java.util.List; -- cgit v1.2.3