Skip to content

Commit 9261bb5

Browse files
committed
added support for app events
1 parent 4ab7803 commit 9261bb5

File tree

5 files changed

+270
-71
lines changed

5 files changed

+270
-71
lines changed

core/src/main/java/io/snabble/sdk/Checkout.java

Lines changed: 6 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,6 @@ public class Checkout {
3939
*
4040
* https://github.com/snabble/docs/blob/master/api_checkout.md
4141
*/
42-
private static class Cart {
43-
private String session;
44-
private String shopID;
45-
private CartCustomer customer;
46-
private CartItem[] items;
47-
}
48-
49-
private static class CartCustomer {
50-
private String loyaltyCard;
51-
}
52-
53-
private static class CartItem {
54-
private String sku;
55-
private String scannedCode;
56-
private int amount;
57-
private Integer price;
58-
private Integer weight;
59-
private Integer units;
60-
}
61-
6242
private static class Href {
6343
private String href;
6444
}
@@ -306,7 +286,7 @@ public void checkout() {
306286

307287
notifyStateChanged(State.HANDSHAKING);
308288

309-
String json = shoppingCartToCheckoutCart();
289+
String json = sdkInstance.getEvents().getPayloadCartJson();
310290
final Request request = new Request.Builder()
311291
.url(sdkInstance.absoluteUrl(checkoutUrl))
312292
.post(RequestBody.create(JSON, json))
@@ -586,11 +566,16 @@ public void clearCodes(){
586566
codes.clear();
587567
}
588568

569+
public Shop getShop() {
570+
return shop;
571+
}
572+
589573
/**
590574
* Sets the shop used for identification in the payment process.
591575
*/
592576
public void setShop(Shop shop) {
593577
this.shop = shop;
578+
sdkInstance.getEvents().updateShop(shop);
594579
}
595580

596581
/**
@@ -678,46 +663,6 @@ public State getState() {
678663
return state;
679664
}
680665

681-
private String shoppingCartToCheckoutCart() {
682-
Cart cart = new Cart();
683-
cart.session = shoppingCart.getId();
684-
cart.shopID = "unknown";
685-
686-
String loyaltyCardId = sdkInstance.getLoyaltyCardId();
687-
if (loyaltyCardId != null) {
688-
cart.customer = new CartCustomer();
689-
cart.customer.loyaltyCard = loyaltyCardId;
690-
}
691-
692-
if (shop != null) {
693-
String id = shop.getId();
694-
if (id != null) {
695-
cart.shopID = id;
696-
}
697-
}
698-
699-
cart.items = new CartItem[shoppingCart.size()];
700-
701-
for (int i = 0; i < shoppingCart.size(); i++) {
702-
Product product = shoppingCart.getProduct(i);
703-
int quantity = shoppingCart.getQuantity(i);
704-
705-
cart.items[i] = new CartItem();
706-
cart.items[i].sku = String.valueOf(product.getSku());
707-
cart.items[i].scannedCode = shoppingCart.getScannedCode(i);
708-
cart.items[i].amount = quantity;
709-
cart.items[i].units = shoppingCart.getEmbeddedAmount(i);
710-
cart.items[i].weight = shoppingCart.getEmbeddedWeight(i);
711-
cart.items[i].price = shoppingCart.getEmbeddedPrice(i);
712-
713-
if(product.getType() == Product.Type.UserWeighed){
714-
cart.items[i].amount = 1;
715-
cart.items[i].weight = quantity;
716-
}
717-
}
718-
719-
return gson.toJson(cart);
720-
}
721666

722667
public interface OnCheckoutStateChangedListener {
723668
void onStateChanged(State state);
Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,249 @@
1+
package io.snabble.sdk;
2+
3+
import android.annotation.SuppressLint;
4+
import android.os.Handler;
5+
import android.os.Looper;
6+
import android.os.SystemClock;
7+
8+
import com.google.gson.Gson;
9+
import com.google.gson.GsonBuilder;
10+
import com.google.gson.JsonElement;
11+
import com.google.gson.annotations.SerializedName;
12+
13+
import java.io.IOException;
14+
import java.text.SimpleDateFormat;
15+
import java.util.Date;
16+
import java.util.TimeZone;
17+
18+
import io.snabble.sdk.utils.Logger;
19+
import okhttp3.Call;
20+
import okhttp3.Callback;
21+
import okhttp3.MediaType;
22+
import okhttp3.OkHttpClient;
23+
import okhttp3.Request;
24+
import okhttp3.RequestBody;
25+
import okhttp3.Response;
26+
27+
class Events {
28+
private SnabbleSdk sdkInstance;
29+
private Gson gson;
30+
31+
private String cartId;
32+
private String shopId;
33+
34+
private Handler handler = new Handler(Looper.getMainLooper());
35+
private SimpleDateFormat simpleDateFormat;
36+
37+
@SuppressLint("SimpleDateFormat")
38+
public Events(SnabbleSdk sdkInstance) {
39+
this.sdkInstance = sdkInstance;
40+
this.gson = new GsonBuilder().create();
41+
42+
simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
43+
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
44+
45+
sdkInstance.getShoppingCart().addListener(new ShoppingCart.SimpleShoppingCartListener() {
46+
@Override
47+
public void onChanged(ShoppingCart list) {
48+
if(!list.getId().equals(cartId)){
49+
PayloadSessionEnd payloadSessionEnd = new PayloadSessionEnd();
50+
payloadSessionEnd.session = cartId;
51+
post(payloadSessionEnd);
52+
}
53+
54+
post(getPayloadCart());
55+
}
56+
});
57+
}
58+
59+
public void updateShop(Shop shop) {
60+
if(shop != null){
61+
cartId = sdkInstance.getShoppingCart().getId();
62+
shopId = shop.getId();
63+
64+
PayloadSessionStart payloadSessionStart = new PayloadSessionStart();
65+
payloadSessionStart.session = cartId;
66+
post(payloadSessionStart);
67+
post(getPayloadCart());
68+
} else {
69+
PayloadSessionEnd payloadSessionEnd = new PayloadSessionEnd();
70+
payloadSessionEnd.session = cartId;
71+
post(payloadSessionEnd);
72+
73+
shopId = null;
74+
}
75+
}
76+
77+
private <T extends Payload> void post(final T payload) {
78+
String url = sdkInstance.getEventsUrl();
79+
if(url == null){
80+
Logger.e("Could not post event: no events url");
81+
return;
82+
}
83+
84+
Event event = new Event();
85+
event.type = payload.getEventType();
86+
event.appId = sdkInstance.getClientId();
87+
event.project = sdkInstance.getProjectId();
88+
event.shopId = shopId;
89+
event.timestamp = simpleDateFormat.format(new Date());
90+
event.payload = gson.toJsonTree(payload);
91+
92+
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), gson.toJson(event));
93+
final Request request = new Request.Builder()
94+
.url(url)
95+
.post(requestBody)
96+
.build();
97+
98+
handler.removeCallbacksAndMessages(event.type);
99+
handler.postAtTime(new Runnable() {
100+
@Override
101+
public void run() {
102+
OkHttpClient okHttpClient = sdkInstance.getOkHttpClient();
103+
okHttpClient.newCall(request).enqueue(new Callback() {
104+
@Override
105+
public void onResponse(Call call, Response response) {
106+
if(response.isSuccessful()) {
107+
Logger.d("Successfully posted event: " + payload.getEventType());
108+
} else {
109+
Logger.e("Failed to post event: " + payload.getEventType() + ", code " + response.code());
110+
}
111+
}
112+
113+
@Override
114+
public void onFailure(Call call, IOException e) {
115+
Logger.e("Could not post event: " + e.toString());
116+
}
117+
});
118+
119+
}
120+
}, event.type, SystemClock.uptimeMillis() + 2000);
121+
}
122+
123+
private PayloadCart getPayloadCart() {
124+
ShoppingCart shoppingCart = sdkInstance.getShoppingCart();
125+
126+
PayloadCart payloadCart = new PayloadCart();
127+
payloadCart.session = shoppingCart.getId();
128+
payloadCart.shopId = "unknown";
129+
130+
String loyaltyCardId = sdkInstance.getLoyaltyCardId();
131+
if (loyaltyCardId != null) {
132+
payloadCart.customer = new PayloadCartCustomer();
133+
payloadCart.customer.loyaltyCard = loyaltyCardId;
134+
}
135+
136+
Shop shop = sdkInstance.getCheckout().getShop();
137+
if (shop != null) {
138+
String id = shop.getId();
139+
if (id != null) {
140+
payloadCart.shopId = id;
141+
}
142+
}
143+
144+
payloadCart.items = new PayloadCartItem[shoppingCart.size()];
145+
146+
for (int i = 0; i < shoppingCart.size(); i++) {
147+
Product product = shoppingCart.getProduct(i);
148+
int quantity = shoppingCart.getQuantity(i);
149+
150+
payloadCart.items[i] = new PayloadCartItem();
151+
payloadCart.items[i].sku = String.valueOf(product.getSku());
152+
payloadCart.items[i].scannedCode = shoppingCart.getScannedCode(i);
153+
payloadCart.items[i].amount = quantity;
154+
payloadCart.items[i].units = shoppingCart.getEmbeddedUnits(i);
155+
payloadCart.items[i].weight = shoppingCart.getEmbeddedWeight(i);
156+
payloadCart.items[i].price = shoppingCart.getEmbeddedPrice(i);
157+
158+
if(product.getType() == Product.Type.UserWeighed){
159+
payloadCart.items[i].amount = 1;
160+
payloadCart.items[i].weight = quantity;
161+
}
162+
}
163+
164+
return payloadCart;
165+
}
166+
167+
public String getPayloadCartJson() {
168+
return gson.toJson(getPayloadCart());
169+
}
170+
171+
private enum EventType {
172+
@SerializedName("sessionStart")
173+
SESSION_START,
174+
@SerializedName("sessionEnd")
175+
SESSION_END,
176+
@SerializedName("cart")
177+
CART,
178+
@SerializedName("error")
179+
ERROR
180+
}
181+
182+
private interface Payload {
183+
EventType getEventType();
184+
}
185+
186+
private static class Event {
187+
public EventType type;
188+
public String appId;
189+
@SerializedName("shopID")
190+
public String shopId;
191+
public String project;
192+
public String timestamp;
193+
public JsonElement payload;
194+
}
195+
196+
private static class PayloadError implements Payload {
197+
public String message;
198+
public String session;
199+
200+
@Override
201+
public EventType getEventType() {
202+
return EventType.ERROR;
203+
}
204+
}
205+
206+
private static class PayloadSessionStart implements Payload {
207+
public String session;
208+
209+
@Override
210+
public EventType getEventType() {
211+
return EventType.SESSION_START;
212+
}
213+
}
214+
215+
private static class PayloadSessionEnd implements Payload {
216+
public String session;
217+
218+
@Override
219+
public EventType getEventType() {
220+
return EventType.SESSION_END;
221+
}
222+
}
223+
224+
private static class PayloadCart implements Payload {
225+
private String session;
226+
@SerializedName("shopID")
227+
private String shopId;
228+
private PayloadCartCustomer customer;
229+
private PayloadCartItem[] items;
230+
231+
@Override
232+
public EventType getEventType() {
233+
return EventType.CART;
234+
}
235+
}
236+
237+
private static class PayloadCartCustomer {
238+
private String loyaltyCard;
239+
}
240+
241+
private static class PayloadCartItem {
242+
private String sku;
243+
private String scannedCode;
244+
private int amount;
245+
private Integer price;
246+
private Integer weight;
247+
private Integer units;
248+
}
249+
}

core/src/main/java/io/snabble/sdk/ShoppingCart.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import android.os.Looper;
55
import android.os.SystemClock;
66

7+
import com.google.gson.Gson;
8+
79
import java.util.ArrayList;
810
import java.util.Collections;
911
import java.util.List;
@@ -205,7 +207,7 @@ public Integer getEmbeddedPrice(int index) {
205207
return entry.price;
206208
}
207209

208-
public Integer getEmbeddedAmount(int index) {
210+
public Integer getEmbeddedUnits(int index) {
209211
Entry entry = getEntry(index);
210212
if (entry == null) {
211213
return null;

0 commit comments

Comments
 (0)