From 73297d684ee57320948c0b5d1ae1fd568ccb77a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mustafa=20ic=CC=A7men?= Date: Mon, 9 Oct 2017 00:03:21 +0300 Subject: [PATCH] prodcuts and cart --- .idea/misc.xml | 2 +- .../android/activity/MainActivity.java | 6 +- ...ProductCheckboxOptionsRecyclerAdapter.java | 8 + .../ProductRadioOptionsRecyclerAdapter.java | 71 ++++++ .../ProductPropertiesBottomSheetDialog.java | 139 +++++++++++ .../android/fragment/MenuFragment.java | 12 +- .../android/model/menu/MenuProductModel.java | 18 +- .../model/menu/MenuProductOptionModel.java | 3 +- .../menu/MenuProductOptionValueModel.java | 12 +- app/src/main/res/drawable/shadow.xml | 8 + .../main/res/layout/layout_bottomsheet.xml | 220 ++++++++++++++++++ .../main/res/layout/row_checkbox_option.xml | 17 ++ app/src/main/res/layout/row_radio_option.xml | 17 ++ app/src/main/res/values/strings.xml | 1 + 14 files changed, 527 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/ch/pizzalink/android/adapter/recycler/ProductCheckboxOptionsRecyclerAdapter.java create mode 100644 app/src/main/java/ch/pizzalink/android/adapter/recycler/ProductRadioOptionsRecyclerAdapter.java create mode 100644 app/src/main/java/ch/pizzalink/android/dialog/ProductPropertiesBottomSheetDialog.java create mode 100644 app/src/main/res/drawable/shadow.xml create mode 100644 app/src/main/res/layout/layout_bottomsheet.xml create mode 100644 app/src/main/res/layout/row_checkbox_option.xml create mode 100644 app/src/main/res/layout/row_radio_option.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 7158618..cca2cda 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + diff --git a/app/src/main/java/ch/pizzalink/android/activity/MainActivity.java b/app/src/main/java/ch/pizzalink/android/activity/MainActivity.java index a9f8a2f..1e2d5aa 100644 --- a/app/src/main/java/ch/pizzalink/android/activity/MainActivity.java +++ b/app/src/main/java/ch/pizzalink/android/activity/MainActivity.java @@ -1,7 +1,10 @@ package ch.pizzalink.android.activity; +import android.content.DialogInterface; import android.support.annotation.NonNull; import android.support.design.widget.BottomNavigationView; +import android.support.design.widget.BottomSheetBehavior; +import android.support.design.widget.BottomSheetDialog; import android.support.v4.app.FragmentManager; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; @@ -22,6 +25,7 @@ import butterknife.ButterKnife; import ch.pizzalink.android.R; import ch.pizzalink.android.adapter.recycler.NavigationMenuRecyclerAdapter; import ch.pizzalink.android.api.ApiConstants; +import ch.pizzalink.android.dialog.ProductPropertiesBottomSheetDialog; import ch.pizzalink.android.fragment.CartFragment; import ch.pizzalink.android.fragment.InfoFragment; import ch.pizzalink.android.fragment.HistoryFragment; @@ -276,6 +280,4 @@ public class MainActivity extends BaseActivity { } } - - } diff --git a/app/src/main/java/ch/pizzalink/android/adapter/recycler/ProductCheckboxOptionsRecyclerAdapter.java b/app/src/main/java/ch/pizzalink/android/adapter/recycler/ProductCheckboxOptionsRecyclerAdapter.java new file mode 100644 index 0000000..dfc1840 --- /dev/null +++ b/app/src/main/java/ch/pizzalink/android/adapter/recycler/ProductCheckboxOptionsRecyclerAdapter.java @@ -0,0 +1,8 @@ +package ch.pizzalink.android.adapter.recycler; + +/** + * Created by cimenmus on 08/10/2017. + */ + +public class ProductCheckboxOptionsRecyclerAdapter { +} diff --git a/app/src/main/java/ch/pizzalink/android/adapter/recycler/ProductRadioOptionsRecyclerAdapter.java b/app/src/main/java/ch/pizzalink/android/adapter/recycler/ProductRadioOptionsRecyclerAdapter.java new file mode 100644 index 0000000..5f5c87e --- /dev/null +++ b/app/src/main/java/ch/pizzalink/android/adapter/recycler/ProductRadioOptionsRecyclerAdapter.java @@ -0,0 +1,71 @@ +package ch.pizzalink.android.adapter.recycler; + +import android.graphics.drawable.Drawable; +import android.support.v7.widget.AppCompatRadioButton; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.ArrayList; + +import butterknife.BindDrawable; +import butterknife.BindView; +import butterknife.ButterKnife; +import ch.pizzalink.android.R; +import ch.pizzalink.android.activity.BaseActivity; +import ch.pizzalink.android.interfaces.RecyclerItemClickListener; +import ch.pizzalink.android.model.menu.MenuProductOptionModel; +import ch.pizzalink.android.model.menu.MenuProductOptionValueModel; + +/** + * Created by cimenmus on 08/10/2017. + */ + +public class ProductRadioOptionsRecyclerAdapter extends RecyclerView.Adapter { + + private ArrayList productOptionValueList; + private RecyclerItemClickListener recyclerItemClickListener; + + public static class ViewHolder extends RecyclerView.ViewHolder{ + + @BindView(R.id.productOptionRadioButton) AppCompatRadioButton productOptionRadioButton; + + public ViewHolder(final View view, final RecyclerItemClickListener recyclerItemClickListener) { + super(view); + ButterKnife.bind(this, view); + view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(recyclerItemClickListener != null) + recyclerItemClickListener.onItemClick(view, getAdapterPosition()); + } + }); + } + } + + public ProductRadioOptionsRecyclerAdapter(ArrayList productOptionValueList, RecyclerItemClickListener recyclerItemClickListener){ + this.productOptionValueList = productOptionValueList; + this.recyclerItemClickListener = recyclerItemClickListener; + } + + @Override + public ProductRadioOptionsRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { + View root = LayoutInflater.from(BaseActivity.currentActivity).inflate(R.layout.row_radio_option, viewGroup, false); + return new ProductRadioOptionsRecyclerAdapter.ViewHolder(root, recyclerItemClickListener); + } + + @Override + public void onBindViewHolder(ProductRadioOptionsRecyclerAdapter.ViewHolder holder, int position) { + holder.productOptionRadioButton.setChecked(productOptionValueList.get(position).isSelected()); + holder.productOptionRadioButton.setText(productOptionValueList.get(position).getName()); + } + + @Override + public int getItemCount() { + return productOptionValueList.size(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/ch/pizzalink/android/dialog/ProductPropertiesBottomSheetDialog.java b/app/src/main/java/ch/pizzalink/android/dialog/ProductPropertiesBottomSheetDialog.java new file mode 100644 index 0000000..a766a79 --- /dev/null +++ b/app/src/main/java/ch/pizzalink/android/dialog/ProductPropertiesBottomSheetDialog.java @@ -0,0 +1,139 @@ +package ch.pizzalink.android.dialog; + +import android.app.Dialog; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.design.widget.BottomSheetBehavior; +import android.support.design.widget.BottomSheetDialog; +import android.support.design.widget.BottomSheetDialogFragment; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindString; +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; +import ch.pizzalink.android.R; +import ch.pizzalink.android.activity.BaseActivity; +import ch.pizzalink.android.adapter.recycler.ProductRadioOptionsRecyclerAdapter; +import ch.pizzalink.android.interfaces.RecyclerItemClickListener; +import ch.pizzalink.android.model.menu.MenuProductModel; +import ch.pizzalink.android.model.menu.MenuProductOptionValueModel; + +/** + * Created by cimenmus on 08/10/2017. + */ + +public class ProductPropertiesBottomSheetDialog extends BottomSheetDialogFragment { + + @BindView(R.id.productNameTextView) TextView productNameTextView; + @BindView(R.id.productPriceTextView) TextView productPriceTextView; + @BindView(R.id.radioRecyclerView) RecyclerView radioRecyclerView; + @BindView(R.id.checkboxRecyclerView) RecyclerView checkboxRecyclerView; + @BindView(R.id.increaseProductCountImageView) ImageView increaseProductCountImageView; + @BindView(R.id.deccreaseProductCountImageView) ImageView deccreaseProductCountImageView; + @BindView(R.id.productCountTextView) TextView productCountTextView; + @BindView(R.id.addToCartButton) Button addToCartButton; + + @BindString(R.string.chf) String chfText; + + private int productCount = 1; + + private BottomSheetBehavior mBehavior; + private MenuProductModel menuProductModel; + + private ArrayList menuProductOptionValueList = new ArrayList<>(); + private ProductRadioOptionsRecyclerAdapter productRadioOptionsRecyclerAdapter; + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState); + View view = View.inflate(getContext(), R.layout.layout_bottomsheet, null); + ButterKnife.bind(this, view); + initViews(); + dialog.setContentView(view); + mBehavior = BottomSheetBehavior.from((View) view.getParent()); + return dialog; + } + + @Override + public void onStart() { + super.onStart(); + //mBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); + } + + @OnClick({R.id.increaseProductCountImageView, + R.id.deccreaseProductCountImageView, + R.id.addToCartButton}) + public void onCLick(View view){ + switch (view.getId()){ + case R.id.increaseProductCountImageView: + productCount++; + productCountTextView.setText(String.valueOf(productCount)); + break; + case R.id.deccreaseProductCountImageView: + if(productCount == 1) + break; + productCount--; + productCountTextView.setText(String.valueOf(productCount)); + break; + case R.id.addToCartButton: + break; + } + } + + private void initViews(){ + setFields(); + if(menuProductModel.getProductOptionType() == MenuProductModel.ProductOptionType.RADIO) + initRadioRecyclerView(); + /* + else if(menuProductModel.getProductOptionType() == MenuProductModel.ProductOptionType.CHECKBOX) + initCheckboxRecyclerView(); + */ + } + + public void setMenuProductModel(MenuProductModel menuProductModel){ + this.menuProductModel = menuProductModel; + } + + private void initRadioRecyclerView(){ + menuProductOptionValueList.addAll(menuProductModel.getProductOptionList().get(0).getOptionValueModelList()); + GridLayoutManager gridLayoutManager = new GridLayoutManager(BaseActivity.currentActivity, 3); + radioRecyclerView.setLayoutManager(gridLayoutManager); + productRadioOptionsRecyclerAdapter = new ProductRadioOptionsRecyclerAdapter(menuProductOptionValueList, new RecyclerItemClickListener() { + @Override + public void onItemClick(View view, int position) { + if(!menuProductOptionValueList.get(position).isSelected()){ + for(MenuProductOptionValueModel menuProductOptionValueModel : menuProductOptionValueList){ + menuProductOptionValueModel.setSelected(false); + } + menuProductOptionValueList.get(position).setSelected(true); + productRadioOptionsRecyclerAdapter.notifyDataSetChanged(); + productPriceTextView.setText(chfText + " " + menuProductOptionValueList.get(position).getPrice()); + } + } + }); + radioRecyclerView.setAdapter(productRadioOptionsRecyclerAdapter); + } + + private void setFields(){ + productNameTextView.setText(menuProductModel.getName()); + productPriceTextView.setText(chfText + " " + menuProductModel.getPrice()); + } + + /* + @Override + public void onItemClick(Item item) { + mBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); + } + */ +} diff --git a/app/src/main/java/ch/pizzalink/android/fragment/MenuFragment.java b/app/src/main/java/ch/pizzalink/android/fragment/MenuFragment.java index 3b8584d..8119f5e 100644 --- a/app/src/main/java/ch/pizzalink/android/fragment/MenuFragment.java +++ b/app/src/main/java/ch/pizzalink/android/fragment/MenuFragment.java @@ -1,6 +1,8 @@ package ch.pizzalink.android.fragment; import android.os.Bundle; +import android.support.design.widget.BottomSheetBehavior; +import android.support.design.widget.BottomSheetDialog; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -13,10 +15,12 @@ import butterknife.BindView; import butterknife.ButterKnife; import ch.pizzalink.android.R; import ch.pizzalink.android.activity.BaseActivity; +import ch.pizzalink.android.activity.MainActivity; import ch.pizzalink.android.adapter.recycler.MenuProductRecyclerAdapter; import ch.pizzalink.android.api.ApiErrorUtils; import ch.pizzalink.android.api.ApiService; import ch.pizzalink.android.api.ResponseArray; +import ch.pizzalink.android.dialog.ProductPropertiesBottomSheetDialog; import ch.pizzalink.android.fragment.order.OrderBaseFragment; import ch.pizzalink.android.helper.DialogHelper; import ch.pizzalink.android.helper.DisplayHelper; @@ -81,7 +85,7 @@ public class MenuFragment extends OrderBaseFragment { menuProductRecyclerAdapter = new MenuProductRecyclerAdapter(menuProductList, new RecyclerItemClickListener() { @Override public void onItemClick(View view, int position) { - + showBottomsheetDialog(menuProductList.get(position)); } }); menuProductRecyclerView.addItemDecoration(new GridSpacesItemDecoration(DisplayHelper.dpToPx(12))); @@ -118,6 +122,12 @@ public class MenuFragment extends OrderBaseFragment { menuProductRecyclerAdapter.notifyDataSetChanged(); } + public void showBottomsheetDialog(MenuProductModel menuProductModel){ + ProductPropertiesBottomSheetDialog productPropertiesBottomSheetDialog = new ProductPropertiesBottomSheetDialog(); + productPropertiesBottomSheetDialog.setMenuProductModel(menuProductModel); + productPropertiesBottomSheetDialog.show(getChildFragmentManager(), "dialog"); + } + } diff --git a/app/src/main/java/ch/pizzalink/android/model/menu/MenuProductModel.java b/app/src/main/java/ch/pizzalink/android/model/menu/MenuProductModel.java index 08f9d02..028c135 100644 --- a/app/src/main/java/ch/pizzalink/android/model/menu/MenuProductModel.java +++ b/app/src/main/java/ch/pizzalink/android/model/menu/MenuProductModel.java @@ -3,6 +3,7 @@ package ch.pizzalink.android.model.menu; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; +import java.io.Serializable; import java.util.ArrayList; import ch.pizzalink.android.R; @@ -13,7 +14,7 @@ import ch.pizzalink.android.model.cart.CartProductOptionModel; * Created by cimenmus on 08/10/2017. */ -public class MenuProductModel { +public class MenuProductModel implements Serializable { @Expose @SerializedName("product_id") private String id; @Expose @SerializedName("thumb") private String imageURL; @@ -61,6 +62,21 @@ public class MenuProductModel { !description.equals(BaseActivity.currentActivity.getString(R.string.empty_description)); } + public ProductOptionType getProductOptionType(){ + if(productOptionList == null || productOptionList.size() == 0) + return ProductOptionType.NO_TYPE; + else if(productOptionList.get(0).getType().toLowerCase().equals("radio")) + return ProductOptionType.RADIO; + else + return ProductOptionType.CHECKBOX; + } + + public enum ProductOptionType{ + NO_TYPE, + RADIO, + CHECKBOX + } + public String getId() { return id; } diff --git a/app/src/main/java/ch/pizzalink/android/model/menu/MenuProductOptionModel.java b/app/src/main/java/ch/pizzalink/android/model/menu/MenuProductOptionModel.java index 82f6e8d..9a7d421 100644 --- a/app/src/main/java/ch/pizzalink/android/model/menu/MenuProductOptionModel.java +++ b/app/src/main/java/ch/pizzalink/android/model/menu/MenuProductOptionModel.java @@ -3,13 +3,14 @@ package ch.pizzalink.android.model.menu; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; +import java.io.Serializable; import java.util.ArrayList; /** * Created by cimenmus on 08/10/2017. */ -public class MenuProductOptionModel { +public class MenuProductOptionModel implements Serializable { @Expose @SerializedName("product_option_id") private String productOptionId; diff --git a/app/src/main/java/ch/pizzalink/android/model/menu/MenuProductOptionValueModel.java b/app/src/main/java/ch/pizzalink/android/model/menu/MenuProductOptionValueModel.java index 997c671..a93393a 100644 --- a/app/src/main/java/ch/pizzalink/android/model/menu/MenuProductOptionValueModel.java +++ b/app/src/main/java/ch/pizzalink/android/model/menu/MenuProductOptionValueModel.java @@ -3,13 +3,14 @@ package ch.pizzalink.android.model.menu; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; +import java.io.Serializable; import java.util.ArrayList; /** * Created by cimenmus on 08/10/2017. */ -public class MenuProductOptionValueModel { +public class MenuProductOptionValueModel implements Serializable{ @Expose @SerializedName("product_option_value_id") private String productOptionValueId; @Expose @SerializedName("option_value_id") private String optionValueId; @@ -17,6 +18,7 @@ public class MenuProductOptionValueModel { private String name; private String price; private String price_prefix; + private boolean isSelected; private void checkNull(){ @@ -92,4 +94,12 @@ public class MenuProductOptionValueModel { public void setPrice_prefix(String price_prefix) { this.price_prefix = price_prefix; } + + public boolean isSelected() { + return isSelected; + } + + public void setSelected(boolean selected) { + isSelected = selected; + } } diff --git a/app/src/main/res/drawable/shadow.xml b/app/src/main/res/drawable/shadow.xml new file mode 100644 index 0000000..7f5a61a --- /dev/null +++ b/app/src/main/res/drawable/shadow.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_bottomsheet.xml b/app/src/main/res/layout/layout_bottomsheet.xml new file mode 100644 index 0000000..3914b5f --- /dev/null +++ b/app/src/main/res/layout/layout_bottomsheet.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +