For #18266: Refactor fragment and view to remove duplicate code.

upstream-sync
mcarare 3 years ago committed by Mihai Adrian Carare
parent 277034546f
commit 3428dd67ed

@ -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<CreditCardEditorFragmentArgs>()
/**
@ -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

@ -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.

Loading…
Cancel
Save