Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Example and explanation: Android (Studio) Login Activity Template generated activity

Tags:

I wanted to implement a login form in my app, so I tried to use the code generated by the Android Studio Wizard for a new Activity of type Login Form. i think that the code generated by Eclipse is almost the same.

Unfortunately, the generated code did not provide the expected result: I created a nice simple login form, but with correct or wrong password, it does not move from the login form.

Also I noticed that no "Register" form was created.

After looking a bit, and analyzing the code, I finally got it working :)

See my response below.

like image 489
Cedric Simon Avatar asked Mar 05 '14 20:03

Cedric Simon


People also ask

What is login activity in Android?

Login Activity is one of the most common things which most of the application have is Login Activity. To have a Login Activity in your android studio project is very simple. To Implement login Activity you need to create or open an android studio project, give it a name and press Next to configuration panel.

How do you include settings activity template in your project?

Activity TemplatesRight click the project folder of the Android application where you want to add an activity. Select Android > Android Activity, and click Next. Select an activity template, then follow the instructions to add it to your existing application.


1 Answers

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>     <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 should be successful using one of the following user:password credentials:

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);               onCreate(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 following 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();         }         // return false if no previous checks are true         return false;     }      @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> 

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

like image 171
Cedric Simon Avatar answered Nov 09 '22 06:11

Cedric Simon