From f5300247fba9c56a9b9c57cc48a8cb8ae63cf97e Mon Sep 17 00:00:00 2001
From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com>
Date: Fri, 19 Jul 2024 11:21:56 -0400
Subject: [PATCH 1/7] feat: add modal
---
.../com/paypal/messagesdemo/XmlActivity.kt | 36 ++
demo/src/main/res/layout/activity_message.xml | 8 +-
demo/src/main/res/values/strings.xml | 3 +-
.../messages/PayPalMessagesModalView.kt | 328 ++++++++++++++++++
.../config/modal/PayPalMessagesModalConfig.kt | 30 ++
library/src/main/res/values/attrs.xml | 39 ++-
6 files changed, 433 insertions(+), 11 deletions(-)
create mode 100644 library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt
create mode 100644 library/src/main/java/com/paypal/messages/config/modal/PayPalMessagesModalConfig.kt
diff --git a/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt b/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
index 5a44eca0..fddc7263 100644
--- a/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
+++ b/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
@@ -5,10 +5,12 @@ import android.util.Log
import android.view.View
import android.view.ViewGroup.LayoutParams
import android.widget.EditText
+import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.ui.graphics.Color
import com.paypal.messages.PayPalMessageView
+import com.paypal.messages.PayPalMessagesModalView
import com.paypal.messages.config.PayPalEnvironment
import com.paypal.messages.config.PayPalMessageOfferType
import com.paypal.messages.config.PayPalMessagePageType
@@ -18,6 +20,7 @@ import com.paypal.messages.config.message.PayPalMessageViewStateCallbacks
import com.paypal.messages.config.message.style.PayPalMessageAlignment
import com.paypal.messages.config.message.style.PayPalMessageColor
import com.paypal.messages.config.message.style.PayPalMessageLogoType
+import com.paypal.messages.config.modal.PayPalMessagesModalConfig
import com.paypal.messages.io.Api
import com.paypal.messagesdemo.databinding.ActivityMessageBinding
@@ -35,6 +38,17 @@ class XmlActivity : AppCompatActivity() {
binding = ActivityMessageBinding.inflate(layoutInflater)
setContentView(binding.root)
+ val modalConfig = PayPalMessagesModalConfig(
+ clientID = getString(R.string.client_id),
+ amount = 300.0,
+ offerType = PayPalMessageOfferType.PAY_LATER_LONG_TERM,
+ )
+ val modal = PayPalMessagesModalView(context = this, config = modalConfig)
+ val messagesModalText = binding.messagesModalText
+ messagesModalText.setOnClickListener {
+ modal.show()
+ }
+
val messageWrapper = binding.messageWrapper
val progressBar = binding.progressBar
val resetButton = binding.reset
@@ -205,5 +219,27 @@ class XmlActivity : AppCompatActivity() {
message.onLoading = {}
message.onSuccess = {}
message.onError = {}
+
+ val modalConfig = PayPalMessagesModalConfig(clientID = "someClientID")
+ val modal = PayPalMessagesModalView(context = this, config = modalConfig)
+ modal.getConfig()
+ modal.setConfig(modalConfig)
+ modal.environment = PayPalEnvironment.SANDBOX
+ modal.clientID = ""
+ modal.merchantID = ""
+ modal.partnerAttributionID = ""
+ modal.onClick = {}
+ modal.onApply = {}
+ modal.onLoading = {}
+ modal.onSuccess = {}
+ modal.onError = {}
+ modal.onCalculate = {}
+ modal.onShow = {}
+ modal.onClose = {}
+
+ val textView = TextView(this)
+ textView.setOnClickListener {
+ modal.show()
+ }
}
}
diff --git a/demo/src/main/res/layout/activity_message.xml b/demo/src/main/res/layout/activity_message.xml
index cbe48de6..45223a3a 100644
--- a/demo/src/main/res/layout/activity_message.xml
+++ b/demo/src/main/res/layout/activity_message.xml
@@ -136,7 +136,7 @@
android:id="@+id/offerTypeLabel"
android:paddingTop="12dp"
android:paddingBottom="12dp"
- android:layout_marginRight="12dp"
+ android:layout_marginEnd="12dp"
android:textStyle="bold"
android:textSize="16sp"/>
+
+
diff --git a/demo/src/main/res/values/strings.xml b/demo/src/main/res/values/strings.xml
index d369785b..99a10e0c 100644
--- a/demo/src/main/res/values/strings.xml
+++ b/demo/src/main/res/values/strings.xml
@@ -1,5 +1,6 @@
-
+
Message Configuration
Kotlin PayPal Message
Reset
+ Click here for a modal
diff --git a/library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt b/library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt
new file mode 100644
index 00000000..b9eb1afa
--- /dev/null
+++ b/library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt
@@ -0,0 +1,328 @@
+package com.paypal.messages
+
+import android.content.Context
+import android.content.res.TypedArray
+import android.util.AttributeSet
+import android.widget.FrameLayout
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.res.getFloatOrThrow
+import androidx.core.content.res.getIntOrThrow
+import androidx.core.content.res.use
+import com.paypal.messages.analytics.AnalyticsComponent
+import com.paypal.messages.analytics.AnalyticsEvent
+import com.paypal.messages.analytics.AnalyticsLogger
+import com.paypal.messages.config.PayPalEnvironment
+import com.paypal.messages.config.PayPalMessageOfferType
+import com.paypal.messages.config.modal.ModalCloseButton
+import com.paypal.messages.config.modal.ModalConfig
+import com.paypal.messages.config.modal.ModalEvents
+import com.paypal.messages.io.Api
+import com.paypal.messages.io.ApiResult
+import com.paypal.messages.io.OnActionCompleted
+import com.paypal.messages.utils.LogCat
+import com.paypal.messages.utils.PayPalErrors
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import java.util.UUID
+import kotlin.coroutines.CoroutineContext
+import com.paypal.messages.config.modal.PayPalMessagesModalConfig as MessagesModalConfig
+
+/**
+ * PayPalMessagesModal is a component that provides the merchant with the option to attach a modal
+ * to their own content with different pay later products offered by PayPal.
+ * The content and information is based on the provided fields.
+ * Interacting with their content will show more information about the
+ * product itself and the option to apply
+ */
+class PayPalMessagesModalView @JvmOverloads constructor(
+ context: Context,
+ attributeSet: AttributeSet? = null,
+ defStyleAttr: Int = 0,
+ config: MessagesModalConfig = MessagesModalConfig(clientID = ""),
+) : FrameLayout(context, attributeSet, defStyleAttr), OnActionCompleted {
+ private val TAG = "PayPalMessagesModalView"
+ private var instanceId = UUID.randomUUID()
+
+ fun getConfig(): MessagesModalConfig {
+ return MessagesModalConfig(
+ clientID = this.clientID,
+ merchantID = this.merchantID,
+ partnerAttributionID = this.partnerAttributionID,
+ amount = this.amount,
+ buyerCountry = this.buyerCountry,
+ offerType = this.offerType,
+ environment = this.environment ?: PayPalEnvironment.SANDBOX,
+ callbacks = ModalEvents(
+ this.onClick,
+ this.onApply,
+ this.onLoading,
+ this.onSuccess,
+ this.onError,
+ this.onCalculate,
+ this.onShow,
+ this.onClose,
+ ),
+ )
+ }
+
+ fun setConfig(config: MessagesModalConfig) {
+ clientID = config.clientID
+ merchantID = config.merchantID
+ partnerAttributionID = config.partnerAttributionID
+ amount = config.amount
+ buyerCountry = config.buyerCountry
+ offerType = config.offerType
+ onClick = config.callbacks?.onClick ?: {}
+ onApply = config.callbacks?.onApply ?: {}
+ onLoading = config.callbacks?.onLoading ?: {}
+ onSuccess = config.callbacks?.onSuccess ?: {}
+ onError = config.callbacks?.onError ?: {}
+ onCalculate = config.callbacks?.onCalculate ?: {}
+ onShow = config.callbacks?.onShow ?: {}
+ onClose = config.callbacks?.onClose ?: {}
+ debounceUpdateContent(Unit)
+ }
+
+ private fun debounce(
+ delayMs: Long = 1L,
+ coroutineContext: CoroutineContext = Dispatchers.Main,
+ callback: (T) -> Unit,
+ ): (T) -> Unit {
+ var debounceJob: Job? = null
+ return { param: T ->
+ if (debounceJob?.isCompleted != false) {
+ debounceJob = CoroutineScope(coroutineContext).launch {
+ delay(delayMs)
+ callback(param)
+ }
+ }
+ }
+ }
+
+ // This must be above the set methods to prevent errors when using XML attributes
+ val debounceUpdateContent = debounce { }
+
+ var clientID: String = config.clientID
+ set(arg) {
+ if (arg === "") LogCat.error(TAG, "ClientID is an empty string")
+ if (field != arg) {
+ field = arg
+ debounceUpdateContent(Unit)
+ }
+ }
+ var merchantID: String? = config.merchantID
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ debounceUpdateContent(Unit)
+ }
+ }
+ var partnerAttributionID: String? = config.partnerAttributionID
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ debounceUpdateContent(Unit)
+ }
+ }
+ var amount: Double? = config.amount
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ debounceUpdateContent(Unit)
+ }
+ }
+ var buyerCountry: String? = config.buyerCountry
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ debounceUpdateContent(Unit)
+ }
+ }
+ var offerType: PayPalMessageOfferType? = config.offerType
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ debounceUpdateContent(Unit)
+ }
+ }
+ var environment: PayPalEnvironment? = config.environment
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ Api.env = arg ?: PayPalEnvironment.SANDBOX
+ debounceUpdateContent(Unit)
+ }
+ }
+
+ // CALLBACKS
+ var onClick: () -> Unit = config.callbacks?.onClick ?: {}
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ debounceUpdateContent(Unit)
+ }
+ }
+ var onApply: () -> Unit = config.callbacks?.onApply ?: {}
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ debounceUpdateContent(Unit)
+ }
+ }
+ var onLoading: () -> Unit = config.callbacks?.onLoading ?: {}
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ debounceUpdateContent(Unit)
+ }
+ }
+ var onSuccess: () -> Unit = config.callbacks?.onSuccess ?: {}
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ debounceUpdateContent(Unit)
+ }
+ }
+ var onError: (error: PayPalErrors.Base) -> Unit = config.callbacks?.onError ?: {}
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ debounceUpdateContent(Unit)
+ }
+ }
+ var onCalculate: () -> Unit = config.callbacks?.onCalculate ?: {}
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ debounceUpdateContent(Unit)
+ }
+ }
+ var onShow: () -> Unit = config.callbacks?.onShow ?: {}
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ debounceUpdateContent(Unit)
+ }
+ }
+ var onClose: () -> Unit = config.callbacks?.onClose ?: {}
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ debounceUpdateContent(Unit)
+ }
+ }
+
+ private var modal: ModalFragment? = null
+
+ init {
+ context.obtainStyledAttributes(attributeSet, R.styleable.PayPalMessagesModalView).use { typedArray ->
+ updateFromAttributes(typedArray)
+ }
+ if (config.clientID === "") LogCat.error(TAG, "ClientID is an empty string")
+ }
+
+ fun show() {
+ val modal = modal ?: run {
+ val modal = ModalFragment(clientID)
+ // Build modal config
+ val modalConfig = ModalConfig(
+ amount = this.amount,
+ buyerCountry = this.buyerCountry,
+ offer = this.offerType,
+ ignoreCache = false,
+ devTouchpoint = false,
+ stageTag = null,
+ events = ModalEvents(
+ onApply = this.onApply,
+ onClick = this.onClick,
+ onError = this.onError,
+ ),
+ modalCloseButton = ModalCloseButton(),
+ )
+
+ modal.init(modalConfig)
+ modal.show((context as AppCompatActivity).supportFragmentManager, modal.tag)
+
+ this.modal = modal
+
+ modal
+ }
+
+ // modal.show() above will display the modal on initial view, but if the user closes the modal
+ // it will become visually hidden and this method will re-display the modal without
+ // attempting to reattach it
+ // the delay prevents noticeable shift when the offer type is changed
+// handler.postDelayed({
+ modal.expand()
+// }, 250)
+ }
+
+ override fun onDetachedFromWindow() {
+ super.onDetachedFromWindow()
+ // The modal will not dismiss (destroy) itself, it will only hide/show when opening and closing
+ // so we need to cleanup the modal instance if the message is removed
+ this.modal?.dismiss()
+ }
+
+ /**
+ * This function will update the local config related values based on what is provided from the [PayPalMessageView] xml custom view.
+ */
+ private fun updateFromAttributes(typedArray: TypedArray) {
+ if (typedArray.hasValue(R.styleable.PayPalMessagesModalView_paypal_client_id)) {
+ clientID = typedArray.getString(R.styleable.PayPalMessagesModalView_paypal_client_id).toString()
+ }
+
+ if (typedArray.hasValue(R.styleable.PayPalMessagesModalView_paypal_amount)) {
+ amount = try {
+ typedArray.getFloatOrThrow(R.styleable.PayPalMessagesModalView_paypal_amount).toDouble()
+ }
+ catch (ex: Exception) {
+ LogCat.error(TAG, "Error parsing amount attribute")
+ null
+ }
+ }
+
+ if (typedArray.hasValue(R.styleable.PayPalMessagesModalView_paypal_offer_type)) {
+ offerType = try {
+ PayPalMessageOfferType(typedArray.getIntOrThrow(R.styleable.PayPalMessagesModalView_paypal_offer_type))
+ }
+ catch (ex: Exception) {
+ LogCat.error(TAG, "Error parsing offer_type attribute")
+ null
+ }
+ }
+ }
+
+ override fun onActionCompleted(result: ApiResult) {
+ when (result) {
+ is ApiResult.Success<*> -> {
+ LogCat.debug(TAG, "onActionCompleted Success")
+ }
+
+ is ApiResult.Failure<*> -> {
+ LogCat.debug(TAG, "onActionCompleted Failure")
+ // If we encountered a failure, we expect an exception to be returned.
+ result.error?.let { this.onError(it) }
+ }
+ }
+ }
+
+ @Suppress("unused")
+ private fun logEvent(event: AnalyticsEvent) {
+ val component = AnalyticsComponent(
+ offerType = this.offerType,
+ amount = this.amount.toString(),
+ buyerCountryCode = this.buyerCountry,
+ instanceId = this.instanceId.toString(),
+ originatingInstanceId = Api.originatingInstanceId.toString(),
+ // TODO: what type to use
+// type = ComponentType.MESSAGE.toString(),
+ componentEvents = mutableListOf(event),
+ )
+
+ AnalyticsLogger.getInstance(clientId = clientID).log(context, component)
+ }
+}
diff --git a/library/src/main/java/com/paypal/messages/config/modal/PayPalMessagesModalConfig.kt b/library/src/main/java/com/paypal/messages/config/modal/PayPalMessagesModalConfig.kt
new file mode 100644
index 00000000..be7e2881
--- /dev/null
+++ b/library/src/main/java/com/paypal/messages/config/modal/PayPalMessagesModalConfig.kt
@@ -0,0 +1,30 @@
+package com.paypal.messages.config.modal
+
+import com.paypal.messages.config.PayPalMessageOfferType
+import com.paypal.messages.io.Api
+import com.paypal.messages.config.PayPalEnvironment as Environment
+
+/**
+ * [PayPalMessagesModalConfig] is the main configuration model for interacting with the PayPalMessage component
+ * @param callbacks model with callbacks used to track the modal's display and interaction
+ */
+data class PayPalMessagesModalConfig(
+ // These top level data fields are the only place where ID in caps is allowed
+ // Everywhere else follows the camelcase convention of using "Id" since it is a "word" in code
+ var clientID: String,
+ var merchantID: String? = null,
+ var partnerAttributionID: String? = null,
+ var amount: Double? = null,
+ var buyerCountry: String? = null,
+ var callbacks: ModalEvents? = null,
+ var offerType: PayPalMessageOfferType? = null,
+ var environment: Environment = Environment.SANDBOX,
+) : Cloneable {
+ init {
+ Api.env = environment
+ }
+
+ public override fun clone(): PayPalMessagesModalConfig {
+ return super.clone() as PayPalMessagesModalConfig
+ }
+}
diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml
index 7c6c588d..48b71203 100644
--- a/library/src/main/res/values/attrs.xml
+++ b/library/src/main/res/values/attrs.xml
@@ -1,7 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -23,14 +40,9 @@
-
-
-
-
-
-
+
-
+
@@ -42,6 +54,15 @@
-
+
+
+
+
+
+
+
+
+
+
From 051e87f346fb57813628619d89f5f9ea6814d2c5 Mon Sep 17 00:00:00 2001
From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com>
Date: Thu, 15 Aug 2024 11:16:13 -0400
Subject: [PATCH 2/7] update coverage
---
library/build.gradle | 1 +
.../messages/PayPalMessagesModalView.kt | 16 +--
.../modal/PayPalMessagesModalConfigTest.kt | 109 ++++++++++++++++++
3 files changed, 118 insertions(+), 8 deletions(-)
create mode 100644 library/src/test/java/com/paypal/messages/config/modal/PayPalMessagesModalConfigTest.kt
diff --git a/library/build.gradle b/library/build.gradle
index 0b246449..b2af2910 100644
--- a/library/build.gradle
+++ b/library/build.gradle
@@ -123,6 +123,7 @@ koverReport {
'*Activity',
'*Activity\$*',
'com.paypal.messages.PayPalMessageView*',
+ 'com.paypal.messages.PayPalMessagesModalView*',
'com.paypal.messages.RoundedWebView',
'com.paypal.messages.RoundedWebView\$*',
'*.databinding.*',
diff --git a/library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt b/library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt
index b9eb1afa..db7f2dce 100644
--- a/library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt
+++ b/library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt
@@ -56,14 +56,14 @@ class PayPalMessagesModalView @JvmOverloads constructor(
offerType = this.offerType,
environment = this.environment ?: PayPalEnvironment.SANDBOX,
callbacks = ModalEvents(
- this.onClick,
- this.onApply,
- this.onLoading,
- this.onSuccess,
- this.onError,
- this.onCalculate,
- this.onShow,
- this.onClose,
+ onClick = this.onClick,
+ onApply = this.onApply,
+ onLoading = this.onLoading,
+ onSuccess = this.onSuccess,
+ onError = this.onError,
+ onCalculate = this.onCalculate,
+ onShow = this.onShow,
+ onClose = this.onClose,
),
)
}
diff --git a/library/src/test/java/com/paypal/messages/config/modal/PayPalMessagesModalConfigTest.kt b/library/src/test/java/com/paypal/messages/config/modal/PayPalMessagesModalConfigTest.kt
new file mode 100644
index 00000000..d68b7ae5
--- /dev/null
+++ b/library/src/test/java/com/paypal/messages/config/modal/PayPalMessagesModalConfigTest.kt
@@ -0,0 +1,109 @@
+package com.paypal.messages.config.modal
+
+import com.paypal.messages.config.PayPalEnvironment
+import com.paypal.messages.config.PayPalMessageOfferType
+import com.paypal.messages.utils.PayPalErrors
+import io.mockk.every
+import io.mockk.mockk
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Assertions.assertNotEquals
+import org.junit.jupiter.api.Test
+
+class PayPalMessagesModalConfigTest {
+ @Test
+ fun testConstructor() {
+ val onClickMock = mockk<() -> Unit>("onClickMock")
+ every { onClickMock() } answers {}
+ val onApplyMock = mockk<() -> Unit>("onApplyMock")
+ every { onApplyMock() } answers {}
+ val onLoadingMock = mockk<() -> Unit>("onLoadingMock")
+ every { onLoadingMock() } answers {}
+ val onSuccessMock = mockk<() -> Unit>("onSuccessMock")
+ every { onSuccessMock() } answers {}
+ val onErrorMock = mockk<(error: PayPalErrors.Base) -> Unit>("onErrorMock")
+ every { onErrorMock(any()) } answers {}
+ val onCalculateMock = mockk<() -> Unit>("onCalculateMock")
+ every { onCalculateMock() } answers {}
+ val onShowMock = mockk<() -> Unit>("onShowMock")
+ every { onShowMock() } answers {}
+ val onCloseMock = mockk<() -> Unit>("onCloseMock")
+ every { onCloseMock() } answers {}
+
+ val modalEvents = ModalEvents(
+ onClick = onClickMock,
+ onApply = onApplyMock,
+ onLoading = onLoadingMock,
+ onSuccess = onSuccessMock,
+ onError = onErrorMock,
+ onCalculate = onCalculateMock,
+ onShow = onShowMock,
+ onClose = onCloseMock,
+ )
+
+ val config = PayPalMessagesModalConfig(
+ clientID = "test_client_id",
+ merchantID = "test_merchant_id",
+ partnerAttributionID = "test_partner_id",
+ amount = 100.00,
+ buyerCountry = "test_buyer_country",
+ offerType = PayPalMessageOfferType.PAY_LATER_PAY_IN_1,
+ environment = PayPalEnvironment.SANDBOX,
+ callbacks = modalEvents,
+ )
+
+ assertEquals(config.clientID, "test_client_id")
+ assertEquals(config.merchantID, "test_merchant_id")
+ assertEquals(config.partnerAttributionID, "test_partner_id")
+ assertEquals(config.amount, 100.00)
+ assertEquals(config.environment, PayPalEnvironment.SANDBOX)
+ assertEquals(config.callbacks, modalEvents)
+ }
+
+ @Test
+ fun testClone() {
+ val onClickMock = mockk<() -> Unit>("onClickMock")
+ every { onClickMock() } answers {}
+ val onApplyMock = mockk<() -> Unit>("onApplyMock")
+ every { onApplyMock() } answers {}
+ val onLoadingMock = mockk<() -> Unit>("onLoadingMock")
+ every { onLoadingMock() } answers {}
+ val onSuccessMock = mockk<() -> Unit>("onSuccessMock")
+ every { onSuccessMock() } answers {}
+ val onErrorMock = mockk<(error: PayPalErrors.Base) -> Unit>("onErrorMock")
+ every { onErrorMock(any()) } answers {}
+ val onCalculateMock = mockk<() -> Unit>("onCalculateMock")
+ every { onCalculateMock() } answers {}
+ val onShowMock = mockk<() -> Unit>("onShowMock")
+ every { onShowMock() } answers {}
+ val onCloseMock = mockk<() -> Unit>("onCloseMock")
+ every { onCloseMock() } answers {}
+
+ val modalEvents = ModalEvents(
+ onClick = onClickMock,
+ onApply = onApplyMock,
+ onLoading = onLoadingMock,
+ onSuccess = onSuccessMock,
+ onError = onErrorMock,
+ onCalculate = onCalculateMock,
+ onShow = onShowMock,
+ onClose = onCloseMock,
+ )
+
+ val oldData = PayPalMessagesModalConfig(
+ clientID = "test_client_id",
+ merchantID = "test_merchant_id",
+ partnerAttributionID = "test_partner_id",
+ amount = 100.00,
+ buyerCountry = "test_buyer_country",
+ offerType = PayPalMessageOfferType.PAY_LATER_PAY_IN_1,
+ environment = PayPalEnvironment.SANDBOX,
+ callbacks = modalEvents,
+ )
+
+ val data = oldData.clone()
+
+ assertEquals(data, oldData)
+ data.amount = 200.0
+ assertNotEquals(oldData, data)
+ }
+}
From 0c8e503304e5fd95f0337bf7da0c10599f735602 Mon Sep 17 00:00:00 2001
From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com>
Date: Thu, 15 Aug 2024 12:16:40 -0400
Subject: [PATCH 3/7] Add channel, pageType, hide
---
.../com/paypal/messagesdemo/XmlActivity.kt | 11 ++++++
.../java/com/paypal/messages/ModalFragment.kt | 36 ++++++++++++-------
.../com/paypal/messages/PayPalMessageView.kt | 8 +++++
.../messages/PayPalMessagesModalView.kt | 31 ++++++++++++++--
.../com/paypal/messages/config/Channel.kt | 2 +-
.../config/message/PayPalMessageData.kt | 2 ++
.../messages/config/modal/ModalConfig.kt | 2 +-
.../config/modal/PayPalMessagesModalConfig.kt | 4 +++
.../messages/config/modal/ModalConfigTest.kt | 2 +-
9 files changed, 79 insertions(+), 19 deletions(-)
diff --git a/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt b/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
index fddc7263..0086d0ed 100644
--- a/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
+++ b/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
@@ -11,6 +11,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.compose.ui.graphics.Color
import com.paypal.messages.PayPalMessageView
import com.paypal.messages.PayPalMessagesModalView
+import com.paypal.messages.config.Channel
import com.paypal.messages.config.PayPalEnvironment
import com.paypal.messages.config.PayPalMessageOfferType
import com.paypal.messages.config.PayPalMessagePageType
@@ -197,6 +198,13 @@ class XmlActivity : AppCompatActivity() {
submitButton.setOnClickListener { updateMessageData() }
}
+ @Override
+ private fun activityPaused() {
+ val modalConfig = PayPalMessagesModalConfig(clientID = "someClientID")
+ val modal = PayPalMessagesModalView(context = this, config = modalConfig)
+ modal.hide()
+ }
+
/**
* Prevents unused warnings inside of PayPalMessageView and PayPalMessageConfig
*/
@@ -214,6 +222,7 @@ class XmlActivity : AppCompatActivity() {
message.merchantID = ""
message.partnerAttributionID = ""
message.pageType = PayPalMessagePageType.CART
+ message.channel = Channel.UPSTREAM.toString()
message.onClick = {}
message.onApply = {}
message.onLoading = {}
@@ -228,6 +237,8 @@ class XmlActivity : AppCompatActivity() {
modal.clientID = ""
modal.merchantID = ""
modal.partnerAttributionID = ""
+ modal.channel = Channel.UPSTREAM.toString()
+ modal.pageType = PayPalMessagePageType.CART
modal.onClick = {}
modal.onApply = {}
modal.onLoading = {}
diff --git a/library/src/main/java/com/paypal/messages/ModalFragment.kt b/library/src/main/java/com/paypal/messages/ModalFragment.kt
index 3a762741..159f858f 100644
--- a/library/src/main/java/com/paypal/messages/ModalFragment.kt
+++ b/library/src/main/java/com/paypal/messages/ModalFragment.kt
@@ -60,27 +60,33 @@ internal class ModalFragment(
// MODAL CONFIG VALUES
var amount: Double? = null
- set(amountArg) {
- if (field != amountArg) {
- field = amountArg
- setJsValue(name = "amount", value = amountArg)
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ setJsValue(name = "amount", value = arg)
}
}
var buyerCountry: String? = null
- set(buyerCountryArg) {
- if (field != buyerCountryArg) {
- field = buyerCountryArg
- setJsValue(name = "buyerCountry", value = buyerCountry)
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ setJsValue(name = "buyerCountry", value = arg)
+ }
+ }
+ var channel: String? = Channel.UPSTREAM.toString()
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ setJsValue(name = "channel", value = arg)
}
}
- private var channel: Channel = Channel.NATIVE
private var devTouchpoint: Boolean = true
private var ignoreCache: Boolean = false
var offerType: OfferType? = null
- set(offerArg) {
- if (field != offerArg) {
- field = offerArg
- setJsValue(name = "offer", value = offerArg.toString())
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ setJsValue(name = "offer", value = arg.toString())
}
}
private var stageTag: String? = null
@@ -246,6 +252,10 @@ internal class ModalFragment(
this.dialog?.show()
}
+ fun hide() {
+ this.dialog?.hide()
+ }
+
fun init(config: ModalConfig) {
// Set Parameters for Modal
this.amount = config.amount
diff --git a/library/src/main/java/com/paypal/messages/PayPalMessageView.kt b/library/src/main/java/com/paypal/messages/PayPalMessageView.kt
index 5041eff2..9a4ba436 100644
--- a/library/src/main/java/com/paypal/messages/PayPalMessageView.kt
+++ b/library/src/main/java/com/paypal/messages/PayPalMessageView.kt
@@ -166,6 +166,14 @@ class PayPalMessageView @JvmOverloads constructor(
debounceUpdateContent(Unit)
}
}
+ var channel: String? = config.data.channel
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ if (modal != null) modal?.channel = field
+ debounceUpdateContent(Unit)
+ }
+ }
var offerType: OfferType? = config.data.offerType
set(arg) {
if (field != arg) {
diff --git a/library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt b/library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt
index db7f2dce..b18877de 100644
--- a/library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt
+++ b/library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt
@@ -2,6 +2,8 @@ package com.paypal.messages
import android.content.Context
import android.content.res.TypedArray
+import android.os.Handler
+import android.os.Looper
import android.util.AttributeSet
import android.widget.FrameLayout
import androidx.appcompat.app.AppCompatActivity
@@ -13,6 +15,7 @@ import com.paypal.messages.analytics.AnalyticsEvent
import com.paypal.messages.analytics.AnalyticsLogger
import com.paypal.messages.config.PayPalEnvironment
import com.paypal.messages.config.PayPalMessageOfferType
+import com.paypal.messages.config.PayPalMessagePageType
import com.paypal.messages.config.modal.ModalCloseButton
import com.paypal.messages.config.modal.ModalConfig
import com.paypal.messages.config.modal.ModalEvents
@@ -131,6 +134,7 @@ class PayPalMessagesModalView @JvmOverloads constructor(
set(arg) {
if (field != arg) {
field = arg
+ if (modal != null) modal?.amount = field
debounceUpdateContent(Unit)
}
}
@@ -138,10 +142,27 @@ class PayPalMessagesModalView @JvmOverloads constructor(
set(arg) {
if (field != arg) {
field = arg
+ if (modal != null) modal?.buyerCountry = field
+ debounceUpdateContent(Unit)
+ }
+ }
+ var channel: String? = config.channel
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ if (modal != null) modal?.channel = field
debounceUpdateContent(Unit)
}
}
var offerType: PayPalMessageOfferType? = config.offerType
+ set(arg) {
+ if (field != arg) {
+ field = arg
+ if (modal != null) modal?.offerType = field
+ debounceUpdateContent(Unit)
+ }
+ }
+ var pageType: PayPalMessagePageType? = config.pageType
set(arg) {
if (field != arg) {
field = arg
@@ -255,9 +276,13 @@ class PayPalMessagesModalView @JvmOverloads constructor(
// it will become visually hidden and this method will re-display the modal without
// attempting to reattach it
// the delay prevents noticeable shift when the offer type is changed
-// handler.postDelayed({
- modal.expand()
-// }, 250)
+ Handler(Looper.getMainLooper()).postDelayed({
+ modal.expand()
+ }, 250)
+ }
+
+ fun hide() {
+ modal?.hide()
}
override fun onDetachedFromWindow() {
diff --git a/library/src/main/java/com/paypal/messages/config/Channel.kt b/library/src/main/java/com/paypal/messages/config/Channel.kt
index ce3ea87a..499841f3 100644
--- a/library/src/main/java/com/paypal/messages/config/Channel.kt
+++ b/library/src/main/java/com/paypal/messages/config/Channel.kt
@@ -1,5 +1,5 @@
package com.paypal.messages.config
enum class Channel {
- NATIVE,
+ UPSTREAM,
}
diff --git a/library/src/main/java/com/paypal/messages/config/message/PayPalMessageData.kt b/library/src/main/java/com/paypal/messages/config/message/PayPalMessageData.kt
index d922a32f..d6df616a 100644
--- a/library/src/main/java/com/paypal/messages/config/message/PayPalMessageData.kt
+++ b/library/src/main/java/com/paypal/messages/config/message/PayPalMessageData.kt
@@ -1,5 +1,6 @@
package com.paypal.messages.config.message
+import com.paypal.messages.config.Channel
import com.paypal.messages.io.Api
import com.paypal.messages.config.PayPalEnvironment as Environment
import com.paypal.messages.config.PayPalMessageOfferType as OfferType
@@ -16,6 +17,7 @@ data class PayPalMessageData(
var partnerAttributionID: String? = null,
var amount: Double? = null,
var buyerCountry: String? = null,
+ var channel: String? = Channel.UPSTREAM.toString(),
var offerType: OfferType? = null,
var pageType: PageType? = null,
var environment: Environment = Environment.SANDBOX,
diff --git a/library/src/main/java/com/paypal/messages/config/modal/ModalConfig.kt b/library/src/main/java/com/paypal/messages/config/modal/ModalConfig.kt
index 38a87ec9..8f97507c 100644
--- a/library/src/main/java/com/paypal/messages/config/modal/ModalConfig.kt
+++ b/library/src/main/java/com/paypal/messages/config/modal/ModalConfig.kt
@@ -10,7 +10,7 @@ import com.paypal.messages.config.PayPalMessageOfferType
data class ModalConfig(
var amount: Double? = null,
var buyerCountry: String? = null,
- var channel: Channel = Channel.NATIVE,
+ var channel: String = Channel.UPSTREAM.toString(),
var devTouchpoint: Boolean = false,
var events: ModalEvents? = null,
var ignoreCache: Boolean = false,
diff --git a/library/src/main/java/com/paypal/messages/config/modal/PayPalMessagesModalConfig.kt b/library/src/main/java/com/paypal/messages/config/modal/PayPalMessagesModalConfig.kt
index be7e2881..928caadc 100644
--- a/library/src/main/java/com/paypal/messages/config/modal/PayPalMessagesModalConfig.kt
+++ b/library/src/main/java/com/paypal/messages/config/modal/PayPalMessagesModalConfig.kt
@@ -1,6 +1,8 @@
package com.paypal.messages.config.modal
+import com.paypal.messages.config.Channel
import com.paypal.messages.config.PayPalMessageOfferType
+import com.paypal.messages.config.PayPalMessagePageType
import com.paypal.messages.io.Api
import com.paypal.messages.config.PayPalEnvironment as Environment
@@ -16,8 +18,10 @@ data class PayPalMessagesModalConfig(
var partnerAttributionID: String? = null,
var amount: Double? = null,
var buyerCountry: String? = null,
+ var channel: String? = Channel.UPSTREAM.toString(),
var callbacks: ModalEvents? = null,
var offerType: PayPalMessageOfferType? = null,
+ var pageType: PayPalMessagePageType? = null,
var environment: Environment = Environment.SANDBOX,
) : Cloneable {
init {
diff --git a/library/src/test/java/com/paypal/messages/config/modal/ModalConfigTest.kt b/library/src/test/java/com/paypal/messages/config/modal/ModalConfigTest.kt
index 44746672..39f9a6bc 100644
--- a/library/src/test/java/com/paypal/messages/config/modal/ModalConfigTest.kt
+++ b/library/src/test/java/com/paypal/messages/config/modal/ModalConfigTest.kt
@@ -29,7 +29,7 @@ class ModalConfigTest {
assertEquals(modalConfig.amount, 115.00)
assertEquals(modalConfig.buyerCountry, "US")
assertEquals(modalConfig.offer, PayPalMessageOfferType.PAY_LATER_SHORT_TERM)
- assertEquals(modalConfig.channel, Channel.NATIVE)
+ assertEquals(modalConfig.channel, Channel.UPSTREAM.toString())
assertEquals(modalConfig.ignoreCache, true)
assertEquals(modalConfig.devTouchpoint, true)
assertEquals(modalConfig.stageTag, "test_tag")
From 7d8647091eb83b771a8776f45e00154ee9e39814 Mon Sep 17 00:00:00 2001
From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com>
Date: Thu, 15 Aug 2024 12:18:19 -0400
Subject: [PATCH 4/7] rename to Fragment
---
demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt | 8 ++++----
library/build.gradle | 6 ++----
...essagesModalView.kt => PayPalMessagesModalFragment.kt} | 2 +-
3 files changed, 7 insertions(+), 9 deletions(-)
rename library/src/main/java/com/paypal/messages/{PayPalMessagesModalView.kt => PayPalMessagesModalFragment.kt} (99%)
diff --git a/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt b/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
index 0086d0ed..457b5095 100644
--- a/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
+++ b/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
@@ -10,7 +10,7 @@ import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.ui.graphics.Color
import com.paypal.messages.PayPalMessageView
-import com.paypal.messages.PayPalMessagesModalView
+import com.paypal.messages.PayPalMessagesModalFragment
import com.paypal.messages.config.Channel
import com.paypal.messages.config.PayPalEnvironment
import com.paypal.messages.config.PayPalMessageOfferType
@@ -44,7 +44,7 @@ class XmlActivity : AppCompatActivity() {
amount = 300.0,
offerType = PayPalMessageOfferType.PAY_LATER_LONG_TERM,
)
- val modal = PayPalMessagesModalView(context = this, config = modalConfig)
+ val modal = PayPalMessagesModalFragment(context = this, config = modalConfig)
val messagesModalText = binding.messagesModalText
messagesModalText.setOnClickListener {
modal.show()
@@ -201,7 +201,7 @@ class XmlActivity : AppCompatActivity() {
@Override
private fun activityPaused() {
val modalConfig = PayPalMessagesModalConfig(clientID = "someClientID")
- val modal = PayPalMessagesModalView(context = this, config = modalConfig)
+ val modal = PayPalMessagesModalFragment(context = this, config = modalConfig)
modal.hide()
}
@@ -230,7 +230,7 @@ class XmlActivity : AppCompatActivity() {
message.onError = {}
val modalConfig = PayPalMessagesModalConfig(clientID = "someClientID")
- val modal = PayPalMessagesModalView(context = this, config = modalConfig)
+ val modal = PayPalMessagesModalFragment(context = this, config = modalConfig)
modal.getConfig()
modal.setConfig(modalConfig)
modal.environment = PayPalEnvironment.SANDBOX
diff --git a/library/build.gradle b/library/build.gradle
index b2af2910..71ad765d 100644
--- a/library/build.gradle
+++ b/library/build.gradle
@@ -122,10 +122,8 @@ koverReport {
'*Fragment\$*',
'*Activity',
'*Activity\$*',
- 'com.paypal.messages.PayPalMessageView*',
- 'com.paypal.messages.PayPalMessagesModalView*',
- 'com.paypal.messages.RoundedWebView',
- 'com.paypal.messages.RoundedWebView\$*',
+ '*View',
+ '*View\$*',
'*.databinding.*',
'*.BuildConfig'
)
diff --git a/library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt b/library/src/main/java/com/paypal/messages/PayPalMessagesModalFragment.kt
similarity index 99%
rename from library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt
rename to library/src/main/java/com/paypal/messages/PayPalMessagesModalFragment.kt
index b18877de..4fdcce5a 100644
--- a/library/src/main/java/com/paypal/messages/PayPalMessagesModalView.kt
+++ b/library/src/main/java/com/paypal/messages/PayPalMessagesModalFragment.kt
@@ -40,7 +40,7 @@ import com.paypal.messages.config.modal.PayPalMessagesModalConfig as MessagesMod
* Interacting with their content will show more information about the
* product itself and the option to apply
*/
-class PayPalMessagesModalView @JvmOverloads constructor(
+class PayPalMessagesModalFragment @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null,
defStyleAttr: Int = 0,
From d9058ba92143a85f7e0b6f91710a2f3e5177f467 Mon Sep 17 00:00:00 2001
From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com>
Date: Thu, 15 Aug 2024 12:29:13 -0400
Subject: [PATCH 5/7] Adjust demo
---
demo/src/main/res/layout/activity_message.xml | 29 +++++++++----------
1 file changed, 14 insertions(+), 15 deletions(-)
diff --git a/demo/src/main/res/layout/activity_message.xml b/demo/src/main/res/layout/activity_message.xml
index 45223a3a..faad6e0a 100644
--- a/demo/src/main/res/layout/activity_message.xml
+++ b/demo/src/main/res/layout/activity_message.xml
@@ -238,21 +238,21 @@
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="Ignore Cache"
+ android:textStyle="bold" />
@@ -277,10 +277,10 @@
+ android:layout_height="wrap_content"
+ android:text="@string/messages_modal_text" />
@@ -291,14 +291,14 @@
+ android:layout_height="match_parent"
+ android:layout_marginTop="20dp">
+ android:text="@string/reload_label"/>
+ android:id="@+id/submit"/>
From cf10b463c281f13a0bd620fd151cf0e917d7dd01 Mon Sep 17 00:00:00 2001
From: "Merlin (they/them)" <124289716+merlinpaypal@users.noreply.github.com>
Date: Thu, 15 Aug 2024 12:41:25 -0400
Subject: [PATCH 6/7] Update demo with XML
---
.../com/paypal/messagesdemo/XmlActivity.kt | 8 +++++-
demo/src/main/res/layout/activity_message.xml | 8 ++++++
.../messages/PayPalMessagesModalFragment.kt | 14 +++++++++++
library/src/main/res/values/attrs.xml | 25 ++++++++++++-------
4 files changed, 45 insertions(+), 10 deletions(-)
diff --git a/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt b/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
index 457b5095..8ccc9a1b 100644
--- a/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
+++ b/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
@@ -39,17 +39,23 @@ class XmlActivity : AppCompatActivity() {
binding = ActivityMessageBinding.inflate(layoutInflater)
setContentView(binding.root)
+ val messagesModalText = binding.messagesModalText
val modalConfig = PayPalMessagesModalConfig(
clientID = getString(R.string.client_id),
amount = 300.0,
offerType = PayPalMessageOfferType.PAY_LATER_LONG_TERM,
)
val modal = PayPalMessagesModalFragment(context = this, config = modalConfig)
- val messagesModalText = binding.messagesModalText
messagesModalText.setOnClickListener {
modal.show()
}
+// // XML can also be used
+// val xmlModal = binding.xmlModal
+// messagesModalText.setOnClickListener {
+// xmlModal.show()
+// }
+
val messageWrapper = binding.messageWrapper
val progressBar = binding.progressBar
val resetButton = binding.reset
diff --git a/demo/src/main/res/layout/activity_message.xml b/demo/src/main/res/layout/activity_message.xml
index faad6e0a..62118e8a 100644
--- a/demo/src/main/res/layout/activity_message.xml
+++ b/demo/src/main/res/layout/activity_message.xml
@@ -283,11 +283,19 @@
android:text="@string/messages_modal_text" />
+
+
+
@@ -17,6 +20,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -44,15 +57,7 @@
-
-
-
-
-
-
-
-
-
+
@@ -63,6 +68,8 @@
+
+
From 34286eb22e7aeefe38f6ff5ffc9a215834f17f2f Mon Sep 17 00:00:00 2001
From: merlinpaypal <124289716+merlinpaypal@users.noreply.github.com>
Date: Wed, 18 Jun 2025 13:19:35 -0400
Subject: [PATCH 7/7] feat: modal tracking updates (#51)
---
.../com/paypal/messagesdemo/XmlActivity.kt | 9 +++-
.../messages/PayPalMessagesModalFragment.kt | 48 +++++++------------
library/src/main/res/values/attrs.xml | 2 +-
3 files changed, 24 insertions(+), 35 deletions(-)
diff --git a/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt b/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
index 8ccc9a1b..5cae6d48 100644
--- a/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
+++ b/demo/src/main/java/com/paypal/messagesdemo/XmlActivity.kt
@@ -42,8 +42,7 @@ class XmlActivity : AppCompatActivity() {
val messagesModalText = binding.messagesModalText
val modalConfig = PayPalMessagesModalConfig(
clientID = getString(R.string.client_id),
- amount = 300.0,
- offerType = PayPalMessageOfferType.PAY_LATER_LONG_TERM,
+ environment = environment,
)
val modal = PayPalMessagesModalFragment(context = this, config = modalConfig)
messagesModalText.setOnClickListener {
@@ -183,6 +182,12 @@ class XmlActivity : AppCompatActivity() {
payPalMessage.color = color
payPalMessage.logoType = logoType
payPalMessage.textAlignment = textAlignment
+
+ modal.clientID = clientId
+ modal.amount = amount
+ modal.buyerCountry = buyerCountry
+ modal.offerType = offerType
+ modal.environment = environment
}
// Restore default options and reset UI
diff --git a/library/src/main/java/com/paypal/messages/PayPalMessagesModalFragment.kt b/library/src/main/java/com/paypal/messages/PayPalMessagesModalFragment.kt
index 9f74531a..d1188733 100644
--- a/library/src/main/java/com/paypal/messages/PayPalMessagesModalFragment.kt
+++ b/library/src/main/java/com/paypal/messages/PayPalMessagesModalFragment.kt
@@ -13,6 +13,7 @@ import androidx.core.content.res.use
import com.paypal.messages.analytics.AnalyticsComponent
import com.paypal.messages.analytics.AnalyticsEvent
import com.paypal.messages.analytics.AnalyticsLogger
+import com.paypal.messages.analytics.ComponentType
import com.paypal.messages.config.PayPalEnvironment
import com.paypal.messages.config.PayPalMessageOfferType
import com.paypal.messages.config.PayPalMessagePageType
@@ -20,8 +21,6 @@ import com.paypal.messages.config.modal.ModalCloseButton
import com.paypal.messages.config.modal.ModalConfig
import com.paypal.messages.config.modal.ModalEvents
import com.paypal.messages.io.Api
-import com.paypal.messages.io.ApiResult
-import com.paypal.messages.io.OnActionCompleted
import com.paypal.messages.utils.LogCat
import com.paypal.messages.utils.PayPalErrors
import kotlinx.coroutines.CoroutineScope
@@ -45,8 +44,8 @@ class PayPalMessagesModalFragment @JvmOverloads constructor(
attributeSet: AttributeSet? = null,
defStyleAttr: Int = 0,
config: MessagesModalConfig = MessagesModalConfig(clientID = ""),
-) : FrameLayout(context, attributeSet, defStyleAttr), OnActionCompleted {
- private val TAG = "PayPalMessagesModalView"
+) : FrameLayout(context, attributeSet, defStyleAttr) {
+ private val TAG = "PayPalMessagesModalFragment"
private var instanceId = UUID.randomUUID()
fun getConfig(): MessagesModalConfig {
@@ -239,7 +238,7 @@ class PayPalMessagesModalFragment @JvmOverloads constructor(
private var modal: ModalFragment? = null
init {
- context.obtainStyledAttributes(attributeSet, R.styleable.PayPalMessagesModalView).use { typedArray ->
+ context.obtainStyledAttributes(attributeSet, R.styleable.PayPalMessagesModalFragment).use { typedArray ->
updateFromAttributes(typedArray)
}
if (config.clientID === "") LogCat.error(TAG, "ClientID is an empty string")
@@ -296,13 +295,13 @@ class PayPalMessagesModalFragment @JvmOverloads constructor(
* This function will update the local config related values based on what is provided from the [PayPalMessageView] xml custom view.
*/
private fun updateFromAttributes(typedArray: TypedArray) {
- if (typedArray.hasValue(R.styleable.PayPalMessagesModalView_paypal_client_id)) {
- clientID = typedArray.getString(R.styleable.PayPalMessagesModalView_paypal_client_id).toString()
+ if (typedArray.hasValue(R.styleable.PayPalMessagesModalFragment_paypal_client_id)) {
+ clientID = typedArray.getString(R.styleable.PayPalMessagesModalFragment_paypal_client_id).toString()
}
- if (typedArray.hasValue(R.styleable.PayPalMessagesModalView_paypal_amount)) {
+ if (typedArray.hasValue(R.styleable.PayPalMessagesModalFragment_paypal_amount)) {
amount = try {
- typedArray.getFloatOrThrow(R.styleable.PayPalMessagesModalView_paypal_amount).toDouble()
+ typedArray.getFloatOrThrow(R.styleable.PayPalMessagesModalFragment_paypal_amount).toDouble()
}
catch (ex: Exception) {
LogCat.error(TAG, "Error parsing amount attribute")
@@ -310,9 +309,9 @@ class PayPalMessagesModalFragment @JvmOverloads constructor(
}
}
- if (typedArray.hasValue(R.styleable.PayPalMessagesModalView_paypal_offer_type)) {
+ if (typedArray.hasValue(R.styleable.PayPalMessagesModalFragment_paypal_offer_type)) {
offerType = try {
- PayPalMessageOfferType(typedArray.getIntOrThrow(R.styleable.PayPalMessagesModalView_paypal_offer_type))
+ PayPalMessageOfferType(typedArray.getIntOrThrow(R.styleable.PayPalMessagesModalFragment_paypal_offer_type))
}
catch (ex: Exception) {
LogCat.error(TAG, "Error parsing offer_type attribute")
@@ -320,9 +319,9 @@ class PayPalMessagesModalFragment @JvmOverloads constructor(
}
}
- if (typedArray.hasValue(R.styleable.PayPalMessageView_paypal_page_type)) {
+ if (typedArray.hasValue(R.styleable.PayPalMessagesModalFragment_paypal_page_type)) {
pageType = try {
- PayPalMessagePageType(typedArray.getIntOrThrow(R.styleable.PayPalMessageView_paypal_page_type))
+ PayPalMessagePageType(typedArray.getIntOrThrow(R.styleable.PayPalMessagesModalFragment_paypal_page_type))
}
catch (ex: Exception) {
LogCat.error(TAG, "Error parsing page_type attribute")
@@ -330,35 +329,20 @@ class PayPalMessagesModalFragment @JvmOverloads constructor(
}
}
- if (typedArray.hasValue(R.styleable.PayPalMessageView_paypal_buyer_country)) {
- buyerCountry = typedArray.getString(R.styleable.PayPalMessageView_paypal_buyer_country)
+ if (typedArray.hasValue(R.styleable.PayPalMessagesModalFragment_paypal_buyer_country)) {
+ buyerCountry = typedArray.getString(R.styleable.PayPalMessagesModalFragment_paypal_buyer_country)
}
}
- override fun onActionCompleted(result: ApiResult) {
- when (result) {
- is ApiResult.Success<*> -> {
- LogCat.debug(TAG, "onActionCompleted Success")
- }
-
- is ApiResult.Failure<*> -> {
- LogCat.debug(TAG, "onActionCompleted Failure")
- // If we encountered a failure, we expect an exception to be returned.
- result.error?.let { this.onError(it) }
- }
- }
- }
-
- @Suppress("unused")
private fun logEvent(event: AnalyticsEvent) {
val component = AnalyticsComponent(
offerType = this.offerType,
amount = this.amount.toString(),
+ pageType = this.pageType,
buyerCountryCode = this.buyerCountry,
instanceId = this.instanceId.toString(),
originatingInstanceId = Api.originatingInstanceId.toString(),
- // TODO: what type to use
-// type = ComponentType.MESSAGE.toString(),
+ type = ComponentType.MODAL.toString(),
componentEvents = mutableListOf(event),
)
diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml
index 9d787175..cd2d8585 100644
--- a/library/src/main/res/values/attrs.xml
+++ b/library/src/main/res/values/attrs.xml
@@ -61,7 +61,7 @@
-
+