diff --git a/cashapppay/src/main/java/com/adyen/checkout/cashapppay/internal/ui/CashAppPayViewProvider.kt b/cashapppay/src/main/java/com/adyen/checkout/cashapppay/internal/ui/CashAppPayViewProvider.kt index 276e753083..ff42afd501 100644 --- a/cashapppay/src/main/java/com/adyen/checkout/cashapppay/internal/ui/CashAppPayViewProvider.kt +++ b/cashapppay/src/main/java/com/adyen/checkout/cashapppay/internal/ui/CashAppPayViewProvider.kt @@ -10,12 +10,15 @@ package com.adyen.checkout.cashapppay.internal.ui import android.content.Context import android.util.AttributeSet +import com.adyen.checkout.cashapppay.internal.ui.view.CashAppPayButtonView import com.adyen.checkout.cashapppay.internal.ui.view.CashAppPayView import com.adyen.checkout.cashapppay.internal.ui.view.CashAppPayWaitingView import com.adyen.checkout.ui.core.internal.ui.ButtonComponentViewType +import com.adyen.checkout.ui.core.internal.ui.ButtonViewProvider import com.adyen.checkout.ui.core.internal.ui.ComponentView import com.adyen.checkout.ui.core.internal.ui.ComponentViewType import com.adyen.checkout.ui.core.internal.ui.ViewProvider +import com.adyen.checkout.ui.core.internal.ui.view.PayButton internal object CashAppPayViewProvider : ViewProvider { @@ -31,7 +34,15 @@ internal object CashAppPayViewProvider : ViewProvider { } } +internal class CashAppPayButtonViewProvider : ButtonViewProvider { + override fun getButton(context: Context, attrs: AttributeSet?, defStyleAttr: Int): PayButton = + CashAppPayButtonView(context, attrs, defStyleAttr) +} + internal object CashAppPayComponentViewType : ButtonComponentViewType { + + override val buttonViewProvider: ButtonViewProvider get() = CashAppPayButtonViewProvider() + override val viewProvider: ViewProvider = CashAppPayViewProvider override val buttonTextResId: Int = ButtonComponentViewType.DEFAULT_BUTTON_TEXT_RES_ID diff --git a/cashapppay/src/main/java/com/adyen/checkout/cashapppay/internal/ui/view/CashAppPayButtonView.kt b/cashapppay/src/main/java/com/adyen/checkout/cashapppay/internal/ui/view/CashAppPayButtonView.kt new file mode 100644 index 0000000000..77ae87dc89 --- /dev/null +++ b/cashapppay/src/main/java/com/adyen/checkout/cashapppay/internal/ui/view/CashAppPayButtonView.kt @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2023 Adyen N.V. + * + * This file is open source and available under the MIT license. See the LICENSE file for more info. + * + * Created by oscars on 30/6/2023. + */ + +package com.adyen.checkout.cashapppay.internal.ui.view + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import com.adyen.checkout.cashapppay.databinding.CashAppPayButtonViewBinding +import com.adyen.checkout.ui.core.internal.ui.view.PayButton + +internal class CashAppPayButtonView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : PayButton(context, attrs, defStyleAttr) { + + private val binding = CashAppPayButtonViewBinding.inflate(LayoutInflater.from(context), this) + + override fun setOnClickListener(listener: OnClickListener?) { + binding.payButton.setOnClickListener(listener) + } + + override fun setText(text: String?) = Unit +} diff --git a/cashapppay/src/main/res/layout-night/cash_app_pay_button_view.xml b/cashapppay/src/main/res/layout-night/cash_app_pay_button_view.xml new file mode 100644 index 0000000000..08061bf235 --- /dev/null +++ b/cashapppay/src/main/res/layout-night/cash_app_pay_button_view.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/cashapppay/src/main/res/layout/cash_app_pay_button_view.xml b/cashapppay/src/main/res/layout/cash_app_pay_button_view.xml new file mode 100644 index 0000000000..d1a8f65f82 --- /dev/null +++ b/cashapppay/src/main/res/layout/cash_app_pay_button_view.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/ui-core/src/main/java/com/adyen/checkout/ui/core/AdyenComponentView.kt b/ui-core/src/main/java/com/adyen/checkout/ui/core/AdyenComponentView.kt index fbf0a93fc4..f3e86d9530 100644 --- a/ui-core/src/main/java/com/adyen/checkout/ui/core/AdyenComponentView.kt +++ b/ui-core/src/main/java/com/adyen/checkout/ui/core/AdyenComponentView.kt @@ -11,8 +11,8 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.view.MotionEvent -import android.widget.Button import android.widget.LinearLayout +import androidx.core.view.children import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.lifecycle.LifecycleOwner @@ -32,6 +32,7 @@ import com.adyen.checkout.ui.core.internal.ui.PaymentComponentUIEvent import com.adyen.checkout.ui.core.internal.ui.UIStateDelegate import com.adyen.checkout.ui.core.internal.ui.ViewProvidingDelegate import com.adyen.checkout.ui.core.internal.ui.ViewableComponent +import com.adyen.checkout.ui.core.internal.ui.view.PayButton import com.adyen.checkout.ui.core.internal.util.PayButtonFormatter import com.adyen.checkout.ui.core.internal.util.createLocalizedContext import com.adyen.checkout.ui.core.internal.util.hideKeyboard @@ -123,8 +124,6 @@ class AdyenComponentView @JvmOverloads constructor( val localizedContext = context.createLocalizedContext(componentParams.shopperLocale) - binding.payButton.setText(viewType, componentParams, localizedContext) - val view = componentView.getView() binding.frameLayoutComponentContainer.addView(view) view.updateLayoutParams { width = LayoutParams.MATCH_PARENT } @@ -144,20 +143,23 @@ class AdyenComponentView @JvmOverloads constructor( } }?.launchIn(coroutineScope) - binding.payButton.isVisible = buttonDelegate.shouldShowSubmitButton() - binding.payButton.setOnClickListener { + binding.frameLayoutButtonContainer.isVisible = buttonDelegate.shouldShowSubmitButton() + val buttonView = (viewType as ButtonComponentViewType) + .buttonViewProvider.getButton(context, attrs, defStyleAttr) + buttonView.setText(viewType, componentParams, localizedContext) + buttonView.setOnClickListener { buttonDelegate.onSubmit() } + binding.frameLayoutButtonContainer.addView(buttonView) } else { - binding.payButton.isVisible = false - binding.payButton.setOnClickListener(null) + binding.frameLayoutButtonContainer.isVisible = false } } private fun setInteractionBlocked(isInteractionBlocked: Boolean) { this.isInteractionBlocked = isInteractionBlocked - binding.payButton.isEnabled = !isInteractionBlocked + binding.frameLayoutButtonContainer.children.forEach { it.isEnabled = !isInteractionBlocked } if (isInteractionBlocked) { resetFocus() @@ -165,21 +167,30 @@ class AdyenComponentView @JvmOverloads constructor( } } - private fun Button.setText( + private fun PayButton.setText( viewType: ComponentViewType, componentParams: ComponentParams, localizedContext: Context ) { - if (viewType is AmountButtonComponentViewType) { - text = PayButtonFormatter.getPayButtonText( - amount = componentParams.amount, - locale = componentParams.shopperLocale, - localizedContext = localizedContext, - emptyAmountStringResId = viewType.buttonTextResId - ) - } else if (viewType is ButtonComponentViewType) { - text = localizedContext.getString(viewType.buttonTextResId) + val text = when (viewType) { + is AmountButtonComponentViewType -> { + PayButtonFormatter.getPayButtonText( + amount = componentParams.amount, + locale = componentParams.shopperLocale, + localizedContext = localizedContext, + emptyAmountStringResId = viewType.buttonTextResId + ) + } + + is ButtonComponentViewType -> { + localizedContext.getString(viewType.buttonTextResId) + } + + else -> { + null + } } + setText(text) } /** diff --git a/ui-core/src/main/java/com/adyen/checkout/ui/core/internal/ui/ButtonViewProvider.kt b/ui-core/src/main/java/com/adyen/checkout/ui/core/internal/ui/ButtonViewProvider.kt new file mode 100644 index 0000000000..a9ab1f17c7 --- /dev/null +++ b/ui-core/src/main/java/com/adyen/checkout/ui/core/internal/ui/ButtonViewProvider.kt @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2023 Adyen N.V. + * + * This file is open source and available under the MIT license. See the LICENSE file for more info. + * + * Created by oscars on 30/6/2023. + */ + +package com.adyen.checkout.ui.core.internal.ui + +import android.content.Context +import android.util.AttributeSet +import androidx.annotation.RestrictTo +import com.adyen.checkout.ui.core.internal.ui.view.DefaultPayButton +import com.adyen.checkout.ui.core.internal.ui.view.PayButton + +@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) +interface ButtonViewProvider { + fun getButton( + context: Context, + attrs: AttributeSet?, + defStyleAttr: Int, + ): PayButton +} + +internal class DefaultButtonViewProvider : ButtonViewProvider { + + override fun getButton(context: Context, attrs: AttributeSet?, defStyleAttr: Int): PayButton = + DefaultPayButton(context, attrs, defStyleAttr) +} diff --git a/ui-core/src/main/java/com/adyen/checkout/ui/core/internal/ui/ComponentViewType.kt b/ui-core/src/main/java/com/adyen/checkout/ui/core/internal/ui/ComponentViewType.kt index 258a75f8e2..fc71b37a40 100644 --- a/ui-core/src/main/java/com/adyen/checkout/ui/core/internal/ui/ComponentViewType.kt +++ b/ui-core/src/main/java/com/adyen/checkout/ui/core/internal/ui/ComponentViewType.kt @@ -19,6 +19,9 @@ interface ComponentViewType { @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) interface ButtonComponentViewType : ComponentViewType { + + val buttonViewProvider: ButtonViewProvider get() = DefaultButtonViewProvider() + val buttonTextResId: Int @StringRes get diff --git a/ui-core/src/main/java/com/adyen/checkout/ui/core/internal/ui/view/DefaultPayButton.kt b/ui-core/src/main/java/com/adyen/checkout/ui/core/internal/ui/view/DefaultPayButton.kt new file mode 100644 index 0000000000..46e89df7b9 --- /dev/null +++ b/ui-core/src/main/java/com/adyen/checkout/ui/core/internal/ui/view/DefaultPayButton.kt @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2023 Adyen N.V. + * + * This file is open source and available under the MIT license. See the LICENSE file for more info. + * + * Created by oscars on 30/6/2023. + */ + +package com.adyen.checkout.ui.core.internal.ui.view + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import com.adyen.checkout.ui.core.databinding.DefaultPayButtonViewBinding + +internal class DefaultPayButton @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : PayButton(context, attrs, defStyleAttr) { + + private val binding = DefaultPayButtonViewBinding.inflate(LayoutInflater.from(context), this) + + override fun setOnClickListener(listener: OnClickListener?) { + binding.payButton.setOnClickListener(listener) + } + + override fun setText(text: String?) { + binding.payButton.text = text + } +} diff --git a/ui-core/src/main/java/com/adyen/checkout/ui/core/internal/ui/view/PayButton.kt b/ui-core/src/main/java/com/adyen/checkout/ui/core/internal/ui/view/PayButton.kt new file mode 100644 index 0000000000..4ed202cd71 --- /dev/null +++ b/ui-core/src/main/java/com/adyen/checkout/ui/core/internal/ui/view/PayButton.kt @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2023 Adyen N.V. + * + * This file is open source and available under the MIT license. See the LICENSE file for more info. + * + * Created by oscars on 30/6/2023. + */ + +package com.adyen.checkout.ui.core.internal.ui.view + +import android.content.Context +import android.util.AttributeSet +import android.widget.FrameLayout +import androidx.annotation.RestrictTo + +@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) +abstract class PayButton( + context: Context, + attrs: AttributeSet?, + defStyleAttr: Int, +) : FrameLayout(context, attrs, defStyleAttr) { + + abstract override fun setOnClickListener(listener: OnClickListener?) + + abstract fun setText(text: String?) +} diff --git a/ui-core/src/main/res/layout/adyen_component_view.xml b/ui-core/src/main/res/layout/adyen_component_view.xml index ada6f324da..5e616eda3a 100644 --- a/ui-core/src/main/res/layout/adyen_component_view.xml +++ b/ui-core/src/main/res/layout/adyen_component_view.xml @@ -19,10 +19,11 @@ android:layout_height="0dp" android:layout_weight="1" /> - + diff --git a/ui-core/src/main/res/layout/default_pay_button_view.xml b/ui-core/src/main/res/layout/default_pay_button_view.xml new file mode 100644 index 0000000000..6c0c8a142e --- /dev/null +++ b/ui-core/src/main/res/layout/default_pay_button_view.xml @@ -0,0 +1,18 @@ + + + + +