diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/dashboard/DashboardPageFragment.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/dashboard/DashboardPageFragment.kt index ec7dbee1c..f23ee8845 100644 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/dashboard/DashboardPageFragment.kt +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/dashboard/DashboardPageFragment.kt @@ -203,24 +203,7 @@ class DashboardPageFragment : Fragment(R.layout.fragment_dashboard_page) { adapterItems.add( DashboardHeaderAdapterItem( text = dashboardItem.text, - buttonInfo = if (greenCardType == GreenCardType.Eu) { - when (featureFlagUseCase.getDisclosurePolicy()) { - is DisclosurePolicy.ZeroG -> { - ButtonInfo( - R.string.holder_dashboard_international_0G_action_certificateNeeded , - R.string.my_overview_description_eu_button_link - ) - } - else -> { - ButtonInfo( - R.string.my_overview_description_eu_button_text, - R.string.my_overview_description_eu_button_link - ) - } - } - } else { - null - }, + buttonInfo = dashboardItem.buttonInfo ) ) } diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/dashboard/items/DashboardHeaderAdapterItemUtil.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/dashboard/items/DashboardHeaderAdapterItemUtil.kt index cf1fc11d2..1de9c24e6 100644 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/dashboard/items/DashboardHeaderAdapterItemUtil.kt +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/dashboard/items/DashboardHeaderAdapterItemUtil.kt @@ -9,20 +9,21 @@ package nl.rijksoverheid.ctr.holder.dashboard.items import nl.rijksoverheid.ctr.holder.R import nl.rijksoverheid.ctr.holder.persistence.database.entities.GreenCardType +import nl.rijksoverheid.ctr.holder.ui.create_qr.models.DashboardItem import nl.rijksoverheid.ctr.holder.usecase.HolderFeatureFlagUseCase import nl.rijksoverheid.ctr.shared.models.DisclosurePolicy interface DashboardHeaderAdapterItemUtil { - fun getText( + fun getHeaderItem( greenCardType: GreenCardType, emptyState: Boolean, hasVisitorPassIncompleteItem: Boolean - ): Int + ): DashboardItem.HeaderItem } class DashboardHeaderAdapterItemUtilImpl( private val featureFlagUseCase: HolderFeatureFlagUseCase -): DashboardHeaderAdapterItemUtil { +) : DashboardHeaderAdapterItemUtil { /** * Get the header item text to display in the domestic tab on the dashboard screen @@ -30,61 +31,84 @@ class DashboardHeaderAdapterItemUtilImpl( * @param emptyState If we should treat the dashboard as being empty state * @param hasVisitorPassIncompleteItem If there is a incomplete visitor pass item currently showing on the dashboard */ - override fun getText( + override fun getHeaderItem( tabType: GreenCardType, emptyState: Boolean, - hasVisitorPassIncompleteItem: Boolean): Int { - - when (tabType) { - is GreenCardType.Domestic -> { - val emptyState = emptyState || hasVisitorPassIncompleteItem + hasVisitorPassIncompleteItem: Boolean + ): DashboardItem.HeaderItem { + val empty = emptyState || hasVisitorPassIncompleteItem + val text = getHeaderText(tabType, empty) + val buttonInfo = getButtonInfo(tabType, empty) + return DashboardItem.HeaderItem(text, buttonInfo) + } - return when (featureFlagUseCase.getDisclosurePolicy()) { - is DisclosurePolicy.OneG -> { - if (emptyState) { - R.string.holder_dashboard_empty_domestic_only1Gaccess_message - } else { - R.string.holder_dashboard_intro_domestic_only1Gaccess - } + private fun getHeaderText( + tabType: GreenCardType, + emptyState: Boolean, + ) = when (tabType) { + is GreenCardType.Domestic -> { + when (featureFlagUseCase.getDisclosurePolicy()) { + is DisclosurePolicy.OneG -> { + if (emptyState) { + R.string.holder_dashboard_empty_domestic_only1Gaccess_message + } else { + R.string.holder_dashboard_intro_domestic_only1Gaccess } - is DisclosurePolicy.OneAndThreeG -> { - if (emptyState) { - R.string.holder_dashboard_empty_domestic_3Gand1Gaccess_message - } else { - R.string.holder_dashboard_intro_domestic_3Gand1Gaccess - } + } + is DisclosurePolicy.OneAndThreeG -> { + if (emptyState) { + R.string.holder_dashboard_empty_domestic_3Gand1Gaccess_message + } else { + R.string.holder_dashboard_intro_domestic_3Gand1Gaccess } - is DisclosurePolicy.ThreeG -> { - if (emptyState) { - R.string.my_overview_qr_placeholder_description - } else { - R.string.my_overview_description - } + } + is DisclosurePolicy.ThreeG -> { + if (emptyState) { + R.string.my_overview_qr_placeholder_description + } else { + R.string.my_overview_description } - is DisclosurePolicy.ZeroG -> R.string.app_name // TODO: implement 0G } + is DisclosurePolicy.ZeroG -> R.string.app_name // Not applicable } - is GreenCardType.Eu -> { - return if (emptyState) { - when (featureFlagUseCase.getDisclosurePolicy()) { - is DisclosurePolicy.ZeroG -> { - R.string.holder_dashboard_emptyState_international_0G_message - } - else -> { - R.string.my_overview_qr_placeholder_description_eu - } + } + is GreenCardType.Eu -> { + if (emptyState) { + when (featureFlagUseCase.getDisclosurePolicy()) { + is DisclosurePolicy.ZeroG -> { + R.string.holder_dashboard_emptyState_international_0G_message + } + else -> { + R.string.my_overview_qr_placeholder_description_eu + } + } + } else { + when (featureFlagUseCase.getDisclosurePolicy()) { + is DisclosurePolicy.ZeroG -> { + R.string.holder_dashboard_filledState_international_0G_message } - } else { - when (featureFlagUseCase.getDisclosurePolicy()) { - is DisclosurePolicy.ZeroG -> { - R.string.holder_dashboard_filledState_international_0G_message - } - else -> { - R.string.my_overview_description_eu - } + else -> { + R.string.my_overview_description_eu } } } } } + + private fun getButtonInfo(tabType: GreenCardType, empty: Boolean) = + if (tabType == GreenCardType.Eu) { + if (featureFlagUseCase.getDisclosurePolicy() is DisclosurePolicy.ZeroG && !empty) { + ButtonInfo( + R.string.holder_dashboard_international_0G_action_certificateNeeded, + R.string.my_overview_description_eu_button_link + ) + } else { + ButtonInfo( + R.string.my_overview_description_eu_button_text, + R.string.my_overview_description_eu_button_link + ) + } + } else { + null + } } \ No newline at end of file diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/models/DashboardItem.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/models/DashboardItem.kt index 4e59c0457..38d229f33 100644 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/models/DashboardItem.kt +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/models/DashboardItem.kt @@ -2,8 +2,12 @@ package nl.rijksoverheid.ctr.holder.ui.create_qr.models import androidx.annotation.StringRes import nl.rijksoverheid.ctr.holder.R +import nl.rijksoverheid.ctr.holder.dashboard.items.ButtonInfo import nl.rijksoverheid.ctr.holder.persistence.database.DatabaseSyncerResult -import nl.rijksoverheid.ctr.holder.persistence.database.entities.* +import nl.rijksoverheid.ctr.holder.persistence.database.entities.CredentialEntity +import nl.rijksoverheid.ctr.holder.persistence.database.entities.GreenCardType +import nl.rijksoverheid.ctr.holder.persistence.database.entities.OriginEntity +import nl.rijksoverheid.ctr.holder.persistence.database.entities.OriginType import nl.rijksoverheid.ctr.holder.persistence.database.models.GreenCard import nl.rijksoverheid.ctr.holder.ui.create_qr.util.OriginState import nl.rijksoverheid.ctr.shared.models.DisclosurePolicy @@ -11,7 +15,10 @@ import nl.rijksoverheid.ctr.shared.models.GreenCardDisclosurePolicy sealed class DashboardItem { - data class HeaderItem(@StringRes val text: Int) : DashboardItem() + data class HeaderItem( + @StringRes val text: Int, + val buttonInfo: ButtonInfo? + ) : DashboardItem() data class PlaceholderCardItem(val greenCardType: GreenCardType) : DashboardItem() diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/usecases/GetDashboardItemsUseCase.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/usecases/GetDashboardItemsUseCase.kt index 3db704c0e..061d0a4c1 100644 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/usecases/GetDashboardItemsUseCase.kt +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/ui/create_qr/usecases/GetDashboardItemsUseCase.kt @@ -11,8 +11,6 @@ import nl.rijksoverheid.ctr.holder.ui.create_qr.models.DashboardItems import nl.rijksoverheid.ctr.holder.ui.create_qr.util.* import nl.rijksoverheid.ctr.holder.dashboard.items.DashboardHeaderAdapterItemUtil import nl.rijksoverheid.ctr.holder.usecase.HolderFeatureFlagUseCase -import nl.rijksoverheid.ctr.shared.models.DisclosurePolicy -import org.koin.androidx.viewmodel.scope.emptyState interface GetDashboardItemsUseCase { suspend fun getItems( @@ -85,13 +83,13 @@ class GetDashboardItemsUseCaseImpl( .filter { it.greenCardEntity.type == GreenCardType.Eu } .distinctBy { it.greenCardEntity.type } - val headerText = dashboardHeaderAdapterItemUtil.getText( + val headerItem = dashboardHeaderAdapterItemUtil.getHeaderItem( emptyState = hasEmptyState, greenCardType = GreenCardType.Domestic, hasVisitorPassIncompleteItem = hasVisitorPassIncompleteItem, ) - dashboardItems.add(DashboardItem.HeaderItem(text = headerText)) + dashboardItems.add(headerItem) if (dashboardItemUtil.isAppUpdateAvailable()) { dashboardItems.add(DashboardItem.InfoItem.AppUpdate) @@ -204,15 +202,13 @@ class GetDashboardItemsUseCaseImpl( disclosurePolicy = holderFeatureFlagUseCase.getDisclosurePolicy() ) - val headerText = dashboardHeaderAdapterItemUtil.getText( + val headerItem = dashboardHeaderAdapterItemUtil.getHeaderItem( emptyState = hasEmptyState, greenCardType = GreenCardType.Eu, hasVisitorPassIncompleteItem = hasVisitorPassIncompleteItem, ) - dashboardItems.add( - DashboardItem.HeaderItem(text = headerText) - ) + dashboardItems.add(headerItem) if (dashboardItemUtil.isAppUpdateAvailable()) { dashboardItems.add(DashboardItem.InfoItem.AppUpdate) diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/dashboard/DashboardFragmentTest.kt b/holder/src/test/java/nl/rijksoverheid/ctr/dashboard/DashboardFragmentTest.kt index 489677571..717a71b99 100644 --- a/holder/src/test/java/nl/rijksoverheid/ctr/dashboard/DashboardFragmentTest.kt +++ b/holder/src/test/java/nl/rijksoverheid/ctr/dashboard/DashboardFragmentTest.kt @@ -68,7 +68,7 @@ class DashboardFragmentTest : AutoCloseKoinTest() { title = R.string.travel_button_domestic, greenCardType = GreenCardType.Domestic, items = listOf( - DashboardItem.HeaderItem(text = R.string.my_overview_description) + DashboardItem.HeaderItem(text = R.string.my_overview_description, null) ) )) ) diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/create_qr/util/SortGreenCardItemsUseCaseImplTest.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/create_qr/util/SortGreenCardItemsUseCaseImplTest.kt index c3c853db0..871f80b90 100644 --- a/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/create_qr/util/SortGreenCardItemsUseCaseImplTest.kt +++ b/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/create_qr/util/SortGreenCardItemsUseCaseImplTest.kt @@ -111,7 +111,7 @@ class SortGreenCardItemsUseCaseImplTest: AutoCloseKoinTest() { fun `Items have correct order`() { val items = listOf( DashboardItem.InfoItem.BoosterItem, - DashboardItem.HeaderItem(1), + DashboardItem.HeaderItem(1, null), DashboardItem.InfoItem.ClockDeviationItem, DashboardItem.CoronaMelderItem, DashboardItem.InfoItem.OriginInfoItem(GreenCardType.Domestic, OriginType.Test), diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/myoverview/utils/DashboardHeaderAdapterItemUtilImplTest.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/myoverview/utils/DashboardHeaderAdapterItemUtilImplTest.kt index 1fecd939c..884bda539 100644 --- a/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/myoverview/utils/DashboardHeaderAdapterItemUtilImplTest.kt +++ b/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/myoverview/utils/DashboardHeaderAdapterItemUtilImplTest.kt @@ -26,11 +26,11 @@ class DashboardHeaderAdapterItemUtilImplTest { ) Assert.assertEquals(R.string.holder_dashboard_empty_domestic_only1Gaccess_message, - util.getText( + util.getHeaderItem( tabType = GreenCardType.Domestic, emptyState = true, hasVisitorPassIncompleteItem = false - ) + ).text ) } @@ -41,11 +41,11 @@ class DashboardHeaderAdapterItemUtilImplTest { ) Assert.assertEquals(R.string.my_overview_qr_placeholder_description, - util.getText( + util.getHeaderItem( tabType = GreenCardType.Domestic, emptyState = true, hasVisitorPassIncompleteItem = false - ) + ).text ) } @@ -56,11 +56,11 @@ class DashboardHeaderAdapterItemUtilImplTest { ) Assert.assertEquals(R.string.holder_dashboard_empty_domestic_3Gand1Gaccess_message, - util.getText( + util.getHeaderItem( tabType = GreenCardType.Domestic, emptyState = true, hasVisitorPassIncompleteItem = false - ) + ).text ) } @@ -71,11 +71,11 @@ class DashboardHeaderAdapterItemUtilImplTest { ) Assert.assertEquals(R.string.holder_dashboard_intro_domestic_only1Gaccess, - util.getText( + util.getHeaderItem( tabType = GreenCardType.Domestic, emptyState = false, hasVisitorPassIncompleteItem = false - ) + ).text ) } @@ -86,11 +86,11 @@ class DashboardHeaderAdapterItemUtilImplTest { ) Assert.assertEquals(R.string.my_overview_description, - util.getText( + util.getHeaderItem( tabType = GreenCardType.Domestic, emptyState = false, hasVisitorPassIncompleteItem = false - ) + ).text ) } @@ -101,11 +101,92 @@ class DashboardHeaderAdapterItemUtilImplTest { ) Assert.assertEquals(R.string.holder_dashboard_intro_domestic_3Gand1Gaccess, - util.getText( + util.getHeaderItem( tabType = GreenCardType.Domestic, emptyState = false, hasVisitorPassIncompleteItem = false - ) + ).text + ) + } + + @Test + fun `Correct button info for domestic tab`() { + val util = getUtil( + policy = DisclosurePolicy.OneG + ) + + Assert.assertEquals(null, + util.getHeaderItem( + tabType = GreenCardType.Domestic, + emptyState = true, + hasVisitorPassIncompleteItem = false + ).buttonInfo + ) + } + + @Test + fun `Correct button info for EU tab with 0G and not empty`() { + val util = getUtil( + policy = DisclosurePolicy.ZeroG + ) + + val headerItem = util.getHeaderItem( + tabType = GreenCardType.Eu, + emptyState = false, + hasVisitorPassIncompleteItem = false + ) + + Assert.assertEquals( + R.string.holder_dashboard_international_0G_action_certificateNeeded, + headerItem.buttonInfo!!.text + ) + Assert.assertEquals( + R.string.my_overview_description_eu_button_link, + headerItem.buttonInfo!!.link + ) + } + + @Test + fun `Correct button info for EU tab with 0G and empty`() { + val util = getUtil( + policy = DisclosurePolicy.ZeroG + ) + + val headerItem = util.getHeaderItem( + tabType = GreenCardType.Eu, + emptyState = true, + hasVisitorPassIncompleteItem = false + ) + + Assert.assertEquals( + R.string.my_overview_description_eu_button_text, + headerItem.buttonInfo!!.text + ) + Assert.assertEquals( + R.string.my_overview_description_eu_button_link, + headerItem.buttonInfo!!.link + ) + } + + @Test + fun `Correct button info for EU tab with not 0G`() { + val util = getUtil( + policy = DisclosurePolicy.OneG + ) + + val headerItem = util.getHeaderItem( + tabType = GreenCardType.Eu, + emptyState = false, + hasVisitorPassIncompleteItem = false + ) + + Assert.assertEquals( + R.string.my_overview_description_eu_button_text, + headerItem.buttonInfo!!.text + ) + Assert.assertEquals( + R.string.my_overview_description_eu_button_link, + headerItem.buttonInfo!!.link ) } diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/myoverview/utils/DashboardItemUtilImplTest.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/myoverview/utils/DashboardItemUtilImplTest.kt index d92206dbb..4cd6bb27d 100644 --- a/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/myoverview/utils/DashboardItemUtilImplTest.kt +++ b/holder/src/test/java/nl/rijksoverheid/ctr/holder/ui/myoverview/utils/DashboardItemUtilImplTest.kt @@ -120,7 +120,7 @@ class DashboardItemUtilImplTest : AutoCloseKoinTest() { val card3 = createCardItem(OriginType.Vaccination) val items = listOf( - DashboardItem.HeaderItem(1), + DashboardItem.HeaderItem(1, null), CardsItem(listOf(createCardItem(OriginType.Test))), CardsItem(listOf(card1)), CardsItem(listOf(createCardItem(OriginType.Recovery))),