package com.fsck.k9.preferences;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import android.os.SystemClock;
import timber.log.Timber;
public class StorageEditor {
private Storage storage;
private Map<String, String> changes = new HashMap<String, String>();
private List<String> removals = new ArrayList<String>();
Map<String, String> snapshot = new HashMap<String, String>();
StorageEditor(Storage storage) {
this.storage = storage;
snapshot.putAll(storage.getAll());
}
public void copy(android.content.SharedPreferences input) {
Map < String, ? > oldVals = input.getAll();
for (Entry < String, ? > entry : oldVals.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (key != null && value != null) {
Timber.d("Copying key '%s', value '%s'", key, value);
changes.put(key, "" + value);
} else {
Timber.d("Skipping copying key '%s', value '%s'", key, value);
}
}
}
public boolean commit() {
try {
commitChanges();
return true;
} catch (Exception e) {
Timber.e(e, "Failed to save preferences");
return false;
}
}
private void commitChanges() {
long startTime = SystemClock.elapsedRealtime();
Timber.i("Committing preference changes");
Runnable committer = new Runnable() {
public void run() {
for (String removeKey : removals) {
storage.remove(removeKey);
}
Map<String, String> insertables = new HashMap<String, String>();
for (Entry<String, String> entry : changes.entrySet()) {
String key = entry.getKey();
String newValue = entry.getValue();
String oldValue = snapshot.get(key);
if (removals.contains(key) || !newValue.equals(oldValue)) {
insertables.put(key, newValue);
}
}
storage.put(insertables);
}
};
storage.doInTransaction(committer);
long endTime = SystemClock.elapsedRealtime();
Timber.i("Preferences commit took %d ms", endTime - startTime);
}
public StorageEditor putBoolean(String key,
boolean value) {
changes.put(key, "" + value);
return this;
}
public StorageEditor putInt(String key, int value) {
changes.put(key, "" + value);
return this;
}
public StorageEditor putLong(String key, long value) {
changes.put(key, "" + value);
return this;
}
public StorageEditor putString(String key, String value) {
if (value == null) {
remove(key);
} else {
changes.put(key, value);
}
return this;
}
public StorageEditor remove(String key) {
removals.add(key);
return this;
}
}