package com.thefinestartist.utils.preferences;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.util.Base64;
import com.thefinestartist.Base;
import com.thefinestartist.utils.etc.APILevel;
import com.thefinestartist.utils.log.LogHelper;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Set;
/**
* PreferencesUtil helps to manage application-wide {@link SharedPreferences} conveniently.
*
* @author Robin Gustafsson
*/
public class PreferencesUtil {
private static final LogHelper LogHelper = new LogHelper(PreferencesUtil.class);
private static String defaultName = PreferencesUtil.class.getCanonicalName();
private static SharedPreferences getPreferences(String name) {
return Base.getContext().getSharedPreferences(name, Context.MODE_PRIVATE);
}
public static String getDefaultName() {
return defaultName;
}
public static void setDefaultName(String name) {
defaultName = name;
}
public static boolean get(String key, boolean defValue) {
return get(defaultName, key, defValue);
}
public static int get(String key, int defValue) {
return get(defaultName, key, defValue);
}
public static float get(String key, float defValue) {
return get(defaultName, key, defValue);
}
public static long get(String key, long defValue) {
return get(defaultName, key, defValue);
}
public static String get(String key, String defValue) {
return get(defaultName, key, defValue);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static Set<String> get(String key, Set<String> defValue) {
return get(defaultName, key, defValue);
}
@TargetApi(Build.VERSION_CODES.FROYO)
public static <C extends Serializable> C get(String key, C defValue) {
return get(defaultName, key, defValue);
}
public static boolean get(String name, String key, boolean defValue) {
return getPreferences(name).getBoolean(key, defValue);
}
public static int get(String name, String key, int defValue) {
return getPreferences(name).getInt(key, defValue);
}
public static float get(String name, String key, float defValue) {
return getPreferences(name).getFloat(key, defValue);
}
public static long get(String name, String key, long defValue) {
return getPreferences(name).getLong(key, defValue);
}
public static String get(String name, String key, String defValue) {
return getPreferences(name).getString(key, defValue);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static Set<String> get(String name, String key, Set<String> defValue) {
return getPreferences(name).getStringSet(key, defValue);
}
@TargetApi(Build.VERSION_CODES.FROYO)
public static <C extends Serializable> C get(String name, String key, C defValue) {
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
C result = defValue;
String value = getPreferences(name).getString(key, null);
if (value != null) {
try {
byte[] decoded = Base64.decode(value.getBytes(), Base64.DEFAULT);
bais = new ByteArrayInputStream(decoded);
ois = new ObjectInputStream(bais);
result = (C) ois.readObject();
} catch (Exception e) {
LogHelper.e(e);
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
LogHelper.e(e);
}
}
if (bais != null) {
try {
bais.close();
} catch (IOException e) {
LogHelper.e(e);
}
}
}
}
return result;
}
public static void put(String key, boolean value) {
put(defaultName, key, value);
}
public static void put(String key, int value) {
put(defaultName, key, value);
}
public static void put(String key, float value) {
put(defaultName, key, value);
}
public static void put(String key, long value) {
put(defaultName, key, value);
}
public static void put(String key, String value) {
put(defaultName, key, value);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static void put(String key, Set<String> value) {
put(defaultName, key, value);
}
@TargetApi(Build.VERSION_CODES.FROYO)
public static <C extends Serializable> void put(String key, C value) {
put(defaultName, key, value);
}
public static void put(String name, String key, boolean value) {
if (APILevel.require(9))
getPreferences(name).edit().putBoolean(key, value).apply();
else
getPreferences(name).edit().putBoolean(key, value).commit();
}
public static void put(String name, String key, int value) {
if (APILevel.require(9))
getPreferences(name).edit().putInt(key, value).apply();
else
getPreferences(name).edit().putInt(key, value).commit();
}
public static void put(String name, String key, float value) {
if (APILevel.require(9))
getPreferences(name).edit().putFloat(key, value).apply();
else
getPreferences(name).edit().putFloat(key, value).commit();
}
public static void put(String name, String key, long value) {
if (APILevel.require(9))
getPreferences(name).edit().putLong(key, value).apply();
else
getPreferences(name).edit().putLong(key, value).commit();
}
public static void put(String name, String key, String value) {
if (APILevel.require(9))
getPreferences(name).edit().putString(key, value).apply();
else
getPreferences(name).edit().putString(key, value).commit();
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static void put(String name, String key, Set<String> value) {
if (APILevel.require(9))
getPreferences(name).edit().putStringSet(key, value).apply();
else
getPreferences(name).edit().putStringSet(key, value).commit();
}
@TargetApi(Build.VERSION_CODES.FROYO)
public static <C extends Serializable> void put(String name, String key, C value) {
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(value);
byte[] encoded = Base64.encode(baos.toByteArray(), Base64.DEFAULT);
if (APILevel.require(9))
getPreferences(name).edit().putString(key, new String(encoded)).apply();
else
getPreferences(name).edit().putString(key, new String(encoded)).commit();
} catch (IOException e) {
LogHelper.e(e);
throw new RuntimeException(e);
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
LogHelper.e(e);
}
}
if (baos != null) {
try {
baos.close();
} catch (IOException e) {
LogHelper.e(e);
}
}
}
}
public static void remove(String key) {
remove(defaultName, key);
}
public static void remove(String name, String key) {
if (APILevel.require(9))
getPreferences(name).edit().remove(key).apply();
else
getPreferences(name).edit().remove(key).commit();
}
public static void clear() {
clear(defaultName);
}
public static void clear(String name) {
if (APILevel.require(9))
getPreferences(name).edit().clear().apply();
else
getPreferences(name).edit().clear().commit();
}
}