package org.ebookdroid.common.settings; import org.ebookdroid.common.settings.definitions.OpdsPreferences; import org.ebookdroid.common.settings.listeners.IOpdsSettingsChangeListener; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import org.emdev.common.backup.BackupManager; import org.emdev.common.backup.IBackupAgent; import org.emdev.common.settings.backup.SettingsBackupHelper; import org.json.JSONArray; import org.json.JSONObject; public class OpdsSettings implements OpdsPreferences, IBackupAgent { public static final String BACKUP_KEY = "opds-settings"; private static OpdsSettings current; /* =============== OPDS settings =============== */ public final JSONArray opdsCatalogs; public final String downloadDir; public final boolean filterTypes; public final boolean downloadArchives; public final boolean unpackArchives; public final boolean deleteArchives; private OpdsSettings() { BackupManager.addAgent(this); SharedPreferences prefs = SettingsManager.prefs; /* =============== OPDS settings =============== */ opdsCatalogs = OPDS_CATALOGS.getPreferenceValue(prefs); downloadDir = OPDS_DOWNLOAD_DIR.getPreferenceValue(prefs); filterTypes = OPDS_FILTER_TYPES.getPreferenceValue(prefs); downloadArchives = OPDS_DOWNLOAD_ARCHIVES.getPreferenceValue(prefs); unpackArchives = OPDS_UNPACK_ARCHIVES.getPreferenceValue(prefs); deleteArchives = OPDS_DELETE_ARCHIVES.getPreferenceValue(prefs); } /* =============== OPDS settings =============== */ /* =============== */ public static void init() { current = new OpdsSettings(); } public static OpdsSettings current() { SettingsManager.lock.readLock().lock(); try { return current; } finally { SettingsManager.lock.readLock().unlock(); } } public static void changeOpdsCatalogs(final JSONArray opdsCatalogs) { SettingsManager.lock.writeLock().lock(); try { final Editor edit = SettingsManager.prefs.edit(); OpdsPreferences.OPDS_CATALOGS.setPreferenceValue(edit, opdsCatalogs); edit.commit(); final OpdsSettings oldSettings = current; current = new OpdsSettings(); applySettingsChanges(oldSettings, current); } finally { SettingsManager.lock.writeLock().unlock(); } } static Diff onSettingsChanged() { final OpdsSettings oldOpdsSettings = current; current = new OpdsSettings(); return applySettingsChanges(oldOpdsSettings, current); } public static OpdsSettings.Diff applySettingsChanges(final OpdsSettings oldSettings, final OpdsSettings newSettings) { final OpdsSettings.Diff diff = new OpdsSettings.Diff(oldSettings, newSettings); final IOpdsSettingsChangeListener l = SettingsManager.listeners.getListener(); l.onOpdsSettingsChanged(oldSettings, newSettings, diff); return diff; } @Override public String key() { return BACKUP_KEY; } @Override public JSONObject backup() { return SettingsBackupHelper.backup(BACKUP_KEY, SettingsManager.prefs, OpdsPreferences.class); } @Override public void restore(final JSONObject backup) { SettingsBackupHelper.restore(BACKUP_KEY, SettingsManager.prefs, OpdsPreferences.class, backup); onSettingsChanged(); } public static class Diff { private static final int D_OpdsCatalogs = 0x0001 << 0; private int mask; private final boolean firstTime; public Diff(final OpdsSettings olds, final OpdsSettings news) { firstTime = olds == null; if (firstTime) { mask = 0xFFFFFFFF; } else if (news != null) { if (!olds.opdsCatalogs.equals(news.opdsCatalogs)) { mask |= D_OpdsCatalogs; } } } public boolean isFirstTime() { return firstTime; } public boolean isOpdsCatalogsChanged() { return 0 != (mask & D_OpdsCatalogs); } } }