Skip to content

Commit e6a52bb

Browse files
authored
Merge pull request #18385 from wordpress-mobile/issue/18368-detect-block-based-themes-page-list
[Pages List] Detect block-based theme on PageListViewModel
2 parents 2f572ac + f0f9c11 commit e6a52bb

File tree

7 files changed

+109
-10
lines changed

7 files changed

+109
-10
lines changed

WordPress/src/main/java/org/wordpress/android/ui/mysite/SelectedSiteRepository.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@ import androidx.lifecycle.LiveData
44
import androidx.lifecycle.MutableLiveData
55
import androidx.lifecycle.distinctUntilChanged
66
import org.wordpress.android.fluxc.Dispatcher
7+
import org.wordpress.android.fluxc.generated.EditorThemeActionBuilder
78
import org.wordpress.android.fluxc.generated.SiteActionBuilder
89
import org.wordpress.android.fluxc.model.SiteModel
10+
import org.wordpress.android.fluxc.store.EditorThemeStore
911
import org.wordpress.android.ui.prefs.AppPrefs
1012
import org.wordpress.android.ui.prefs.AppPrefsWrapper
1113
import org.wordpress.android.ui.prefs.SiteSettingsInterfaceWrapper
14+
import org.wordpress.android.util.config.GlobalStyleSupportFeatureConfig
1215
import org.wordpress.android.util.map
1316
import javax.inject.Inject
1417
import javax.inject.Singleton
@@ -17,14 +20,16 @@ import javax.inject.Singleton
1720
class SelectedSiteRepository @Inject constructor(
1821
private val dispatcher: Dispatcher,
1922
private val siteSettingsInterfaceFactory: SiteSettingsInterfaceWrapper.Factory,
20-
private val appPrefsWrapper: AppPrefsWrapper
23+
private val appPrefsWrapper: AppPrefsWrapper,
24+
private val globalStyleSupportFeatureConfig: GlobalStyleSupportFeatureConfig,
2125
) {
2226
private var siteSettings: SiteSettingsInterfaceWrapper? = null
2327
private val _selectedSiteChange = MutableLiveData<SiteModel?>(null)
2428
private val _showSiteIconProgressBar = MutableLiveData<Boolean>()
2529
val selectedSiteChange = _selectedSiteChange as LiveData<SiteModel?>
2630
val siteSelected = _selectedSiteChange.map { it?.id }.distinctUntilChanged()
2731
val showSiteIconProgressBar = _showSiteIconProgressBar as LiveData<Boolean>
32+
2833
fun updateSite(selectedSite: SiteModel) {
2934
if (getSelectedSite()?.iconUrl != selectedSite.iconUrl) {
3035
showSiteIconProgressBar(false)
@@ -79,6 +84,12 @@ class SelectedSiteRepository @Inject constructor(
7984
getSelectedSite()?.id ?: UNAVAILABLE
8085
}
8186

87+
private fun fetchEditorTheme(site: SiteModel) {
88+
EditorThemeStore.FetchEditorThemePayload(site, globalStyleSupportFeatureConfig.isEnabled()).let {
89+
dispatcher.dispatch(EditorThemeActionBuilder.newFetchEditorThemeAction(it))
90+
}
91+
}
92+
8293
fun updateSiteSettingsIfNecessary() {
8394
// If the selected site is null, we can't update its site settings
8495
val selectedSite = getSelectedSite() ?: return
@@ -104,6 +115,8 @@ class SelectedSiteRepository @Inject constructor(
104115

105116
siteSettings?.init(true)
106117
}
118+
// Fetch editor theme to update block-based-theme flag
119+
fetchEditorTheme(selectedSite)
107120
}
108121

109122
fun isSiteIconUploadInProgress(): Boolean {

WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3718,7 +3718,7 @@ public void onEditorThemeChanged(OnEditorThemeChanged event) {
37183718
.onEditorThemeUpdated(editorThemeSupport.toBundle());
37193719

37203720
mPostEditorAnalyticsSession
3721-
.editorSettingsFetched(editorThemeSupport.isFSETheme(), event.getEndpoint().getValue());
3721+
.editorSettingsFetched(editorThemeSupport.isBlockBasedTheme(), event.getEndpoint().getValue());
37223722
}
37233723
// EditPostActivityHook methods
37243724

WordPress/src/main/java/org/wordpress/android/ui/posts/PostEditorAnalyticsSession.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class PostEditorAnalyticsSession implements Serializable {
3232
private static final String KEY_SESSION_ID = "session_id";
3333
private static final String KEY_STARTUP_TIME = "startup_time_ms";
3434
private static final String KEY_TEMPLATE = "template";
35-
private static final String KEY_FULL_SITE_EDITING = "full_site_editing";
35+
private static final String KEY_IS_BLOCK_BASED_THEME = "is_block_based_theme";
3636
private static final String KEY_ENDPOINT = "endpoint";
3737
private static final String KEY_ENTRY_POINT = "entry_point";
3838

@@ -177,9 +177,9 @@ public void applyTemplate(String template) {
177177
properties);
178178
}
179179

180-
public void editorSettingsFetched(Boolean fullSiteEditing, String endpoint) {
180+
public void editorSettingsFetched(Boolean isBlockBasedTheme, String endpoint) {
181181
final Map<String, Object> properties = getCommonProperties();
182-
properties.put(KEY_FULL_SITE_EDITING, fullSiteEditing);
182+
properties.put(KEY_IS_BLOCK_BASED_THEME, isBlockBasedTheme);
183183
properties.put(KEY_ENDPOINT, endpoint);
184184
AnalyticsUtils
185185
.trackWithSiteDetails(mAnalyticsTrackerWrapper, Stat.EDITOR_SETTINGS_FETCHED, mSiteModel, properties);

WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListViewModel.kt

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,21 @@ import androidx.lifecycle.MutableLiveData
77
import androidx.lifecycle.Observer
88
import androidx.lifecycle.Transformations
99
import kotlinx.coroutines.CoroutineDispatcher
10+
import kotlinx.coroutines.flow.MutableStateFlow
1011
import org.greenrobot.eventbus.Subscribe
1112
import org.greenrobot.eventbus.ThreadMode
1213
import org.wordpress.android.R
1314
import org.wordpress.android.fluxc.Dispatcher
15+
import org.wordpress.android.fluxc.generated.EditorThemeActionBuilder
1416
import org.wordpress.android.fluxc.generated.MediaActionBuilder
1517
import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId
1618
import org.wordpress.android.fluxc.model.MediaModel
1719
import org.wordpress.android.fluxc.model.page.PageModel
1820
import org.wordpress.android.fluxc.model.page.PageStatus
1921
import org.wordpress.android.fluxc.store.AccountStore
22+
import org.wordpress.android.fluxc.store.EditorThemeStore
23+
import org.wordpress.android.fluxc.store.EditorThemeStore.FetchEditorThemePayload
24+
import org.wordpress.android.fluxc.store.EditorThemeStore.OnEditorThemeChanged
2025
import org.wordpress.android.fluxc.store.MediaStore
2126
import org.wordpress.android.fluxc.store.MediaStore.MediaPayload
2227
import org.wordpress.android.fluxc.store.MediaStore.OnMediaChanged
@@ -36,6 +41,7 @@ import org.wordpress.android.ui.utils.UiString
3641
import org.wordpress.android.util.AppLog
3742
import org.wordpress.android.util.LocaleManagerWrapper
3843
import org.wordpress.android.util.SiteUtils
44+
import org.wordpress.android.util.config.GlobalStyleSupportFeatureConfig
3945
import org.wordpress.android.util.extensions.toFormattedDateString
4046
import org.wordpress.android.viewmodel.ScopedViewModel
4147
import org.wordpress.android.viewmodel.SingleLiveEvent
@@ -60,7 +66,9 @@ class PageListViewModel @Inject constructor(
6066
private val dispatcher: Dispatcher,
6167
private val localeManagerWrapper: LocaleManagerWrapper,
6268
private val accountStore: AccountStore,
63-
@Named(BG_THREAD) private val coroutineDispatcher: CoroutineDispatcher
69+
@Named(BG_THREAD) private val coroutineDispatcher: CoroutineDispatcher,
70+
private val globalStyleSupportFeatureConfig: GlobalStyleSupportFeatureConfig,
71+
private val editorThemeStore: EditorThemeStore,
6472
) : ScopedViewModel(coroutineDispatcher) {
6573
private val _pages: MutableLiveData<List<PageItem>> = MutableLiveData()
6674
val pages: LiveData<Triple<List<PageItem>, Boolean, Boolean>> = Transformations.map(_pages) {
@@ -71,6 +79,7 @@ class PageListViewModel @Inject constructor(
7179
private var retryScrollToPage: LocalId? = null
7280
private var isStarted: Boolean = false
7381
private lateinit var listType: PageListType
82+
private val isBlockBasedTheme = MutableStateFlow(false)
7483

7584
private lateinit var pagesViewModel: PagesViewModel
7685

@@ -136,6 +145,27 @@ class PageListViewModel @Inject constructor(
136145
pagesViewModel.blazeSiteEligibility.observeForever(blazeSiteEligibilityObserver)
137146

138147
dispatcher.register(this)
148+
149+
refreshEditorTheme()
150+
}
151+
}
152+
153+
private fun refreshEditorTheme() {
154+
// Get isBlockBasedTheme (cached) value from local db
155+
isBlockBasedTheme.value = editorThemeStore.getIsBlockBasedTheme(pagesViewModel.site)
156+
157+
// Dispatch action to refresh the values from the remote
158+
FetchEditorThemePayload(pagesViewModel.site, globalStyleSupportFeatureConfig.isEnabled()).let {
159+
dispatcher.dispatch(EditorThemeActionBuilder.newFetchEditorThemeAction(it))
160+
}
161+
}
162+
163+
@Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
164+
fun onEditorThemeChanged(event: OnEditorThemeChanged) {
165+
if (pagesViewModel.site.id == event.siteId) {
166+
event.editorTheme?.themeSupport?.let { themeSupport ->
167+
isBlockBasedTheme.value = themeSupport.isEditorThemeBlockBased()
168+
}
139169
}
140170
}
141171

WordPress/src/test/java/org/wordpress/android/ui/mysite/SelectedSiteRepositoryTest.kt

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ import org.mockito.kotlin.verifyNoInteractions
1515
import org.mockito.kotlin.whenever
1616
import org.wordpress.android.BaseUnitTest
1717
import org.wordpress.android.fluxc.Dispatcher
18+
import org.wordpress.android.fluxc.action.EditorThemeAction
1819
import org.wordpress.android.fluxc.action.SiteAction
1920
import org.wordpress.android.fluxc.annotations.action.Action
2021
import org.wordpress.android.fluxc.model.SiteModel
2122
import org.wordpress.android.ui.prefs.AppPrefsWrapper
2223
import org.wordpress.android.ui.prefs.SiteSettingsInterfaceWrapper
24+
import org.wordpress.android.util.config.GlobalStyleSupportFeatureConfig
2325

2426
@ExperimentalCoroutinesApi
2527
class SelectedSiteRepositoryTest : BaseUnitTest() {
@@ -34,6 +36,10 @@ class SelectedSiteRepositoryTest : BaseUnitTest() {
3436

3537
@Mock
3638
lateinit var appPrefsWrapper: AppPrefsWrapper
39+
40+
@Mock
41+
lateinit var globalStyleSupportFeatureConfig: GlobalStyleSupportFeatureConfig
42+
3743
private lateinit var siteModel: SiteModel
3844
private var siteIconProgressBarVisible: Boolean = false
3945
private var selectedSite: SiteModel? = null
@@ -46,7 +52,12 @@ class SelectedSiteRepositoryTest : BaseUnitTest() {
4652

4753
@Before
4854
fun setUp() {
49-
selectedSiteRepository = SelectedSiteRepository(dispatcher, siteSettingsInterfaceFactory, appPrefsWrapper)
55+
selectedSiteRepository = SelectedSiteRepository(
56+
dispatcher,
57+
siteSettingsInterfaceFactory,
58+
appPrefsWrapper,
59+
globalStyleSupportFeatureConfig
60+
)
5061
selectedSiteRepository.showSiteIconProgressBar.observeForever { siteIconProgressBarVisible = it == true }
5162
selectedSiteRepository.selectedSiteChange.observeForever { selectedSite = it }
5263
siteModel = SiteModel()
@@ -117,7 +128,6 @@ class SelectedSiteRepositoryTest : BaseUnitTest() {
117128
selectedSiteRepository.updateTitle(updatedTitle)
118129

119130
assertThat(siteModel.name).isEqualTo(updatedTitle)
120-
verify(dispatcher).dispatch(any())
121131
assertThat(actions.last().payload).isEqualTo(siteModel)
122132
assertThat(actions.last().type).isEqualTo(SiteAction.UPDATE_SITE)
123133

@@ -218,6 +228,15 @@ class SelectedSiteRepositoryTest : BaseUnitTest() {
218228
assertThat(emptySiteIdEmitted).isTrue
219229
}
220230

231+
@Test
232+
fun `Should fetch EditorTheme when updateSiteSettingsIfNecessary is called`() {
233+
initializeSiteAndSiteSettings()
234+
235+
selectedSiteRepository.updateSiteSettingsIfNecessary()
236+
237+
assertThat(actions.last().type).isEqualTo(EditorThemeAction.FETCH_EDITOR_THEME)
238+
}
239+
221240
private fun initializeSiteAndSiteSettings() {
222241
selectedSiteRepository.updateSite(siteModel)
223242
doAnswer {

WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,15 @@ import org.junit.Test
88
import org.mockito.Mock
99
import org.mockito.kotlin.any
1010
import org.mockito.kotlin.anyOrNull
11+
import org.mockito.kotlin.doAnswer
1112
import org.mockito.kotlin.mock
13+
import org.mockito.kotlin.times
14+
import org.mockito.kotlin.verify
1215
import org.mockito.kotlin.whenever
1316
import org.wordpress.android.BaseUnitTest
1417
import org.wordpress.android.fluxc.Dispatcher
18+
import org.wordpress.android.fluxc.action.EditorThemeAction
19+
import org.wordpress.android.fluxc.annotations.action.Action
1520
import org.wordpress.android.fluxc.model.AccountModel
1621
import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId
1722
import org.wordpress.android.fluxc.model.PostModel
@@ -20,6 +25,7 @@ import org.wordpress.android.fluxc.model.page.PageModel
2025
import org.wordpress.android.fluxc.model.page.PageStatus
2126
import org.wordpress.android.fluxc.model.post.PostStatus
2227
import org.wordpress.android.fluxc.store.AccountStore
28+
import org.wordpress.android.fluxc.store.EditorThemeStore
2329
import org.wordpress.android.fluxc.store.MediaStore
2430
import org.wordpress.android.ui.pages.PageItem
2531
import org.wordpress.android.ui.pages.PageItem.Divider
@@ -30,6 +36,7 @@ import org.wordpress.android.ui.posts.AuthorFilterSelection
3036
import org.wordpress.android.ui.posts.AuthorFilterSelection.EVERYONE
3137
import org.wordpress.android.ui.posts.AuthorFilterSelection.ME
3238
import org.wordpress.android.util.LocaleManagerWrapper
39+
import org.wordpress.android.util.config.GlobalStyleSupportFeatureConfig
3340
import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListState
3441
import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.PUBLISHED
3542
import org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState
@@ -68,9 +75,16 @@ class PageListViewModelTest : BaseUnitTest() {
6875
@Mock
6976
lateinit var accountStore: AccountStore
7077

78+
@Mock
79+
lateinit var globalStyleSupportFeatureConfig: GlobalStyleSupportFeatureConfig
80+
81+
@Mock
82+
lateinit var editorThemeStore: EditorThemeStore
83+
7184
private lateinit var viewModel: PageListViewModel
7285
private val site = SiteModel()
7386
private val pageListState = MutableLiveData<PageListState>()
87+
private lateinit var actions: MutableList<Action<*>>
7488

7589
@Before
7690
fun setUp() {
@@ -83,7 +97,9 @@ class PageListViewModelTest : BaseUnitTest() {
8397
dispatcher,
8498
localeManagerWrapper,
8599
accountStore,
86-
testDispatcher()
100+
testDispatcher(),
101+
globalStyleSupportFeatureConfig,
102+
editorThemeStore,
87103
)
88104

89105
whenever(pageItemProgressUiStateUseCase.getProgressStateForPage(any())).thenReturn(
@@ -115,6 +131,11 @@ class PageListViewModelTest : BaseUnitTest() {
115131

116132
val blazeSiteEligibility = MutableLiveData<Boolean>()
117133
whenever(pagesViewModel.blazeSiteEligibility).thenReturn(blazeSiteEligibility)
134+
135+
doAnswer {
136+
actions.add(it.getArgument(0))
137+
}.whenever(dispatcher).dispatch(any())
138+
actions = mutableListOf()
118139
}
119140

120141
@Test
@@ -475,6 +496,22 @@ class PageListViewModelTest : BaseUnitTest() {
475496
assertThat(pageItem.author).isNull()
476497
}
477498

499+
@Test
500+
fun `Should refresh EditorTheme when start is called the first time`() {
501+
val pages = MutableLiveData<List<PageModel>>()
502+
whenever(pagesViewModel.pages).thenReturn(pages)
503+
viewModel.start(PUBLISHED, pagesViewModel)
504+
assertThat(actions.last().type).isEqualTo(EditorThemeAction.FETCH_EDITOR_THEME)
505+
}
506+
507+
@Test
508+
fun `Should call EditorThemeStore getIsBlockBasedTheme when start is called the first time`() {
509+
val pages = MutableLiveData<List<PageModel>>()
510+
whenever(pagesViewModel.pages).thenReturn(pages)
511+
viewModel.start(PUBLISHED, pagesViewModel)
512+
verify(editorThemeStore).getIsBlockBasedTheme(site)
513+
}
514+
478515
private fun buildPageModel(
479516
id: Int,
480517
date: Date = Date(0),

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ ext {
2222
automatticTracksVersion = '2.2.0'
2323
gutenbergMobileVersion = 'v1.95.0-alpha1'
2424
wordPressAztecVersion = 'v1.6.3'
25-
wordPressFluxCVersion = 'trunk-2d2bf4a52d3d1bcc434529a3700213c376206f7f'
25+
wordPressFluxCVersion = 'trunk-7d44ea7eecabc32200d900b8065760964de04d10'
2626
wordPressLoginVersion = '1.3.0'
2727
wordPressPersistentEditTextVersion = '1.0.2'
2828
wordPressUtilsVersion = '3.6.1'

0 commit comments

Comments
 (0)