From 4acfdb041650379617472898c1b2c2582e493a82 Mon Sep 17 00:00:00 2001 From: jreij Date: Mon, 17 May 2021 11:46:26 +0200 Subject: [PATCH 1/6] Create ComponentAvailabilityCheck --- .../checkout/bcmc/BcmcComponentProvider.kt | 11 ------- .../checkout/card/CardComponentProvider.kt | 11 ------- .../components/ComponentAvailabilityCheck.kt | 26 +++++++++++++++ .../components/PaymentComponentProvider.java | 12 ++----- .../base/GenericPaymentComponentProvider.kt | 11 ------- .../GenericStoredPaymentComponentProvider.kt | 11 ------- .../checkout/googlepay/GooglePayProvider.kt | 9 +++-- .../checkout/wechatpay/WeChatPayProvider.kt | 33 +++++++++++++++++++ 8 files changed, 68 insertions(+), 56 deletions(-) create mode 100644 components-core/src/main/java/com/adyen/checkout/components/ComponentAvailabilityCheck.kt create mode 100644 wechatpay/src/main/java/com/adyen/checkout/wechatpay/WeChatPayProvider.kt diff --git a/bcmc/src/main/java/com/adyen/checkout/bcmc/BcmcComponentProvider.kt b/bcmc/src/main/java/com/adyen/checkout/bcmc/BcmcComponentProvider.kt index f7a5b4e30b..243744e8c7 100644 --- a/bcmc/src/main/java/com/adyen/checkout/bcmc/BcmcComponentProvider.kt +++ b/bcmc/src/main/java/com/adyen/checkout/bcmc/BcmcComponentProvider.kt @@ -7,11 +7,9 @@ */ package com.adyen.checkout.bcmc -import android.app.Application import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStoreOwner import com.adyen.checkout.card.repository.PublicKeyRepository -import com.adyen.checkout.components.ComponentAvailableCallback import com.adyen.checkout.components.PaymentComponentProvider import com.adyen.checkout.components.base.GenericPaymentMethodDelegate import com.adyen.checkout.components.base.lifecycle.viewModelFactory @@ -33,13 +31,4 @@ class BcmcComponentProvider : PaymentComponentProvider - ) { - callback.onAvailabilityResult(true, paymentMethod, configuration) - } } diff --git a/card/src/main/java/com/adyen/checkout/card/CardComponentProvider.kt b/card/src/main/java/com/adyen/checkout/card/CardComponentProvider.kt index f3c141ca5c..1fe6d0ebdd 100644 --- a/card/src/main/java/com/adyen/checkout/card/CardComponentProvider.kt +++ b/card/src/main/java/com/adyen/checkout/card/CardComponentProvider.kt @@ -7,13 +7,11 @@ */ package com.adyen.checkout.card -import android.app.Application import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStoreOwner import com.adyen.checkout.card.data.CardType import com.adyen.checkout.card.repository.BinLookupRepository import com.adyen.checkout.card.repository.PublicKeyRepository -import com.adyen.checkout.components.ComponentAvailableCallback import com.adyen.checkout.components.StoredPaymentComponentProvider import com.adyen.checkout.components.base.lifecycle.viewModelFactory import com.adyen.checkout.components.model.paymentmethods.PaymentMethod @@ -60,15 +58,6 @@ class CardComponentProvider : StoredPaymentComponentProvider - ) { - callback.onAvailabilityResult(true, paymentMethod, configuration) - } - /** * Check which set of supported cards to pass to the component. * Priority is: Custom -> PaymentMethod.brands -> Default diff --git a/components-core/src/main/java/com/adyen/checkout/components/ComponentAvailabilityCheck.kt b/components-core/src/main/java/com/adyen/checkout/components/ComponentAvailabilityCheck.kt new file mode 100644 index 0000000000..e45f0d7fa9 --- /dev/null +++ b/components-core/src/main/java/com/adyen/checkout/components/ComponentAvailabilityCheck.kt @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 Adyen N.V. + * + * This file is open source and available under the MIT license. See the LICENSE file for more info. + * + * Created by josephj on 17/5/2021. + */ +package com.adyen.checkout.components + +import android.app.Application +import com.adyen.checkout.components.base.Configuration +import com.adyen.checkout.components.model.paymentmethods.PaymentMethod + +/** + * Specifies whether a certain component is available for use with the provided parameters. + * + * @param ConfigurationT The Configuration for the Component to be provided. Simply use [Configuration] if not applicable. + */ +interface ComponentAvailabilityCheck { + fun isAvailable( + applicationContext: Application, + paymentMethod: PaymentMethod, + configuration: ConfigurationT?, + callback: ComponentAvailableCallback + ) +} diff --git a/components-core/src/main/java/com/adyen/checkout/components/PaymentComponentProvider.java b/components-core/src/main/java/com/adyen/checkout/components/PaymentComponentProvider.java index 187e8170c6..f9d72399c2 100644 --- a/components-core/src/main/java/com/adyen/checkout/components/PaymentComponentProvider.java +++ b/components-core/src/main/java/com/adyen/checkout/components/PaymentComponentProvider.java @@ -8,8 +8,6 @@ package com.adyen.checkout.components; -import android.app.Application; - import androidx.annotation.NonNull; import androidx.lifecycle.ViewModelStoreOwner; @@ -18,9 +16,9 @@ import com.adyen.checkout.core.exception.CheckoutException; /** - * Provides an instance of te associated Component linked to provided lifecycle and config. + * Provides an instance of the associated Component linked to provided lifecycle and config. * - * @param The Component to be provided + * @param The Component to be provided * @param The Configuration for the Component to be provided */ public interface PaymentComponentProvider @@ -33,10 +31,4 @@ ComponentT get( @NonNull PaymentMethod paymentMethod, @NonNull ConfigurationT configuration ) throws CheckoutException; - - void isAvailable( - @NonNull Application applicationContext, - @NonNull PaymentMethod paymentMethod, - @NonNull ConfigurationT configuration, - @NonNull ComponentAvailableCallback callback); } diff --git a/components-core/src/main/java/com/adyen/checkout/components/base/GenericPaymentComponentProvider.kt b/components-core/src/main/java/com/adyen/checkout/components/base/GenericPaymentComponentProvider.kt index a9f76ff2b5..99c7f9d03a 100644 --- a/components-core/src/main/java/com/adyen/checkout/components/base/GenericPaymentComponentProvider.kt +++ b/components-core/src/main/java/com/adyen/checkout/components/base/GenericPaymentComponentProvider.kt @@ -7,10 +7,8 @@ */ package com.adyen.checkout.components.base -import android.app.Application import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStoreOwner -import com.adyen.checkout.components.ComponentAvailableCallback import com.adyen.checkout.components.PaymentComponentProvider import com.adyen.checkout.components.base.lifecycle.viewModelFactory import com.adyen.checkout.components.model.paymentmethods.PaymentMethod @@ -32,13 +30,4 @@ class GenericPaymentComponentProvider - ) { - callback.onAvailabilityResult(true, paymentMethod, config) - } } diff --git a/components-core/src/main/java/com/adyen/checkout/components/base/GenericStoredPaymentComponentProvider.kt b/components-core/src/main/java/com/adyen/checkout/components/base/GenericStoredPaymentComponentProvider.kt index a758a4e0c8..c277d0d08f 100644 --- a/components-core/src/main/java/com/adyen/checkout/components/base/GenericStoredPaymentComponentProvider.kt +++ b/components-core/src/main/java/com/adyen/checkout/components/base/GenericStoredPaymentComponentProvider.kt @@ -8,10 +8,8 @@ package com.adyen.checkout.components.base -import android.app.Application import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStoreOwner -import com.adyen.checkout.components.ComponentAvailableCallback import com.adyen.checkout.components.StoredPaymentComponentProvider import com.adyen.checkout.components.base.lifecycle.viewModelFactory import com.adyen.checkout.components.model.paymentmethods.PaymentMethod @@ -49,13 +47,4 @@ class GenericStoredPaymentComponentProvider< } return ViewModelProvider(viewModelStoreOwner, genericFactory)[componentClass] } - - override fun isAvailable( - applicationContext: Application, - paymentMethod: PaymentMethod, - configuration: ConfigurationT, - callback: ComponentAvailableCallback - ) { - callback.onAvailabilityResult(true, paymentMethod, configuration) - } } diff --git a/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayProvider.kt b/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayProvider.kt index cddac72aee..8c89aa06d3 100644 --- a/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayProvider.kt +++ b/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayProvider.kt @@ -10,11 +10,13 @@ package com.adyen.checkout.googlepay import android.app.Application import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStoreOwner +import com.adyen.checkout.components.ComponentAvailabilityCheck import com.adyen.checkout.components.ComponentAvailableCallback import com.adyen.checkout.components.PaymentComponentProvider import com.adyen.checkout.components.base.GenericPaymentMethodDelegate import com.adyen.checkout.components.base.lifecycle.viewModelFactory import com.adyen.checkout.components.model.paymentmethods.PaymentMethod +import com.adyen.checkout.core.exception.CheckoutException import com.adyen.checkout.googlepay.model.GooglePayParams import com.adyen.checkout.googlepay.util.GooglePayUtils import com.google.android.gms.common.ConnectionResult @@ -25,7 +27,7 @@ import com.google.android.gms.wallet.PaymentsClient import com.google.android.gms.wallet.Wallet import java.lang.ref.WeakReference -class GooglePayProvider : PaymentComponentProvider { +class GooglePayProvider : PaymentComponentProvider, ComponentAvailabilityCheck { override operator fun get( viewModelStoreOwner: ViewModelStoreOwner, paymentMethod: PaymentMethod, @@ -38,9 +40,12 @@ class GooglePayProvider : PaymentComponentProvider ) { + if (configuration == null) { + throw CheckoutException("GooglePayConfiguration cannot be null") + } if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(applicationContext) != ConnectionResult.SUCCESS) { callback.onAvailabilityResult(false, paymentMethod, configuration) return diff --git a/wechatpay/src/main/java/com/adyen/checkout/wechatpay/WeChatPayProvider.kt b/wechatpay/src/main/java/com/adyen/checkout/wechatpay/WeChatPayProvider.kt new file mode 100644 index 0000000000..d559b9d950 --- /dev/null +++ b/wechatpay/src/main/java/com/adyen/checkout/wechatpay/WeChatPayProvider.kt @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021 Adyen N.V. + * + * This file is open source and available under the MIT license. See the LICENSE file for more info. + * + * Created by josephj on 17/5/2021. + */ + +package com.adyen.checkout.wechatpay + +import android.app.Application +import com.adyen.checkout.components.ComponentAvailabilityCheck +import com.adyen.checkout.components.ComponentAvailableCallback +import com.adyen.checkout.components.base.Configuration +import com.adyen.checkout.components.model.paymentmethods.PaymentMethod + +/** + * This class is not an actual provider, it only checks whether WeChatPay is available. + * There is no viewable Payment Component for WeChatPay, only an Action Component. + * You can directly call /payments after you receive a callback from [isAvailable]. + * You can use [WeChatPayActionComponent] to handle the returned action. + */ +class WeChatPayProvider : ComponentAvailabilityCheck { + + override fun isAvailable( + applicationContext: Application, + paymentMethod: PaymentMethod, + configuration: Configuration?, + callback: ComponentAvailableCallback + ) { + callback.onAvailabilityResult(WeChatPayUtils.isAvailable(applicationContext), paymentMethod, configuration) + } +} From c808cf440a9460f945532d2db22be6560142871b Mon Sep 17 00:00:00 2001 From: jreij Date: Mon, 17 May 2021 11:47:08 +0200 Subject: [PATCH 2/6] Fix availability check logic in drop in --- .../dropin/ComponentParsingProvider.kt | 43 ++++++++----------- .../checkout/dropin/DropInConfiguration.kt | 8 ++++ .../PaymentMethodsListViewModel.kt | 3 +- .../googlepay/GooglePayComponent.java | 3 +- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt b/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt index d5c8f04f81..bac43751db 100644 --- a/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt +++ b/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt @@ -23,6 +23,7 @@ import com.adyen.checkout.blik.BlikView import com.adyen.checkout.card.CardComponent import com.adyen.checkout.card.CardConfiguration import com.adyen.checkout.card.CardView +import com.adyen.checkout.components.ComponentAvailabilityCheck import com.adyen.checkout.components.ComponentAvailableCallback import com.adyen.checkout.components.ComponentView import com.adyen.checkout.components.PaymentComponent @@ -51,6 +52,7 @@ import com.adyen.checkout.eps.EPSConfiguration import com.adyen.checkout.eps.EPSRecyclerView import com.adyen.checkout.googlepay.GooglePayComponent import com.adyen.checkout.googlepay.GooglePayConfiguration +import com.adyen.checkout.googlepay.GooglePayProvider import com.adyen.checkout.ideal.IdealComponent import com.adyen.checkout.ideal.IdealConfiguration import com.adyen.checkout.ideal.IdealRecyclerView @@ -70,6 +72,7 @@ import com.adyen.checkout.sepa.SepaComponent import com.adyen.checkout.sepa.SepaConfiguration import com.adyen.checkout.sepa.SepaView import com.adyen.checkout.wechatpay.WeChatPayActionConfiguration +import com.adyen.checkout.wechatpay.WeChatPayProvider object ComponentParsingProvider { val TAG = LogUtil.getTag() @@ -143,38 +146,30 @@ internal fun checkComponentAvailability( val type = paymentMethod.type ?: throw CheckoutException("PaymentMethod type is null") - val provider = getProviderForType(type) - val configuration = dropInConfiguration.getConfigurationForPaymentMethod(type, application) + val availabilityCheck = getComponentAvailabilityCheckForType(type) + if (availabilityCheck == null) { + callback.onAvailabilityResult(true, paymentMethod, null) + return + } + val configuration = dropInConfiguration.getConfigurationForPaymentMethodOrNull(type, application) - provider.isAvailable(application, paymentMethod, configuration, callback) + availabilityCheck.isAvailable(application, paymentMethod, configuration, callback) } catch (e: CheckoutException) { Logger.e(ComponentParsingProvider.TAG, "Unable to initiate ${paymentMethod.type}", e) callback.onAvailabilityResult(false, paymentMethod, null) } } -@Suppress("ComplexMethod") -internal fun getProviderForType(type: String): PaymentComponentProvider, Configuration> { +/** + * Provides the [ComponentAvailabilityCheck] class for the specified [paymentMethodType], if available. + */ +internal fun getComponentAvailabilityCheckForType(paymentMethodType: String): ComponentAvailabilityCheck? { @Suppress("UNCHECKED_CAST") - return when (type) { - PaymentMethodTypes.BCMC -> BcmcComponent.PROVIDER - PaymentMethodTypes.BLIK -> BlikComponent.PROVIDER - PaymentMethodTypes.DOTPAY -> DotpayComponent.PROVIDER - PaymentMethodTypes.ENTERCASH -> EntercashComponent.PROVIDER - PaymentMethodTypes.EPS -> EPSComponent.PROVIDER - PaymentMethodTypes.GOOGLE_PAY -> GooglePayComponent.PROVIDER - PaymentMethodTypes.IDEAL -> IdealComponent.PROVIDER - PaymentMethodTypes.MB_WAY -> MBWayComponent.PROVIDER - PaymentMethodTypes.MOLPAY_THAILAND, - PaymentMethodTypes.MOLPAY_MALAYSIA, - PaymentMethodTypes.MOLPAY_VIETNAM -> MolpayComponent.PROVIDER - PaymentMethodTypes.OPEN_BANKING -> OpenBankingComponent.PROVIDER - PaymentMethodTypes.SCHEME -> CardComponent.PROVIDER - PaymentMethodTypes.SEPA -> SepaComponent.PROVIDER - else -> { - throw CheckoutException("Unable to find component for type - $type") - } - } as PaymentComponentProvider, Configuration> + return when (paymentMethodType) { + PaymentMethodTypes.GOOGLE_PAY -> GooglePayProvider() + PaymentMethodTypes.WECHAT_PAY_SDK -> WeChatPayProvider() + else -> null + } as ComponentAvailabilityCheck? } /** diff --git a/drop-in/src/main/java/com/adyen/checkout/dropin/DropInConfiguration.kt b/drop-in/src/main/java/com/adyen/checkout/dropin/DropInConfiguration.kt index 89346872fb..2b32f34070 100644 --- a/drop-in/src/main/java/com/adyen/checkout/dropin/DropInConfiguration.kt +++ b/drop-in/src/main/java/com/adyen/checkout/dropin/DropInConfiguration.kt @@ -103,6 +103,14 @@ class DropInConfiguration : Configuration, Parcelable { return ParcelUtils.NO_FILE_DESCRIPTOR } + internal fun getConfigurationForPaymentMethodOrNull(paymentMethod: String, context: Context): T? { + return try { + getConfigurationForPaymentMethod(paymentMethod, context) + } catch (e: CheckoutException) { + null + } + } + internal fun getConfigurationForPaymentMethod(paymentMethod: String, context: Context): T { return if (availablePaymentConfigs.containsKey(paymentMethod)) { @Suppress("UNCHECKED_CAST") diff --git a/drop-in/src/main/java/com/adyen/checkout/dropin/ui/paymentmethods/PaymentMethodsListViewModel.kt b/drop-in/src/main/java/com/adyen/checkout/dropin/ui/paymentmethods/PaymentMethodsListViewModel.kt index 0d6df4aa27..0ad5d954fa 100644 --- a/drop-in/src/main/java/com/adyen/checkout/dropin/ui/paymentmethods/PaymentMethodsListViewModel.kt +++ b/drop-in/src/main/java/com/adyen/checkout/dropin/ui/paymentmethods/PaymentMethodsListViewModel.kt @@ -84,8 +84,7 @@ class PaymentMethodsListViewModel( type == null -> { throw CheckoutException("PaymentMethod type is null") } - PaymentMethodTypes.SUPPORTED_PAYMENT_METHODS.contains(type) - && !PaymentMethodTypes.SUPPORTED_ACTION_ONLY_PAYMENT_METHODS.contains(type) -> { + PaymentMethodTypes.SUPPORTED_PAYMENT_METHODS.contains(type) -> { Logger.v(TAG, "Supported payment method: $type") // We assume payment method is available and remove it later when the callback comes // this is the overwhelming majority of cases, and we keep the list ordered this way. diff --git a/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayComponent.java b/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayComponent.java index 808f4240e5..54efbc4beb 100644 --- a/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayComponent.java +++ b/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayComponent.java @@ -14,7 +14,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.adyen.checkout.components.PaymentComponentProvider; import com.adyen.checkout.components.base.BasePaymentComponent; import com.adyen.checkout.components.base.GenericPaymentMethodDelegate; import com.adyen.checkout.components.model.paymentmethods.Configuration; @@ -37,7 +36,7 @@ public class GooglePayComponent extends BasePaymentComponent { private static final String TAG = LogUtil.getTag(); - public static final PaymentComponentProvider PROVIDER = new GooglePayProvider(); + public static final GooglePayProvider PROVIDER = new GooglePayProvider(); private static final String[] PAYMENT_METHOD_TYPES = {PaymentMethodTypes.GOOGLE_PAY}; From 88ac8e9b12ea2058378bbdff086018a9f6b29bee Mon Sep 17 00:00:00 2001 From: jreij Date: Mon, 17 May 2021 11:47:18 +0200 Subject: [PATCH 3/6] Removed unused classes --- .../checkout/components/base/EmptyInputData.java | 12 ------------ .../components/base/EmptyOutputData.java | 16 ---------------- 2 files changed, 28 deletions(-) delete mode 100644 components-core/src/main/java/com/adyen/checkout/components/base/EmptyInputData.java delete mode 100644 components-core/src/main/java/com/adyen/checkout/components/base/EmptyOutputData.java diff --git a/components-core/src/main/java/com/adyen/checkout/components/base/EmptyInputData.java b/components-core/src/main/java/com/adyen/checkout/components/base/EmptyInputData.java deleted file mode 100644 index 000265b408..0000000000 --- a/components-core/src/main/java/com/adyen/checkout/components/base/EmptyInputData.java +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) 2019 Adyen N.V. - * - * This file is open source and available under the MIT license. See the LICENSE file for more info. - * - * Created by caiof on 15/10/2019. - */ - -package com.adyen.checkout.components.base; - -public final class EmptyInputData implements InputData { -} diff --git a/components-core/src/main/java/com/adyen/checkout/components/base/EmptyOutputData.java b/components-core/src/main/java/com/adyen/checkout/components/base/EmptyOutputData.java deleted file mode 100644 index 2d79156c11..0000000000 --- a/components-core/src/main/java/com/adyen/checkout/components/base/EmptyOutputData.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) 2019 Adyen N.V. - * - * This file is open source and available under the MIT license. See the LICENSE file for more info. - * - * Created by caiof on 15/10/2019. - */ - -package com.adyen.checkout.components.base; - -public final class EmptyOutputData implements OutputData { - @Override - public boolean isValid() { - return true; - } -} From 5e87a6398bd9ac33de31b7f939809dddf8046c3b Mon Sep 17 00:00:00 2001 From: jreij Date: Tue, 18 May 2021 14:00:43 +0200 Subject: [PATCH 4/6] Replace Component naming with PaymentMethod as not all payment methods have components --- ...ityCheck.kt => PaymentMethodAvailabilityCheck.kt} | 6 +++--- .../checkout/dropin/ComponentParsingProvider.kt | 12 ++++++------ .../ui/paymentmethods/PaymentMethodsListViewModel.kt | 4 ++-- .../adyen/checkout/googlepay/GooglePayProvider.kt | 4 ++-- .../adyen/checkout/wechatpay/WeChatPayProvider.kt | 4 ++-- 5 files changed, 15 insertions(+), 15 deletions(-) rename components-core/src/main/java/com/adyen/checkout/components/{ComponentAvailabilityCheck.kt => PaymentMethodAvailabilityCheck.kt} (65%) diff --git a/components-core/src/main/java/com/adyen/checkout/components/ComponentAvailabilityCheck.kt b/components-core/src/main/java/com/adyen/checkout/components/PaymentMethodAvailabilityCheck.kt similarity index 65% rename from components-core/src/main/java/com/adyen/checkout/components/ComponentAvailabilityCheck.kt rename to components-core/src/main/java/com/adyen/checkout/components/PaymentMethodAvailabilityCheck.kt index e45f0d7fa9..5ef0982049 100644 --- a/components-core/src/main/java/com/adyen/checkout/components/ComponentAvailabilityCheck.kt +++ b/components-core/src/main/java/com/adyen/checkout/components/PaymentMethodAvailabilityCheck.kt @@ -12,11 +12,11 @@ import com.adyen.checkout.components.base.Configuration import com.adyen.checkout.components.model.paymentmethods.PaymentMethod /** - * Specifies whether a certain component is available for use with the provided parameters. + * Specifies whether a certain payment method is available for use with the provided parameters. * - * @param ConfigurationT The Configuration for the Component to be provided. Simply use [Configuration] if not applicable. + * @param ConfigurationT The Configuration for the Component corresponding to this payment method. Simply use [Configuration] if not applicable. */ -interface ComponentAvailabilityCheck { +interface PaymentMethodAvailabilityCheck { fun isAvailable( applicationContext: Application, paymentMethod: PaymentMethod, diff --git a/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt b/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt index bac43751db..30af9c2dba 100644 --- a/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt +++ b/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt @@ -23,7 +23,7 @@ import com.adyen.checkout.blik.BlikView import com.adyen.checkout.card.CardComponent import com.adyen.checkout.card.CardConfiguration import com.adyen.checkout.card.CardView -import com.adyen.checkout.components.ComponentAvailabilityCheck +import com.adyen.checkout.components.PaymentMethodAvailabilityCheck import com.adyen.checkout.components.ComponentAvailableCallback import com.adyen.checkout.components.ComponentView import com.adyen.checkout.components.PaymentComponent @@ -135,7 +135,7 @@ internal inline fun getDefaultConfigForAction( return builder.build() as T } -internal fun checkComponentAvailability( +internal fun checkPaymentMethodAvailability( application: Application, paymentMethod: PaymentMethod, dropInConfiguration: DropInConfiguration, @@ -146,7 +146,7 @@ internal fun checkComponentAvailability( val type = paymentMethod.type ?: throw CheckoutException("PaymentMethod type is null") - val availabilityCheck = getComponentAvailabilityCheckForType(type) + val availabilityCheck = getPaymentMethodAvailabilityCheck(type) if (availabilityCheck == null) { callback.onAvailabilityResult(true, paymentMethod, null) return @@ -161,15 +161,15 @@ internal fun checkComponentAvailability( } /** - * Provides the [ComponentAvailabilityCheck] class for the specified [paymentMethodType], if available. + * Provides the [PaymentMethodAvailabilityCheck] class for the specified [paymentMethodType], if available. */ -internal fun getComponentAvailabilityCheckForType(paymentMethodType: String): ComponentAvailabilityCheck? { +internal fun getPaymentMethodAvailabilityCheck(paymentMethodType: String): PaymentMethodAvailabilityCheck? { @Suppress("UNCHECKED_CAST") return when (paymentMethodType) { PaymentMethodTypes.GOOGLE_PAY -> GooglePayProvider() PaymentMethodTypes.WECHAT_PAY_SDK -> WeChatPayProvider() else -> null - } as ComponentAvailabilityCheck? + } as PaymentMethodAvailabilityCheck? } /** diff --git a/drop-in/src/main/java/com/adyen/checkout/dropin/ui/paymentmethods/PaymentMethodsListViewModel.kt b/drop-in/src/main/java/com/adyen/checkout/dropin/ui/paymentmethods/PaymentMethodsListViewModel.kt index 0ad5d954fa..b24dad8a0b 100644 --- a/drop-in/src/main/java/com/adyen/checkout/dropin/ui/paymentmethods/PaymentMethodsListViewModel.kt +++ b/drop-in/src/main/java/com/adyen/checkout/dropin/ui/paymentmethods/PaymentMethodsListViewModel.kt @@ -21,7 +21,7 @@ import com.adyen.checkout.core.exception.CheckoutException import com.adyen.checkout.core.log.LogUtil import com.adyen.checkout.core.log.Logger import com.adyen.checkout.dropin.DropInConfiguration -import com.adyen.checkout.dropin.checkComponentAvailability +import com.adyen.checkout.dropin.checkPaymentMethodAvailability import com.adyen.checkout.dropin.ui.stored.makeStoredModel class PaymentMethodsListViewModel( @@ -91,7 +91,7 @@ class PaymentMethodsListViewModel( paymentMethodsList.add( PaymentMethodModel(type, paymentMethod.name.orEmpty()) ) - checkComponentAvailability(getApplication(), paymentMethod, dropInConfiguration, this) + checkPaymentMethodAvailability(getApplication(), paymentMethod, dropInConfiguration, this) } else -> { availabilitySkipSum++ diff --git a/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayProvider.kt b/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayProvider.kt index 8c89aa06d3..28bb6825bf 100644 --- a/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayProvider.kt +++ b/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayProvider.kt @@ -10,7 +10,7 @@ package com.adyen.checkout.googlepay import android.app.Application import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStoreOwner -import com.adyen.checkout.components.ComponentAvailabilityCheck +import com.adyen.checkout.components.PaymentMethodAvailabilityCheck import com.adyen.checkout.components.ComponentAvailableCallback import com.adyen.checkout.components.PaymentComponentProvider import com.adyen.checkout.components.base.GenericPaymentMethodDelegate @@ -27,7 +27,7 @@ import com.google.android.gms.wallet.PaymentsClient import com.google.android.gms.wallet.Wallet import java.lang.ref.WeakReference -class GooglePayProvider : PaymentComponentProvider, ComponentAvailabilityCheck { +class GooglePayProvider : PaymentComponentProvider, PaymentMethodAvailabilityCheck { override operator fun get( viewModelStoreOwner: ViewModelStoreOwner, paymentMethod: PaymentMethod, diff --git a/wechatpay/src/main/java/com/adyen/checkout/wechatpay/WeChatPayProvider.kt b/wechatpay/src/main/java/com/adyen/checkout/wechatpay/WeChatPayProvider.kt index d559b9d950..27c16fcc79 100644 --- a/wechatpay/src/main/java/com/adyen/checkout/wechatpay/WeChatPayProvider.kt +++ b/wechatpay/src/main/java/com/adyen/checkout/wechatpay/WeChatPayProvider.kt @@ -9,7 +9,7 @@ package com.adyen.checkout.wechatpay import android.app.Application -import com.adyen.checkout.components.ComponentAvailabilityCheck +import com.adyen.checkout.components.PaymentMethodAvailabilityCheck import com.adyen.checkout.components.ComponentAvailableCallback import com.adyen.checkout.components.base.Configuration import com.adyen.checkout.components.model.paymentmethods.PaymentMethod @@ -20,7 +20,7 @@ import com.adyen.checkout.components.model.paymentmethods.PaymentMethod * You can directly call /payments after you receive a callback from [isAvailable]. * You can use [WeChatPayActionComponent] to handle the returned action. */ -class WeChatPayProvider : ComponentAvailabilityCheck { +class WeChatPayProvider : PaymentMethodAvailabilityCheck { override fun isAvailable( applicationContext: Application, From 119a332a036289f05e48aa8a89c2f3ed60d88249 Mon Sep 17 00:00:00 2001 From: jreij Date: Tue, 18 May 2021 14:03:23 +0200 Subject: [PATCH 5/6] Replace null PaymentMethodAvailabilityCheck with AlwaysAvailablePaymentMethod --- .../AlwaysAvailablePaymentMethod.kt | 25 +++++++++++++++++++ .../dropin/ComponentParsingProvider.kt | 11 +++----- 2 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 components-core/src/main/java/com/adyen/checkout/components/AlwaysAvailablePaymentMethod.kt diff --git a/components-core/src/main/java/com/adyen/checkout/components/AlwaysAvailablePaymentMethod.kt b/components-core/src/main/java/com/adyen/checkout/components/AlwaysAvailablePaymentMethod.kt new file mode 100644 index 0000000000..bf5b06b75a --- /dev/null +++ b/components-core/src/main/java/com/adyen/checkout/components/AlwaysAvailablePaymentMethod.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2021 Adyen N.V. + * + * This file is open source and available under the MIT license. See the LICENSE file for more info. + * + * Created by josephj on 18/5/2021. + */ + +package com.adyen.checkout.components + +import android.app.Application +import com.adyen.checkout.components.base.Configuration +import com.adyen.checkout.components.model.paymentmethods.PaymentMethod + +class AlwaysAvailablePaymentMethod : PaymentMethodAvailabilityCheck { + + override fun isAvailable( + applicationContext: Application, + paymentMethod: PaymentMethod, + configuration: Configuration?, + callback: ComponentAvailableCallback + ) { + callback.onAvailabilityResult(true, paymentMethod, configuration) + } +} diff --git a/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt b/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt index 30af9c2dba..6fddf5318f 100644 --- a/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt +++ b/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt @@ -23,6 +23,7 @@ import com.adyen.checkout.blik.BlikView import com.adyen.checkout.card.CardComponent import com.adyen.checkout.card.CardConfiguration import com.adyen.checkout.card.CardView +import com.adyen.checkout.components.AlwaysAvailablePaymentMethod import com.adyen.checkout.components.PaymentMethodAvailabilityCheck import com.adyen.checkout.components.ComponentAvailableCallback import com.adyen.checkout.components.ComponentView @@ -147,10 +148,6 @@ internal fun checkPaymentMethodAvailability( val type = paymentMethod.type ?: throw CheckoutException("PaymentMethod type is null") val availabilityCheck = getPaymentMethodAvailabilityCheck(type) - if (availabilityCheck == null) { - callback.onAvailabilityResult(true, paymentMethod, null) - return - } val configuration = dropInConfiguration.getConfigurationForPaymentMethodOrNull(type, application) availabilityCheck.isAvailable(application, paymentMethod, configuration, callback) @@ -163,13 +160,13 @@ internal fun checkPaymentMethodAvailability( /** * Provides the [PaymentMethodAvailabilityCheck] class for the specified [paymentMethodType], if available. */ -internal fun getPaymentMethodAvailabilityCheck(paymentMethodType: String): PaymentMethodAvailabilityCheck? { +internal fun getPaymentMethodAvailabilityCheck(paymentMethodType: String): PaymentMethodAvailabilityCheck { @Suppress("UNCHECKED_CAST") return when (paymentMethodType) { PaymentMethodTypes.GOOGLE_PAY -> GooglePayProvider() PaymentMethodTypes.WECHAT_PAY_SDK -> WeChatPayProvider() - else -> null - } as PaymentMethodAvailabilityCheck? + else -> AlwaysAvailablePaymentMethod() + } as PaymentMethodAvailabilityCheck } /** From 077b3b9ee83a2854ba4228e4a2a74fcd1b6d5d81 Mon Sep 17 00:00:00 2001 From: jreij Date: Tue, 18 May 2021 15:24:16 +0200 Subject: [PATCH 6/6] Code checks --- .../com/adyen/checkout/dropin/ComponentParsingProvider.kt | 2 +- .../java/com/adyen/checkout/googlepay/GooglePayProvider.kt | 6 ++++-- .../java/com/adyen/checkout/wechatpay/WeChatPayProvider.kt | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt b/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt index 6fddf5318f..8f7ece6282 100644 --- a/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt +++ b/drop-in/src/main/java/com/adyen/checkout/dropin/ComponentParsingProvider.kt @@ -24,12 +24,12 @@ import com.adyen.checkout.card.CardComponent import com.adyen.checkout.card.CardConfiguration import com.adyen.checkout.card.CardView import com.adyen.checkout.components.AlwaysAvailablePaymentMethod -import com.adyen.checkout.components.PaymentMethodAvailabilityCheck import com.adyen.checkout.components.ComponentAvailableCallback import com.adyen.checkout.components.ComponentView import com.adyen.checkout.components.PaymentComponent import com.adyen.checkout.components.PaymentComponentProvider import com.adyen.checkout.components.PaymentComponentState +import com.adyen.checkout.components.PaymentMethodAvailabilityCheck import com.adyen.checkout.components.ViewableComponent import com.adyen.checkout.components.base.BaseConfigurationBuilder import com.adyen.checkout.components.base.Configuration diff --git a/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayProvider.kt b/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayProvider.kt index 28bb6825bf..aae7e050f7 100644 --- a/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayProvider.kt +++ b/googlepay/src/main/java/com/adyen/checkout/googlepay/GooglePayProvider.kt @@ -10,9 +10,9 @@ package com.adyen.checkout.googlepay import android.app.Application import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStoreOwner -import com.adyen.checkout.components.PaymentMethodAvailabilityCheck import com.adyen.checkout.components.ComponentAvailableCallback import com.adyen.checkout.components.PaymentComponentProvider +import com.adyen.checkout.components.PaymentMethodAvailabilityCheck import com.adyen.checkout.components.base.GenericPaymentMethodDelegate import com.adyen.checkout.components.base.lifecycle.viewModelFactory import com.adyen.checkout.components.model.paymentmethods.PaymentMethod @@ -27,7 +27,9 @@ import com.google.android.gms.wallet.PaymentsClient import com.google.android.gms.wallet.Wallet import java.lang.ref.WeakReference -class GooglePayProvider : PaymentComponentProvider, PaymentMethodAvailabilityCheck { +class GooglePayProvider : + PaymentComponentProvider, + PaymentMethodAvailabilityCheck { override operator fun get( viewModelStoreOwner: ViewModelStoreOwner, paymentMethod: PaymentMethod, diff --git a/wechatpay/src/main/java/com/adyen/checkout/wechatpay/WeChatPayProvider.kt b/wechatpay/src/main/java/com/adyen/checkout/wechatpay/WeChatPayProvider.kt index 27c16fcc79..645077ad44 100644 --- a/wechatpay/src/main/java/com/adyen/checkout/wechatpay/WeChatPayProvider.kt +++ b/wechatpay/src/main/java/com/adyen/checkout/wechatpay/WeChatPayProvider.kt @@ -9,8 +9,8 @@ package com.adyen.checkout.wechatpay import android.app.Application -import com.adyen.checkout.components.PaymentMethodAvailabilityCheck import com.adyen.checkout.components.ComponentAvailableCallback +import com.adyen.checkout.components.PaymentMethodAvailabilityCheck import com.adyen.checkout.components.base.Configuration import com.adyen.checkout.components.model.paymentmethods.PaymentMethod