package com.gertherb.authentication; import android.accounts.Account; import android.accounts.AccountAuthenticatorResponse; import android.accounts.AccountManager; import android.app.Activity; import android.os.Bundle; public abstract class BetterAuthenticatorActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (callerHasAccountManagerCallback()) { getAuthenticatorResponseFromExtras().onRequestContinued(); } } protected void setSuccessResponse(Token token) { addAccount(token); if (callerHasAccountManagerCallback()) { Bundle bundle = createResponseBundle(token); setResponseResult(bundle); } } private void addAccount(Token token) { AccountManager accountManager = AccountManager.get(this.getApplicationContext()); Account account = new Account(token.getUserName(), getAccountName()); //Todo : save password or refresh token here to enable refresh of authToken accountManager.addAccountExplicitly(account, token.getAuthToken(), null); accountManager.setAuthToken(account, getAccountType(), token.getAuthToken()); } protected void setErrorResultAuthenticator(int errorCode, Throwable throwable) { if (callerHasAccountManagerCallback()) { setResponseError(errorCode, throwable.getLocalizedMessage()); } } protected void setCancelResultAuthenticator(Throwable throwable) { if (callerHasAccountManagerCallback()) { setResponseError(AccountManager.ERROR_CODE_CANCELED, throwable.getLocalizedMessage()); } } private Bundle createResponseBundle(Token result) { Bundle bundle = new Bundle(); bundle.putString(AccountManager.KEY_ACCOUNT_NAME, getAccountName()); bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, getAccountType()); bundle.putString(AccountManager.KEY_AUTHTOKEN, result.getAuthToken()); return bundle; } private void setResponseResult(Bundle result) { AccountAuthenticatorResponse response = getAuthenticatorResponseFromExtras(); response.onResult(result); setResult(RESULT_OK); finish(); } private void setResponseError(int errorCode, String message) { AccountAuthenticatorResponse response = getAuthenticatorResponseFromExtras(); response.onError(errorCode, message); finish(); } private boolean callerHasAccountManagerCallback() { return getIntent().hasExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE); } private AccountAuthenticatorResponse getAuthenticatorResponseFromExtras() { return getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE); } private String getAccountName() { return getIntent().getStringExtra(AccountManager.KEY_ACCOUNT_NAME); } private String getAccountType() { return getIntent().getStringExtra(AccountManager.KEY_ACCOUNT_TYPE); } }