package bf.io.openshop.ux.fragments; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import org.json.JSONObject; import bf.io.openshop.CONST; import bf.io.openshop.MyApplication; import bf.io.openshop.R; import bf.io.openshop.SettingsMy; import bf.io.openshop.api.EndPoints; import bf.io.openshop.api.GsonRequest; import bf.io.openshop.api.JsonRequest; import bf.io.openshop.entities.User; import bf.io.openshop.entities.cart.Cart; import bf.io.openshop.entities.cart.CartDiscountItem; import bf.io.openshop.entities.cart.CartProductItem; import bf.io.openshop.interfaces.CartRecyclerInterface; import bf.io.openshop.interfaces.RequestListener; import bf.io.openshop.listeners.OnSingleClickListener; import bf.io.openshop.utils.MsgUtils; import bf.io.openshop.utils.RecyclerDividerDecorator; import bf.io.openshop.utils.Utils; import bf.io.openshop.ux.MainActivity; import bf.io.openshop.ux.adapters.CartRecyclerAdapter; import bf.io.openshop.ux.dialogs.DiscountDialogFragment; import bf.io.openshop.ux.dialogs.LoginExpiredDialogFragment; import bf.io.openshop.ux.dialogs.UpdateCartItemDialogFragment; import timber.log.Timber; /** * Fragment handles shopping cart. */ public class CartFragment extends Fragment { private ProgressDialog progressDialog; private View emptyCart; private View cartFooter; private RecyclerView cartRecycler; private CartRecyclerAdapter cartRecyclerAdapter; // Footer views and variables private TextView cartItemCountTv; private TextView cartTotalPriceTv; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Timber.d("%s - onCreateView", this.getClass().getSimpleName()); MainActivity.setActionBarTitle(getString(R.string.Shopping_cart)); View view = inflater.inflate(R.layout.fragment_cart, container, false); progressDialog = Utils.generateProgressDialog(getActivity(), false); prepareCartRecycler(view); emptyCart = view.findViewById(R.id.cart_empty); View emptyCartAction = view.findViewById(R.id.cart_empty_action); emptyCartAction.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { // Just open drawer menu. Activity activity = getActivity(); if (activity instanceof MainActivity) { MainActivity mainActivity = (MainActivity) activity; if (mainActivity.drawerFragment != null) mainActivity.drawerFragment.toggleDrawerMenu(); } } }); cartFooter = view.findViewById(R.id.cart_footer); cartItemCountTv = (TextView) view.findViewById(R.id.cart_footer_quantity); cartTotalPriceTv = (TextView) view.findViewById(R.id.cart_footer_price); view.findViewById(R.id.cart_footer_action).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { DiscountDialogFragment discountDialog = DiscountDialogFragment.newInstance(new RequestListener() { @Override public void requestSuccess(long newId) { getCartContent(); } @Override public void requestFailed(VolleyError error) { MsgUtils.logAndShowErrorMessage(getActivity(), error); } }); if (discountDialog != null) { discountDialog.show(getFragmentManager(), DiscountDialogFragment.class.getSimpleName()); } } }); Button order = (Button) view.findViewById(R.id.cart_order); order.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View v) { if (getActivity() instanceof MainActivity) { ((MainActivity) getActivity()).onOrderCreateSelected(); } } }); getCartContent(); return view; } private void getCartContent() { User user = SettingsMy.getActiveUser(); if (user != null) { String url = String.format(EndPoints.CART, SettingsMy.getActualNonNullShop(getActivity()).getId()); progressDialog.show(); GsonRequest<Cart> getCart = new GsonRequest<>(Request.Method.GET, url, null, Cart.class, new Response.Listener<Cart>() { @Override public void onResponse(@NonNull Cart cart) { if (progressDialog != null) progressDialog.cancel(); MainActivity.updateCartCountNotification(); if (cart.getItems() == null || cart.getItems().size() == 0) { setCartVisibility(false); } else { setCartVisibility(true); cartRecyclerAdapter.refreshItems(cart); cartItemCountTv.setText(getString(R.string.format_quantity, cart.getProductCount())); cartTotalPriceTv.setText(cart.getTotalPriceFormatted()); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { if (progressDialog != null) progressDialog.cancel(); setCartVisibility(false); Timber.e("Get request cart error: %s", error.getMessage()); MsgUtils.logAndShowErrorMessage(getActivity(), error); } }, getFragmentManager(), user.getAccessToken()); getCart.setRetryPolicy(MyApplication.getDefaultRetryPolice()); getCart.setShouldCache(false); MyApplication.getInstance().addToRequestQueue(getCart, CONST.CART_REQUESTS_TAG); } else { LoginExpiredDialogFragment loginExpiredDialogFragment = new LoginExpiredDialogFragment(); loginExpiredDialogFragment.show(getFragmentManager(), "loginExpiredDialogFragment"); } } private void setCartVisibility(boolean visible) { if (visible) { if (emptyCart != null) emptyCart.setVisibility(View.GONE); if (cartRecycler != null) cartRecycler.setVisibility(View.VISIBLE); if (cartFooter != null) cartFooter.setVisibility(View.VISIBLE); } else { if (cartRecyclerAdapter != null) cartRecyclerAdapter.cleatCart(); if (emptyCart != null) emptyCart.setVisibility(View.VISIBLE); if (cartRecycler != null) cartRecycler.setVisibility(View.GONE); if (cartFooter != null) cartFooter.setVisibility(View.GONE); } } private void prepareCartRecycler(View view) { this.cartRecycler = (RecyclerView) view.findViewById(R.id.cart_recycler); cartRecycler.addItemDecoration(new RecyclerDividerDecorator(getActivity())); cartRecycler.setItemAnimator(new DefaultItemAnimator()); cartRecycler.setHasFixedSize(true); cartRecycler.setLayoutManager(new LinearLayoutManager(getActivity())); cartRecyclerAdapter = new CartRecyclerAdapter(getActivity(), new CartRecyclerInterface() { @Override public void onProductUpdate(CartProductItem cartProductItem) { UpdateCartItemDialogFragment updateDialog = UpdateCartItemDialogFragment.newInstance(cartProductItem, new RequestListener() { @Override public void requestSuccess(long newId) { getCartContent(); } @Override public void requestFailed(VolleyError error) { MsgUtils.logAndShowErrorMessage(getActivity(), error); } }); if (updateDialog != null) { updateDialog.show(getFragmentManager(), UpdateCartItemDialogFragment.class.getSimpleName()); } } @Override public void onProductDelete(CartProductItem cartProductItem) { if (cartProductItem != null) deleteItemFromCart(cartProductItem.getId(), false); else Timber.e("Trying delete null cart item."); } @Override public void onDiscountDelete(CartDiscountItem cartDiscountItem) { if (cartDiscountItem != null) deleteItemFromCart(cartDiscountItem.getId(), true); else Timber.e("Trying delete null cart discount."); } @Override public void onProductSelect(long productId) { if (getActivity() instanceof MainActivity) ((MainActivity) getActivity()).onProductSelected(productId); } private void deleteItemFromCart(long id, boolean isDiscount) { User user = SettingsMy.getActiveUser(); if (user != null) { String url; if (isDiscount) url = String.format(EndPoints.CART_DISCOUNTS_SINGLE, SettingsMy.getActualNonNullShop(getActivity()).getId(), id); else url = String.format(EndPoints.CART_ITEM, SettingsMy.getActualNonNullShop(getActivity()).getId(), id); progressDialog.show(); JsonRequest req = new JsonRequest(Request.Method.DELETE, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Timber.d("Delete item from cart: %s", response.toString()); getCartContent(); MsgUtils.showToast(getActivity(), MsgUtils.TOAST_TYPE_MESSAGE, getString(R.string.The_item_has_been_successfully_removed), MsgUtils.ToastLength.LONG); if (progressDialog != null) progressDialog.cancel(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { if (progressDialog != null) progressDialog.cancel(); MsgUtils.logAndShowErrorMessage(getActivity(), error); } }, getFragmentManager(), user.getAccessToken()); req.setRetryPolicy(MyApplication.getDefaultRetryPolice()); req.setShouldCache(false); MyApplication.getInstance().addToRequestQueue(req, CONST.CART_REQUESTS_TAG); } else { LoginExpiredDialogFragment loginExpiredDialogFragment = new LoginExpiredDialogFragment(); loginExpiredDialogFragment.show(getFragmentManager(), "loginExpiredDialogFragment"); } } }); cartRecycler.setAdapter(cartRecyclerAdapter); } @Override public void onStop() { MyApplication.getInstance().cancelPendingRequests(CONST.CART_REQUESTS_TAG); if (progressDialog != null) progressDialog.cancel(); super.onStop(); } }