Created
November 26, 2014 07:17
-
-
Save corest/055350c330d1ca59c967 to your computer and use it in GitHub Desktop.
Login and registration Android
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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