diff --git a/README.md b/README.md index 5d04ef6f..d6802041 100755 --- a/README.md +++ b/README.md @@ -26,13 +26,14 @@ Before you can start the initialization of Affirm SDK, you must first set the Af ```java Affirm.initialize(new Affirm.Configuration.Builder("public key") .setEnvironment(Affirm.Environment.SANDBOX) + .setCountryCode(Locale.US.getISO3Country()) // Default USA + .setLocale(Locale.US.toString()) // Default en_US .setName("merchant name") .setReceiveReasonCodes("true") .setLogLevel(Affirm.LOG_LEVEL_DEBUG) .setCheckoutRequestCode(8001) .setVcnCheckoutRequestCode(8002) .setPrequalRequestCode(8003) - .setLocation(Affirm.Location.US) // "CA" for Canadian, "US" for American (If not set, default use US) .build()) ``` - `environment` can be set to `Affirm.Environment.SANDBOX` for test. diff --git a/affirm/src/main/java/com/affirm/android/Affirm.java b/affirm/src/main/java/com/affirm/android/Affirm.java index da3346a2..bc4ec34d 100755 --- a/affirm/src/main/java/com/affirm/android/Affirm.java +++ b/affirm/src/main/java/com/affirm/android/Affirm.java @@ -34,7 +34,10 @@ import static com.affirm.android.AffirmColor.AFFIRM_COLOR_TYPE_BLUE; import static com.affirm.android.AffirmConstants.CHECKOUT_ERROR; import static com.affirm.android.AffirmConstants.CHECKOUT_TOKEN; +import static com.affirm.android.AffirmConstants.COUNTY_CODE_CAN; +import static com.affirm.android.AffirmConstants.COUNTY_CODE_USA; import static com.affirm.android.AffirmConstants.CREDIT_DETAILS; +import static com.affirm.android.AffirmConstants.LOCALE_USA; import static com.affirm.android.AffirmConstants.VCN_REASON; import static com.affirm.android.AffirmLogoType.AFFIRM_DISPLAY_TYPE_LOGO; import static com.affirm.android.AffirmTracker.TrackingEvent.CHECKOUT_WEBVIEW_CLICK; @@ -118,51 +121,66 @@ public interface VcnCheckoutCallbacks { void onAffirmVcnCheckoutSuccess(@NonNull CardDetails cardDetails); } - public enum Location { - US, CA - } - public enum Environment { SANDBOX, PRODUCTION; - String baseUrl() { + String checkoutUrl() { switch (this) { case SANDBOX: - return AffirmConstants.getSandboxUrl(); + return AffirmConstants.SANDBOX_CHECKOUT_URL; default: - return AffirmConstants.getProductionUrl(); + return AffirmConstants.PRODUCTION_CHECKOUT_URL; } } - String baseJsUrl() { + String jsUrl() { switch (this) { case SANDBOX: - return AffirmConstants.getSandboxJsUrl(); + return AffirmConstants.SANDBOX_JS_URL; default: - return AffirmConstants.getProductionJsUrl(); + return AffirmConstants.PRODUCTION_JS_URL; } } - String trackerBaseUrl() { - return AffirmConstants.getTrackerUrl(); + String trackerUrl() { + return AffirmConstants.TRACKER_URL; + } + + String promoUrl(String countryCode) { + switch (countryCode) { + case COUNTY_CODE_CAN: + switch (this) { + case SANDBOX: + return AffirmConstants.SANDBOX_PROMO_CA_URL; + default: + return AffirmConstants.PRODUCTION_PROMO_CA_URL; + } + default: + switch (this) { + case SANDBOX: + return AffirmConstants.SANDBOX_PROMO_URL; + default: + return AffirmConstants.PRODUCTION_PROMO_URL; + } + } } - String basePromoUrl() { + String promoCAUrl() { switch (this) { case SANDBOX: - return AffirmConstants.getStagingPromoUrl(); + return AffirmConstants.SANDBOX_PROMO_CA_URL; default: - return AffirmConstants.getProductionPromoUrl(); + return AffirmConstants.PRODUCTION_PROMO_CA_URL; } } - String baseInvalidCheckoutRedirectUrl() { + String invalidCheckoutRedirectUrl() { switch (this) { case SANDBOX: - return AffirmConstants.getStagingInvalidCheckoutRedirectUrl(); + return AffirmConstants.SANDBOX_INVALID_CHECKOUT_REDIRECT_URL; default: - return AffirmConstants.getProductionInvalidCheckoutRedirectUrl(); + return AffirmConstants.PRODUCTION_INVALID_CHECKOUT_REDIRECT_URL; } } } @@ -172,11 +190,15 @@ public static final class Configuration { final Environment environment; final String merchantName; final String cardTip; + final String locale; + final String countryCode; Configuration(Builder builder) { this.publicKey = builder.publicKey; this.merchantName = builder.merchantName; this.cardTip = builder.cardTip; + this.locale = builder.locale; + this.countryCode = builder.countryCode; if (builder.environment != null) { this.environment = builder.environment; @@ -190,6 +212,10 @@ public static final class Builder { private Environment environment; private String merchantName; private String cardTip; + // When a locale is not provided, the locale will default to en_US + private String locale = LOCALE_USA; + // When a country-code is not provided, the country-code will default to USA + private String countryCode = COUNTY_CODE_USA; /** * @param configuration Set the configuration to be used by Affirm. @@ -198,6 +224,9 @@ public Builder(@NonNull Configuration configuration) { this.publicKey = configuration.publicKey; this.environment = configuration.environment; this.merchantName = configuration.merchantName; + this.cardTip = configuration.cardTip; + this.locale = configuration.locale; + this.countryCode = configuration.countryCode; } /** @@ -315,8 +344,25 @@ public Builder setPrequalRequestCode(int prequalRequestCode) { return this; } - public Builder setLocation(Location location) { - AffirmConstants.setLocation(location); + /** + * Set the locale to be used by Affirm, it's optional + * + * @param locale your locale info to be used by Affirm + * @return The same builder, for easy chaining. + */ + public Builder setLocale(String locale) { + this.locale = locale; + return this; + } + + /** + * Set the country code to be used by Affirm, it's optional + * + * @param countryCode your country code to be used by Affirm + * @return The same builder, for easy chaining. + */ + public Builder setCountryCode(String countryCode) { + this.countryCode = countryCode; return this; } @@ -518,7 +564,7 @@ public static void initialize(@NonNull Configuration configuration) { * @param merchantName Set the merchant name to be used by Affirm. */ public static void setPublicKeyAndMerchantName(@NonNull String publicKey, - @Nullable String merchantName) { + @Nullable String merchantName) { if (!isInitialized()) { AffirmLog.w("Affirm has not been initialized"); return; @@ -970,13 +1016,13 @@ public static AffirmFragment startCheckout(@NonNull Fragment fragment, * @return a `AffirmFragment` */ protected static AffirmFragment startCheckout(@NonNull AppCompatActivity activity, - @IdRes int containerViewId, - @NonNull Checkout checkout, - @Nullable String caas, - @Nullable Money money, - int cardAuthWindow, - boolean newFlow, - boolean useVCN) { + @IdRes int containerViewId, + @NonNull Checkout checkout, + @Nullable String caas, + @Nullable Money money, + int cardAuthWindow, + boolean newFlow, + boolean useVCN) { if (useVCN) { return VcnCheckoutFragment.newInstance(activity, containerViewId, checkout, receiveReasonCodes, caas, money, cardAuthWindow, @@ -1002,16 +1048,16 @@ protected static AffirmFragment startCheckout(@NonNull AppCompatActivity activit * @return a `AffirmFragment` */ protected static AffirmFragment startCheckout(@NonNull Fragment fragment, - @IdRes int containerViewId, - @NonNull Checkout checkout, - @Nullable String caas, - @Nullable Money money, - int cardAuthWindow, - boolean newFlow, - boolean useVCN) { + @IdRes int containerViewId, + @NonNull Checkout checkout, + @Nullable String caas, + @Nullable Money money, + int cardAuthWindow, + boolean newFlow, + boolean useVCN) { if (useVCN) { return VcnCheckoutFragment.newInstance(fragment, - containerViewId, checkout, receiveReasonCodes, caas, money, cardAuthWindow, + containerViewId, checkout, receiveReasonCodes, caas, money, cardAuthWindow, newFlow); } else { return CheckoutFragment.newInstance(fragment, diff --git a/affirm/src/main/java/com/affirm/android/AffirmClient.java b/affirm/src/main/java/com/affirm/android/AffirmClient.java index cb4921f9..ad204948 100644 --- a/affirm/src/main/java/com/affirm/android/AffirmClient.java +++ b/affirm/src/main/java/com/affirm/android/AffirmClient.java @@ -17,6 +17,7 @@ import java.io.IOException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.Map; import okhttp3.Call; import okhttp3.Callback; @@ -46,6 +47,9 @@ public interface AffirmApiRequest { @Nullable JsonObject body(); + + @Nullable + Map headers(); } public interface AffirmListener { @@ -66,6 +70,10 @@ public static Call send(@Nullable OkHttpClient okHttpClient, AffirmHttpRequest.Builder builder = new AffirmHttpRequest.Builder() .setUrl(request.url()) .setMethod(request.method()); + Map headers = request.headers(); + if (headers != null && !headers.isEmpty()) { + builder.setHeaders(headers); + } JsonObject requestBody = request.body(); if (requestBody != null) { builder.setBody(new AffirmHttpBody(CONTENT_TYPE, requestBody.toString())); diff --git a/affirm/src/main/java/com/affirm/android/AffirmConstants.java b/affirm/src/main/java/com/affirm/android/AffirmConstants.java index 29a810a0..f8f1ba82 100755 --- a/affirm/src/main/java/com/affirm/android/AffirmConstants.java +++ b/affirm/src/main/java/com/affirm/android/AffirmConstants.java @@ -11,137 +11,50 @@ private AffirmConstants() { static final BigDecimal maxPrice = BigDecimal.valueOf(17500.00); - // Default location is US - private static Affirm.Location location = Affirm.Location.US; + static final String COUNTY_CODE_CAN = "CAN"; - static void setLocation(Affirm.Location location) { - AffirmConstants.location = location; - } + static final String COUNTY_CODE_USA = "USA"; + static final String LOCALE_USA = "en_US"; - static String getSandboxUrl() { - switch (location) { - case CA: - return CA_SANDBOX_URL; - default: - return SANDBOX_URL; - } - } + // checkout url + static final String SANDBOX_CHECKOUT_URL = "api.global-sandbox.affirm.com"; + static final String PRODUCTION_CHECKOUT_URL = "api.global.affirm.com"; - static String getSandboxJsUrl() { - switch (location) { - case CA: - return CA_SANDBOX_JS_URL; - default: - return SANDBOX_JS_URL; - } - } - - static String getTrackerUrl() { - switch (location) { - case CA: - return CA_TRACKER_URL; - default: - return TRACKER_URL; - } - } + // js url + static final String SANDBOX_JS_URL = "cdn1-sandbox.affirm.com"; + static final String PRODUCTION_JS_URL = "cdn1.affirm.com"; - static String getProductionUrl() { - switch (location) { - case CA: - return CA_PRODUCTION_URL; - default: - return PRODUCTION_URL; - } - } + // invalid checkout redirect url + static final String SANDBOX_INVALID_CHECKOUT_REDIRECT_URL = "sandbox.affirm.com/u/"; + static final String PRODUCTION_INVALID_CHECKOUT_REDIRECT_URL = "api.affirm.com/u/"; - static String getProductionJsUrl() { - switch (location) { - case CA: - return CA_PRODUCTION_JS_URL; - default: - return PRODUCTION_JS_URL; - } - } + // promo url (Default) + static final String SANDBOX_PROMO_URL = "sandbox.affirm.com"; + static final String PRODUCTION_PROMO_URL = "www.affirm.com"; - static String getStagingPromoUrl() { - switch (location) { - case CA: - return CA_SANDBOX_URL; - default: - return SANDBOX_URL; - } - } + // promo url (CA) + static final String SANDBOX_PROMO_CA_URL = "sandbox.affirm.ca"; + static final String PRODUCTION_PROMO_CA_URL = "www.affirm.ca"; - static String getProductionPromoUrl() { - switch (location) { - case CA: - return CA_PRODUCTION_PROMO_URL; - default: - return PRODUCTION_PROMO_URL; - } - } - - static String getStagingInvalidCheckoutRedirectUrl() { - switch (location) { - case CA: - return CA_SANDBOX_INVALID_CHECKOUT_REDIRECT_URL; - default: - return SANDBOX_INVALID_CHECKOUT_REDIRECT_URL; - } - } - - static String getProductionInvalidCheckoutRedirectUrl() { - switch (location) { - case CA: - return CA_PRODUCTION_INVALID_CHECKOUT_REDIRECT_URL; - default: - return PRODUCTION_INVALID_CHECKOUT_REDIRECT_URL; - } - } - - // CA URL - private static final String CA_SANDBOX_URL = "sandbox.affirm.ca"; - private static final String CA_SANDBOX_JS_URL = "cdn1-sandbox.affirm.ca"; - private static final String CA_SANDBOX_INVALID_CHECKOUT_REDIRECT_URL = "sandbox.affirm.ca/u/"; - private static final String CA_TRACKER_URL = "tracker.affirm.ca"; - private static final String CA_PRODUCTION_URL = "api.affirm.ca"; - private static final String CA_PRODUCTION_PROMO_URL = "www.affirm.ca"; - private static final String CA_PRODUCTION_JS_URL = "cdn1.affirm.ca"; - private static final String CA_PRODUCTION_INVALID_CHECKOUT_REDIRECT_URL = "api.affirm.ca/u/"; - - // US URL - private static final String SANDBOX_URL = "sandbox.affirm.com"; - private static final String SANDBOX_JS_URL = "cdn1-sandbox.affirm.com"; - private static final String SANDBOX_INVALID_CHECKOUT_REDIRECT_URL = "sandbox.affirm.com/u/"; - private static final String TRACKER_URL = "tracker.affirm.com"; - private static final String PRODUCTION_URL = "api.affirm.com"; - private static final String PRODUCTION_PROMO_URL = "www.affirm.com"; - private static final String PRODUCTION_JS_URL = "cdn1.affirm.com"; - private static final String PRODUCTION_INVALID_CHECKOUT_REDIRECT_URL = "api.affirm.com/u/"; + // tracker url + static final String TRACKER_URL = "tracker.affirm.com"; static final String CHECKOUT_PATH = "/api/v2/checkout/"; static final String TRACKER_PATH = "/collect"; - static final String PROMO_PATH = "/api/promos/v2/%s?is_sdk=true&field=ala&amount=%d" - + "&show_cta=%s"; static final String PREQUAL_PATH = "/apps/prequal"; static final String PREQUAL_PUBLIC_API_KEY = "public_api_key"; static final String PREQUAL_UNIT_PRICE = "unit_price"; static final String PREQUAL_USE_PROMO = "use_promo"; - static final String PREQUAL_IS_SDK = "isSDK"; static final String PREQUAL_REFERRING_URL = "referring_url"; static final String PREQUAL_PROMO_EXTERNAL_ID = "promo_external_id"; static final String PREQUAL_PAGE_TYPE = "page_type"; + static final String PREQUAL_LOCALE = "locale"; static final String AFFIRM_CHECKOUT_CONFIRMATION_URL = "affirm://checkout/confirmed"; static final String AFFIRM_CHECKOUT_CANCELLATION_URL = "affirm://checkout/cancelled"; static final String REFERRING_URL = "https://androidsdk/"; static final String JS_PATH = "/js/v2/affirm.js"; - static final String TAG_GET_NEW_PROMO = "GET_NEW_PROMO"; - static final String TAG_CHECKOUT = "CHECKOUT"; - static final String TAG_VCN_CHECKOUT = "VCN_CHECKOUT"; - static final String TAG_TRACKER = "TAG_TRACKER"; - static final String HTTPS_PROTOCOL = "https://"; static final String HTTP_PROTOCOL = "http://"; static final String HTTP = "http"; @@ -159,6 +72,8 @@ static String getProductionInvalidCheckoutRedirectUrl() { static final String API_KEY = "API_KEY"; static final String JAVASCRIPT = "JAVASCRIPT"; + static final String LOCALE = "LOCALE"; + static final String COUNTRY_CODE = "COUNTRY_CODE"; static final String CANCEL_URL = "CANCEL_URL"; static final String MODAL_ID = "MODAL_ID"; @@ -173,6 +88,8 @@ static String getProductionInvalidCheckoutRedirectUrl() { static final String CHECKOUT_CAAS_EXTRA = "checkout_caas_extra"; static final String CHECKOUT_MONEY = "checkout_money"; static final String CHECKOUT_CARD_AUTH_WINDOW = "checkout_card_auth_window"; + static final String CHECKOUT_META = "meta"; + static final String CHECKOUT_META_LOCALE = "locale"; static final String CREDIT_DETAILS = "credit_details"; static final String VCN_REASON = "vcn_reason"; static final String NEW_FLOW = "new_flow"; @@ -208,4 +125,22 @@ static String getProductionInvalidCheckoutRedirectUrl() { static final String TOTAL = "total"; static final String INVALID_CHECKOUT_MESSAGE = "Checkout status is in an invalid state."; + + static final String PROMO_PATH = "/api/promos/v2/%s"; + static final String PROMO_IS_SDK = "is_sdk"; + static final String PROMO_FIELD = "field"; + static final String PROMO_FIELD_VALUE = "ala"; + static final String PROMO_AMOUNT = "amount"; + static final String PROMO_SHOW_CTA = "show_cta"; + static final String PROMO_EXTERNAL_ID = "promo_external_id"; + static final String PROMO_PAGE_TYPE = "page_type"; + static final String PROMO_LOGO_COLOR = "logo_color"; + static final String PROMO_LOGO_TYPE = "logo_type"; + static final String PROMO_ITEMS = "items"; + static final String PROMO_LOCALE = "locale"; + + static final String CHECKOUT_HEADER_AFFIRM_LOCALE = "affirm-locale"; + static final String CHECKOUT_HEADER_COUNTRY_CODE = "country-code"; + + } diff --git a/affirm/src/main/java/com/affirm/android/AffirmHttpClient.java b/affirm/src/main/java/com/affirm/android/AffirmHttpClient.java index a214d250..7807dce8 100755 --- a/affirm/src/main/java/com/affirm/android/AffirmHttpClient.java +++ b/affirm/src/main/java/com/affirm/android/AffirmHttpClient.java @@ -14,8 +14,10 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.util.Map; import okhttp3.Call; +import okhttp3.Headers; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -24,7 +26,6 @@ import okhttp3.ResponseBody; import okio.BufferedSink; -import static com.affirm.android.AffirmConstants.HTTP; import static com.affirm.android.AffirmConstants.HTTPS_PROTOCOL; import static com.affirm.android.AffirmConstants.X_AFFIRM_REQUEST_ID; @@ -85,7 +86,7 @@ static AffirmException handleAPIError( } public static String getProtocol() { - return AffirmPlugins.get().baseUrl().contains(HTTP) ? "" : HTTPS_PROTOCOL; + return HTTPS_PROTOCOL; } @NonNull @@ -138,6 +139,17 @@ private Request getRequest(AffirmHttpRequest request) { // Set request url okHttpRequestBuilder.url(request.getUrl()); + // Set Header + Map headers = request.getAllHeaders(); + if (headers != null && !headers.isEmpty()) { + Headers.Builder okHttpHeadersBuilder = new Headers.Builder(); + for (Map.Entry entry : headers.entrySet()) { + okHttpHeadersBuilder.add(entry.getKey(), entry.getValue()); + } + Headers okHttpHeaders = okHttpHeadersBuilder.build(); + okHttpRequestBuilder.headers(okHttpHeaders); + } + // Set request body AffirmHttpBody body = request.getBody(); RequestBody okHttpRequestBody; diff --git a/affirm/src/main/java/com/affirm/android/AffirmHttpRequest.java b/affirm/src/main/java/com/affirm/android/AffirmHttpRequest.java index 637753cc..a9a4437d 100755 --- a/affirm/src/main/java/com/affirm/android/AffirmHttpRequest.java +++ b/affirm/src/main/java/com/affirm/android/AffirmHttpRequest.java @@ -1,16 +1,21 @@ package com.affirm.android; +import java.util.HashMap; +import java.util.Map; + public final class AffirmHttpRequest { private final String url; private final Method method; private final AffirmHttpBody body; private final String tag; + private final Map headers; private AffirmHttpRequest(Builder builder) { url = builder.mUrl; method = builder.mMethod; body = builder.mBody; tag = builder.mTag; + headers = builder.headers; } String getUrl() { @@ -21,6 +26,12 @@ Method getMethod() { return method; } + + Map getAllHeaders() { + return headers; + } + + AffirmHttpBody getBody() { return body; } @@ -39,6 +50,7 @@ static final class Builder { private Method mMethod; private AffirmHttpBody mBody; private String mTag; + private Map headers; Builder() { } @@ -64,6 +76,11 @@ Builder setTag(String tag) { return this; } + public Builder setHeaders(Map headers) { + this.headers = new HashMap<>(headers); + return this; + } + AffirmHttpRequest build() { return new AffirmHttpRequest(this); } diff --git a/affirm/src/main/java/com/affirm/android/AffirmPlugins.java b/affirm/src/main/java/com/affirm/android/AffirmPlugins.java index 062383b8..a38848e6 100755 --- a/affirm/src/main/java/com/affirm/android/AffirmPlugins.java +++ b/affirm/src/main/java/com/affirm/android/AffirmPlugins.java @@ -4,8 +4,6 @@ import androidx.annotation.NonNull; -import com.affirm.android.model.AbstractAddress; -import com.affirm.android.model.AddressSerializer; import com.affirm.android.model.AffirmAdapterFactory; import com.affirm.android.model.CardDetailsInner; import com.google.gson.Gson; @@ -88,35 +86,42 @@ Affirm.Environment environment() { return configuration.environment; } + String locale() { + return configuration.locale; + } + + String countryCode() { + return configuration.countryCode; + } + String environmentName() { return configuration.environment.name(); } - String baseUrl() { - return configuration.environment.baseUrl(); + String checkoutUrl() { + return configuration.environment.checkoutUrl(); } - public String basePromoUrl() { - return configuration.environment.basePromoUrl(); + String promoUrl() { + return configuration.environment.promoUrl(countryCode()); } - String baseJsUrl() { - return configuration.environment.baseJsUrl(); + String jsUrl() { + return configuration.environment.jsUrl(); } - String trackerBaseUrl() { - return configuration.environment.trackerBaseUrl(); + String trackerUrl() { + return configuration.environment.trackerUrl(); } - String baseInvalidCheckoutRedirectUrl() { - return configuration.environment.baseInvalidCheckoutRedirectUrl(); + String invalidCheckoutRedirectUrl() { + return configuration.environment.invalidCheckoutRedirectUrl(); } synchronized Gson gson() { if (gson == null) { gson = new GsonBuilder() .registerTypeAdapterFactory(AffirmAdapterFactory.create()) - .registerTypeAdapter(AbstractAddress.class, new AddressSerializer()) .create(); } return gson; @@ -133,8 +138,9 @@ synchronized AffirmHttpClient restClient() { builder.addHeader("Affirm-User-Agent", "Affirm-Android-SDK"); builder.addHeader("Affirm-User-Agent-Version", BuildConfig.VERSION_NAME); CookieManager cookieManager = CookieManager.getInstance(); - String cookie = cookieManager - .getCookie(AffirmConstants.HTTPS_PROTOCOL + baseUrl()); + String cookie = cookieManager.getCookie( + AffirmConstants.HTTPS_PROTOCOL + promoUrl() + ); if (cookie != null) { builder.addHeader("Cookie", cookie); } diff --git a/affirm/src/main/java/com/affirm/android/AffirmTrackView.java b/affirm/src/main/java/com/affirm/android/AffirmTrackView.java index 33e9bc44..f0dd3984 100755 --- a/affirm/src/main/java/com/affirm/android/AffirmTrackView.java +++ b/affirm/src/main/java/com/affirm/android/AffirmTrackView.java @@ -21,9 +21,11 @@ import androidx.annotation.NonNull; import static com.affirm.android.AffirmConstants.API_KEY; +import static com.affirm.android.AffirmConstants.COUNTRY_CODE; import static com.affirm.android.AffirmConstants.HTTPS_PROTOCOL; import static com.affirm.android.AffirmConstants.JAVASCRIPT; import static com.affirm.android.AffirmConstants.JS_PATH; +import static com.affirm.android.AffirmConstants.LOCALE; import static com.affirm.android.AffirmConstants.TEXT_HTML; import static com.affirm.android.AffirmConstants.TRACK_ORDER_OBJECT; import static com.affirm.android.AffirmConstants.TRACK_PRODUCT_OBJECT; @@ -79,7 +81,7 @@ protected void onAttachedToWindow() { webView.setWebChromeClient(new AffirmWebChromeClient(this)); final String html = initialHtml(); - webView.loadDataWithBaseURL(HTTPS_PROTOCOL + AffirmPlugins.get().baseUrl(), html, + webView.loadDataWithBaseURL(HTTPS_PROTOCOL + AffirmPlugins.get().promoUrl(), html, TEXT_HTML, UTF_8, null); // Since there is no callback, the track view will be removed after 10 seconds timeout. handler.postDelayed(new Runnable() { @@ -101,12 +103,14 @@ private String initialHtml() { } finally { AffirmUtils.closeInputStream(ins); } - final String fullPath = HTTPS_PROTOCOL + AffirmPlugins.get().baseJsUrl() + JS_PATH; + final String fullPath = HTTPS_PROTOCOL + AffirmPlugins.get().jsUrl() + JS_PATH; final HashMap map = new HashMap<>(); map.put(API_KEY, AffirmPlugins.get().publicKey()); map.put(JAVASCRIPT, fullPath); + map.put(LOCALE, AffirmPlugins.get().locale()); + map.put(COUNTRY_CODE, AffirmPlugins.get().countryCode()); map.put(TRACK_ORDER_OBJECT, buildOrderObject().toString()); map.put(TRACK_PRODUCT_OBJECT, buildProductObject().toString()); return AffirmUtils.replacePlaceholders(html, map); diff --git a/affirm/src/main/java/com/affirm/android/CheckoutRequest.java b/affirm/src/main/java/com/affirm/android/CheckoutRequest.java index 33722aa8..d95b3ecf 100755 --- a/affirm/src/main/java/com/affirm/android/CheckoutRequest.java +++ b/affirm/src/main/java/com/affirm/android/CheckoutRequest.java @@ -23,6 +23,10 @@ import static com.affirm.android.AffirmConstants.API_VERSION_KEY; import static com.affirm.android.AffirmConstants.API_VERSION_VALUE; import static com.affirm.android.AffirmConstants.CHECKOUT; +import static com.affirm.android.AffirmConstants.CHECKOUT_HEADER_AFFIRM_LOCALE; +import static com.affirm.android.AffirmConstants.CHECKOUT_HEADER_COUNTRY_CODE; +import static com.affirm.android.AffirmConstants.CHECKOUT_META; +import static com.affirm.android.AffirmConstants.CHECKOUT_META_LOCALE; import static com.affirm.android.AffirmConstants.CHECKOUT_PATH; import static com.affirm.android.AffirmConstants.MERCHANT; import static com.affirm.android.AffirmConstants.METADATA; @@ -37,6 +41,9 @@ import static com.affirm.android.AffirmTracker.TrackingEvent.VCN_CHECKOUT_CREATION_START; import static com.affirm.android.AffirmTracker.TrackingLevel.INFO; +import java.util.HashMap; +import java.util.Map; + class CheckoutRequest implements AffirmRequest { @Nullable @@ -142,7 +149,7 @@ class AffirmCheckoutRequest implements AffirmClient.AffirmApiRequest { @Override public String url() { return AffirmHttpClient.getProtocol() - + AffirmPlugins.get().baseUrl() + + AffirmPlugins.get().checkoutUrl() + CHECKOUT_PATH; } @@ -188,6 +195,10 @@ public JsonObject body() { checkoutJson.add(MERCHANT, merchantJson); checkoutJson.addProperty(API_VERSION_KEY, API_VERSION_VALUE); + JsonObject metaJson = new JsonObject(); + metaJson.addProperty(CHECKOUT_META_LOCALE, AffirmPlugins.get().locale()); + checkoutJson.add(CHECKOUT_META, metaJson); + // Need to set `platform_type` & `platform_affirm` by default JsonObject metadataJson = checkoutJson.getAsJsonObject(METADATA); if (metadataJson == null) { @@ -200,5 +211,14 @@ public JsonObject body() { jsonRequest.add(CHECKOUT, checkoutJson); return jsonRequest; } + + @Nullable + @Override + public Map headers() { + HashMap headers = new HashMap<>(); + headers.put(CHECKOUT_HEADER_AFFIRM_LOCALE, AffirmPlugins.get().locale()); + headers.put(CHECKOUT_HEADER_COUNTRY_CODE, AffirmPlugins.get().countryCode()); + return headers; + } } } diff --git a/affirm/src/main/java/com/affirm/android/CookiesUtil.java b/affirm/src/main/java/com/affirm/android/CookiesUtil.java index 1b423620..82c1541a 100755 --- a/affirm/src/main/java/com/affirm/android/CookiesUtil.java +++ b/affirm/src/main/java/com/affirm/android/CookiesUtil.java @@ -20,7 +20,9 @@ private CookiesUtil() { public static void clearCookies(Context context) { final CookieManager cookieManager = CookieManager.getInstance(); final CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(context); - CookiesUtil.clearCookieByUrl(HTTPS_PROTOCOL + AffirmPlugins.get().baseUrl(), + CookiesUtil.clearCookieByUrl(HTTPS_PROTOCOL + AffirmPlugins.get().promoUrl(), + cookieManager, cookieSyncManager); + CookiesUtil.clearCookieByUrl(HTTPS_PROTOCOL + AffirmPlugins.get().checkoutUrl(), cookieManager, cookieSyncManager); } diff --git a/affirm/src/main/java/com/affirm/android/LoanAmountActivity.java b/affirm/src/main/java/com/affirm/android/LoanAmountActivity.java index 979c4de3..2e8b8171 100644 --- a/affirm/src/main/java/com/affirm/android/LoanAmountActivity.java +++ b/affirm/src/main/java/com/affirm/android/LoanAmountActivity.java @@ -86,6 +86,7 @@ protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(CHECKOUT_EXTRA, checkout); outState.putString(CHECKOUT_CAAS_EXTRA, caas); + outState.putInt(CHECKOUT_CARD_AUTH_WINDOW, cardAuthWindow); } @Override diff --git a/affirm/src/main/java/com/affirm/android/ModalFragment.java b/affirm/src/main/java/com/affirm/android/ModalFragment.java index 3c4ba1f5..aa326e53 100644 --- a/affirm/src/main/java/com/affirm/android/ModalFragment.java +++ b/affirm/src/main/java/com/affirm/android/ModalFragment.java @@ -22,9 +22,11 @@ import static com.affirm.android.AffirmConstants.AMOUNT; import static com.affirm.android.AffirmConstants.API_KEY; import static com.affirm.android.AffirmConstants.CANCEL_URL; +import static com.affirm.android.AffirmConstants.COUNTRY_CODE; import static com.affirm.android.AffirmConstants.HTTPS_PROTOCOL; import static com.affirm.android.AffirmConstants.JAVASCRIPT; import static com.affirm.android.AffirmConstants.JS_PATH; +import static com.affirm.android.AffirmConstants.LOCALE; import static com.affirm.android.AffirmConstants.MAP_EXTRA; import static com.affirm.android.AffirmConstants.MODAL_ID; import static com.affirm.android.AffirmConstants.PAGE_TYPE; @@ -91,12 +93,14 @@ private static ModalFragment newInstance(@NonNull FragmentManager fragmentManage final String stringAmount = String.valueOf(AffirmUtils.decimalDollarsToIntegerCents(amount)); - final String fullPath = HTTPS_PROTOCOL + AffirmPlugins.get().baseJsUrl() + JS_PATH; + final String fullPath = HTTPS_PROTOCOL + AffirmPlugins.get().jsUrl() + JS_PATH; final HashMap map = new HashMap<>(); map.put(AMOUNT, stringAmount); map.put(API_KEY, AffirmPlugins.get().publicKey()); map.put(JAVASCRIPT, fullPath); + map.put(LOCALE, AffirmPlugins.get().locale()); + map.put(COUNTRY_CODE, AffirmPlugins.get().countryCode()); map.put(CANCEL_URL, AFFIRM_CHECKOUT_CANCELLATION_URL); map.put(MODAL_ID, modalId == null ? "" : modalId); map.put(PAGE_TYPE, pageType == null ? "" : pageType); @@ -146,7 +150,7 @@ public void onDetach() { void onAttached() { final String html = initialHtml(); webView.loadDataWithBaseURL( - HTTPS_PROTOCOL + AffirmPlugins.get().basePromoUrl(), + HTTPS_PROTOCOL + AffirmPlugins.get().promoUrl(), html, TEXT_HTML, UTF_8, null); } diff --git a/affirm/src/main/java/com/affirm/android/PrequalFragment.java b/affirm/src/main/java/com/affirm/android/PrequalFragment.java index 545cf95e..1f7cba31 100644 --- a/affirm/src/main/java/com/affirm/android/PrequalFragment.java +++ b/affirm/src/main/java/com/affirm/android/PrequalFragment.java @@ -18,7 +18,7 @@ import static com.affirm.android.AffirmConstants.AMOUNT; import static com.affirm.android.AffirmConstants.HTTPS_PROTOCOL; import static com.affirm.android.AffirmConstants.PAGE_TYPE; -import static com.affirm.android.AffirmConstants.PREQUAL_IS_SDK; +import static com.affirm.android.AffirmConstants.PREQUAL_LOCALE; import static com.affirm.android.AffirmConstants.PREQUAL_PAGE_TYPE; import static com.affirm.android.AffirmConstants.PREQUAL_PATH; import static com.affirm.android.AffirmConstants.PREQUAL_PROMO_EXTERNAL_ID; @@ -101,12 +101,11 @@ void initViews() { @Override void onAttached() { String publicKey = AffirmPlugins.get().publicKey(); - String prequalUri = HTTPS_PROTOCOL + AffirmPlugins.get().basePromoUrl() + PREQUAL_PATH; + String prequalUri = HTTPS_PROTOCOL + AffirmPlugins.get().promoUrl() + PREQUAL_PATH; Uri.Builder builder = Uri.parse(prequalUri).buildUpon(); builder.appendQueryParameter(PREQUAL_PUBLIC_API_KEY, publicKey); builder.appendQueryParameter(PREQUAL_UNIT_PRICE, amount); builder.appendQueryParameter(PREQUAL_USE_PROMO, "true"); - builder.appendQueryParameter(PREQUAL_IS_SDK, "true"); builder.appendQueryParameter(PREQUAL_REFERRING_URL, REFERRING_URL); if (promoId != null) { builder.appendQueryParameter(PREQUAL_PROMO_EXTERNAL_ID, promoId); @@ -114,6 +113,7 @@ void onAttached() { if (pageType != null) { builder.appendQueryParameter(PREQUAL_PAGE_TYPE, pageType); } + builder.appendQueryParameter(PREQUAL_LOCALE, AffirmPlugins.get().locale()); webView.loadUrl(builder.build().toString()); } diff --git a/affirm/src/main/java/com/affirm/android/PromoRequest.java b/affirm/src/main/java/com/affirm/android/PromoRequest.java index be058d16..9d35b9e0 100755 --- a/affirm/src/main/java/com/affirm/android/PromoRequest.java +++ b/affirm/src/main/java/com/affirm/android/PromoRequest.java @@ -18,12 +18,23 @@ import java.math.BigDecimal; import java.util.List; -import java.util.Locale; +import java.util.Map; import okhttp3.Call; import okhttp3.OkHttpClient; +import static com.affirm.android.AffirmConstants.PROMO_AMOUNT; +import static com.affirm.android.AffirmConstants.PROMO_EXTERNAL_ID; +import static com.affirm.android.AffirmConstants.PROMO_FIELD; +import static com.affirm.android.AffirmConstants.PROMO_FIELD_VALUE; +import static com.affirm.android.AffirmConstants.PROMO_IS_SDK; +import static com.affirm.android.AffirmConstants.PROMO_ITEMS; +import static com.affirm.android.AffirmConstants.PROMO_LOCALE; +import static com.affirm.android.AffirmConstants.PROMO_LOGO_COLOR; +import static com.affirm.android.AffirmConstants.PROMO_LOGO_TYPE; +import static com.affirm.android.AffirmConstants.PROMO_PAGE_TYPE; import static com.affirm.android.AffirmConstants.PROMO_PATH; +import static com.affirm.android.AffirmConstants.PROMO_SHOW_CTA; class PromoRequest implements AffirmRequest { @@ -149,36 +160,32 @@ class AffirmPromoRequest implements AffirmClient.AffirmApiRequest { @Override public String url() { int centAmount = AffirmUtils.decimalDollarsToIntegerCents(dollarAmount); - StringBuilder path = new StringBuilder( - String.format( - Locale.getDefault(), - PROMO_PATH, - AffirmPlugins.get().publicKey(), - centAmount, - showCta - ) - ); - + Uri uri = Uri.parse(String.format( + AffirmHttpClient.getProtocol() + + AffirmPlugins.get().promoUrl() + + PROMO_PATH, + AffirmPlugins.get().publicKey() + )); + Uri.Builder builder = uri.buildUpon(); + builder.appendQueryParameter(PROMO_IS_SDK, String.valueOf(true)); + builder.appendQueryParameter(PROMO_FIELD, PROMO_FIELD_VALUE); + builder.appendQueryParameter(PROMO_AMOUNT, String.valueOf(centAmount)); + builder.appendQueryParameter(PROMO_SHOW_CTA, String.valueOf(showCta)); if (promoId != null) { - path.append("&promo_external_id=").append(promoId); + builder.appendQueryParameter(PROMO_EXTERNAL_ID, promoId); } - if (pageType != null) { - path.append("&page_type=").append(pageType.getType()); + builder.appendQueryParameter(PROMO_PAGE_TYPE, pageType.getType()); } - - path.append("&logo_color=") - .append(affirmColor.getColor()) - .append("&logo_type=") - .append(affirmLogoType.getType()); - + builder.appendQueryParameter(PROMO_LOGO_COLOR, affirmColor.getColor()); + builder.appendQueryParameter(PROMO_LOGO_TYPE, affirmLogoType.getType()); if (items != null) { - path.append("&items=").append(Uri.encode(AffirmPlugins.get().gson().toJson(items))); + builder.appendQueryParameter(PROMO_ITEMS, + Uri.encode(AffirmPlugins.get().gson().toJson(items)) + ); } - - return AffirmHttpClient.getProtocol() - + AffirmPlugins.get().basePromoUrl() - + path.toString(); + builder.appendQueryParameter(PROMO_LOCALE, AffirmPlugins.get().locale()); + return builder.build().toString(); } @NotNull @@ -192,5 +199,11 @@ public AffirmHttpRequest.Method method() { public JsonObject body() { return null; } + + @Nullable + @Override + public Map headers() { + return null; + } } } diff --git a/affirm/src/main/java/com/affirm/android/PromotionWebView.java b/affirm/src/main/java/com/affirm/android/PromotionWebView.java index 37198d57..02547d61 100644 --- a/affirm/src/main/java/com/affirm/android/PromotionWebView.java +++ b/affirm/src/main/java/com/affirm/android/PromotionWebView.java @@ -17,10 +17,12 @@ import static com.affirm.android.AffirmConstants.AFFIRM_FONT; import static com.affirm.android.AffirmConstants.API_KEY; +import static com.affirm.android.AffirmConstants.COUNTRY_CODE; import static com.affirm.android.AffirmConstants.HTML_FRAGMENT; import static com.affirm.android.AffirmConstants.HTTPS_PROTOCOL; import static com.affirm.android.AffirmConstants.JAVASCRIPT; import static com.affirm.android.AffirmConstants.JS_PATH; +import static com.affirm.android.AffirmConstants.LOCALE; import static com.affirm.android.AffirmConstants.REMOTE_CSS_URL; import static com.affirm.android.AffirmConstants.TEXT_HTML; import static com.affirm.android.AffirmConstants.UTF_8; @@ -121,11 +123,13 @@ private String initialHtml(String promoHtml, String remoteCssUrl, String typefac } final HashMap map = new HashMap<>(); - final String fullPath = HTTPS_PROTOCOL + AffirmPlugins.get().baseJsUrl() + JS_PATH; + final String fullPath = HTTPS_PROTOCOL + AffirmPlugins.get().jsUrl() + JS_PATH; map.put(AFFIRM_FONT, typeface != null ? typeface : ""); map.put(API_KEY, AffirmPlugins.get().publicKey()); map.put(JAVASCRIPT, fullPath); + map.put(LOCALE, AffirmPlugins.get().locale()); + map.put(COUNTRY_CODE, AffirmPlugins.get().countryCode()); map.put(HTML_FRAGMENT, promoHtml); map.put(REMOTE_CSS_URL, remoteCssUrl != null ? remoteCssUrl : ""); return AffirmUtils.replacePlaceholders(html, map); diff --git a/affirm/src/main/java/com/affirm/android/TrackerRequest.java b/affirm/src/main/java/com/affirm/android/TrackerRequest.java index ff1d88b5..f38e24f2 100755 --- a/affirm/src/main/java/com/affirm/android/TrackerRequest.java +++ b/affirm/src/main/java/com/affirm/android/TrackerRequest.java @@ -17,6 +17,8 @@ import static com.affirm.android.AffirmConstants.HTTPS_PROTOCOL; import static com.affirm.android.AffirmConstants.TRACKER_PATH; +import java.util.Map; + class TrackerRequest implements AffirmRequest { @NonNull @@ -68,7 +70,7 @@ public void cancel() { } private String getTrackerProtocol() { - return AffirmPlugins.get().trackerBaseUrl().contains(HTTP) ? "" : HTTPS_PROTOCOL; + return AffirmPlugins.get().trackerUrl().contains(HTTP) ? "" : HTTPS_PROTOCOL; } private void handleException(AffirmException e) { @@ -82,7 +84,7 @@ class AffirmTrackerRequest implements AffirmClient.AffirmApiRequest { @Override public String url() { return getTrackerProtocol() - + AffirmPlugins.get().trackerBaseUrl() + + AffirmPlugins.get().trackerUrl() + TRACKER_PATH; } @@ -97,5 +99,11 @@ public AffirmHttpRequest.Method method() { public JsonObject body() { return trackingData; } + + @Nullable + @Override + public Map headers() { + return null; + } } } diff --git a/affirm/src/main/java/com/affirm/android/VcnCheckoutWebViewClient.java b/affirm/src/main/java/com/affirm/android/VcnCheckoutWebViewClient.java index 38b28018..a86853fc 100755 --- a/affirm/src/main/java/com/affirm/android/VcnCheckoutWebViewClient.java +++ b/affirm/src/main/java/com/affirm/android/VcnCheckoutWebViewClient.java @@ -42,7 +42,7 @@ final class VcnCheckoutWebViewClient extends AffirmWebViewClient { @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { if (request.getUrl().toString().equals(HTTPS_PROTOCOL - + AffirmPlugins.get().baseInvalidCheckoutRedirectUrl())) { + + AffirmPlugins.get().invalidCheckoutRedirectUrl())) { callbacks.onWebViewError( new ConnectionException(INVALID_CHECKOUT_MESSAGE) ); diff --git a/affirm/src/main/java/com/affirm/android/model/AbstractAddress.java b/affirm/src/main/java/com/affirm/android/model/AbstractAddress.java deleted file mode 100755 index dbc65124..00000000 --- a/affirm/src/main/java/com/affirm/android/model/AbstractAddress.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.affirm.android.model; - -import android.os.Parcelable; - -public abstract class AbstractAddress implements Parcelable { - -} diff --git a/affirm/src/main/java/com/affirm/android/model/Address.java b/affirm/src/main/java/com/affirm/android/model/Address.java index 08cb58ab..3ede386a 100644 --- a/affirm/src/main/java/com/affirm/android/model/Address.java +++ b/affirm/src/main/java/com/affirm/android/model/Address.java @@ -1,13 +1,16 @@ package com.affirm.android.model; +import android.os.Parcelable; + import androidx.annotation.Nullable; import com.google.auto.value.AutoValue; import com.google.gson.Gson; import com.google.gson.TypeAdapter; +import com.google.gson.annotations.SerializedName; @AutoValue -public abstract class Address extends AbstractAddress { +public abstract class Address implements Parcelable { public static Address.Builder builder() { return new AutoValue_Address.Builder(); @@ -18,20 +21,22 @@ public static TypeAdapter
typeAdapter(Gson gson) { } // Valid U.S. street address, verified by public address service APIs. - public abstract String line1(); + public abstract String street1(); // Apartment, suite, floor, etc. @Nullable - public abstract String line2(); + public abstract String street2(); // City name, verified by public address service APIs. public abstract String city(); // 2-letter ISO code or full name, verified by public address service APIs. - public abstract String state(); + @SerializedName("region1_code") + public abstract String region1Code(); // Must match other provided address information, verified by public address service APIs. - public abstract String zipcode(); + @SerializedName("postal_code") + public abstract String postalCode(); // If provided, must be 'US' or 'USA' (3-letter ISO code). // Affirm is only available to U.S. residents. @@ -39,15 +44,15 @@ public static TypeAdapter
typeAdapter(Gson gson) { @AutoValue.Builder public abstract static class Builder { - public abstract Builder setLine1(String value); + public abstract Builder setStreet1(String value); - public abstract Builder setLine2(String value); + public abstract Builder setStreet2(String value); public abstract Builder setCity(String value); - public abstract Builder setState(String value); + public abstract Builder setRegion1Code(String value); - public abstract Builder setZipcode(String value); + public abstract Builder setPostalCode(String value); public abstract Builder setCountry(String value); diff --git a/affirm/src/main/java/com/affirm/android/model/AddressSerializer.java b/affirm/src/main/java/com/affirm/android/model/AddressSerializer.java deleted file mode 100644 index bcbbfe27..00000000 --- a/affirm/src/main/java/com/affirm/android/model/AddressSerializer.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.affirm.android.model; - -import com.google.gson.JsonElement; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; - -import java.lang.reflect.Type; - -public class AddressSerializer implements JsonSerializer { - - @Override - public JsonElement serialize(AbstractAddress src, - Type typeOfSrc, - JsonSerializationContext context) { - return context.serialize(src, src.getClass()); - } -} \ No newline at end of file diff --git a/affirm/src/main/java/com/affirm/android/model/Billing.java b/affirm/src/main/java/com/affirm/android/model/Billing.java index fd73f5a4..c0bbbd2b 100755 --- a/affirm/src/main/java/com/affirm/android/model/Billing.java +++ b/affirm/src/main/java/com/affirm/android/model/Billing.java @@ -20,7 +20,7 @@ public static TypeAdapter typeAdapter(Gson gson) { } @Nullable - public abstract AbstractAddress address(); + public abstract Address address(); @Nullable public abstract Name name(); @@ -35,7 +35,7 @@ public static TypeAdapter typeAdapter(Gson gson) { @AutoValue.Builder public abstract static class Builder { - public abstract Builder setAddress(AbstractAddress value); + public abstract Builder setAddress(Address value); public abstract Builder setName(Name value); diff --git a/affirm/src/main/java/com/affirm/android/model/CAAddress.java b/affirm/src/main/java/com/affirm/android/model/CAAddress.java deleted file mode 100755 index 392678c6..00000000 --- a/affirm/src/main/java/com/affirm/android/model/CAAddress.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.affirm.android.model; - -import androidx.annotation.Nullable; - -import com.google.auto.value.AutoValue; -import com.google.gson.Gson; -import com.google.gson.TypeAdapter; -import com.google.gson.annotations.SerializedName; - -@AutoValue -public abstract class CAAddress extends AbstractAddress { - - public static CAAddress.Builder builder() { - return new AutoValue_CAAddress.Builder(); - } - - public static TypeAdapter typeAdapter(Gson gson) { - return new AutoValue_CAAddress.GsonTypeAdapter(gson); - } - - // Valid street address, verified by public address service APIs. - @SerializedName("street1") - public abstract String street1(); - - // Apartment, suite, floor, etc. - @Nullable - @SerializedName("street2") - public abstract String street2(); - - // City name, verified by public address service APIs. - @SerializedName("city") - public abstract String city(); - - // 2-letter ISO code for the country province, verified by public address service APIs. - @SerializedName("region1_code") - public abstract String region1Code(); - - // Must match other provided address information, verified by public address service APIs. - @SerializedName("postal_code") - public abstract String postalCode(); - - // If provided, must be 'CA'. Affirm is only available to U.S. residents. - @Nullable - @SerializedName("country_code") - public abstract String countryCode(); - - @AutoValue.Builder - public abstract static class Builder { - public abstract Builder setStreet1(String value); - - public abstract Builder setStreet2(String value); - - public abstract Builder setCity(String value); - - public abstract Builder setRegion1Code(String value); - - public abstract Builder setPostalCode(String value); - - public abstract Builder setCountryCode(String value); - - public abstract CAAddress build(); - } -} diff --git a/affirm/src/main/java/com/affirm/android/model/Shipping.java b/affirm/src/main/java/com/affirm/android/model/Shipping.java index b48c1b4b..79b8de53 100755 --- a/affirm/src/main/java/com/affirm/android/model/Shipping.java +++ b/affirm/src/main/java/com/affirm/android/model/Shipping.java @@ -19,7 +19,7 @@ public static TypeAdapter typeAdapter(Gson gson) { return new AutoValue_Shipping.GsonTypeAdapter(gson); } - public abstract AbstractAddress address(); + public abstract Address address(); public abstract Name name(); @@ -32,7 +32,7 @@ public static TypeAdapter typeAdapter(Gson gson) { @AutoValue.Builder public abstract static class Builder { - public abstract Builder setAddress(AbstractAddress value); + public abstract Builder setAddress(Address value); public abstract Builder setName(Name value); diff --git a/affirm/src/main/res/raw/affirm_modal_template.html b/affirm/src/main/res/raw/affirm_modal_template.html index 740ddcbd..0c0634c8 100755 --- a/affirm/src/main/res/raw/affirm_modal_template.html +++ b/affirm/src/main/res/raw/affirm_modal_template.html @@ -56,7 +56,9 @@ diff --git a/affirm/src/main/res/raw/affirm_track_order_confirmed.html b/affirm/src/main/res/raw/affirm_track_order_confirmed.html index ac6807bc..d73364f5 100755 --- a/affirm/src/main/res/raw/affirm_track_order_confirmed.html +++ b/affirm/src/main/res/raw/affirm_track_order_confirmed.html @@ -6,7 +6,9 @@