package org.qaoverflow.q2android.authentication; import android.accounts.Account; import android.accounts.AccountAuthenticatorActivity; import android.accounts.AccountManager; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import org.qaoverflow.q2android.R; /** * The Authenticator activity. * * Called by the Authenticator and in charge of identifing the user. * * It sends back to the Authenticator the result. */ public class AuthenticatorActivity extends AccountAuthenticatorActivity { public final static String ARG_ACCOUNT_TYPE = "ACCOUNT_TYPE"; public final static String ARG_AUTH_TYPE = "AUTH_TYPE"; public final static String ARG_ACCOUNT_NAME = "ACCOUNT_NAME"; public final static String ARG_IS_ADDING_NEW_ACCOUNT = "IS_ADDING_ACCOUNT"; public static final String KEY_ERROR_MESSAGE = "ERR_MSG"; public final static String PARAM_USER_PASS = "USER_PASS"; private final int REQ_SIGNUP = 1; private final String TAG = this.getClass().getSimpleName(); private AccountManager mAccountManager; private String mAuthTokenType; /** * Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.act_login); mAccountManager = AccountManager.get(getBaseContext()); String accountName = getIntent().getStringExtra(ARG_ACCOUNT_NAME); mAuthTokenType = getIntent().getStringExtra(ARG_AUTH_TYPE); if (mAuthTokenType == null) mAuthTokenType = AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS; if (accountName != null) { ((TextView)findViewById(R.id.accountName)).setText(accountName); } findViewById(R.id.submit).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { submit(); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // The sign up activity returned that the user has successfully created an account if (requestCode == REQ_SIGNUP && resultCode == RESULT_OK) { finishLogin(data); } else super.onActivityResult(requestCode, resultCode, data); } public void submit() { final String userSite = ((TextView) findViewById(R.id.accountSite)).getText().toString(); final String userName = ((TextView) findViewById(R.id.accountName)).getText().toString(); final String userPass = ((TextView) findViewById(R.id.accountPassword)).getText().toString(); final String accountType = getIntent().getStringExtra(ARG_ACCOUNT_TYPE); Bundle data = new Bundle(); data.putString(AccountManager.KEY_AUTHTOKEN, userPass); data.putString(AccountManager.KEY_ACCOUNT_NAME, userName+"@"+userSite); data.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType); data.putString(PARAM_USER_PASS, userPass); final Intent res = new Intent(); res.putExtras(data); finishLogin(res); } private void finishLogin(Intent intent) { Log.d(TAG, TAG + "> finishLogin"); String accountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); String accountPassword = intent.getStringExtra(PARAM_USER_PASS); final Account account = new Account(accountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE)); if (getIntent().getBooleanExtra(ARG_IS_ADDING_NEW_ACCOUNT, false)) { Log.d(TAG, TAG + "> finishLogin > addAccountExplicitly"); String authtoken = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN); String authtokenType = mAuthTokenType; // Creating the account on the device and setting the auth token we got // (Not setting the auth token will cause another call to the server to authenticate the user) mAccountManager.addAccountExplicitly(account, accountPassword, null); mAccountManager.setAuthToken(account, authtokenType, authtoken); } else { Log.d(TAG, TAG + "> finishLogin > setPassword"); mAccountManager.setPassword(account, accountPassword); } setAccountAuthenticatorResult(intent.getExtras()); setResult(RESULT_OK, intent); finish(); } }