WIP Add to cart struggling with cookies

This commit is contained in:
gilokimu 2019-03-04 05:43:15 +03:00
parent ed0f31421f
commit 11ffd08276
11 changed files with 160 additions and 29 deletions

View File

@ -1,10 +1,11 @@
package me.gilo.wc.repo; package me.gilo.wc.repo;
import android.content.Context;
import me.gilo.wc.common.WooLiveData; import me.gilo.wc.common.WooLiveData;
import me.gilo.wc.utils.AppUtils;
import me.gilo.woodroid.Woocommerce; import me.gilo.woodroid.Woocommerce;
import me.gilo.woodroid.models.LineItem; import me.gilo.woodroid.models.LineItem;
import me.gilo.woodroid.models.Order;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Map; import java.util.Map;
@ -20,21 +21,29 @@ public class CartRepository {
} }
public WooLiveData<Map<String, LineItem>> addToCart(int productId) { public WooLiveData<Map<String, LineItem>> addToCart(Context context, int productId) {
final WooLiveData<Map<String, LineItem>> callBack = new WooLiveData(); final WooLiveData<Map<String, LineItem>> callBack = new WooLiveData();
LineItem lineItem = new LineItem(); LineItem lineItem = new LineItem();
lineItem.setProductId(productId); lineItem.setProductId(productId);
lineItem.setQuantity(1); lineItem.setQuantity(1);
woocommerce.CartRepository().addToCart(lineItem).enqueue(callBack); woocommerce.CartRepository(context).addToCart(lineItem).enqueue(callBack);
return callBack; return callBack;
} }
public WooLiveData<Map<String, LineItem>> cart() { public WooLiveData<Map<String, LineItem>> cart(Context context) {
final WooLiveData<Map<String, LineItem>> callBack = new WooLiveData(); final WooLiveData<Map<String, LineItem>> callBack = new WooLiveData();
woocommerce.CartRepository().cart().enqueue(callBack); woocommerce.CartRepository(context).cart().enqueue(callBack);
return callBack; return callBack;
} }
public void saveSession(Context context, String session, String expiry) {
AppUtils appUtils = new AppUtils(context);
appUtils.saveCartSession(session, expiry);
}
} }

View File

@ -1,20 +1,12 @@
package me.gilo.wc.ui.product package me.gilo.wc.ui.product
import android.os.Bundle import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v7.app.AppCompatActivity;
import android.text.Html import android.text.Html
import android.text.Spannable
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import android.view.View import android.view.View
import android.widget.ImageView
import android.widget.TextView
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import me.gilo.wc.R
import kotlinx.android.synthetic.main.activity_product.* import kotlinx.android.synthetic.main.activity_product.*
import kotlinx.android.synthetic.main.content_product.* import kotlinx.android.synthetic.main.content_product.*
import me.gilo.wc.R
import me.gilo.wc.common.BaseActivity import me.gilo.wc.common.BaseActivity
import me.gilo.wc.common.Status import me.gilo.wc.common.Status
import me.gilo.wc.ui.state.ProgressDialogFragment import me.gilo.wc.ui.state.ProgressDialogFragment
@ -46,7 +38,7 @@ class ProductActivity : BaseActivity() {
} }
private fun addToCart(productId: Int) { 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()) { when (response!!.status()) {
Status.LOADING -> { Status.LOADING -> {

View File

@ -6,7 +6,6 @@ import android.support.v4.view.GravityCompat
import android.support.v7.widget.GridLayoutManager import android.support.v7.widget.GridLayoutManager
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.widget.Filter
import android.widget.Toast import android.widget.Toast
import io.github.inflationx.viewpump.ViewPumpContextWrapper import io.github.inflationx.viewpump.ViewPumpContextWrapper
import kotlinx.android.synthetic.main.activity_shop.* import kotlinx.android.synthetic.main.activity_shop.*
@ -119,7 +118,7 @@ class ShopActivity : BaseActivity() {
} }
private fun cart() { 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()) { when (response!!.status()) {
Status.LOADING -> { Status.LOADING -> {
} }

View File

@ -53,6 +53,19 @@ public class AppUtils {
return prefs.getString("token", null); 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() { public String getExpiry() {
SharedPreferences prefs = context.getSharedPreferences(MY_PREFS_NAME, context.MODE_PRIVATE); SharedPreferences prefs = context.getSharedPreferences(MY_PREFS_NAME, context.MODE_PRIVATE);
return prefs.getString("expiry", null); return prefs.getString("expiry", null);

View File

@ -1,12 +1,12 @@
package me.gilo.wc.viewmodels; package me.gilo.wc.viewmodels;
import android.arch.lifecycle.ViewModel; import android.arch.lifecycle.ViewModel;
import android.content.Context;
import me.gilo.wc.common.WooLiveData; import me.gilo.wc.common.WooLiveData;
import me.gilo.wc.repo.CartRepository; import me.gilo.wc.repo.CartRepository;
import me.gilo.wc.repo.OrderRepository; import me.gilo.wc.repo.OrderRepository;
import me.gilo.wc.repo.ProductRepository; import me.gilo.wc.repo.ProductRepository;
import me.gilo.woodroid.models.LineItem; import me.gilo.woodroid.models.LineItem;
import me.gilo.woodroid.models.Order;
import me.gilo.woodroid.models.Product; import me.gilo.woodroid.models.Product;
import me.gilo.woodroid.models.filters.ProductFilter; import me.gilo.woodroid.models.filters.ProductFilter;
@ -34,12 +34,12 @@ public final class ProductViewModel extends ViewModel {
return productRepository.products(); return productRepository.products();
} }
public WooLiveData<Map<String, LineItem>> addToCart(int productId) { public WooLiveData<Map<String, LineItem>> addToCart(Context context, int productId) {
return cartRepository.addToCart(productId); return cartRepository.addToCart(context, productId);
} }
public WooLiveData<Map<String, LineItem>> cart() { public WooLiveData<Map<String, LineItem>> cart(Context context) {
return cartRepository.cart(); return cartRepository.cart(context);
} }
public WooLiveData<List<Product>> products(ProductFilter filter) { public WooLiveData<List<Product>> products(ProductFilter filter) {

View File

@ -50,4 +50,6 @@ dependencies {
implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8' implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.0.0-RC1'
} }

View File

@ -1,5 +1,6 @@
package me.gilo.woodroid; package me.gilo.woodroid;
import android.content.Context;
import me.gilo.woodroid.repo.*; import me.gilo.woodroid.repo.*;
import me.gilo.woodroid.repo.order.OrderNoteRepository; import me.gilo.woodroid.repo.order.OrderNoteRepository;
import me.gilo.woodroid.repo.order.RefundRepository; import me.gilo.woodroid.repo.order.RefundRepository;
@ -165,7 +166,8 @@ public class Woocommerce {
return reportsRepository; return reportsRepository;
} }
public CartRepository CartRepository() { public CartRepository CartRepository(Context context) {
cartRepository.turnOnCookies(context);
return cartRepository; return cartRepository;
} }
} }

View File

@ -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<T> implements Callback<T> {
@Override
public void onResponse(Call<T> call, Response<T> response) {
}
@Override
public void onFailure(Call<T> call, Throwable t) {
}
}

View File

@ -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<String> preferences = (HashSet<String>) PreferenceManager.getDefaultSharedPreferences(context).getStringSet(PREF_COOKIES, new HashSet<String>());
for (String cookie : preferences) {
builder.addHeader("Cookie", cookie);
}
return chain.proceed(builder.build());
}
}

View File

@ -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<String> cookies = (HashSet<String>) PreferenceManager.getDefaultSharedPreferences(context).getStringSet("PREF_COOKIES", new HashSet<String>());
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;
}
}

View File

@ -1,31 +1,32 @@
package me.gilo.woodroid.repo; package me.gilo.woodroid.repo;
import android.content.Context;
import me.gilo.woodroid.data.api.CartAPI; import me.gilo.woodroid.data.api.CartAPI;
import me.gilo.woodroid.data.api.CouponAPI; import me.gilo.woodroid.data.cookie.AddCookiesInterceptor;
import me.gilo.woodroid.data.auth.AuthIntercepter; import me.gilo.woodroid.data.cookie.ReceivedCookiesInterceptor;
import me.gilo.woodroid.models.Coupon;
import me.gilo.woodroid.models.LineItem; import me.gilo.woodroid.models.LineItem;
import me.gilo.woodroid.models.filters.CartFilter; import me.gilo.woodroid.models.filters.CartFilter;
import me.gilo.woodroid.models.filters.CouponFilter;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor; import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Retrofit; import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory; import retrofit2.converter.gson.GsonConverterFactory;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class CartRepository{ public class CartRepository{
private final CartAPI apiService; CartAPI apiService;
Retrofit retrofit; Retrofit retrofit;
String baseUrl;
public CartRepository(String baseUrl, String consumerKey, String consumerSecret) { public CartRepository(String baseUrl, String consumerKey, String consumerSecret) {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder() OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(loggingInterceptor) .addInterceptor(loggingInterceptor)
.readTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS)
@ -39,6 +40,30 @@ public class CartRepository{
.client(client) .client(client)
.build(); .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); apiService = retrofit.create(CartAPI.class);
} }