0

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;
        }


}
Sobo
  • 487
  • 8
  • 21

5 Answers5

2

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.

Ridcully
  • 23,362
  • 7
  • 71
  • 86
2

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();
    }
}
Sam
  • 86,580
  • 20
  • 181
  • 179
  • The only comment I have is `apply()` for `SharedPreferences.Editor` is only valid from API 9 onwards. – Squonk Aug 26 '12 at 19:54
  • I think this is on the right track, but when I click the submit button, it doesnt do anything. Dont I need a btnSubmit.setOnClickListener(new OnClickListener() somewhere? I have revised my code with your suggestions. Thanks for your help – Sobo Aug 26 '12 at 21:23
  • @Sobo You can wrap my `onClick()` method in an OnClickListener like you said or use `btnSubmit.setOnClickListener(this);`. Let me know if you still can't get it to work. – Sam Aug 26 '12 at 22:07
  • I got it working. Thanks Everyone for your help. I updated the code above to the working code. Thanks Again!! – Sobo Aug 26 '12 at 22:25
0

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

nandeesh
  • 24,740
  • 6
  • 69
  • 79
  • OK, But this still does not solve the problem with it not even storing the password. It's still thinks it blank. – Sobo Aug 26 '12 at 18:15
0

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 !=.

iTurki
  • 16,292
  • 20
  • 87
  • 132
0

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.

Community
  • 1
  • 1
JackTools.Net
  • 734
  • 6
  • 13