From d63d0c59c1e064a03de980389481084b139586fd Mon Sep 17 00:00:00 2001 From: Arturo Mejia Date: Wed, 20 Jan 2021 17:05:44 -0500 Subject: [PATCH] Closes #9471: Fix Confirm and Alert js dialogs don't show buttons when the message is too long. --- .../AbstractPromptTextDialogFragment.kt | 71 +++++++++++++++++++ .../prompts/dialog/AlertDialogFragment.kt | 41 +---------- .../dialog/MultiButtonDialogFragment.kt | 39 +--------- .../dialog/TextPromptDialogFragment.kt | 38 +--------- ..._feature_many_dialogs_checkbox_dialogs.xml | 20 ------ .../mozac_feature_prompt_with_check_box.xml | 47 ++++++++++++ .../res/layout/mozac_feature_text_prompt.xml | 2 +- .../prompts/src/main/res/values/ids.xml | 7 ++ .../prompts/dialog/AlertDialogFragmentTest.kt | 20 +++--- .../dialog/MultiButtonDialogFragmentTest.kt | 20 +++--- .../dialog/TextPromptDialogFragmentTest.kt | 6 +- docs/changelog.md | 3 + 12 files changed, 161 insertions(+), 153 deletions(-) create mode 100644 components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/AbstractPromptTextDialogFragment.kt delete mode 100644 components/feature/prompts/src/main/res/layout/mozac_feature_many_dialogs_checkbox_dialogs.xml create mode 100644 components/feature/prompts/src/main/res/layout/mozac_feature_prompt_with_check_box.xml create mode 100644 components/feature/prompts/src/main/res/values/ids.xml diff --git a/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/AbstractPromptTextDialogFragment.kt b/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/AbstractPromptTextDialogFragment.kt new file mode 100644 index 00000000000..77d2c3c02b2 --- /dev/null +++ b/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/AbstractPromptTextDialogFragment.kt @@ -0,0 +1,71 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.feature.prompts.dialog + +import android.annotation.SuppressLint +import android.text.method.ScrollingMovementMethod +import android.view.LayoutInflater +import android.view.View +import android.widget.CheckBox +import android.widget.TextView +import androidx.annotation.IdRes +import androidx.appcompat.app.AlertDialog +import androidx.core.view.isVisible +import mozilla.components.feature.prompts.R + +internal const val KEY_MANY_ALERTS = "KEY_MANY_ALERTS" +internal const val KEY_USER_CHECK_BOX = "KEY_USER_CHECK_BOX" +/** + * An abstract alert for showing a text message plus a checkbox for handling [hasShownManyDialogs]. + */ +internal abstract class AbstractPromptTextDialogFragment : PromptDialogFragment() { + + /** + * Tells if a checkbox should be shown for preventing this [sessionId] from showing more dialogs. + */ + internal val hasShownManyDialogs: Boolean by lazy { safeArguments.getBoolean(KEY_MANY_ALERTS) } + + /** + * Stores the user's decision from the checkbox + * for preventing this [sessionId] from showing more dialogs. + */ + internal var userSelectionNoMoreDialogs: Boolean + get() = safeArguments.getBoolean(KEY_USER_CHECK_BOX) + set(value) { + safeArguments.putBoolean(KEY_USER_CHECK_BOX, value) + } + + /** + * Creates custom view that adds a [TextView] + [CheckBox] and attach the corresponding + * events for handling [hasShownManyDialogs]. + */ + @SuppressLint("InflateParams") + internal fun setCustomMessageView(builder: AlertDialog.Builder): AlertDialog.Builder { + val inflater = LayoutInflater.from(requireContext()) + val view = inflater.inflate(R.layout.mozac_feature_prompt_with_check_box, null) + val textView = view.findViewById(R.id.message) + textView.text = message + textView.movementMethod = ScrollingMovementMethod() + + addCheckBoxIfNeeded(view) + + builder.setView(view) + + return builder + } + + internal fun addCheckBoxIfNeeded( + view: View, + @IdRes id: Int = R.id.mozac_feature_prompts_no_more_dialogs_check_box + ) { + if ((hasShownManyDialogs)) { + val checkBox = view.findViewById(id) + checkBox.isVisible = true + checkBox.setOnCheckedChangeListener { _, isChecked -> + userSelectionNoMoreDialogs = isChecked + } + } + } +} diff --git a/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/AlertDialogFragment.kt b/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/AlertDialogFragment.kt index 4b9aa51f220..566ddb186dc 100644 --- a/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/AlertDialogFragment.kt +++ b/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/AlertDialogFragment.kt @@ -4,47 +4,25 @@ package mozilla.components.feature.prompts.dialog -import android.annotation.SuppressLint import android.app.Dialog import android.content.DialogInterface import android.os.Bundle -import android.view.LayoutInflater -import android.widget.CheckBox import androidx.appcompat.app.AlertDialog -import mozilla.components.feature.prompts.R - -private const val KEY_MANY_ALERTS = "KEY_MANY_ALERTS" -private const val KEY_USER_CHECK_BOX = "KEY_USER_CHECK_BOX" /** * [android.support.v4.app.DialogFragment] implementation to display web Alerts with native dialogs. */ -internal class AlertDialogFragment : PromptDialogFragment() { - - /** - * Tells if a checkbox should be shown for preventing this [sessionId] from showing more dialogs. - */ - internal val hasShownManyDialogs: Boolean by lazy { safeArguments.getBoolean(KEY_MANY_ALERTS) } - - /** - * Stores the user's decision from the checkbox - * for preventing this [sessionId] from showing more dialogs. - */ - private var userSelectionNoMoreDialogs: Boolean - get() = safeArguments.getBoolean(KEY_USER_CHECK_BOX) - set(value) { - safeArguments.putBoolean(KEY_USER_CHECK_BOX, value) - } +internal class AlertDialogFragment : AbstractPromptTextDialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val builder = AlertDialog.Builder(requireContext()) .setTitle(title) .setCancelable(true) - .setMessage(message) .setPositiveButton(android.R.string.ok) { _, _ -> onPositiveClickAction() } - return (if (hasShownManyDialogs) addCheckbox(builder) else builder) + return setCustomMessageView(builder) .create() } @@ -61,19 +39,6 @@ internal class AlertDialogFragment : PromptDialogFragment() { } } - @SuppressLint("InflateParams") - private fun addCheckbox(builder: AlertDialog.Builder): AlertDialog.Builder { - val inflater = LayoutInflater.from(requireContext()) - val view = inflater.inflate(R.layout.mozac_feature_many_dialogs_checkbox_dialogs, null) - val checkBox = view.findViewById(R.id.no_more_dialogs_check_box) - checkBox.setOnCheckedChangeListener { _, isChecked -> - userSelectionNoMoreDialogs = isChecked - } - builder.setView(view) - - return builder - } - companion object { /** * A builder method for creating a [AlertDialogFragment] diff --git a/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/MultiButtonDialogFragment.kt b/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/MultiButtonDialogFragment.kt index ba7112e9f6d..fc5bf46780a 100644 --- a/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/MultiButtonDialogFragment.kt +++ b/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/MultiButtonDialogFragment.kt @@ -4,18 +4,12 @@ package mozilla.components.feature.prompts.dialog -import android.annotation.SuppressLint import android.app.Dialog import android.content.DialogInterface import android.os.Bundle -import android.view.LayoutInflater -import android.widget.CheckBox import androidx.appcompat.app.AlertDialog -import mozilla.components.feature.prompts.R -private const val KEY_MANY_ALERTS = "KEY_MANY_ALERTS" private const val KEY_SHOULD_DISMISS_ON_LOAD = "KEY_SHOULD_DISMISS_ON_LOAD" -private const val KEY_USER_CHECK_BOX = "KEY_USER_CHECK_BOX" private const val KEY_POSITIVE_BUTTON_TITLE = "KEY_POSITIVE_BUTTON_TITLE" private const val KEY_NEGATIVE_BUTTON_TITLE = "KEY_NEGATIVE_BUTTON_TITLE" private const val KEY_NEUTRAL_BUTTON_TITLE = "KEY_NEUTRAL_BUTTON_TITLE" @@ -24,12 +18,7 @@ private const val KEY_NEUTRAL_BUTTON_TITLE = "KEY_NEUTRAL_BUTTON_TITLE" * [android.support.v4.app.DialogFragment] implementation to display a confirm dialog, * it can have up to three buttons, they could be positive, negative or neutral. */ -internal class MultiButtonDialogFragment : PromptDialogFragment() { - - /** - * Tells if a checkbox should be shown for preventing this [sessionId] from showing more dialogs. - */ - internal val hasShownManyDialogs: Boolean by lazy { safeArguments.getBoolean(KEY_MANY_ALERTS) } +internal class MultiButtonDialogFragment : AbstractPromptTextDialogFragment() { internal val positiveButtonTitle: String? by lazy { safeArguments.getString(KEY_POSITIVE_BUTTON_TITLE) } @@ -39,23 +28,12 @@ internal class MultiButtonDialogFragment : PromptDialogFragment() { override fun shouldDismissOnLoad() = safeArguments.getBoolean(KEY_SHOULD_DISMISS_ON_LOAD, true) - /** - * Stores the user's decision from the checkbox - * for preventing this [sessionId] from showing more dialogs. - */ - private var userSelectionNoMoreDialogs: Boolean - get() = safeArguments.getBoolean(KEY_USER_CHECK_BOX) - set(value) { - safeArguments.putBoolean(KEY_USER_CHECK_BOX, value) - } - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val builder = AlertDialog.Builder(requireContext()) .setTitle(title) .setCancelable(true) - .setMessage(message) .setupButtons() - return (if (hasShownManyDialogs) addCheckbox(builder) else builder) + return setCustomMessageView(builder) .create() } @@ -64,19 +42,6 @@ internal class MultiButtonDialogFragment : PromptDialogFragment() { feature?.onCancel(sessionId) } - @SuppressLint("InflateParams") - private fun addCheckbox(builder: AlertDialog.Builder): AlertDialog.Builder { - val inflater = LayoutInflater.from(requireContext()) - val view = inflater.inflate(R.layout.mozac_feature_many_dialogs_checkbox_dialogs, null) - val checkBox = view.findViewById(R.id.no_more_dialogs_check_box) - checkBox.setOnCheckedChangeListener { _, isChecked -> - userSelectionNoMoreDialogs = isChecked - } - builder.setView(view) - - return builder - } - private fun AlertDialog.Builder.setupButtons(): AlertDialog.Builder { if (!positiveButtonTitle.isNullOrBlank()) { setPositiveButton(positiveButtonTitle) { _, _ -> diff --git a/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragment.kt b/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragment.kt index 6556bad1949..e2f6cf27027 100644 --- a/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragment.kt +++ b/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragment.kt @@ -11,16 +11,11 @@ import android.os.Bundle import android.text.Editable import android.text.TextWatcher import android.view.LayoutInflater -import android.view.View -import android.view.View.VISIBLE -import android.widget.CheckBox import android.widget.EditText import android.widget.TextView import androidx.appcompat.app.AlertDialog import mozilla.components.feature.prompts.R -private const val KEY_MANY_ALERTS = "KEY_MANY_ALERTS" -private const val KEY_USER_CHECK_BOX = "KEY_USER_CHECK_BOX" private const val KEY_USER_EDIT_TEXT = "KEY_USER_EDIT_TEXT" private const val KEY_LABEL_INPUT = "KEY_LABEL_INPUT" private const val KEY_DEFAULT_INPUT_VALUE = "KEY_DEFAULT_INPUT_VALUE" @@ -29,13 +24,7 @@ private const val KEY_DEFAULT_INPUT_VALUE = "KEY_DEFAULT_INPUT_VALUE" * [androidx.fragment.app.DialogFragment] implementation to display a * Window.prompt() with native dialogs. */ -internal class TextPromptDialogFragment : PromptDialogFragment(), TextWatcher { - - /** - * Tells if a checkbox should be shown for preventing this [sessionId] from showing more dialogs. - */ - internal val hasShownManyDialogs: Boolean by lazy { safeArguments.getBoolean(KEY_MANY_ALERTS) } - +internal class TextPromptDialogFragment : AbstractPromptTextDialogFragment(), TextWatcher { /** * Contains the default() * value provided by this [sessionId]. @@ -48,16 +37,6 @@ internal class TextPromptDialogFragment : PromptDialogFragment(), TextWatcher { */ internal val labelInput: String? by lazy { safeArguments.getString(KEY_LABEL_INPUT) } - /** - * Stores the user's decision from the checkbox - * for preventing this [sessionId] from showing more dialogs. - */ - internal var userSelectionNoMoreDialogs: Boolean - get() = safeArguments.getBoolean(KEY_USER_CHECK_BOX) - set(value) { - safeArguments.putBoolean(KEY_USER_CHECK_BOX, value) - } - private var userSelectionEditText: String get() = safeArguments.getString(KEY_USER_EDIT_TEXT, defaultInputValue) set(value) { @@ -94,24 +73,11 @@ internal class TextPromptDialogFragment : PromptDialogFragment(), TextWatcher { editText.setText(defaultInputValue) editText.addTextChangedListener(this) - if (hasShownManyDialogs) { - addCheckBox(view) - } + addCheckBoxIfNeeded(view) return builder.setView(view) } - @SuppressLint("InflateParams") - private fun addCheckBox(view: View) { - if (hasShownManyDialogs) { - val checkBox = view.findViewById(R.id.no_more_dialogs_check_box) - checkBox.setOnCheckedChangeListener { _, isChecked -> - userSelectionNoMoreDialogs = isChecked - } - checkBox.visibility = VISIBLE - } - } - override fun afterTextChanged(editable: Editable) { userSelectionEditText = editable.toString() } diff --git a/components/feature/prompts/src/main/res/layout/mozac_feature_many_dialogs_checkbox_dialogs.xml b/components/feature/prompts/src/main/res/layout/mozac_feature_many_dialogs_checkbox_dialogs.xml deleted file mode 100644 index 82f9695483e..00000000000 --- a/components/feature/prompts/src/main/res/layout/mozac_feature_many_dialogs_checkbox_dialogs.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - diff --git a/components/feature/prompts/src/main/res/layout/mozac_feature_prompt_with_check_box.xml b/components/feature/prompts/src/main/res/layout/mozac_feature_prompt_with_check_box.xml new file mode 100644 index 00000000000..f094fe9c43b --- /dev/null +++ b/components/feature/prompts/src/main/res/layout/mozac_feature_prompt_with_check_box.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + diff --git a/components/feature/prompts/src/main/res/layout/mozac_feature_text_prompt.xml b/components/feature/prompts/src/main/res/layout/mozac_feature_text_prompt.xml index d0f8f6df56b..c3c9cdc7767 100644 --- a/components/feature/prompts/src/main/res/layout/mozac_feature_text_prompt.xml +++ b/components/feature/prompts/src/main/res/layout/mozac_feature_text_prompt.xml @@ -33,7 +33,7 @@ android:inputType="text"/> + + + + diff --git a/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/AlertDialogFragmentTest.kt b/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/AlertDialogFragmentTest.kt index c8e056485c7..59733452fbf 100644 --- a/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/AlertDialogFragmentTest.kt +++ b/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/AlertDialogFragmentTest.kt @@ -8,14 +8,16 @@ import android.content.DialogInterface.BUTTON_POSITIVE import android.widget.CheckBox import android.widget.TextView import androidx.appcompat.app.AlertDialog +import androidx.core.view.isVisible import androidx.test.ext.junit.runners.AndroidJUnit4 import mozilla.components.feature.prompts.PromptFeature +import mozilla.components.feature.prompts.R import mozilla.components.feature.prompts.R.id import mozilla.components.support.test.mock import mozilla.ext.appCompatContext import org.junit.Assert.assertEquals -import org.junit.Assert.assertNotNull -import org.junit.Assert.assertNull +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -48,8 +50,8 @@ class AlertDialogFragmentTest { dialog.show() val titleTextView = dialog.findViewById(androidx.appcompat.R.id.alertTitle) - val messageTextView = dialog.findViewById(android.R.id.message) - val checkBox = dialog.findViewById(id.no_more_dialogs_check_box) + val messageTextView = dialog.findViewById(R.id.message) + val checkBox = dialog.findViewById(id.mozac_feature_prompts_no_more_dialogs_check_box) assertEquals(fragment.sessionId, "sessionId") assertEquals(fragment.message, "message") @@ -57,8 +59,8 @@ class AlertDialogFragmentTest { assertEquals(titleTextView.text, "title") assertEquals(fragment.title, "title") - assertEquals(messageTextView.text, "message") - assertNotNull(checkBox) + assertEquals(messageTextView.text.toString(), "message") + assertTrue(checkBox.isVisible) } @Test @@ -73,9 +75,9 @@ class AlertDialogFragmentTest { dialog.show() - val checkBox = dialog.findViewById(id.no_more_dialogs_check_box) + val checkBox = dialog.findViewById(id.mozac_feature_prompts_no_more_dialogs_check_box) - assertNull(checkBox) + assertFalse(checkBox.isVisible) } @Test @@ -113,7 +115,7 @@ class AlertDialogFragmentTest { val dialog = fragment.onCreateDialog(null) dialog.show() - val checkBox = dialog.findViewById(id.no_more_dialogs_check_box) + val checkBox = dialog.findViewById(id.mozac_feature_prompts_no_more_dialogs_check_box) checkBox.isChecked = true diff --git a/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/MultiButtonDialogFragmentTest.kt b/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/MultiButtonDialogFragmentTest.kt index e94a2954ff6..ba9b0659900 100644 --- a/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/MultiButtonDialogFragmentTest.kt +++ b/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/MultiButtonDialogFragmentTest.kt @@ -9,13 +9,15 @@ import android.content.DialogInterface.BUTTON_POSITIVE import android.widget.CheckBox import android.widget.TextView import androidx.appcompat.app.AlertDialog +import androidx.core.view.isVisible import androidx.test.ext.junit.runners.AndroidJUnit4 +import mozilla.components.feature.prompts.R import mozilla.components.feature.prompts.R.id import mozilla.components.support.test.mock import mozilla.ext.appCompatContext import org.junit.Assert.assertEquals -import org.junit.Assert.assertNotNull -import org.junit.Assert.assertNull +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -58,8 +60,8 @@ class MultiButtonDialogFragmentTest { dialog.show() val titleTextView = dialog.findViewById(androidx.appcompat.R.id.alertTitle) - val messageTextView = dialog.findViewById(android.R.id.message) - val checkBox = dialog.findViewById(id.no_more_dialogs_check_box) + val messageTextView = dialog.findViewById(R.id.message) + val checkBox = dialog.findViewById(id.mozac_feature_prompts_no_more_dialogs_check_box) val positiveButton = (dialog as AlertDialog).getButton(BUTTON_POSITIVE) val negativeButton = (dialog).getButton(DialogInterface.BUTTON_NEGATIVE) val neutralButton = (dialog).getButton(DialogInterface.BUTTON_NEUTRAL) @@ -70,8 +72,8 @@ class MultiButtonDialogFragmentTest { assertEquals(titleTextView.text, "title") assertEquals(fragment.title, "title") - assertEquals(messageTextView.text, "message") - assertNotNull(checkBox) + assertEquals(messageTextView.text.toString(), "message") + assertTrue(checkBox.isVisible) assertEquals(positiveButton.text, "positiveButton") assertEquals(negativeButton.text, "negativeButton") @@ -100,9 +102,9 @@ class MultiButtonDialogFragmentTest { dialog.show() - val checkBox = dialog.findViewById(id.no_more_dialogs_check_box) + val checkBox = dialog.findViewById(id.mozac_feature_prompts_no_more_dialogs_check_box) - assertNull(checkBox) + assertFalse(checkBox.isVisible) } @Test @@ -207,7 +209,7 @@ class MultiButtonDialogFragmentTest { val dialog = fragment.onCreateDialog(null) dialog.show() - val checkBox = dialog.findViewById(id.no_more_dialogs_check_box) + val checkBox = dialog.findViewById(id.mozac_feature_prompts_no_more_dialogs_check_box) checkBox.isChecked = true diff --git a/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragmentTest.kt b/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragmentTest.kt index a921d46cdb4..6d8f5763346 100644 --- a/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragmentTest.kt +++ b/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragmentTest.kt @@ -51,7 +51,7 @@ class TextPromptDialogFragmentTest { val titleTextView = dialog.findViewById(androidx.appcompat.R.id.alertTitle) val inputLabel = dialog.findViewById(id.input_label) val inputValue = dialog.findViewById(id.input_value) - val checkBox = dialog.findViewById(id.no_more_dialogs_check_box) + val checkBox = dialog.findViewById(id.mozac_feature_prompts_no_more_dialogs_check_box) assertEquals(fragment.sessionId, "sessionId") assertEquals(fragment.title, "title") @@ -85,7 +85,7 @@ class TextPromptDialogFragmentTest { dialog.show() - val checkBox = dialog.findViewById(id.no_more_dialogs_check_box) + val checkBox = dialog.findViewById(id.mozac_feature_prompts_no_more_dialogs_check_box) assertFalse(checkBox.isVisible) } @@ -124,7 +124,7 @@ class TextPromptDialogFragmentTest { val dialog = fragment.onCreateDialog(null) dialog.show() - val checkBox = dialog.findViewById(id.no_more_dialogs_check_box) + val checkBox = dialog.findViewById(id.mozac_feature_prompts_no_more_dialogs_check_box) checkBox.isChecked = true diff --git a/docs/changelog.md b/docs/changelog.md index bbd06cfac77..c31b96a5d49 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -11,6 +11,9 @@ permalink: /changelog/ * [Gecko](https://github.com/mozilla-mobile/android-components/blob/master/buildSrc/src/main/java/Gecko.kt) * [Configuration](https://github.com/mozilla-mobile/android-components/blob/master/.config.yml) +* **feature-prompts**: + * 🚒 Bug fixed [issue #9471](https://github.com/mozilla-mobile/android-components/issues/9471) - Confirm and alert js dialogs don't show "OK" and "Cancel" buttons when the message is too long. + * **support-base** * ⚠️ **This is a breaking change**: Update the signature of `ActivityResultHandler.onActivityResult` to avoid conflict with internal Android APIs.