Example And Explanation: Android (studio) Login Activity Template Generated Activity
Solution 1:
Step 1: Make Login successful 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><actionandroid:name="android.intent.action.MAIN" /><categoryandroid: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
@OverrideprotectedBooleandoInBackground(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.returnfalse;
}
Then on the onPostExecute
method, add a new intent after the finish();
:
@OverrideprotectedvoidonPostExecute(final Boolean success) {
mAuthTask = null;
showProgress(false);
if (success) {
finish();
IntentmyIntent=newIntent(LoginActivity.this,MyMainActivity.class);
LoginActivity.this.startActivity(myIntent);
} else {
mPasswordView.setError(getString(R.string.error_incorrect_password));
mPasswordView.requestFocus();
}
}
Now login should be successful using one of the following user:password
credentials:
- 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.
*/publicclassUser {
publiclong userId;
public String username;
public String password;
publicUser(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.
*/publicclassDBToolsextendsSQLiteOpenHelper {
privatefinalstaticintDB_VERSION=10;
publicDBTools(Context context) {
super(context, "myApp.db", null,DB_VERSION);
}
@OverridepublicvoidonCreate(SQLiteDatabase sqLiteDatabase) {
Stringquery="create table logins (userId Integer primary key autoincrement, "+
" username text, password text)";
sqLiteDatabase.execSQL(query);
}
@OverridepublicvoidonUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
try{
System.out.println("UPGRADE DB oldVersion="+oldVersion+" - newVersion="+newVersion);
onCreate(sqLiteDatabase);
if (oldVersion<10){
Stringquery="create table logins (userId Integer primary key autoincrement, "+
" username text, password text)";
sqLiteDatabase.execSQL(query);
}
}
catch (Exception e){e.printStackTrace();}
}
@OverridepublicvoidonDowngrade(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){
SQLiteDatabasedatabase=this.getWritableDatabase();
ContentValuesvalues=newContentValues();
values.put("username", queryValues.username);
values.put("password", queryValues.password);
queryValues.userId=database.insert("logins", null, values);
database.close();
return queryValues;
}
publicintupdateUserPassword(User queryValues){
SQLiteDatabasedatabase=this.getWritableDatabase();
ContentValuesvalues=newContentValues();
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 = ?", newString[] {String.valueOf(queryValues.userId)});
}
public User getUser(String username){
Stringquery="Select userId, password from logins where username ='"+username+"'";
UsermyUser=newUser(0,username,"");
SQLiteDatabasedatabase=this.getReadableDatabase();
Cursorcursor= 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 following code:
/**
* Represents an asynchronous login/registration task used to authenticate
* the user.
*/publicclassUserLoginTaskextendsAsyncTask<Void, Void, Boolean> {
privatefinal String mEmail;
privatefinal String mPassword;
privatefinal Context mContext;
UserLoginTask(String email, String password, Context context) {
mEmail = email;
mPassword = password;
mContext= context;
}
@Overrideprotected Boolean doInBackground(Void... params) {
DBTools dbTools=null;
try{
dbTools = newDBTools(mContext);
myUser = dbTools.getUser(mEmail);
if (myUser.userId>0) {
// Account exists, check password.if (myUser.password.equals(mPassword))
returntrue;
elsereturnfalse;
} else {
myUser.password=mPassword;
returntrue;
}
} finally{
if (dbTools!=null)
dbTools.close();
}
// return false if no previous checks are truereturnfalse;
}
@OverrideprotectedvoidonPostExecute(final Boolean success) {
mAuthTask = null;
showProgress(false);
if (success) {
if (myUser.userId>0){
finish();
IntentmyIntent=newIntent(LoginActivity.this,ReportListActivity.class);
LoginActivity.this.startActivity(myIntent);
} else {
DialogInterface.OnClickListenerdialogClickListener=newDialogInterface.OnClickListener() {
@OverridepublicvoidonClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
DBTools dbTools=null;
try{
finish();
dbTools = newDBTools(mContext);
myUser=dbTools.insertUser(myUser);
ToastmyToast= Toast.makeText(mContext,R.string.updatingReport, Toast.LENGTH_SHORT);
myToast.show();
IntentmyIntent=newIntent(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.Builderbuilder=newAlertDialog.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();
}
}
@OverrideprotectedvoidonCancelled() {
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>
I hope I did not forget anything... It worked fine for me :D
If email is not present in the DB, it will propose to register it, otherwise it will check the email versus the password.
Have fun with Android :D
Post a Comment for "Example And Explanation: Android (studio) Login Activity Template Generated Activity"