package org.emdev.common.settings.backup; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.emdev.common.backup.BackupManager; import org.emdev.common.settings.base.BasePreferenceDefinition; import org.json.JSONException; import org.json.JSONObject; public class SettingsBackupHelper { private static final Map<Class<?>, List<BasePreferenceDefinition<?>>> defs = new HashMap<Class<?>, List<BasePreferenceDefinition<?>>>(); public static List<BasePreferenceDefinition<?>> getPreferences(final Class<?> preferences) { List<BasePreferenceDefinition<?>> list = defs.get(preferences); if (list == null) { list = new ArrayList<BasePreferenceDefinition<?>>(); final Field[] fields = preferences.getFields(); for (final Field field : fields) { final int m = field.getModifiers(); if (Modifier.isPublic(m) && Modifier.isStatic(m) && Modifier.isFinal(m)) { if (BasePreferenceDefinition.class.isAssignableFrom(field.getType())) { try { final BasePreferenceDefinition<?> value = (BasePreferenceDefinition<?>) field.get(null); list.add(value); } catch (final Throwable th) { } } } } defs.put(preferences, list); } return list; } public static JSONObject backup(final String key, final SharedPreferences prefs, final Class<?> prefDefs) { final JSONObject backup = new JSONObject(); final List<BasePreferenceDefinition<?>> list = SettingsBackupHelper.getPreferences(prefDefs); for (final BasePreferenceDefinition<?> p : list) { try { p.backup(backup, prefs); } catch (final JSONException ex) { BackupManager.LCTX.e("Error on [" + key + "] settings backup: " + ex.getMessage()); } } return backup; } public static void restore(final String key, final SharedPreferences prefs, final Class<?> prefDefs, final JSONObject backup) { final Editor edit = prefs.edit(); for (final BasePreferenceDefinition<?> p : getPreferences(prefDefs)) { try { p.restore(backup, edit); } catch (final JSONException ex) { BackupManager.LCTX.e("Error on [" + key + "] settings restore: " + ex.getMessage()); } } edit.commit(); } }