package fr.ydelouis.selfoss.config.model;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.Context;
import org.androidannotations.annotations.AfterInject;
import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.RootContext;
import org.androidannotations.annotations.SystemService;
import fr.ydelouis.selfoss.BuildConfig;
import fr.ydelouis.selfoss.model.DatabaseHelper;
import fr.ydelouis.selfoss.sync.SyncManager;
@EBean
public class ConfigManager {
public static final String ACCOUNT_TYPE = BuildConfig.ACCOUNT_TYPE;
private static final String KEY_USERNAME = "username";
private static final String KEY_SYNC_PERIOD = "syncPeriod";
private static final String KEY_TRUST_ALL_CERTIFICATES = "trustAllCertificates";
private static final String KEY_USE_HTTPS = "useHttps";
private static final String KEY_SYNC_OVER_WIFI_ONLY = "syncOverWifiOnly";
@SystemService protected AccountManager accountManager;
@RootContext protected Context context;
private DatabaseHelper databaseHelper;
@AfterInject
protected void init() {
databaseHelper = new DatabaseHelper(context);
}
public void save(Config config) {
Account account = getAccount();
if (account != null && !account.name.equals(config.getUrl())) {
remove(account);
account = null;
}
if (account == null) {
account = new Account(config.getUrl(), ACCOUNT_TYPE);
accountManager.addAccountExplicitly(account, config.getPassword(), null);
}
accountManager.setUserData(account, KEY_USERNAME, config.getUsername());
accountManager.setUserData(account, KEY_USE_HTTPS, String.valueOf(config.useHttps()));
accountManager.setUserData(account, KEY_TRUST_ALL_CERTIFICATES, String.valueOf(config.trustAllCertificates()));
accountManager.setUserData(account, KEY_SYNC_PERIOD, String.valueOf(config.getSyncPeriod()));
accountManager.setUserData(account, KEY_SYNC_OVER_WIFI_ONLY, String.valueOf(config.syncOverWifiOnly()));
SyncManager.setPeriodicSync(this, config);
}
public Config get() {
Account account = getAccount();
Config config = null;
if (account != null) {
config = new Config();
config.setUrl(account.name);
config.setTrustAllCertificates(Boolean.valueOf(accountManager.getUserData(account, KEY_TRUST_ALL_CERTIFICATES)));
config.setUsername(accountManager.getUserData(account, KEY_USERNAME));
config.setPassword(accountManager.getPassword(account));
config.setUseHttps(Boolean.valueOf(accountManager.getUserData(account, KEY_USE_HTTPS)));
config.setSyncOverWifiOnly(Boolean.valueOf(accountManager.getUserData(account, KEY_SYNC_OVER_WIFI_ONLY)));
String syncPeriod = accountManager.getUserData(account, KEY_SYNC_PERIOD);
if (syncPeriod != null) {
config.setSyncPeriod(Long.valueOf(syncPeriod));
}
}
return config;
}
public Account getAccountForConfig(Config config) {
Account[] accounts = accountManager.getAccountsByType(ACCOUNT_TYPE);
for (Account account : accounts) {
if (account.name.equals(config.getUrl())) {
return account;
}
}
return null;
}
public Account getAccount() {
Account[] accounts = accountManager.getAccountsByType(ACCOUNT_TYPE);
if (accounts.length > 0) {
return accounts[0];
}
return null;
}
private void remove(Account account) {
accountManager.removeAccount(account, null, null);
databaseHelper.clearTables();
}
}