From b40e0b659684284eb8bed6c02d1e3b965bd3ac12 Mon Sep 17 00:00:00 2001 From: phanhuuloi27 <73208452+Nezumi2711@users.noreply.github.com> Date: Sun, 3 Jul 2022 10:54:25 +0700 Subject: [PATCH] Swipe to Delete (still bug) --- .../main/java/com/waterbase/foodify/Cart.java | 66 ++++++++++++++++--- .../waterbase/foodify/Database/Database.java | 6 ++ .../Helper/RecyclerItemTouchHelper.java | 65 ++++++++++++++++++ .../RecyclerItemTouchHelperListener.java | 7 ++ .../foodify/ViewHolder/CartAdapter.java | 62 +++++------------ .../foodify/ViewHolder/CartViewHolder.java | 55 ++++++++++++++++ .../res/drawable/ic_baseline_delete_24.xml | 5 ++ .../app/src/main/res/layout/activity_cart.xml | 1 + .../app/src/main/res/layout/cart_layout.xml | 34 +++++++++- Foodify/app/src/main/res/values/colors.xml | 2 + 10 files changed, 246 insertions(+), 57 deletions(-) create mode 100644 Foodify/app/src/main/java/com/waterbase/foodify/Helper/RecyclerItemTouchHelper.java create mode 100644 Foodify/app/src/main/java/com/waterbase/foodify/Interface/RecyclerItemTouchHelperListener.java create mode 100644 Foodify/app/src/main/java/com/waterbase/foodify/ViewHolder/CartViewHolder.java create mode 100644 Foodify/app/src/main/res/drawable/ic_baseline_delete_24.xml diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/Cart.java b/Foodify/app/src/main/java/com/waterbase/foodify/Cart.java index c6850f4..78e396a 100644 --- a/Foodify/app/src/main/java/com/waterbase/foodify/Cart.java +++ b/Foodify/app/src/main/java/com/waterbase/foodify/Cart.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; +import android.graphics.Color; import android.location.Location; import android.os.Bundle; import android.text.TextUtils; @@ -14,6 +15,7 @@ import android.view.MenuItem; import android.view.View; import android.widget.CompoundButton; import android.widget.RadioButton; +import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; @@ -23,6 +25,7 @@ import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; +import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -32,24 +35,20 @@ import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.location.LocationListener; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationServices; -import com.google.firebase.database.DataSnapshot; -import com.google.firebase.database.DatabaseError; +import com.google.android.material.snackbar.Snackbar; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; -import com.google.firebase.database.Query; -import com.google.firebase.database.ValueEventListener; import com.rengwuxian.materialedittext.MaterialEditText; import com.waterbase.foodify.Common.Common; import com.waterbase.foodify.Database.Database; -import com.waterbase.foodify.Model.MyResponse; -import com.waterbase.foodify.Model.Notification; +import com.waterbase.foodify.Helper.RecyclerItemTouchHelper; +import com.waterbase.foodify.Interface.RecyclerItemTouchHelperListener; import com.waterbase.foodify.Model.Order; import com.waterbase.foodify.Model.Request; -import com.waterbase.foodify.Model.Sender; -import com.waterbase.foodify.Model.Token; import com.waterbase.foodify.Remote.APIService; import com.waterbase.foodify.Remote.IGoogleService; import com.waterbase.foodify.ViewHolder.CartAdapter; +import com.waterbase.foodify.ViewHolder.CartViewHolder; import org.json.JSONArray; import org.json.JSONException; @@ -70,7 +69,7 @@ import retrofit2.Callback; import retrofit2.Response; public class Cart extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, - LocationListener { + LocationListener, RecyclerItemTouchHelperListener { String address = null; @@ -88,6 +87,8 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio APIService mService; + RelativeLayout rootLayout; + //Location private LocationRequest mLocationRequest; private GoogleApiClient mGoogleApiClient; @@ -150,6 +151,11 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio recyclerView.setHasFixedSize(true); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); + rootLayout = findViewById(R.id.rootLayout); + + //Swipe to delete + ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new RecyclerItemTouchHelper(0, ItemTouchHelper.LEFT, this); + new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView); txtTotalPrice = (TextView) findViewById(R.id.total); btnPlace = (FButton) findViewById(R.id.btnPlaceOrder); @@ -437,4 +443,46 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio mLastLocation = location; displayLocation(); } + + @Override + public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position) { + if(viewHolder instanceof CartViewHolder) + { + String name = ((CartAdapter)recyclerView.getAdapter()).getItem(viewHolder.getAdapterPosition()).getProductName(); + + Order deleteItem = ((CartAdapter)recyclerView.getAdapter()).getItem(viewHolder.getAdapterPosition()); + int deleteIndex = viewHolder.getAdapterPosition(); + + adapter.removeItem(deleteIndex); + new Database(getBaseContext()).removeFromCart(deleteItem.getProductId(), Common.currentUser.getPhone()); + + updateTotalPrice(); + + //Make Snackbar + Snackbar snackbar = Snackbar.make(rootLayout, name + " đã xoá khỏi giỏ hàng của bạn!", Snackbar.LENGTH_LONG); + snackbar.setAction("Hoàn tác", new View.OnClickListener() { + @Override + public void onClick(View v) { + adapter.restoreItem(deleteItem, deleteIndex); + new Database(getBaseContext()).addToCart(deleteItem); + updateTotalPrice(); + + } + }); + snackbar.setActionTextColor(Color.YELLOW); + snackbar.show(); + } + } + + public void updateTotalPrice() + { + //Calculate total price + float total = 0; + List orders = new Database(getBaseContext()).getCarts(); + for (Order item : orders) + total += (Float.parseFloat(item.getPrice())) * (Float.parseFloat(item.getQuantity())) * (100 - Long.parseLong(item.getDiscount()))/100; + Locale locale = new Locale("vi", "VN"); + NumberFormat fmt = NumberFormat.getCurrencyInstance(locale); + txtTotalPrice.setText(fmt.format(total)); + } } \ No newline at end of file diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/Database/Database.java b/Foodify/app/src/main/java/com/waterbase/foodify/Database/Database.java index d154b4c..8beeb89 100644 --- a/Foodify/app/src/main/java/com/waterbase/foodify/Database/Database.java +++ b/Foodify/app/src/main/java/com/waterbase/foodify/Database/Database.java @@ -59,6 +59,12 @@ public class Database extends SQLiteAssetHelper { db.execSQL(query); } + public void removeFromCart(String productId, String phone) { + SQLiteDatabase db = getReadableDatabase(); + String query = String.format("DELETE FROM OrderDetail WHERE UserPhone='%s' and ProductId='%s'", phone, productId); + db.execSQL(query); + } + public void cleanCart() { SQLiteDatabase db = getReadableDatabase(); String query = String.format("DELETE FROM OrderDetail"); diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/Helper/RecyclerItemTouchHelper.java b/Foodify/app/src/main/java/com/waterbase/foodify/Helper/RecyclerItemTouchHelper.java new file mode 100644 index 0000000..40b8042 --- /dev/null +++ b/Foodify/app/src/main/java/com/waterbase/foodify/Helper/RecyclerItemTouchHelper.java @@ -0,0 +1,65 @@ +package com.waterbase.foodify.Helper; + +import android.graphics.Canvas; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; + +import com.waterbase.foodify.Interface.RecyclerItemTouchHelperListener; +import com.waterbase.foodify.ViewHolder.CartViewHolder; + +public class RecyclerItemTouchHelper extends ItemTouchHelper.SimpleCallback { + + private RecyclerItemTouchHelperListener listener; + + public RecyclerItemTouchHelper(int dragDirs, int swipeDirs, RecyclerItemTouchHelperListener listener) { + super(dragDirs, swipeDirs); + this.listener = listener; + } + + @Override + public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { + return true; + } + + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { + if(listener != null) + listener.onSwiped(viewHolder, direction, viewHolder.getAdapterPosition()); + } + + @Override + public int convertToAbsoluteDirection(int flags, int layoutDirection) { + return super.convertToAbsoluteDirection(flags, layoutDirection); + } + + @Override + public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { + View foregroundView = ((CartViewHolder)viewHolder).view_foreground; + getDefaultUIUtil().clearView(foregroundView); + } + + @Override + public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { + View foregroundView = ((CartViewHolder)viewHolder).view_foreground; + getDefaultUIUtil().onDraw(c, recyclerView, foregroundView, dX, dY, actionState, isCurrentlyActive); + } + + @Override + public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) { + if(viewHolder != null) + { + View foregroundView = ((CartViewHolder)viewHolder).view_foreground; + getDefaultUIUtil().onSelected(foregroundView); + } + } + + @Override + public void onChildDrawOver(@NonNull Canvas c, @NonNull RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { + View foregroundView = ((CartViewHolder)viewHolder).view_foreground; + getDefaultUIUtil().onDrawOver(c, recyclerView, foregroundView, dX, dY, actionState, isCurrentlyActive); + } +} diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/Interface/RecyclerItemTouchHelperListener.java b/Foodify/app/src/main/java/com/waterbase/foodify/Interface/RecyclerItemTouchHelperListener.java new file mode 100644 index 0000000..378bdfd --- /dev/null +++ b/Foodify/app/src/main/java/com/waterbase/foodify/Interface/RecyclerItemTouchHelperListener.java @@ -0,0 +1,7 @@ +package com.waterbase.foodify.Interface; + +import androidx.recyclerview.widget.RecyclerView; + +public interface RecyclerItemTouchHelperListener { + void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position); +} diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/ViewHolder/CartAdapter.java b/Foodify/app/src/main/java/com/waterbase/foodify/ViewHolder/CartAdapter.java index 706ceba..c77f02f 100644 --- a/Foodify/app/src/main/java/com/waterbase/foodify/ViewHolder/CartAdapter.java +++ b/Foodify/app/src/main/java/com/waterbase/foodify/ViewHolder/CartAdapter.java @@ -1,69 +1,24 @@ package com.waterbase.foodify.ViewHolder; -import android.content.Context; -import android.graphics.Color; -import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import com.amulyakhare.textdrawable.TextDrawable; import com.cepheuen.elegantnumberbutton.view.ElegantNumberButton; import com.squareup.picasso.Picasso; import com.waterbase.foodify.Cart; -import com.waterbase.foodify.Common.Common; import com.waterbase.foodify.Database.Database; -import com.waterbase.foodify.Interface.ItemClickListener; import com.waterbase.foodify.Model.Order; import com.waterbase.foodify.R; -import org.w3c.dom.Text; - import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; import java.util.Locale; -class CartViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnCreateContextMenuListener { - - public TextView txt_card_item, txt_price, txtDiscount; - public ElegantNumberButton btn_quantity; - public ImageView cart_image; - - private ItemClickListener itemClickListener; - - public void setTxt_card_item(TextView txt_card_item) { - this.txt_card_item = txt_card_item; - } - - public CartViewHolder(View itemView) { - super(itemView); - txt_card_item = (TextView) itemView.findViewById(R.id.cart_item_name); - txt_price = (TextView) itemView.findViewById(R.id.cart_item_Price); - txtDiscount = (TextView) itemView.findViewById(R.id.txtDiscount); - btn_quantity = (ElegantNumberButton) itemView.findViewById(R.id.btn_quantity); - cart_image = (ImageView) itemView.findViewById(R.id.cart_image); - - itemView.setOnCreateContextMenuListener(this); - } - - @Override - public void onClick(View v) { - - } - - @Override - public void onCreateContextMenu(ContextMenu contextMenu, View v, ContextMenu.ContextMenuInfo menuInfo) { - contextMenu.setHeaderTitle("Tuỳ chọn:"); - contextMenu.add(0, 0, getAdapterPosition(), Common.DELETE); - } -} - public class CartAdapter extends RecyclerView.Adapter{ private List listData = new ArrayList<>(); @@ -130,4 +85,21 @@ public class CartAdapter extends RecyclerView.Adapter{ public int getItemCount() { return listData.size(); } + + public Order getItem(int position) + { + return listData.get(position); + } + + public void removeItem(int position) + { + listData.remove(position); + notifyItemRemoved(position); + } + + public void restoreItem(Order item, int position) + { + listData.add(position, item); + notifyItemInserted(position); + } } diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/ViewHolder/CartViewHolder.java b/Foodify/app/src/main/java/com/waterbase/foodify/ViewHolder/CartViewHolder.java new file mode 100644 index 0000000..76a9804 --- /dev/null +++ b/Foodify/app/src/main/java/com/waterbase/foodify/ViewHolder/CartViewHolder.java @@ -0,0 +1,55 @@ +package com.waterbase.foodify.ViewHolder; + +import android.view.ContextMenu; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +import com.cepheuen.elegantnumberbutton.view.ElegantNumberButton; +import com.waterbase.foodify.Common.Common; +import com.waterbase.foodify.Interface.ItemClickListener; +import com.waterbase.foodify.R; + +public class CartViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnCreateContextMenuListener { + + public TextView txt_card_item, txt_price, txtDiscount; + public ElegantNumberButton btn_quantity; + public ImageView cart_image; + + public RelativeLayout view_background; + public LinearLayout view_foreground; + + private ItemClickListener itemClickListener; + + public void setTxt_card_item(TextView txt_card_item) { + this.txt_card_item = txt_card_item; + } + + public CartViewHolder(View itemView) { + super(itemView); + txt_card_item = (TextView) itemView.findViewById(R.id.cart_item_name); + txt_price = (TextView) itemView.findViewById(R.id.cart_item_Price); + txtDiscount = (TextView) itemView.findViewById(R.id.txtDiscount); + btn_quantity = (ElegantNumberButton) itemView.findViewById(R.id.btn_quantity); + cart_image = (ImageView) itemView.findViewById(R.id.cart_image); + view_background = (RelativeLayout) itemView.findViewById(R.id.view_background); + view_foreground = (LinearLayout) itemView.findViewById(R.id.view_foreground); + + itemView.setOnCreateContextMenuListener(this); + } + + @Override + public void onClick(View v) { + + } + + @Override + public void onCreateContextMenu(ContextMenu contextMenu, View v, ContextMenu.ContextMenuInfo menuInfo) { + contextMenu.setHeaderTitle("Tuỳ chọn:"); + contextMenu.add(0, 0, getAdapterPosition(), Common.DELETE); + } +} diff --git a/Foodify/app/src/main/res/drawable/ic_baseline_delete_24.xml b/Foodify/app/src/main/res/drawable/ic_baseline_delete_24.xml new file mode 100644 index 0000000..282594c --- /dev/null +++ b/Foodify/app/src/main/res/drawable/ic_baseline_delete_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Foodify/app/src/main/res/layout/activity_cart.xml b/Foodify/app/src/main/res/layout/activity_cart.xml index b6f543d..29f1c9f 100644 --- a/Foodify/app/src/main/res/layout/activity_cart.xml +++ b/Foodify/app/src/main/res/layout/activity_cart.xml @@ -2,6 +2,7 @@ + + + + + + + + diff --git a/Foodify/app/src/main/res/values/colors.xml b/Foodify/app/src/main/res/values/colors.xml index 42777b7..d217705 100644 --- a/Foodify/app/src/main/res/values/colors.xml +++ b/Foodify/app/src/main/res/values/colors.xml @@ -18,4 +18,6 @@ #7f333639 #0e0d0e #FA0202 + + #FA315B \ No newline at end of file