diff --git a/WordPress/src/main/AndroidManifest.xml b/WordPress/src/main/AndroidManifest.xml index 813f7378f2f2..23903fd336f2 100644 --- a/WordPress/src/main/AndroidManifest.xml +++ b/WordPress/src/main/AndroidManifest.xml @@ -1069,7 +1069,7 @@ android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="barcode_ui"/> - initializePromotePostUIState(blazeUIModel) is PageUIModel -> initializePromotePageUIState(blazeUIModel) @@ -57,8 +56,13 @@ class BlazeViewModel @Inject constructor( postModel.featuredImageId) } ) - _uiState.value = BlazeUiState.PromoteScreen.PromotePost(updatedPostModel) + _promoteUiState.value = BlazeUiState.PromoteScreen.PromotePost(updatedPostModel) + _uiState.value = if (shouldShowOverlayAndTrack()) { + BlazeUiState.PromoteScreen.PromotePost(updatedPostModel) + } else { + BlazeUiState.WebViewScreen + } } private fun initializePromotePageUIState(pageModel: PageUIModel) { @@ -69,14 +73,31 @@ class BlazeViewModel @Inject constructor( pageModel.featuredImageId ) ) - _uiState.value = BlazeUiState.PromoteScreen.PromotePage(updatedPageModel) + _promoteUiState.value = BlazeUiState.PromoteScreen.PromotePage(updatedPageModel) + _uiState.value = if (shouldShowOverlayAndTrack()) { + BlazeUiState.PromoteScreen.PromotePage(updatedPageModel) + } else { + BlazeUiState.WebViewScreen + } } private fun initializePromoteSiteUIState() { - blazeFeatureUtils.trackOverlayDisplayed(blazeFlowSource) - _uiState.value = BlazeUiState.PromoteScreen.Site _promoteUiState.value = BlazeUiState.PromoteScreen.Site + _uiState.value = if (shouldShowOverlayAndTrack()) { + BlazeUiState.PromoteScreen.Site + } else { + BlazeUiState.WebViewScreen + } + } + + private fun shouldShowOverlayAndTrack() : Boolean { + val shouldShowOverlay = !blazeFeatureUtils.shouldHideBlazeOverlay() + if (shouldShowOverlay) { + blazeFeatureUtils.trackOverlayDisplayed(blazeFlowSource) + blazeFeatureUtils.setShouldHideBlazeOverlay() + } + return shouldShowOverlay } // to do: tracking logic and logic for done state - this might not be where we want to track diff --git a/WordPress/src/main/java/org/wordpress/android/ui/blaze/blazepromote/BlazePromoteParentActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/blaze/blazepromote/BlazePromoteParentActivity.kt index 36bc40bc8d19..905943672412 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/blaze/blazepromote/BlazePromoteParentActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/blaze/blazepromote/BlazePromoteParentActivity.kt @@ -17,7 +17,7 @@ const val ARG_EXTRA_BLAZE_UI_MODEL = "blaze_ui_model" const val ARG_BLAZE_FLOW_SOURCE = "blaze_flow_source" @AndroidEntryPoint -class BlazeParentActivity : AppCompatActivity() { +class BlazePromoteParentActivity : AppCompatActivity() { private val viewModel: BlazeViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppPrefs.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppPrefs.java index f4a55342edd2..566488222394 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppPrefs.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppPrefs.java @@ -193,6 +193,7 @@ public enum DeletablePrefKey implements PrefKey { WP_JETPACK_INDIVIDUAL_PLUGIN_OVERLAY_LAST_SHOWN_TIMESTAMP, NOTIFICATIONS_PERMISSION_WARNING_DISMISSED, HAS_SAVED_PRIVACY_SETTINGS, + SHOULD_HIDE_BLAZE_OVERLAY, } /** @@ -1674,4 +1675,12 @@ public static boolean getNotificationsPermissionsWarningDismissed() { public static void setNotificationsPermissionWarningDismissed(boolean dismissed) { setBoolean(DeletablePrefKey.NOTIFICATIONS_PERMISSION_WARNING_DISMISSED, dismissed); } + + public static Boolean getShouldHideBlazeOverlay() { + return getBoolean(DeletablePrefKey.SHOULD_HIDE_BLAZE_OVERLAY, false); + } + + public static void setShouldHideBlazeOverlay(final boolean isHidden) { + setBoolean(DeletablePrefKey.SHOULD_HIDE_BLAZE_OVERLAY, isHidden); + } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppPrefsWrapper.kt b/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppPrefsWrapper.kt index 31f0f33af1c1..11007d6cd191 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppPrefsWrapper.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppPrefsWrapper.kt @@ -351,6 +351,12 @@ class AppPrefsWrapper @Inject constructor() { fun incrementWPJetpackIndividualPluginOverlayShownCount() = AppPrefs.incrementWPJetpackIndividualPluginOverlayShownCount() + fun getShouldHideBlazeOverlay(): Boolean = + AppPrefs.getShouldHideBlazeOverlay() + + fun setShouldHideBlazeOverlay(isHidden: Boolean) = + AppPrefs.setShouldHideBlazeOverlay(isHidden) + fun getAllPrefs(): Map = AppPrefs.getAllPrefs() fun setString(prefKey: PrefKey, value: String) { diff --git a/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dashboard/blaze/BlazeViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dashboard/blaze/BlazeViewModelTest.kt index 86e822709a54..7939939673b8 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dashboard/blaze/BlazeViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/mysite/cards/dashboard/blaze/BlazeViewModelTest.kt @@ -7,12 +7,15 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import org.wordpress.android.BaseUnitTest import org.wordpress.android.fluxc.Dispatcher import org.wordpress.android.fluxc.store.MediaStore import org.wordpress.android.ui.blaze.BlazeFeatureUtils import org.wordpress.android.ui.blaze.BlazeFlowSource +import org.wordpress.android.ui.blaze.BlazeUiState +import org.wordpress.android.ui.blaze.PageUIModel import org.wordpress.android.ui.blaze.PostUIModel import org.wordpress.android.ui.blaze.blazeoverlay.BlazeViewModel import org.wordpress.android.ui.mysite.SelectedSiteRepository @@ -34,6 +37,8 @@ class BlazeViewModelTest : BaseUnitTest() { private lateinit var blazeViewModel: BlazeViewModel + private lateinit var uiStates: MutableList + private lateinit var promoteUiState: MutableList @Before fun setUp() { blazeViewModel = BlazeViewModel( @@ -42,6 +47,14 @@ class BlazeViewModelTest : BaseUnitTest() { mediaStore, selectedSiteRepository ) + uiStates = mutableListOf() + promoteUiState = mutableListOf() + blazeViewModel.promoteUiState.observeForever { + promoteUiState.add(it) + } + blazeViewModel.uiState.observeForever { + uiStates.add(it) + } } @Test @@ -55,4 +68,92 @@ class BlazeViewModelTest : BaseUnitTest() { Assertions.assertThat(result).isNotNull } + + @Test + fun `given blaze overlay shown is false, when started from post list, then uiState is set to promote post`() { + whenever(selectedSiteRepository.getSelectedSite()).thenReturn(mock()) + whenever(blazeFeatureUtils.shouldHideBlazeOverlay()).thenReturn(false) + + val model = PostUIModel(postId = 1L, title = "title", featuredImageId = 1L, + url = "url", featuredImageUrl = "featuredImageUrl" + ) + blazeViewModel.start(BlazeFlowSource.POSTS_LIST, model) + + Assertions.assertThat(uiStates.last()).isInstanceOf(BlazeUiState.PromoteScreen.PromotePost::class.java) + } + + @Test + fun `given blaze overlay shown is true, when started from post list, then uiState is set to webview screen`() { + whenever(selectedSiteRepository.getSelectedSite()).thenReturn(mock()) + whenever(blazeFeatureUtils.shouldHideBlazeOverlay()).thenReturn(true) + + val model = PostUIModel(postId = 1L, title = "title", featuredImageId = 1L, + url = "url", featuredImageUrl = "featuredImageUrl" + ) + blazeViewModel.start(BlazeFlowSource.POSTS_LIST, model) + + Assertions.assertThat(uiStates.last()).isInstanceOf(BlazeUiState.WebViewScreen::class.java) + } + + @Test + fun `given blaze overlay shown is false, when started from page list, then uiState is set to promote post`() { + whenever(selectedSiteRepository.getSelectedSite()).thenReturn(mock()) + whenever(blazeFeatureUtils.shouldHideBlazeOverlay()).thenReturn(false) + + val model = PageUIModel(pageId = 1L, title = "title", featuredImageId = 1L, + url = "url", featuredImageUrl = "featuredImageUrl" + ) + blazeViewModel.start(BlazeFlowSource.PAGES_LIST, model) + + Assertions.assertThat(uiStates.last()).isInstanceOf(BlazeUiState.PromoteScreen.PromotePage::class.java) + } + + @Test + fun `given blaze overlay shown is true, when started from page list, then uiState is set to webview screen`() { + whenever(selectedSiteRepository.getSelectedSite()).thenReturn(mock()) + whenever(blazeFeatureUtils.shouldHideBlazeOverlay()).thenReturn(true) + + val model = PageUIModel(pageId = 1L, title = "title", featuredImageId = 1L, + url = "url", featuredImageUrl = "featuredImageUrl" + ) + blazeViewModel.start(BlazeFlowSource.PAGES_LIST, model) + + Assertions.assertThat(uiStates.last()).isInstanceOf(BlazeUiState.WebViewScreen::class.java) + } + + @Test + fun `given blaze overlay shown is false, when started from dashboard card, then uiState is set to site`() { + whenever(blazeFeatureUtils.shouldHideBlazeOverlay()).thenReturn(false) + + blazeViewModel.start(BlazeFlowSource.DASHBOARD_CARD, null) + + Assertions.assertThat(uiStates.last()).isInstanceOf(BlazeUiState.PromoteScreen.Site::class.java) + } + + @Test + fun `given blaze overlay shown is true, when started from dashboard card, then uiState is set to webview screen`() { + whenever(blazeFeatureUtils.shouldHideBlazeOverlay()).thenReturn(true) + + blazeViewModel.start(BlazeFlowSource.DASHBOARD_CARD, null) + + Assertions.assertThat(uiStates.last()).isInstanceOf(BlazeUiState.WebViewScreen::class.java) + } + + @Test + fun `given blaze overlay shown is false, when started from no campaigns list, then uiState is set to site`() { + whenever(blazeFeatureUtils.shouldHideBlazeOverlay()).thenReturn(false) + + blazeViewModel.start(BlazeFlowSource.CAMPAIGN_LISTING_PAGE, null) + + Assertions.assertThat(uiStates.last()).isInstanceOf(BlazeUiState.PromoteScreen.Site::class.java) + } + + @Test + fun `given blaze overlay shown is true, when started from no campaigns list, then uiState is set to webview`() { + whenever(blazeFeatureUtils.shouldHideBlazeOverlay()).thenReturn(true) + + blazeViewModel.start(BlazeFlowSource.CAMPAIGN_LISTING_PAGE, null) + + Assertions.assertThat(uiStates.last()).isInstanceOf(BlazeUiState.WebViewScreen::class.java) + } }