package com.github.andlyticsproject; import android.accounts.Account; import android.accounts.AccountAuthenticatorActivity; import android.accounts.AccountManager; import android.app.Dialog; import android.app.ProgressDialog; import android.content.ContentResolver; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.provider.ContactsContract; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.github.andlyticsproject.admob.AdmobAccountAuthenticator; import com.github.andlyticsproject.admob.AdmobAuthenticationUtilities; import com.github.andlyticsproject.admob.AdmobRequest; public class AdmobAuthenticatorActivity extends AccountAuthenticatorActivity { public static final String PARAM_AUTHTOKEN_TYPE = "authtokenType"; public static final String PARAM_USERNAME = "username"; public static final String PARAM_CONFIRM_CREDENTIALS = "confirmCredentials"; public static final String PARAM_PASSWORD = "password"; private AccountManager mAccountManager; private Thread mAuthThread; private String mAuthtoken; private String mAuthtokenType; private Boolean mConfirmCredentials = false; private final Handler mHandler = new Handler(); private TextView mMessageView; private String mPassword; private String mUsername; private EditText mPasswordEdit; private EditText mUsernameEdit; private boolean mRequestNewAccount = false; private View mOkButton; @Override public void onCreate(Bundle neato) { super.onCreate(neato); mAccountManager = AccountManager.get(this); final Intent intent = getIntent(); mUsername = intent.getStringExtra(PARAM_USERNAME); mAuthtokenType = intent.getStringExtra(PARAM_AUTHTOKEN_TYPE); mRequestNewAccount = mUsername == null; mConfirmCredentials = intent.getBooleanExtra(PARAM_CONFIRM_CREDENTIALS, false); initLayout(); } private void initLayout() { requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.admob_login); mMessageView = (TextView) findViewById(R.id.admob_login_message); mUsernameEdit = (EditText) findViewById(R.id.admob_login_username_edit); mPasswordEdit = (EditText) findViewById(R.id.admob_login_password_edit); if (mUsername == null) { mUsername = DeveloperAccountManager.getInstance(this).getSelectedDeveloperAccount() .getName(); } mUsernameEdit.setText(mUsername); if (mUsername != null) { mPasswordEdit.requestFocusFromTouch(); } if (getMessage() != null) { mMessageView.setText(getMessage()); } mOkButton = findViewById(R.id.admob_login_ok_button); mOkButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { handleLogin(v); } }); } private CharSequence getMessage() { if (TextUtils.isEmpty(mUsername)) { CharSequence msg = getString(R.string.admob_data_prompt); return msg; } if (TextUtils.isEmpty(mPassword)) { return getString(R.string.admob_password_prompt); } return null; } @Override protected Dialog onCreateDialog(int id) { ProgressDialog dialog = new ProgressDialog(this); dialog.setMessage(getString(R.string.admob_authenticating)); dialog.setIndeterminate(true); dialog.setCancelable(true); dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { if (mAuthThread != null) { mAuthThread.interrupt(); finish(); } } }); return dialog; } public void handleLogin(View v) { if (mRequestNewAccount) { mUsername = mUsernameEdit.getText().toString(); } mPassword = mPasswordEdit.getText().toString(); if (TextUtils.isEmpty(mUsername) || TextUtils.isEmpty(mPassword)) { mMessageView.setText(getMessage()); } else { showProgress(); mAuthThread = AdmobAuthenticationUtilities.attemptAuth(mUsername, mPassword, mHandler, AdmobAuthenticatorActivity.this); } } private void finishConfirmCredentials(boolean result) { Account account = new Account(mUsername, AdmobAccountAuthenticator.ACCOUNT_TYPE_ADMOB); mAccountManager.setPassword(account, mPassword); Intent intent = new Intent(); intent.putExtra(AccountManager.KEY_BOOLEAN_RESULT, result); setAccountAuthenticatorResult(intent.getExtras()); setResult(RESULT_OK, intent); finish(); } private void finishLogin() { Account account = new Account(mUsername, AdmobAccountAuthenticator.ACCOUNT_TYPE_ADMOB); if (mRequestNewAccount) { mAccountManager.addAccountExplicitly(account, mPassword, null); ContentResolver.setSyncAutomatically(account, ContactsContract.AUTHORITY, true); } else { mAccountManager.setPassword(account, mPassword); } Intent intent = new Intent(); mAuthtoken = mPassword; intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, mUsername); intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE, AdmobAccountAuthenticator.ACCOUNT_TYPE_ADMOB); if (mAuthtokenType != null && mAuthtokenType.equals(AdmobAccountAuthenticator.AUTHTOKEN_TYPE_ADMOB)) { intent.putExtra(AccountManager.KEY_AUTHTOKEN, mAuthtoken); } setAccountAuthenticatorResult(intent.getExtras()); setResult(RESULT_OK, intent); finish(); } @SuppressWarnings("deprecation") private void showProgress() { showDialog(0); } @SuppressWarnings("deprecation") private void hideProgress() { try { dismissDialog(0); } catch (IllegalArgumentException e) { Log.e("AdMobAuthenticator", "dismissDialog without open", e); } } public void onAuthenticationResult(String result) { hideProgress(); if ("true".equalsIgnoreCase(result)) { if (!mConfirmCredentials) { finishLogin(); } else { finishConfirmCredentials(true); } } else { if (AdmobRequest.ERROR_NETWORK_ERROR.equals(result)) { Toast.makeText(AdmobAuthenticatorActivity.this, getString(R.string.network_error), Toast.LENGTH_SHORT).show(); } if (AdmobRequest.ERROR_RATE_LIMIT_EXCEEDED.equals(result)) { Toast.makeText(AdmobAuthenticatorActivity.this, getString(R.string.admob_ratelimit_error), Toast.LENGTH_LONG).show(); } if (AdmobRequest.ERROR_REQUEST_INVALID.equals(result)) { Toast.makeText(AdmobAuthenticatorActivity.this, getString(R.string.admob_linked_accounts_error), Toast.LENGTH_LONG).show(); } if (mRequestNewAccount) { mMessageView.setText(getString(R.string.admob_auth_failed)); } else { mMessageView.setText(getString(R.string.admob_wrong_password)); } } } }