Skip to content

Instantly share code, notes, and snippets.

@corest
Created November 26, 2014 07:17
Show Gist options
  • Save corest/055350c330d1ca59c967 to your computer and use it in GitHub Desktop.
Save corest/055350c330d1ca59c967 to your computer and use it in GitHub Desktop.
Login and registration Android
Step 1: Make Login succesfull and advance to main activity
To have the login activity to fail when wrong user/password is used, and go to main activity when successful, you need to make the following corrections to the generated code:
AndroidManifest.xml:
Move the following code from you main activity to the LoginActivity section:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Then edit the LoginActivity.java and do the following changes:
Inside doInBackground method, at the end replace the returned value from true to false
@Override
protected Boolean doInBackground(Void... params) {
for (String credential : DUMMY_CREDENTIALS) {
String[] pieces = credential.split(":");
if (pieces[0].equals(mEmail)) {
// Account exists, return true if the password matches.
return pieces[1].equals(mPassword);
}
}
// TODO: register the new account here.
return false;
}
Then on the onPostExecute method, add a new intent after the finish();:
@Override
protected void onPostExecute(final Boolean success) {
mAuthTask = null;
showProgress(false);
if (success) {
finish();
Intent myIntent = new Intent(LoginActivity.this,MyMainActivity.class);
LoginActivity.this.startActivity(myIntent);
} else {
mPasswordView.setError(getString(R.string.error_incorrect_password));
mPasswordView.requestFocus();
}
}
Now login shoul dbe succesfull using one of the following user:password foo@example.com:hello bar@example.com:world
Other user:password try should state incorrect password and stay on Login page.
Step 2: Allow registration, store login into the database and check credentials vs DB
We now will get Login info from database (SQLite) instead of static variable. This will allow us to have more than 1 user registered on the device.
First, create a new User.java class:
package com.clinsis.onlineresults.utils;
/**
* Created by csimon on 5/03/14.
*/
public class User {
public long userId;
public String username;
public String password;
public User(long userId, String username, String password){
this.userId=userId;
this.username=username;
this.password=password;
}
}
Then create or update your SQLite helper (DBTools.java in my case) class:
package com.clinsis.onlineresults.utils;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by csimon on 12/11/13.
*/
public class DBTools extends SQLiteOpenHelper {
private final static int DB_VERSION = 10;
public DBTools(Context context) {
super(context, "myApp.db", null,DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String query = "create table logins (userId Integer primary key autoincrement, "+
" username text, password text)";
sqLiteDatabase.execSQL(query);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
try{
System.out.println("UPGRADE DB oldVersion="+oldVersion+" - newVersion="+newVersion);
recreateDb(sqLiteDatabase);
if (oldVersion<10){
String query = "create table logins (userId Integer primary key autoincrement, "+
" username text, password text)";
sqLiteDatabase.execSQL(query);
}
}
catch (Exception e){e.printStackTrace();}
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// super.onDowngrade(db, oldVersion, newVersion);
System.out.println("DOWNGRADE DB oldVersion="+oldVersion+" - newVersion="+newVersion);
}
public User insertUser (User queryValues){
SQLiteDatabase database = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("username", queryValues.username);
values.put("password", queryValues.password);
queryValues.userId=database.insert("logins", null, values);
database.close();
return queryValues;
}
public int updateUserPassword (User queryValues){
SQLiteDatabase database = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("username", queryValues.username);
values.put("password", queryValues.password);
queryValues.userId=database.insert("logins", null, values);
database.close();
return database.update("logins", values, "userId = ?", new String[] {String.valueOf(queryValues.userId)});
}
public User getUser (String username){
String query = "Select userId, password from logins where username ='"+username+"'";
User myUser = new User(0,username,"");
SQLiteDatabase database = this.getReadableDatabase();
Cursor cursor = database.rawQuery(query, null);
if (cursor.moveToFirst()){
do {
myUser.userId=cursor.getLong(0);
myUser.password=cursor.getString(1);
} while (cursor.moveToNext());
}
return myUser;
}
}
Note: DB_VERSION is used to detect upgrade/downgrade of the DB schema ;)
Then modify the LoginActivity,java as follow:
Add the following imports:
import android.widget.Toast;
import com.clinsis.onlineresults.utils.DBTools;
import com.clinsis.onlineresults.utils.User;
Add a new variable:
private User myUser;
Remove DUMMY_CREDENTIALS variable declaration.
In attemptLogin method, add context when calling UserLoginTask:
mAuthTask = new UserLoginTask(email, password, this);
Replace the internal UserLoginTask class with the fiolloing code:
/**
* Represents an asynchronous login/registration task used to authenticate
* the user.
*/
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
private final String mEmail;
private final String mPassword;
private final Context mContext;
UserLoginTask(String email, String password, Context context) {
mEmail = email;
mPassword = password;
mContext= context;
}
@Override
protected Boolean doInBackground(Void... params) {
DBTools dbTools=null;
try{
dbTools = new DBTools(mContext);
myUser = dbTools.getUser(mEmail);
if (myUser.userId>0) {
// Account exists, check password.
if (myUser.password.equals(mPassword))
return true;
else
return false;
} else {
myUser.password=mPassword;
return true;
}
} finally{
if (dbTools!=null)
dbTools.close();
}
}
@Override
protected void onPostExecute(final Boolean success) {
mAuthTask = null;
showProgress(false);
if (success) {
if (myUser.userId>0){
finish();
Intent myIntent = new Intent(LoginActivity.this,ReportListActivity.class);
LoginActivity.this.startActivity(myIntent);
} else {
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
DBTools dbTools=null;
try{
finish();
dbTools = new DBTools(mContext);
myUser=dbTools.insertUser(myUser);
Toast myToast = Toast.makeText(mContext,R.string.updatingReport, Toast.LENGTH_SHORT);
myToast.show();
Intent myIntent = new Intent(LoginActivity.this,ReportListActivity.class);
LoginActivity.this.startActivity(myIntent);
} finally{
if (dbTools!=null)
dbTools.close();
}
break;
case DialogInterface.BUTTON_NEGATIVE:
mPasswordView.setError(getString(R.string.error_incorrect_password));
mPasswordView.requestFocus();
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(this.mContext);
builder.setMessage(R.string.confirm_registry).setPositiveButton(R.string.yes, dialogClickListener)
.setNegativeButton(R.string.no, dialogClickListener).show();
}
} else {
mPasswordView.setError(getString(R.string.error_incorrect_password));
mPasswordView.requestFocus();
}
}
@Override
protected void onCancelled() {
mAuthTask = null;
showProgress(false);
}
}
In strings.xml, add:
<string name="confirm_registry">Email not found. You want to create a new user with that email and password?</string>
<string name="yes">Yes</string>
<string name="no">No</string>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment