diff --git a/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt index 7adbf3cd63..b71bb9e192 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorFragment.kt @@ -65,9 +65,15 @@ class CreditCardEditorFragment : Fragment(R.layout.fragment_credit_card_editor) override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.credit_card_editor, menu) + + menu.findItem(R.id.delete_credit_card_button).isVisible = isEditing } override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { + R.id.delete_credit_card_button -> { + args.creditCard?.let { interactor.onDeleteCardButtonClicked(it.guid) } + true + } R.id.save_credit_card_button -> { saveCreditCard() true @@ -88,7 +94,7 @@ class CreditCardEditorFragment : Fragment(R.layout.fragment_credit_card_editor) cardNumber = card_number_input.text.toString(), expiryMonth = (expiry_month_drop_down.selectedItemPosition + 1).toLong(), expiryYear = expiry_year_drop_down.selectedItem.toString().toLong(), - cardType = "amex" + cardType = CARD_TYPE_PLACEHOLDER ) ) } @@ -96,5 +102,9 @@ class CreditCardEditorFragment : Fragment(R.layout.fragment_credit_card_editor) companion object { // Number of years to show in the expiry year dropdown. const val NUMBER_OF_YEARS_TO_SHOW = 10 + + // Placeholder for the card type. This will be replaced when we can identify the card type. + // This is dependent on https://github.com/mozilla-mobile/android-components/issues/9813. + const val CARD_TYPE_PLACEHOLDER = "" } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorState.kt b/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorState.kt index f7c2ce1dc3..ed9c627477 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorState.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorState.kt @@ -11,13 +11,15 @@ import java.util.Calendar /** * The state for the [CreditCardEditorFragment]. * + * @property guid The unique identifier for the edited credit card. * @property billingName The credit card billing name to display. * @property cardNumber The credit card number to display. * @property expiryMonth The selected credit card expiry month. * @property expiryYears The range of expiry years to display. - * @property isEditing Whether or not the credit is being edited. + * @property isEditing Whether or not the credit card is being edited. */ data class CreditCardEditorState( + val guid: String = "", val billingName: String = "", val cardNumber: String = "", val expiryMonth: Int = 1, @@ -33,6 +35,7 @@ fun CreditCard.toCreditCardEditorState(): CreditCardEditorState { val endYear = startYear + NUMBER_OF_YEARS_TO_SHOW return CreditCardEditorState( + guid = guid, billingName = billingName, cardNumber = cardNumber, expiryMonth = expiryMonth.toInt(), diff --git a/app/src/main/java/org/mozilla/fenix/settings/creditcards/controller/CreditCardEditorController.kt b/app/src/main/java/org/mozilla/fenix/settings/creditcards/controller/CreditCardEditorController.kt index 7094e7018d..0c996cd88d 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/creditcards/controller/CreditCardEditorController.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/creditcards/controller/CreditCardEditorController.kt @@ -23,6 +23,11 @@ interface CreditCardEditorController { */ fun handleCancelButtonClicked() + /** + * @see [CreditCardEditorInteractor.onDeleteCardButtonClicked] + */ + fun handleDeleteCreditCard(guid: String) + /** * @see [CreditCardEditorInteractor.onSaveButtonClicked] */ @@ -49,6 +54,16 @@ class DefaultCreditCardEditorController( navController.popBackStack() } + override fun handleDeleteCreditCard(guid: String) { + lifecycleScope.launch(ioDispatcher) { + storage.deleteCreditCard(guid) + + lifecycleScope.launch(Dispatchers.Main) { + navController.popBackStack() + } + } + } + override fun handleSaveCreditCard(creditCardFields: UpdatableCreditCardFields) { lifecycleScope.launch(ioDispatcher) { storage.addCreditCard(creditCardFields) diff --git a/app/src/main/java/org/mozilla/fenix/settings/creditcards/interactor/CreditCardEditorInteractor.kt b/app/src/main/java/org/mozilla/fenix/settings/creditcards/interactor/CreditCardEditorInteractor.kt index a66551d241..4613ecb811 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/creditcards/interactor/CreditCardEditorInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/creditcards/interactor/CreditCardEditorInteractor.kt @@ -18,6 +18,14 @@ interface CreditCardEditorInteractor { */ fun onCancelButtonClicked() + /** + * Deletes the provided credit card in the credit card storage. Called when a user + * taps on the delete menu item or "Delete card" button. + * + * @param guid Unique identifier for the credit card to be deleted. + */ + fun onDeleteCardButtonClicked(guid: String) + /** * Saves the provided credit card field into the credit card storage. Called when a user * taps on the save menu item or "Save" button. @@ -41,6 +49,10 @@ class DefaultCreditCardEditorInteractor( controller.handleCancelButtonClicked() } + override fun onDeleteCardButtonClicked(guid: String) { + controller.handleDeleteCreditCard(guid) + } + override fun onSaveButtonClicked(creditCardFields: UpdatableCreditCardFields) { controller.handleSaveCreditCard(creditCardFields) } diff --git a/app/src/main/java/org/mozilla/fenix/settings/creditcards/view/CreditCardEditorView.kt b/app/src/main/java/org/mozilla/fenix/settings/creditcards/view/CreditCardEditorView.kt index 64d51a3df4..e7906391b6 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/creditcards/view/CreditCardEditorView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/creditcards/view/CreditCardEditorView.kt @@ -12,6 +12,7 @@ import kotlinx.android.synthetic.main.fragment_credit_card_editor.* import mozilla.components.concept.storage.UpdatableCreditCardFields import mozilla.components.support.ktx.android.view.hideKeyboard import org.mozilla.fenix.ext.toEditable +import org.mozilla.fenix.settings.creditcards.CreditCardEditorFragment.Companion.CARD_TYPE_PLACEHOLDER import org.mozilla.fenix.settings.creditcards.CreditCardEditorState import org.mozilla.fenix.settings.creditcards.interactor.CreditCardEditorInteractor import java.text.SimpleDateFormat @@ -30,6 +31,16 @@ class CreditCardEditorView( * Binds the given [CreditCardEditorState] in the [CreditCardEditorFragment]. */ fun bind(state: CreditCardEditorState) { + if (state.isEditing) { + delete_button.apply { + visibility = View.VISIBLE + + setOnClickListener { + interactor.onDeleteCardButtonClicked(state.guid) + } + } + } + cancel_button.setOnClickListener { interactor.onCancelButtonClicked() } @@ -99,7 +110,7 @@ class CreditCardEditorView( cardNumber = card_number_input.text.toString(), expiryMonth = (expiry_month_drop_down.selectedItemPosition + 1).toLong(), expiryYear = expiry_year_drop_down.selectedItem.toString().toLong(), - cardType = "amex" + cardType = CARD_TYPE_PLACEHOLDER ) ) } diff --git a/app/src/main/res/menu/credit_card_editor.xml b/app/src/main/res/menu/credit_card_editor.xml index defcc8b303..5b4c672a2a 100644 --- a/app/src/main/res/menu/credit_card_editor.xml +++ b/app/src/main/res/menu/credit_card_editor.xml @@ -4,6 +4,13 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->