From 53e6f95ab7b06368b3348461257cf90e53e0a310 Mon Sep 17 00:00:00 2001 From: Gilbert Kimutai Date: Sun, 24 Mar 2019 07:50:59 +0300 Subject: [PATCH] Composable UI approach with fragments on the product page --- app/build.gradle | 2 + app/src/main/AndroidManifest.xml | 1 + .../java/me/gilo/wc/events/ProductEvent.java | 20 +++ .../me/gilo/wc/ui/product/ProductActivity.kt | 101 +------------- .../product/section/ProductReviewsFragment.kt | 107 +++++++++++++++ .../section/RelatedProductsFragment.kt | 128 ++++++++++++++++++ app/src/main/res/layout/content_product.xml | 42 ++---- .../res/layout/section_product_reviews.xml | 32 +++++ .../res/layout/section_related_products.xml | 30 ++++ .../main/res/xml/network_security_config.xml | 6 + .../data/cookie/AddCookiesInterceptor.java | 2 - .../me/gilo/woodroid/repo/CartRepository.java | 7 +- 12 files changed, 346 insertions(+), 132 deletions(-) create mode 100644 app/src/main/java/me/gilo/wc/events/ProductEvent.java create mode 100644 app/src/main/java/me/gilo/wc/ui/product/section/ProductReviewsFragment.kt create mode 100644 app/src/main/java/me/gilo/wc/ui/product/section/RelatedProductsFragment.kt create mode 100644 app/src/main/res/layout/section_product_reviews.xml create mode 100644 app/src/main/res/layout/section_related_products.xml create mode 100644 app/src/main/res/xml/network_security_config.xml diff --git a/app/build.gradle b/app/build.gradle index c77f4ae..2329267 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -90,5 +90,7 @@ dependencies { implementation 'net.danlew:android.joda:2.9.9.4' + implementation 'org.greenrobot:eventbus:3.1.1' + } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2077f8c..a31d86d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,6 +11,7 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" + android:usesCleartextTraffic="true" android:theme="@style/AppTheme"> - - //TODO(Use the include product filter to get related products from API) - private fun similarProducts(product: Product) { - val layoutManager = LinearLayoutManager(baseContext, LinearLayoutManager.HORIZONTAL, false) - rvShop.layoutManager = layoutManager - rvShop.isNestedScrollingEnabled = false - - products = ArrayList() - - adapter = HomeProductAdapter(products) - rvShop.adapter = adapter - - val filter = ProductFilter() - filter.include = product.related_ids.toIntArray() - - viewModel.products(filter).observe(this, android.arch.lifecycle.Observer { response -> - when (response!!.status()) { - Status.LOADING -> { - - } - - Status.SUCCESS -> { - products.clear() - val productsResponse = response.data() - for (product in productsResponse) { - products.add(product) - } - - adapter.notifyDataSetChanged() - - } - - Status.ERROR -> { - - } - - Status.EMPTY -> { - - } - } - - }) - } - private fun addToCart(productId: Int) { viewModel.addToCart(baseContext, productId).observe(this, android.arch.lifecycle.Observer { response -> when (response!!.status()) { @@ -131,7 +85,9 @@ class ProductActivity : BaseActivity() { Status.SUCCESS -> { val product = response.data() setUpPage(product) - similarProducts(product) + //similarProducts(product) + + EventBus.getDefault().post(ProductEvent(product)) } @@ -149,49 +105,6 @@ class ProductActivity : BaseActivity() { } - private fun reviews(productId : Int) { - - val layoutManager = LinearLayoutManager(baseContext, LinearLayoutManager.VERTICAL, false) - rvReviews.layoutManager = layoutManager - rvReviews.isNestedScrollingEnabled = false - - var reviews = ArrayList() - - var productReviewAdapter = ProductReviewAdapter(reviews) - rvReviews.adapter = productReviewAdapter - - - viewModel.reviews(productId).observe(this, android.arch.lifecycle.Observer { response -> - when (response!!.status()) { - Status.LOADING -> { - - } - - Status.SUCCESS -> { - reviews.clear() - - val reviewsResponse = response.data() - for (review in reviewsResponse) { - reviews.add(review) - } - - productReviewAdapter.notifyDataSetChanged() - - } - - Status.ERROR -> { - Log.d("Error", response.error().message) - } - - Status.EMPTY -> { - - } - } - - }) - - } - private fun setUpPage(product: Product) { tvTitle.text = product.name tvDescription.text = Html.fromHtml(product.description) diff --git a/app/src/main/java/me/gilo/wc/ui/product/section/ProductReviewsFragment.kt b/app/src/main/java/me/gilo/wc/ui/product/section/ProductReviewsFragment.kt new file mode 100644 index 0000000..2ea882d --- /dev/null +++ b/app/src/main/java/me/gilo/wc/ui/product/section/ProductReviewsFragment.kt @@ -0,0 +1,107 @@ +package me.gilo.wc.ui.product.section + +import android.os.Bundle +import android.support.v4.app.Fragment +import android.support.v7.widget.LinearLayoutManager +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import kotlinx.android.synthetic.main.section_product_reviews.* +import me.gilo.wc.R +import me.gilo.wc.adapter.ProductReviewAdapter +import me.gilo.wc.common.BaseActivity +import me.gilo.wc.common.Status +import me.gilo.wc.ui.product.ProductActivity +import me.gilo.wc.viewmodels.ProductViewModel +import me.gilo.woodroid.models.ProductReview +import org.greenrobot.eventbus.EventBus +import java.util.* + + +class ProductReviewsFragment : Fragment() { + + + lateinit var viewModel: ProductViewModel + val TAG = "ProductReviewsFragment" + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + + return inflater.inflate(R.layout.section_product_reviews, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel = (activity as BaseActivity).getViewModel(ProductViewModel::class.java) + + + var productId = (activity as ProductActivity).intent.getIntExtra("productId", 0) + reviews(productId) + } + + private fun reviews(productId : Int) { + + val layoutManager = LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false) + rvReviews.layoutManager = layoutManager + rvReviews.isNestedScrollingEnabled = false + + var reviews = ArrayList() + + var productReviewAdapter = ProductReviewAdapter(reviews) + rvReviews.adapter = productReviewAdapter + + + viewModel.reviews(productId).observe(this, android.arch.lifecycle.Observer { response -> + when (response!!.status()) { + Status.LOADING -> { + + } + + Status.SUCCESS -> { + reviews.clear() + + val reviewsResponse = response.data() + for (review in reviewsResponse) { + reviews.add(review) + } + + productReviewAdapter.notifyDataSetChanged() + + } + + Status.ERROR -> { + Log.d("Error", response.error().message) + } + + Status.EMPTY -> { + + } + } + + }) + + } + + companion object { + @JvmStatic + fun newInstance() = + ProductReviewsFragment().apply { + arguments = Bundle().apply { + + } + } + } + +} diff --git a/app/src/main/java/me/gilo/wc/ui/product/section/RelatedProductsFragment.kt b/app/src/main/java/me/gilo/wc/ui/product/section/RelatedProductsFragment.kt new file mode 100644 index 0000000..b338df9 --- /dev/null +++ b/app/src/main/java/me/gilo/wc/ui/product/section/RelatedProductsFragment.kt @@ -0,0 +1,128 @@ +package me.gilo.wc.ui.product.section + +import android.os.Bundle +import android.support.v4.app.Fragment +import android.support.v7.widget.LinearLayoutManager +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import kotlinx.android.synthetic.main.section_related_products.* +import me.gilo.wc.R +import me.gilo.wc.adapter.HomeProductAdapter +import me.gilo.wc.common.BaseActivity +import me.gilo.wc.common.Status +import me.gilo.wc.events.ProductEvent +import me.gilo.wc.viewmodels.ProductViewModel +import me.gilo.woodroid.models.Product +import me.gilo.woodroid.models.filters.ProductFilter +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import java.util.* + + +class RelatedProductsFragment : Fragment() { + + + lateinit var viewModel: ProductViewModel + val TAG = "RelatedProductFragment" + + lateinit var adapter: HomeProductAdapter + private lateinit var products: ArrayList + + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + + return inflater.inflate(R.layout.section_related_products, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel = (activity as BaseActivity).getViewModel(ProductViewModel::class.java) + + //similarProducts() + } + + private fun similarProducts(product: Product) { + val layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false) + rvShop.layoutManager = layoutManager + rvShop.isNestedScrollingEnabled = false + + products = ArrayList() + + adapter = HomeProductAdapter(products) + rvShop.adapter = adapter + + val filter = ProductFilter() + filter.include = product.related_ids.toIntArray() + + viewModel.products(filter).observe(this, android.arch.lifecycle.Observer { response -> + when (response!!.status()) { + Status.LOADING -> { + + } + + Status.SUCCESS -> { + products.clear() + val productsResponse = response.data() + for (product in productsResponse) { + products.add(product) + } + + adapter.notifyDataSetChanged() + + } + + Status.ERROR -> { + + } + + Status.EMPTY -> { + + } + } + + }) + } + + + 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: ProductEvent) { + similarProducts(event.product) + } + + + companion object { + @JvmStatic + fun newInstance() = + RelatedProductsFragment().apply { + arguments = Bundle().apply { + + } + } + } + +} diff --git a/app/src/main/res/layout/content_product.xml b/app/src/main/res/layout/content_product.xml index 8efce16..4730ed8 100644 --- a/app/src/main/res/layout/content_product.xml +++ b/app/src/main/res/layout/content_product.xml @@ -107,44 +107,20 @@ - + - + android:layout_height="wrap_content" /> - - diff --git a/app/src/main/res/layout/section_product_reviews.xml b/app/src/main/res/layout/section_product_reviews.xml new file mode 100644 index 0000000..9829c5e --- /dev/null +++ b/app/src/main/res/layout/section_product_reviews.xml @@ -0,0 +1,32 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/section_related_products.xml b/app/src/main/res/layout/section_related_products.xml new file mode 100644 index 0000000..08b17da --- /dev/null +++ b/app/src/main/res/layout/section_related_products.xml @@ -0,0 +1,30 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml new file mode 100644 index 0000000..05f7773 --- /dev/null +++ b/app/src/main/res/xml/network_security_config.xml @@ -0,0 +1,6 @@ + + + + 157.230.131.179 + + \ No newline at end of file diff --git a/woodroid/src/main/java/me/gilo/woodroid/data/cookie/AddCookiesInterceptor.java b/woodroid/src/main/java/me/gilo/woodroid/data/cookie/AddCookiesInterceptor.java index 7d60dbf..5febf80 100644 --- a/woodroid/src/main/java/me/gilo/woodroid/data/cookie/AddCookiesInterceptor.java +++ b/woodroid/src/main/java/me/gilo/woodroid/data/cookie/AddCookiesInterceptor.java @@ -12,8 +12,6 @@ import java.util.HashSet; public class AddCookiesInterceptor implements Interceptor { public static final String PREF_COOKIES = "PREF_COOKIES"; - // We're storing our stuff in a database made just for cookies called PREF_COOKIES. - // I reccomend you do this, and don't change this default value. private Context context; public AddCookiesInterceptor(Context context) { diff --git a/woodroid/src/main/java/me/gilo/woodroid/repo/CartRepository.java b/woodroid/src/main/java/me/gilo/woodroid/repo/CartRepository.java index 7c3ef39..8cd59fa 100644 --- a/woodroid/src/main/java/me/gilo/woodroid/repo/CartRepository.java +++ b/woodroid/src/main/java/me/gilo/woodroid/repo/CartRepository.java @@ -2,7 +2,9 @@ package me.gilo.woodroid.repo; import android.content.Context; import me.gilo.woodroid.data.api.CartAPI; +import me.gilo.woodroid.data.cookie.AddCookiesInterceptor; import me.gilo.woodroid.data.cookie.DemoCookieInterceptor; +import me.gilo.woodroid.data.cookie.ReceivedCookiesInterceptor; import me.gilo.woodroid.models.LineItem; import me.gilo.woodroid.models.filters.CartFilter; import okhttp3.OkHttpClient; @@ -49,9 +51,8 @@ public class CartRepository{ loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() -// .addInterceptor(new AddCookiesInterceptor(context)) -// .addInterceptor(new ReceivedCookiesInterceptor(context)) - .addInterceptor(new DemoCookieInterceptor()) + .addInterceptor(new AddCookiesInterceptor(context)) + .addInterceptor(new ReceivedCookiesInterceptor(context)) .addInterceptor(loggingInterceptor) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS)