From ac603fe9419e39665b60a38e135507381fc33190 Mon Sep 17 00:00:00 2001 From: Nezumi <123229563+Nez27@users.noreply.github.com> Date: Sat, 18 Mar 2023 12:37:15 +0700 Subject: [PATCH] Add address method for user --- .idea/deploymentTargetDropDown.xml | 13 +- .../capstone/foodify/API/FoodApiToken.java | 5 + .../Activity/AddressManagerActivity.java | 136 +++++++++++++++-- .../foodify/Activity/SignUpActivity.java | 2 +- .../foodify/Adapter/AddressAdapter.java | 98 +++++++++++- .../java/com/capstone/foodify/Common.java | 5 + .../com/capstone/foodify/Model/Address.java | 7 - .../foodify/Model/Response/Addresses.java | 27 ++++ .../res/layout/activity_address_manager.xml | 44 +++++- .../main/res/layout/add_address_dialog.xml | 142 ++++++++++++------ app/src/main/res/layout/item_address.xml | 4 +- 11 files changed, 405 insertions(+), 78 deletions(-) create mode 100644 app/src/main/java/com/capstone/foodify/Model/Response/Addresses.java diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 21267b0..de6a017 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -1,6 +1,17 @@ + + + + + + + + + + + @@ -12,6 +23,6 @@ - + \ No newline at end of file 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 a4a29b5..5b7fe49 100644 --- a/app/src/main/java/com/capstone/foodify/API/FoodApiToken.java +++ b/app/src/main/java/com/capstone/foodify/API/FoodApiToken.java @@ -4,7 +4,9 @@ import static com.capstone.foodify.Common.TOKEN; import androidx.annotation.NonNull; +import com.capstone.foodify.Model.Address; import com.capstone.foodify.Model.Food; +import com.capstone.foodify.Model.Response.Addresses; import com.capstone.foodify.Model.Response.CustomResponse; import com.capstone.foodify.Model.Response.Foods; import com.capstone.foodify.Model.User; @@ -66,4 +68,7 @@ public interface FoodApiToken { @GET("users/{userId}/loves/{productId}") Call checkFoodIsFavorite(@Path("userId") int userId, @Path("productId") int productId); + + @POST("users/{userId}/addresses") + Call createAddressUser(@Path("userId") int userId, @Body Address address); } diff --git a/app/src/main/java/com/capstone/foodify/Activity/AddressManagerActivity.java b/app/src/main/java/com/capstone/foodify/Activity/AddressManagerActivity.java index 646649f..51435af 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/AddressManagerActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/AddressManagerActivity.java @@ -1,6 +1,7 @@ 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; @@ -13,19 +14,23 @@ import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; +import android.widget.EditText; import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import com.capstone.foodify.API.FoodApi; +import com.capstone.foodify.API.FoodApiToken; import com.capstone.foodify.Common; import com.capstone.foodify.Model.Address; import com.capstone.foodify.Adapter.AddressAdapter; import com.capstone.foodify.Model.DistrictWardResponse; +import com.capstone.foodify.Model.Response.CustomResponse; import com.capstone.foodify.R; import com.google.android.material.textfield.TextInputLayout; import com.sjapps.library.customdialog.CustomViewDialog; +import com.sjapps.library.customdialog.DialogButtonEvents; import java.util.ArrayList; import java.util.List; @@ -36,16 +41,20 @@ import retrofit2.Response; public class AddressManagerActivity extends AppCompatActivity { + private Address defaultAddress = null; private RecyclerView recycler_view_address; private AddressAdapter adapter; private Button add_address_button; + private TextInputLayout textInput_address; private ImageView back_image; - + private TextView txt_Address, errorTextDistrictWard; private List
listAddress = new ArrayList<>(); Spinner wardSpinner, districtSpinner; - + EditText edt_address; + ConstraintLayout progressLayout, progressLayoutDialog; private static final ArrayList wardList = new ArrayList<>(); private static final ArrayList districtList = new ArrayList<>(); + String address, ward, district; @Override protected void onCreate(Bundle savedInstanceState) { @@ -56,14 +65,16 @@ public class AddressManagerActivity extends AppCompatActivity { recycler_view_address = findViewById(R.id.recycler_view_address); add_address_button = findViewById(R.id.add_address_button); back_image = findViewById(R.id.back_image); + txt_Address = findViewById(R.id.text_view_address); + progressLayout = findViewById(R.id.progress_layout); //Set layout recyclerview LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); recycler_view_address.setLayoutManager(linearLayoutManager); - adapter = new AddressAdapter(); + adapter = new AddressAdapter(this); - getAddressList(); + getDefaultAddress(); //Set event image view on click back_image.setOnClickListener(new View.OnClickListener() { @@ -83,25 +94,77 @@ public class AddressManagerActivity extends AppCompatActivity { } private void getAddressList(){ - - for(int i = 1; i <= 10; i++){ - listAddress.add(new Address(i, "Hẻm 215, đường Phạm Như Xương", "phường Hoà Khánh Nam", "Liên Chiểu")); - } + listAddress.addAll(Common.CURRENT_USER.getAddresses()); adapter.setData(listAddress); recycler_view_address.setAdapter(adapter); + + progressLayout.setVisibility(View.GONE); + } + + private void initData(){ + //Create a full address string + String fullAddress = defaultAddress.getAddress() + ", " + defaultAddress.getWard() + ", " + defaultAddress.getDistrict(); + + //Bind data to component + txt_Address.setText(fullAddress); + } + + private void getDefaultAddress(){ + for(Address tempAddress: Common.CURRENT_USER.getAddresses()){ + if(Common.CURRENT_USER.getDefaultAddress() == tempAddress.getId()){ + defaultAddress = tempAddress; + initData(); + getAddressList(); + break; + } + } + + if(defaultAddress == null){ + 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(); + } + + } + + private void addAddress(String address, String ward, String district){ + progressLayoutDialog.setVisibility(View.VISIBLE); + + //Create object address + Address newAddress = new Address(address, ward, district); + FoodApiToken.apiService.createAddressUser(Common.CURRENT_USER.getId(), newAddress).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response 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 + listAddress.add(newAddress); + + adapter.notifyDataSetChanged(); + + progressLayoutDialog.setVisibility(View.GONE); + } + + @Override + public void onFailure(Call 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 showAddAddressDialog(){ View view = LayoutInflater.from(this).inflate(R.layout.add_address_dialog,null); //Init component - TextInputLayout textInputLayout = view.findViewById(R.id.textInput_address); + textInput_address = view.findViewById(R.id.textInput_address); wardSpinner = view.findViewById(R.id.ward); districtSpinner = view.findViewById(R.id.district); + edt_address = view.findViewById(R.id.edt_address); + errorTextDistrictWard = view.findViewById(R.id.errorTextDistrictWard); + progressLayoutDialog = view.findViewById(R.id.progress_layout); //Set font - textInputLayout.setTypeface(Common.setFontOpenSans(getAssets())); + textInput_address.setTypeface(Common.setFontOpenSans(getAssets())); //Load district and ward if(districtList.size() == 0){ @@ -135,18 +198,63 @@ public class AddressManagerActivity extends AppCompatActivity { //Add custom view customViewDialog.addCustomView(view); //Set left button text - customViewDialog.setLeftButtonText("Trở về"); + customViewDialog.setLeftButtonText("Thêm"); //Set right button text - customViewDialog.setRightButtonText("Thêm"); + customViewDialog.setRightButtonText("Trở về"); //Set color for left button - customViewDialog.setLeftButtonColor(getResources().getColor(R.color.gray, null)); + customViewDialog.setLeftButtonColor(getResources().getColor(R.color.primaryColor, null)); //Set color for right button - customViewDialog.setRightButtonColor(getResources().getColor(R.color.primaryColor, null)); + customViewDialog.setRightButtonColor(getResources().getColor(R.color.gray, null)); + //Set event button + customViewDialog.onButtonClick(new DialogButtonEvents() { + @Override + public void onLeftButtonClick() { + + //Get data + address = edt_address.getText().toString(); + ward = wardSpinner.getSelectedItem().toString(); + district = districtSpinner.getSelectedItem().toString(); + + if(validData(address, ward, district)){ + addAddress(address, ward, district); + customViewDialog.dismiss(); + } + } + + @Override + public void onRightButtonClick() { + customViewDialog.dismiss(); + } + }); customViewDialog.show(); } + private boolean validData(String address, String ward, String district){ + //Valid data + boolean dataHasValidate = true; + + //Check address + if(address.length() < 8) { + textInput_address.setError("Trường địa chỉ của bạn tối thiếu từ 8 ký tự trở lên"); + dataHasValidate = false; + } else { + textInput_address.setErrorEnabled(false); + } + + //Check district and ward + if(district.equals("---Quận") || ward.equals("---Phường")){ + errorTextDistrictWard.setVisibility(View.VISIBLE); + + dataHasValidate = false; + } else { + errorTextDistrictWard.setVisibility(View.GONE); + } + + return dataHasValidate; + } + private void getListDistrict() { districtList.add("---Quận"); diff --git a/app/src/main/java/com/capstone/foodify/Activity/SignUpActivity.java b/app/src/main/java/com/capstone/foodify/Activity/SignUpActivity.java index 01cca39..b5e813a 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/SignUpActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/SignUpActivity.java @@ -264,7 +264,7 @@ public class SignUpActivity extends AppCompatActivity { textInput_address.setErrorEnabled(false); } - //Check district + //Check district and ward if(district.equals("---Quận") || ward.equals("---Phường")){ errorTextDistrictWard.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/com/capstone/foodify/Adapter/AddressAdapter.java b/app/src/main/java/com/capstone/foodify/Adapter/AddressAdapter.java index 16aeb76..41aecf9 100644 --- a/app/src/main/java/com/capstone/foodify/Adapter/AddressAdapter.java +++ b/app/src/main/java/com/capstone/foodify/Adapter/AddressAdapter.java @@ -1,25 +1,36 @@ package com.capstone.foodify.Adapter; +import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; import android.widget.Button; +import android.widget.EditText; import android.widget.ImageView; +import android.widget.Spinner; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; import androidx.recyclerview.widget.RecyclerView; +import com.capstone.foodify.Common; import com.capstone.foodify.Model.Address; import com.capstone.foodify.R; +import com.google.android.material.textfield.TextInputLayout; +import com.sjapps.library.customdialog.CustomViewDialog; +import com.sjapps.library.customdialog.DialogButtonEvents; import java.util.List; public class AddressAdapter extends RecyclerView.Adapter{ private List
listAddress; + private Context context; - public AddressAdapter() { + public AddressAdapter(Context context) { + this.context = context; } public void setData(List
listAddress){ @@ -46,6 +57,12 @@ public class AddressAdapter extends RecyclerView.Adapter adapterView, View view, int i, long l) { +// getListWard(i); +// } +// +// @Override +// public void onNothingSelected(AdapterView adapterView) { +// +// } +// }); + + CustomViewDialog customViewDialog = new CustomViewDialog(); + + //Create dialog + customViewDialog.Builder(context); + //Set title + customViewDialog.setTitle("Thêm địa chỉ"); + //Create dialog width two buttons + customViewDialog.dialogWithTwoButtons(); + //Add custom view + customViewDialog.addCustomView(view); + //Set left button text + customViewDialog.setLeftButtonText("Thêm"); + //Set right button text + customViewDialog.setRightButtonText("Trở về"); + //Set color for left button +// customViewDialog.setLeftButtonColor(getResources().getColor(R.color.primaryColor, null)); +// //Set color for right button +// customViewDialog.setRightButtonColor(getResources().getColor(R.color.gray, null)); + + //Set event button + customViewDialog.onButtonClick(new DialogButtonEvents() { + @Override + public void onLeftButtonClick() { + + //Get data +// address = edt_address.getText().toString(); +// ward = wardSpinner.getSelectedItem().toString(); +// district = districtSpinner.getSelectedItem().toString(); +// +// if(validData(address, ward, district)){ +// addAddress(address, ward, district); +// customViewDialog.dismiss(); +// } + } + + @Override + public void onRightButtonClick() { + customViewDialog.dismiss(); + } + }); + + customViewDialog.show(); + } + public class AddressViewHolder extends RecyclerView.ViewHolder{ private TextView text_view_address, default_text_view, blank_text_view; diff --git a/app/src/main/java/com/capstone/foodify/Common.java b/app/src/main/java/com/capstone/foodify/Common.java index 7e8584f..b58f270 100644 --- a/app/src/main/java/com/capstone/foodify/Common.java +++ b/app/src/main/java/com/capstone/foodify/Common.java @@ -3,6 +3,7 @@ package com.capstone.foodify; import android.app.Activity; import android.app.Dialog; import android.content.Context; +import android.content.Intent; import android.content.res.AssetManager; import android.graphics.Typeface; import android.net.ConnectivityManager; @@ -13,9 +14,11 @@ import android.os.Build; import androidx.annotation.IntRange; import androidx.annotation.NonNull; +import com.capstone.foodify.Activity.MainActivity; import com.capstone.foodify.Model.Basket; import com.capstone.foodify.Model.Food; 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; @@ -29,6 +32,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; +import io.paperdb.Paper; + public class Common { 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}$"; diff --git a/app/src/main/java/com/capstone/foodify/Model/Address.java b/app/src/main/java/com/capstone/foodify/Model/Address.java index 661571c..4251cc6 100644 --- a/app/src/main/java/com/capstone/foodify/Model/Address.java +++ b/app/src/main/java/com/capstone/foodify/Model/Address.java @@ -14,13 +14,6 @@ public class Address implements Serializable { this.district = district; } - public Address(int id, String address, String ward, String district) { - this.id = id; - this.address = address; - this.ward = ward; - this.district = district; - } - public int getId() { return id; } diff --git a/app/src/main/java/com/capstone/foodify/Model/Response/Addresses.java b/app/src/main/java/com/capstone/foodify/Model/Response/Addresses.java new file mode 100644 index 0000000..7deea92 --- /dev/null +++ b/app/src/main/java/com/capstone/foodify/Model/Response/Addresses.java @@ -0,0 +1,27 @@ +package com.capstone.foodify.Model.Response; + +import com.capstone.foodify.Model.Address; +import com.capstone.foodify.Model.Page; + +import java.util.List; + +public class Addresses { + private List
addresses; + private Page page; + + public List
getAddresses() { + return addresses; + } + + public void setAddresses(List
addresses) { + this.addresses = addresses; + } + + public Page getPage() { + return page; + } + + public void setPage(Page page) { + this.page = page; + } +} diff --git a/app/src/main/res/layout/activity_address_manager.xml b/app/src/main/res/layout/activity_address_manager.xml index c0cf71e..3fbe244 100644 --- a/app/src/main/res/layout/activity_address_manager.xml +++ b/app/src/main/res/layout/activity_address_manager.xml @@ -1,5 +1,5 @@ - + android:layout_height="match_parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + > + android:layout_height="wrap_content" + android:layout_marginTop="5dp" + >