Skip to content

Commit 27010b0

Browse files
authored
Callout custom dismiss content description ANDROID-16865 (#455)
* Add callout custom dismiss content description ANDROID-16865 * Update using Enum.entries ANDROID-16865 * Update extract CalloutDismissButton ANDROID-16865 * Update using blank instead of empty (copilot suggestion) ANDROID-16865
1 parent 29eda0d commit 27010b0

File tree

6 files changed

+75
-14
lines changed

6 files changed

+75
-14
lines changed

catalog/src/main/java/com/telefonica/mistica/catalog/ui/classic/components/CalloutsCatalogFragment.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import com.telefonica.mistica.input.DropDownInput
1818
import com.telefonica.mistica.input.TextInput
1919
import com.telefonica.mistica.util.getMisticaThemeDrawable
2020
import com.telefonica.mistica.util.getThemeColor
21+
import com.telefonica.mistica.util.hide
22+
import com.telefonica.mistica.util.show
2123

2224
class CalloutsCatalogFragment : Fragment() {
2325

@@ -37,7 +39,7 @@ class CalloutsCatalogFragment : Fragment() {
3739
DropDownInput.Adapter(
3840
view.context,
3941
R.layout.dropdown_menu_popup_item,
40-
CalloutButtonsConfig.values().map { it.name },
42+
CalloutButtonsConfig.entries.map { it.name },
4143
)
4244
)
4345
setText(CalloutButtonsConfig.PRIMARY.name)
@@ -47,7 +49,7 @@ class CalloutsCatalogFragment : Fragment() {
4749
DropDownInput.Adapter(
4850
view.context,
4951
R.layout.dropdown_menu_popup_item,
50-
CalloutViewImageConfig.values().map { it.name },
52+
CalloutViewImageConfig.entries.map { it.name },
5153
)
5254
)
5355
setText(CalloutViewImageConfig.ICON.name)
@@ -86,7 +88,10 @@ class CalloutsCatalogFragment : Fragment() {
8688
}
8789
}
8890

89-
setDismissable(view.findViewById<CheckBoxInput>(R.id.dismiss_input).isChecked())
91+
val dismissInput = view.findViewById<CheckBoxInput>(R.id.dismiss_input)
92+
setDismissable(dismissInput.isChecked())
93+
setDismissContentDescription(view.findViewById<TextInput>(R.id.dismiss_content_description_input).text.toString())
94+
9095
val inverse = view.findViewById<CheckBoxInput>(R.id.inverse_input).isChecked()
9196
setInverse(inverse)
9297
with(view.findViewById<View>(R.id.callout_preview_container)) {
@@ -109,6 +114,14 @@ class CalloutsCatalogFragment : Fragment() {
109114
setSecondaryButtonOnClick { showToast(context, "Secondary button clicked!") }
110115
setLinkButtonOnClick { showToast(context, "Link button clicked!") }
111116
setOnDismiss { showToast(context, "Callout dismissed! Update to show again") }
117+
dismissInput.setOnCheckedChangeListener { _, isChecked ->
118+
val input = view.findViewById<TextInput>(R.id.dismiss_content_description_input)
119+
if (isChecked) {
120+
input.show()
121+
} else {
122+
input.hide()
123+
}
124+
}
112125
}
113126
}
114127

catalog/src/main/java/com/telefonica/mistica/catalog/ui/compose/components/Callouts.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ fun Callouts() {
4141
verticalArrangement = Arrangement.spacedBy(8.dp)
4242
) {
4343
var inverse by remember { mutableStateOf(false) }
44+
var dismissContentDescription: String by remember { mutableStateOf("") }
4445
Row(
4546
modifier = Modifier.padding(horizontal = 16.dp),
4647
verticalAlignment = Alignment.CenterVertically
@@ -54,9 +55,9 @@ fun Callouts() {
5455
modifier = Modifier
5556
.fillMaxWidth()
5657
.padding(40.dp, 8.dp),
57-
items = CalloutViewImageConfig.values().map { it.name },
58-
currentItemIndex = CalloutViewImageConfig.values().indexOf(iconType),
59-
onItemSelected = { index -> iconType = CalloutViewImageConfig.values()[index] },
58+
items = CalloutViewImageConfig.entries.map { it.name },
59+
currentItemIndex = CalloutViewImageConfig.entries.indexOf(iconType),
60+
onItemSelected = { index -> iconType = CalloutViewImageConfig.entries.toTypedArray()[index] },
6061
hint = "Icon type",
6162
)
6263

@@ -69,6 +70,17 @@ fun Callouts() {
6970
Text("Is dismissable")
7071
}
7172

73+
if (dismissable) {
74+
OutlinedTextField(
75+
modifier = Modifier
76+
.fillMaxWidth()
77+
.padding(horizontal = 16.dp),
78+
value = dismissContentDescription,
79+
label = {Text("Custom dismiss content description")},
80+
onValueChange = { dismissContentDescription = it },
81+
)
82+
}
83+
7284
var title by remember { mutableStateOf("Callout sample title") }
7385
OutlinedTextField(
7486
modifier = Modifier
@@ -159,6 +171,7 @@ fun Callouts() {
159171
CalloutViewImageConfig.SQUARE_IMAGE -> R.drawable.card_image_sample
160172
},
161173
dismissable = dismissable,
174+
dismissContentDescription = dismissContentDescription,
162175
inverse = inverse,
163176
onDismiss = { isShown = false },
164177
primaryButtonText = primaryButtonText.takeIf { it.isNotBlank() },

catalog/src/main/res/layout/screen_callouts_catalog.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,16 @@
3737
app:inputCheckText="Is Dismissable"
3838
/>
3939

40+
<com.telefonica.mistica.input.TextInput
41+
android:id="@+id/dismiss_content_description_input"
42+
android:layout_width="match_parent"
43+
android:layout_height="wrap_content"
44+
android:layout_margin="8dp"
45+
app:inputHint="Custom dismiss content description"
46+
app:inputText=""
47+
app:inputType="text"
48+
/>
49+
4050
<com.telefonica.mistica.input.DropDownInput
4151
android:id="@+id/image_config_dropdown"
4252
android:layout_width="match_parent"

library/src/main/java/com/telefonica/mistica/callout/CalloutView.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ class CalloutView @JvmOverloads constructor(
169169
?.let { setAsset(it) }
170170

171171
dismissable = styledAttrs.getBoolean(R.styleable.CalloutView_calloutDismissable, false)
172+
styledAttrs.getString(R.styleable.CalloutView_calloutDismissContentDescription)?.let {
173+
setDismissContentDescription(it)
174+
}
172175
inverse = styledAttrs.getBoolean(R.styleable.CalloutView_calloutInverse, false)
173176

174177
styledAttrs.recycle()
@@ -185,6 +188,14 @@ class CalloutView @JvmOverloads constructor(
185188
closeButton.visibility = if (dismissable) VISIBLE else GONE
186189
}
187190

191+
fun setDismissContentDescription(contentDescription: String) {
192+
if (contentDescription.isBlank()) {
193+
closeButton.contentDescription = context.getString(R.string.close_button_content_description)
194+
} else {
195+
closeButton.contentDescription = contentDescription
196+
}
197+
}
198+
188199
fun setInverse(inverse: Boolean) {
189200
val backgroundDrawable = if (inverse) R.drawable.bg_callout_inverse else R.drawable.bg_callout
190201
background = AppCompatResources.getDrawable(context, backgroundDrawable)
@@ -398,7 +409,7 @@ enum class CalloutViewImageConfig(val value: Int) {
398409

399410
companion object {
400411
fun getConfigByValue(item: Int): CalloutViewImageConfig {
401-
return values().firstOrNull { it.value == item } ?: NONE
412+
return CalloutViewImageConfig.entries.firstOrNull { it.value == item } ?: NONE
402413
}
403414
}
404415
}

library/src/main/java/com/telefonica/mistica/compose/callout/Callout.kt

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ fun Callout(
4141
@DrawableRes iconRes: Int? = null,
4242
imageConfig: CalloutViewImageConfig = CalloutViewImageConfig.NONE,
4343
dismissable: Boolean,
44+
dismissContentDescription: String? = null,
4445
onDismiss: (() -> Unit)? = null,
4546
inverse: Boolean,
4647
primaryButtonText: String? = null,
@@ -166,13 +167,9 @@ fun Callout(
166167
}
167168

168169
if (dismissable) {
169-
Image(
170-
modifier = Modifier
171-
.clickable { onDismiss?.invoke() }
172-
.semantics { traversalIndex = 1f }
173-
.testTag(CalloutTestTag.CLOSE_BUTTON),
174-
painter = painterResource(id = R.drawable.icn_cross),
175-
contentDescription = stringResource(id = R.string.close_button_content_description)
170+
CalloutDismissButton(
171+
dismissContentDescription = dismissContentDescription,
172+
onDismiss = onDismiss
176173
)
177174
}
178175
}
@@ -284,6 +281,22 @@ private fun Icon(
284281
iconPainter.Paint()
285282
}
286283

284+
@Composable
285+
private fun CalloutDismissButton(
286+
dismissContentDescription: String?,
287+
onDismiss: (() -> Unit)?,
288+
) {
289+
Image(
290+
modifier = Modifier
291+
.clickable { onDismiss?.invoke() }
292+
.semantics { traversalIndex = 1f }
293+
.testTag(CalloutTestTag.CLOSE_BUTTON),
294+
painter = painterResource(id = R.drawable.icn_cross),
295+
contentDescription = dismissContentDescription.takeIf { !it.isNullOrBlank() }
296+
?: stringResource(id = R.string.close_button_content_description)
297+
)
298+
}
299+
287300
enum class CalloutButtonConfig {
288301
NONE,
289302
PRIMARY,

library/src/main/res/values/attrs_components.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@
312312
<attr name="calloutLinkButtonText" format="string" />
313313
<attr name="calloutLinkButtonOnClick" format="string" />
314314
<attr name="calloutDismissable" format="boolean"/>
315+
<attr name="calloutDismissContentDescription" format="string"/>
315316
<attr name="calloutInverse" format="boolean"/>
316317
</declare-styleable>
317318

0 commit comments

Comments
 (0)