Skip to content

Commit 20644c8

Browse files
authored
feat: accessibility (#31)
1 parent a7208eb commit 20644c8

9 files changed

Lines changed: 54 additions & 21 deletions

File tree

library/src/androidTest/java/com/paypal/messages/PayPalMessageViewTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class PayPalMessageViewTest {
2828

2929
private val defaultMain = "Test main"
3030
private val defaultDisclaimer = "Test disclaimer"
31+
private val defaultMainAlternative = "Test main alternative"
3132
private val response = ApiMessageData.Response(
3233
meta = ApiMessageData.Metadata(
3334
creditProductGroup = ProductGroup.PAYPAL_CREDIT,
@@ -51,8 +52,8 @@ class PayPalMessageViewTest {
5152
originatingInstanceId = UUID.randomUUID(),
5253
),
5354
content = ApiMessageData.ContentOptions(
54-
default = ApiMessageData.ContentDetails(main = defaultMain, disclaimer = defaultDisclaimer),
55-
generic = ApiMessageData.ContentDetails(main = "", disclaimer = ""),
55+
default = ApiMessageData.ContentDetails(main = defaultMain, mainAlternative = defaultMainAlternative, disclaimer = defaultDisclaimer),
56+
generic = ApiMessageData.ContentDetails(main = "", mainAlternative = "", disclaimer = ""),
5657
),
5758
)
5859

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ internal class ModalFragment(
104104
val rootView =
105105
inflator.inflate(R.layout.paypal_message_modal_sheet_layout, container, false)
106106
val closeButton = rootView.findViewById<ImageButton>(R.id.ModalCloseButton)
107+
closeButton.contentDescription = closeButtonData?.alternativeText
107108

108109
closeButton.layoutParams.height = TypedValue.applyDimension(
109110
TypedValue.COMPLEX_UNIT_DIP,
@@ -366,7 +367,7 @@ internal class ModalFragment(
366367
*/
367368
@JavascriptInterface
368369
fun paypalMessageModalCallbackHandler(passedParams: String) {
369-
val params = if (passedParams != "") passedParams else "{\"name\": \"\", \"args\": [{}]"
370+
val params = if (passedParams != "") passedParams else """{"name": "", "args": [{}]} """
370371
val nameAndArgs = JsonParser.parseString(params).asJsonObject
371372
val name = nameAndArgs.get("name").asString
372373
val args = nameAndArgs.get("args").asJsonArray[0].asJsonObject

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import androidx.core.content.res.getFloatOrThrow
2020
import androidx.core.content.res.getIntOrThrow
2121
import androidx.core.content.res.use
2222
import com.paypal.messages.config.PayPalEnvironment
23+
import com.paypal.messages.config.ProductGroup
2324
import com.paypal.messages.config.modal.ModalConfig
2425
import com.paypal.messages.config.modal.ModalEvents
2526
import com.paypal.messages.io.Api
@@ -522,12 +523,22 @@ class PayPalMessageView @JvmOverloads constructor(
522523
logoType: LogoType,
523524
): String {
524525
val builder = StringBuilder()
525-
val messageContent = response.content?.default?.main
526+
val mainContent = response.content?.default?.main
526527
val logoTag = response.meta?.variables?.logoPlaceholder
527528
val disclaimer = response.content?.default?.disclaimer
528529

530+
val productGroup = response.meta?.creditProductGroup
531+
val brandingText = if (productGroup == ProductGroup.PAYPAL_CREDIT) "PayPal Credit" else "PayPal"
532+
533+
val alternativeText = response.content?.default?.mainAlternative
534+
?: response.content?.generic?.mainAlternative
535+
?: logoTag?.let { mainContent?.replace(it, brandingText) ?: "" }
536+
val leadText = if (mainContent?.contains("$logoTag") == false) "$brandingText -" else ""
537+
val accessibilityText = "$leadText $alternativeText $disclaimer".trim()
538+
messageTextView.contentDescription = accessibilityText
539+
529540
// Append message content if it exists
530-
messageContent?.let { content ->
541+
mainContent?.let { content ->
531542
// Append LogoTag if logotype is PRIMARY or ALTERNATIVE and tag is not present
532543
logoTag?.let { tag ->
533544
if (logoType in listOf(

library/src/main/java/com/paypal/messages/config/modal/ModalCloseButton.kt

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,27 @@ import com.google.gson.annotations.SerializedName
44

55
data class ModalCloseButton(
66
@SerializedName("width")
7-
val width: Int,
7+
var width: Int? = null,
88
@SerializedName("height")
9-
val height: Int,
9+
var height: Int? = null,
1010
@SerializedName("available_width")
11-
val availableWidth: Int,
11+
var availableWidth: Int? = null,
1212
@SerializedName("available_height")
13-
val availableHeight: Int,
13+
var availableHeight: Int? = null,
1414
@SerializedName("color")
15-
val color: String,
15+
var color: String? = null,
1616
@SerializedName("color_type")
17-
val colorType: String,
18-
)
17+
var colorType: String? = null,
18+
@SerializedName("alternative_text")
19+
var alternativeText: String? = null,
20+
) {
21+
init {
22+
width = width ?: 26
23+
height = height ?: 26
24+
availableWidth = availableWidth ?: 60
25+
availableHeight = availableHeight ?: 60
26+
color = color ?: "#001435"
27+
colorType = colorType ?: "dark"
28+
alternativeText = alternativeText ?: "PayPal learn more modal close"
29+
}
30+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ object ApiMessageData {
2424
data class ContentDetails(
2525
@SerializedName("main")
2626
val main: String?,
27+
@SerializedName("main_alternative")
28+
val mainAlternative: String?,
2729
@SerializedName("disclaimer")
2830
val disclaimer: String?,
2931
)

library/src/main/res/layout/paypal_message_modal_sheet_layout.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,5 @@
4949
android:layout_marginEnd="12dip"
5050
android:background="@drawable/ic_close"
5151
android:scaleType="center"
52-
android:contentDescription="Close modal" />
52+
android:contentDescription="PayPal learn more modal close" />
5353
</RelativeLayout>

library/src/test/java/com/paypal/messages/config/modal/ModalCloseButtonTest.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class ModalCloseButtonTest {
1212
availableHeight = 200,
1313
color = "#FFFFFF",
1414
colorType = "solid",
15+
alternativeText = "test_alternative_text",
1516
)
1617

1718
@Test
@@ -22,6 +23,7 @@ class ModalCloseButtonTest {
2223
assertEquals(modalCloseButton.availableHeight, 200)
2324
assertEquals(modalCloseButton.color, "#FFFFFF")
2425
assertEquals(modalCloseButton.colorType, "solid")
26+
assertEquals(modalCloseButton.alternativeText, "test_alternative_text")
2527
}
2628

2729
@Test
@@ -31,7 +33,8 @@ class ModalCloseButtonTest {
3133

3234
assertEquals(
3335
json,
34-
"{\"width\":100,\"height\":100,\"available_width\":200,\"available_height\":200,\"color\":\"#FFFFFF\",\"color_type\":\"solid\"}",
36+
@Suppress("ktlint:standard:max-line-length")
37+
"""{"width":100,"height":100,"available_width":200,"available_height":200,"color":"#FFFFFF","color_type":"solid","alternative_text":"test_alternative_text"}""",
3538
)
3639
}
3740
}

library/src/test/java/com/paypal/messages/io/ApiHashDataTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ class ApiHashDataTest {
3434
val json = gson.toJson(response)
3535
assertEquals(
3636
json,
37-
"{\"cache_flow_disabled\":true,\"ttl_soft\":1000,\"ttl_hard\":2000,\"merchant_profile\":{\"hash\":\"test_merchant_profile_hash\"}}",
37+
@Suppress("ktlint:standard:max-line-length")
38+
"""{"cache_flow_disabled":true,"ttl_soft":1000,"ttl_hard":2000,"merchant_profile":{"hash":"test_merchant_profile_hash"}}""",
3839
)
3940
}
4041

@@ -46,6 +47,6 @@ class ApiHashDataTest {
4647
@Test
4748
fun testMerchantProfileSerialization() {
4849
val json = gson.toJson(merchantProfile)
49-
assertEquals(json, "{\"hash\":\"test_merchant_profile_hash\"}")
50+
assertEquals(json, """{"hash":"test_merchant_profile_hash"}""")
5051
}
5152
}

library/src/test/java/com/paypal/messages/io/ApiMessageDataTest.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,9 @@ class ApiMessageDataTest {
4949
)
5050

5151
private val main = "test_main"
52+
private val mainAlternative = "test_alternative"
5253
private val disclaimer = "test_disclaimer"
53-
private val contentDetails = ApiMessageData.ContentDetails(main, disclaimer)
54+
private val contentDetails = ApiMessageData.ContentDetails(main, mainAlternative, disclaimer)
5455
private val contentOptions = ApiMessageData.ContentOptions(contentDetails, contentDetails)
5556
private val response = ApiMessageData.Response(metadata, contentOptions)
5657

@@ -67,7 +68,7 @@ class ApiMessageDataTest {
6768
val json = gson.toJson(response)
6869

6970
@Suppress("ktlint:standard:max-line-length")
70-
val expectedJson = """{"meta":{"credit_product_group":"PAYPAL_CREDIT","offer_country_code":"US","offer_type":"PAY_LATER_SHORT_TERM","message_type":"OFFER","modal_close_button":{"width":100,"height":100,"available_width":200,"available_height":200,"color":"#FFFFFF","color_type":"solid"},"variables":{"inline_logo_placeholder":"test_logo_placeholder"},"merchant_country_code":"US","credit_product_identifiers":["test_credit_product_identifier"],"debug_id":"test_debug_id","fdata":"test_fdata","tracking_keys":["test_tracking_key"],"originating_instance_id":"350e8400-e29b-41d4-a716-446655440000"},"content":{"default":{"main":"test_main","disclaimer":"test_disclaimer"},"generic":{"main":"test_main","disclaimer":"test_disclaimer"}}}"""
71+
val expectedJson = """{"meta":{"credit_product_group":"PAYPAL_CREDIT","offer_country_code":"US","offer_type":"PAY_LATER_SHORT_TERM","message_type":"OFFER","modal_close_button":{"width":100,"height":100,"available_width":200,"available_height":200,"color":"#FFFFFF","color_type":"solid","alternative_text":"PayPal learn more modal close"},"variables":{"inline_logo_placeholder":"test_logo_placeholder"},"merchant_country_code":"US","credit_product_identifiers":["test_credit_product_identifier"],"debug_id":"test_debug_id","fdata":"test_fdata","tracking_keys":["test_tracking_key"],"originating_instance_id":"350e8400-e29b-41d4-a716-446655440000"},"content":{"default":{"main":"test_main","main_alternative":"test_alternative","disclaimer":"test_disclaimer"},"generic":{"main":"test_main","main_alternative":"test_alternative","disclaimer":"test_disclaimer"}}}"""
7172
assertEquals(expectedJson, json)
7273
}
7374

@@ -82,20 +83,21 @@ class ApiMessageDataTest {
8283
val json = gson.toJson(contentOptions)
8384

8485
@Suppress("ktlint:standard:max-line-length")
85-
val expectedJson = """{"default":{"main":"test_main","disclaimer":"test_disclaimer"},"generic":{"main":"test_main","disclaimer":"test_disclaimer"}}"""
86+
val expectedJson = """{"default":{"main":"test_main","main_alternative":"test_alternative","disclaimer":"test_disclaimer"},"generic":{"main":"test_main","main_alternative":"test_alternative","disclaimer":"test_disclaimer"}}"""
8687
assertEquals(expectedJson, json)
8788
}
8889

8990
@Test
9091
fun testContentDetailsConstructor() {
9192
assertEquals(main, contentDetails.main)
93+
assertEquals(mainAlternative, contentDetails.mainAlternative)
9294
assertEquals(disclaimer, contentDetails.disclaimer)
9395
}
9496

9597
@Test
9698
fun testContentDetailsSerialization() {
9799
val json = gson.toJson(contentDetails)
98-
assertEquals(json, """{"main":"test_main","disclaimer":"test_disclaimer"}""")
100+
assertEquals(json, """{"main":"test_main","main_alternative":"test_alternative","disclaimer":"test_disclaimer"}""")
99101
}
100102

101103
@Test
@@ -119,7 +121,7 @@ class ApiMessageDataTest {
119121
val json = gson.toJson(metadata)
120122

121123
@Suppress("ktlint:standard:max-line-length")
122-
val expectedJson = """{"credit_product_group":"PAYPAL_CREDIT","offer_country_code":"US","offer_type":"PAY_LATER_SHORT_TERM","message_type":"OFFER","modal_close_button":{"width":100,"height":100,"available_width":200,"available_height":200,"color":"#FFFFFF","color_type":"solid"},"variables":{"inline_logo_placeholder":"test_logo_placeholder"},"merchant_country_code":"US","credit_product_identifiers":["test_credit_product_identifier"],"debug_id":"test_debug_id","fdata":"test_fdata","tracking_keys":["test_tracking_key"],"originating_instance_id":"350e8400-e29b-41d4-a716-446655440000"}"""
124+
val expectedJson = """{"credit_product_group":"PAYPAL_CREDIT","offer_country_code":"US","offer_type":"PAY_LATER_SHORT_TERM","message_type":"OFFER","modal_close_button":{"width":100,"height":100,"available_width":200,"available_height":200,"color":"#FFFFFF","color_type":"solid","alternative_text":"PayPal learn more modal close"},"variables":{"inline_logo_placeholder":"test_logo_placeholder"},"merchant_country_code":"US","credit_product_identifiers":["test_credit_product_identifier"],"debug_id":"test_debug_id","fdata":"test_fdata","tracking_keys":["test_tracking_key"],"originating_instance_id":"350e8400-e29b-41d4-a716-446655440000"}"""
123125
assertEquals(expectedJson, json)
124126
}
125127

0 commit comments

Comments
 (0)