package com.stripe.wrap.pay;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.Size;
import android.support.annotation.VisibleForTesting;
import android.text.TextUtils;
import com.google.android.gms.wallet.Cart;
import com.google.android.gms.wallet.FullWalletRequest;
import com.google.android.gms.wallet.MaskedWalletRequest;
import com.google.android.gms.wallet.PaymentMethodTokenizationParameters;
import com.stripe.wrap.pay.utils.PaymentUtils;
import java.util.Currency;
import java.util.Locale;
import static com.google.android.gms.wallet.PaymentMethodTokenizationType.PAYMENT_GATEWAY;
/**
* Singleton class that represents one-time configuration data for Android Pay integration.
*/
public class AndroidPayConfiguration {
private static AndroidPayConfiguration mInstance;
@NonNull private Currency mCurrency;
private boolean mIsPhoneNumberRequired;
private boolean mIsShippingAddressRequired;
private String mMerchantName;
private String mPublicApiKey;
@NonNull
public static AndroidPayConfiguration getInstance() {
if (mInstance == null) {
throw new RuntimeException(
"Attempted to get instance of AndroidPayConfiguration without initialization.");
}
return mInstance;
}
/**
* Initialize the AndroidPayConfiguration instance with a currency code. If the currency
* code is invalid, this will throw an {@link IllegalArgumentException}
*
* @param publicApiKey the Stripe api public key
* @param currencyCode the code for the starting {@link Currency} for android pay configuration
* @return the instance of the AndroidPayConfiguration singleton
*/
public static AndroidPayConfiguration init(
@NonNull @Size(min = 5) String publicApiKey,
@NonNull String currencyCode) {
return init(publicApiKey, Currency.getInstance(currencyCode.toUpperCase()));
}
/**
* Initialize the AndroidPayConfiguration instance with a {@link Currency}.
*
* @param publicApiKey the Stripe public api key
* @param currency the starting {@link Currency} for android pay configuration
* @return the instance of the AndroidPayConfiguration singleton
*/
public static AndroidPayConfiguration init(
@NonNull @Size(min = 5) String publicApiKey,
@NonNull Currency currency) {
mInstance = new AndroidPayConfiguration(publicApiKey, currency);
return mInstance;
}
@VisibleForTesting
AndroidPayConfiguration(@NonNull String publicApiKey, @NonNull Currency currency) {
mCurrency = currency;
mPublicApiKey = publicApiKey;
}
@Nullable
public PaymentMethodTokenizationParameters getPaymentMethodTokenizationParameters() {
if (TextUtils.isEmpty(mPublicApiKey)) {
return null;
}
return PaymentMethodTokenizationParameters.newBuilder()
.setPaymentMethodTokenizationType(PAYMENT_GATEWAY)
.addParameter("gateway", "stripe")
.addParameter("stripe:publishableKey", mPublicApiKey)
.addParameter("stripe:version", com.stripe.android.BuildConfig.VERSION_NAME)
.build();
}
@Nullable
public MaskedWalletRequest generateMaskedWalletRequest(@Nullable Cart cart) {
return generateMaskedWalletRequest(
cart,
mIsPhoneNumberRequired,
mIsShippingAddressRequired,
mCurrency.getCurrencyCode());
}
@NonNull
public static FullWalletRequest generateFullWalletRequest(
@NonNull String googleTransactionId,
@NonNull Cart cart) {
return FullWalletRequest.newBuilder()
.setGoogleTransactionId(googleTransactionId)
.setCart(cart)
.build();
}
@Nullable
public MaskedWalletRequest generateMaskedWalletRequest(
@Nullable Cart cart,
boolean isPhoneNumberRequired,
boolean isShippingAddressRequired,
@Nullable String currencyCode) {
if (cart == null || cart.getTotalPrice() == null || currencyCode == null) {
return null;
}
PaymentMethodTokenizationParameters paymentMethodTokenizationParameters
= getPaymentMethodTokenizationParameters();
if (paymentMethodTokenizationParameters == null) {
return null;
}
return MaskedWalletRequest.newBuilder()
.setCart(cart)
.setPhoneNumberRequired(isPhoneNumberRequired)
.setShippingAddressRequired(isShippingAddressRequired)
.setMerchantName(mMerchantName)
.setCurrencyCode(currencyCode)
.setEstimatedTotalPrice(cart.getTotalPrice())
.setPaymentMethodTokenizationParameters(paymentMethodTokenizationParameters)
.build();
}
@NonNull
public Currency getCurrency() {
return mCurrency;
}
@NonNull
public String getCurrencyCode() {
return mCurrency.getCurrencyCode();
}
@NonNull
public AndroidPayConfiguration setCurrency(@NonNull Currency currency) {
mCurrency = currency;
return this;
}
@NonNull
public AndroidPayConfiguration setCurrencyCode(String currencyCode) {
mCurrency = Currency.getInstance(currencyCode.toUpperCase());
return this;
}
public boolean isPhoneNumberRequired() {
return mIsPhoneNumberRequired;
}
public AndroidPayConfiguration setPhoneNumberRequired(boolean phoneNumberRequired) {
mIsPhoneNumberRequired = phoneNumberRequired;
return this;
}
public boolean isShippingAddressRequired() {
return mIsShippingAddressRequired;
}
public AndroidPayConfiguration setShippingAddressRequired(boolean shippingAddressRequired) {
mIsShippingAddressRequired = shippingAddressRequired;
return this;
}
public String getMerchantName() {
return mMerchantName;
}
public AndroidPayConfiguration setMerchantName(String merchantName) {
mMerchantName = merchantName;
return this;
}
public String getPublicApiKey() {
return mPublicApiKey;
}
public AndroidPayConfiguration setPublicApiKey(String publicApiKey) {
mPublicApiKey = publicApiKey;
return this;
}
}