Manage address function + improve performance app

This commit is contained in:
Nezumi
2023-03-20 16:24:43 +07:00
parent 30b4e9338c
commit 7df8e7dd4f
15 changed files with 326 additions and 130 deletions
+1 -1
View File
@@ -71,7 +71,7 @@ dependencies {
implementation 'com.squareup.picasso:picasso:2.71828' implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.github.ome450901:SimpleRatingBar:1.5.1' implementation 'com.github.ome450901:SimpleRatingBar:1.5.1'
implementation 'com.cepheuen.elegant-number-button:lib:1.0.2' implementation 'com.cepheuen.elegant-number-button:lib:1.0.2'
implementation 'com.github.slavce14:SJ-Dialog:1.5' implementation 'com.github.slavce14:SJ-Dialog:1.6'
implementation 'com.saadahmedev.popup-dialog:popup-dialog:1.0.2' implementation 'com.saadahmedev.popup-dialog:popup-dialog:1.0.2'
implementation 'com.github.gabriel-TheCode:AestheticDialogs:1.3.6' implementation 'com.github.gabriel-TheCode:AestheticDialogs:1.3.6'
implementation 'io.github.pilgr:paperdb:2.7.2' implementation 'io.github.pilgr:paperdb:2.7.2'
@@ -71,4 +71,10 @@ public interface FoodApiToken {
@POST("users/{userId}/addresses") @POST("users/{userId}/addresses")
Call<CustomResponse> createAddressUser(@Path("userId") int userId, @Body Address address); Call<CustomResponse> createAddressUser(@Path("userId") int userId, @Body Address address);
@PUT("users/{userId}/addresses/{addressId}")
Call<CustomResponse> editAddressUser(@Path("userId") int userId, @Path("addressId") int addressId, @Body Address address);
@DELETE("users/{userId}/addresses/{addressId}")
Call<CustomResponse> deleteAddressUser(@Path("userId") int userId, @Path("addressId") int addressId);
} }
@@ -1,10 +1,5 @@
package com.capstone.foodify.Activity; package com.capstone.foodify.Activity;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Context; import android.content.Context;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.os.Bundle; import android.os.Bundle;
@@ -14,25 +9,36 @@ import android.view.ViewGroup;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Button; import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.capstone.foodify.API.FoodApi; import com.capstone.foodify.API.FoodApi;
import com.capstone.foodify.API.FoodApiToken; import com.capstone.foodify.API.FoodApiToken;
import com.capstone.foodify.Adapter.AddressAdapter;
import com.capstone.foodify.Common; import com.capstone.foodify.Common;
import com.capstone.foodify.Model.Address; import com.capstone.foodify.Model.Address;
import com.capstone.foodify.Adapter.AddressAdapter;
import com.capstone.foodify.Model.DistrictWardResponse; import com.capstone.foodify.Model.DistrictWardResponse;
import com.capstone.foodify.Model.Response.CustomResponse; import com.capstone.foodify.Model.Response.CustomResponse;
import com.capstone.foodify.Model.User;
import com.capstone.foodify.R; import com.capstone.foodify.R;
import com.google.android.material.textfield.TextInputLayout; import com.google.android.material.textfield.TextInputLayout;
import com.sjapps.library.customdialog.BasicDialog;
import com.sjapps.library.customdialog.CustomViewDialog; import com.sjapps.library.customdialog.CustomViewDialog;
import com.sjapps.library.customdialog.DialogButtonEvents; import com.sjapps.library.customdialog.DialogButtonEvents;
import com.sjapps.library.customdialog.SJDialog;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
import retrofit2.Call; import retrofit2.Call;
@@ -46,12 +52,13 @@ public class AddressManagerActivity extends AppCompatActivity {
private AddressAdapter adapter; private AddressAdapter adapter;
private Button add_address_button; private Button add_address_button;
private TextInputLayout textInput_address; private TextInputLayout textInput_address;
private ImageView back_image; private ImageView back_image, edit_btn;
private TextView txt_Address, errorTextDistrictWard; private TextView txt_Address, errorTextDistrictWard;
private List<Address> listAddress = new ArrayList<>(); private List<Address> listAddress = new ArrayList<>();
Spinner wardSpinner, districtSpinner; Spinner wardSpinner, districtSpinner;
EditText edt_address; EditText edt_address;
ConstraintLayout progressLayout, progressLayoutDialog; ConstraintLayout progressLayout, progressLayoutDialog;
CheckBox default_address_checkbox;
private static final ArrayList<String> wardList = new ArrayList<>(); private static final ArrayList<String> wardList = new ArrayList<>();
private static final ArrayList<String> districtList = new ArrayList<>(); private static final ArrayList<String> districtList = new ArrayList<>();
String address, ward, district; String address, ward, district;
@@ -67,6 +74,7 @@ public class AddressManagerActivity extends AppCompatActivity {
back_image = findViewById(R.id.back_image); back_image = findViewById(R.id.back_image);
txt_Address = findViewById(R.id.text_view_address); txt_Address = findViewById(R.id.text_view_address);
progressLayout = findViewById(R.id.progress_layout); progressLayout = findViewById(R.id.progress_layout);
edit_btn = findViewById(R.id.edit_button);
//Set layout recyclerview //Set layout recyclerview
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
@@ -87,22 +95,40 @@ public class AddressManagerActivity extends AppCompatActivity {
add_address_button.setOnClickListener(new View.OnClickListener() { add_address_button.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
showAddAddressDialog(null, null, null); showAddAndEditAddressDialog(null);
}
});
//Set event when user click on edit button
edit_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showAddAndEditAddressDialog(defaultAddress);
} }
}); });
} }
private void getAddressList(){ private void getAddressList(){
listAddress.clear();
listAddress.addAll(Common.CURRENT_USER.getAddresses()); listAddress.addAll(Common.CURRENT_USER.getAddresses());
//Remove default address in address list
for(Address tempAddress: Common.CURRENT_USER.getAddresses()){
if(Common.CURRENT_USER.getDefaultAddress() == tempAddress.getId()){
listAddress.remove(tempAddress);
break;
}
}
adapter.setData(listAddress); adapter.setData(listAddress);
recycler_view_address.setAdapter(adapter); recycler_view_address.setAdapter(adapter);
progressLayout.setVisibility(View.GONE); progressLayout.setVisibility(View.GONE);
} }
private void initData(){ private void initDefaultAddress(){
//Create a full address string //Create a full address string
String fullAddress = defaultAddress.getAddress() + ", " + defaultAddress.getWard() + ", " + defaultAddress.getDistrict(); String fullAddress = defaultAddress.getAddress() + ", " + defaultAddress.getWard() + ", " + defaultAddress.getDistrict();
@@ -114,7 +140,7 @@ public class AddressManagerActivity extends AppCompatActivity {
for(Address tempAddress: Common.CURRENT_USER.getAddresses()){ for(Address tempAddress: Common.CURRENT_USER.getAddresses()){
if(Common.CURRENT_USER.getDefaultAddress() == tempAddress.getId()){ if(Common.CURRENT_USER.getDefaultAddress() == tempAddress.getId()){
defaultAddress = tempAddress; defaultAddress = tempAddress;
initData(); initDefaultAddress();
getAddressList(); getAddressList();
break; break;
} }
@@ -122,12 +148,12 @@ public class AddressManagerActivity extends AppCompatActivity {
if(defaultAddress == null){ if(defaultAddress == null){
progressLayout.setVisibility(View.GONE); progressLayout.setVisibility(View.GONE);
Toast.makeText(this, "Đã có lỗi từ hệ thống, vui lòng thử lại sau!", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "Không lấy được default address!", Toast.LENGTH_SHORT).show();
} }
} }
private void addAddress(String address, String ward, String district){ private void addAddress(String address, String ward, String district, boolean isChecked){
progressLayoutDialog.setVisibility(View.VISIBLE); progressLayoutDialog.setVisibility(View.VISIBLE);
//Create object address //Create object address
@@ -135,14 +161,15 @@ public class AddressManagerActivity extends AppCompatActivity {
FoodApiToken.apiService.createAddressUser(Common.CURRENT_USER.getId(), newAddress).enqueue(new Callback<CustomResponse>() { FoodApiToken.apiService.createAddressUser(Common.CURRENT_USER.getId(), newAddress).enqueue(new Callback<CustomResponse>() {
@Override @Override
public void onResponse(Call<CustomResponse> call, Response<CustomResponse> response) { public void onResponse(Call<CustomResponse> call, Response<CustomResponse> response) {
Toast.makeText(AddressManagerActivity.this, "Đã thêm địa chỉ thành công!", Toast.LENGTH_SHORT).show();
//Add address to list address at local storage CustomResponse responseData = response.body();
listAddress.add(newAddress);
adapter.notifyDataSetChanged(); if(responseData.getTitle().equals("Create address")){
Toast.makeText(AddressManagerActivity.this, "Đã thêm địa chỉ thành công!", Toast.LENGTH_SHORT).show();
progressLayoutDialog.setVisibility(View.GONE); //Update data user
updateUser(isChecked);
}
} }
@Override @Override
@@ -152,7 +179,141 @@ public class AddressManagerActivity extends AppCompatActivity {
}); });
} }
public void showAddAddressDialog(String addressUser, String wardUser, String districtUser){ public void deleteAddress(int addressId){
FoodApiToken.apiService.deleteAddressUser(Common.CURRENT_USER.getId(), addressId).enqueue(new Callback<CustomResponse>() {
@Override
public void onResponse(Call<CustomResponse> call, Response<CustomResponse> response) {
Toast.makeText(AddressManagerActivity.this, "Đã xoá địa chỉ thành công!", Toast.LENGTH_SHORT).show();
updateUser(false);
}
@Override
public void onFailure(Call<CustomResponse> call, Throwable t) {
Toast.makeText(AddressManagerActivity.this, "Đã có lỗi từ hệ thống! Vui lòng thử lại sau!", Toast.LENGTH_SHORT).show();
}
});
}
private void changeDefaultAddress(int idAddress){
Common.CURRENT_USER.setDefaultAddress(idAddress);
FoodApiToken.apiService.updateUser(Common.CURRENT_USER.getId(), Common.CURRENT_USER).enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
Toast.makeText(AddressManagerActivity.this, "Đã thay đổi địa chỉ mặc định thành công!", Toast.LENGTH_SHORT).show();
//Update default address
getDefaultAddress();
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Toast.makeText(AddressManagerActivity.this, "Đã có lỗi khi thay đổi địa chỉ mặc định, vui lòng thử lại sau!", Toast.LENGTH_SHORT).show();
}
});
}
private void updateUser(boolean isChecked){
//Get user from database
FoodApiToken.apiService.getUserFromEmail(Common.CURRENT_USER.getEmail()).enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
User userData = response.body();
if(userData != null){
Common.CURRENT_USER = userData;
getAddressList();
if(isChecked){
List<Address> tempListAddress = Common.CURRENT_USER.getAddresses();
Collections.sort(tempListAddress, Comparator.comparingLong(Address::getId));
Address newDefaultAddress = tempListAddress.get(tempListAddress.size() - 1);
changeDefaultAddress(newDefaultAddress.getId());
}
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
}
});
}
public void showConfirmDeleteDialog(int addressId, String message){
BasicDialog basicDialog = new BasicDialog();
basicDialog.Builder(this)
.setTitle("Xác nhận xoá?")
.setMessage("Địa chỉ: \"" + message + "\"?")
.setMessageAlignment(SJDialog.TEXT_ALIGNMENT_CENTER)
.setLeftButtonText("Xoá")
.setRightButtonText("Không")
.setLeftButtonColor(getResources().getColor(R.color.primaryColor, null))
.setRightButtonColor(getResources().getColor(R.color.gray, null))
.setLeftButtonTextColor(getResources().getColor(R.color.white, null))
.setRightButtonTextColor(getResources().getColor(R.color.white, null))
.onButtonClick(new DialogButtonEvents() {
@Override
public void onLeftButtonClick() {
deleteAddress(addressId);
basicDialog.dismiss();
}
@Override
public void onRightButtonClick() {
basicDialog.dismiss();
}
}).show();
}
private void editAddress(int userId, Address address, int oldAddressId, boolean isChecked){
//Change id address to 0 to call api from back-end
address.setId(0);
FoodApiToken.apiService.editAddressUser(userId, oldAddressId, address).enqueue(new Callback<CustomResponse>() {
@Override
public void onResponse(Call<CustomResponse> call, Response<CustomResponse> response) {
if(response.code() == 200){
//Back-end create another address with another id
//Update user
updateUser(isChecked);
Toast.makeText(AddressManagerActivity.this, "Đã thay đổi địa chỉ thành công!", Toast.LENGTH_SHORT).show();
} else if(response.code() == 400){
//Address is exist in user
//Check if checkbox default address is has been checked
if(isChecked){
//Restore id old address
for(Address tempAddress: Common.CURRENT_USER.getAddresses()){
if(tempAddress.getId() == 0){
tempAddress.setId(oldAddressId);
}
}
//Change default address
changeDefaultAddress(oldAddressId);
} else {
//Show notification address has been exist in user
Toast.makeText(AddressManagerActivity.this, "Địa chỉ đã bị trùng trong tài khoản của bạn, vui lòng kiểm tra lại!", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onFailure(Call<CustomResponse> call, Throwable t) {
}
});
}
public void showAddAndEditAddressDialog(Address oldAddress){
View view = LayoutInflater.from(this).inflate(R.layout.add_address_dialog,null); View view = LayoutInflater.from(this).inflate(R.layout.add_address_dialog,null);
//Init component //Init component
@@ -162,35 +323,22 @@ public class AddressManagerActivity extends AppCompatActivity {
edt_address = view.findViewById(R.id.edt_address); edt_address = view.findViewById(R.id.edt_address);
errorTextDistrictWard = view.findViewById(R.id.errorTextDistrictWard); errorTextDistrictWard = view.findViewById(R.id.errorTextDistrictWard);
progressLayoutDialog = view.findViewById(R.id.progress_layout); progressLayoutDialog = view.findViewById(R.id.progress_layout);
default_address_checkbox = view.findViewById(R.id.checkbox_default_address);
//Set font //Set font
textInput_address.setTypeface(Common.setFontOpenSans(getAssets())); textInput_address.setTypeface(Common.setFontOpenSans(getAssets()));
if(addressUser == null && wardUser == null && districtUser == null){
//Load district and ward
if(districtList.size() == 0){
getListDistrict("---Quận");
} else {
setAdapter(districtList, "---Quận", districtSpinner);
}
getListWard(0, "---Phường");
} else {
//Set default value ward and district depend on information from user
edt_address.setText(addressUser);
if(districtList.size() == 0){
getListDistrict(districtUser);
} else {
setAdapter(districtList, districtUser, districtSpinner);
}
}
//Set event when click on district spinner //Set event when click on district spinner
districtSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { districtSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override @Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
getListWard(i, wardUser); if(oldAddress != null){
getListWard(i, oldAddress.getWard());
} else {
getListWard(i, null);
}
} }
@Override @Override
@@ -204,21 +352,48 @@ public class AddressManagerActivity extends AppCompatActivity {
//Create dialog //Create dialog
customViewDialog.Builder(this); customViewDialog.Builder(this);
//Set title
if(addressUser == null && wardUser == null && districtUser == null){ if(oldAddress == null){
//If this is the create address form //If this is the create address form
//Set title
customViewDialog.setTitle("Thêm địa chỉ"); customViewDialog.setTitle("Thêm địa chỉ");
//Set left button text
customViewDialog.setLeftButtonText("Thêm");
//Load district and ward
if(districtList.size() == 0){
getListDistrict("---Quận");
} else {
setAdapter(districtList, "---Quận", districtSpinner);
}
getListWard(0, "---Phường");
} else { } else {
//If this is a edit form //If this is a edit form
//Set title
customViewDialog.setTitle("Thay đổi địa chỉ"); customViewDialog.setTitle("Thay đổi địa chỉ");
//Set left button text
customViewDialog.setLeftButtonText("Sửa");
//If this is a default address, hide checkbox default address
if(oldAddress.getId() == Common.CURRENT_USER.getDefaultAddress())
default_address_checkbox.setVisibility(View.GONE);
//Set default value ward and district depend on information from user
edt_address.setText(oldAddress.getAddress());
if(districtList.size() == 0){
getListDistrict(oldAddress.getDistrict());
} else {
setAdapter(districtList, oldAddress.getDistrict(), districtSpinner);
}
} }
//Create dialog width two buttons //Create dialog width two buttons
customViewDialog.dialogWithTwoButtons(); customViewDialog.dialogWithTwoButtons();
//Add custom view //Add custom view
customViewDialog.addCustomView(view); customViewDialog.addCustomView(view);
//Set left button text
customViewDialog.setLeftButtonText("Thêm");
//Set right button text //Set right button text
customViewDialog.setRightButtonText("Trở về"); customViewDialog.setRightButtonText("Trở về");
//Set color for left button //Set color for left button
@@ -230,22 +405,32 @@ public class AddressManagerActivity extends AppCompatActivity {
customViewDialog.onButtonClick(new DialogButtonEvents() { customViewDialog.onButtonClick(new DialogButtonEvents() {
@Override @Override
public void onLeftButtonClick() { public void onLeftButtonClick() {
//Get data
address = edt_address.getText().toString();
ward = wardSpinner.getSelectedItem().toString();
district = districtSpinner.getSelectedItem().toString();
if(addressUser == null && wardUser == null && districtUser == null){ if(oldAddress == null){
//If this is the create address form //If this is the create address form
//Get data
address = edt_address.getText().toString();
ward = wardSpinner.getSelectedItem().toString();
district = districtSpinner.getSelectedItem().toString();
if(validData(address, ward, district)){ if(validData(address, ward, district)){
addAddress(address, ward, district); addAddress(address, ward, district, default_address_checkbox.isChecked());
customViewDialog.dismiss(); customViewDialog.dismiss();
} }
} else { } else {
//If this is a edit form //If this is a edit form
//TODO Add edit address function if(validData(oldAddress.getAddress(), oldAddress.getWard(), oldAddress.getDistrict())){
//Change information address
oldAddress.setAddress(address);
oldAddress.setWard(ward);
oldAddress.setDistrict(district);
//Call api to change address
editAddress(Common.CURRENT_USER.getId(), oldAddress, oldAddress.getId(), default_address_checkbox.isChecked());
}
customViewDialog.dismiss();
} }
} }
@@ -272,9 +457,14 @@ public class AddressManagerActivity extends AppCompatActivity {
//Check district and ward //Check district and ward
if(district.equals("---Quận") || ward.equals("---Phường")){ if(district.equals("---Quận") || ward.equals("---Phường")){
errorTextDistrictWard.setVisibility(View.VISIBLE);
dataHasValidate = false; if(!district.equals("Huyện Hoàng Sa")){
errorTextDistrictWard.setVisibility(View.VISIBLE);
dataHasValidate = false;
} else{
errorTextDistrictWard.setVisibility(View.GONE);
}
} else { } else {
errorTextDistrictWard.setVisibility(View.GONE); errorTextDistrictWard.setVisibility(View.GONE);
} }
@@ -1,5 +1,14 @@
package com.capstone.foodify.Activity; package com.capstone.foodify.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
@@ -9,16 +18,6 @@ import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import android.app.Dialog;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.capstone.foodify.API.FoodApiToken; import com.capstone.foodify.API.FoodApiToken;
import com.capstone.foodify.Adapter.FoodFavoriteAdapter; import com.capstone.foodify.Adapter.FoodFavoriteAdapter;
import com.capstone.foodify.Adapter.RecyclerViewItemTouchHelperFavoriteFood; import com.capstone.foodify.Adapter.RecyclerViewItemTouchHelperFavoriteFood;
@@ -28,9 +27,6 @@ import com.capstone.foodify.Model.Food;
import com.capstone.foodify.Model.Response.Foods; import com.capstone.foodify.Model.Response.Foods;
import com.capstone.foodify.R; import com.capstone.foodify.R;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import com.saadahmedsoft.popupdialog.PopupDialog;
import com.saadahmedsoft.popupdialog.Styles;
import com.saadahmedsoft.popupdialog.listener.OnDialogButtonClickListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -23,13 +23,13 @@ import androidx.recyclerview.widget.RecyclerView;
import com.capstone.foodify.API.FoodApi; import com.capstone.foodify.API.FoodApi;
import com.capstone.foodify.API.FoodApiToken; import com.capstone.foodify.API.FoodApiToken;
import com.capstone.foodify.Adapter.ReviewAdapter;
import com.capstone.foodify.Common; import com.capstone.foodify.Common;
import com.capstone.foodify.Model.Basket; import com.capstone.foodify.Model.Basket;
import com.capstone.foodify.Model.Food; import com.capstone.foodify.Model.Food;
import com.capstone.foodify.Model.Image; import com.capstone.foodify.Model.Image;
import com.capstone.foodify.Model.Response.CustomResponse; import com.capstone.foodify.Model.Response.CustomResponse;
import com.capstone.foodify.Model.Review; import com.capstone.foodify.Model.Review;
import com.capstone.foodify.Adapter.ReviewAdapter;
import com.capstone.foodify.R; import com.capstone.foodify.R;
import com.denzcoskun.imageslider.ImageSlider; import com.denzcoskun.imageslider.ImageSlider;
import com.denzcoskun.imageslider.constants.ScaleTypes; import com.denzcoskun.imageslider.constants.ScaleTypes;
@@ -37,8 +37,6 @@ import com.denzcoskun.imageslider.models.SlideModel;
import com.mcdev.quantitizerlibrary.AnimationStyle; import com.mcdev.quantitizerlibrary.AnimationStyle;
import com.mcdev.quantitizerlibrary.HorizontalQuantitizer; import com.mcdev.quantitizerlibrary.HorizontalQuantitizer;
import com.mcdev.quantitizerlibrary.QuantitizerListener; import com.mcdev.quantitizerlibrary.QuantitizerListener;
import com.saadahmedsoft.popupdialog.PopupDialog;
import com.saadahmedsoft.popupdialog.Styles;
import com.willy.ratingbar.RotationRatingBar; import com.willy.ratingbar.RotationRatingBar;
import java.util.ArrayList; import java.util.ArrayList;
@@ -69,8 +69,6 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
public void onFailure(Call<User> call, Throwable t) { public void onFailure(Call<User> call, Throwable t) {
System.out.println("ERROR: " + t);
Common.showErrorServerNotification(MainActivity.this);
} }
}); });
} else { } else {
@@ -11,7 +11,6 @@ import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
import com.capstone.foodify.API.FoodApi;
import com.capstone.foodify.API.FoodApiToken; import com.capstone.foodify.API.FoodApiToken;
import com.capstone.foodify.Common; import com.capstone.foodify.Common;
import com.capstone.foodify.Model.User; import com.capstone.foodify.Model.User;
@@ -26,11 +25,6 @@ import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GetTokenResult; import com.google.firebase.auth.GetTokenResult;
import com.saadahmedsoft.popupdialog.PopupDialog;
import com.saadahmedsoft.popupdialog.Styles;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@@ -52,17 +52,35 @@ public class AddressAdapter extends RecyclerView.Adapter<AddressAdapter.AddressV
if(address == null) if(address == null)
return; return;
//Create a full address string
String fullAddress = address.getAddress() + ", " + address.getWard() + ", " + address.getDistrict(); String fullAddress;
//If user choice "Huyện Hoàng Sa" District
if(address.getWard().equals("---Phường")){
//Create a full address string
fullAddress = address.getAddress() + ", " + address.getDistrict();
} else {
fullAddress = address.getAddress() + ", " + address.getWard() + ", " + address.getDistrict();
}
//Bind data to component //Bind data to component
holder.text_view_address.setText(fullAddress); holder.text_view_address.setText(fullAddress);
//Edit address
holder.edit_btn.setOnClickListener(new View.OnClickListener() { holder.edit_btn.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if(context instanceof AddressManagerActivity){ if(context instanceof AddressManagerActivity){
((AddressManagerActivity)context).showAddAddressDialog(address.getAddress(), address.getWard(), address.getDistrict()); ((AddressManagerActivity)context).showAddAndEditAddressDialog(address);
}
}
});
//Delete address
holder.delete_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(context instanceof AddressManagerActivity){
((AddressManagerActivity)context).showConfirmDeleteDialog(address.getId(), fullAddress);
} }
} }
}); });
@@ -1,9 +1,7 @@
package com.capstone.foodify; package com.capstone.foodify;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.res.AssetManager; import android.content.res.AssetManager;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
@@ -14,14 +12,10 @@ import android.os.Build;
import androidx.annotation.IntRange; import androidx.annotation.IntRange;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.capstone.foodify.Activity.MainActivity; import com.capstone.foodify.API.FoodApiToken;
import com.capstone.foodify.Fragment.HomeFragment;
import com.capstone.foodify.Model.Basket; import com.capstone.foodify.Model.Basket;
import com.capstone.foodify.Model.Food;
import com.capstone.foodify.Model.User; import com.capstone.foodify.Model.User;
import com.google.firebase.auth.FirebaseAuth;
import com.saadahmedsoft.popupdialog.PopupDialog;
import com.saadahmedsoft.popupdialog.Styles;
import com.saadahmedsoft.popupdialog.listener.OnDialogButtonClickListener;
import com.thecode.aestheticdialogs.AestheticDialog; import com.thecode.aestheticdialogs.AestheticDialog;
import com.thecode.aestheticdialogs.DialogStyle; import com.thecode.aestheticdialogs.DialogStyle;
import com.thecode.aestheticdialogs.DialogType; import com.thecode.aestheticdialogs.DialogType;
@@ -32,7 +26,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import io.paperdb.Paper; import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class Common { public class Common {
public static final String FORMAT_DATE="dd-MM-yyyy"; public static final String FORMAT_DATE="dd-MM-yyyy";
@@ -119,19 +115,17 @@ public class Common {
} }
public static void showErrorServerNotification(Activity activity){ public static void showErrorServerNotification(Activity activity){
PopupDialog.getInstance(activity) new AestheticDialog.Builder(activity, DialogStyle.RAINBOW, DialogType.ERROR)
.setStyle(Styles.FAILED) .setTitle("LỖI!")
.setHeading("Lỗi") .setMessage("Đã xuất hiện lỗi từ hệ thống! Vui lòng thử lại sau!")
.setDescription("Đã xuất hiện lỗi từ hệ thống. Vui lòng thử lại sau!")
.setCancelable(false) .setCancelable(false)
.setDismissButtonText("Thoát") .setOnClickListener(new OnDialogClickListener() {
.showDialog(new OnDialogButtonClickListener() {
@Override @Override
public void onDismissClicked(Dialog dialog) { public void onClick(@NonNull AestheticDialog.Builder builder) {
activity.finishAffinity(); activity.finishAffinity();
System.exit(0); System.exit(0);
} }
}); }).show();
} }
public static Basket getFoodExistInBasket(String foodId) { public static Basket getFoodExistInBasket(String foodId) {
@@ -12,21 +12,19 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.capstone.foodify.API.FoodApi; import com.capstone.foodify.API.FoodApi;
import com.capstone.foodify.Adapter.MenuAdapter;
import com.capstone.foodify.Adapter.ShopAdapter;
import com.capstone.foodify.Common; import com.capstone.foodify.Common;
import com.capstone.foodify.Model.Food; import com.capstone.foodify.Model.Food;
import com.capstone.foodify.Model.Menu; import com.capstone.foodify.Model.Menu;
import com.capstone.foodify.Adapter.MenuAdapter;
import com.capstone.foodify.Model.Response.Foods; import com.capstone.foodify.Model.Response.Foods;
import com.capstone.foodify.Model.Response.Shops; import com.capstone.foodify.Model.Response.Shops;
import com.capstone.foodify.Model.Shop; import com.capstone.foodify.Model.Shop;
import com.capstone.foodify.Adapter.ShopAdapter;
import com.capstone.foodify.Model.Slider; import com.capstone.foodify.Model.Slider;
import com.capstone.foodify.R; import com.capstone.foodify.R;
import com.denzcoskun.imageslider.ImageSlider; import com.denzcoskun.imageslider.ImageSlider;
import com.denzcoskun.imageslider.constants.ScaleTypes; import com.denzcoskun.imageslider.constants.ScaleTypes;
import com.denzcoskun.imageslider.models.SlideModel; import com.denzcoskun.imageslider.models.SlideModel;
import com.saadahmedsoft.popupdialog.PopupDialog;
import com.saadahmedsoft.popupdialog.Styles;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -122,9 +120,6 @@ public class HomeFragment extends Fragment {
public void onFailure(Call<List<Slider>> call, Throwable t) { public void onFailure(Call<List<Slider>> call, Throwable t) {
//Dismiss progress bar //Dismiss progress bar
progressLayout.setVisibility(View.GONE); progressLayout.setVisibility(View.GONE);
if(getActivity() != null)
Common.showNotificationError(getContext(), getActivity());
} }
}); });
} }
@@ -157,6 +152,9 @@ public class HomeFragment extends Fragment {
//Check internet connection //Check internet connection
if(getActivity() != null) if(getActivity() != null)
Common.showNotificationError(getContext(), getActivity()); Common.showNotificationError(getContext(), getActivity());
//Dismiss progress bar
progressLayout.setVisibility(View.GONE);
} }
}); });
} }
@@ -179,8 +177,6 @@ public class HomeFragment extends Fragment {
@Override @Override
public void onFailure(Call<Foods> call, Throwable t) { public void onFailure(Call<Foods> call, Throwable t) {
//Check internet connection
Common.showNotificationError(getContext(), getActivity());
} }
}); });
} }
@@ -202,9 +198,6 @@ public class HomeFragment extends Fragment {
@Override @Override
public void onFailure(Call<Shops> call, Throwable t) { public void onFailure(Call<Shops> call, Throwable t) {
//Check internet connection
if(getActivity() != null)
Common.showNotificationError(getContext(), getActivity());
} }
}); });
} }
@@ -2,16 +2,13 @@ package com.capstone.foodify.Fragment;
import android.app.Dialog; import android.app.Dialog;
import android.content.Intent; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.capstone.foodify.Activity.AccountAndProfileActivity; import com.capstone.foodify.Activity.AccountAndProfileActivity;
@@ -19,8 +16,6 @@ import com.capstone.foodify.Activity.AddressManagerActivity;
import com.capstone.foodify.Activity.FavoriteFoodActivity; import com.capstone.foodify.Activity.FavoriteFoodActivity;
import com.capstone.foodify.Activity.MainActivity; import com.capstone.foodify.Activity.MainActivity;
import com.capstone.foodify.Activity.OrderActivity; import com.capstone.foodify.Activity.OrderActivity;
import com.capstone.foodify.Activity.SignInActivity;
import com.capstone.foodify.Activity.SignUpActivity;
import com.capstone.foodify.Common; import com.capstone.foodify.Common;
import com.capstone.foodify.R; import com.capstone.foodify.R;
import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseAuth;
@@ -2,7 +2,7 @@ package com.capstone.foodify.Model;
import java.io.Serializable; import java.io.Serializable;
public class Address implements Serializable { public class Address implements Serializable{
private int id; private int id;
private String address; private String address;
private String ward; private String ward;
@@ -14,6 +14,8 @@ public class Address implements Serializable {
this.district = district; this.district = district;
} }
public Address(){}
public int getId() { public int getId() {
return id; return id;
} }
@@ -3,6 +3,7 @@ package com.capstone.foodify.Model.Response;
public class CustomResponse { public class CustomResponse {
private String title; private String title;
private boolean isTrue; private boolean isTrue;
private String message;
public String getTitle() { public String getTitle() {
return title; return title;
@@ -12,6 +13,14 @@ public class CustomResponse {
this.title = title; this.title = title;
} }
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public boolean isTrue() { public boolean isTrue() {
return isTrue; return isTrue;
} }
@@ -111,22 +111,12 @@
> >
<ImageView <ImageView
android:src="@drawable/baseline_edit_24"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:layout_gravity="center_vertical"
android:id="@+id/edit_button" android:id="@+id/edit_button"
/>
<ImageView
android:id="@+id/delete_button"
android:src="@drawable/baseline_delete_24"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="0.5" android:layout_weight="0.5"
/> android:src="@drawable/baseline_edit_24" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
+15 -2
View File
@@ -38,8 +38,8 @@
android:id="@+id/linearLayout_district_ward" android:id="@+id/linearLayout_district_ward"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="60dp" android:layout_height="60dp"
android:layout_marginRight="10dp" android:layout_marginEnd="10dp"
android:layout_marginLeft="10dp" android:layout_marginStart="10dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textInput_address" app:layout_constraintTop_toBottomOf="@+id/textInput_address"
@@ -84,6 +84,19 @@
android:visibility="gone" android:visibility="gone"
/> />
<CheckBox
android:id="@+id/checkbox_default_address"
android:text="Đặt làm địa chỉ mặc định"
android:fontFamily="@font/opensans"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginStart="10dp"
android:buttonTint="@color/primaryColor"
app:layout_constraintTop_toBottomOf="@id/errorTextDistrictWard"
app:layout_constraintStart_toStartOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout