package org.fedorahosted.freeotp;
import java.lang.reflect.Type;
import java.util.LinkedList;
import java.util.List;
import org.fedorahosted.freeotp.Token.TokenUriInvalidException;
import android.content.Context;
import android.content.SharedPreferences;
import android.net.Uri;
import android.widget.Toast;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;
public class TokenPersistence {
private static final String NAME = "tokens";
private static final String ORDER = "tokenOrder";
private final SharedPreferences prefs;
private final Gson gson;
private List<String> getTokenOrder() {
Type type = new TypeToken<List<String>>(){}.getType();
String str = prefs.getString(ORDER, "[]");
List<String> order = gson.fromJson(str, type);
return order == null ? new LinkedList<String>() : order;
}
private SharedPreferences.Editor setTokenOrder(List<String> order) {
return prefs.edit().putString(ORDER, gson.toJson(order));
}
public static Token addWithToast(Context ctx, String uri) {
try {
Token token = new Token(uri);
new TokenPersistence(ctx).add(token);
return token;
} catch (TokenUriInvalidException e) {
Toast.makeText(ctx, R.string.invalid_token, Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
return null;
}
public TokenPersistence(Context ctx) {
prefs = ctx.getApplicationContext().getSharedPreferences(NAME, Context.MODE_PRIVATE);
gson = new Gson();
}
public int length() {
return getTokenOrder().size();
}
public Token get(int position) {
String key = getTokenOrder().get(position);
String str = prefs.getString(key, null);
try {
return gson.fromJson(str, Token.class);
} catch (JsonSyntaxException jse) {
// Backwards compatibility for URL-based persistence.
try {
return new Token(str, true);
} catch (TokenUriInvalidException tuie) {
tuie.printStackTrace();
}
}
return null;
}
public void add(Token token) throws TokenUriInvalidException {
String key = token.getID();
if (prefs.contains(key))
return;
List<String> order = getTokenOrder();
order.add(0, key);
setTokenOrder(order).putString(key, gson.toJson(token)).apply();
}
public void move(int fromPosition, int toPosition) {
if (fromPosition == toPosition)
return;
List<String> order = getTokenOrder();
if (fromPosition < 0 || fromPosition > order.size())
return;
if (toPosition < 0 || toPosition > order.size())
return;
order.add(toPosition, order.remove(fromPosition));
setTokenOrder(order).apply();
}
public void delete(int position) {
List<String> order = getTokenOrder();
String key = order.remove(position);
setTokenOrder(order).remove(key).apply();
}
public void save(Token token) {
prefs.edit().putString(token.getID(), gson.toJson(token)).apply();
}
}