Sobo
Sobo

Reputation: 497

SharedPreferences to store and read password for Activity

I am hoping someone can help. Still very new to Android/Java. I have an application with multiple activities. When the user click a specific button, I want them to be required to log in before continuing.

I am trying to make it so if the password is NULL it will prompt to create a password and after successfully creating the password it would continue on to the activity. And from that point forward it would ask them for the password they created to get to that activity if the application is restarted.

Here is what I have. I can not seem to get it to SET a password. It always stays NULL. I'm sure I have other issues with this code, but I'm trying to take it one step at a time.

package com.soboapps.todos;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class Password extends Activity implements OnClickListener {

public static final String PASSWORD_PREF_KEY ="PasswordSharedPreferences";
public static final String PREFS_PRIVATE = "PREFS_PRIVATE";
public static final String KEY_PRIVATE = "KEY_PRIVATE";
public static final String PREFS_READ = "PREFS_READ";
public static final String KEY_READ = "KEY_READ";
public static final String PREFS_WRITE = "PREFS_WRITE";
public static final String KEY_WRITE = "KEY_WRITE";
public static final String PREFS_READ_WRITE = "PREFS_READ_WRITE";
public static final String KEY_READ_WRITE = "KEY_READ_WRITE";

EditText pass1, password, passwordEditText;
TextView messages, passHint;
//EditText pass1;
Button btnSubmit;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);   
    setContentView(R.layout.password);


    PreferenceManager.getDefaultSharedPreferences(getBaseContext());
    SharedPreferences settings = this.getSharedPreferences("PasswordSharedPreferences", MODE_PRIVATE);
    String password1 = settings.getString("User Password", "");

    messages = (TextView) findViewById (R.id.text1);
    pass1 = (EditText) findViewById(R.id.txtPassword);
    btnSubmit = (Button) findViewById(R.id.btnSubmit);
    passHint = (TextView) findViewById(R.id.textView1);

    //passHint.setText(password1);
    passwordEditText = (EditText) findViewById(R.id.password);

    if(password1.isEmpty()) {
        passHint.setText("Set a Secure Password");
    }   
    btnSubmit.setOnClickListener(this);
} 

    public void onClick(View v) {
        // TODO Auto-generated method stub
        //PreferenceManager.getDefaultSharedPreferences(getBaseContext());
        SharedPreferences settings = this.getSharedPreferences("PasswordSharedPreferences", MODE_PRIVATE);
        final String password1 = settings.getString("User Password", "");
        final String p1 = pass1.getText().toString();

        if(password1.isEmpty()) {
        //switch(v.getId()){
        //case R.id.btnSubmit:

            if (p1.toLowerCase().equals("password")) {
                pass1.setText("");
                messages.setText("Password cannot be \"password\"");
            }

            if (p1.length() < 3) {
                messages.setText("Password must be at least 3 characters");
            }

            else {

                settings.edit().putString("User Password", p1).apply();
                Toast customToast = new Toast(getBaseContext());
                customToast = Toast.makeText(getBaseContext(), "Password has been set!", Toast.LENGTH_SHORT);
                customToast.setGravity(Gravity.CENTER|Gravity.CENTER, 0, 0);
                customToast.show();
                StartGallery();
            }
        }
            else if(p1.equals(password1)) {

                StartGallery();
                }
                else {
                    Toast customToast = new Toast(getBaseContext());
                    customToast = Toast.makeText(getBaseContext(), "Incorrect Password!", Toast.LENGTH_SHORT);
                    customToast.setGravity(Gravity.CENTER|Gravity.CENTER, 0, 0);
                    customToast.show(); {
                    }
                }
        }

    public void StartGallery(){
            Intent intent = new Intent(this, GalleryActivity.class);
            startActivity(intent);
        }

        public boolean onCreateOptionsMenu(Menu menu){
            super.onCreateOptionsMenu(menu);
            MenuInflater Password = getMenuInflater();
            Password.inflate(R.menu.prefs_menu, menu);
            return true;
        }

        public boolean onOptionsItemSelected(MenuItem item){
            switch(item.getItemId()){
            case R.id.menuPrefs:

            startActivity(new Intent("com.soboapps.todos.PASSPREFS"));
            return true;
        }
            return false;
        }


}

Upvotes: 0

Views: 1229

Answers (5)

Sam
Sam

Reputation: 86958

I recommend a few changes.

  • Don't use the SharedPreferences file name as the key for your password, this is confusing.
    You should use a unique string for the password key, this way you can eventually have different password for different users.

  • You overrode the OnClickListener regardless of whether the password succeeded or failed...

  • You were only checking against "password"; not "Password", "PASSWORD", "PaSsWoRd", etc.

  • When the password is set, I think the next Activity should open right away. I don't think the user should have to click "Submit" twice. I left a suggestion in the code about this.

Here is a revised OnClickListener:

public void onClick(View v) {
    SharedPreferences settings = this.getSharedPreferences("PasswordSharedPreferences", MODE_PRIVATE);
    final String password1 = settings.getString("User Password", "");
    final String p1 = pass1.getText().toString();

    // No password exists, try to set one
    if(password1.isEmpty()) {
        // Forbid any variation of "password", "Password", "PASSWORD", etc
        if (p1.toLowerCase().equals("password")) {
            pass1.setText("");
            messages.setText("Password cannot be \"password\"");
        }
        // Minimum length requirement
        else if (p1.length() < 3) {
            messages.setText("Password must be at least 3 characters");
        }
        // Set input as password
        else {
            settings.edit().putString("User Password", p1).apply();
            messages.setText("Password set!");

            // You could displayed "Password set!" is a Toast and start the next activity immediately
            //StartGallery();
        }
    }
    else if(p1.equals(password1)) {
        StartGallery();
    }
}

Upvotes: 2

JackTools.Net
JackTools.Net

Reputation: 734

If i got you right, them your problem is that you can't save the password to the preferences. If this right you can try this.

Upvotes: 0

iTurki
iTurki

Reputation: 16398

Change this line:

if(settings.getString(password1, null) != null) {

To this:

if(password1.equals(null)) {

You already stored the value of the preference in passward1. there is no need to get it again. And above all that, You should use equals() with the Strings, not !=.

Upvotes: 0

Ridcully
Ridcully

Reputation: 23665

At several places you use settings.getString(password1, null). Shouldn't this be settings.getString(PASSWORD_PREF_KEY, null)?

As you write it, you use the content of variable password1 as key into the preferences, which is probably not what you want.

Upvotes: 2

nandeesh
nandeesh

Reputation: 24820

I think you might want to use not operator. Your message suggests that you are trying to limit user not to type password as password

if (!p1.equals("password"))

instead of

if (p1.equals("password"))

Edit:

Also remove line

if(settings.getString(password1, null) != null) 

This is not required

Upvotes: 0

Related Questions