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 @@