package com.gettingmobile.goodnews.backup; import android.app.backup.BackupDataInputStream; import android.app.backup.BackupDataOutput; import android.app.backup.SharedPreferencesBackupHelper; import android.content.Context; import android.content.SharedPreferences; import android.os.ParcelFileDescriptor; import android.util.Log; import com.gettingmobile.goodnews.settings.Settings; import java.util.Map; import java.util.Set; class SettingsBackupHelper extends SharedPreferencesBackupHelper { private static final String LOG_TAG = "goodnews.Backup"; private static final String BACKUP_PREFERENCES_SUFFIX = "_preferences_backup"; private final Context context; SettingsBackupHelper(Context context) { super(context, context.getPackageName() + BACKUP_PREFERENCES_SUFFIX); this.context = context; } private void copyPreferences(SharedPreferences from, SharedPreferences to, boolean clear) { Log.d(LOG_TAG, "Copying preferences"); final SharedPreferences.Editor editor = to.edit(); if (clear) editor.clear(); final Map<String, ?> entries = from.getAll(); for (Map.Entry<String, ?> entry : entries.entrySet()) { final String key = entry.getKey(); final Object value = entry.getValue(); if (value instanceof Boolean) { editor.putBoolean(key, (Boolean) value); } else if (value instanceof Float) { editor.putFloat(key, (Float) value); } else if (value instanceof Integer) { editor.putInt(key, (Integer) value); } else if (value instanceof Long) { editor.putLong(key, (Long) value); } else if (value instanceof String) { editor.putString(key, (String) value); } else if (value instanceof Set) { //noinspection unchecked editor.putStringSet(key, (Set<String>) value); } else { Log.w(LOG_TAG, "Value " + key + " of unsupported type " + (value != null ? value.getClass().getName() : "null")); } } editor.commit(); } @Override public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) { /* * copy original preferences to backup preferences and backup those */ copyPreferences(Settings.getDefaultPreferences(context), Settings.getPreferences(context, BACKUP_PREFERENCES_SUFFIX), true); /* * call base implementation which will backup the backup-file */ super.performBackup(oldState, data, newState); } @Override public void restoreEntity(BackupDataInputStream data) { /* * restore the backup file */ super.restoreEntity(data); /* * read the backup file and populate the preferences */ copyPreferences(Settings.getPreferences(context, BACKUP_PREFERENCES_SUFFIX), Settings.getDefaultPreferences(context), false); } }