package org.ebookdroid.common.settings;
import org.ebookdroid.common.settings.definitions.LibPreferences;
import org.ebookdroid.common.settings.listeners.ILibSettingsChangeListener;
import org.ebookdroid.common.settings.types.CacheLocation;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import java.util.HashSet;
import java.util.Set;
import org.emdev.common.backup.BackupManager;
import org.emdev.common.backup.IBackupAgent;
import org.emdev.common.filesystem.FileExtensionFilter;
import org.emdev.common.settings.backup.SettingsBackupHelper;
import org.json.JSONObject;
public class LibSettings implements LibPreferences, IBackupAgent {
public static final String BACKUP_KEY = "lib-settings";
private static LibSettings current;
/* =============== Browser settings =============== */
public final boolean useBookcase;
public final Set<String> autoScanDirs;
public final String searchBookQuery;
public final FileExtensionFilter allowedFileTypes;
public final CacheLocation cacheLocation;
public final boolean autoScanRemovableMedia;
public final boolean showScanningInMenu;
public final boolean showRemovableMediaInMenu;
public final boolean showNotifications;
private LibSettings() {
BackupManager.addAgent(this);
final SharedPreferences prefs = SettingsManager.prefs;
/* =============== Browser settings =============== */
useBookcase = USE_BOOK_CASE.getPreferenceValue(prefs);
autoScanDirs = AUTO_SCAN_DIRS.getPreferenceValue(prefs);
searchBookQuery = SEARCH_BOOK_QUERY.getPreferenceValue(prefs);
allowedFileTypes = FILE_TYPE_FILTER.getFilter(prefs);
cacheLocation = CACHE_LOCATION.getPreferenceValue(prefs);
autoScanRemovableMedia = AUTO_SCAN_REMOVABLE_MEDIA.getPreferenceValue(prefs);
showRemovableMediaInMenu = SHOW_REMOVABLE_MEDIA.getPreferenceValue(prefs);
showScanningInMenu = SHOW_SCANNING_MEDIA.getPreferenceValue(prefs);
showNotifications = SHOW_NOTIFICATIONS.getPreferenceValue(prefs);
}
/* =============== */
public static void init() {
current = new LibSettings();
}
public static LibSettings current() {
SettingsManager.lock.readLock().lock();
try {
return current;
} finally {
SettingsManager.lock.readLock().unlock();
}
}
public static void changeAutoScanDirs(final String dir, final boolean add) {
SettingsManager.lock.writeLock().lock();
try {
final Set<String> dirs = new HashSet<String>(current.autoScanDirs);
if (add && dirs.add(dir) || dirs.remove(dir)) {
final Editor edit = SettingsManager.prefs.edit();
LibPreferences.AUTO_SCAN_DIRS.setPreferenceValue(edit, dirs);
edit.commit();
final LibSettings oldSettings = current;
current = new LibSettings();
applySettingsChanges(oldSettings, current);
}
} finally {
SettingsManager.lock.writeLock().unlock();
}
}
public static void updateSearchBookQuery(final String searchQuery) {
SettingsManager.lock.writeLock().lock();
try {
final Editor edit = SettingsManager.prefs.edit();
LibPreferences.SEARCH_BOOK_QUERY.setPreferenceValue(edit, searchQuery);
edit.commit();
final LibSettings oldSettings = current;
current = new LibSettings();
applySettingsChanges(oldSettings, current);
} finally {
SettingsManager.lock.writeLock().unlock();
}
}
static Diff onSettingsChanged() {
final LibSettings oldLibSettings = current;
current = new LibSettings();
return applySettingsChanges(oldLibSettings, current);
}
public static LibSettings.Diff applySettingsChanges(final LibSettings oldSettings, final LibSettings newSettings) {
final LibSettings.Diff diff = new LibSettings.Diff(oldSettings, newSettings);
final ILibSettingsChangeListener l = SettingsManager.listeners.getListener();
l.onLibSettingsChanged(oldSettings, newSettings, diff);
return diff;
}
@Override
public String key() {
return BACKUP_KEY;
}
@Override
public JSONObject backup() {
return SettingsBackupHelper.backup(BACKUP_KEY, SettingsManager.prefs, LibPreferences.class);
}
@Override
public void restore(final JSONObject backup) {
SettingsBackupHelper.restore(BACKUP_KEY, SettingsManager.prefs, LibPreferences.class, backup);
onSettingsChanged();
}
public static class Diff {
private static final int D_UseBookcase = 0x0001 << 0;
private static final int D_AutoScanDirs = 0x0001 << 1;
private static final int D_AllowedFileTypes = 0x0001 << 2;
private static final int D_CacheLocation = 0x0001 << 3;
private static final int D_AutoScanMedia = 0x0001 << 4;
private int mask;
private final boolean firstTime;
public Diff(final LibSettings olds, final LibSettings news) {
firstTime = olds == null;
if (firstTime) {
mask = 0xFFFFFFFF;
} else if (news != null) {
if (olds.useBookcase != news.useBookcase) {
mask |= D_UseBookcase;
}
if (!olds.autoScanDirs.equals(news.autoScanDirs)) {
mask |= D_AutoScanDirs;
}
if (!olds.allowedFileTypes.equals(news.allowedFileTypes)) {
mask |= D_AllowedFileTypes;
}
if (olds.cacheLocation != news.cacheLocation) {
mask |= D_CacheLocation;
}
if (olds.autoScanRemovableMedia != news.autoScanRemovableMedia) {
mask |= D_AutoScanMedia;
}
}
}
public boolean isFirstTime() {
return firstTime;
}
public boolean isUseBookcaseChanged() {
return 0 != (mask & D_UseBookcase);
}
public boolean isAutoScanDirsChanged() {
return 0 != (mask & D_AutoScanDirs);
}
public boolean isAllowedFileTypesChanged() {
return 0 != (mask & D_AllowedFileTypes);
}
public boolean isCacheLocationChanged() {
return 0 != (mask & D_CacheLocation);
}
public boolean isAutoScanRemovableMediaChanged() {
return 0 != (mask & D_AutoScanMedia);
}
}
}