diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml
deleted file mode 100644
index d9cebe6..0000000
--- a/.idea/deploymentTargetDropDown.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 932632c..7d8b877 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -93,10 +93,6 @@
android:name=".Activity.FoodDetailActivity"
android:exported="false"
android:noHistory="true" />
-
diff --git a/app/src/main/java/com/capstone/foodify/API/FoodApi.java b/app/src/main/java/com/capstone/foodify/API/FoodApi.java
index f38d135..a2d448c 100644
--- a/app/src/main/java/com/capstone/foodify/API/FoodApi.java
+++ b/app/src/main/java/com/capstone/foodify/API/FoodApi.java
@@ -1,5 +1,6 @@
package com.capstone.foodify.API;
+import com.capstone.foodify.Common;
import com.capstone.foodify.Model.Comment;
import com.capstone.foodify.Model.DistrictWardResponse;
import com.capstone.foodify.Model.Food;
@@ -31,7 +32,7 @@ public interface FoodApi {
Gson gson = new GsonBuilder().setDateFormat("HH:mm:ss dd-MM-yyyy").setLenient().create();
FoodApi apiService = new Retrofit.Builder()
- .baseUrl("http://192.168.1.183:8080/api/").addConverterFactory(GsonConverterFactory.create(gson))
+ .baseUrl(Common.BASE_URL).addConverterFactory(GsonConverterFactory.create(gson))
.build()
.create(FoodApi.class);
diff --git a/app/src/main/java/com/capstone/foodify/API/FoodApiToken.java b/app/src/main/java/com/capstone/foodify/API/FoodApiToken.java
index a015642..200bebb 100644
--- a/app/src/main/java/com/capstone/foodify/API/FoodApiToken.java
+++ b/app/src/main/java/com/capstone/foodify/API/FoodApiToken.java
@@ -4,6 +4,7 @@ import static com.capstone.foodify.Common.TOKEN;
import androidx.annotation.NonNull;
+import com.capstone.foodify.Common;
import com.capstone.foodify.Model.Address;
import com.capstone.foodify.Model.Comment;
import com.capstone.foodify.Model.Food;
@@ -47,7 +48,7 @@ public interface FoodApiToken {
FoodApiToken apiService = new Retrofit.Builder()
.client(client)
- .baseUrl("http://192.168.1.183:8080/api/").addConverterFactory(GsonConverterFactory.create(gson))
+ .baseUrl(Common.BASE_URL).addConverterFactory(GsonConverterFactory.create(gson))
.build()
.create(FoodApiToken.class);
diff --git a/app/src/main/java/com/capstone/foodify/API/TokenFCMFirebaseAPI.java b/app/src/main/java/com/capstone/foodify/API/TokenFCMFirebaseAPI.java
new file mode 100644
index 0000000..20734db
--- /dev/null
+++ b/app/src/main/java/com/capstone/foodify/API/TokenFCMFirebaseAPI.java
@@ -0,0 +1,19 @@
+package com.capstone.foodify.API;
+
+import com.capstone.foodify.Common;
+
+import retrofit2.Call;
+import retrofit2.Retrofit;
+import retrofit2.converter.scalars.ScalarsConverterFactory;
+import retrofit2.http.GET;
+
+public interface TokenFCMFirebaseAPI {
+
+ TokenFCMFirebaseAPI apiService = new Retrofit.Builder()
+ .baseUrl(Common.BASE_URL).addConverterFactory(ScalarsConverterFactory.create())
+ .build()
+ .create(TokenFCMFirebaseAPI.class);
+
+ @GET("users/{userId}/fcm")
+ Call getTokenFCM();
+}
diff --git a/app/src/main/java/com/capstone/foodify/Activity/ForgotPasswordActivity.java b/app/src/main/java/com/capstone/foodify/Activity/ForgotPasswordActivity.java
index 85cf8d6..791c654 100644
--- a/app/src/main/java/com/capstone/foodify/Activity/ForgotPasswordActivity.java
+++ b/app/src/main/java/com/capstone/foodify/Activity/ForgotPasswordActivity.java
@@ -16,6 +16,8 @@ import com.capstone.foodify.Common;
import com.capstone.foodify.Model.Response.CustomResponse;
import com.capstone.foodify.Model.User;
import com.capstone.foodify.R;
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.textfield.TextInputLayout;
import com.google.firebase.FirebaseException;
@@ -23,16 +25,24 @@ import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.PhoneAuthCredential;
import com.google.firebase.auth.PhoneAuthOptions;
import com.google.firebase.auth.PhoneAuthProvider;
+import com.google.firebase.auth.SignInMethodQueryResult;
+import com.thecode.aestheticdialogs.AestheticDialog;
+import com.thecode.aestheticdialogs.DialogStyle;
+import com.thecode.aestheticdialogs.DialogType;
+import com.thecode.aestheticdialogs.OnDialogClickListener;
import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class ForgotPasswordActivity extends AppCompatActivity {
- TextInputLayout textInput_phone;
- EditText edt_phone;
+ private FirebaseAuth mAuth;
+ TextInputLayout textInput_email;
+ EditText edt_email;
MaterialButton send_code_button;
ConstraintLayout progress_layout;
ImageView back_image;
@@ -43,6 +53,8 @@ public class ForgotPasswordActivity extends AppCompatActivity {
initComponent();
+ mAuth = FirebaseAuth.getInstance();
+
//Back button
back_image.setOnClickListener(new View.OnClickListener() {
@Override
@@ -54,86 +66,85 @@ public class ForgotPasswordActivity extends AppCompatActivity {
send_code_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
+ progress_layout.setVisibility(View.VISIBLE);
+ if(checkEmailValid()){
+ mAuth.setLanguageCode("vi");
- findUserByPhone(edt_phone.getText().toString());
+ mAuth.fetchSignInMethodsForEmail(edt_email.getText().toString())
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+
+ boolean isNewUser = task.getResult().getSignInMethods().isEmpty();
+
+ if (isNewUser) {
+ new AestheticDialog.Builder(ForgotPasswordActivity.this, DialogStyle.TOASTER, DialogType.ERROR)
+ .setTitle("Thông báo!")
+ .setMessage("Tài khoản chưa được đăng ký ở hệ thống! Vui lòng kiểm tra lại")
+ .setCancelable(true).show();
+ } else {
+ sendEmail();
+ }
+
+ }
+ });
+ }
}
});
setFontUI();
}
- private void findUserByPhone(String phone){
+ private void sendEmail(){
- User user = new User();
- user.setPhoneNumber(phone);
-
- FoodApi.apiService.checkEmailOrPhoneExist(user).enqueue(new Callback() {
+ mAuth.sendPasswordResetEmail(edt_email.getText().toString()).addOnCompleteListener(new OnCompleteListener() {
@Override
- public void onResponse(Call call, Response response) {
- CustomResponse responseData = response.body();
+ public void onComplete(@NonNull Task task) {
+ if(task.isSuccessful()){
+ new AestheticDialog.Builder(ForgotPasswordActivity.this, DialogStyle.TOASTER, DialogType.SUCCESS)
+ .setTitle("Email đã được gửi!")
+ .setMessage("Vui lòng kiểm tra hộp thư và làm theo hướng dẫn để tiếp tục!")
+ .setCancelable(true).show();
- if(responseData != null){
- if(responseData.isTrue()){
- //If this phone number has already register in server, send the code
-
- } else {
- //If this phone number
- Toast.makeText(ForgotPasswordActivity.this, "Hệ thống hiện chưa tìm thấy số điện thoại này, vui lòng kiểm tra lại!", Toast.LENGTH_SHORT).show();
- }
+ progress_layout.setVisibility(View.GONE);
}
}
-
- @Override
- public void onFailure(Call call, Throwable t) {
-
- }
});
+
}
- private void sendCode(){
- FirebaseAuth auth = FirebaseAuth.getInstance();
- auth.setLanguageCode("vi");
- PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth)
- .setPhoneNumber(Common.PHONE_CODE + edt_phone.getText().toString())
- .setTimeout(0L, TimeUnit.SECONDS)
- .setActivity(this)
- .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
- @Override
- public void onCodeSent(@NonNull String verificationId,
- @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
+ private boolean checkEmailValid() {
+ boolean dataHasValidate = true;
+ //Check phone number
+ if (edt_email.getText().toString().isEmpty()) {
+ textInput_email.setError("Email không được bỏ trống!");
+ dataHasValidate = false;
+ } else {
- Intent intent = new Intent(ForgotPasswordActivity.this, VerifyAccountActivity.class);
- intent.putExtra("phone", edt_phone.getText().toString());
- intent.putExtra("verificationId", verificationId);
- intent.putExtra(Common.IS_FORGOT_PASSWORD, Common.IS_FORGOT_PASSWORD);
- startActivity(intent);
- finish();
- }
+ //Check email valid
+ Pattern patternEmail = Pattern.compile(Common.VALID_EMAIL_ADDRESS_REGEX, Pattern.CASE_INSENSITIVE);
+ Matcher matcherEmail = patternEmail.matcher(edt_email.getText().toString());
+ if (!matcherEmail.matches()) {
+ textInput_email.setError("Địa chỉ email không đúng định dạng. Xin vui lòng kiểm tra lại!");
+ dataHasValidate = false;
+ } else {
+ textInput_email.setErrorEnabled(false);
+ }
+ }
- @Override
- public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
-
- }
-
- @Override
- public void onVerificationFailed(@NonNull FirebaseException e) {
- // ...
- }
- })
- .build();
- PhoneAuthProvider.verifyPhoneNumber(options);
+ return dataHasValidate;
}
-
private void setFontUI() {
- textInput_phone = (TextInputLayout) findViewById(R.id.textInput_phone);
- textInput_phone.setTypeface(Common.setFontBebas(getAssets()));
+
+ textInput_email.setTypeface(Common.setFontBebas(getAssets()));
}
private void initComponent() {
- back_image = (ImageView) findViewById(R.id.back_image);
- send_code_button = (MaterialButton) findViewById(R.id.send_code_button);
- edt_phone = findViewById(R.id.edt_phone);
+ textInput_email = findViewById(R.id.textInput_email);
+ back_image = findViewById(R.id.back_image);
+ send_code_button = findViewById(R.id.send_code_button);
+ edt_email = findViewById(R.id.edt_email);
progress_layout = findViewById(R.id.progress_layout);
}
diff --git a/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java b/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java
index 9ae83ad..9d65aee 100644
--- a/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java
+++ b/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java
@@ -168,9 +168,6 @@ public class MainActivity extends AppCompatActivity {
startPowerSaverIntent(this);
checkNotificationPermission();
- if(Common.CURRENT_USER != null)
- getTokenFCM();
-
if (Common.CURRENT_LOCATION == null) {
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
@@ -227,6 +224,7 @@ public class MainActivity extends AppCompatActivity {
String token = task.getResult();
+ Common.FCM_TOKEN = token;
FoodApiToken.apiService.updateFCMToken(Common.CURRENT_USER.getId(), token).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
@@ -307,8 +305,6 @@ public class MainActivity extends AppCompatActivity {
}
});
}
-
- //myringtone permission
private void checkNotificationPermission(){
if(!NotificationManagerCompat.from(this).areNotificationsEnabled()){
showDialogPermission("Hãy bật quyền thông báo trên thiết bị của bạn để chúng thôi có thể cung cấp thông tin cho bạn một cách nhanh nhất!");
@@ -428,6 +424,9 @@ public class MainActivity extends AppCompatActivity {
if (mRequestingLocationUpdates && checkPermission() && Common.CURRENT_LOCATION == null) {
startLocationUpdates();
}
+
+ if(Common.CURRENT_USER != null && Common.FCM_TOKEN == null)
+ getTokenFCM();
}
@Override
@@ -441,9 +440,6 @@ public class MainActivity extends AppCompatActivity {
Common.CURRENT_LOCATION = mCurrentLocation;
}
}
-
- if(Common.CURRENT_USER != null)
- getTokenFCM();
}
//Check auto start permission
diff --git a/app/src/main/java/com/capstone/foodify/Activity/ResetPasswordActivity.java b/app/src/main/java/com/capstone/foodify/Activity/ResetPasswordActivity.java
deleted file mode 100644
index 1a549e9..0000000
--- a/app/src/main/java/com/capstone/foodify/Activity/ResetPasswordActivity.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.capstone.foodify.Activity;
-
-import androidx.appcompat.app.AppCompatActivity;
-
-import android.graphics.Typeface;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.ImageView;
-
-import com.capstone.foodify.Common;
-import com.capstone.foodify.R;
-import com.google.android.material.textfield.TextInputLayout;
-
-public class ResetPasswordActivity extends AppCompatActivity {
-
- ImageView close_image;
- TextInputLayout textInput_password, textInput_confirmPassword;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_reset_password);
-
- initComponent();
-
- setFontUI();
-
- close_image.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- onBackPressed();
- }
- });
- }
-
- private void setFontUI() {
- textInput_password.setTypeface(Common.setFontBebas(getAssets()));
- textInput_confirmPassword.setTypeface(Common.setFontBebas(getAssets()));
- }
-
- private void initComponent() {
- close_image = (ImageView) findViewById(R.id.close_image);
- textInput_password = (TextInputLayout) findViewById(R.id.textInput_password);
- textInput_confirmPassword = (TextInputLayout) findViewById(R.id.textInput_confirmPassword);
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/capstone/foodify/Common.java b/app/src/main/java/com/capstone/foodify/Common.java
index 9e9c071..98c93d0 100644
--- a/app/src/main/java/com/capstone/foodify/Common.java
+++ b/app/src/main/java/com/capstone/foodify/Common.java
@@ -40,9 +40,10 @@ import retrofit2.Callback;
import retrofit2.Response;
public class Common {
+ public static final String BASE_URL = "https://foodify-backend-production.up.railway.app/api/";
+ public static String FCM_TOKEN = null;
public static Location CURRENT_LOCATION = null;
public static final String MAP_API = "AIzaSyAY14Ic32UP26Hg6GILznOfbBihiY5BUxw";
- public static final String IS_FORGOT_PASSWORD = "isForgotPassword";
public static final String FORMAT_DATE="dd-MM-yyyy";
public static final String VALID_EMAIL_ADDRESS_REGEX = "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$";
public static final String PHONE_CODE = "+84";
diff --git a/app/src/main/res/drawable/logo.png b/app/src/main/res/drawable/logo.png
index bd41f95..0dbc513 100644
Binary files a/app/src/main/res/drawable/logo.png and b/app/src/main/res/drawable/logo.png differ
diff --git a/app/src/main/res/layout/activity_forgot_password.xml b/app/src/main/res/layout/activity_forgot_password.xml
index 5913f19..2d18fd5 100644
--- a/app/src/main/res/layout/activity_forgot_password.xml
+++ b/app/src/main/res/layout/activity_forgot_password.xml
@@ -38,40 +38,43 @@
+ app:layout_constraintTop_toBottomOf="@+id/textView"
+ app:layout_constraintEnd_toEndOf="parent"
+ />
+ android:inputType="textEmailAddress" />
@@ -82,12 +85,12 @@
android:layout_height="wrap_content"
android:fontFamily="@font/bebas"
android:padding="10dp"
- android:layout_marginStart="20dp"
- android:layout_marginEnd="20dp"
+ android:layout_marginStart="40dp"
+ android:layout_marginEnd="40dp"
android:layout_marginTop="30dp"
- android:text="Gửi mã xác nhận"
+ android:text="Gửi email"
android:textSize="20sp"
- app:layout_constraintTop_toBottomOf="@+id/textInput_phone" />
+ app:layout_constraintTop_toBottomOf="@+id/textInput_email" />
diff --git a/app/src/main/res/layout/activity_order_check_out.xml b/app/src/main/res/layout/activity_order_check_out.xml
index 3466c17..4ae14aa 100644
--- a/app/src/main/res/layout/activity_order_check_out.xml
+++ b/app/src/main/res/layout/activity_order_check_out.xml
@@ -304,7 +304,8 @@