For #18267: Updates preferences visibility depending on creditCardsStore

upstream-sync
mcarare 3 years ago committed by Mihai Adrian Carare
parent 0bc5c22b63
commit 00744fa9e5

@ -5,11 +5,22 @@
package org.mozilla.fenix.settings.creditcards
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.VisibleForTesting
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.launch
import mozilla.components.concept.storage.CreditCard
import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.service.fxa.SyncEngine
import org.mozilla.fenix.R
import org.mozilla.fenix.components.StoreProvider
import org.mozilla.fenix.ext.getPreferenceKey
import org.mozilla.fenix.ext.navigateBlockingForAsyncNavGraph
import org.mozilla.fenix.ext.requireComponents
@ -23,10 +34,43 @@ import org.mozilla.fenix.settings.requirePreference
*/
class CreditCardsSettingFragment : PreferenceFragmentCompat() {
private lateinit var creditCardsStore: CreditCardsFragmentStore
private var isCreditCardsListLoaded: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
creditCardsStore = StoreProvider.get(this) {
CreditCardsFragmentStore(CreditCardsListState(creditCards = emptyList()))
}
loadCreditCards()
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.credit_cards_preferences, rootKey)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
loadCreditCards()
return super.onCreateView(inflater, container, savedInstanceState)
}
@ExperimentalCoroutinesApi
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
consumeFrom(creditCardsStore) { state ->
updateCardManagementPreferencesVisibility(state.creditCards)
}
}
override fun onPause() {
super.onPause()
isCreditCardsListLoaded = false
}
override fun onResume() {
super.onResume()
@ -74,4 +118,39 @@ class CreditCardsSettingFragment : PreferenceFragmentCompat() {
return super.onPreferenceTreeClick(preference)
}
/**
* Updates preferences visibility depending on credit cards being already saved or not.
*/
@VisibleForTesting
internal fun updateCardManagementPreferencesVisibility(creditCardsList: List<CreditCard>) {
val hasCreditCards = creditCardsList.isNotEmpty()
val manageSavedCardsPreference =
requirePreference<Preference>(R.string.pref_key_credit_cards_manage_saved_cards)
val addCreditCardsPreference =
requirePreference<Preference>(R.string.pref_key_credit_cards_add_credit_card)
manageSavedCardsPreference.isVisible = hasCreditCards
addCreditCardsPreference.isVisible = !hasCreditCards
}
/**
* Fetches all the credit cards from autofillStorage and updates the [CreditCardsListState]
* with the list of credit cards.
*/
private fun loadCreditCards() {
if (isCreditCardsListLoaded) {
return
}
lifecycleScope.launch(Dispatchers.IO) {
val creditCards = requireComponents.core.autofillStorage.getAllCreditCards()
lifecycleScope.launch(Dispatchers.Main) {
creditCardsStore.dispatch(CreditCardsAction.UpdateCreditCards(creditCards))
}
}
isCreditCardsListLoaded = true
}
}

@ -17,9 +17,11 @@
android:icon="@drawable/ic_new"
android:key="@string/pref_key_credit_cards_add_credit_card"
android:title="@string/preferences_credit_cards_add_credit_card"
app:isPreferenceVisible="false"
app:allowDividerAbove="true" />
<Preference
android:key="@string/pref_key_credit_cards_manage_saved_cards"
android:title="@string/preferences_credit_cards_manage_saved_cards"
app:isPreferenceVisible="false"
app:allowDividerAbove="true" />
</PreferenceScreen>

@ -0,0 +1,69 @@
/* 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 org.mozilla.fenix.settings.creditcards
import androidx.fragment.app.FragmentActivity
import androidx.preference.Preference
import io.mockk.mockk
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestCoroutineDispatcher
import mozilla.components.concept.storage.CreditCard
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.getPreferenceKey
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.robolectric.Robolectric
@ExperimentalCoroutinesApi
@RunWith(FenixRobolectricTestRunner::class)
class CreditCardsSettingFragmentTest {
private val testDispatcher = TestCoroutineDispatcher()
private lateinit var creditCardsSettingFragment: CreditCardsSettingFragment
@Before
fun setUp() {
creditCardsSettingFragment = CreditCardsSettingFragment()
val activity = Robolectric.buildActivity(FragmentActivity::class.java).create().get()
activity.supportFragmentManager.beginTransaction()
.add(creditCardsSettingFragment, "CreditCardsSettingFragmentTest")
.commitNow()
testDispatcher.advanceUntilIdle()
}
@Test
fun `GIVEN the list of credit cards is not empty, WHEN fragment is displayed THEN the manage credit cards pref is visible`() {
val manageSavedCardsPreference = creditCardsSettingFragment.findPreference<Preference>(
creditCardsSettingFragment.getPreferenceKey(R.string.pref_key_credit_cards_manage_saved_cards)
)
val creditCards: List<CreditCard> = listOf(mockk(), mockk())
val creditCardsState = CreditCardsListState(creditCards = creditCards)
val creditCardsStore = CreditCardsFragmentStore(creditCardsState)
creditCardsSettingFragment.updateCardManagementPreferencesVisibility(creditCardsStore.state.creditCards)
assertTrue(manageSavedCardsPreference!!.isVisible)
}
@Test
fun `GIVEN the list of credit cards is empty, WHEN fragment is displayed THEN the add credit card pref is visible`() {
val addCreditCardsPreference = creditCardsSettingFragment.findPreference<Preference>(
creditCardsSettingFragment.getPreferenceKey(R.string.pref_key_credit_cards_add_credit_card)
)
val creditCardsState = CreditCardsListState(creditCards = emptyList())
val creditCardsStore = CreditCardsFragmentStore(creditCardsState)
creditCardsSettingFragment.updateCardManagementPreferencesVisibility(creditCardsStore.state.creditCards)
assertTrue(addCreditCardsPreference!!.isVisible)
}
}
Loading…
Cancel
Save