diff --git a/Foodify/app/src/main/AndroidManifest.xml b/Foodify/app/src/main/AndroidManifest.xml
index 99325d9..0c3848a 100644
--- a/Foodify/app/src/main/AndroidManifest.xml
+++ b/Foodify/app/src/main/AndroidManifest.xml
@@ -17,6 +17,12 @@
android:theme="@style/Theme.Foodify"
tools:replace="android:theme"
tools:targetApi="31">
+
+
diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/ChangePassword.java b/Foodify/app/src/main/java/com/waterbase/foodify/ChangePassword.java
new file mode 100644
index 0000000..7f6bd19
--- /dev/null
+++ b/Foodify/app/src/main/java/com/waterbase/foodify/ChangePassword.java
@@ -0,0 +1,70 @@
+package com.waterbase.foodify;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import com.google.firebase.database.DataSnapshot;
+import com.google.firebase.database.DatabaseError;
+import com.google.firebase.database.DatabaseReference;
+import com.google.firebase.database.FirebaseDatabase;
+import com.google.firebase.database.ValueEventListener;
+import com.waterbase.foodify.Model.User;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class ChangePassword extends AppCompatActivity {
+
+ User user;
+ EditText edtPassword, edtPasswordVerify;
+ String phone;
+ Button btnChangePass;
+ final String PASSWORD_PATTERN = "^(?=.*[0-9])(?=.*[A-Z])(?=.*[@#$%^&+=!])(?=\\S+$).{4,}$";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_change_password);
+
+ edtPassword = findViewById(R.id.edtPassword);
+ edtPasswordVerify = findViewById(R.id.edtPasswordVerify);
+ btnChangePass = findViewById(R.id.btnChangePass);
+
+ user = (User) getIntent().getSerializableExtra("user");
+ phone = getIntent().getStringExtra("phone");
+
+ //Init Firebase
+ FirebaseDatabase database = FirebaseDatabase.getInstance();
+ final DatabaseReference table_user = database.getReference("User");
+
+ btnChangePass.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //Verify password
+ Pattern patternPassword = Pattern.compile(PASSWORD_PATTERN);
+ Matcher matcherPassword = patternPassword.matcher(edtPasswordVerify.getText().toString());
+
+ if (matcherPassword.matches() && edtPasswordVerify.getText().toString().length() >= 8) {
+
+ //Check same password
+ if (edtPassword.getText().toString().equals(edtPasswordVerify.getText().toString())) {
+ table_user.child(phone).child("password").setValue(edtPasswordVerify.getText().toString());
+ Toast.makeText(ChangePassword.this, "Đổi mật khẩu thành công. Vui lòng đăng nhập lại để tiếp tục!", Toast.LENGTH_SHORT).show();
+ startActivity(new Intent(ChangePassword.this, SignIn.class));
+ finish();
+ } else {
+ edtPasswordVerify.setError("Mật khẩu không giống nhau. Vui lòng kiểm tra lại!");
+ }
+ } else {
+ Toast.makeText(ChangePassword.this, "Mật khẩu của bạn cần tối thiểu có 8 ký tự, 1 ký tự viết hoa, 1 số và 1 ký tự đặc biệt!", Toast.LENGTH_LONG).show();
+ }
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/ForgotPassword.java b/Foodify/app/src/main/java/com/waterbase/foodify/ForgotPassword.java
new file mode 100644
index 0000000..48838dd
--- /dev/null
+++ b/Foodify/app/src/main/java/com/waterbase/foodify/ForgotPassword.java
@@ -0,0 +1,131 @@
+package com.waterbase.foodify;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ProgressBar;
+import android.widget.Toast;
+
+import com.google.firebase.FirebaseException;
+import com.google.firebase.auth.PhoneAuthCredential;
+import com.google.firebase.auth.PhoneAuthProvider;
+import com.google.firebase.database.DataSnapshot;
+import com.google.firebase.database.DatabaseError;
+import com.google.firebase.database.DatabaseReference;
+import com.google.firebase.database.FirebaseDatabase;
+import com.google.firebase.database.ValueEventListener;
+import com.waterbase.foodify.Common.Common;
+import com.waterbase.foodify.Model.User;
+
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class ForgotPassword extends AppCompatActivity {
+
+ EditText edtPhone;
+ ProgressBar progressBar;
+ Button btnSendOTP;
+
+ final String PHONE_PATTERN = "^0[98753]{1}\\d{8}$";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_forgot_password);
+
+ btnSendOTP = findViewById(R.id.btnSendOTP);
+ progressBar = findViewById(R.id.progressBar);
+ edtPhone = findViewById(R.id.edtPhone);
+
+ //Init Firebase
+ FirebaseDatabase database = FirebaseDatabase.getInstance();
+ final DatabaseReference table_user = database.getReference("User");
+
+ btnSendOTP.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //Validate Phone Number
+ Pattern patternPhone = Pattern.compile(PHONE_PATTERN);
+ Matcher matcherPhone = patternPhone.matcher(edtPhone.getText().toString());
+ if (matcherPhone.find()) {
+ if (!TextUtils.isEmpty(edtPhone.getText().toString())) {
+ //Check Internet
+ if (Common.isConnectedToInternet(getBaseContext())) {
+ progressBar.setVisibility(View.VISIBLE);
+ btnSendOTP.setVisibility(View.GONE);
+
+ //Get data from database
+ table_user.addListenerForSingleValueEvent(new ValueEventListener() {
+ @Override
+ public void onDataChange(DataSnapshot dataSnapshot) {
+ //Check phone in database
+ if (dataSnapshot.child(edtPhone.getText().toString()).exists()) {
+ progressBar.setVisibility(View.GONE);
+ btnSendOTP.setVisibility(View.VISIBLE);
+
+ PhoneAuthProvider.getInstance().verifyPhoneNumber(
+ "+84" + edtPhone.getText().toString(),
+ 60,
+ TimeUnit.SECONDS,
+ ForgotPassword.this,
+ new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
+ @Override
+ public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
+ progressBar.setVisibility(View.GONE);
+ btnSendOTP.setVisibility(View.VISIBLE);
+ }
+
+ @Override
+ public void onVerificationFailed(FirebaseException e) {
+ progressBar.setVisibility(View.GONE);
+ btnSendOTP.setVisibility(View.VISIBLE);
+ Toast.makeText(ForgotPassword.this, e.getMessage(), Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
+ progressBar.setVisibility(View.GONE);
+ btnSendOTP.setVisibility(View.VISIBLE);
+ Toast.makeText(ForgotPassword.this, "Mã OTP đã được gửi!", Toast.LENGTH_SHORT).show();
+ Intent intent = new Intent(ForgotPassword.this, VerifyPhone.class);
+ intent.putExtra("phone", edtPhone.getText().toString());
+ intent.putExtra("verificationId", verificationId);
+ intent.putExtra("isForgotPassword", "true");
+ startActivity(intent);
+ finish();
+ }
+ }
+ );
+ } else {
+ progressBar.setVisibility(View.GONE);
+ btnSendOTP.setVisibility(View.VISIBLE);
+ Toast.makeText(ForgotPassword.this, "Số điện thoại này chưa được đăng ký. Vui lòng kiểm tra lại!", Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ @Override
+ public void onCancelled(DatabaseError databaseError) {
+
+ }
+ });
+ } else {
+ Toast.makeText(ForgotPassword.this, "Vui lòng kiểm tra kết nối mạng!", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ } else {
+ Toast.makeText(ForgotPassword.this, "Vui lòng điền đầy đủ thông tin!", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ } else {
+ edtPhone.setError("Số điện thoại không đúng định dạng. Vui lòng kiểm tra lại");
+ }
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/SignIn.java b/Foodify/app/src/main/java/com/waterbase/foodify/SignIn.java
index 3b3a822..4bfa520 100644
--- a/Foodify/app/src/main/java/com/waterbase/foodify/SignIn.java
+++ b/Foodify/app/src/main/java/com/waterbase/foodify/SignIn.java
@@ -27,7 +27,7 @@ public class SignIn extends AppCompatActivity {
EditText edtPhone, edtPassword;
Button btnSignIn;
- TextView txtAppName;
+ TextView txtAppName, edtForgotPassword;
CheckBox ckbRemember;
@Override
@@ -39,6 +39,7 @@ public class SignIn extends AppCompatActivity {
edtPhone = (EditText) findViewById(R.id.edtPhone);
btnSignIn = (Button) findViewById(R.id.btnSignIn);
ckbRemember = (CheckBox)findViewById(R.id.ckbRemember);
+ edtForgotPassword = findViewById(R.id.forgotPassword);
//Init Paper
Paper.init(this);
@@ -109,6 +110,15 @@ public class SignIn extends AppCompatActivity {
}
}
});
+
+ //Set on click Forgot Password
+ edtForgotPassword.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(SignIn.this, ForgotPassword.class);
+ startActivity(intent);
+ }
+ });
}
public void register(View view) {
diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/SignUp.java b/Foodify/app/src/main/java/com/waterbase/foodify/SignUp.java
index dd76607..5ca9eec 100644
--- a/Foodify/app/src/main/java/com/waterbase/foodify/SignUp.java
+++ b/Foodify/app/src/main/java/com/waterbase/foodify/SignUp.java
@@ -30,13 +30,17 @@ import com.waterbase.foodify.Common.Common;
import com.waterbase.foodify.Model.User;
import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
public class SignUp extends AppCompatActivity {
- EditText edtPhone, edtName, edtPassword;
+ EditText edtPhone, edtName, edtPassword, edtPasswordVerify;
Button btnSignUp;
TextView txtAppName;
+ final String PASSWORD_PATTERN = "^(?=.*[0-9])(?=.*[A-Z])(?=.*[@#$%^&+=!])(?=\\S+$).{4,}$";
+ final String PHONE_PATTERN = "^0[98753]{1}\\d{8}$";
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -45,6 +49,7 @@ public class SignUp extends AppCompatActivity {
edtName = (EditText) findViewById(R.id.txtFullName);
edtPassword = (EditText) findViewById(R.id.edtPassword);
+ edtPasswordVerify = (EditText) findViewById(R.id.edtPasswordVerify);
edtPhone = (EditText) findViewById(R.id.edtPhone);
btnSignUp = (Button) findViewById(R.id.btnSignUp);
@@ -62,70 +67,94 @@ public class SignUp extends AppCompatActivity {
btnSignUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- if(!TextUtils.isEmpty(edtName.getText().toString()) && !TextUtils.isEmpty(edtPassword.getText().toString())
- && !TextUtils.isEmpty(edtPhone.getText().toString())) {
- if (Common.isConnectedToInternet(getBaseContext())) {
- progressBar.setVisibility(View.VISIBLE);
- btnSignUp.setVisibility(View.GONE);
- table_user.addListenerForSingleValueEvent(new ValueEventListener() {
- @Override
- public void onDataChange(DataSnapshot dataSnapshot) {
- //Check if already user phone
- if (dataSnapshot.child(edtPhone.getText().toString()).exists()) {
- progressBar.setVisibility(View.GONE);
- btnSignUp.setVisibility(View.VISIBLE);
- Toast.makeText(SignUp.this, "Số điện thoại đã được đăng ký!", Toast.LENGTH_SHORT).show();
- finish();
- } else {
- //Success
+ if (!TextUtils.isEmpty(edtName.getText().toString()) && !TextUtils.isEmpty(edtPassword.getText().toString())
+ && !TextUtils.isEmpty(edtPhone.getText().toString())) {
- PhoneAuthProvider.getInstance().verifyPhoneNumber(
- "+84" + edtPhone.getText().toString(),
- 60,
- TimeUnit.SECONDS,
- SignUp.this,
- new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
- @Override
- public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
- progressBar.setVisibility(View.GONE);
- btnSignUp.setVisibility(View.VISIBLE);
- }
+ //Verify password
+ Pattern patternPassword = Pattern.compile(PASSWORD_PATTERN);
+ Matcher matcherPassword = patternPassword.matcher(edtPasswordVerify.getText().toString());
- @Override
- public void onVerificationFailed(FirebaseException e) {
- progressBar.setVisibility(View.GONE);
- btnSignUp.setVisibility(View.VISIBLE);
- Toast.makeText(SignUp.this, e.getMessage(), Toast.LENGTH_SHORT).show();
- }
+ if (matcherPassword.matches() && edtPasswordVerify.getText().toString().length() >= 8) {
- @Override
- public void onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
- progressBar.setVisibility(View.GONE);
- btnSignUp.setVisibility(View.VISIBLE);
- User user = new User(edtName.getText().toString(), edtPassword.getText().toString());
- Intent intent = new Intent(SignUp.this, VerifyPhone.class);
- intent.putExtra("user", user);
- intent.putExtra("phone", edtPhone.getText().toString());
- intent.putExtra("verificationId", verificationId);
- startActivity(intent);
- }
+ //Check same password
+ if (edtPassword.getText().toString().equals(edtPasswordVerify.getText().toString())) {
+
+ //Validate Phone Number
+ Pattern patternPhone = Pattern.compile(PHONE_PATTERN);
+ Matcher matcherPhone = patternPhone.matcher(edtPhone.getText().toString());
+ if (matcherPhone.find()) {
+
+ //Check Internet connection
+ if (Common.isConnectedToInternet(getBaseContext())) {
+ progressBar.setVisibility(View.VISIBLE);
+ btnSignUp.setVisibility(View.GONE);
+ table_user.addListenerForSingleValueEvent(new ValueEventListener() {
+ @Override
+ public void onDataChange(DataSnapshot dataSnapshot) {
+
+ //Check if already user phone
+ if (dataSnapshot.child(edtPhone.getText().toString()).exists()) {
+ progressBar.setVisibility(View.GONE);
+ btnSignUp.setVisibility(View.VISIBLE);
+ Toast.makeText(SignUp.this, "Số điện thoại đã được đăng ký!", Toast.LENGTH_SHORT).show();
+ finish();
+ } else {
+
+ //Success
+ PhoneAuthProvider.getInstance().verifyPhoneNumber(
+ "+84" + edtPhone.getText().toString(),
+ 60,
+ TimeUnit.SECONDS,
+ SignUp.this,
+ new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
+ @Override
+ public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
+ progressBar.setVisibility(View.GONE);
+ btnSignUp.setVisibility(View.VISIBLE);
+ }
+
+ @Override
+ public void onVerificationFailed(FirebaseException e) {
+ progressBar.setVisibility(View.GONE);
+ btnSignUp.setVisibility(View.VISIBLE);
+ Toast.makeText(SignUp.this, e.getMessage(), Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
+ progressBar.setVisibility(View.GONE);
+ btnSignUp.setVisibility(View.VISIBLE);
+ User user = new User(edtName.getText().toString(), edtPassword.getText().toString());
+ Intent intent = new Intent(SignUp.this, VerifyPhone.class);
+ intent.putExtra("user", user);
+ intent.putExtra("phone", edtPhone.getText().toString());
+ intent.putExtra("verificationId", verificationId);
+ startActivity(intent);
+ finish();
+ }
+ }
+ );
}
- );
-
-
+ }
+ @Override
+ public void onCancelled(DatabaseError databaseError) {
+ }
+ });
+ } else {
+ Toast.makeText(SignUp.this, "Vui lòng kiểm tra kết nối mạng!", Toast.LENGTH_SHORT).show();
+ return;
}
+ } else {
+ edtPhone.setError("Số điện thoại không đúng định dạng. Vui lòng kiểm tra lại!");
}
-
- @Override
- public void onCancelled(DatabaseError databaseError) {
-
- }
- });
+ } else {
+ edtPasswordVerify.setError("Mật khẩu không giống nhau! Vui lòng kiểm tra lại");
+ }
} else {
- Toast.makeText(SignUp.this, "Vui lòng kiểm tra kết nối mạng!", Toast.LENGTH_SHORT).show();
- return;
+ Toast.makeText(SignUp.this, "Mật khẩu của bạn cần tối thiểu có 8 ký tự, 1 ký tự viết hoa, 1 số và 1 ký tự đặc biệt!", Toast.LENGTH_LONG).show();
}
+
} else {
Toast.makeText(SignUp.this, "Vui lòng điền đầy đủ thông tin!", Toast.LENGTH_SHORT).show();
return;
diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/VerifyPhone.java b/Foodify/app/src/main/java/com/waterbase/foodify/VerifyPhone.java
index 128a7ec..6f75638 100644
--- a/Foodify/app/src/main/java/com/waterbase/foodify/VerifyPhone.java
+++ b/Foodify/app/src/main/java/com/waterbase/foodify/VerifyPhone.java
@@ -15,6 +15,7 @@ import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
+import com.firebase.ui.database.ChangeEventListener;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.FirebaseException;
@@ -35,7 +36,7 @@ public class VerifyPhone extends AppCompatActivity {
private EditText inputCode1, inputCode2, inputCode3, inputCode4, inputCode5, inputCode6;
User user = null;
- String verificationId, phone;
+ String verificationId, phone, isForgotPassword = null;
TextView resendCode, countdown;
@Override
@@ -45,9 +46,10 @@ public class VerifyPhone extends AppCompatActivity {
user = (User) getIntent().getSerializableExtra("user");
phone = getIntent().getStringExtra("phone");
+ isForgotPassword = getIntent().getStringExtra("isForgotPassword");
TextView textView = findViewById(R.id.txtPhone);
- textView.setText("Mã xác thực đã gửi đến số " + String.format("+84-%s", phone) + ". Vui lòng nhập mã OTP khi nhận được tin nhắn!");
+ textView.setText("Mã xác thực đã gửi đến số " + phone + ". Vui lòng nhập mã OTP khi nhận được tin nhắn!");
inputCode1 = findViewById(R.id.inputCode1);
inputCode2 = findViewById(R.id.inputCode2);
@@ -157,12 +159,25 @@ public class VerifyPhone extends AppCompatActivity {
table_user.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
- table_user.child(getIntent().getStringExtra("phone")).setValue(user);
- Intent intent = new Intent(getApplicationContext(), SignIn.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ if(isForgotPassword == null){
- Toast.makeText(VerifyPhone.this, "Tạo tài khoản thành công! Vui lòng đăng nhập lại để tiếp tục", Toast.LENGTH_SHORT).show();
- startActivity(intent);
+ //Create new User
+ table_user.child(getIntent().getStringExtra("phone")).setValue(user);
+ Intent intent = new Intent(getApplicationContext(), SignIn.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+
+ Toast.makeText(VerifyPhone.this, "Tạo tài khoản thành công! Vui lòng đăng nhập lại để tiếp tục", Toast.LENGTH_SHORT).show();
+ startActivity(intent);
+ finish();
+ } else {
+
+ //Change pass user
+ Intent intent = new Intent(VerifyPhone.this, ChangePassword.class);
+ intent.putExtra("user", user);
+ intent.putExtra("phone", phone);
+ startActivity(intent);
+ finish();
+ }
}
@Override
@@ -170,13 +185,6 @@ public class VerifyPhone extends AppCompatActivity {
}
});
-
-// //-------------------------------------------------------
-// User user = new User(edtName.getText().toString(), edtPassword.getText().toString());
-// table_user.child(edtPhone.getText().toString()).setValue(user);
-// Toast.makeText(SignUp.this, "Đăng ký thành công!", Toast.LENGTH_SHORT).show();
-// finish();
-// //--------------------------------------------------------
} else {
Toast.makeText(VerifyPhone.this, "Mã code không đúng. Vui lòng kiểm tra lại!", Toast.LENGTH_SHORT).show();
}
diff --git a/Foodify/app/src/main/res/layout/activity_change_password.xml b/Foodify/app/src/main/res/layout/activity_change_password.xml
new file mode 100644
index 0000000..d1061ab
--- /dev/null
+++ b/Foodify/app/src/main/res/layout/activity_change_password.xml
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Foodify/app/src/main/res/layout/activity_forgot_password.xml b/Foodify/app/src/main/res/layout/activity_forgot_password.xml
new file mode 100644
index 0000000..029c8b9
--- /dev/null
+++ b/Foodify/app/src/main/res/layout/activity_forgot_password.xml
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Foodify/app/src/main/res/layout/activity_sign_in.xml b/Foodify/app/src/main/res/layout/activity_sign_in.xml
index 4cb77e8..512edb7 100644
--- a/Foodify/app/src/main/res/layout/activity_sign_in.xml
+++ b/Foodify/app/src/main/res/layout/activity_sign_in.xml
@@ -14,7 +14,7 @@
android:scaleType="centerCrop"
android:src="@drawable/bg4"
tools:layout_editor_absoluteX="0dp"
- tools:layout_editor_absoluteY="-32dp" />
+ tools:layout_editor_absoluteY="0dp" />
+
+
+
+