From 8155ca4c64b6d18a19b315977133862029aefc2e Mon Sep 17 00:00:00 2001 From: mcarare Date: Tue, 27 Apr 2021 19:20:06 +0300 Subject: [PATCH] [fenix] For https://github.com/mozilla-mobile/fenix/issues/18266: Refactor fragment and view to remove duplicate code. --- .../creditcards/CreditCardEditorFragment.kt | 42 ++------------ .../creditcards/view/CreditCardEditorView.kt | 57 ++++++++++--------- 2 files changed, 36 insertions(+), 63 deletions(-) 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 6d6bc52e06..d5106dfb2a 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 @@ -13,11 +13,6 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs -import kotlinx.android.synthetic.main.fragment_credit_card_editor.* -import mozilla.components.concept.storage.CreditCardNumber -import mozilla.components.concept.storage.NewCreditCardFields -import mozilla.components.concept.storage.UpdatableCreditCardFields -import mozilla.components.support.ktx.android.view.hideKeyboard import org.mozilla.fenix.R import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.showToolbar @@ -31,6 +26,8 @@ import org.mozilla.fenix.settings.creditcards.view.CreditCardEditorView */ class CreditCardEditorFragment : Fragment(R.layout.fragment_credit_card_editor) { + private lateinit var creditCardEditorState: CreditCardEditorState + private lateinit var creditCardEditorView: CreditCardEditorView private val args by navArgs() /** @@ -60,9 +57,10 @@ class CreditCardEditorFragment : Fragment(R.layout.fragment_credit_card_editor) ) ) - val creditCardEditorState = + creditCardEditorState = args.creditCard?.toCreditCardEditorState() ?: getInitialCreditCardEditorState() - CreditCardEditorView(view, interactor).bind(creditCardEditorState) + creditCardEditorView = CreditCardEditorView(view, interactor) + creditCardEditorView.bind(creditCardEditorState) } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { @@ -78,35 +76,7 @@ class CreditCardEditorFragment : Fragment(R.layout.fragment_credit_card_editor) true } R.id.save_credit_card_button -> { - view?.hideKeyboard() - - val creditCard = args.creditCard - - // TODO need to know if we're updating a number, or just round-tripping it - val cardNumber = card_number_input.text.toString() - - if (creditCard != null) { - val fields = UpdatableCreditCardFields( - billingName = name_on_card_input.text.toString(), - cardNumber = CreditCardNumber.Plaintext(cardNumber), - cardNumberLast4 = cardNumber.substring(cardNumber.length - 5, cardNumber.length - 1), - expiryMonth = (expiry_month_drop_down.selectedItemPosition + 1).toLong(), - expiryYear = expiry_year_drop_down.selectedItem.toString().toLong(), - cardType = CARD_TYPE_PLACEHOLDER - ) - interactor.onUpdateCreditCard(creditCard.guid, fields) - } else { - val fields = NewCreditCardFields( - billingName = name_on_card_input.text.toString(), - plaintextCardNumber = CreditCardNumber.Plaintext(cardNumber), - cardNumberLast4 = cardNumber.substring(cardNumber.length - 5, cardNumber.length - 1), - expiryMonth = (expiry_month_drop_down.selectedItemPosition + 1).toLong(), - expiryYear = expiry_year_drop_down.selectedItem.toString().toLong(), - cardType = CARD_TYPE_PLACEHOLDER - ) - interactor.onSaveCreditCard(fields) - } - + creditCardEditorView.saveCreditCardInfo(creditCardEditorState) true } else -> false 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 363e50bc9d..2da11ef517 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 @@ -32,7 +32,6 @@ class CreditCardEditorView( /** * Binds the given [CreditCardEditorState] in the [CreditCardEditorFragment]. */ - @Suppress("MagicNumber") fun bind(state: CreditCardEditorState) { if (state.isEditing) { delete_button.apply { @@ -49,32 +48,7 @@ class CreditCardEditorView( } save_button.setOnClickListener { - containerView.hideKeyboard() - - // TODO same as in the corresponding fragment, plaintext number if it's being updated or - // round-tripped otherwise. Also, why is there so much duplication? - val cardNumber = card_number_input.text.toString() - if (state.isEditing) { - val fields = UpdatableCreditCardFields( - billingName = name_on_card_input.text.toString(), - cardNumber = CreditCardNumber.Encrypted(cardNumber), - cardNumberLast4 = cardNumber.substring(cardNumber.length - 4), - expiryMonth = (expiry_month_drop_down.selectedItemPosition + 1).toLong(), - expiryYear = expiry_year_drop_down.selectedItem.toString().toLong(), - cardType = CARD_TYPE_PLACEHOLDER - ) - interactor.onUpdateCreditCard(state.guid, fields) - } else { - val fields = NewCreditCardFields( - billingName = name_on_card_input.text.toString(), - plaintextCardNumber = CreditCardNumber.Plaintext(cardNumber), - cardNumberLast4 = cardNumber.substring(cardNumber.length - 4), - expiryMonth = (expiry_month_drop_down.selectedItemPosition + 1).toLong(), - expiryYear = expiry_year_drop_down.selectedItem.toString().toLong(), - cardType = CARD_TYPE_PLACEHOLDER - ) - interactor.onSaveCreditCard(fields) - } + saveCreditCardInfo(state) } card_number_input.text = state.cardNumber.toEditable() @@ -84,6 +58,35 @@ class CreditCardEditorView( bindExpiryYearDropDown(state.expiryYears) } + @Suppress("MagicNumber") + internal fun saveCreditCardInfo(state: CreditCardEditorState) { + containerView.hideKeyboard() + + // TODO need to know if we're updating a number, or just round-tripping it + val cardNumber = card_number_input.text.toString() + if (state.isEditing) { + val fields = UpdatableCreditCardFields( + billingName = name_on_card_input.text.toString(), + cardNumber = CreditCardNumber.Encrypted(cardNumber), + cardNumberLast4 = cardNumber.substring(cardNumber.length - 4), + expiryMonth = (expiry_month_drop_down.selectedItemPosition + 1).toLong(), + expiryYear = expiry_year_drop_down.selectedItem.toString().toLong(), + cardType = CARD_TYPE_PLACEHOLDER + ) + interactor.onUpdateCreditCard(state.guid, fields) + } else { + val fields = NewCreditCardFields( + billingName = name_on_card_input.text.toString(), + plaintextCardNumber = CreditCardNumber.Plaintext(cardNumber), + cardNumberLast4 = cardNumber.substring(cardNumber.length - 4), + expiryMonth = (expiry_month_drop_down.selectedItemPosition + 1).toLong(), + expiryYear = expiry_year_drop_down.selectedItem.toString().toLong(), + cardType = CARD_TYPE_PLACEHOLDER + ) + interactor.onSaveCreditCard(fields) + } + } + /** * Setup the expiry month dropdown by formatting and populating it with the months in a calendar * year, and set the selection to the provided expiry month.