Skip to content

Commit c4ab485

Browse files
authored
feat: update message view to use its own instance id (#20)
1 parent 477305d commit c4ab485

3 files changed

Lines changed: 30 additions & 16 deletions

File tree

library/src/androidTest/java/com/paypal/messages/io/ApiTest.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@ import org.junit.Assert.assertTrue
2323
import org.junit.Before
2424
import org.junit.Test
2525
import org.junit.runner.RunWith
26+
import java.util.UUID
2627
import com.paypal.messages.config.message.PayPalMessageConfig as MessageConfig
2728

2829
@RunWith(AndroidJUnit4::class)
2930
class ApiTest {
3031
private lateinit var context: Context
3132
private lateinit var sharedPreferences: SharedPreferences
3233
private lateinit var mockWebServer: MockWebServer
34+
private val instanceId = UUID.randomUUID()
3335
private val messageConfig = MessageConfig(
3436
data = PayPalMessageData(clientID = "test_client_id"),
3537
)
@@ -60,7 +62,7 @@ class ApiTest {
6062

6163
@Test
6264
fun testCreateMessageDataRequestWithNoData() {
63-
val messageDataRequest = Api.createMessageDataRequest(messageConfig, null)
65+
val messageDataRequest = Api.createMessageDataRequest(messageConfig, null, instanceId)
6466
val url = messageDataRequest.url.toString()
6567

6668
val expectedPath = "credit-presentment/native/message"
@@ -92,7 +94,7 @@ class ApiTest {
9294
),
9395
style = PayPalMessageStyle(),
9496
)
95-
val messageDataRequest = Api.createMessageDataRequest(config, "hash")
97+
val messageDataRequest = Api.createMessageDataRequest(config, "hash", instanceId)
9698
val url = messageDataRequest.url.toString()
9799

98100
val expectedPath = "credit-presentment/native/message"
@@ -134,7 +136,7 @@ class ApiTest {
134136
mockWebServer.enqueue(mockMessageDataResponse)
135137

136138
launch {
137-
val result = Api.callMessageDataEndpoint(messageConfig, null)
139+
val result = Api.callMessageDataEndpoint(messageConfig, null, instanceId)
138140
assertTrue(result is ApiResult.Failure<*>)
139141
val error = (result as ApiResult.Failure<*>).error
140142
assertTrue(error is PayPalErrors.FailedToFetchDataException)
@@ -156,7 +158,7 @@ class ApiTest {
156158
mockWebServer.enqueue(mockMessageDataResponse)
157159

158160
launch {
159-
val result = Api.callMessageDataEndpoint(messageConfig, null)
161+
val result = Api.callMessageDataEndpoint(messageConfig, null, instanceId)
160162
assertTrue(result is ApiResult.Failure<*>)
161163
val error = (result as ApiResult.Failure<*>).error
162164
assertTrue(error is PayPalErrors.InvalidResponseException)
@@ -178,7 +180,7 @@ class ApiTest {
178180
mockWebServer.enqueue(mockMessageDataResponse)
179181

180182
launch {
181-
val result = Api.callMessageDataEndpoint(messageConfig, null)
183+
val result = Api.callMessageDataEndpoint(messageConfig, null, instanceId)
182184
assertTrue(result is ApiResult.Success<*>)
183185
val response = (result as ApiResult.Success<*>).response
184186
assertTrue(response.toJson().contains("content"))
@@ -213,7 +215,7 @@ class ApiTest {
213215
}
214216

215217
launch {
216-
Api.getMessageWithHash(context, messageConfig, onActionCompleted)
218+
Api.getMessageWithHash(context, messageConfig, instanceId, onActionCompleted)
217219
}.join()
218220

219221
advanceUntilIdle()

library/src/main/java/com/paypal/messages/PayPalMessageView.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class PayPalMessageView @JvmOverloads constructor(
5959
private val TAG = "PayPalMessage"
6060
private var messageTextView: TextView
6161
private var updateInProgress = false
62+
private var instanceId = UUID.randomUUID()
6263

6364
var config: MessageConfig = config.copy()
6465
set(configArg) {
@@ -355,8 +356,6 @@ class PayPalMessageView @JvmOverloads constructor(
355356
*/
356357
private fun updateMessageContent() {
357358
if (!updateInProgress) {
358-
Api.instanceId = UUID.randomUUID()
359-
360359
// Call OnLoading callback and prepare view for the process
361360
onLoading.invoke()
362361
messageTextView.visibility = View.GONE
@@ -367,6 +366,7 @@ class PayPalMessageView @JvmOverloads constructor(
367366
Api.getMessageWithHash(
368367
context,
369368
MessageConfig(data = data, style = style),
369+
this.instanceId,
370370
this,
371371
)
372372
}.toInt()
@@ -546,7 +546,7 @@ class PayPalMessageView @JvmOverloads constructor(
546546
offerCountryCode = this.messageDataResponse?.meta?.offerCountryCode,
547547
merchantCountryCode = this.messageDataResponse?.meta?.merchantCountryCode,
548548
type = ComponentType.MESSAGE.toString(),
549-
instanceId = Api.instanceId.toString(),
549+
instanceId = this.instanceId.toString(),
550550
originatingInstanceId = Api.originatingInstanceId.toString(),
551551
sessionId = Api.sessionId.toString(),
552552
componentEvents = mutableListOf(event),

library/src/main/java/com/paypal/messages/io/Api.kt

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,15 @@ object Api {
3030
var devTouchpoint: Boolean = false
3131
var ignoreCache: Boolean = false
3232
var stageTag: String? = null
33-
var instanceId: UUID? = null
3433
var originatingInstanceId: UUID? = null
3534
var sessionId: UUID? = null
3635
var ioDispatcher = Dispatchers.IO
3736

38-
private fun HttpUrl.Builder.setMessageDataQuery(config: MessageConfig, hash: String?) {
37+
private fun HttpUrl.Builder.setMessageDataQuery(
38+
config: MessageConfig,
39+
hash: String?,
40+
instanceId: UUID,
41+
) {
3942
addQueryParameter("client_id", config.data.clientID)
4043
addQueryParameter("devTouchpoint", devTouchpoint.toString())
4144
addQueryParameter("ignore_cache", ignoreCache.toString())
@@ -51,13 +54,17 @@ object Api {
5154
hash?.let { addQueryParameter("merchant_config", it) }
5255
}
5356

54-
internal fun createMessageDataRequest(config: MessageConfig, hash: String?): Request {
57+
internal fun createMessageDataRequest(
58+
config: MessageConfig,
59+
hash: String?,
60+
instanceId: UUID,
61+
): Request {
5562
val request = Request.Builder().apply {
5663
header("Accept", "application/json")
5764
header("x-requested-by", "native-upstream-messages")
5865

5966
val urlBuilder = env.url(Env.Endpoints.MESSAGE_DATA).newBuilder()
60-
urlBuilder.setMessageDataQuery(config, hash)
67+
urlBuilder.setMessageDataQuery(config, hash, instanceId)
6168
url(urlBuilder.build())
6269
}.build()
6370

@@ -66,9 +73,13 @@ object Api {
6673
return request
6774
}
6875

69-
internal fun callMessageDataEndpoint(config: MessageConfig, hash: String?): ApiResult {
76+
internal fun callMessageDataEndpoint(
77+
config: MessageConfig,
78+
hash: String?,
79+
instanceId: UUID,
80+
): ApiResult {
7081
LogCat.debug(TAG, "callMessageDataEndpoint hash: $hash")
71-
val request = createMessageDataRequest(config, hash)
82+
val request = createMessageDataRequest(config, hash, instanceId)
7283
try {
7384
val response = client.newCall(request).execute()
7485
val code = response.code
@@ -101,6 +112,7 @@ object Api {
101112
fun getMessageWithHash(
102113
context: Context,
103114
messageConfig: MessageConfig,
115+
instanceId: UUID,
104116
onCompleted: OnActionCompleted,
105117
) {
106118
CoroutineScope(ioDispatcher).launch {
@@ -120,7 +132,7 @@ object Api {
120132
else -> null
121133
}
122134

123-
val messageData = callMessageDataEndpoint(messageConfig, newHash)
135+
val messageData = callMessageDataEndpoint(messageConfig, newHash, instanceId)
124136
withContext(Dispatchers.Main) {
125137
onCompleted.onActionCompleted(messageData)
126138
}

0 commit comments

Comments
 (0)