From a95703e6169cd5c60a552d5cf83ed8d3b4ac7a3f Mon Sep 17 00:00:00 2001 From: Nezumi <123229563+Nez27@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:32:43 +0700 Subject: [PATCH] Fix bug and create order complete --- .idea/deploymentTargetDropDown.xml | 10 +- .../com/capstone/foodify/API/FoodApi.java | 2 +- .../capstone/foodify/API/FoodApiToken.java | 2 +- .../foodify/Activity/FoodDetailActivity.java | 31 +-- .../foodify/Activity/MainActivity.java | 7 + .../Activity/OrderCheckOutActivity.java | 198 +++++++++++------- .../foodify/Adapter/BasketAdapter.java | 12 +- .../com/capstone/foodify/Model/Order.java | 23 +- .../capstone/foodify/Model/OrderDetail.java | 8 + 9 files changed, 189 insertions(+), 104 deletions(-) diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index b0df3ee..43f6bd4 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -1,17 +1,17 @@ - + - + - + - - + + \ No newline at end of file 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 189561a..af4c6c3 100644 --- a/app/src/main/java/com/capstone/foodify/API/FoodApi.java +++ b/app/src/main/java/com/capstone/foodify/API/FoodApi.java @@ -41,7 +41,7 @@ public interface FoodApi { @GET("products/enable?pageNo=0&pageSize=10&sortBy=createdTime&sortDir=desc") Call recentFood(); - @GET("shops?pageNo=0&pageSize=10&sortBy=id&sortDir=asc") + @GET("shops/enable?pageNo=0&pageSize=10&sortBy=id&sortDir=asc") Call allShops(); @GET("products/search/{name}") 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 860d24e..880284a 100644 --- a/app/src/main/java/com/capstone/foodify/API/FoodApiToken.java +++ b/app/src/main/java/com/capstone/foodify/API/FoodApiToken.java @@ -81,7 +81,7 @@ public interface FoodApiToken { @DELETE("users/{userId}/addresses/{addressId}") Call deleteAddressUser(@Path("userId") int userId, @Path("addressId") int addressId); - @POST("user/{userId}/orders") + @POST("users/{userId}/orders") Call createOrder(@Path("userId") int userId, @Body Order order); @POST("products/{productId}/comments") diff --git a/app/src/main/java/com/capstone/foodify/Activity/FoodDetailActivity.java b/app/src/main/java/com/capstone/foodify/Activity/FoodDetailActivity.java index 487d141..c6a825b 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/FoodDetailActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/FoodDetailActivity.java @@ -571,26 +571,29 @@ public class FoodDetailActivity extends AppCompatActivity { confirm.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - progressLayout.setVisibility(View.VISIBLE); - if(actionCode == CREATE_COMMENT){ - //Create comment + if(comment_content.getText().toString().trim().length() > 0){ + progressLayout.setVisibility(View.VISIBLE); - createComment(comment_content.getText().toString(), ratingBarDialog); - - dialog.dismiss(); - - } else if(actionCode == EDIT_COMMENT){ - //Edit comment - if(commentUser != null){ - - editComment(comment_content.getText().toString(), ratingBarDialog); + if(actionCode == CREATE_COMMENT){ + //Create comment + createComment(comment_content.getText().toString(), ratingBarDialog); dialog.dismiss(); + + } else if(actionCode == EDIT_COMMENT){ + //Edit comment + if(commentUser != null){ + + editComment(comment_content.getText().toString(), ratingBarDialog); + + dialog.dismiss(); + } + } - + } else { + comment_content.setError("Khung bình luận không được để trống!"); } - } }); 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 8e3bdc8..9f44df3 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java @@ -14,10 +14,12 @@ import android.os.Looper; import android.provider.Settings; import android.util.Log; import android.view.MenuItem; +import android.view.View; import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatDelegate; +import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.core.splashscreen.SplashScreen; @@ -70,6 +72,7 @@ public class MainActivity extends AppCompatActivity { BottomNavigationView bottomNavigationView; private FirebaseAuth mAuth; private FirebaseUser user; + private ConstraintLayout progressLayout; //Location private static final int REQUEST_CHECK_SETTINGS = 100; @@ -98,6 +101,7 @@ public class MainActivity extends AppCompatActivity { user = mAuth.getCurrentUser(); if (user != null && Common.CURRENT_USER == null) { + progressLayout.setVisibility(View.VISIBLE); user.getIdToken(true) .addOnCompleteListener(new OnCompleteListener() { @Override @@ -189,10 +193,13 @@ public class MainActivity extends AppCompatActivity { } + private void getLocationUser(){ + } private void initComponent() { bottomNavigationView = findViewById(R.id.bottom_nav); viewPager2 = findViewById(R.id.viewPager); + progressLayout = findViewById(R.id.progress_layout); } private void bottomNavigation() { diff --git a/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java b/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java index c79a8f8..1703833 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java @@ -29,15 +29,20 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.capstone.foodify.API.FoodApi; +import com.capstone.foodify.API.FoodApiToken; import com.capstone.foodify.API.GoogleMapApi; import com.capstone.foodify.Adapter.OrderDetailAdapter; import com.capstone.foodify.Common; import com.capstone.foodify.Model.Address; +import com.capstone.foodify.Model.Basket; import com.capstone.foodify.Model.DistrictWardResponse; import com.capstone.foodify.Model.GoogleMap.GoogleMapResponse; import com.capstone.foodify.Model.GoogleMap.Location; +import com.capstone.foodify.Model.Order; +import com.capstone.foodify.Model.OrderDetail; import com.capstone.foodify.R; import com.capstone.foodify.ZaloPay.Api.CreateOrder; +import com.capstone.foodify.ZaloPay.Helper.Helpers; import com.google.android.gms.maps.model.LatLng; import com.google.android.material.textfield.TextInputLayout; import com.google.firebase.auth.FirebaseAuth; @@ -63,9 +68,13 @@ import vn.zalopay.sdk.ZaloPaySDK; import vn.zalopay.sdk.listeners.PayOrderListener; public class OrderCheckOutActivity extends AppCompatActivity { + private static final String TAKE_FOOD_FROM_SHOP = "Đến shop lấy"; + private static final String ZALO_PAYMENT_METHOD = "ZALO PAY"; + private static final String CASH_PAYMENT = "CASH"; private static final Double LAT_SHOP = 16.0500622; private static final Double LNG_SHOP = 108.2351611; private static String finalAddress = null; + private static double finalLat, finalLng = 0; ImageView back_image; OrderDetailAdapter adapter; RecyclerView recyclerView; @@ -74,11 +83,11 @@ public class OrderCheckOutActivity extends AppCompatActivity { EditText edt_address; Spinner spn_list_address, spn_district, spn_ward; ConstraintLayout manual_input_address_layout; - Button change_address_button, confirm_address_button, btn_ZaloPay; + Button change_address_button, confirm_address_button, btn_ZaloPay, btn_Pay; RadioButton list_address_input, auto_detect_location, manual_input_address, radio_button_selected, take_food_from_shop; RadioGroup address_option; ConstraintLayout progress_layout; - float total; + float total, shipCost; private static final ArrayList wardList = new ArrayList<>(); private static final ArrayList districtList = new ArrayList<>(); @@ -118,6 +127,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { txt_distance = findViewById(R.id.txt_distance); txt_ship_cost = findViewById(R.id.txt_ship_cost); btn_ZaloPay = findViewById(R.id.btnZaloPay); + btn_Pay = findViewById(R.id.btnPay); //Reload user data Common.reloadUser(this); @@ -193,7 +203,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { if(radio_button_selected == take_food_from_shop){ //Action 4 - finalAddress = "Đến shop lấy"; + finalAddress = TAKE_FOOD_FROM_SHOP; } if(finalAddress == null){ @@ -219,6 +229,28 @@ public class OrderCheckOutActivity extends AppCompatActivity { }); initZaloPaymentMethod(); + + //Set event for button pay by CASH + btn_Pay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + progress_layout.setVisibility(View.VISIBLE); + + if(!Common.CURRENT_USER.isLocked()){ + if(finalAddress != null){ + createOrderFood(Helpers.getAppTransId(), CASH_PAYMENT); + } else { + Toast.makeText(OrderCheckOutActivity.this, "Bạn chưa xác nhận địa chỉ!", Toast.LENGTH_SHORT).show(); + progress_layout.setVisibility(View.GONE); + } + } else { + //Show notification account locked + FirebaseAuth.getInstance().signOut(); + Common.showErrorServerNotification(OrderCheckOutActivity.this, "Tài khoản của bạn đã bị khoá!"); + } + + } + }); } private void getAddress() { @@ -246,6 +278,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { } private void initZaloPaymentMethod(){ + // handle CreateOrder btn_ZaloPay.setOnClickListener(new View.OnClickListener() { @RequiresApi(api = Build.VERSION_CODES.O) @@ -257,7 +290,6 @@ public class OrderCheckOutActivity extends AppCompatActivity { if(!Common.CURRENT_USER.isLocked()){ //Create order - //Check address is null or not if(finalAddress != null){ @@ -278,24 +310,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { runOnUiThread(new Runnable() { @Override public void run() { - new AestheticDialog.Builder(OrderCheckOutActivity.this, DialogStyle.FLAT, DialogType.SUCCESS) - .setTitle("Thành công!") - .setMessage("Bạn đã thanh toán thành công cho đơn hàng #" + transactionId) - .setCancelable(true) - .setOnClickListener(new OnDialogClickListener() { - @Override - public void onClick(@NonNull AestheticDialog.Builder builder) { - - createOrderFood(transactionId); - - Common.LIST_BASKET_FOOD.clear(); - startActivity(new Intent(OrderCheckOutActivity.this, MainActivity.class)); - finish(); - } - }) - .show(); - - progress_layout.setVisibility(View.GONE); + createOrderFood(transactionId, ZALO_PAYMENT_METHOD); } }); @@ -321,6 +336,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { @Override public void onClick(@NonNull AestheticDialog.Builder builder) { startActivity(new Intent(OrderCheckOutActivity.this, MainActivity.class)); + builder.dismiss(); finish(); } }) @@ -348,72 +364,99 @@ public class OrderCheckOutActivity extends AppCompatActivity { }); } - private void createOrderFood(String transactionId) { + private void createOrderFood(String transactionId, String paymentMethod) { -// //Create order object -// Order order = new Order(transactionId, ""); -// -// FoodApiToken.apiService.createOrder(Common.CURRENT_USER.getId()).enqueue(new Callback() { -// @Override -// public void onResponse(Call call, Response response) { -// -// } -// -// @Override -// public void onFailure(Call call, Throwable t) { -// -// } -// }); - } + //Create list order detail object + List listOrderDetail = new ArrayList<>(); + for(Basket tempFood: Common.LIST_BASKET_FOOD){ + OrderDetail orderTemp = new OrderDetail(Integer.parseInt(tempFood.getId()), tempFood.getQuantity()); + listOrderDetail.add(orderTemp); + } - private void getDistanceAndCalculateShipCost(String address) { - //Get location from address + //Create order object + Order order = new Order(transactionId, paymentMethod, shipCost, "AWAITING" , finalAddress, listOrderDetail, String.valueOf(finalLat), String.valueOf(finalLng)); - GoogleMapApi.apiService.getGeoCode(address, Common.MAP_API).enqueue(new Callback() { + FoodApiToken.apiService.createOrder(Common.CURRENT_USER.getId(), order).enqueue(new Callback() { @Override - public void onResponse(Call call, Response response) { - GoogleMapResponse jsonResponse = response.body(); - - Double lat = jsonResponse.getResults().get(0).getGeometry().getLocation().getLat(); - Double lng = jsonResponse.getResults().get(0).getGeometry().getLocation().getLng(); - - LatLng addressFrom = new LatLng(lat, lng); - LatLng addressTo = new LatLng(LAT_SHOP, LNG_SHOP); - - double distance = CalculationByDistance(addressFrom, addressTo); - - double roundDistance = Math.round(distance * 100.0) / 100.0; - - //Show distance to user - txt_distance.setText(roundDistance + " km"); - - //Calculate ship cost - float shipCost = 0; - if(roundDistance <= 3){ - shipCost = 15000; - } else if(roundDistance > 3 && roundDistance <= 10){ - shipCost = 5000 * (float) roundDistance; + public void onResponse(Call call, Response response) { + if(response.code() == 201){ + new AestheticDialog.Builder(OrderCheckOutActivity.this, DialogStyle.FLAT, DialogType.SUCCESS) + .setTitle("Thành công!") + .setMessage("Bạn đã đặt hàng thành công cho đơn hàng #" + transactionId) + .setCancelable(true) + .setOnClickListener(new OnDialogClickListener() { + @Override + public void onClick(@NonNull AestheticDialog.Builder builder) { + Common.LIST_BASKET_FOOD.clear(); + startActivity(new Intent(OrderCheckOutActivity.this, MainActivity.class)); + builder.dismiss(); + finish(); + } + }).show(); } else { - shipCost = 3000 * (float) roundDistance; + Toast.makeText(OrderCheckOutActivity.this, "Đã có lỗi hệ thống! Mã lỗi: " + response.code(), Toast.LENGTH_SHORT).show(); } - - txt_ship_cost.setText(Common.changeCurrencyUnit(shipCost)); - - //Update total order - total = total + shipCost; - txt_total.setText(Common.changeCurrencyUnit(total)); - - progress_layout.setVisibility(View.GONE); } @Override - public void onFailure(Call call, Throwable t) { - Toast.makeText(OrderCheckOutActivity.this, "Error: " + t, Toast.LENGTH_SHORT).show(); + public void onFailure(Call call, Throwable t) { + Toast.makeText(OrderCheckOutActivity.this, "Đã xảy ra lỗi kết nối hệ thống!", Toast.LENGTH_SHORT).show(); } }); } - public double CalculationByDistance(LatLng from, LatLng to) { + private void getDistanceAndCalculateShipCost(String address) { + //Get location from address + if(!address.equals(TAKE_FOOD_FROM_SHOP)){ + GoogleMapApi.apiService.getGeoCode(address, Common.MAP_API).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + GoogleMapResponse jsonResponse = response.body(); + + Double lat = jsonResponse.getResults().get(0).getGeometry().getLocation().getLat(); + Double lng = jsonResponse.getResults().get(0).getGeometry().getLocation().getLng(); + + finalLat = lat; + finalLng = lng; + + LatLng addressFrom = new LatLng(lat, lng); + LatLng addressTo = new LatLng(LAT_SHOP, LNG_SHOP); + + int distance = CalculationByDistance(addressFrom, addressTo); + + //Show distance to user + txt_distance.setText(distance + " km"); + + //Calculate ship cost + if(distance <= 3){ + shipCost = 15000; + } else if(distance > 3 && distance <= 10){ + shipCost = 5000 * (float) distance; + } else { + shipCost = 3000 * (float) distance; + } + + txt_ship_cost.setText(Common.changeCurrencyUnit(shipCost)); + + //Update total order + total = total + shipCost; + txt_total.setText(Common.changeCurrencyUnit(total)); + + progress_layout.setVisibility(View.GONE); + } + + @Override + public void onFailure(Call call, Throwable t) { + Toast.makeText(OrderCheckOutActivity.this, "Error: " + t, Toast.LENGTH_SHORT).show(); + } + }); + } else { + progress_layout.setVisibility(View.GONE); + } + + } + + public int CalculationByDistance(LatLng from, LatLng to) { int Radius = 6371;// radius of earth in Km double lat1 = from.latitude; double lat2 = to.latitude; @@ -429,11 +472,8 @@ public class OrderCheckOutActivity extends AppCompatActivity { double valueResult = Radius * c; double km = valueResult / 1; DecimalFormat newFormat = new DecimalFormat("####"); - int kmInDec = Integer.valueOf(newFormat.format(km)); - double meter = valueResult % 1000; - int meterInDec = Integer.valueOf(newFormat.format(meter)); - return Radius * c; + return Integer.valueOf(newFormat.format(km)); } private boolean validForm(){ diff --git a/app/src/main/java/com/capstone/foodify/Adapter/BasketAdapter.java b/app/src/main/java/com/capstone/foodify/Adapter/BasketAdapter.java index 685e4b0..ae9075a 100644 --- a/app/src/main/java/com/capstone/foodify/Adapter/BasketAdapter.java +++ b/app/src/main/java/com/capstone/foodify/Adapter/BasketAdapter.java @@ -23,7 +23,6 @@ import java.util.List; public class BasketAdapter extends RecyclerView.Adapter { - private static int quantity = 0; public List listBasketFood; @@ -58,7 +57,6 @@ public class BasketAdapter extends RecyclerView.Adapter orderDetails; + private String lat; + private String lng; - public Order(String orderTrackingNumber, int shipperId, String paymentMethod, float shippingCost, String status, String address, List orderDetails) { + public Order(String orderTrackingNumber, String paymentMethod, float shippingCost, String status, String address, List orderDetails, String lat, String lng) { this.orderTrackingNumber = orderTrackingNumber; - this.shipperId = shipperId; this.paymentMethod = paymentMethod; this.shippingCost = shippingCost; this.status = status; this.address = address; this.orderDetails = orderDetails; + this.lat = lat; + this.lng = lng; } public int getId() { @@ -96,4 +99,20 @@ public class Order { public void setListOrderDetail(List listOrderDetail) { this.orderDetails = listOrderDetail; } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } } diff --git a/app/src/main/java/com/capstone/foodify/Model/OrderDetail.java b/app/src/main/java/com/capstone/foodify/Model/OrderDetail.java index 7e07aec..93fb70b 100644 --- a/app/src/main/java/com/capstone/foodify/Model/OrderDetail.java +++ b/app/src/main/java/com/capstone/foodify/Model/OrderDetail.java @@ -7,6 +7,14 @@ public class OrderDetail { private String quantity; private float subTotal; + public OrderDetail(int productId, String quantity) { + this.productId = productId; + this.quantity = quantity; + } + + public OrderDetail() { + } + public int getId() { return id; }