diff --git a/stripe/src/main/java/com/stripe/android/model/PaymentMethod.kt b/stripe/src/main/java/com/stripe/android/model/PaymentMethod.kt index 75cf01c3b19..f246efdfb48 100644 --- a/stripe/src/main/java/com/stripe/android/model/PaymentMethod.kt +++ b/stripe/src/main/java/com/stripe/android/model/PaymentMethod.kt @@ -109,7 +109,9 @@ data class PaymentMethod internal constructor( @JvmField val auBecsDebit: AuBecsDebit? = null, - @JvmField val bacsDebit: BacsDebit? = null + @JvmField val bacsDebit: BacsDebit? = null, + + @JvmField val sofort: Sofort? = null ) : StripeModel { @Parcelize @@ -119,11 +121,12 @@ data class PaymentMethod internal constructor( ) : Parcelable { Card("card"), CardPresent("card_present"), - Fpx("fpx", false), + Fpx("fpx", isReusable = false), Ideal("ideal"), SepaDebit("sepa_debit"), AuBecsDebit("au_becs_debit"), - BacsDebit("bacs_debit"); + BacsDebit("bacs_debit"), + Sofort("sofort", isReusable = false); override fun toString(): String { return code @@ -152,6 +155,7 @@ data class PaymentMethod internal constructor( private var sepaDebit: SepaDebit? = null private var auBecsDebit: AuBecsDebit? = null private var bacsDebit: BacsDebit? = null + private var sofort: Sofort? = null fun setId(id: String?): Builder = apply { this.id = id @@ -209,6 +213,10 @@ data class PaymentMethod internal constructor( this.bacsDebit = bacsDebit } + fun setSofort(sofort: Sofort?): Builder = apply { + this.sofort = sofort + } + override fun build(): PaymentMethod { return PaymentMethod( id = id, @@ -224,7 +232,8 @@ data class PaymentMethod internal constructor( ideal = ideal, sepaDebit = sepaDebit, auBecsDebit = auBecsDebit, - bacsDebit = bacsDebit + bacsDebit = bacsDebit, + sofort = sofort ) } } @@ -644,6 +653,11 @@ data class PaymentMethod internal constructor( @JvmField val sortCode: String? ) : StripeModel + @Parcelize + data class Sofort internal constructor( + @JvmField val country: String? + ) : StripeModel + companion object { @JvmStatic fun fromJson(paymentMethod: JSONObject?): PaymentMethod? { diff --git a/stripe/src/main/java/com/stripe/android/model/PaymentMethodOptionsParams.kt b/stripe/src/main/java/com/stripe/android/model/PaymentMethodOptionsParams.kt index 88b94df35b4..f793b4d2cfd 100644 --- a/stripe/src/main/java/com/stripe/android/model/PaymentMethodOptionsParams.kt +++ b/stripe/src/main/java/com/stripe/android/model/PaymentMethodOptionsParams.kt @@ -24,11 +24,10 @@ sealed class PaymentMethodOptionsParams( } } - // TODO(mshafrir-stripe): extend `PaymentMethodOptionsParams` once PaymentMethod.Type is created @Parcelize data class Sofort( var preferredLanguage: String? = null - ) : StripeParamsModel, Parcelable { + ) : PaymentMethodOptionsParams(PaymentMethod.Type.Sofort) { override fun toParamMap(): Map { return preferredLanguage?.let { mapOf(PARAM_PREFERRED_LANGUAGE to it) diff --git a/stripe/src/main/java/com/stripe/android/model/parsers/PaymentMethodJsonParser.kt b/stripe/src/main/java/com/stripe/android/model/parsers/PaymentMethodJsonParser.kt index 9cd0bc9c66d..cc4c2b6aa9f 100644 --- a/stripe/src/main/java/com/stripe/android/model/parsers/PaymentMethodJsonParser.kt +++ b/stripe/src/main/java/com/stripe/android/model/parsers/PaymentMethodJsonParser.kt @@ -60,6 +60,12 @@ internal class PaymentMethodJsonParser : ModelJsonParser { BacsDebitJsonParser().parse(it) } ) + PaymentMethod.Type.Sofort -> + builder.setSofort( + json.optJSONObject(type.code)?.let { + SofortJsonParser().parse(it) + } + ) } return builder.build() @@ -256,6 +262,18 @@ internal class PaymentMethodJsonParser : ModelJsonParser { } } + internal class SofortJsonParser : ModelJsonParser { + override fun parse(json: JSONObject): PaymentMethod.Sofort { + return PaymentMethod.Sofort( + country = StripeJsonUtils.optString(json, FIELD_COUNTRY) + ) + } + + private companion object { + private const val FIELD_COUNTRY = "country" + } + } + private companion object { private const val FIELD_ID = "id" private const val FIELD_BILLING_DETAILS = "billing_details" diff --git a/stripe/src/test/java/com/stripe/android/PaymentMethodEndToEndTest.kt b/stripe/src/test/java/com/stripe/android/PaymentMethodEndToEndTest.kt index f4a27a6e507..d1a4ae23c63 100644 --- a/stripe/src/test/java/com/stripe/android/PaymentMethodEndToEndTest.kt +++ b/stripe/src/test/java/com/stripe/android/PaymentMethodEndToEndTest.kt @@ -38,7 +38,13 @@ class PaymentMethodEndToEndTest { val paymentMethod = Stripe(context, ApiKeyFixtures.SOFORT_PUBLISHABLE_KEY) .createPaymentMethodSynchronous(params) - assertThat(paymentMethod) - .isNotNull() + assertThat(paymentMethod?.type) + .isEqualTo(PaymentMethod.Type.Sofort) + assertThat(paymentMethod?.sofort) + .isEqualTo( + PaymentMethod.Sofort( + country = "DE" + ) + ) } } diff --git a/stripe/src/test/java/com/stripe/android/model/PaymentMethodCreateParamsFixtures.kt b/stripe/src/test/java/com/stripe/android/model/PaymentMethodCreateParamsFixtures.kt index 1f8534aad60..9c2a99dbea6 100644 --- a/stripe/src/test/java/com/stripe/android/model/PaymentMethodCreateParamsFixtures.kt +++ b/stripe/src/test/java/com/stripe/android/model/PaymentMethodCreateParamsFixtures.kt @@ -64,7 +64,7 @@ internal object PaymentMethodCreateParamsFixtures { internal val SOFORT = PaymentMethodCreateParams.create( sofort = PaymentMethodCreateParams.Sofort( - country = "de" + country = "DE" ), billingDetails = BILLING_DETAILS )