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"
+ >
+
+
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/add_address_dialog.xml b/app/src/main/res/layout/add_address_dialog.xml
index bc13324..bcd469d 100644
--- a/app/src/main/res/layout/add_address_dialog.xml
+++ b/app/src/main/res/layout/add_address_dialog.xml
@@ -6,60 +6,110 @@
android:background="@drawable/bg_white_corner_16"
>
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_address.xml b/app/src/main/res/layout/item_address.xml
index 5d4d150..2450da0 100644
--- a/app/src/main/res/layout/item_address.xml
+++ b/app/src/main/res/layout/item_address.xml
@@ -35,7 +35,9 @@
+ android:layout_height="wrap_content"
+ android:layout_marginTop="5dp"
+ >