Skip to content

Commit

Permalink
Merge branch 'trunk' into feature/notifications_refresh_p2
Browse files Browse the repository at this point in the history
  • Loading branch information
Antonis Lilis committed May 10, 2024
2 parents 39d6033 + 8e84068 commit d8edd7a
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.wordpress.android.ui.jetpackoverlay

import org.wordpress.android.analytics.AnalyticsTracker
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseFour
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseNewUsers
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseOne
Expand All @@ -9,7 +11,9 @@ import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseS
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseStaticPosters
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalSiteCreationPhase.PHASE_ONE
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalSiteCreationPhase.PHASE_TWO
import org.wordpress.android.ui.main.WPMainNavigationView.PageType
import org.wordpress.android.util.BuildConfigWrapper
import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper
import org.wordpress.android.util.config.JetpackFeatureRemovalNewUsersConfig
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseFourConfig
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseOneConfig
Expand Down Expand Up @@ -40,7 +44,8 @@ class JetpackFeatureRemovalPhaseHelper @Inject constructor(
private val jetpackFeatureRemovalNewUsersConfig: JetpackFeatureRemovalNewUsersConfig,
private val jetpackFeatureRemovalSelfHostedUsersConfig: JetpackFeatureRemovalSelfHostedUsersConfig,
private val jetpackFeatureRemovalStaticPostersConfig: JetpackFeatureRemovalStaticPostersConfig,
private val jetpackPhaseFourOverlayFrequencyConfig: PhaseFourOverlayFrequencyConfig
private val jetpackPhaseFourOverlayFrequencyConfig: PhaseFourOverlayFrequencyConfig,
private val analyticsTrackerWrapper: AnalyticsTrackerWrapper
) {
fun getCurrentPhase(): JetpackFeatureRemovalPhase? {
return if (buildConfigWrapper.isJetpackApp) null
Expand Down Expand Up @@ -126,6 +131,26 @@ class JetpackFeatureRemovalPhaseHelper @Inject constructor(
}
}

@JvmOverloads
fun trackPageAccessedEventIfNeeded(pageType: PageType, site: SiteModel? = null) {
when (pageType) {
PageType.MY_SITE -> analyticsTrackerWrapper.track(AnalyticsTracker.Stat.MY_SITE_ACCESSED, site)
PageType.READER -> {
if (arePosterizedPagesVisible()) {
analyticsTrackerWrapper.track(AnalyticsTracker.Stat.READER_ACCESSED)
}
}

PageType.NOTIFS -> {
if (arePosterizedPagesVisible()) {
analyticsTrackerWrapper.track(AnalyticsTracker.Stat.NOTIFICATIONS_ACCESSED)
}
}

PageType.ME -> analyticsTrackerWrapper.track(AnalyticsTracker.Stat.ME_ACCESSED)
}
}

fun shouldShowNotifications(): Boolean {
val currentPhase = getCurrentPhase() ?: return true
return when (currentPhase) {
Expand Down Expand Up @@ -153,6 +178,8 @@ class JetpackFeatureRemovalPhaseHelper @Inject constructor(
fun getPhaseFourOverlayFrequency(): Int {
return jetpackPhaseFourOverlayFrequencyConfig.getValue()
}

private fun arePosterizedPagesVisible() = !shouldShowStaticPage()
}
// Global overlay frequency is the frequency at which the overlay is shown across the features
// no matter which feature was accessed last time
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1301,19 +1301,19 @@ private void trackLastVisiblePage(@NonNull final PageType pageType) {
switch (pageType) {
case MY_SITE:
ActivityId.trackLastActivity(ActivityId.MY_SITE);
mAnalyticsTrackerWrapper.track(AnalyticsTracker.Stat.MY_SITE_ACCESSED, getSelectedSite());
mJetpackFeatureRemovalPhaseHelper.trackPageAccessedEventIfNeeded(PageType.MY_SITE, getSelectedSite());
break;
case READER:
ActivityId.trackLastActivity(ActivityId.READER);
AnalyticsTracker.track(AnalyticsTracker.Stat.READER_ACCESSED);
mJetpackFeatureRemovalPhaseHelper.trackPageAccessedEventIfNeeded(PageType.READER);
break;
case NOTIFS:
ActivityId.trackLastActivity(ActivityId.NOTIFICATIONS);
AnalyticsTracker.track(AnalyticsTracker.Stat.NOTIFICATIONS_ACCESSED);
mJetpackFeatureRemovalPhaseHelper.trackPageAccessedEventIfNeeded(PageType.NOTIFS);
break;
case ME:
ActivityId.trackLastActivity(ActivityId.ME);
AnalyticsTracker.track(Stat.ME_ACCESSED);
mJetpackFeatureRemovalPhaseHelper.trackPageAccessedEventIfNeeded(PageType.ME);
break;
default:
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ import org.wordpress.android.ui.compose.components.MainTopAppBar
import org.wordpress.android.ui.compose.components.NavigationIcons
import org.wordpress.android.ui.compose.components.buttons.WPSwitch
import org.wordpress.android.ui.compose.theme.AppTheme
import org.wordpress.android.ui.compose.utils.LocaleAwareComposable
import org.wordpress.android.ui.compose.utils.uiStringText
import org.wordpress.android.ui.mysite.items.listitem.ListItemAction
import org.wordpress.android.ui.utils.UiString
import org.wordpress.android.util.LocaleManager

@AndroidEntryPoint
class PersonalizationActivity : AppCompatActivity() {
Expand All @@ -64,8 +66,14 @@ class PersonalizationActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
setContent {
AppTheme {
viewModel.start()
PersonalizationScreen()
val language by viewModel.appLanguage.observeAsState("")

LocaleAwareComposable(
locale = LocaleManager.languageLocale(language),
) {
viewModel.start()
PersonalizationScreen()
}
}
}
viewModel.onSelectedSiteMissing.observe(this) { finish() }
Expand Down Expand Up @@ -193,7 +201,7 @@ class PersonalizationActivity : AppCompatActivity() {
state = shortcutState,
actionIcon = R.drawable.ic_personalization_quick_link_remove_circle,
actionIconTint = Color(0xFFD63638),
actionButtonClick = { viewModel.removeShortcut(shortcutState)}
actionButtonClick = { viewModel.removeShortcut(shortcutState) }
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CoroutineDispatcher
import org.wordpress.android.modules.BG_THREAD
import org.wordpress.android.ui.mysite.SelectedSiteRepository
import org.wordpress.android.util.LocaleManagerWrapper
import org.wordpress.android.viewmodel.ScopedViewModel
import javax.inject.Inject
import javax.inject.Named
Expand All @@ -18,15 +19,20 @@ class PersonalizationViewModel @Inject constructor(
@param:Named(BG_THREAD) private val bgDispatcher: CoroutineDispatcher,
private val selectedSiteRepository: SelectedSiteRepository,
private val shortcutsPersonalizationViewModelSlice: ShortcutsPersonalizationViewModelSlice,
private val dashboardCardPersonalizationViewModelSlice: DashboardCardPersonalizationViewModelSlice
private val dashboardCardPersonalizationViewModelSlice: DashboardCardPersonalizationViewModelSlice,
private val localeManagerWrapper: LocaleManagerWrapper
) : ScopedViewModel(bgDispatcher) {
val uiState = dashboardCardPersonalizationViewModelSlice.uiState
val shortcutsState = shortcutsPersonalizationViewModelSlice.uiState

private val _onSelectedSiteMissing = MutableLiveData<Unit>()
val onSelectedSiteMissing = _onSelectedSiteMissing as LiveData<Unit>

private val _appLanguage = MutableLiveData<String>()
val appLanguage = _appLanguage as LiveData<String>

init {
emitLanguageRefreshIfNeeded(localeManagerWrapper.getLanguage())
shortcutsPersonalizationViewModelSlice.initialize(viewModelScope)
dashboardCardPersonalizationViewModelSlice.initialize(viewModelScope)
}
Expand Down Expand Up @@ -61,4 +67,13 @@ class PersonalizationViewModel @Inject constructor(
val siteId = selectedSiteRepository.getSelectedSite()!!.siteId
shortcutsPersonalizationViewModelSlice.addShortcut(shortcutState,siteId)
}

private fun emitLanguageRefreshIfNeeded(languageCode: String) {
if (languageCode.isNotEmpty()) {
val shouldEmitLanguageRefresh = !localeManagerWrapper.isSameLanguage(languageCode)
if (shouldEmitLanguageRefresh) {
_appLanguage.value = languageCode
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,13 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.junit.MockitoJUnitRunner
import org.mockito.kotlin.never
import org.mockito.kotlin.times
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import org.wordpress.android.BaseUnitTest
import org.wordpress.android.analytics.AnalyticsTracker
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseFour
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseNewUsers
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseOne
Expand All @@ -18,7 +23,9 @@ import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseT
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseSelfHostedUsers
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalSiteCreationPhase.PHASE_ONE
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalSiteCreationPhase.PHASE_TWO
import org.wordpress.android.ui.main.WPMainNavigationView
import org.wordpress.android.util.BuildConfigWrapper
import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper
import org.wordpress.android.util.config.JetpackFeatureRemovalNewUsersConfig
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseFourConfig
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseOneConfig
Expand Down Expand Up @@ -58,6 +65,9 @@ class JetpackFeatureRemovalPhaseHelperTest : BaseUnitTest() {
@Mock
private lateinit var phaseFourOverlayFrequencyConfig: PhaseFourOverlayFrequencyConfig

@Mock
private lateinit var analyticsTrackerWrapper: AnalyticsTrackerWrapper

private lateinit var jetpackFeatureRemovalPhaseHelper: JetpackFeatureRemovalPhaseHelper

@Before
Expand All @@ -71,7 +81,8 @@ class JetpackFeatureRemovalPhaseHelperTest : BaseUnitTest() {
jetpackFeatureRemovalNewUsersConfig,
jetpackFeatureRemovalSelfHostedUsersConfig,
jetpackFeatureRemovalStaticPostersConfig,
phaseFourOverlayFrequencyConfig
phaseFourOverlayFrequencyConfig,
analyticsTrackerWrapper
)
}

Expand Down Expand Up @@ -184,4 +195,41 @@ class JetpackFeatureRemovalPhaseHelperTest : BaseUnitTest() {

assertEquals(currentPhase, PHASE_TWO)
}

@Test
fun `given it is the Jetpack app, when we track reader accessed event, then the proper event is tracked`() {
whenever(buildConfigWrapper.isJetpackApp).thenReturn(true)

jetpackFeatureRemovalPhaseHelper.trackPageAccessedEventIfNeeded(WPMainNavigationView.PageType.READER)

verify(analyticsTrackerWrapper, times(1)).track(AnalyticsTracker.Stat.READER_ACCESSED)
}

@Test
fun `given we do not show static posters, when we track reader accessed event, then the proper event is tracked`() {
whenever(buildConfigWrapper.isJetpackApp).thenReturn(false)
whenever(jetpackFeatureRemovalStaticPostersConfig.isEnabled()).thenReturn(false)

jetpackFeatureRemovalPhaseHelper.trackPageAccessedEventIfNeeded(WPMainNavigationView.PageType.READER)

verify(analyticsTrackerWrapper, times(1)).track(AnalyticsTracker.Stat.READER_ACCESSED)
}

@Test
fun `given we do show static posters, when we track reader accessed event, then the event is not tracked`() {
whenever(jetpackFeatureRemovalStaticPostersConfig.isEnabled()).thenReturn(true)

jetpackFeatureRemovalPhaseHelper.trackPageAccessedEventIfNeeded(WPMainNavigationView.PageType.READER)

verify(analyticsTrackerWrapper, never()).track(AnalyticsTracker.Stat.READER_ACCESSED)
}

@Test
fun `given we show static posters, when we track my site accessed event, then the proper event is tracked`() {
val site = SiteModel()

jetpackFeatureRemovalPhaseHelper.trackPageAccessedEventIfNeeded(WPMainNavigationView.PageType.MY_SITE, site)

verify(analyticsTrackerWrapper, times(1)).track(AnalyticsTracker.Stat.MY_SITE_ACCESSED, site)
}
}

0 comments on commit d8edd7a

Please sign in to comment.