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 b71bb9e19..91b9ac8ce 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 @@ -75,28 +75,26 @@ class CreditCardEditorFragment : Fragment(R.layout.fragment_credit_card_editor) true } R.id.save_credit_card_button -> { - saveCreditCard() - true - } - else -> false - } - - /** - * Helper function called by the the "Save" button and menu item to save a new credit card - * from the entered credit card fields. - */ - private fun saveCreditCard() { - view?.hideKeyboard() + view?.hideKeyboard() - interactor.onSaveButtonClicked( - UpdatableCreditCardFields( + val creditCard = args.creditCard + val creditCardFields = UpdatableCreditCardFields( billingName = name_on_card_input.text.toString(), cardNumber = card_number_input.text.toString(), expiryMonth = (expiry_month_drop_down.selectedItemPosition + 1).toLong(), expiryYear = expiry_year_drop_down.selectedItem.toString().toLong(), cardType = CARD_TYPE_PLACEHOLDER ) - ) + + if (creditCard != null) { + interactor.onUpdateCreditCard(creditCard.guid, creditCardFields) + } else { + interactor.onSaveCreditCard(creditCardFields) + } + + true + } + else -> false } companion object { 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 0c996cd88..bfa6ca66b 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 @@ -11,6 +11,8 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import mozilla.components.concept.storage.UpdatableCreditCardFields import mozilla.components.service.sync.autofill.AutofillCreditCardsAddressesStorage +import org.mozilla.fenix.settings.creditcards.CreditCardEditorFragment +import org.mozilla.fenix.settings.creditcards.interactor.CreditCardEditorInteractor /** * [CreditCardEditorFragment] controller. An interface that handles the view manipulation of the @@ -29,9 +31,14 @@ interface CreditCardEditorController { fun handleDeleteCreditCard(guid: String) /** - * @see [CreditCardEditorInteractor.onSaveButtonClicked] + * @see [CreditCardEditorInteractor.onSaveCreditCard] */ fun handleSaveCreditCard(creditCardFields: UpdatableCreditCardFields) + + /** + * @see [CreditCardEditorInteractor.onUpdateCreditCard] + */ + fun handleUpdateCreditCard(guid: String, creditCardFields: UpdatableCreditCardFields) } /** @@ -73,4 +80,14 @@ class DefaultCreditCardEditorController( } } } + + override fun handleUpdateCreditCard(guid: String, creditCardFields: UpdatableCreditCardFields) { + lifecycleScope.launch(ioDispatcher) { + storage.updateCreditCard(guid, creditCardFields) + + lifecycleScope.launch(Dispatchers.Main) { + navController.popBackStack() + } + } + } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/creditcards/controller/CreditCardsManagementController.kt b/app/src/main/java/org/mozilla/fenix/settings/creditcards/controller/CreditCardsManagementController.kt index 44fe0af85..bcc0906a0 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/creditcards/controller/CreditCardsManagementController.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/creditcards/controller/CreditCardsManagementController.kt @@ -7,7 +7,9 @@ package org.mozilla.fenix.settings.creditcards.controller import androidx.navigation.NavController import mozilla.components.concept.storage.CreditCard import org.mozilla.fenix.ext.navigateBlockingForAsyncNavGraph +import org.mozilla.fenix.settings.creditcards.CreditCardsManagementFragment import org.mozilla.fenix.settings.creditcards.CreditCardsManagementFragmentDirections +import org.mozilla.fenix.settings.creditcards.interactor.CreditCardsManagementInteractor /** * [CreditCardsManagementFragment] controller. An interface that handles the view manipulation of 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 4613ecb81..2633c57fe 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 @@ -32,7 +32,16 @@ interface CreditCardEditorInteractor { * * @param creditCardFields A [UpdatableCreditCardFields] record to add. */ - fun onSaveButtonClicked(creditCardFields: UpdatableCreditCardFields) + fun onSaveCreditCard(creditCardFields: UpdatableCreditCardFields) + + /** + * Updates the provided credit card with the new credit card fields. Called when a user + * taps on the save menu item or "Save" button when editing an existing credit card. + * + * @param guid Unique identifier for the desired credit card. + * @param creditCardFields The credit card fields to update. + */ + fun onUpdateCreditCard(guid: String, creditCardFields: UpdatableCreditCardFields) } /** @@ -53,7 +62,11 @@ class DefaultCreditCardEditorInteractor( controller.handleDeleteCreditCard(guid) } - override fun onSaveButtonClicked(creditCardFields: UpdatableCreditCardFields) { + override fun onSaveCreditCard(creditCardFields: UpdatableCreditCardFields) { controller.handleSaveCreditCard(creditCardFields) } + + override fun onUpdateCreditCard(guid: String, creditCardFields: UpdatableCreditCardFields) { + controller.handleUpdateCreditCard(guid, 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 e7906391b..adf19410c 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 @@ -46,7 +46,21 @@ class CreditCardEditorView( } save_button.setOnClickListener { - saveCreditCard() + containerView.hideKeyboard() + + val creditCardFields = UpdatableCreditCardFields( + billingName = name_on_card_input.text.toString(), + cardNumber = card_number_input.text.toString(), + expiryMonth = (expiry_month_drop_down.selectedItemPosition + 1).toLong(), + expiryYear = expiry_year_drop_down.selectedItem.toString().toLong(), + cardType = CARD_TYPE_PLACEHOLDER + ) + + if (state.isEditing) { + interactor.onUpdateCreditCard(state.guid, creditCardFields) + } else { + interactor.onSaveCreditCard(creditCardFields) + } } card_number_input.text = state.cardNumber.toEditable() @@ -97,24 +111,6 @@ class CreditCardEditorView( expiry_year_drop_down.adapter = adapter } - /** - * Helper function called by the the "Save" button and menu item to save a new credit card - * from the entered credit card fields. - */ - private fun saveCreditCard() { - containerView.hideKeyboard() - - interactor.onSaveButtonClicked( - UpdatableCreditCardFields( - billingName = name_on_card_input.text.toString(), - cardNumber = card_number_input.text.toString(), - expiryMonth = (expiry_month_drop_down.selectedItemPosition + 1).toLong(), - expiryYear = expiry_year_drop_down.selectedItem.toString().toLong(), - cardType = CARD_TYPE_PLACEHOLDER - ) - ) - } - companion object { // Number of months in a year (0-indexed). const val NUMBER_OF_MONTHS = 11 diff --git a/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt b/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt index 699a9354a..9e97a96f7 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt @@ -17,6 +17,7 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.R +import org.mozilla.fenix.ext.toEditable import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.settings.creditcards.CreditCardEditorFragment.Companion.CARD_TYPE_PLACEHOLDER import org.mozilla.fenix.settings.creditcards.CreditCardEditorFragment.Companion.NUMBER_OF_YEARS_TO_SHOW @@ -119,6 +120,36 @@ class CreditCardEditorViewTest { verify { interactor.onCancelButtonClicked() } } + @Test + fun `GIVEN the credit input are filled WHEN the save button is clicked THEN interactor is called`() { + creditCardEditorView.bind(getInitialCreditCardEditorState()) + + val calendar = Calendar.getInstance() + + val billingName = "Banana Apple" + val cardNumber = "4111111111111110" + val expiryMonth = 5 + val expiryYear = calendar.get(Calendar.YEAR) + + view.card_number_input.text = cardNumber.toEditable() + view.name_on_card_input.text = billingName.toEditable() + view.expiry_month_drop_down.setSelection(expiryMonth - 1) + + view.save_button.performClick() + + verify { + interactor.onSaveCreditCard( + UpdatableCreditCardFields( + billingName = billingName, + cardNumber = cardNumber, + expiryMonth = expiryMonth.toLong(), + expiryYear = expiryYear.toLong(), + cardType = CARD_TYPE_PLACEHOLDER + ) + ) + } + } + @Test fun `GIVEN a credit card WHEN the save button is clicked THEN interactor is called`() { creditCardEditorView.bind(creditCard.toCreditCardEditorState()) @@ -126,8 +157,9 @@ class CreditCardEditorViewTest { view.save_button.performClick() verify { - interactor.onSaveButtonClicked( - UpdatableCreditCardFields( + interactor.onUpdateCreditCard( + guid = creditCard.guid, + creditCardFields = UpdatableCreditCardFields( billingName = creditCard.billingName, cardNumber = creditCard.cardNumber, expiryMonth = creditCard.expiryMonth, diff --git a/app/src/test/java/org/mozilla/fenix/settings/creditcards/DefaultCreditCardEditorControllerTest.kt b/app/src/test/java/org/mozilla/fenix/settings/creditcards/DefaultCreditCardEditorControllerTest.kt index 5721f35d3..3b32f1609 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/creditcards/DefaultCreditCardEditorControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/creditcards/DefaultCreditCardEditorControllerTest.kt @@ -104,4 +104,34 @@ class DefaultCreditCardEditorControllerTest { navController.popBackStack() } } + + @Test + fun handleUpdateCreditCard() = testCoroutineScope.runBlockingTest { + val creditCard = CreditCard( + guid = "id", + billingName = "Banana Apple", + cardNumber = "4111111111111110", + expiryMonth = 1, + expiryYear = 2030, + cardType = "amex", + timeCreated = 1L, + timeLastUsed = 1L, + timeLastModified = 1L, + timesUsed = 1L + ) + val creditCardFields = UpdatableCreditCardFields( + billingName = "Banana Apple", + cardNumber = "4111111111111112", + expiryMonth = 1, + expiryYear = 2034, + cardType = "discover" + ) + + controller.handleUpdateCreditCard(creditCard.guid, creditCardFields) + + coVerify { + storage.updateCreditCard(creditCard.guid, creditCardFields) + navController.popBackStack() + } + } } diff --git a/app/src/test/java/org/mozilla/fenix/settings/creditcards/DefaultCreditCardEditorInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/settings/creditcards/DefaultCreditCardEditorInteractorTest.kt index 1c1173744..e987988ce 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/creditcards/DefaultCreditCardEditorInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/creditcards/DefaultCreditCardEditorInteractorTest.kt @@ -57,7 +57,21 @@ class DefaultCreditCardEditorInteractorTest { expiryYear = 2030, cardType = "discover" ) - interactor.onSaveButtonClicked(creditCardFields) + interactor.onSaveCreditCard(creditCardFields) verify { controller.handleSaveCreditCard(creditCardFields) } } + + @Test + fun onUpdateCreditCard() { + val guid = "id" + val creditCardFields = UpdatableCreditCardFields( + billingName = "Banana Apple", + cardNumber = "4111111111111112", + expiryMonth = 1, + expiryYear = 2034, + cardType = "discover" + ) + interactor.onUpdateCreditCard(guid, creditCardFields) + verify { controller.handleUpdateCreditCard(guid, creditCardFields) } + } }