package it.fdev.unisaconnect.data;
import it.fdev.encryptionUtils.CryptoMan_2;
import it.fdev.unisaconnect.MainActivity;
import it.fdev.utils.MyFragmentInterface;
import it.fdev.utils.ObjectSerializer;
import it.fdev.utils.Utils;
import java.io.Serializable;
import java.util.Date;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
import com.securepreferences.SecurePreferences;
/**
* Gestisce i dati salvati nelle sharedpreferences
* Cifra username e password
* @author francesco
*
*/
public class SharedPrefDataManager {
public static final String SSID_STUDENTI = "Studenti";
private SharedPreferences mPrefs = null;
private SecurePreferences mSecurePrefs = null;
private static final String PREFERENCES_KEY = "PREFERENCES";
// Boot Fragment
private static final String PREF_BOOTABLE_FRAGMENT = "bootableFragment";
// Login
private static final String PREF_USER = "user";
private static final String PREF_PASS = "pass";
private static final String PREF_TIPO_CORSO = "tipoCorso";
private static final String PREF_AUTOLOGIN = "loginAutomatica";
private static final String PREF_NOME_COGNOME = "nomeCognome";
// Mensa
private static final String PREF_MENU_MENSA = "menu";
// Weather
private static final String PREF_WEATHER = "weather";
// Presenze
private static final String PREF_PRESENZE = "presenze";
// Appelli
private static final String PREF_APPELLI = "appelli";
// Libretto
private static final String PREF_LIBRETTO_DATE = "libretto_date";
private static final String PREF_LIBRETTO_SORT_BY_NAME = "libretto_sort_by_name";
// Pagamenti
private static final String PREF_PAGAMENTI = "pagamenti";
// Biblioteca
private static final String PREF_BIBLIO_LAST_SEARCH = "biblio_last_search";
// Webmail
private static final String PREF_MAIL_DO_CHECK = "webmail_do_check";
private static final String PREF_MAIL_LAST_READ = "webmail_last_read";
// Testing
private static final String PREF_TESTING_ENABLED = "testingEnabled";
// Crypto
private static final String PREF_ENCRYPTION_VERSION = "encryptionVersion";
private static final int CRYPTO_VERSION = 4; // 2=0.5 3=0.6.2 4=0.6.9
public SharedPrefDataManager(Context context) {
mSecurePrefs = new SecurePreferences(context);
mPrefs = context.getSharedPreferences(PREFERENCES_KEY, Context.MODE_PRIVATE);
int cVersion = mPrefs.getInt(PREF_ENCRYPTION_VERSION, CRYPTO_VERSION);
if (cVersion < CRYPTO_VERSION) {
updateDataToCurrentVersion();
}
mPrefs.edit().putInt(PREF_ENCRYPTION_VERSION, CRYPTO_VERSION).commit();
}
public void updateDataToCurrentVersion() {
try {
if (CRYPTO_VERSION == 4) { //Intro to securepreferences
if (mSecurePrefs.getString(PREF_USER, null)!=null && mSecurePrefs.getString(PREF_PASS, null)!=null) {
return;
}
String username, password;
String userCod = mPrefs.getString(PREF_USER, null);
String passCod = mPrefs.getString(PREF_PASS, null);
if (userCod != null && passCod != null) {
username = CryptoMan_2.decrypt(userCod);
password = CryptoMan_2.decrypt(passCod);
} else {
username = null;
password = null;
removeData();
}
if (username==null || password==null) {
return;
}
Editor editor = mPrefs.edit();
editor.remove(PREF_USER);
editor.remove(PREF_PASS);
editor.commit();
com.securepreferences.SecurePreferences.Editor secureEditor = mSecurePrefs.edit();
secureEditor.putString(PREF_USER, username);
secureEditor.putString(PREF_PASS, password);
secureEditor.commit();
}
} catch(Exception e) {
Log.e(Utils.TAG, "Exception converting to secureEditor", e);
removeData();
}
}
//Controlla che siano stati precedentemente salvati i dati di login
public boolean loginDataExists() {
return (mSecurePrefs.contains(PREF_USER) && getUser()!=null &&
mSecurePrefs.contains(PREF_PASS) && getPass()!=null &&
mPrefs.contains(PREF_AUTOLOGIN));
}
private void removeData() {
Log.d(Utils.TAG, "DataManager vacuum preferences");
Editor editor = mPrefs.edit();
editor.clear().commit();
}
public String getUser() {
return mSecurePrefs.getString(PREF_USER, null);
}
public void setUser(String user) {
user = (user.contains("@") ? user.substring(0,user.lastIndexOf("@")) : user); //elimino la @ e seguito
com.securepreferences.SecurePreferences.Editor secureEditor = mSecurePrefs.edit();
secureEditor.putString(PREF_USER, user);
secureEditor.commit();
}
public String getPass() {
return mSecurePrefs.getString(PREF_PASS, null);
}
public void setPass(String pass) {
com.securepreferences.SecurePreferences.Editor secureEditor = mSecurePrefs.edit();
secureEditor.putString(PREF_PASS, pass);
secureEditor.commit();
}
public int getTipoCorso() {
return mPrefs.getInt(PREF_TIPO_CORSO, 1);
}
public void setTipoCorso(int tipoCorso) {
saveField(PREF_TIPO_CORSO, tipoCorso);
}
public boolean isLoginAutomatica() {
return mPrefs.getBoolean(PREF_AUTOLOGIN, true);
}
public void setLoginAutomatica(boolean loginAutomatica) {
saveField(PREF_AUTOLOGIN, loginAutomatica);
}
public boolean isTestingingEnabled() {
return mPrefs.getBoolean(PREF_TESTING_ENABLED, MainActivity.isTestingAPK);
}
public void setTestingEnabled(boolean testingEnabled) {
saveField(PREF_TESTING_ENABLED, testingEnabled);
}
public String getNomeCognome() {
return mPrefs.getString(PREF_NOME_COGNOME, null);
}
public void setNomeCognome(String nomeCognome) {
saveField(PREF_NOME_COGNOME, nomeCognome);
}
public MenuMensa getMenuMensa() {
return (MenuMensa) ObjectSerializer.deserialize(mPrefs.getString(PREF_MENU_MENSA, null));
}
public void setMenuMensa(MenuMensa menuMensa) {
saveField(PREF_MENU_MENSA, menuMensa);
}
public WeatherData getWeather() {
return (WeatherData) ObjectSerializer.deserialize(mPrefs.getString(PREF_WEATHER, null));
}
public void setWeather(WeatherData weather) {
saveField(PREF_WEATHER, weather);
}
public Presenze getPresenze() {
return (Presenze) ObjectSerializer.deserialize(mPrefs.getString(PREF_PRESENZE, null));
}
public void setPresenze(Presenze presenze) {
saveField(PREF_PRESENZE, presenze);
}
public Date getLibrettoFetchDate() {
return new Date(mPrefs.getLong(PREF_LIBRETTO_DATE, 0));
}
public void setLibrettoFetchDate(Date librettoFetchDate) {
saveField(PREF_LIBRETTO_DATE, librettoFetchDate.getTime());
}
public boolean getLibrettoSortByName() {
return mPrefs.getBoolean(PREF_LIBRETTO_SORT_BY_NAME, true);
}
public void setLibrettoSortByName(boolean librettoSortByName) {
saveField(PREF_LIBRETTO_SORT_BY_NAME, librettoSortByName);
}
public Appelli getAppelli() {
return (Appelli) ObjectSerializer.deserialize(mPrefs.getString(PREF_APPELLI, null));
}
public void setAppelli(Appelli appelli) {
saveField(PREF_APPELLI, appelli);
}
public Pagamenti getPagamenti() {
return (Pagamenti) ObjectSerializer.deserialize(mPrefs.getString(PREF_PAGAMENTI, null));
}
public void setPagamenti(Pagamenti pagamenti) {
saveField(PREF_PAGAMENTI, pagamenti);
}
public String getBiblioLastSearch() {
return mPrefs.getString(PREF_BIBLIO_LAST_SEARCH, "");
}
public void setBiblioLastSearch(String lastSearch) {
saveField(PREF_BIBLIO_LAST_SEARCH, lastSearch);
}
public boolean getMailDoCheck() {
return mPrefs.getBoolean(PREF_MAIL_DO_CHECK, true);
}
public void setMailDoCheck(boolean doCheck) {
saveField(PREF_MAIL_DO_CHECK, doCheck);
}
public Date getMailLastRead() {
return new Date(mPrefs.getLong(PREF_MAIL_LAST_READ, 0));
}
public void setMailLastRead(Date lastReadDate) {
saveField(PREF_MAIL_LAST_READ, lastReadDate.getTime());
}
public Class<? extends MyFragmentInterface> getBootFragmentClass() {
return MainActivity.fragmentsIDs.get(mPrefs.getInt(PREF_BOOTABLE_FRAGMENT, 0));
}
public void setBootFragmentClass(Class<? extends MyFragmentInterface> bootFragmentClass) {
// editor.putInt(PREF_BOOTABLE_FRAGMENT, Math.max(MainActivity.BootableFragmentsEnum.indexOf(bootFragmentClass), 0));
// saveField(PREF_BOOTABLE_FRAGMENT, Math.max(MainActivity.BootableFragmentsEnum.indexOf(bootFragmentClass), 0)));
}
private boolean saveField(String field, Object value) {
Editor editor = mPrefs.edit();
try {
if (value instanceof Integer) {
editor.putInt(field, (Integer) value);
} else if (value instanceof Long) {
editor.putLong(field, (Long) value);
} else if (value instanceof String) {
editor.putString(field, (String) value);
} else if (value instanceof Boolean) {
editor.putBoolean(field, (Boolean) value);
} else {
editor.putString(field, ObjectSerializer.serialize((Serializable) value));
}
} catch(Exception e) {
Log.e(Utils.TAG, "Eccezione codificando i dati...resetto: " + field, e);
editor.remove(field);
return false;
} finally {
editor.commit();
}
return true;
}
}