package com.seafile.seadroid2.account; import android.content.Context; import android.content.SharedPreferences; import android.text.TextUtils; import com.google.common.collect.Lists; import com.seafile.seadroid2.cameraupload.CameraUploadManager; import com.seafile.seadroid2.data.ServerInfo; import java.util.ArrayList; import java.util.List; /** * Account Manager.<br> * note the differences between {@link Account} and {@link AccountInfo}<br> */ public class AccountManager { @SuppressWarnings("unused") private static String DEBUG_TAG = "AccountManager"; public static final String SHARED_PREF_NAME = "latest_account"; public static final String SHARED_PREF_ACCOUNT_NAME = "com.seafile.seadroid.account_name"; /** used to manage multi Accounts when user switch between different Accounts */ private SharedPreferences actMangeSharedPref; private SharedPreferences.Editor editor; private android.accounts.AccountManager accountManager; private Context ctx; public AccountManager(Context context) { this.ctx = context; accountManager = android.accounts.AccountManager.get(context); // used to manage multi Accounts when user switch between different Accounts actMangeSharedPref = ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); editor = actMangeSharedPref.edit(); // migrate old accounts AccountDBHelper.migrateAccounts(context); } public List<Account> getAccountList() { List<Account> list = new ArrayList<Account>(); android.accounts.Account availableAccounts[] = accountManager.getAccountsByType(Account.ACCOUNT_TYPE); for (int i = 0; i < availableAccounts.length; i++) { Account a = getSeafileAccount(availableAccounts[i]); list.add(a); } return list; } public List<Account> getSignedInAccountList() { List<Account> list = new ArrayList<Account>(); android.accounts.Account availableAccounts[] = accountManager.getAccountsByType(Account.ACCOUNT_TYPE); for (int i = 0; i < availableAccounts.length; i++) { Account a = getSeafileAccount(availableAccounts[i]); if (a.hasValidToken()) list.add(a); } return list; } public Account getCurrentAccount() { String name = actMangeSharedPref.getString(SHARED_PREF_ACCOUNT_NAME, null); if (name != null) { List<Account> list = getAccountList(); for(Account a: list) { if (a.hasValidToken() && a.getSignature().equals(name)) { return a; } } } return null; } public Account getSeafileAccount(android.accounts.Account androidAccount) { String server = accountManager.getUserData(androidAccount, Authenticator.KEY_SERVER_URI); String email = accountManager.getUserData(androidAccount, Authenticator.KEY_EMAIL); boolean is_shib = accountManager.getUserData(androidAccount, Authenticator.KEY_SHIB) != null; String token = accountManager.peekAuthToken(androidAccount, Authenticator.AUTHTOKEN_TYPE); return new Account(server, email, token, is_shib); } public void setServerInfo(Account account, ServerInfo serverInfo) { accountManager.setUserData(account.getAndroidAccount(), Authenticator.KEY_SERVER_URI, serverInfo.getUrl()); accountManager.setUserData(account.getAndroidAccount(), Authenticator.KEY_SERVER_VERSION, serverInfo.getVersion()); accountManager.setUserData(account.getAndroidAccount(), Authenticator.KEY_SERVER_FEATURES, serverInfo.getFeatures()); } /** * Return cached ServerInfo * * @param account * @return ServerInfo. Will never be null. */ public ServerInfo getServerInfo(Account account) { String server = accountManager.getUserData(account.getAndroidAccount(), Authenticator.KEY_SERVER_URI); String version = accountManager.getUserData(account.getAndroidAccount(), Authenticator.KEY_SERVER_VERSION); String features = accountManager.getUserData(account.getAndroidAccount(), Authenticator.KEY_SERVER_FEATURES); ServerInfo info = new ServerInfo(server, version, features); return info; } /** * save current Account info to SharedPreference<br> * <strong>current</strong> means the Account is now in using at the foreground if has multiple accounts * * @param accountName */ public void saveCurrentAccount(String accountName) { editor.putString(SHARED_PREF_ACCOUNT_NAME, accountName); editor.commit(); } /** * when user sign out, delete authorized information of the current Account instance.<br> * If Camera Upload Service is running under the Account, stop the service. * */ public void signOutAccount(Account account) { if (account == null || TextUtils.isEmpty(account.getToken())) { return; } CameraUploadManager cameraManager = new CameraUploadManager(ctx); accountManager.invalidateAuthToken(Account.ACCOUNT_TYPE, account.getToken()); // disable camera upload if on this account Account camAccount = cameraManager.getCameraAccount(); if (camAccount != null && camAccount.equals(account)) { cameraManager.disableCameraUpload(); } } /** * get all email texts from database in order to auto complete email address * * @return */ public ArrayList<String> getAccountAutoCompleteTexts() { ArrayList<String> autoCompleteTexts = Lists.newArrayList(); List<Account> accounts = getAccountList(); if (accounts == null) return null; for (Account act : accounts) { if (!autoCompleteTexts.contains(act.getEmail())) autoCompleteTexts.add(act.getEmail()); } return autoCompleteTexts; } }