From 11ffd0827600445f05c54d762af713b9a3111006 Mon Sep 17 00:00:00 2001 From: gilokimu Date: Mon, 4 Mar 2019 05:43:15 +0300 Subject: [PATCH] WIP Add to cart struggling with cookies --- .../java/me/gilo/wc/repo/CartRepository.java | 19 +++++++--- .../me/gilo/wc/ui/product/ProductActivity.kt | 12 +----- .../me/gilo/wc/ui/product/ShopActivity.kt | 3 +- .../main/java/me/gilo/wc/utils/AppUtils.java | 13 +++++++ .../gilo/wc/viewmodels/ProductViewModel.java | 10 ++--- woodroid/build.gradle | 2 + .../java/me/gilo/woodroid/Woocommerce.java | 4 +- .../gilo/woodroid/callback/WooCallback.java | 18 +++++++++ .../data/cookie/AddCookiesInterceptor.java | 34 +++++++++++++++++ .../cookie/ReceivedCookiesInterceptor.java | 37 +++++++++++++++++++ .../me/gilo/woodroid/repo/CartRepository.java | 37 ++++++++++++++++--- 11 files changed, 160 insertions(+), 29 deletions(-) create mode 100644 woodroid/src/main/java/me/gilo/woodroid/callback/WooCallback.java create mode 100644 woodroid/src/main/java/me/gilo/woodroid/data/cookie/AddCookiesInterceptor.java create mode 100644 woodroid/src/main/java/me/gilo/woodroid/data/cookie/ReceivedCookiesInterceptor.java 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 59836c0..af66fbe 100644 --- a/app/src/main/java/me/gilo/wc/repo/CartRepository.java +++ b/app/src/main/java/me/gilo/wc/repo/CartRepository.java @@ -1,10 +1,11 @@ package me.gilo.wc.repo; +import android.content.Context; import me.gilo.wc.common.WooLiveData; +import me.gilo.wc.utils.AppUtils; import me.gilo.woodroid.Woocommerce; import me.gilo.woodroid.models.LineItem; -import me.gilo.woodroid.models.Order; import javax.inject.Inject; import java.util.Map; @@ -20,21 +21,29 @@ public class CartRepository { } - public WooLiveData> addToCart(int productId) { + public WooLiveData> addToCart(Context context, int productId) { final WooLiveData> callBack = new WooLiveData(); LineItem lineItem = new LineItem(); lineItem.setProductId(productId); lineItem.setQuantity(1); - woocommerce.CartRepository().addToCart(lineItem).enqueue(callBack); + woocommerce.CartRepository(context).addToCart(lineItem).enqueue(callBack); return callBack; } - public WooLiveData> cart() { + public WooLiveData> cart(Context context) { final WooLiveData> callBack = new WooLiveData(); - woocommerce.CartRepository().cart().enqueue(callBack); + woocommerce.CartRepository(context).cart().enqueue(callBack); + 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 d039760..f44d512 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,20 +1,12 @@ package me.gilo.wc.ui.product import android.os.Bundle -import android.support.design.widget.Snackbar -import android.support.v7.app.AppCompatActivity; import android.text.Html -import android.text.Spannable -import android.text.SpannableString -import android.text.style.ForegroundColorSpan import android.view.View -import android.widget.ImageView -import android.widget.TextView import com.squareup.picasso.Picasso -import me.gilo.wc.R - import kotlinx.android.synthetic.main.activity_product.* import kotlinx.android.synthetic.main.content_product.* +import me.gilo.wc.R import me.gilo.wc.common.BaseActivity import me.gilo.wc.common.Status import me.gilo.wc.ui.state.ProgressDialogFragment @@ -46,7 +38,7 @@ class ProductActivity : BaseActivity() { } private fun addToCart(productId: Int) { - viewModel.addToCart(productId).observe(this, android.arch.lifecycle.Observer { response -> + viewModel.addToCart(baseContext, productId).observe(this, android.arch.lifecycle.Observer { response -> when (response!!.status()) { Status.LOADING -> { diff --git a/app/src/main/java/me/gilo/wc/ui/product/ShopActivity.kt b/app/src/main/java/me/gilo/wc/ui/product/ShopActivity.kt index 0ac95e2..c574d0e 100644 --- a/app/src/main/java/me/gilo/wc/ui/product/ShopActivity.kt +++ b/app/src/main/java/me/gilo/wc/ui/product/ShopActivity.kt @@ -6,7 +6,6 @@ import android.support.v4.view.GravityCompat import android.support.v7.widget.GridLayoutManager import android.view.Menu import android.view.MenuItem -import android.widget.Filter import android.widget.Toast import io.github.inflationx.viewpump.ViewPumpContextWrapper import kotlinx.android.synthetic.main.activity_shop.* @@ -119,7 +118,7 @@ class ShopActivity : BaseActivity() { } private fun cart() { - viewModel.cart().observe(this, android.arch.lifecycle.Observer { response -> + viewModel.cart(baseContext).observe(this, android.arch.lifecycle.Observer { response -> when (response!!.status()) { Status.LOADING -> { } diff --git a/app/src/main/java/me/gilo/wc/utils/AppUtils.java b/app/src/main/java/me/gilo/wc/utils/AppUtils.java index 899c16a..f2413f0 100644 --- a/app/src/main/java/me/gilo/wc/utils/AppUtils.java +++ b/app/src/main/java/me/gilo/wc/utils/AppUtils.java @@ -53,6 +53,19 @@ public class AppUtils { return prefs.getString("token", null); } + public void saveCartSession(String sessionId, String expiry){ + SharedPreferences.Editor editor = context.getSharedPreferences(MY_PREFS_NAME, context.MODE_PRIVATE).edit(); + editor.putString("cartSession", sessionId); + editor.putString("expiry", expiry); + editor.putBoolean("hasSession", true); + editor.apply(); + } + + public String getCartSession() { + SharedPreferences prefs = context.getSharedPreferences(MY_PREFS_NAME, context.MODE_PRIVATE); + return prefs.getString("cartSession", null); + } + public String getExpiry() { SharedPreferences prefs = context.getSharedPreferences(MY_PREFS_NAME, context.MODE_PRIVATE); return prefs.getString("expiry", null); 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 70dff02..f3cfc4c 100644 --- a/app/src/main/java/me/gilo/wc/viewmodels/ProductViewModel.java +++ b/app/src/main/java/me/gilo/wc/viewmodels/ProductViewModel.java @@ -1,12 +1,12 @@ package me.gilo.wc.viewmodels; import android.arch.lifecycle.ViewModel; +import android.content.Context; import me.gilo.wc.common.WooLiveData; 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.Order; import me.gilo.woodroid.models.Product; import me.gilo.woodroid.models.filters.ProductFilter; @@ -34,12 +34,12 @@ public final class ProductViewModel extends ViewModel { return productRepository.products(); } - public WooLiveData> addToCart(int productId) { - return cartRepository.addToCart(productId); + public WooLiveData> addToCart(Context context, int productId) { + return cartRepository.addToCart(context, productId); } - public WooLiveData> cart() { - return cartRepository.cart(); + public WooLiveData> cart(Context context) { + return cartRepository.cart(context); } public WooLiveData> products(ProductFilter filter) { diff --git a/woodroid/build.gradle b/woodroid/build.gradle index 9fedc8a..b758ef7 100644 --- a/woodroid/build.gradle +++ b/woodroid/build.gradle @@ -50,4 +50,6 @@ dependencies { implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8' + implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.0.0-RC1' + } diff --git a/woodroid/src/main/java/me/gilo/woodroid/Woocommerce.java b/woodroid/src/main/java/me/gilo/woodroid/Woocommerce.java index de2dbd2..44e13a4 100644 --- a/woodroid/src/main/java/me/gilo/woodroid/Woocommerce.java +++ b/woodroid/src/main/java/me/gilo/woodroid/Woocommerce.java @@ -1,5 +1,6 @@ package me.gilo.woodroid; +import android.content.Context; import me.gilo.woodroid.repo.*; import me.gilo.woodroid.repo.order.OrderNoteRepository; import me.gilo.woodroid.repo.order.RefundRepository; @@ -165,7 +166,8 @@ public class Woocommerce { return reportsRepository; } - public CartRepository CartRepository() { + public CartRepository CartRepository(Context context) { + cartRepository.turnOnCookies(context); return cartRepository; } } diff --git a/woodroid/src/main/java/me/gilo/woodroid/callback/WooCallback.java b/woodroid/src/main/java/me/gilo/woodroid/callback/WooCallback.java new file mode 100644 index 0000000..dad289d --- /dev/null +++ b/woodroid/src/main/java/me/gilo/woodroid/callback/WooCallback.java @@ -0,0 +1,18 @@ +package me.gilo.woodroid.callback; + +import android.arch.lifecycle.LiveData; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class WooCallback implements Callback { + @Override + public void onResponse(Call call, Response response) { + + } + + @Override + public void onFailure(Call call, Throwable t) { + + } +} 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 new file mode 100644 index 0000000..7d60dbf --- /dev/null +++ b/woodroid/src/main/java/me/gilo/woodroid/data/cookie/AddCookiesInterceptor.java @@ -0,0 +1,34 @@ +package me.gilo.woodroid.data.cookie; + +import android.content.Context; +import android.preference.PreferenceManager; +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; +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) { + this.context = context; + } + + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Request.Builder builder = chain.request().newBuilder(); + + HashSet preferences = (HashSet) PreferenceManager.getDefaultSharedPreferences(context).getStringSet(PREF_COOKIES, new HashSet()); + for (String cookie : preferences) { + builder.addHeader("Cookie", cookie); + } + + return chain.proceed(builder.build()); + } +} \ No newline at end of file diff --git a/woodroid/src/main/java/me/gilo/woodroid/data/cookie/ReceivedCookiesInterceptor.java b/woodroid/src/main/java/me/gilo/woodroid/data/cookie/ReceivedCookiesInterceptor.java new file mode 100644 index 0000000..8b51f7f --- /dev/null +++ b/woodroid/src/main/java/me/gilo/woodroid/data/cookie/ReceivedCookiesInterceptor.java @@ -0,0 +1,37 @@ +package me.gilo.woodroid.data.cookie; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import okhttp3.Interceptor; +import okhttp3.Response; + +import java.io.IOException; +import java.util.HashSet; + +public class ReceivedCookiesInterceptor implements Interceptor { + + private Context context; + public ReceivedCookiesInterceptor(Context context) { + this.context = context; + } + + @Override + public Response intercept(Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + + if (!originalResponse.headers("Set-Cookie").isEmpty()) { + HashSet cookies = (HashSet) PreferenceManager.getDefaultSharedPreferences(context).getStringSet("PREF_COOKIES", new HashSet()); + + for (String header : originalResponse.headers("Set-Cookie")) { + cookies.add(header); + } + + SharedPreferences.Editor memes = PreferenceManager.getDefaultSharedPreferences(context).edit(); + memes.putStringSet("PREF_COOKIES", cookies).apply(); + memes.commit(); + } + + return originalResponse; + } +} \ No newline at end of file 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 6fcfd79..008fb16 100644 --- a/woodroid/src/main/java/me/gilo/woodroid/repo/CartRepository.java +++ b/woodroid/src/main/java/me/gilo/woodroid/repo/CartRepository.java @@ -1,31 +1,32 @@ package me.gilo.woodroid.repo; +import android.content.Context; import me.gilo.woodroid.data.api.CartAPI; -import me.gilo.woodroid.data.api.CouponAPI; -import me.gilo.woodroid.data.auth.AuthIntercepter; -import me.gilo.woodroid.models.Coupon; +import me.gilo.woodroid.data.cookie.AddCookiesInterceptor; +import me.gilo.woodroid.data.cookie.ReceivedCookiesInterceptor; import me.gilo.woodroid.models.LineItem; import me.gilo.woodroid.models.filters.CartFilter; -import me.gilo.woodroid.models.filters.CouponFilter; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Call; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; -import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; public class CartRepository{ - private final CartAPI apiService; + CartAPI apiService; Retrofit retrofit; + String baseUrl; + public CartRepository(String baseUrl, String consumerKey, String consumerSecret) { HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .readTimeout(30, TimeUnit.SECONDS) @@ -39,9 +40,33 @@ public class CartRepository{ .client(client) .build(); + this.baseUrl = baseUrl; + apiService = retrofit.create(CartAPI.class); } + public void turnOnCookies(Context context){ + HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); + loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + + OkHttpClient client = new OkHttpClient.Builder() + .addInterceptor(new AddCookiesInterceptor(context)) + .addInterceptor(new ReceivedCookiesInterceptor(context)) + .addInterceptor(loggingInterceptor) + .readTimeout(30, TimeUnit.SECONDS) + .writeTimeout(30, TimeUnit.SECONDS) + .connectTimeout(15, TimeUnit.SECONDS) + .build(); + + retrofit = new Retrofit.Builder() + .baseUrl(baseUrl) + .addConverterFactory(GsonConverterFactory.create()) + .client(client) + .build(); + + apiService = retrofit.create(CartAPI.class); + } + public Call clear() { return apiService.clear(); }