From a19c3e24e39ba2a32a95bbbfe6e3fe54d1969109 Mon Sep 17 00:00:00 2001 From: Gilbert Kimutai Date: Wed, 3 Apr 2019 06:52:33 +0300 Subject: [PATCH] Adding a cart page --- app/src/main/AndroidManifest.xml | 5 + .../java/me/gilo/wc/adapter/CartAdapter.java | 37 +++++++ .../wc/adapter/viewholder/CartViewHolder.kt | 51 +++++++++ .../java/me/gilo/wc/di/ActivitiesModule.java | 4 + .../java/me/gilo/wc/di/ViewModelModule.java | 6 ++ .../java/me/gilo/wc/models/CartLineItem.java | 28 +++++ .../me/gilo/wc/ui/product/CartActivity.kt | 68 ++++++++++++ .../me/gilo/wc/ui/product/ProductActivity.kt | 13 +-- .../me/gilo/wc/viewmodels/CartViewModel.java | 56 ++++++++++ app/src/main/res/drawable/cylinderical.xml | 21 ++++ app/src/main/res/layout/activity_cart.xml | 26 +++++ app/src/main/res/layout/content_cart.xml | 101 ++++++++++++++++++ app/src/main/res/layout/menu_cart_icon.xml | 1 + app/src/main/res/layout/single_cart_item.xml | 99 +++++++++++++++++ .../main/res/menu/{home.xml => product.xml} | 0 app/src/main/res/values/strings.xml | 1 + 16 files changed, 509 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/me/gilo/wc/adapter/CartAdapter.java create mode 100644 app/src/main/java/me/gilo/wc/adapter/viewholder/CartViewHolder.kt create mode 100644 app/src/main/java/me/gilo/wc/ui/product/CartActivity.kt create mode 100644 app/src/main/java/me/gilo/wc/viewmodels/CartViewModel.java create mode 100644 app/src/main/res/drawable/cylinderical.xml create mode 100644 app/src/main/res/layout/activity_cart.xml create mode 100644 app/src/main/res/layout/content_cart.xml create mode 100644 app/src/main/res/layout/single_cart_item.xml rename app/src/main/res/menu/{home.xml => product.xml} (100%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 29f86bb..1566c55 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,6 +13,11 @@ android:supportsRtl="true" android:theme="@style/AppTheme" android:usesCleartextTraffic="true"> + + { + private List cartLineItems; + + public CartAdapter(List categories) { + this.cartLineItems = cartLineItems; + } + + @Override + public CartViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return new CartViewHolder(parent.getContext(), LayoutInflater.from(parent.getContext()).inflate(R.layout.single_cart_item, parent, false)); + } + + @Override + public void onBindViewHolder(CartViewHolder holder, int position) { + holder.renderView(cartLineItems.get(position)); + } + + + @Override + public int getItemCount() { + return cartLineItems.size() == 0 ? 0 : cartLineItems.size(); + } +} 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 new file mode 100644 index 0000000..b440c1d --- /dev/null +++ b/app/src/main/java/me/gilo/wc/adapter/viewholder/CartViewHolder.kt @@ -0,0 +1,51 @@ +package me.gilo.wc.adapter.viewholder + +import android.content.Context +import android.content.Intent +import android.support.v7.widget.RecyclerView +import android.text.Html +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import com.squareup.picasso.Picasso +import me.gilo.woodroid.models.Product +import android.text.Spannable +import android.text.style.ForegroundColorSpan +import android.text.SpannableString +import android.graphics.Color +import kotlinx.android.synthetic.main.content_product.* +import me.gilo.wc.R +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 + + +class CartViewHolder(val context: Context, itemView: View) : + RecyclerView.ViewHolder(itemView) { + + fun renderView(cartLineItem: CartLineItem) { + val ivImage = itemView.findViewById(R.id.ivImage) + val tvTitle = itemView.findViewById(R.id.tvTitle) + val tvPrice = itemView.findViewById(R.id.tvPrice) + + tvTitle.text = cartLineItem.name + + if (cartLineItem.imageUrl.isNotEmpty()){ + Picasso.with(context).load(cartLineItem.imageUrl).into(ivImage) + } + + tvPrice.text = cartLineItem.priceString; + + + itemView.setOnClickListener{ + val intent = Intent(context, ProductActivity::class.java) + intent.putExtra("productId", cartLineItem.productId) + + context.startActivity(intent) + } + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/me/gilo/wc/di/ActivitiesModule.java b/app/src/main/java/me/gilo/wc/di/ActivitiesModule.java index b51a939..bd8d1e2 100644 --- a/app/src/main/java/me/gilo/wc/di/ActivitiesModule.java +++ b/app/src/main/java/me/gilo/wc/di/ActivitiesModule.java @@ -11,6 +11,7 @@ import me.gilo.wc.ui.customer.BillingAddressActivity; import me.gilo.wc.ui.customer.ProfileActivity; import me.gilo.wc.ui.customer.ShippingAddressActivity; import me.gilo.wc.ui.home.HomeActivity; +import me.gilo.wc.ui.product.CartActivity; import me.gilo.wc.ui.product.ProductActivity; import me.gilo.wc.ui.product.ShopActivity; @@ -44,6 +45,9 @@ abstract class ActivitiesModule { @ContributesAndroidInjector abstract ShippingAddressActivity contributesShippingAddressActivity(); + @ContributesAndroidInjector + abstract CartActivity contributesCartActivity(); + @ContributesAndroidInjector abstract ProfileActivity contributesProfileActivity(); diff --git a/app/src/main/java/me/gilo/wc/di/ViewModelModule.java b/app/src/main/java/me/gilo/wc/di/ViewModelModule.java index d3a36fa..3b8157e 100644 --- a/app/src/main/java/me/gilo/wc/di/ViewModelModule.java +++ b/app/src/main/java/me/gilo/wc/di/ViewModelModule.java @@ -39,6 +39,12 @@ public abstract class ViewModelModule { @ViewModelKey(CustomerViewModel.class) abstract ViewModel bindCustomerViewModel(CustomerViewModel viewModel); + @Binds + @IntoMap + @ViewModelKey(CartViewModel.class) + abstract ViewModel bindCartViewModel(CartViewModel viewModel); + + @Binds @IntoMap 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 352549b..e75f8b0 100644 --- a/app/src/main/java/me/gilo/wc/models/CartLineItem.java +++ b/app/src/main/java/me/gilo/wc/models/CartLineItem.java @@ -13,6 +13,10 @@ public class CartLineItem extends Model{ public int quantity; public int productId; + String name; + String imageUrl; + String priceString; + public float getPrice() { return price; } @@ -36,4 +40,28 @@ public class CartLineItem extends Model{ public void setProductId(int productId) { this.productId = productId; } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public String getPriceString() { + return priceString; + } + + public void setPriceString(String priceString) { + this.priceString = priceString; + } } 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 new file mode 100644 index 0000000..6cc5be2 --- /dev/null +++ b/app/src/main/java/me/gilo/wc/ui/product/CartActivity.kt @@ -0,0 +1,68 @@ +package me.gilo.wc.ui.product + +import android.content.Context +import android.os.Bundle +import io.github.inflationx.viewpump.ViewPumpContextWrapper +import kotlinx.android.synthetic.main.activity_cart.* +import me.gilo.wc.R +import me.gilo.wc.common.Status +import me.gilo.wc.models.CartLineItem +import me.gilo.wc.ui.WooDroidActivity +import me.gilo.wc.viewmodels.CartViewModel + +class CartActivity : WooDroidActivity() { + + + override lateinit var viewModel : CartViewModel + var cartItems : ArrayList = ArrayList() + + override fun attachBaseContext(newBase: Context) { + super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase)) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_cart) + + setSupportActionBar(toolbar) + + viewModel = getViewModel(CartViewModel::class.java) + title = "Cart" + + cart() + + } + + private fun cart() { + viewModel.cart().observe(this, android.arch.lifecycle.Observer { response -> + when (response!!.status()) { + Status.LOADING -> { + + } + + Status.SUCCESS -> { + cartItems.clear() + + for (cartItem in response.data()){ + cartItems.add(cartItem) + + } + } + + 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 7bcab28..c52f280 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 @@ -1,9 +1,9 @@ package me.gilo.wc.ui.product +import android.content.Intent import android.content.res.ColorStateList import android.os.Bundle import android.support.v4.content.ContextCompat -import android.support.v4.view.GravityCompat import android.text.Html import android.view.Menu import android.view.MenuItem @@ -23,7 +23,6 @@ import me.gilo.wc.ui.state.ProgressDialogFragment import me.gilo.wc.viewmodels.ProductViewModel import me.gilo.woodroid.models.Product import org.greenrobot.eventbus.EventBus -import java.security.AccessController.getContext class ProductActivity : BaseActivity() { @@ -263,26 +262,24 @@ class ProductActivity : BaseActivity() { var tvCartCounter : TextView? = null override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(me.gilo.wc.R.menu.home, menu) + menuInflater.inflate(me.gilo.wc.R.menu.product, menu) val item = menu.findItem(me.gilo.wc.R.id.menu_cart) val rootView = item.actionView as FrameLayout tvCartCounter = rootView.findViewById(me.gilo.wc.R.id.tvCart_counter) + rootView.setOnClickListener{startActivity(Intent(baseContext, CartActivity::class.java))} + return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { - me.gilo.wc.R.id.action_filter -> { + R.id.menu_cart -> { true } - me.gilo.wc.R.id.action_search -> { - - true - } else -> super.onOptionsItemSelected(item) } } diff --git a/app/src/main/java/me/gilo/wc/viewmodels/CartViewModel.java b/app/src/main/java/me/gilo/wc/viewmodels/CartViewModel.java new file mode 100644 index 0000000..3ed8491 --- /dev/null +++ b/app/src/main/java/me/gilo/wc/viewmodels/CartViewModel.java @@ -0,0 +1,56 @@ +package me.gilo.wc.viewmodels; + +import android.arch.lifecycle.ViewModel; +import android.content.Context; +import com.google.firebase.firestore.DocumentReference; +import me.gilo.wc.common.CompletionGenericLiveData; +import me.gilo.wc.common.QueryLiveData; +import me.gilo.wc.common.WooLiveData; +import me.gilo.wc.models.CartLineItem; +import me.gilo.wc.repo.CartRepository; +import me.gilo.wc.repo.OrderRepository; +import me.gilo.wc.repo.ProductRepository; +import me.gilo.woodroid.models.LineItem; +import me.gilo.woodroid.models.Product; +import me.gilo.woodroid.models.ProductReview; +import me.gilo.woodroid.models.filters.ProductFilter; + +import javax.inject.Inject; +import java.util.List; +import java.util.Map; + + +public final class CartViewModel extends ViewModel { + + private final CartRepository cartRepository; + + @Inject + CartViewModel(CartRepository cartRepository) { + this.cartRepository = cartRepository; + } + + public CompletionGenericLiveData addToCart(int productId, float price) { + return cartRepository.addToCart(productId, price); + } + + public QueryLiveData cart() { + return cartRepository.cart(); + } + + public CompletionGenericLiveData deleteItem(CartLineItem cartLineItem) { + return cartRepository.deleteItem(cartLineItem); + } + + public CompletionGenericLiveData deleteAllCartItems() { + return cartRepository.deleteItems(); + } + + public CompletionGenericLiveData setQuantity(CartLineItem cartLineItem, int quantity) { + return cartRepository.setQuantity(cartLineItem, quantity); + } + + public WooLiveData> cart(Context context) { + return cartRepository.cart(context); + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable/cylinderical.xml b/app/src/main/res/drawable/cylinderical.xml new file mode 100644 index 0000000..94c0171 --- /dev/null +++ b/app/src/main/res/drawable/cylinderical.xml @@ -0,0 +1,21 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_cart.xml b/app/src/main/res/layout/activity_cart.xml new file mode 100644 index 0000000..6ca1044 --- /dev/null +++ b/app/src/main/res/layout/activity_cart.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..af73bc8 --- /dev/null +++ b/app/src/main/res/layout/content_cart.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/menu_cart_icon.xml b/app/src/main/res/layout/menu_cart_icon.xml index d038477..a6c3bf5 100644 --- a/app/src/main/res/layout/menu_cart_icon.xml +++ b/app/src/main/res/layout/menu_cart_icon.xml @@ -26,6 +26,7 @@ android:textSize="10sp" android:paddingTop="0dp" android:paddingLeft="0dp" + android:visibility="gone" android:layout_gravity="bottom|right" android:layout_marginTop="10dp" android:layout_marginLeft="16dp" diff --git a/app/src/main/res/layout/single_cart_item.xml b/app/src/main/res/layout/single_cart_item.xml new file mode 100644 index 0000000..98ed2dd --- /dev/null +++ b/app/src/main/res/layout/single_cart_item.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/home.xml b/app/src/main/res/menu/product.xml similarity index 100% rename from app/src/main/res/menu/home.xml rename to app/src/main/res/menu/product.xml diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index af66cd7..327fa59 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -43,5 +43,6 @@ United States \n (555) 555 555 + CartActivity