package io.evercam.androidapp.authentication;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.content.ContentResolver;
import android.content.Context;
import android.os.Bundle;
import java.util.ArrayList;
import io.evercam.androidapp.R;
import io.evercam.androidapp.dto.AppData;
import io.evercam.androidapp.dto.AppUser;
public class EvercamAccount
{
public static final String KEY_USERNAME = "username";
public static final String KEY_COUNTRY = "country";
public static final String KEY_API_KEY = "apiKey";
public static final String KEY_API_ID = "apiId";
public static final String KEY_IS_DEFAULT = "isDefault";
public static final String KEY_FIRSTNAME = "firstName";
public static final String KEY_LASTNAME = "lastName";
private final String TAG = "EvercamAccount";
private final String TRUE = "true";
private Context mContext;
private final AccountManager mAccountManager;
public EvercamAccount(Context context)
{
mContext = context;
mAccountManager = AccountManager.get(mContext);
}
public void add(AppUser newUser)
{
final Account account = getAccountByEmail(newUser.getEmail());
mAccountManager.addAccountExplicitly(account, null, null);
mAccountManager.setAuthToken(account, KEY_API_KEY, newUser.getApiKey());
mAccountManager.setAuthToken(account, KEY_API_ID, newUser.getApiId());
mAccountManager.setUserData(account, KEY_USERNAME, newUser.getUsername());
mAccountManager.setUserData(account, KEY_COUNTRY, newUser.getCountry());
mAccountManager.setUserData(account, KEY_FIRSTNAME, newUser.getFirstName());
mAccountManager.setUserData(account, KEY_LASTNAME, newUser.getLastName());
mAccountManager.setUserData(account, KEY_IS_DEFAULT, String.valueOf(newUser.getIsDefault
()));
//Always set the new user as default user
updateDefaultUser(newUser.getEmail());
}
public void remove(final String email, AccountManagerCallback<Boolean> callback)
{
final Account account = getAccountByEmail(email);
String isDefaultString = mAccountManager.getUserData(account, KEY_IS_DEFAULT);
//If removing default user, clear the static user object
if(isDefaultString.equals(TRUE))
{
AppData.defaultUser = null;
}
mAccountManager.removeAccount(account, callback, null);
}
public Account getAccountByEmail(String email)
{
return new Account(email, mContext.getString(R.string.account_type));
}
public AppUser retrieveUserByEmail(String email)
{
Account account = getAccountByEmail(email);
//Start to sync camera list (Disabled because it doesn't need to be synced when the app
// starts)
//startSync(account);
return retrieveUserDetailFromAccount(account);
}
public ArrayList<AppUser> retrieveUserList()
{
ArrayList<AppUser> userList = new ArrayList<>();
Account[] accounts = mAccountManager.getAccountsByType(mContext.getString(R.string
.account_type));
int defaultCount = 0;
if(accounts.length > 0)
{
for(Account account : accounts)
{
AppUser appUser = retrieveUserByEmail(account.name);
if(appUser.getIsDefault())
{
defaultCount++;
}
userList.add(appUser);
}
//If default user doesn't exist, or more than 1, reset default user
if(defaultCount != 1)
{
AppUser newDefaultUser = userList.get(0);
String defaultUserEmail = newDefaultUser.getEmail();
updateDefaultUser(defaultUserEmail);
AppData.appUsers = retrieveUserList();
return AppData.appUsers;
}
}
AppData.appUsers = userList;
return userList;
}
public AppUser retrieveUserDetailFromAccount(Account account)
{
String apiKey = mAccountManager.peekAuthToken(account, KEY_API_KEY);
String apiId = mAccountManager.peekAuthToken(account, KEY_API_ID);
String username = mAccountManager.getUserData(account, KEY_USERNAME);
String country = mAccountManager.getUserData(account, KEY_COUNTRY);
String firstName = mAccountManager.getUserData(account, KEY_FIRSTNAME);
String lastName = mAccountManager.getUserData(account, KEY_LASTNAME);
String isDefaultString = mAccountManager.getUserData(account, KEY_IS_DEFAULT);
AppUser appUser = new AppUser();
appUser.setEmail(account.name);
appUser.setApiKeyPair(apiKey, apiId);
appUser.setUsername(username);
appUser.setCountry(country);
appUser.setFirstName(firstName);
appUser.setLastName(lastName);
if(isDefaultString != null && isDefaultString.equals(TRUE))
{
appUser.setIsDefault(true);
AppData.defaultUser = appUser;
}
return appUser;
}
public AppUser getDefaultUser()
{
ArrayList<AppUser> userList = retrieveUserList();
if(userList.size() > 0)
{
for(AppUser appUser : userList)
{
if(appUser.getIsDefault())
{
return appUser;
}
}
}
return null;
}
public void updateDefaultUser(String defaultEmail)
{
Account[] accounts = mAccountManager.getAccountsByType(mContext.getString(R.string
.account_type));
if(accounts.length > 0)
{
for(Account account : accounts)
{
String email = account.name;
if(email.equals(defaultEmail))
{
mAccountManager.setUserData(account, KEY_IS_DEFAULT, TRUE);
AppData.defaultUser = retrieveUserByEmail(email);
}
else
{
mAccountManager.setUserData(account, KEY_IS_DEFAULT, "");
}
}
}
}
private void startSync(Account account)
{
final int SYNC_INTERVAL = 3600 * 6;
final String AUTHORITY = mContext.getString(R.string.content_provider_authorities);
//Force request a sync and also enable the auto sync
Bundle bundle = new Bundle();
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
ContentResolver.requestSync(account, AUTHORITY, bundle);
ContentResolver.setSyncAutomatically(account, AUTHORITY, true);
ContentResolver.addPeriodicSync(account, AUTHORITY, Bundle.EMPTY, SYNC_INTERVAL);
}
}