Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Disallow multiple accounts in AccountManager

I've implemented my AccountManager authenticator and the service and the whole deal and it all seems to be working fine.

There is, however, one little problem: I only want a single account for my app to exist in account manager, but can't quite seem to find a way to limit this.

Is my only solution to do a search and delete the current accounts (by type) before adding the new account?

My current code:

private void removeAccounts()
{
    Account [] accounts = mAcctMgr.getAccountsByType (mAccountType);

    if (accounts.length == 0) return;

    final Handler handler = new Handler (); 

    AccountManagerCallback<Boolean> callback = new AccountManagerCallback<Boolean>()
    {
        @Override
        public void run(AccountManagerFuture<Boolean> arg0)
        {
           // nada
        }
    };

    for (Account a : accounts) {
        mAcctMgr.removeAccount (a, callback, handler);
    }
}

I don't by any means call this an elegant solution, but at the moment seems to be the only thing that works.

like image 452
copolii Avatar asked Jan 12 '12 08:01

copolii


2 Answers

Per the javadocs for addAccount(), if an error condition occurs when creating the account, you should return a bundle that contains the KEY_ERROR_CODE and KEY_ERROR_MESSAGE parameters,

    if (accountExists) {
        final Bundle result = new Bundle();
        result.putInt(AccountManager.KEY_ERROR_CODE, ERROR_CODE_ONE_ACCOUNT_ALLOWED);
        result.putString(AccountManager.KEY_ERROR_MESSAGE, context.getString(R.string.one_account_allowed));

        handler.post(new Runnable() {

            @Override
            public void run() {
                RepeatSafeToast.show(context, R.string.one_account_allowed);
            }
        });
        return result;
    }

Returning null does not mean failure, it means that the result will be communicated through the response parameter to the addAccount() method.

like image 77
Jeffrey Blattman Avatar answered Oct 20 '22 05:10

Jeffrey Blattman


In the addAccount function of your Authenticator class (the one which extends AbstractAccountAuthenticator), first check if an account exists. If an account already exists, just return null (And maybe show a toast message). If there are no accounts, just return the bundle like you were doing before.

        if(AccountHelper.accountExists(mContext)) {
        mHandler.post(new Runnable() {

            @Override
            public void run() {
                Toast.makeText(mContext, "Only one account allowed", Toast.LENGTH_SHORT).show();
            }
        });
        return null;
    }
like image 32
Cameron Ketcham Avatar answered Oct 20 '22 03:10

Cameron Ketcham