diff --git a/app/build.gradle b/app/build.gradle index 540ae9a..c77f4ae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,6 +12,7 @@ android { targetSdkVersion 28 versionCode 1 versionName "1.0" + multiDexEnabled true testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { @@ -87,5 +88,7 @@ dependencies { implementation 'me.relex:circleindicator:1.2.2@aar' + implementation 'net.danlew:android.joda:2.9.9.4' + } diff --git a/app/src/main/java/me/gilo/wc/MainActivity.kt b/app/src/main/java/me/gilo/wc/MainActivity.kt index b45a9ab..5070bed 100644 --- a/app/src/main/java/me/gilo/wc/MainActivity.kt +++ b/app/src/main/java/me/gilo/wc/MainActivity.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import me.gilo.wc.ui.home.HomeActivity +import me.gilo.wc.ui.product.ProductActivity class MainActivity : AppCompatActivity() { @@ -15,10 +16,10 @@ class MainActivity : AppCompatActivity() { startActivity(Intent(baseContext, HomeActivity::class.java)) -// val intent = Intent(baseContext, ProductActivity::class.java) -// intent.putExtra("productId", 63) -// -// startActivity(intent) + val intent = Intent(baseContext, ProductActivity::class.java) + intent.putExtra("productId", 63) + + startActivity(intent) finish() diff --git a/app/src/main/java/me/gilo/wc/adapter/ProductReviewAdapter.java b/app/src/main/java/me/gilo/wc/adapter/ProductReviewAdapter.java new file mode 100644 index 0000000..68a0abd --- /dev/null +++ b/app/src/main/java/me/gilo/wc/adapter/ProductReviewAdapter.java @@ -0,0 +1,36 @@ +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.ProductReviewViewHolder; +import me.gilo.wc.adapter.viewholder.ProductViewHolder; +import me.gilo.woodroid.models.Product; +import me.gilo.woodroid.models.ProductReview; + +import java.util.List; + +public class ProductReviewAdapter extends RecyclerView.Adapter { + private List reviews; + + public ProductReviewAdapter(List reviews) { + this.reviews = reviews; + } + + @Override + public ProductReviewViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return new ProductReviewViewHolder(parent.getContext(), LayoutInflater.from(parent.getContext()).inflate(R.layout.single_product_review, parent, false)); + } + + @Override + public void onBindViewHolder(ProductReviewViewHolder holder, int position) { + holder.renderView(reviews.get(position)); + } + + + @Override + public int getItemCount() { + return reviews.size() == 0 ? 0 : reviews.size(); + } +} diff --git a/app/src/main/java/me/gilo/wc/adapter/viewholder/ProductReviewViewHolder.kt b/app/src/main/java/me/gilo/wc/adapter/viewholder/ProductReviewViewHolder.kt new file mode 100644 index 0000000..f6cde31 --- /dev/null +++ b/app/src/main/java/me/gilo/wc/adapter/viewholder/ProductReviewViewHolder.kt @@ -0,0 +1,34 @@ +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.RatingBar +import android.widget.TextView +import me.gilo.wc.R +import me.gilo.wc.ui.product.ShopActivity +import me.gilo.wc.utils.DateUtils +import me.gilo.woodroid.models.Category +import me.gilo.woodroid.models.ProductReview + +class ProductReviewViewHolder(val context: Context, itemView: View) : + RecyclerView.ViewHolder(itemView) { + + fun renderView(review: ProductReview) { + val tvName = itemView.findViewById(R.id.tvName) + val tvDate = itemView.findViewById(R.id.tvDate) + val rbRating = itemView.findViewById(R.id.rbRating) + val tvMessage = itemView.findViewById(R.id.tvMessage) + + tvName.text = review.reviewer + tvMessage.text = Html.fromHtml(review.review) + + rbRating.rating = review.rating.toFloat() + tvDate.text = DateUtils.getDateString_shortAndSmart(review.date_created) + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/me/gilo/wc/repo/ProductRepository.java b/app/src/main/java/me/gilo/wc/repo/ProductRepository.java index eb5eff6..a06494c 100644 --- a/app/src/main/java/me/gilo/wc/repo/ProductRepository.java +++ b/app/src/main/java/me/gilo/wc/repo/ProductRepository.java @@ -4,7 +4,9 @@ package me.gilo.wc.repo; import me.gilo.wc.common.WooLiveData; import me.gilo.woodroid.Woocommerce; import me.gilo.woodroid.models.Product; +import me.gilo.woodroid.models.ProductReview; import me.gilo.woodroid.models.filters.ProductFilter; +import me.gilo.woodroid.models.filters.ProductReviewFilter; import javax.inject.Inject; import java.util.List; @@ -41,6 +43,19 @@ public class ProductRepository { } + public WooLiveData> reviews(int productId) { + final WooLiveData> callBack = new WooLiveData(); + + ProductReviewFilter filter = new ProductReviewFilter(); + int[] products = {productId}; + + filter.setProduct(products); + + woocommerce.ReviewRepository().reviews(filter).enqueue(callBack); + return callBack; + } + + public WooLiveData> search(String term) { final WooLiveData> callBack = new WooLiveData(); 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 62c3244..249623c 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 @@ -10,11 +10,13 @@ import kotlinx.android.synthetic.main.content_product.* import me.gilo.wc.R import me.gilo.wc.adapter.HomeProductAdapter import me.gilo.wc.adapter.ImagePagerAdapter +import me.gilo.wc.adapter.ProductReviewAdapter import me.gilo.wc.common.BaseActivity import me.gilo.wc.common.Status import me.gilo.wc.ui.state.ProgressDialogFragment import me.gilo.wc.viewmodels.ProductViewModel import me.gilo.woodroid.models.Product +import me.gilo.woodroid.models.ProductReview import me.gilo.woodroid.models.filters.ProductFilter import java.util.ArrayList @@ -38,6 +40,7 @@ class ProductActivity : BaseActivity() { if (productId != 0){ product(productId) + reviews(productId) } @@ -63,10 +66,6 @@ class ProductActivity : BaseActivity() { val filter = ProductFilter() filter.include = product.related_ids.toIntArray() - for (id in product.related_ids){ - Log.d("Related ids", "" + id) - } - viewModel.products(filter).observe(this, android.arch.lifecycle.Observer { response -> when (response!!.status()) { Status.LOADING -> { @@ -149,6 +148,50 @@ 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/utils/DateUtils.java b/app/src/main/java/me/gilo/wc/utils/DateUtils.java new file mode 100644 index 0000000..d82a623 --- /dev/null +++ b/app/src/main/java/me/gilo/wc/utils/DateUtils.java @@ -0,0 +1,87 @@ +package me.gilo.wc.utils; + +import org.joda.time.DateMidnight; +import org.joda.time.DateTime; +import org.joda.time.Days; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DateUtils { + + static SimpleDateFormat dateFormat = new SimpleDateFormat("EEE hh:mma MMM d, yyyy"); + static SimpleDateFormat longagoDateFormat = new SimpleDateFormat("dd/MM/yyyy"); + static SimpleDateFormat weekdayFormat = new SimpleDateFormat("EEE"); + static SimpleDateFormat hourMinuteFormat = new SimpleDateFormat("hh:mm a"); + + private static boolean isToday (DateTime dateTime) { + DateMidnight today = new DateMidnight(); + return today.equals(dateTime.toDateMidnight()); + } + + private static boolean isYesterday (DateTime dateTime) { + DateMidnight yesterday = (new DateMidnight()).minusDays(1); + return yesterday.equals(dateTime.toDateMidnight()); + } + + private static String getDayString(Date date) { + String s; + + if (isToday(new DateTime(date))) + s = "Today"; + else if (isYesterday(new DateTime(date))) + s = "Yesterday"; + else + s = weekdayFormat.format(date); + + return s; + } + + public static String getDateString_shortAndSmart(Date date) { + String s; + + DateTime nowDT = new DateTime(); + DateTime dateDT = new DateTime(date); + int days = Days.daysBetween(dateDT, nowDT).getDays(); + + if (isToday(new DateTime(date))) + s = getHourMinuteString(date); + else if (days < 7) + s = getDayString(date); + else + s = getDateString(date); + + return s; + } + + + public static String getDateStatus(Date date) { + String s; + + if (date == null) + return "Null"; + + DateTime nowDT = new DateTime(); + DateTime dateDT = new DateTime(date); + int days = Days.daysBetween(dateDT, nowDT).getDays(); + + if (isToday(new DateTime(date))) + s = getHourMinuteString(date); + else if (days < 7) + s = getDayString(date) + "at " + getHourMinuteString(date); + else + s = getDateString(date); + + return "Last online " + s; + } + + private static String getDateString(Date date) { + return longagoDateFormat.format(date); + } + + private static String getHourMinuteString(Date date) { + String s = hourMinuteFormat.format(date); + + return s; + } +} 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 f3cfc4c..2f075c1 100644 --- a/app/src/main/java/me/gilo/wc/viewmodels/ProductViewModel.java +++ b/app/src/main/java/me/gilo/wc/viewmodels/ProductViewModel.java @@ -8,6 +8,7 @@ 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; @@ -50,6 +51,11 @@ public final class ProductViewModel extends ViewModel { return productRepository.product(productId); } + + public WooLiveData> reviews(int productId) { + return productRepository.reviews(productId); + } + public WooLiveData> search(String term) { return productRepository.search(term); } diff --git a/app/src/main/res/layout/content_product.xml b/app/src/main/res/layout/content_product.xml index 657464e..8efce16 100644 --- a/app/src/main/res/layout/content_product.xml +++ b/app/src/main/res/layout/content_product.xml @@ -21,6 +21,7 @@ android:layout_width="match_parent" android:layout_height="320dp" android:layout_marginBottom="16dp" + android:layout_marginTop="16dp" > @@ -109,7 +110,7 @@ + + + + + diff --git a/app/src/main/res/layout/single_product_review.xml b/app/src/main/res/layout/single_product_review.xml new file mode 100644 index 0000000..e0756c6 --- /dev/null +++ b/app/src/main/res/layout/single_product_review.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/woodroid/src/main/java/me/gilo/woodroid/Woocommerce.java b/woodroid/src/main/java/me/gilo/woodroid/Woocommerce.java index 44e13a4..879bc08 100644 --- a/woodroid/src/main/java/me/gilo/woodroid/Woocommerce.java +++ b/woodroid/src/main/java/me/gilo/woodroid/Woocommerce.java @@ -27,6 +27,8 @@ public class Woocommerce { final OrderRepository orderRepository; final ProductRepository productRepository; + final ReviewRepository reviewRepository; + final ReportsRepository reportsRepository; final CartRepository cartRepository; @@ -75,6 +77,8 @@ public class Woocommerce { cartRepository = new CartRepository(cartBaseUrl, consumerKey, consumerSecret); + reviewRepository = new ReviewRepository(baseUrl, consumerKey, consumerSecret); + } @@ -162,6 +166,10 @@ public class Woocommerce { return productRepository; } + public ReviewRepository ReviewRepository() { + return reviewRepository; + } + public ReportsRepository ReportsRepository() { return reportsRepository; } diff --git a/woodroid/src/main/java/me/gilo/woodroid/data/api/ProductReviewAPI.java b/woodroid/src/main/java/me/gilo/woodroid/data/api/ProductReviewAPI.java index f5e6700..e0b87d9 100644 --- a/woodroid/src/main/java/me/gilo/woodroid/data/api/ProductReviewAPI.java +++ b/woodroid/src/main/java/me/gilo/woodroid/data/api/ProductReviewAPI.java @@ -3,6 +3,7 @@ package me.gilo.woodroid.data.api; import me.gilo.woodroid.data.callbacks.ReviewsData; import me.gilo.woodroid.models.Coupon; +import me.gilo.woodroid.models.Product; import me.gilo.woodroid.models.ProductReview; import retrofit2.Call; import retrofit2.http.*; diff --git a/woodroid/src/main/java/me/gilo/woodroid/models/ProductReview.java b/woodroid/src/main/java/me/gilo/woodroid/models/ProductReview.java index 183f78d..1131164 100644 --- a/woodroid/src/main/java/me/gilo/woodroid/models/ProductReview.java +++ b/woodroid/src/main/java/me/gilo/woodroid/models/ProductReview.java @@ -2,16 +2,21 @@ package me.gilo.woodroid.models; import java.io.Serializable; import java.util.Date; +import java.util.Map; public class ProductReview implements Serializable{ private int id; private Date date_created; private Date date_created_gmt; + int product_id; + String reviewer; + String reviewer_email; + + Map reviewer_avatar_urls; + private String review; private int rating; - private String name; - private String email; private boolean verified; public int getId() { @@ -54,20 +59,36 @@ public class ProductReview implements Serializable{ this.rating = rating; } - public String getName() { - return name; + public int getProduct_id() { + return product_id; } - public void setName(String name) { - this.name = name; + public void setProduct_id(int product_id) { + this.product_id = product_id; } - public String getEmail() { - return email; + public String getReviewer() { + return reviewer; } - public void setEmail(String email) { - this.email = email; + public void setReviewer(String reviewer) { + this.reviewer = reviewer; + } + + public String getReviewer_email() { + return reviewer_email; + } + + public void setReviewer_email(String reviewer_email) { + this.reviewer_email = reviewer_email; + } + + public Map getReviewer_avatar_urls() { + return reviewer_avatar_urls; + } + + public void setReviewer_avatar_urls(Map reviewer_avatar_urls) { + this.reviewer_avatar_urls = reviewer_avatar_urls; } public boolean isVerified() { diff --git a/woodroid/src/main/java/me/gilo/woodroid/models/filters/ListFilter.java b/woodroid/src/main/java/me/gilo/woodroid/models/filters/ListFilter.java index 9d184fb..95c79ca 100644 --- a/woodroid/src/main/java/me/gilo/woodroid/models/filters/ListFilter.java +++ b/woodroid/src/main/java/me/gilo/woodroid/models/filters/ListFilter.java @@ -1,6 +1,5 @@ package me.gilo.woodroid.models.filters; -import android.util.Log; import me.gilo.woodroid.utils.Converter; import java.util.*; diff --git a/woodroid/src/main/java/me/gilo/woodroid/repo/WooRepository.java b/woodroid/src/main/java/me/gilo/woodroid/repo/WooRepository.java index b930a4d..5032f28 100644 --- a/woodroid/src/main/java/me/gilo/woodroid/repo/WooRepository.java +++ b/woodroid/src/main/java/me/gilo/woodroid/repo/WooRepository.java @@ -1,5 +1,7 @@ package me.gilo.woodroid.repo; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import me.gilo.woodroid.data.auth.AuthIntercepter; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; @@ -17,6 +19,11 @@ public class WooRepository { HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + Gson gson = new GsonBuilder() + .setDateFormat("yyyy-MM-dd'T'HH:mm:ss") + .create(); + + OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new AuthIntercepter(consumerKey, consumerSecret)) .addInterceptor(loggingInterceptor) @@ -27,7 +34,7 @@ public class WooRepository { retrofit = new Retrofit.Builder() .baseUrl(baseUrl) - .addConverterFactory(GsonConverterFactory.create()) + .addConverterFactory(GsonConverterFactory.create(gson)) .client(client) .build(); }