diff --git a/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardsSettingFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardsSettingFragment.kt index 6c927d8762..d3386aceec 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardsSettingFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/creditcards/CreditCardsSettingFragment.kt @@ -10,6 +10,7 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.VisibleForTesting import androidx.lifecycle.lifecycleScope +import androidx.navigation.NavController import androidx.navigation.fragment.findNavController import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat @@ -21,7 +22,6 @@ 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 import org.mozilla.fenix.ext.showToolbar @@ -62,7 +62,7 @@ class CreditCardsSettingFragment : PreferenceFragmentCompat() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) consumeFrom(creditCardsStore) { state -> - updateCardManagementPreferencesVisibility(state.creditCards) + updateCardManagementPreference(state.creditCards.isNotEmpty(), findNavController()) } } @@ -98,39 +98,39 @@ class CreditCardsSettingFragment : PreferenceFragmentCompat() { ) } - override fun onPreferenceTreeClick(preference: Preference): Boolean { - when (preference.key) { - getPreferenceKey(R.string.pref_key_credit_cards_add_credit_card) -> { - val directions = - CreditCardsSettingFragmentDirections - .actionCreditCardsSettingFragmentToCreditCardEditorFragment() - findNavController().navigateBlockingForAsyncNavGraph(directions) - } - getPreferenceKey(R.string.pref_key_credit_cards_manage_saved_cards) -> { - val directions = - CreditCardsSettingFragmentDirections - .actionCreditCardsSettingFragmentToCreditCardsManagementFragment() - findNavController().navigateBlockingForAsyncNavGraph(directions) - } - } - - return super.onPreferenceTreeClick(preference) - } - /** * Updates preferences visibility depending on credit cards being already saved or not. */ @VisibleForTesting - internal fun updateCardManagementPreferencesVisibility(creditCardsList: List) { - val hasCreditCards = creditCardsList.isNotEmpty() - + internal fun updateCardManagementPreference( + hasCreditCards: Boolean, + navController: NavController + ) { val manageSavedCardsPreference = - requirePreference(R.string.pref_key_credit_cards_manage_saved_cards) - val addCreditCardsPreference = - requirePreference(R.string.pref_key_credit_cards_add_credit_card) + requirePreference(R.string.pref_key_credit_cards_manage_cards) + + val directions = if (hasCreditCards) { + CreditCardsSettingFragmentDirections + .actionCreditCardsSettingFragmentToCreditCardsManagementFragment() + } else { + CreditCardsSettingFragmentDirections + .actionCreditCardsSettingFragmentToCreditCardEditorFragment() + } - manageSavedCardsPreference.isVisible = hasCreditCards - addCreditCardsPreference.isVisible = !hasCreditCards + if (hasCreditCards) { + manageSavedCardsPreference.icon = null + manageSavedCardsPreference.title = + getString(R.string.preferences_credit_cards_manage_saved_cards) + } else { + manageSavedCardsPreference.setIcon(R.drawable.ic_new) + manageSavedCardsPreference.title = + getString(R.string.preferences_credit_cards_add_credit_card) + } + + manageSavedCardsPreference.setOnPreferenceClickListener { + navController.navigateBlockingForAsyncNavGraph(directions) + super.onPreferenceTreeClick(it) + } } /** diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index c94f686d65..564e545ec5 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -180,10 +180,8 @@ pref_key_credit_cards_save_and_autofill_cards pref_key_credit_cards_sync_cards_across_devices - - pref_key_credit_cards_add_credit_card - pref_key_credit_cards_manage_saved_cards + pref_key_credit_cards_manage_cards pref_key_open_links_in_a_private_tab diff --git a/app/src/main/res/xml/credit_cards_preferences.xml b/app/src/main/res/xml/credit_cards_preferences.xml index cb8d3565be..1293098cc6 100644 --- a/app/src/main/res/xml/credit_cards_preferences.xml +++ b/app/src/main/res/xml/credit_cards_preferences.xml @@ -15,13 +15,7 @@ app:singleLineTitle="false" app:allowDividerBelow="true" /> - diff --git a/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardsSettingFragmentTest.kt b/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardsSettingFragmentTest.kt index e5f87631b8..e6de0bdbf6 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardsSettingFragmentTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardsSettingFragmentTest.kt @@ -5,17 +5,23 @@ package org.mozilla.fenix.settings.creditcards import androidx.fragment.app.FragmentActivity +import androidx.navigation.NavController import androidx.preference.Preference import io.mockk.mockk +import io.mockk.verify import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestCoroutineDispatcher import mozilla.components.concept.storage.CreditCard -import org.junit.Assert.assertTrue +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull 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.ext.navigateBlockingForAsyncNavGraph import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.robolectric.Robolectric @@ -25,10 +31,12 @@ class CreditCardsSettingFragmentTest { private val testDispatcher = TestCoroutineDispatcher() private lateinit var creditCardsSettingFragment: CreditCardsSettingFragment + private val navController: NavController = mockk(relaxed = true) @Before fun setUp() { creditCardsSettingFragment = CreditCardsSettingFragment() + val activity = Robolectric.buildActivity(FragmentActivity::class.java).create().get() activity.supportFragmentManager.beginTransaction() @@ -38,32 +46,60 @@ class CreditCardsSettingFragmentTest { } @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( - creditCardsSettingFragment.getPreferenceKey(R.string.pref_key_credit_cards_manage_saved_cards) + fun `GIVEN the list of credit cards is not empty, WHEN fragment is displayed THEN the manage credit cards pref is 'Manage saved cards'`() { + val preferenceTitle = + testContext.getString(R.string.preferences_credit_cards_manage_saved_cards) + val manageCardsPreference = creditCardsSettingFragment.findPreference( + creditCardsSettingFragment.getPreferenceKey(R.string.pref_key_credit_cards_manage_cards) ) + val directions = + CreditCardsSettingFragmentDirections + .actionCreditCardsSettingFragmentToCreditCardsManagementFragment() + val creditCards: List = listOf(mockk(), mockk()) val creditCardsState = CreditCardsListState(creditCards = creditCards) val creditCardsStore = CreditCardsFragmentStore(creditCardsState) - creditCardsSettingFragment.updateCardManagementPreferencesVisibility(creditCardsStore.state.creditCards) + creditCardsSettingFragment.updateCardManagementPreference( + creditCardsStore.state.creditCards.isNotEmpty(), + navController + ) + + assertNull(manageCardsPreference?.icon) + assertEquals(preferenceTitle, manageCardsPreference?.title) + + manageCardsPreference?.performClick() - assertTrue(manageSavedCardsPreference!!.isVisible) + verify { navController.navigateBlockingForAsyncNavGraph(directions) } } @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( - creditCardsSettingFragment.getPreferenceKey(R.string.pref_key_credit_cards_add_credit_card) + fun `GIVEN the list of credit cards is empty, WHEN fragment is displayed THEN the manage credit cards pref is 'Add card'`() { + val preferenceTitle = + testContext.getString(R.string.preferences_credit_cards_add_credit_card) + val manageCardsPreference = creditCardsSettingFragment.findPreference( + creditCardsSettingFragment.getPreferenceKey(R.string.pref_key_credit_cards_manage_cards) ) + val directions = + CreditCardsSettingFragmentDirections + .actionCreditCardsSettingFragmentToCreditCardEditorFragment() + val creditCardsState = CreditCardsListState(creditCards = emptyList()) val creditCardsStore = CreditCardsFragmentStore(creditCardsState) - creditCardsSettingFragment.updateCardManagementPreferencesVisibility(creditCardsStore.state.creditCards) + creditCardsSettingFragment.updateCardManagementPreference( + creditCardsStore.state.creditCards.isNotEmpty(), + navController + ) + + assertNotNull(manageCardsPreference?.icon) + assertEquals(preferenceTitle, manageCardsPreference?.title) + + manageCardsPreference?.performClick() - assertTrue(addCreditCardsPreference!!.isVisible) + verify { navController.navigateBlockingForAsyncNavGraph(directions) } } }