diff --git a/app/src/main/java/me/gilo/wc/adapter/CartAdapter.java b/app/src/main/java/me/gilo/wc/adapter/CartAdapter.java index 8d132a1..ace6196 100644 --- a/app/src/main/java/me/gilo/wc/adapter/CartAdapter.java +++ b/app/src/main/java/me/gilo/wc/adapter/CartAdapter.java @@ -15,7 +15,7 @@ import java.util.List; public class CartAdapter extends RecyclerView.Adapter { private List cartLineItems; - public CartAdapter(List categories) { + public CartAdapter(List cartLineItems) { this.cartLineItems = cartLineItems; } diff --git a/app/src/main/java/me/gilo/wc/adapter/viewholder/CartViewHolder.kt b/app/src/main/java/me/gilo/wc/adapter/viewholder/CartViewHolder.kt index b440c1d..7e81d13 100644 --- a/app/src/main/java/me/gilo/wc/adapter/viewholder/CartViewHolder.kt +++ b/app/src/main/java/me/gilo/wc/adapter/viewholder/CartViewHolder.kt @@ -15,10 +15,14 @@ import android.text.SpannableString import android.graphics.Color import kotlinx.android.synthetic.main.content_product.* import me.gilo.wc.R +import me.gilo.wc.events.AddQuantityEvent +import me.gilo.wc.events.LessQuantityEvent +import me.gilo.wc.events.ProductEvent import me.gilo.wc.models.CartLineItem import me.gilo.wc.ui.coupon.CouponActivity import me.gilo.wc.ui.product.ProductActivity import me.gilo.woodroid.models.CartItem +import org.greenrobot.eventbus.EventBus class CartViewHolder(val context: Context, itemView: View) : @@ -27,15 +31,35 @@ class CartViewHolder(val context: Context, itemView: View) : fun renderView(cartLineItem: CartLineItem) { val ivImage = itemView.findViewById(R.id.ivImage) val tvTitle = itemView.findViewById(R.id.tvTitle) + val tvDescription = itemView.findViewById(R.id.tvDescription) val tvPrice = itemView.findViewById(R.id.tvPrice) - tvTitle.text = cartLineItem.name + val tvAdd = itemView.findViewById(R.id.tvAdd) + val tvQty = itemView.findViewById(R.id.tvQty) + val tvLess = itemView.findViewById(R.id.tvReduce) - if (cartLineItem.imageUrl.isNotEmpty()){ - Picasso.with(context).load(cartLineItem.imageUrl).into(ivImage) + + tvQty.text = "" + cartLineItem.quantity + + var product = cartLineItem.product + + tvTitle.text = cartLineItem.name + tvDescription.text = Html.fromHtml(product.description) + + if (product.images != null && product.images.isNotEmpty()){ + Picasso.with(context).load(product.images[0].src).into(ivImage) } - tvPrice.text = cartLineItem.priceString; + tvTitle.text = product.name + + val regularPrice = product.regular_price + val salePrice = product.sale_price + + if (product.isOn_sale) { + tvPrice.text = SpannableString("$$salePrice") + }else{ + tvPrice.text = SpannableString("$$regularPrice") + } itemView.setOnClickListener{ @@ -45,6 +69,14 @@ class CartViewHolder(val context: Context, itemView: View) : context.startActivity(intent) } + tvAdd.setOnClickListener{ + EventBus.getDefault().post(AddQuantityEvent(cartLineItem)) + } + + tvLess.setOnClickListener{ + EventBus.getDefault().post(LessQuantityEvent(cartLineItem)) + } + } diff --git a/app/src/main/java/me/gilo/wc/events/AddQuantityEvent.java b/app/src/main/java/me/gilo/wc/events/AddQuantityEvent.java new file mode 100644 index 0000000..81c7f7e --- /dev/null +++ b/app/src/main/java/me/gilo/wc/events/AddQuantityEvent.java @@ -0,0 +1,21 @@ +package me.gilo.wc.events; + +import me.gilo.wc.models.CartLineItem; +import me.gilo.woodroid.models.ProductReview; + +public class AddQuantityEvent { + + CartLineItem cartLineItem; + + public AddQuantityEvent(CartLineItem cartLineItem) { + this.cartLineItem = cartLineItem; + } + + public CartLineItem getCartLineItem() { + return cartLineItem; + } + + public void setCartLineItem(CartLineItem cartLineItem) { + this.cartLineItem = cartLineItem; + } +} diff --git a/app/src/main/java/me/gilo/wc/events/LessQuantityEvent.java b/app/src/main/java/me/gilo/wc/events/LessQuantityEvent.java new file mode 100644 index 0000000..614f2b6 --- /dev/null +++ b/app/src/main/java/me/gilo/wc/events/LessQuantityEvent.java @@ -0,0 +1,21 @@ +package me.gilo.wc.events; + +import me.gilo.wc.models.CartLineItem; +import me.gilo.woodroid.models.ProductReview; + +public class LessQuantityEvent { + + CartLineItem cartLineItem; + + public LessQuantityEvent(CartLineItem cartLineItem) { + this.cartLineItem = cartLineItem; + } + + public CartLineItem getCartLineItem() { + return cartLineItem; + } + + public void setCartLineItem(CartLineItem cartLineItem) { + this.cartLineItem = cartLineItem; + } +} diff --git a/app/src/main/java/me/gilo/wc/models/CartLineItem.java b/app/src/main/java/me/gilo/wc/models/CartLineItem.java index e75f8b0..6080ea6 100644 --- a/app/src/main/java/me/gilo/wc/models/CartLineItem.java +++ b/app/src/main/java/me/gilo/wc/models/CartLineItem.java @@ -2,6 +2,7 @@ package me.gilo.wc.models; import com.google.gson.annotations.SerializedName; import me.gilo.woodroid.models.Metum; +import me.gilo.woodroid.models.Product; import java.util.ArrayList; import java.util.List; @@ -13,6 +14,8 @@ public class CartLineItem extends Model{ public int quantity; public int productId; + Product product; + String name; String imageUrl; String priceString; @@ -64,4 +67,12 @@ public class CartLineItem extends Model{ public void setPriceString(String priceString) { this.priceString = priceString; } + + public void setProduct(Product product) { + this.product = product; + } + + public Product getProduct() { + return product; + } } diff --git a/app/src/main/java/me/gilo/wc/repo/CartRepository.java b/app/src/main/java/me/gilo/wc/repo/CartRepository.java index 1cdf5ab..439fa77 100644 --- a/app/src/main/java/me/gilo/wc/repo/CartRepository.java +++ b/app/src/main/java/me/gilo/wc/repo/CartRepository.java @@ -21,6 +21,7 @@ import me.gilo.wc.models.CartLineItem; import me.gilo.wc.utils.AppUtils; import me.gilo.woodroid.Woocommerce; import me.gilo.woodroid.models.LineItem; +import me.gilo.woodroid.models.Product; import javax.inject.Inject; import java.io.ByteArrayOutputStream; @@ -88,12 +89,12 @@ public class CartRepository { } - public CompletionGenericLiveData addToCart(int productId, float price) { + public CompletionGenericLiveData addToCart(Product product) { final CompletionGenericLiveData completion = new CompletionGenericLiveData(); CartLineItem lineItem = new CartLineItem(); - lineItem.setProductId(productId); - lineItem.setPrice(price); + lineItem.setProductId(product.getId()); + lineItem.setProduct(product); lineItem.setQuantity(1); cart.add(lineItem).addOnCompleteListener(completion); diff --git a/app/src/main/java/me/gilo/wc/ui/WooDroidActivity.kt b/app/src/main/java/me/gilo/wc/ui/WooDroidActivity.kt index df7c5e1..ed97fc1 100644 --- a/app/src/main/java/me/gilo/wc/ui/WooDroidActivity.kt +++ b/app/src/main/java/me/gilo/wc/ui/WooDroidActivity.kt @@ -5,6 +5,7 @@ import android.content.Context import android.os.Bundle import android.support.design.widget.Snackbar import android.support.v7.app.AppCompatActivity +import android.widget.Toast import io.github.inflationx.viewpump.ViewPumpContextWrapper import me.gilo.wc.R @@ -27,6 +28,10 @@ abstract class WooDroidActivity : BaseActivity() { super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase)) } + fun showLoading() { + showLoading("Please wait", "This will only take a second") + } + fun showLoading(title: String, message: String) { val manager = supportFragmentManager progressDialog = ProgressDialogFragment.newInstance(title, message) @@ -38,4 +43,8 @@ abstract class WooDroidActivity : BaseActivity() { progressDialog.dismiss() } + fun toast(text : String){ + Toast.makeText(baseContext, text, Toast.LENGTH_LONG).show() + } + } diff --git a/app/src/main/java/me/gilo/wc/ui/product/CartActivity.kt b/app/src/main/java/me/gilo/wc/ui/product/CartActivity.kt index 6cc5be2..ad906d6 100644 --- a/app/src/main/java/me/gilo/wc/ui/product/CartActivity.kt +++ b/app/src/main/java/me/gilo/wc/ui/product/CartActivity.kt @@ -2,19 +2,32 @@ package me.gilo.wc.ui.product import android.content.Context import android.os.Bundle +import android.support.v7.widget.LinearLayoutManager +import android.text.SpannableString import io.github.inflationx.viewpump.ViewPumpContextWrapper import kotlinx.android.synthetic.main.activity_cart.* +import kotlinx.android.synthetic.main.content_cart.* +import kotlinx.android.synthetic.main.single_cart_item.* import me.gilo.wc.R +import me.gilo.wc.adapter.CartAdapter import me.gilo.wc.common.Status +import me.gilo.wc.events.AddQuantityEvent +import me.gilo.wc.events.LessQuantityEvent +import me.gilo.wc.events.ProductEvent import me.gilo.wc.models.CartLineItem import me.gilo.wc.ui.WooDroidActivity import me.gilo.wc.viewmodels.CartViewModel +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode class CartActivity : WooDroidActivity() { - override lateinit var viewModel : CartViewModel - var cartItems : ArrayList = ArrayList() + override lateinit var viewModel: CartViewModel + var cartItems: ArrayList = ArrayList() + + lateinit var adapter: CartAdapter override fun attachBaseContext(newBase: Context) { super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase)) @@ -29,24 +42,123 @@ class CartActivity : WooDroidActivity() { viewModel = getViewModel(CartViewModel::class.java) title = "Cart" + val layoutManager = LinearLayoutManager(baseContext, LinearLayoutManager.VERTICAL, false) + rvCart.layoutManager = layoutManager + rvCart.isNestedScrollingEnabled = false + + cartItems = ArrayList() + + adapter = CartAdapter(cartItems) + rvCart.adapter = adapter + cart() + + } private fun cart() { viewModel.cart().observe(this, android.arch.lifecycle.Observer { response -> when (response!!.status()) { Status.LOADING -> { - + showLoading() } Status.SUCCESS -> { cartItems.clear() + stopShowingLoading() - for (cartItem in response.data()){ + for (cartItem in response.data()) { cartItems.add(cartItem) } + + adapter.notifyDataSetChanged() + + setUpPage() + } + + Status.ERROR -> { + stopShowingLoading() + } + + Status.EMPTY -> { + stopShowingLoading() + } + } + + }) + + } + + private fun setUpPage() { + var itemCount = cartItems.size + var total = 0 + + for (cartitem in cartItems){ + var price = if (cartitem.product.isOn_sale) { + cartitem.product.sale_price.toInt() + }else{ + cartitem.product.regular_price.toInt() + } + + var qty = cartitem.quantity + + total += price * qty + + } + + if (itemCount == 1){ + tvTotalItemCountTitle.text = "Item ($itemCount)" + }else{ + tvTotalItemCountTitle.text = "Items ($itemCount)" + } + + tvTotalItemCost.text = "$$total" + tvTotal.text = "$$total" + } + + + override fun onStart() { + super.onStart() + EventBus.getDefault().register(this) + } + + override fun onStop() { + super.onStop() + EventBus.getDefault().unregister(this) + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: AddQuantityEvent) { + var cartLineItem = event.cartLineItem + var quantity = cartLineItem.quantity + 1 + + updateCart(cartLineItem, quantity) + + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: LessQuantityEvent) { + var cartLineItem = event.cartLineItem + var quantity = cartLineItem.quantity - 1 + + if (quantity == 0) { + delete(cartLineItem) + } else { + updateCart(cartLineItem, quantity) + } + } + + private fun updateCart(cartLineItem: CartLineItem, quantity: Int) { + viewModel.setQuantity(cartLineItem, quantity).observe(this, android.arch.lifecycle.Observer { response -> + when (response!!.status()) { + Status.LOADING -> { + + } + + Status.SUCCESS -> { + } Status.ERROR -> { @@ -63,6 +175,29 @@ class CartActivity : WooDroidActivity() { } + private fun delete(cartLineItem: CartLineItem) { + viewModel.deleteItem(cartLineItem).observe(this, android.arch.lifecycle.Observer { response -> + when (response!!.status()) { + Status.LOADING -> { + + } + + Status.SUCCESS -> { + + } + + Status.ERROR -> { + + } + + Status.EMPTY -> { + + } + } + + }) + + } } diff --git a/app/src/main/java/me/gilo/wc/ui/product/ProductActivity.kt b/app/src/main/java/me/gilo/wc/ui/product/ProductActivity.kt index c52f280..f5b2b4f 100644 --- a/app/src/main/java/me/gilo/wc/ui/product/ProductActivity.kt +++ b/app/src/main/java/me/gilo/wc/ui/product/ProductActivity.kt @@ -60,8 +60,8 @@ class ProductActivity : BaseActivity() { } - private fun addToCart(productId: Int, price : Float) { - viewModel.addToCart(productId, price).observe(this, android.arch.lifecycle.Observer { response -> + private fun addToCart(product: Product) { + viewModel.addToCart(product).observe(this, android.arch.lifecycle.Observer { response -> when (response!!.status()) { Status.LOADING -> { @@ -233,7 +233,7 @@ class ProductActivity : BaseActivity() { if (productInCart){ removeFromCart(currentCartItem) }else { - addToCart(productId, product.price.toFloat()) + addToCart(product) } } } diff --git a/app/src/main/java/me/gilo/wc/viewmodels/CartViewModel.java b/app/src/main/java/me/gilo/wc/viewmodels/CartViewModel.java index 3ed8491..7cd33a1 100644 --- a/app/src/main/java/me/gilo/wc/viewmodels/CartViewModel.java +++ b/app/src/main/java/me/gilo/wc/viewmodels/CartViewModel.java @@ -29,8 +29,8 @@ public final class CartViewModel extends ViewModel { this.cartRepository = cartRepository; } - public CompletionGenericLiveData addToCart(int productId, float price) { - return cartRepository.addToCart(productId, price); + public CompletionGenericLiveData addToCart(Product product) { + return cartRepository.addToCart(product); } public QueryLiveData cart() { diff --git a/app/src/main/java/me/gilo/wc/viewmodels/ProductViewModel.java b/app/src/main/java/me/gilo/wc/viewmodels/ProductViewModel.java index 6824b3f..7ba0365 100644 --- a/app/src/main/java/me/gilo/wc/viewmodels/ProductViewModel.java +++ b/app/src/main/java/me/gilo/wc/viewmodels/ProductViewModel.java @@ -39,8 +39,8 @@ public final class ProductViewModel extends ViewModel { return productRepository.products(); } - public CompletionGenericLiveData addToCart(int productId, float price) { - return cartRepository.addToCart(productId, price); + public CompletionGenericLiveData addToCart(Product product) { + return cartRepository.addToCart(product); } public QueryLiveData cart() { diff --git a/app/src/main/res/layout/activity_cart.xml b/app/src/main/res/layout/activity_cart.xml index 6ca1044..58389cc 100644 --- a/app/src/main/res/layout/activity_cart.xml +++ b/app/src/main/res/layout/activity_cart.xml @@ -23,4 +23,46 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/content_cart.xml b/app/src/main/res/layout/content_cart.xml index af73bc8..1eb50c0 100644 --- a/app/src/main/res/layout/content_cart.xml +++ b/app/src/main/res/layout/content_cart.xml @@ -1,101 +1,172 @@ - - - - - - - + - + - + - - - - + + + + + + + + + + + + + + + - \ No newline at end of file + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/single_cart_item.xml b/app/src/main/res/layout/single_cart_item.xml index 98ed2dd..86d0f17 100644 --- a/app/src/main/res/layout/single_cart_item.xml +++ b/app/src/main/res/layout/single_cart_item.xml @@ -1,99 +1,160 @@ - - - - - - - - + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:gravity="top" + android:orientation="horizontal" - + + + + + android:orientation="vertical" + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - -