001package ai.lilystyle.analytics_android.data; 002 003import android.util.Log; 004 005import org.json.JSONArray; 006import org.json.JSONException; 007import org.json.JSONObject; 008 009 010/** 011 * DataFactory is a helper class for creating typical data structures for tracking. 012 * 013 * Please refer to the main document to get the meaning of each field 014 * 015 * Usage example: 016 * <pre> 017 * {@code 018 * JSONObject data = DataFactory.createProductListView() 019 * .setProductCategory("Skirts") 020 * .setSortType("Low To High") 021 * .addFilterBy(DataFactory.createFilterBy() 022 * .setFilterCategory("Cut") 023 * .addFilterValues("Skinny Leg")) 024 * .setRecommendationRequestID("fsdkjk23432") 025 * .addProduct(DataFactory.createProduct() 026 * .setSkuId("45790432") 027 * .setSize("xs") 028 * .setPrice(24) 029 * .setSalePrice(20.99) 030 * .setCurrencyCode("USD") 031 * .setPosition(1) 032 * .setBadgeName("Favorites") 033 * .setFavoriteCount(10)) 034 * .addProduct(DataFactory.createProduct() 035 * .setSkuId("9848545") 036 * .setSize("xs") 037 * .setPrice(24) 038 * .setSalePrice(20.99) 039 * .setCurrencyCode("USD") 040 * .setPosition(2) 041 * .setBadgeName("New Arrival") 042 * .setFavoriteCount(10)) 043 * .set("custom_field", "MY_VALUE") 044 * .build(); 045 * 046 * lilyAi.track(data, listener); 047 * } 048 * </pre> 049 */ 050public class DataFactory { 051 private DataFactory() {} 052 053 public static BaseMessageBuilder createBaseMessage() { 054 return new BaseMessageBuilder(); 055 } 056 057 public static FilterByBuilder createFilterBy() { 058 return new FilterByBuilder(); 059 } 060 061 public static ProductBuilder createProduct() { 062 return new ProductBuilder(); 063 } 064 065 public static ProductListViewBuilder createProductListView() { 066 return new ProductListViewBuilder(); 067 } 068 069 public static ProductSearchBuilder createProductSearch() { 070 return new ProductSearchBuilder(); 071 } 072 073 public static NotifyBuilder createNotify() { 074 return new NotifyBuilder(); 075 } 076 077 public static SaveSearchClickBuilder createSaveSearchClick() { 078 return new SaveSearchClickBuilder(); 079 } 080 081 public static SavedSearchUpdateBuilder createSavedSearchUpdate() { 082 return new SavedSearchUpdateBuilder(); 083 } 084 085 public static ProductClickBuilder createProductClick() { 086 return new ProductClickBuilder(); 087 } 088 089 public static ProductViewBuilder createProductView() { 090 return new ProductViewBuilder(); 091 } 092 093 public static AddToCartBuilder createAddToCart() { 094 return new AddToCartBuilder(); 095 } 096 097 public static RemoveFromCartBuilder createRemoveFromCart() { 098 return new RemoveFromCartBuilder(); 099 } 100 101 public static CheckoutInitiateBuilder createCheckoutInitiate() { 102 return new CheckoutInitiateBuilder(); 103 } 104 105 public static OrderCompleteBuilder createOrderComplete() { 106 return new OrderCompleteBuilder(); 107 } 108 109 public static ProductAddToWishlistBuilder createProductAddToWishlist() { 110 return new ProductAddToWishlistBuilder(); 111 } 112 113 public static EmailSignUpBuilder createEmailSignUp() { 114 return new EmailSignUpBuilder(); 115 } 116 117 public static SortSelectBuilder createSortSelect() { 118 return new SortSelectBuilder(); 119 } 120 121 public static GetNotifiedClickBuilder createGetNotifiedClick() { 122 return new GetNotifiedClickBuilder(); 123 } 124 125 public static SearchDeleteBuilder createSearchDelete() { 126 return new SearchDeleteBuilder(); 127 } 128 129 public static StyleIconFollowBuilder createStyleIconFollow() { 130 return new StyleIconFollowBuilder(); 131 } 132 133 public static GetRescueBoxClickBuilder createGetRescueBoxClick() { 134 return new GetRescueBoxClickBuilder(); 135 } 136 137 public static GetSimilarProductClickBuilder createGetSimilarProductClick() { 138 return new GetSimilarProductClickBuilder(); 139 } 140 141 public static AnswerBuilder createAnswer() { 142 return new AnswerBuilder(); 143 } 144 145 public static GoodyBoxQuizStepCompletedBuilder createGoodyBoxQuizStepCompleted() { 146 return new GoodyBoxQuizStepCompletedBuilder(); 147 } 148 149 public static GetGoodyBoxClickBuilder createGetGoodyBoxClick() { 150 return new GetGoodyBoxClickBuilder(); 151 } 152 153 154 155 156 public static class GetGoodyBoxClickBuilder extends BaseMessageBuilder { 157 GetGoodyBoxClickBuilder() { 158 super(); 159 set("event", "GetGoodyBoxClick"); 160 setHitTimestamp(System.currentTimeMillis()); 161 } 162 163 public GetGoodyBoxClickBuilder setBoxID(String gbxid) { 164 return (GetGoodyBoxClickBuilder) set("gbxid", gbxid); 165 } 166 } 167 168 public static class GoodyBoxQuizStepCompletedBuilder extends BaseMessageBuilder { 169 GoodyBoxQuizStepCompletedBuilder() { 170 super(); 171 set("event", "GoodyBoxQuizStepCompleted"); 172 setHitTimestamp(System.currentTimeMillis()); 173 } 174 175 public GoodyBoxQuizStepCompletedBuilder setQuizID(int quid) { 176 return (GoodyBoxQuizStepCompletedBuilder) set("quid", quid); 177 } 178 179 public GoodyBoxQuizStepCompletedBuilder addAnswer(AnswerBuilder answer) { 180 return (GoodyBoxQuizStepCompletedBuilder) addToArray("answers", answer.build()); 181 } 182 } 183 184 public static class AnswerBuilder extends BaseMessageBuilder { 185 public AnswerBuilder setOptionID(int optid) { 186 return (AnswerBuilder) set("optid", optid); 187 } 188 189 public AnswerBuilder setOptionScale(int optstr) { 190 return (AnswerBuilder) set("optstr", optstr); 191 } 192 193 public AnswerBuilder setText(String opttxt) { 194 return (AnswerBuilder) set("opttxt", opttxt); 195 } 196 } 197 198 public static class GetSimilarProductClickBuilder extends ProductBuilder { 199 GetSimilarProductClickBuilder() { 200 super(); 201 set("event", "GetSimilarProductClick"); 202 setHitTimestamp(System.currentTimeMillis()); 203 } 204 } 205 206 public static class GetRescueBoxClickBuilder extends BaseMessageBuilder { 207 GetRescueBoxClickBuilder() { 208 super(); 209 set("event", "GetRescueBoxClick"); 210 setHitTimestamp(System.currentTimeMillis()); 211 } 212 213 public GetRescueBoxClickBuilder setBoxID(String rbxid) { 214 return (GetRescueBoxClickBuilder) set("rbxid", rbxid); 215 } 216 217 public GetRescueBoxClickBuilder setQuantity(int qty) { 218 return (GetRescueBoxClickBuilder) set("qty", qty); 219 } 220 221 public GetRescueBoxClickBuilder setPrice(double price) { 222 return (GetRescueBoxClickBuilder) set("pr", price); 223 } 224 225 public GetRescueBoxClickBuilder setCurrencyCode(String cur) { 226 return (GetRescueBoxClickBuilder) set("cur", cur); 227 } 228 229 public GetRescueBoxClickBuilder setSize(String sz) { 230 return (GetRescueBoxClickBuilder) set("sz", sz); 231 } 232 } 233 234 public static class StyleIconFollowBuilder extends BaseMessageBuilder { 235 StyleIconFollowBuilder() { 236 super(); 237 set("event", "StyleIconFollow"); 238 setHitTimestamp(System.currentTimeMillis()); 239 } 240 241 public StyleIconFollowBuilder setStyleIconID(String sicid) { 242 return (StyleIconFollowBuilder) set("sicid", sicid); 243 } 244 245 public StyleIconFollowBuilder setStyleIconName(String sicnm) { 246 return (StyleIconFollowBuilder) set("sicnm", sicnm); 247 } 248 249 public StyleIconFollowBuilder addNotify(NotifyBuilder snotify) { 250 return (StyleIconFollowBuilder) addToArray("snotify", snotify.build()); 251 } 252 } 253 254 public static class SearchDeleteBuilder extends BaseMessageBuilder { 255 SearchDeleteBuilder() { 256 super(); 257 set("event", "SearchDelete"); 258 setHitTimestamp(System.currentTimeMillis()); 259 } 260 261 public SearchDeleteBuilder setSearchId(String seid) { 262 return (SearchDeleteBuilder) set("seid", seid); 263 } 264 } 265 266 public static class GetNotifiedClickBuilder extends ProductBuilder { 267 GetNotifiedClickBuilder() { 268 super(); 269 set("event", "GetNotifiedClick"); 270 setHitTimestamp(System.currentTimeMillis()); 271 } 272 273 public GetNotifiedClickBuilder setProductListingName(String linm) { 274 return (GetNotifiedClickBuilder) set("linm", linm); 275 } 276 277 public GetNotifiedClickBuilder setRecommendationRequestID(String rtkn) { 278 return (GetNotifiedClickBuilder) set("rtkn", rtkn); 279 } 280 } 281 282 public static class SortSelectBuilder extends BaseMessageBuilder { 283 SortSelectBuilder() { 284 super(); 285 set("event", "SortSelect"); 286 setHitTimestamp(System.currentTimeMillis()); 287 } 288 289 public SortSelectBuilder setProductCategory(String pcat) { 290 return (SortSelectBuilder) set("pcat", pcat); 291 } 292 293 public SortSelectBuilder setSortType(String sort) { 294 return (SortSelectBuilder) set("sort", sort); 295 } 296 } 297 298 public static class EmailSignUpBuilder extends BaseMessageBuilder { 299 EmailSignUpBuilder() { 300 super(); 301 set("event", "EmailSignUp"); 302 setHitTimestamp(System.currentTimeMillis()); 303 } 304 305 public EmailSignUpBuilder setHashedUserEmail(String uem) { 306 return (EmailSignUpBuilder) set("uem", uem); 307 } 308 309 public EmailSignUpBuilder setUserID(String uid) { 310 return (EmailSignUpBuilder) set("uid", uid); 311 } 312 } 313 314 public static class ProductAddToWishlistBuilder extends ProductBuilder { 315 ProductAddToWishlistBuilder() { 316 super(); 317 set("event", "ProductAddToWishlist"); 318 setHitTimestamp(System.currentTimeMillis()); 319 } 320 321 public ProductAddToWishlistBuilder setWishlistName(String wlist) { 322 return (ProductAddToWishlistBuilder) set("wlist", wlist); 323 } 324 325 public ProductAddToWishlistBuilder setProductListingName(String linm) { 326 return (ProductAddToWishlistBuilder) set("linm", linm); 327 } 328 329 public ProductAddToWishlistBuilder setRecommendationRequestID(String rtkn) { 330 return (ProductAddToWishlistBuilder) set("rtkn", rtkn); 331 } 332 } 333 334 public static class OrderCompleteBuilder extends BaseMessageBuilder { 335 OrderCompleteBuilder() { 336 super(); 337 set("event", "OrderComplete"); 338 setHitTimestamp(System.currentTimeMillis()); 339 } 340 341 public OrderCompleteBuilder setTransactionID(String tnid) { 342 return (OrderCompleteBuilder) set("tnid", tnid); 343 } 344 345 public OrderCompleteBuilder setTotalPrice(double total) { 346 return (OrderCompleteBuilder) set("total", total); 347 } 348 349 public OrderCompleteBuilder setTotalDiscount(double dct) { 350 return (OrderCompleteBuilder) set("dct", dct); 351 } 352 353 public OrderCompleteBuilder setCheckoutMode(String ckmode) { 354 return (OrderCompleteBuilder) set("ckmode", ckmode); 355 } 356 357 public OrderCompleteBuilder setRecommendationRequestID(String rtkn) { 358 return (OrderCompleteBuilder) set("rtkn", rtkn); 359 } 360 361 public OrderCompleteBuilder addProduct(ProductBuilder product) { 362 return (OrderCompleteBuilder) addToArray("products", product.build()); 363 } 364 } 365 366 public static class CheckoutInitiateBuilder extends BaseMessageBuilder { 367 CheckoutInitiateBuilder() { 368 super(); 369 set("event", "CheckoutInitiate"); 370 setHitTimestamp(System.currentTimeMillis()); 371 } 372 373 public CheckoutInitiateBuilder setTransactionID(String tnid) { 374 return (CheckoutInitiateBuilder) set("tnid", tnid); 375 } 376 377 public CheckoutInitiateBuilder setTotalPrice(double total) { 378 return (CheckoutInitiateBuilder) set("total", total); 379 } 380 381 public CheckoutInitiateBuilder setTotalDiscount(double dct) { 382 return (CheckoutInitiateBuilder) set("dct", dct); 383 } 384 385 public CheckoutInitiateBuilder setPromo(String promo) { 386 return (CheckoutInitiateBuilder) set("promo", promo); 387 } 388 389 public CheckoutInitiateBuilder setRecommendationRequestID(String rtkn) { 390 return (CheckoutInitiateBuilder) set("rtkn", rtkn); 391 } 392 393 public CheckoutInitiateBuilder setProductListingName(String linm) { 394 return (CheckoutInitiateBuilder) set("linm", linm); 395 } 396 397 public CheckoutInitiateBuilder addProduct(ProductBuilder product) { 398 return (CheckoutInitiateBuilder) addToArray("products", product.build()); 399 } 400 } 401 402 public static class RemoveFromCartBuilder extends ProductBuilder { 403 RemoveFromCartBuilder() { 404 super(); 405 set("event", "RemoveFromCart"); 406 setHitTimestamp(System.currentTimeMillis()); 407 } 408 } 409 410 public static class AddToCartBuilder extends ProductBuilder { 411 AddToCartBuilder() { 412 super(); 413 set("event", "AddToCart"); 414 setHitTimestamp(System.currentTimeMillis()); 415 } 416 417 public AddToCartBuilder setProductListingName(String linm) { 418 return (AddToCartBuilder) set("linm", linm); 419 } 420 421 public AddToCartBuilder setRecommendationRequestID(String rtkn) { 422 return (AddToCartBuilder) set("rtkn", rtkn); 423 } 424 } 425 426 public static class ProductViewBuilder extends ProductBuilder { 427 ProductViewBuilder() { 428 super(); 429 set("event", "ProductView"); 430 setHitTimestamp(System.currentTimeMillis()); 431 } 432 433 public ProductViewBuilder setProductListingName(String linm) { 434 return (ProductViewBuilder) set("linm", linm); 435 } 436 437 public ProductViewBuilder setRecommendationRequestID(String rtkn) { 438 return (ProductViewBuilder) set("rtkn", rtkn); 439 } 440 } 441 442 public static class ProductClickBuilder extends ProductBuilder { 443 ProductClickBuilder() { 444 super(); 445 set("event", "ProductClick"); 446 setHitTimestamp(System.currentTimeMillis()); 447 } 448 449 public ProductClickBuilder setProductListingName(String linm) { 450 return (ProductClickBuilder) set("linm", linm); 451 } 452 453 public ProductClickBuilder setRecommendationRequestID(String rtkn) { 454 return (ProductClickBuilder) set("rtkn", rtkn); 455 } 456 } 457 458 public static class SavedSearchUpdateBuilder extends BaseMessageBuilder { 459 SavedSearchUpdateBuilder() { 460 super(); 461 set("event", "SavedSearchUpdate"); 462 setHitTimestamp(System.currentTimeMillis()); 463 } 464 465 public SavedSearchUpdateBuilder setSearchName(String ss) { 466 return (SavedSearchUpdateBuilder) set("ss", ss); 467 } 468 469 public SavedSearchUpdateBuilder addFilterBy(FilterByBuilder filtersby) { 470 return (SavedSearchUpdateBuilder) addToArray("filtersby", filtersby.build()); 471 } 472 473 public SavedSearchUpdateBuilder addNotify(NotifyBuilder snotify) { 474 return (SavedSearchUpdateBuilder) addToArray("snotify", snotify.build()); 475 } 476 } 477 478 public static class SaveSearchClickBuilder extends BaseMessageBuilder { 479 SaveSearchClickBuilder() { 480 super(); 481 set("event", "SaveSearchClick"); 482 setHitTimestamp(System.currentTimeMillis()); 483 } 484 485 public SaveSearchClickBuilder setSearchName(String ssnm) { 486 return (SaveSearchClickBuilder) set("ssnm", ssnm); 487 } 488 489 public SaveSearchClickBuilder addFilterBy(FilterByBuilder filtersby) { 490 return (SaveSearchClickBuilder) addToArray("filtersby", filtersby.build()); 491 } 492 493 public SaveSearchClickBuilder addNotify(NotifyBuilder snotify) { 494 return (SaveSearchClickBuilder) addToArray("snotify", snotify.build()); 495 } 496 } 497 498 public static class NotifyBuilder extends BaseMessageBuilder { 499 public NotifyBuilder setType(String snftype) { 500 return (NotifyBuilder) set("snftype", snftype); 501 } 502 503 public NotifyBuilder setOption(boolean snfval) { 504 return (NotifyBuilder) set("snfval", snfval ? "yes" : "no"); 505 } 506 } 507 508 public static class ProductSearchBuilder extends BaseMessageBuilder { 509 ProductSearchBuilder() { 510 super(); 511 set("event", "ProductsSearch"); 512 setHitTimestamp(System.currentTimeMillis()); 513 } 514 515 public ProductSearchBuilder setQuery(String qry) { 516 return (ProductSearchBuilder) set("qry", qry); 517 } 518 519 public ProductSearchBuilder addFilterBy(FilterByBuilder filtersby) { 520 return (ProductSearchBuilder) addToArray("filtersby", filtersby.build()); 521 } 522 } 523 524 public static class ProductListViewBuilder extends BaseMessageBuilder { 525 ProductListViewBuilder() { 526 super(); 527 set("event", "ProductListView"); 528 setHitTimestamp(System.currentTimeMillis()); 529 } 530 531 public ProductListViewBuilder setProductCategory(String pcat) { 532 return (ProductListViewBuilder) set("pcat", pcat); 533 } 534 535 public ProductListViewBuilder addFilterBy(FilterByBuilder filtersby) { 536 return (ProductListViewBuilder) addToArray("filtersby", filtersby.build()); 537 } 538 539 public ProductListViewBuilder addProduct(ProductBuilder product) { 540 return (ProductListViewBuilder) addToArray("products", product.build()); 541 } 542 543 public ProductListViewBuilder setSortType(String sort) { 544 return (ProductListViewBuilder) set("sort", sort); 545 } 546 547 public ProductListViewBuilder setProductListingName(String linm) { 548 return (ProductListViewBuilder) set("linm", linm); 549 } 550 551 public ProductListViewBuilder setRecommendationRequestID(String rtkn) { 552 return (ProductListViewBuilder) set("rtkn", rtkn); 553 } 554 } 555 556 public static class ProductBuilder extends BaseMessageBuilder { 557 public ProductBuilder setSkuId(String skid) { 558 return (ProductBuilder) set("skid", skid); 559 } 560 561 public ProductBuilder setVariantId(String varid) { 562 return (ProductBuilder) set("varid", varid); 563 } 564 565 public ProductBuilder setSize(String sz) { 566 return (ProductBuilder) set("sz", sz); 567 } 568 569 public ProductBuilder setPrice(double pr) { 570 return (ProductBuilder) set("pr", pr); 571 } 572 573 public ProductBuilder setSalePrice(double spr) { 574 return (ProductBuilder) set("spr", spr); 575 } 576 577 public ProductBuilder setCurrencyCode(String cur) { 578 return (ProductBuilder) set("cur", cur); 579 } 580 581 public ProductBuilder setPromo(String promo) { 582 return (ProductBuilder) set("promo", promo); 583 } 584 585 public ProductBuilder setAvailabilityStatus(String pavs) { 586 return (ProductBuilder) set("pavs", pavs); 587 } 588 589 public ProductBuilder setBadgeName(String bdg) { 590 return (ProductBuilder) set("bdg", bdg); 591 } 592 593 public ProductBuilder setFavoriteCount(int fvct) { 594 return (ProductBuilder) set("fvct", fvct); 595 } 596 597 public ProductBuilder setPosition(int pos) { 598 return (ProductBuilder) set("pos", pos); 599 } 600 601 public ProductBuilder setRemainingTime(String rtime) { 602 return (ProductBuilder) set("rtime", rtime); 603 } 604 605 public ProductBuilder setQuantity(int qty) { 606 return (ProductBuilder) set("qty", qty); 607 } 608 } 609 610 public static class FilterByBuilder extends BaseMessageBuilder { 611 public FilterByBuilder setFilterCategory(String fcat) { 612 return (FilterByBuilder) set("fcat", fcat); 613 } 614 615 public FilterByBuilder addFilterValues(String... fval) { 616 if (fval != null) { 617 for (String v : fval) { 618 addToArray("fval", v); 619 } 620 } 621 return this; 622 } 623 } 624 625 public static class BaseMessageBuilder { 626 private static final String LOG_TAG = "Lily_AI.datafactory"; 627 private JSONObject data = new JSONObject(); 628 629 BaseMessageBuilder() {} 630 631 public JSONObject build() { 632 return data; 633 } 634 635 public BaseMessageBuilder set(String key, String value) { 636 try { 637 data.put(key, value); 638 } catch (JSONException e) { 639 Log.e(LOG_TAG, e.getMessage(), e); 640 } 641 return this; 642 } 643 644 public BaseMessageBuilder set(String key, double value) { 645 try { 646 data.put(key, value); 647 } catch (JSONException e) { 648 Log.e(LOG_TAG, e.getMessage(), e); 649 } 650 return this; 651 } 652 653 public BaseMessageBuilder set(String key, long value) { 654 try { 655 data.put(key, value); 656 } catch (JSONException e) { 657 Log.e(LOG_TAG, e.getMessage(), e); 658 } 659 return this; 660 } 661 662 public BaseMessageBuilder set(String key, int value) { 663 try { 664 data.put(key, value); 665 } catch (JSONException e) { 666 Log.e(LOG_TAG, e.getMessage(), e); 667 } 668 return this; 669 } 670 671 public BaseMessageBuilder set(String key, boolean value) { 672 try { 673 data.put(key, value); 674 } catch (JSONException e) { 675 Log.e(LOG_TAG, e.getMessage(), e); 676 } 677 return this; 678 } 679 680 public BaseMessageBuilder set(String key, JSONObject value) { 681 try { 682 data.put(key, value); 683 } catch (JSONException e) { 684 Log.e(LOG_TAG, e.getMessage(), e); 685 } 686 return this; 687 } 688 689 public BaseMessageBuilder set(String key, JSONArray value) { 690 try { 691 data.put(key, value); 692 } catch (JSONException e) { 693 Log.e(LOG_TAG, e.getMessage(), e); 694 } 695 return this; 696 } 697 698 public BaseMessageBuilder set(String key, Object value) { 699 try { 700 data.put(key, value); 701 } catch (JSONException e) { 702 Log.e(LOG_TAG, e.getMessage(), e); 703 } 704 return this; 705 } 706 707 public BaseMessageBuilder addToArray(String key, Object value) { 708 try { 709 JSONArray arr; 710 if (data.has(key)) { 711 arr = data.getJSONArray(key); 712 } else { 713 arr = new JSONArray(); 714 data.put(key, arr); 715 } 716 arr.put(value); 717 } catch (JSONException e) { 718 Log.e(LOG_TAG, e.getMessage(), e); 719 } 720 return this; 721 } 722 723 public BaseMessageBuilder setHitTimestamp(long hts) { 724 return set("hts", hts); 725 } 726 } 727}