Explicit intent not working with forget password button also unable to read data from DB during sign in

32 views Asked by At

In this app the login screen has 3 buttons forget password, sign in and sign up the explicit intent for sign up is working properly but for forget password it force closes the app

LoginPage.java

package com.example.myapplication;

#*REMOVED IMPORTS FOR SIMPLICITY*#

import com.google.android.material.textfield.TextInputLayout;

public class LoginPage extends AppCompatActivity {

    // Varaibles

    Button signup,signin,forgetpass;
    ImageView logo;
    TextInputLayout username,password;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_login_page);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        signup = findViewById(R.id.signUpBtn);
        logo = findViewById(R.id.logo);
        signin = findViewById(R.id.signInBtn);
        username = findViewById(R.id.username);
        password = findViewById(R.id.pass);
        forgetpass  = findViewById(R.id.forgetBtn);

        DBHelper dbHelper = new DBHelper(this);

        forgetpass.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(LoginPage.this,ForgetPasswordPage.class);
                startActivity(intent);
            }
        });

        signup.setOnClickListener(new View.OnClickListener() {
            @Override   
            public void onClick(View v) {
                Intent intent = new Intent(LoginPage.this, SignUpPage.class);
                Pair[] pair = new Pair[3];
                pair[0] = new Pair<View,String>(logo,"logo_img");
                pair[1] = new Pair<View,String>(signin,"sign_up_in");
                pair[2] = new Pair<View,String>(signup,"back_sign_up_in");

                ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(LoginPage.this,pair);
                startActivity(intent,options.toBundle());
            }
        });

        signin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String uname = username.getEditText().getText().toString();
                String pass = password.getEditText().getText().toString();

                if (dbHelper.checkUsername(uname))
                {
                    if (dbHelper.checkusernamePassword(uname,pass))
                    {
                        Intent intent = new Intent(LoginPage.this, HomePage.class);
                        startActivity(intent);
                    }else {
                        password.setError("Incorrect password");
                    }
                }else {
                    username.setError("Username not found");
                }
            }
        });


    }
}

ForgetPasswordpage.java

package com.example.myapplication;

#*REMOVED IMPORTS FOR SIMPLICITY*#

import com.google.android.material.textfield.TextInputLayout;

public class ForgetPasswordPage extends AppCompatActivity {

    ImageView back;
    Button forgetPass;
    TextInputLayout uname,pass,repass;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_forget_password_page);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        uname = findViewById(R.id.Fusername);
        pass = findViewById(R.id.NewPassword);
        repass = findViewById(R.id.NewRePassword);
        forgetPass = findViewById(R.id.ForgetBtn);

        DBHelper dbHelper = new DBHelper(this);

        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ForgetPasswordPage.this, LoginPage.class);
                startActivity(intent);
            }
        });

        forgetPass.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String username = uname.getEditText().getText().toString();
                String password = pass.getEditText().getText().toString();
                String rePassword = repass.getEditText().getText().toString();

                if (!password.equals(rePassword))
                {
                    repass.setError("Password dose not match");
                    pass.setError("Password dose not match");
                } else if (!dbHelper.checkUsername(username)) {
                    uname.setError("User dose not exist");
                } else if (password.equals(rePassword) && dbHelper.checkUsername(username)) {
                    dbHelper.changePassword(username,password);
                }
            }
        });

    }
}

also in when signing in even if my uname and pass are correct the app force closes i think there may some problem in DBHelper.java

DBHelper.java

package com.example.myapplication;

#*REMOVED IMPORTS FOR SIMPLICITY*#

import androidx.annotation.Nullable;

public class DBHelper extends SQLiteOpenHelper {

    public static final String  DBNAME = "login.db";

    public DBHelper(Context context) {
        super(context, DBNAME, null, 1);
    }


    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create TABLE users(unsername TEXT primary key,password TEXT,fullName TEXT,email TEXT,phone TEXT)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop Table if exists users");
    }

    public boolean insertData(String username, String password, String fullName, String email,String phone) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("unsername",username);
        contentValues.put("password",password);
        contentValues.put("fullName",fullName);
        contentValues.put("email",email);
        contentValues.put("phone",phone);

        long results = db.insert("users",null,contentValues);
        if (results == -1)
            return false;
        else
            return true;

    }

    public  boolean checkUsername (String username) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor =  db.rawQuery("SELECT * FROM users WHERE usnername = ?",new  String[] {username});
        if (cursor.getCount() > 0)
            return true;
        else
            return false;
    }

    public boolean checkusernamePassword (String username, String password) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor =  db.rawQuery("SELECT * FROM users WHERE usnername = ? and password = ?",new  String[] {username,password});
        if (cursor.getCount() > 0)
            return true;
        else
            return false;
    }

    public boolean changePassword (String username, String password) {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery("UPDATE users SET passwod = ? WHERE username = ?",new String[] {password,username});
        if  (cursor.getCount() > 0)
            return true;
        else
            return false;
    }
}

Here are important code snippet in which i think there is problem

forgetpass.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(LoginPage.this,ForgetPasswordPage.class);
                startActivity(intent);
            }
        });

in above snippet the intent is not working properly when clicked first time the app automatically minimized and when clicked again it crashes completely

signin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String uname = username.getEditText().getText().toString();
                String pass = password.getEditText().getText().toString();

                if (dbHelper.checkUsername(uname))
                {
                    if (dbHelper.checkusernamePassword(uname,pass))
                    {
                        Intent intent = new Intent(LoginPage.this, HomePage.class);
                        startActivity(intent);
                    }else {
                        password.setError("Incorrect password");
                    }
                }else {
                    username.setError("Username not found");
                }
            }
        });

for this sign in button the i think The DBHelper function might contain problem below are DBHelper code snippet

public  boolean checkUsername (String username) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor =  db.rawQuery("SELECT * FROM users WHERE usnername = ?",new  String[] {username});
        if (cursor.getCount() > 0)
            return true;
        else
            return false;
    }

    public boolean checkusernamePassword (String username, String password) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor =  db.rawQuery("SELECT * FROM users WHERE usnername = ? and password = ?",new  String[] {username,password});
        if (cursor.getCount() > 0)
            return true;
        else
            return false;
    }

    public boolean changePassword (String username, String password) {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery("UPDATE users SET passwod = ? WHERE username = ?",new String[] {password,username});
        if  (cursor.getCount() > 0)
            return true;
        else
            return false;
    }

i don't know the intent code are same but still it is not working as for sign in there must be problem in my query execution

1

There are 1 answers

4
MikeT On

When you want to return from an activity to it's caller/invoker then you should not start the activity to be returned to, you should finish the activity.

So instead of:-

back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ForgetPasswordPage.this, LoginPage.class);
                startActivity(intent);
            }
        });

You would use:-

    back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(ForgetPasswordPage.this, LoginPage.class);
            finish();
        }
    });