/*
* Copyright (C) 2012 The CyanogenMod Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.cyanogenmod.filemanager.preferences;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
import com.cyanogenmod.filemanager.FileManagerApplication;
import java.io.InvalidClassException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* A helper class for access and manage the preferences of the application.
*/
public final class Preferences {
private static final String TAG = "Preferences"; //$NON-NLS-1$
/**
* A variable that holds the term of the last textual search.
*/
private static String sLastSearch = ""; //$NON-NLS-1$
/**
* The name of the file manager settings file.
* @hide
*/
public static final String SETTINGS_FILENAME = "com.cyanogenmod.filemanager"; //$NON-NLS-1$
/**
* The list of configuration listeners.
*/
private static final List<ConfigurationListener> CONFIGURATION_LISTENERS =
Collections.synchronizedList(new ArrayList<ConfigurationListener>());
/**
* Constructor of <code>Preferences</code>.
*/
private Preferences() {
super();
}
/**
* Method that returns the last search do in the current application execution.
*
* @return String The last search do in the current application execution
*/
public static String getLastSearch() {
return sLastSearch;
}
/**
* Method that sets the last search do in the current application execution.
*
* @param lastSearch The last search do in the current application execution
*/
public static void setLastSearch(String lastSearch) {
Preferences.sLastSearch = lastSearch;
}
/**
* Method that initializes the defaults preferences of the application.
*/
public static void loadDefaults() {
//Sets the default preferences if no value is set yet
try {
Map<FileManagerSettings, Object> defaultPrefs =
new HashMap<FileManagerSettings, Object>();
FileManagerSettings[] values = FileManagerSettings.values();
int cc = values.length;
for (int i = 0; i < cc; i++) {
defaultPrefs.put(values[i], values[i].getDefaultValue());
}
savePreferences(defaultPrefs, false, true);
} catch (Exception ex) {
Log.e(TAG, "Save default settings fails", ex); //$NON-NLS-1$
}
}
/**
* Method that adds a new configuration listener.
*
* @param listener The new configuration listener
*/
public static void addConfigurationListener(ConfigurationListener listener) {
CONFIGURATION_LISTENERS.add(listener);
}
/**
* Method that removes the configuration listener.
*
* @param listener The configuration listener to be removed
*/
public static void removeConfigurationListener(ConfigurationListener listener) {
CONFIGURATION_LISTENERS.remove(listener);
}
/**
* Method that returns the shared preferences of the application.
*
* @return SharedPreferences The shared preferences of the application
* @hide
*/
public static SharedPreferences getSharedPreferences() {
return FileManagerApplication.getInstance().getSharedPreferences(
SETTINGS_FILENAME, Context.MODE_PRIVATE);
}
/**
* Method that saves a preference.
*
* @param pref The preference identifier
* @param value The value of the preference
* @param applied If the preference was applied
* @throws InvalidClassException If the value of the preference is not of the
* type of the preference
*/
public static void savePreference(FileManagerSettings pref, Object value, boolean applied)
throws InvalidClassException {
Map<FileManagerSettings, Object> prefs =
new HashMap<FileManagerSettings, Object>();
prefs.put(pref, value);
savePreferences(prefs, applied);
}
/**
* Method that saves the preferences passed as argument.
*
* @param prefs The preferences to be saved
* @param applied If the preference was applied
* @throws InvalidClassException If the value of a preference is not of the
* type of the preference
*/
public static void savePreferences(Map<FileManagerSettings, Object> prefs, boolean applied)
throws InvalidClassException {
savePreferences(prefs, true, applied);
}
/**
* Method that saves the preferences passed as argument.
*
* @param prefs The preferences to be saved
* @param noSaveIfExists No saves if the preference if has a value
* @param applied If the preference was applied
* @throws InvalidClassException If the value of a preference is not of the
* type of the preference
*/
private static void savePreferences(
Map<FileManagerSettings, Object> prefs, boolean noSaveIfExists, boolean applied)
throws InvalidClassException {
//Get the preferences editor
SharedPreferences sp = getSharedPreferences();
Editor editor = sp.edit();
//Save all settings
Iterator<FileManagerSettings> it = prefs.keySet().iterator();
while (it.hasNext()) {
FileManagerSettings pref = it.next();
if (!noSaveIfExists && sp.contains(pref.getId())) {
//The preference already has a value
continue;
}
//Known and valid types
Object value = prefs.get(pref);
if (value instanceof Boolean && pref.getDefaultValue() instanceof Boolean) {
editor.putBoolean(pref.getId(), ((Boolean)value).booleanValue());
} else if (value instanceof String && pref.getDefaultValue() instanceof String) {
editor.putString(pref.getId(), (String)value);
} else if (value instanceof ObjectIdentifier
&& pref.getDefaultValue() instanceof ObjectIdentifier) {
editor.putInt(pref.getId(), ((ObjectIdentifier)value).getId());
} else if (value instanceof ObjectStringIdentifier
&& pref.getDefaultValue() instanceof ObjectStringIdentifier) {
editor.putString(pref.getId(), ((ObjectStringIdentifier)value).getId());
} else {
//The object is not of the appropriate type
String msg = String.format(
"%s: %s", //$NON-NLS-1$
pref.getId(),
value.getClass().getName());
Log.e(TAG, String.format(
"Configuration error. InvalidClassException: %s", //$NON-NLS-1$
msg));
throw new InvalidClassException(msg);
}
}
//Commit settings
editor.commit();
//Now its time to communicate the configuration change
if (CONFIGURATION_LISTENERS != null && CONFIGURATION_LISTENERS.size() > 0) {
it = prefs.keySet().iterator();
while (it.hasNext()) {
FileManagerSettings pref = it.next();
Object value = prefs.get(pref);
int cc = CONFIGURATION_LISTENERS.size();
for (int i = 0; i < cc; i++) {
CONFIGURATION_LISTENERS.get(i).onConfigurationChanged(pref, value, applied);
}
}
}
}
}