From 9dddd4713cf062b0565a0da95057c75391d24ab2 Mon Sep 17 00:00:00 2001 From: Gilbert Kimutai Date: Tue, 2 Apr 2019 05:50:21 +0300 Subject: [PATCH] Added firebase cart repo --- .../java/me/gilo/wc/common/QueryLiveData.java | 64 ++++++++++++++ .../java/me/gilo/wc/models/CartLineItem.java | 48 ++++++++++ .../main/java/me/gilo/wc/models/Model.java | 37 ++++++++ .../java/me/gilo/wc/repo/CartRepository.java | 87 ++++++++++++++++--- .../me/gilo/wc/ui/product/ProductActivity.kt | 9 +- .../gilo/wc/viewmodels/ProductViewModel.java | 24 ++++- app/src/main/res/drawable/circlular_menu.xml | 10 +++ app/src/main/res/layout/activity_product.xml | 21 +++-- app/src/main/res/layout/menu_cart_icon.xml | 31 +++++++ app/src/main/res/menu/home.xml | 13 +++ .../java/me/gilo/woodroid/Woocommerce.java | 3 + .../me/gilo/woodroid/models/Line_item.java | 42 --------- 12 files changed, 320 insertions(+), 69 deletions(-) create mode 100644 app/src/main/java/me/gilo/wc/common/QueryLiveData.java create mode 100644 app/src/main/java/me/gilo/wc/models/CartLineItem.java create mode 100644 app/src/main/java/me/gilo/wc/models/Model.java create mode 100644 app/src/main/res/drawable/circlular_menu.xml create mode 100644 app/src/main/res/layout/menu_cart_icon.xml create mode 100644 app/src/main/res/menu/home.xml delete mode 100644 woodroid/src/main/java/me/gilo/woodroid/models/Line_item.java diff --git a/app/src/main/java/me/gilo/wc/common/QueryLiveData.java b/app/src/main/java/me/gilo/wc/common/QueryLiveData.java new file mode 100644 index 0000000..7d5221d --- /dev/null +++ b/app/src/main/java/me/gilo/wc/common/QueryLiveData.java @@ -0,0 +1,64 @@ +package me.gilo.wc.common; + +import android.arch.lifecycle.LiveData; +import android.support.annotation.NonNull; +import com.google.firebase.firestore.*; +import me.gilo.wc.models.Model; + + +import java.util.ArrayList; +import java.util.List; + + +public final class QueryLiveData + extends LiveData>> implements EventListener { + + private final Query query; + private final Class type; + private ListenerRegistration registration; + + public QueryLiveData(Query query, Class type) { + this.query = query; + this.type = type; + + setValue(new Resource<>(Status.LOADING)); + } + + @Override + public void onEvent(QuerySnapshot snapshots, FirebaseFirestoreException e) { + if (e != null) { + setValue(new Resource<>(e)); + return; + } + setValue(new Resource<>(documentToList(snapshots))); + } + + @Override + protected void onActive() { + super.onActive(); + registration = query.addSnapshotListener(this); + } + + @Override + protected void onInactive() { + super.onInactive(); + if (registration != null) { + registration.remove(); + registration = null; + } + } + + @NonNull + private List documentToList(QuerySnapshot snapshots) { + final List retList = new ArrayList<>(); + if (snapshots.isEmpty()) { + return retList; + } + + for (DocumentSnapshot document : snapshots.getDocuments()) { + retList.add(document.toObject(type).withId(document.getId())); + } + + return retList; + } +} diff --git a/app/src/main/java/me/gilo/wc/models/CartLineItem.java b/app/src/main/java/me/gilo/wc/models/CartLineItem.java new file mode 100644 index 0000000..8f7322a --- /dev/null +++ b/app/src/main/java/me/gilo/wc/models/CartLineItem.java @@ -0,0 +1,48 @@ +package me.gilo.wc.models; + +import com.google.gson.annotations.SerializedName; +import me.gilo.woodroid.models.Metum; + +import java.util.ArrayList; +import java.util.List; + + +public class CartLineItem extends Model{ + + String id; + public float price; + public int quantity; + public int productId; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public float getPrice() { + return price; + } + + public void setPrice(float price) { + this.price = price; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + public int getProductId() { + return productId; + } + + public void setProductId(int productId) { + this.productId = productId; + } +} diff --git a/app/src/main/java/me/gilo/wc/models/Model.java b/app/src/main/java/me/gilo/wc/models/Model.java new file mode 100644 index 0000000..8451ef6 --- /dev/null +++ b/app/src/main/java/me/gilo/wc/models/Model.java @@ -0,0 +1,37 @@ +package me.gilo.wc.models; + +import android.support.annotation.NonNull; +import com.google.firebase.firestore.IgnoreExtraProperties; +import com.google.firebase.firestore.ServerTimestamp; + +import java.io.Serializable; +import java.util.Date; + + +/** + * A Base Model to be extended by other models to add ids. + */ + +@IgnoreExtraProperties +public class Model implements Serializable { + + public String id; + + @ServerTimestamp + private Date date_created = null; + + + public T withId(@NonNull final String id) { + this.id = id; + return (T) this; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + +} 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 af66fbe..1cdf5ab 100644 --- a/app/src/main/java/me/gilo/wc/repo/CartRepository.java +++ b/app/src/main/java/me/gilo/wc/repo/CartRepository.java @@ -1,13 +1,31 @@ package me.gilo.wc.repo; +import android.arch.lifecycle.Observer; import android.content.Context; +import android.graphics.Bitmap; +import android.net.Uri; +import android.support.annotation.NonNull; +import android.util.Log; +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.firestore.*; +import com.google.firebase.storage.StorageReference; +import com.google.firebase.storage.UploadTask; +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.utils.AppUtils; import me.gilo.woodroid.Woocommerce; import me.gilo.woodroid.models.LineItem; import javax.inject.Inject; +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.List; import java.util.Map; public class CartRepository { @@ -15,21 +33,73 @@ public class CartRepository { @Inject Woocommerce woocommerce; + private final CollectionReference cart; @Inject public CartRepository() { + this.cart = FirebaseFirestore.getInstance() + .collection("users") + .document(FirebaseAuth.getInstance().getCurrentUser().getUid()) + .collection("cart"); } - public WooLiveData> addToCart(Context context, int productId) { - final WooLiveData> callBack = new WooLiveData(); + public QueryLiveData cart() { + return new QueryLiveData<>(cart, CartLineItem.class); + } - LineItem lineItem = new LineItem(); + public CompletionGenericLiveData deleteItem(CartLineItem cartLineItem) { + final CompletionGenericLiveData completion = new CompletionGenericLiveData(); + cart.document(cartLineItem.getId()).delete().addOnCompleteListener(completion); + + return completion; + } + + public CompletionGenericLiveData setQuantity(CartLineItem cartLineItem, int quantity) { + final CompletionGenericLiveData completion = new CompletionGenericLiveData(); + cartLineItem.setQuantity(quantity); + + cart.document(cartLineItem.getId()).set(cartLineItem).addOnCompleteListener(completion); + + return completion; + } + + public CompletionGenericLiveData deleteItems() { + final CompletionGenericLiveData completion = new CompletionGenericLiveData(); + deleteCartItems().addOnCompleteListener(completion); + return completion; + } + + + private Task deleteCartItems() { + return cart.getFirestore().runTransaction(transaction -> { + cart.get().addOnCompleteListener(task -> { + if (task.isSuccessful()) { + for (QueryDocumentSnapshot document : task.getResult()) { + cart.document(document.getId()).delete(); + } + + } else { + } + }); + + return null; + }); + } + + + public CompletionGenericLiveData addToCart(int productId, float price) { + final CompletionGenericLiveData completion = new CompletionGenericLiveData(); + + CartLineItem lineItem = new CartLineItem(); lineItem.setProductId(productId); + lineItem.setPrice(price); lineItem.setQuantity(1); - woocommerce.CartRepository(context).addToCart(lineItem).enqueue(callBack); - return callBack; + cart.add(lineItem).addOnCompleteListener(completion); + + return completion; + } public WooLiveData> cart(Context context) { @@ -39,11 +109,4 @@ public class CartRepository { return callBack; } - public void saveSession(Context context, String session, String expiry) { - AppUtils appUtils = new AppUtils(context); - appUtils.saveCartSession(session, expiry); - } - - - } 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 73c6e30..b727ebf 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 @@ -44,20 +44,19 @@ class ProductActivity : BaseActivity() { product(productId) } - fab.setOnClickListener{addToCart(productId)} + } - private fun addToCart(productId: Int) { - viewModel.addToCart(baseContext, productId).observe(this, android.arch.lifecycle.Observer { response -> + private fun addToCart(productId: Int, price : Float) { + viewModel.addToCart(productId, price).observe(this, android.arch.lifecycle.Observer { response -> when (response!!.status()) { Status.LOADING -> { } Status.SUCCESS -> { - val order = response.data() } @@ -87,6 +86,8 @@ class ProductActivity : BaseActivity() { setUpPage(product) //similarProducts(product) + fab.setOnClickListener{addToCart(productId, product.price.toFloat())} + EventBus.getDefault().post(ProductEvent(product)) } 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 2f075c1..6824b3f 100644 --- a/app/src/main/java/me/gilo/wc/viewmodels/ProductViewModel.java +++ b/app/src/main/java/me/gilo/wc/viewmodels/ProductViewModel.java @@ -2,7 +2,11 @@ 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; @@ -35,8 +39,24 @@ public final class ProductViewModel extends ViewModel { return productRepository.products(); } - public WooLiveData> addToCart(Context context, int productId) { - return cartRepository.addToCart(context, productId); + 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) { diff --git a/app/src/main/res/drawable/circlular_menu.xml b/app/src/main/res/drawable/circlular_menu.xml new file mode 100644 index 0000000..b76a5e6 --- /dev/null +++ b/app/src/main/res/drawable/circlular_menu.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_product.xml b/app/src/main/res/layout/activity_product.xml index 4cd2db8..5e0de91 100644 --- a/app/src/main/res/layout/activity_product.xml +++ b/app/src/main/res/layout/activity_product.xml @@ -23,15 +23,18 @@ - + + + \ 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 new file mode 100644 index 0000000..84205e7 --- /dev/null +++ b/app/src/main/res/layout/menu_cart_icon.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/home.xml b/app/src/main/res/menu/home.xml new file mode 100644 index 0000000..bf61d36 --- /dev/null +++ b/app/src/main/res/menu/home.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/woodroid/src/main/java/me/gilo/woodroid/Woocommerce.java b/woodroid/src/main/java/me/gilo/woodroid/Woocommerce.java index 879bc08..2adfd2f 100644 --- a/woodroid/src/main/java/me/gilo/woodroid/Woocommerce.java +++ b/woodroid/src/main/java/me/gilo/woodroid/Woocommerce.java @@ -1,10 +1,13 @@ package me.gilo.woodroid; import android.content.Context; +import android.util.Log; import me.gilo.woodroid.repo.*; import me.gilo.woodroid.repo.order.OrderNoteRepository; import me.gilo.woodroid.repo.order.RefundRepository; import me.gilo.woodroid.repo.product.*; +import org.json.JSONException; +import org.json.JSONObject; public class Woocommerce { diff --git a/woodroid/src/main/java/me/gilo/woodroid/models/Line_item.java b/woodroid/src/main/java/me/gilo/woodroid/models/Line_item.java deleted file mode 100644 index daa17fb..0000000 --- a/woodroid/src/main/java/me/gilo/woodroid/models/Line_item.java +++ /dev/null @@ -1,42 +0,0 @@ -package me.gilo.woodroid.models; - -public class Line_item { - private int product_id; - private int quantity; - private String variations; - - public Line_item(int product_id, int quantity, String variations) { - this.product_id = product_id; - this.quantity = quantity; - this.variations = variations; - } - - public Line_item(int product_id, int quantity) { - this.product_id = product_id; - this.quantity = quantity; - } - - public int getProduct_id() { - return product_id; - } - - public void setProduct_id(int product_id) { - this.product_id = product_id; - } - - public int getQuantity() { - return quantity; - } - - public void setQuantity(int quantity) { - this.quantity = quantity; - } - - public String getVariations() { - return variations; - } - - public void setVariations(String variations) { - this.variations = variations; - } -}