Skip to content

Commit 9ef9f4f

Browse files
authored
Merge pull request #17377 from wordpress-mobile/issue/17332-jetpack-focus-create-jetpack-current-phase-helper
Jetpack focus: Jetpack feature removal - adds Phase helper, Remote fields and test class
2 parents cd07785 + 691a2f1 commit 9ef9f4f

8 files changed

Lines changed: 323 additions & 0 deletions

File tree

WordPress/build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ android {
125125
buildConfigField "boolean", "JETPACK_BLOGGING_REMINDERS_SYNC", "false"
126126
buildConfigField "boolean", "JETPACK_READER_SAVED_POSTS", "false"
127127
buildConfigField "boolean", "JETPACK_PROVIDER_SYNC", "false"
128+
buildConfigField "boolean", "JETPACK_FEATURE_REMOVAL_PHASE_ONE", "false"
129+
buildConfigField "boolean", "JETPACK_FEATURE_REMOVAL_PHASE_TWO", "false"
130+
buildConfigField "boolean", "JETPACK_FEATURE_REMOVAL_PHASE_THREE", "false"
131+
buildConfigField "boolean", "JETPACK_FEATURE_REMOVAL_PHASE_FOUR", "false"
132+
buildConfigField "boolean", "JETPACK_FEATURE_REMOVAL_NEW_USERS", "false"
128133

129134
// Override these constants in jetpack product flavor to enable/ disable features
130135
buildConfigField "boolean", "ENABLE_SITE_CREATION", "true"
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package org.wordpress.android.ui.jetpackoverlay
2+
3+
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalSiteCreationPhase.PHASE_ONE
4+
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalSiteCreationPhase.PHASE_TWO
5+
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseFour
6+
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseNewUsers
7+
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseOne
8+
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseThree
9+
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseTwo
10+
import org.wordpress.android.util.BuildConfigWrapper
11+
import org.wordpress.android.util.config.JetpackFeatureRemovalNewUsersConfig
12+
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseFourConfig
13+
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseOneConfig
14+
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseThreeConfig
15+
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseTwoConfig
16+
import javax.inject.Inject
17+
18+
private const val PHASE_ONE_GLOBAL_OVERLAY_FREQUENCY_IN_DAYS = 2
19+
private const val PHASE_ONE_FEATURE_OVERLAY_FREQUENCY_IN_DAYS = 7
20+
21+
private const val PHASE_TWO_GLOBAL_OVERLAY_FREQUENCY_IN_DAYS = 2
22+
private const val PHASE_TWO_FEATURE_OVERLAY_FREQUENCY_IN_DAYS = 7
23+
24+
private const val PHASE_THREE_GLOBAL_OVERLAY_FREQUENCY_IN_DAYS = 2
25+
private const val PHASE_THREE_FEATURE_OVERLAY_FREQUENCY_IN_DAYS = 4
26+
27+
// Class used to find the current phase
28+
// of the Jetpack powered migration
29+
class JetpackFeatureRemovalPhaseHelper @Inject constructor(
30+
private val buildConfigWrapper: BuildConfigWrapper,
31+
private val jetpackFeatureRemovalPhaseOneConfig: JetpackFeatureRemovalPhaseOneConfig,
32+
private val jetpackFeatureRemovalPhaseTwoConfig: JetpackFeatureRemovalPhaseTwoConfig,
33+
private val jetpackFeatureRemovalPhaseThreeConfig: JetpackFeatureRemovalPhaseThreeConfig,
34+
private val jetpackFeatureRemovalPhaseFourConfig: JetpackFeatureRemovalPhaseFourConfig,
35+
private val jetpackFeatureRemovalNewUsersConfig: JetpackFeatureRemovalNewUsersConfig
36+
) {
37+
fun getCurrentPhase(): JetpackFeatureRemovalPhase? {
38+
return if (buildConfigWrapper.isJetpackApp) null
39+
else if (jetpackFeatureRemovalNewUsersConfig.isEnabled()) PhaseNewUsers
40+
else if (jetpackFeatureRemovalPhaseFourConfig.isEnabled()) PhaseFour
41+
else if (jetpackFeatureRemovalPhaseThreeConfig.isEnabled()) PhaseThree
42+
else if (jetpackFeatureRemovalPhaseTwoConfig.isEnabled()) PhaseTwo
43+
else if (jetpackFeatureRemovalPhaseOneConfig.isEnabled()) PhaseOne
44+
else null
45+
}
46+
47+
fun getSiteCreationPhase(): JetpackFeatureRemovalSiteCreationPhase? {
48+
val currentPhase = getCurrentPhase() ?: return null
49+
return when (currentPhase) {
50+
is PhaseOne, PhaseTwo, PhaseThree -> PHASE_ONE
51+
is PhaseFour, PhaseNewUsers -> PHASE_TWO
52+
}
53+
}
54+
}
55+
// Global overlay frequency is the frequency at which the overlay is shown across the features
56+
// no matter which feature was accessed last time
57+
58+
// Feature specific overlay frequency is the frequency at which the overlay is shown for a specific feature
59+
60+
sealed class JetpackFeatureRemovalPhase(
61+
val globalOverlayFrequency: Int = 0,
62+
val featureSpecificOverlayFrequency: Int = 0
63+
) {
64+
object PhaseOne : JetpackFeatureRemovalPhase(
65+
PHASE_ONE_GLOBAL_OVERLAY_FREQUENCY_IN_DAYS,
66+
PHASE_ONE_FEATURE_OVERLAY_FREQUENCY_IN_DAYS
67+
)
68+
69+
object PhaseTwo : JetpackFeatureRemovalPhase(
70+
PHASE_TWO_GLOBAL_OVERLAY_FREQUENCY_IN_DAYS,
71+
PHASE_TWO_FEATURE_OVERLAY_FREQUENCY_IN_DAYS
72+
)
73+
74+
object PhaseThree : JetpackFeatureRemovalPhase(
75+
PHASE_THREE_GLOBAL_OVERLAY_FREQUENCY_IN_DAYS,
76+
PHASE_THREE_FEATURE_OVERLAY_FREQUENCY_IN_DAYS
77+
)
78+
79+
object PhaseFour : JetpackFeatureRemovalPhase()
80+
object PhaseNewUsers : JetpackFeatureRemovalPhase()
81+
}
82+
83+
enum class JetpackFeatureRemovalSiteCreationPhase {
84+
PHASE_ONE, PHASE_TWO
85+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.wordpress.android.util.config
2+
3+
import org.wordpress.android.BuildConfig
4+
import org.wordpress.android.annotation.Feature
5+
import org.wordpress.android.util.config.JetpackFeatureRemovalNewUsersConfig.Companion.JETPACK_FEATURE_REMOVAL_NEW_USERS_REMOTE_FIELD
6+
import javax.inject.Inject
7+
8+
/**
9+
* Configuration for Jetpack feature removal phase new users
10+
*/
11+
@Feature(JETPACK_FEATURE_REMOVAL_NEW_USERS_REMOTE_FIELD, false)
12+
class JetpackFeatureRemovalNewUsersConfig @Inject constructor(
13+
appConfig: AppConfig
14+
) : FeatureConfig(
15+
appConfig,
16+
BuildConfig.JETPACK_FEATURE_REMOVAL_NEW_USERS,
17+
JETPACK_FEATURE_REMOVAL_NEW_USERS_REMOTE_FIELD
18+
) {
19+
companion object {
20+
const val JETPACK_FEATURE_REMOVAL_NEW_USERS_REMOTE_FIELD = "jp_removal_new_users"
21+
}
22+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.wordpress.android.util.config
2+
3+
import org.wordpress.android.BuildConfig
4+
import org.wordpress.android.annotation.Feature
5+
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseFourConfig.Companion.JETPACK__FEATURE_REMOVAL_PHASE_FOUR_REMOTE_FIELD
6+
import javax.inject.Inject
7+
8+
@Feature(JETPACK__FEATURE_REMOVAL_PHASE_FOUR_REMOTE_FIELD, false)
9+
class JetpackFeatureRemovalPhaseFourConfig @Inject constructor(
10+
appConfig: AppConfig
11+
) : FeatureConfig(
12+
appConfig,
13+
BuildConfig.JETPACK_FEATURE_REMOVAL_PHASE_FOUR,
14+
JETPACK__FEATURE_REMOVAL_PHASE_FOUR_REMOTE_FIELD
15+
) {
16+
companion object {
17+
const val JETPACK__FEATURE_REMOVAL_PHASE_FOUR_REMOTE_FIELD = "jp_removal_four"
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.wordpress.android.util.config
2+
3+
import org.wordpress.android.BuildConfig
4+
import org.wordpress.android.annotation.Feature
5+
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseOneConfig.Companion.JETPACK_FEATURE_REMOVAL_PHASE_ONE_REMOTE_FIELD
6+
import javax.inject.Inject
7+
8+
@Feature(JETPACK_FEATURE_REMOVAL_PHASE_ONE_REMOTE_FIELD, false)
9+
class JetpackFeatureRemovalPhaseOneConfig @Inject constructor(
10+
appConfig: AppConfig
11+
) : FeatureConfig(
12+
appConfig,
13+
BuildConfig.JETPACK_FEATURE_REMOVAL_PHASE_ONE,
14+
JETPACK_FEATURE_REMOVAL_PHASE_ONE_REMOTE_FIELD
15+
) {
16+
companion object {
17+
const val JETPACK_FEATURE_REMOVAL_PHASE_ONE_REMOTE_FIELD = "jp_removal_one"
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.wordpress.android.util.config
2+
3+
import org.wordpress.android.BuildConfig
4+
import org.wordpress.android.annotation.Feature
5+
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseThreeConfig.Companion.JETPACK_FEATURE_REMOVAL_PHASE_THREE_REMOTE_FIELD
6+
import javax.inject.Inject
7+
8+
@Feature(JETPACK_FEATURE_REMOVAL_PHASE_THREE_REMOTE_FIELD, false)
9+
class JetpackFeatureRemovalPhaseThreeConfig @Inject constructor(
10+
appConfig: AppConfig
11+
) : FeatureConfig(
12+
appConfig,
13+
BuildConfig.JETPACK_FEATURE_REMOVAL_PHASE_THREE,
14+
JETPACK_FEATURE_REMOVAL_PHASE_THREE_REMOTE_FIELD
15+
) {
16+
companion object {
17+
const val JETPACK_FEATURE_REMOVAL_PHASE_THREE_REMOTE_FIELD = "jp_removal_three"
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.wordpress.android.util.config
2+
3+
import org.wordpress.android.BuildConfig
4+
import org.wordpress.android.annotation.Feature
5+
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseTwoConfig.Companion.JETPACK_FEATURE_REMOVAL_PHASE_TWO_REMOTE_FIELD
6+
import javax.inject.Inject
7+
8+
@Feature(JETPACK_FEATURE_REMOVAL_PHASE_TWO_REMOTE_FIELD, false)
9+
class JetpackFeatureRemovalPhaseTwoConfig @Inject constructor(
10+
appConfig: AppConfig
11+
) : FeatureConfig(
12+
appConfig,
13+
BuildConfig.JETPACK_FEATURE_REMOVAL_PHASE_TWO,
14+
JETPACK_FEATURE_REMOVAL_PHASE_TWO_REMOTE_FIELD
15+
) {
16+
companion object {
17+
const val JETPACK_FEATURE_REMOVAL_PHASE_TWO_REMOTE_FIELD = "jp_removal_two"
18+
}
19+
}
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
package org.wordpress.android.ui.jetpackoverlay
2+
3+
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
4+
import com.nhaarman.mockitokotlin2.whenever
5+
import org.junit.Test
6+
7+
import org.junit.Assert.*
8+
import org.junit.Before
9+
import org.junit.Rule
10+
import org.junit.runner.RunWith
11+
import org.mockito.Mock
12+
import org.mockito.junit.MockitoJUnitRunner
13+
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalSiteCreationPhase.PHASE_ONE
14+
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalSiteCreationPhase.PHASE_TWO
15+
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseFour
16+
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseNewUsers
17+
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseOne
18+
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseThree
19+
import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhase.PhaseTwo
20+
import org.wordpress.android.util.BuildConfigWrapper
21+
import org.wordpress.android.util.config.JetpackFeatureRemovalNewUsersConfig
22+
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseFourConfig
23+
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseOneConfig
24+
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseThreeConfig
25+
import org.wordpress.android.util.config.JetpackFeatureRemovalPhaseTwoConfig
26+
27+
@RunWith(MockitoJUnitRunner::class)
28+
class JetpackFeatureRemovalPhaseHelperTest {
29+
@Mock private lateinit var buildConfigWrapper: BuildConfigWrapper
30+
@Mock private lateinit var jetpackFeatureRemovalPhaseOneConfig: JetpackFeatureRemovalPhaseOneConfig
31+
@Mock private lateinit var jetpackFeatureRemovalPhaseTwoConfig: JetpackFeatureRemovalPhaseTwoConfig
32+
@Mock private lateinit var jetpackFeatureRemovalPhaseThreeConfig: JetpackFeatureRemovalPhaseThreeConfig
33+
@Mock private lateinit var jetpackFeatureRemovalPhaseFourConfig: JetpackFeatureRemovalPhaseFourConfig
34+
@Mock private lateinit var jetpackFeatureRemovalNewUsersConfig: JetpackFeatureRemovalNewUsersConfig
35+
36+
@Rule
37+
@JvmField val rule = InstantTaskExecutorRule()
38+
39+
private lateinit var jetpackFeatureRemovalPhaseHelper: JetpackFeatureRemovalPhaseHelper
40+
41+
@Before
42+
fun setup() {
43+
jetpackFeatureRemovalPhaseHelper = JetpackFeatureRemovalPhaseHelper(
44+
buildConfigWrapper,
45+
jetpackFeatureRemovalPhaseOneConfig,
46+
jetpackFeatureRemovalPhaseTwoConfig,
47+
jetpackFeatureRemovalPhaseThreeConfig,
48+
jetpackFeatureRemovalPhaseFourConfig,
49+
jetpackFeatureRemovalNewUsersConfig
50+
)
51+
}
52+
53+
// general phase tests
54+
@Test
55+
fun `given jetpack app, when current phase is fetched, then return null`() {
56+
whenever(buildConfigWrapper.isJetpackApp).thenReturn(true)
57+
58+
val currentPhase = jetpackFeatureRemovalPhaseHelper.getCurrentPhase()
59+
60+
assertNull(currentPhase)
61+
}
62+
63+
@Test
64+
fun `given phase one config true, when current phase is fetched, then return phase one`() {
65+
whenever(jetpackFeatureRemovalPhaseOneConfig.isEnabled()).thenReturn(true)
66+
67+
val currentPhase = jetpackFeatureRemovalPhaseHelper.getCurrentPhase()
68+
69+
assertEquals(currentPhase, PhaseOne)
70+
}
71+
72+
@Test
73+
fun `given phase two config true, when current phase is fetched, then return phase two`() {
74+
whenever(jetpackFeatureRemovalPhaseTwoConfig.isEnabled()).thenReturn(true)
75+
76+
val currentPhase = jetpackFeatureRemovalPhaseHelper.getCurrentPhase()
77+
78+
assertEquals(currentPhase, PhaseTwo)
79+
}
80+
81+
@Test
82+
fun `given phase three config true, when current phase is fetched, then return phase three`() {
83+
whenever(jetpackFeatureRemovalPhaseThreeConfig.isEnabled()).thenReturn(true)
84+
85+
val currentPhase = jetpackFeatureRemovalPhaseHelper.getCurrentPhase()
86+
87+
assertEquals(currentPhase, PhaseThree)
88+
}
89+
90+
@Test
91+
fun `given phase four config true, when current phase is fetched, then return phase four`() {
92+
whenever(jetpackFeatureRemovalPhaseFourConfig.isEnabled()).thenReturn(true)
93+
94+
val currentPhase = jetpackFeatureRemovalPhaseHelper.getCurrentPhase()
95+
96+
assertEquals(currentPhase, PhaseFour)
97+
}
98+
99+
@Test
100+
fun `given phase new users config true, when current phase is fetched, then return phase new users`() {
101+
whenever(jetpackFeatureRemovalNewUsersConfig.isEnabled()).thenReturn(true)
102+
103+
val currentPhase = jetpackFeatureRemovalPhaseHelper.getCurrentPhase()
104+
105+
assertEquals(currentPhase, PhaseNewUsers)
106+
}
107+
108+
// site creation phase tests
109+
@Test
110+
fun `given jetpack app, when current site creation phase is fetched, then return null`() {
111+
whenever(buildConfigWrapper.isJetpackApp).thenReturn(true)
112+
113+
val currentPhase = jetpackFeatureRemovalPhaseHelper.getSiteCreationPhase()
114+
115+
assertNull(currentPhase)
116+
}
117+
118+
@Test
119+
fun `given phase one config true, when current site creation phase is fetched, then return phase one`() {
120+
whenever(jetpackFeatureRemovalPhaseOneConfig.isEnabled()).thenReturn(true)
121+
122+
val currentPhase = jetpackFeatureRemovalPhaseHelper.getSiteCreationPhase()
123+
124+
assertEquals(currentPhase, PHASE_ONE)
125+
}
126+
127+
@Test
128+
fun `given phase four config true, when current site creation phase is fetched, then return phase two`() {
129+
whenever(jetpackFeatureRemovalNewUsersConfig.isEnabled()).thenReturn(true)
130+
131+
val currentPhase = jetpackFeatureRemovalPhaseHelper.getSiteCreationPhase()
132+
133+
assertEquals(currentPhase, PHASE_TWO)
134+
}
135+
}

0 commit comments

Comments
 (0)