Skip to content

Instantly share code, notes, and snippets.

@lobotomit
Created April 16, 2017 06:39
Show Gist options
  • Select an option

  • Save lobotomit/e7a0ac28a00755fcb8274fc0b58d36a5 to your computer and use it in GitHub Desktop.

Select an option

Save lobotomit/e7a0ac28a00755fcb8274fc0b58d36a5 to your computer and use it in GitHub Desktop.
AccountManager Android
package com.ereyesalvarez.eadu.activities;
import android.accounts.Account;
import android.accounts.AccountAuthenticatorActivity;
import android.accounts.AccountManager;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.ereyesalvarez.eadu.R;
import com.ereyesalvarez.eadu.services.ServerAutenticateService;
public class SignInActivity extends AccountAuthenticatorActivity {
private final String TAG = this.getClass().getSimpleName();
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_SIGN_UP = 1;
private AccountManager mAccountManager; //Account Manager
private String mAuthTokenType; //Tipo de Token
// UI References:
private EditText mEmailView;
private EditText mPasswordView;
private Button mSubmitButton;
private TextView mRegisterView;
/**
* onCreate
* @param savedInstanceState savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signin); //Ponemos el layout
//Link UI Elements:
mEmailView = (EditText) findViewById(R.id.accountName);
mPasswordView = (EditText) findViewById(R.id.accountPassword);
mSubmitButton = (Button) findViewById(R.id.submit);
mRegisterView = (TextView) findViewById(R.id.signUp);
//Inicializamos el accManager.
mAccountManager = AccountManager.get(getBaseContext());
String accountName = getIntent().getStringExtra(ARG_ACCOUNT_NAME); //Nombre de la cuenta.
if (mAuthTokenType == null)
mAuthTokenType = "Full access";
if (accountName != null) {
mEmailView.setText(accountName); //Escribimos el nombre de la cuenta si existe.
}
/*
* ClickListener: Botón: Submit.
* Llamamos al método submit
*/
mSubmitButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
submit();
}
});
/*
* ClickListener: Botón SignUp.
* Cambiamos a registro.
* Como solo hay un AuthenticatorActivity:
* llamamos la actividad Sign Up, conseguimos sus resultados y sus resultados in:
* setAccountAuthenticatorResult(). Ver finishLogin().
*/
mRegisterView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent signup = new Intent(getBaseContext(), SignUpActivity.class); //Llamamos a registrar
signup.putExtras(getIntent().getExtras());
startActivityForResult(signup, REQ_SIGN_UP); //Iniciamos la actividad de registro.
}
});
}
/**
* On Activity Result
* Cuando se devuelve un intent que se hace con lo que devuelve.
* @param requestCode Código que envió, sirve para identificar el intent.
* @param resultCode Código que devuelve la actividad llamada.
* @param data Datos adicionales.
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//Si la actividad era la de registro y el resultado ha sido OK.
if (requestCode == REQ_SIGN_UP && resultCode == RESULT_OK) {
finishLogin(data); //Finalizamos el login.
} else
super.onActivityResult(requestCode, resultCode, data);
}
/**
* Envía los datos de login
*/
public void submit() {
//Recuperamos los datos de usuario y password.
final String userName = mEmailView.getText().toString();
final String userPass = mPasswordView.getText().toString();
//Tipo de cuenta. TODO: revisar tipo de cuenta.
final String accountType = getIntent().getStringExtra(ARG_ACCOUNT_TYPE);
/*
* Inicio de AsyncTask
*/
new AsyncTask<String, Void, Intent>() {
@Override
protected Intent doInBackground(String... params) {
Log.d(TAG, "Started authenticating");
String authToken = null; // Almacenara el Token de autenticación.
Bundle data = new Bundle(); // Bundle de datos.
try {
//TODO: Llamar a servicio real.
authToken = ServerAutenticateService.userSignIn(userName, userPass, mAuthTokenType);
//Ponemos los elementos importantes en el data que pasara a finalizar login.
data.putString(AccountManager.KEY_ACCOUNT_NAME, userName);
data.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType);
data.putString(AccountManager.KEY_AUTHTOKEN, authToken);
data.putString(PARAM_USER_PASS, userPass);
} catch (Exception e) {
//Ponemos el error message si falla.
data.putString(KEY_ERROR_MESSAGE, e.getMessage());
}
//Creamos el intent para pasar los datos.
final Intent res = new Intent();
res.putExtras(data); //Ponemos los datos en el intent.
return res; //Mandamos el intent a onPostExecute
}
@Override
protected void onPostExecute(Intent intent) {
//Si hay error lo mostramos, sino finalizamos el LogIn.
if (intent.hasExtra(KEY_ERROR_MESSAGE)) {
Toast.makeText(getBaseContext(), intent.getStringExtra(KEY_ERROR_MESSAGE), Toast.LENGTH_SHORT).show();
} else {
finishLogin(intent);
}
}
}.execute();
}
/**
*
* @param intent Intent con los datos del registro / login
*/
private void finishLogin(Intent intent) {
Log.d(TAG, "finishLogin");
//Guardamos los datos del intent.
String accountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
String accountPassword = intent.getStringExtra(PARAM_USER_PASS);
//Creamos una cuenta. Con el nombre de la cuenta, y el tipo de cuenta.
final Account account = new Account(accountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE));
//Se selecciona si se debe añadir cuenta o solo poner el password.
if (getIntent().getBooleanExtra(ARG_IS_ADDING_NEW_ACCOUNT, false)) {
Log.d(TAG, "> finishLogin > addAccountExplicitly");
String authtoken = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN);
String authtokenType = mAuthTokenType;
// Creamos la cuenta en el dispositivo y colocamos el token que obtenemos.
// No poner el token causara otra call al server para autenticar el usuario.
mAccountManager.addAccountExplicitly(account, accountPassword, null);
mAccountManager.setAuthToken(account, authtokenType, authtoken);
} else {
Log.d(TAG, "> finishLogin > setPassword");
mAccountManager.setPassword(account, accountPassword); //Colocamos el password adecuado.
}
setAccountAuthenticatorResult(intent.getExtras());
setResult(RESULT_OK, intent);
finish(); //Finalizamos la actividad.
}
}
package com.ereyesalvarez.eadu.activities;
import android.accounts.AccountManager;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.ereyesalvarez.eadu.R;
import com.ereyesalvarez.eadu.services.ServerAutenticateService;
import static com.ereyesalvarez.eadu.activities.SignInActivity.ARG_ACCOUNT_TYPE;
import static com.ereyesalvarez.eadu.activities.SignInActivity.PARAM_USER_PASS;
import static com.ereyesalvarez.eadu.activities.SignInActivity.KEY_ERROR_MESSAGE;
/**
* Se encarga del proceso de Sign up (registro).
* No implementa AuthenticatorActivity por que devuelve el resultado a la actividad login (AuthenticatorActivity)
* con un marcador de añadir nueva cuenta.
*/
public class SignUpActivity extends Activity {
private String TAG = getClass().getSimpleName();
private String mAccountType; //Tipo de Cuenta
// UI References:
private EditText mNameView;
private EditText mEmailView;
private EditText mPasswordView;
private Button mSubmitButton;
private TextView mLogInView;
/**
* onCreate
* @param savedInstanceState savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAccountType = getIntent().getStringExtra(ARG_ACCOUNT_TYPE); //Pedimos el tipo de cuenta.
setContentView(R.layout.activity_signup); //Ponemos el layout
//Link UI Elements:
mNameView = (EditText) findViewById(R.id.name);
mEmailView = (EditText) findViewById(R.id.accountName);
mPasswordView = (EditText) findViewById(R.id.accountPassword);
mSubmitButton = (Button) findViewById(R.id.submit);
mLogInView = (TextView) findViewById(R.id.alreadyMember);
/*
* ClickListener: Botón alreadyMember.
* Cambiamos a login.
* Finaliza la actividad y devuelve el resultado cancelado.
*/
mLogInView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setResult(RESULT_CANCELED);
finish();
}
});
/*
* ClickListener: Botón: Submit.
* Llamamos al método createAccount.
*/
mSubmitButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
createAccount();
}
});
}
/*
* Si pulsamos atrás finaliza la actividad y devolvemos cancelado.
*/
@Override
public void onBackPressed() {
setResult(RESULT_CANCELED);
super.onBackPressed();
}
/**
* Crea la cuenta en segundo plano.
*/
private void createAccount() {
//TODO: Validación de los datos.
new AsyncTask<String, Void, Intent>() {
String name = mNameView.getText().toString().trim();
String accountName = mEmailView.getText().toString().trim();
String accountPassword = mPasswordView.getText().toString().trim();
@Override
protected Intent doInBackground(String... params) {
Log.d(TAG, "Started authenticating");
String authtoken = null;
Bundle data = new Bundle();
try {
// TODO: Cambiar.
//authtoken = ServerAutenticateService.userSignUp(name, accountName, accountPassword, AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS);
// TODO: realizar servicio de autentciación.
authtoken = ServerAutenticateService.userSignUp(name, accountName, accountPassword, "Full access"); //Devuelve el token.
//Guardamos los datos para el intent.
data.putString(AccountManager.KEY_ACCOUNT_NAME, accountName);
data.putString(AccountManager.KEY_ACCOUNT_TYPE, mAccountType);
data.putString(AccountManager.KEY_AUTHTOKEN, authtoken);
data.putString(PARAM_USER_PASS, accountPassword);
} catch (Exception e) {
data.putString(KEY_ERROR_MESSAGE, e.getMessage());
}
final Intent res = new Intent();
res.putExtras(data);
return res;
}
@Override
protected void onPostExecute(Intent intent) {
if (intent.hasExtra(KEY_ERROR_MESSAGE)) {
Toast.makeText(getBaseContext(), intent.getStringExtra(KEY_ERROR_MESSAGE), Toast.LENGTH_SHORT).show();
} else {
setResult(RESULT_OK, intent);
finish();
}
}
}.execute();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment