Adding a cart page

This commit is contained in:
Gilbert Kimutai 2019-04-03 06:52:33 +03:00
parent 6d3ee7f2c7
commit a19c3e24e3
16 changed files with 509 additions and 8 deletions

View File

@ -13,6 +13,11 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<activity
android:name=".ui.product.CartActivity"
android:label="@string/title_activity_cart"
android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity
android:name=".ui.customer.ProfileActivity"
android:label="@string/title_activity_profile"

View File

@ -0,0 +1,37 @@
package me.gilo.wc.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import me.gilo.wc.R;
import me.gilo.wc.adapter.viewholder.CartViewHolder;
import me.gilo.wc.adapter.viewholder.CategoryViewHolder;
import me.gilo.wc.models.CartLineItem;
import me.gilo.woodroid.models.CartItem;
import me.gilo.woodroid.models.Category;
import java.util.List;
public class CartAdapter extends RecyclerView.Adapter<CartViewHolder> {
private List<CartLineItem> cartLineItems;
public CartAdapter(List<CartLineItem> 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();
}
}

View File

@ -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<ImageView>(R.id.ivImage)
val tvTitle = itemView.findViewById<TextView>(R.id.tvTitle)
val tvPrice = itemView.findViewById<TextView>(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)
}
}
}

View File

@ -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();

View File

@ -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

View File

@ -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;
}
}

View File

@ -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<CartViewModel>() {
override lateinit var viewModel : CartViewModel
var cartItems : ArrayList<CartLineItem> = 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 -> {
}
}
})
}
}

View File

@ -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<TextView>(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)
}
}

View File

@ -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<DocumentReference> addToCart(int productId, float price) {
return cartRepository.addToCart(productId, price);
}
public QueryLiveData<CartLineItem> cart() {
return cartRepository.cart();
}
public CompletionGenericLiveData<Void> deleteItem(CartLineItem cartLineItem) {
return cartRepository.deleteItem(cartLineItem);
}
public CompletionGenericLiveData<Void> deleteAllCartItems() {
return cartRepository.deleteItems();
}
public CompletionGenericLiveData<Void> setQuantity(CartLineItem cartLineItem, int quantity) {
return cartRepository.setQuantity(cartLineItem, quantity);
}
public WooLiveData<Map<String, LineItem>> cart(Context context) {
return cartRepository.cart(context);
}
}

View File

@ -0,0 +1,21 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<padding
android:top="0dp"
android:left="0dp"
android:right="0dp"
android:bottom="0dp"/>
<stroke
android:color="@color/colorPrimary"
android:width="1dp"
/>
<corners
android:bottomLeftRadius="16dp"
android:bottomRightRadius="16dp"
android:topLeftRadius="16dp"
android:topRightRadius="16dp" />
</shape>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.product.CartActivity">
<android.support.design.widget.AppBarLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_cart"/>
</android.support.design.widget.CoordinatorLayout>

View File

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/bg"
android:orientation="vertical"
tools:ignore="MissingPrefix"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
>
<TextView
fontPath="@string/font_medium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:layout_marginRight="16dp"
android:text="Your cart items"
android:textColor="@color/text_black_2"
android:textSize="20sp"
/>
<TextView
fontPath="@string/font_regular"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="4dp"
android:text="Review and edit"
android:maxLines="6"
android:lineSpacingMultiplier="1.2"
android:textColor="@color/text_black_9"
android:textSize="16sp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:id="@+id/rvCart"
android:elevation="2dp"
android:background="@drawable/rect_white"
>
</android.support.v7.widget.RecyclerView>
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:orientation="horizontal"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:paddingRight="16dp"
android:layout_margin="16dp"
android:gravity="center"
android:elevation="2dp"
android:id="@+id/flSave"
>
<TextView
android:id="@+id/bNext"
fontPath="@string/font_regular"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:background="@color/colorPrimary"
android:text="Proceed to checkout"
android:padding="12dp"
android:gravity="center"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="16sp"
tools:ignore="MissingPrefix"/>
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/ic_action_navigation_arrow_back_inverted"
android:tint="#ffffff"
android:layout_gravity="right|center"
android:rotation="180"
/>
</FrameLayout>
</LinearLayout>

View File

@ -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"

View File

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:layout_margin="4dp"
android:gravity="top"
android:orientation="horizontal"
tools:ignore="MissingPrefix"
android:elevation="2dp"
>
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@color/bg"
android:elevation="1dp"
android:id="@+id/ivImage"
android:scaleType="centerCrop"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:orientation="vertical">
<TextView
android:id="@+id/tvTitle"
fontPath="@string/font_medium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:text="Title"
android:textColor="@color/text"
android:textSize="18sp"
/>
<TextView
android:id="@+id/tvPrice"
fontPath="@string/font_regular"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="0dp"
android:layout_marginBottom="0dp"
android:gravity="left"
android:text="$20.00"
android:textColor="#1c5c9a"
android:textSize="14sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/cylinderical"
android:orientation="horizontal">
<TextView
android:id="@+id/tvMyCart_single_item_service_less"
android:layout_width="24dp"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="4dp"
android:text="&#8211;"
android:textColor="@color/colorPrimary"
android:textSize="18sp" />
<TextView
android:id="@+id/tvMyCart_single_item_service_quantity"
android:layout_width="32dp"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
android:gravity="center"
android:text="1"
android:textColor="#ffffff"
android:textSize="14sp" />
<TextView
android:id="@+id/tvMyCart_single_item_service_more"
android:layout_width="24dp"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="4dp"
android:text="+"
android:textColor="@color/colorPrimary"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>

View File

@ -43,5 +43,6 @@
United States \n
(555) 555 555
</string>
<string name="title_activity_cart">CartActivity</string>
</resources>