From 2dc38bc9059ed27385a777344f4e79e0e80109a6 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Fri, 22 Sep 2023 17:03:50 -0400 Subject: [PATCH 01/22] Refactor: Remove onCreateSiteResult() - tabs are no longer used --- .../java/org/wordpress/android/ui/mysite/MySiteFragment.kt | 2 -- .../java/org/wordpress/android/ui/mysite/MySiteViewModel.kt | 5 ----- .../wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt | 2 -- 3 files changed, 9 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt index 20d9b52dfa4c..cf9195ed19ea 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt @@ -276,7 +276,6 @@ class MySiteFragment : Fragment(R.layout.my_site_fragment), RequestCodes.CREATE_SITE -> { val isNewSite = requestCode == RequestCodes.CREATE_SITE || data.getBooleanExtra(LoginEpilogueActivity.KEY_SITE_CREATED_FROM_LOGIN_EPILOGUE, false) - viewModel.onCreateSiteResult() viewModel.performFirstStepAfterSiteCreation( data.getBooleanExtra(SitePickerActivity.KEY_SITE_TITLE_TASK_COMPLETED, false), isNewSite = isNewSite @@ -284,7 +283,6 @@ class MySiteFragment : Fragment(R.layout.my_site_fragment), } RequestCodes.SITE_PICKER -> { if (data.getIntExtra(WPMainActivity.ARG_CREATE_SITE, 0) == RequestCodes.CREATE_SITE) { - viewModel.onCreateSiteResult() viewModel.performFirstStepAfterSiteCreation( data.getBooleanExtra(SitePickerActivity.KEY_SITE_TITLE_TASK_COMPLETED, false), isNewSite = true diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteViewModel.kt index 3489fd158904..43f8574bf385 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteViewModel.kt @@ -971,11 +971,6 @@ class MySiteViewModel @Inject constructor( } } - fun onCreateSiteResult() { - isDefaultTabSet = false - selectDefaultTabIfNeeded() - } - fun onSitePicked() { selectedSiteRepository.getSelectedSite()?.let { val siteLocalId = it.id.toLong() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt index 465476962180..3846e01a5b5d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt @@ -665,7 +665,6 @@ class MySiteTabFragment : Fragment(R.layout.my_site_tab_fragment), RequestCodes.CREATE_SITE -> { val isNewSite = requestCode == RequestCodes.CREATE_SITE || data.getBooleanExtra(LoginEpilogueActivity.KEY_SITE_CREATED_FROM_LOGIN_EPILOGUE, false) - viewModel.onCreateSiteResult() viewModel.performFirstStepAfterSiteCreation( data.getBooleanExtra(SitePickerActivity.KEY_SITE_TITLE_TASK_COMPLETED, false), isNewSite = isNewSite @@ -673,7 +672,6 @@ class MySiteTabFragment : Fragment(R.layout.my_site_tab_fragment), } RequestCodes.SITE_PICKER -> { if (data.getIntExtra(WPMainActivity.ARG_CREATE_SITE, 0) == RequestCodes.CREATE_SITE) { - viewModel.onCreateSiteResult() viewModel.performFirstStepAfterSiteCreation( data.getBooleanExtra(SitePickerActivity.KEY_SITE_TITLE_TASK_COMPLETED, false), isNewSite = true From 1c9aa834364ccdf62310469863af4e0951bb461c Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Fri, 22 Sep 2023 17:13:46 -0400 Subject: [PATCH 02/22] Refactor: Rename my_site_tab_fragment to my_site_menu_fragment --- .../ui/mysite/tabs/MySiteTabFragment.kt | 18 +++++++++--------- .../main/res/layout/activity_mysite_menu.xml | 2 +- ..._fragment.xml => my_site_menu_fragment.xml} | 0 3 files changed, 10 insertions(+), 10 deletions(-) rename WordPress/src/main/res/layout/{my_site_tab_fragment.xml => my_site_menu_fragment.xml} (100%) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt index 3846e01a5b5d..a3f7775a63d2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt @@ -23,7 +23,7 @@ import com.yalantis.ucrop.UCropActivity import org.wordpress.android.R import org.wordpress.android.WordPress import org.wordpress.android.analytics.AnalyticsTracker -import org.wordpress.android.databinding.MySiteTabFragmentBinding +import org.wordpress.android.databinding.MySiteMenuFragmentBinding import org.wordpress.android.fluxc.store.AccountStore import org.wordpress.android.fluxc.store.QuickStartStore.QuickStartTask import org.wordpress.android.ui.ActivityLauncher @@ -104,7 +104,7 @@ import android.R as AndroidR import com.google.android.material.R as MaterialR @Suppress("LargeClass") -class MySiteTabFragment : Fragment(R.layout.my_site_tab_fragment), +class MySiteTabFragment : Fragment(R.layout.my_site_menu_fragment), TextInputDialogFragment.Callback, QuickStartPromptClickInterface, OnConfirmListener, @@ -156,7 +156,7 @@ class MySiteTabFragment : Fragment(R.layout.my_site_tab_fragment), private lateinit var swipeToRefreshHelper: SwipeToRefreshHelper private lateinit var mySiteTabType: MySiteTabType - private var binding: MySiteTabFragmentBinding? = null + private var binding: MySiteMenuFragmentBinding? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -177,7 +177,7 @@ class MySiteTabFragment : Fragment(R.layout.my_site_tab_fragment), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initTabType() - binding = MySiteTabFragmentBinding.bind(view).apply { + binding = MySiteMenuFragmentBinding.bind(view).apply { setupContentViews(savedInstanceState) setupObservers() swipeToRefreshHelper.isRefreshing = true @@ -201,7 +201,7 @@ class MySiteTabFragment : Fragment(R.layout.my_site_tab_fragment), } } - private fun MySiteTabFragmentBinding.setupContentViews(savedInstanceState: Bundle?) { + private fun MySiteMenuFragmentBinding.setupContentViews(savedInstanceState: Bundle?) { with(requireActivity() as AppCompatActivity) { setSupportActionBar(toolbarMain) supportActionBar?.apply { @@ -260,7 +260,7 @@ class MySiteTabFragment : Fragment(R.layout.my_site_tab_fragment), } @Suppress("DEPRECATION", "LongMethod") - private fun MySiteTabFragmentBinding.setupObservers() { + private fun MySiteMenuFragmentBinding.setupObservers() { viewModel.uiModel.observe(viewLifecycleOwner, { uiModel -> hideRefreshIndicatorIfNeeded() when (val state = uiModel.state) { @@ -711,7 +711,7 @@ class MySiteTabFragment : Fragment(R.layout.my_site_tab_fragment), quickStartTracker.track(AnalyticsTracker.Stat.QUICK_START_REQUEST_VIEWED) } - private fun MySiteTabFragmentBinding.loadData(state: State.SiteSelected) { + private fun MySiteMenuFragmentBinding.loadData(state: State.SiteSelected) { recyclerView.setVisible(true) val cardAndItems = when (mySiteTabType) { MySiteTabType.SITE_MENU -> state.siteMenuCardsAndItems @@ -721,7 +721,7 @@ class MySiteTabFragment : Fragment(R.layout.my_site_tab_fragment), (recyclerView.adapter as? MySiteAdapter)?.submitList(cardAndItems) } - private fun MySiteTabFragmentBinding.loadEmptyView() { + private fun MySiteMenuFragmentBinding.loadEmptyView() { recyclerView.setVisible(false) } @@ -747,7 +747,7 @@ class MySiteTabFragment : Fragment(R.layout.my_site_tab_fragment), } } - private fun MySiteTabFragmentBinding.hideRefreshIndicatorIfNeeded() { + private fun MySiteMenuFragmentBinding.hideRefreshIndicatorIfNeeded() { swipeRefreshLayout.postDelayed({ swipeToRefreshHelper.isRefreshing = viewModel.isRefreshing() }, CHECK_REFRESH_DELAY) diff --git a/WordPress/src/main/res/layout/activity_mysite_menu.xml b/WordPress/src/main/res/layout/activity_mysite_menu.xml index 4f049d8cead0..05ad1e0d53a2 100644 --- a/WordPress/src/main/res/layout/activity_mysite_menu.xml +++ b/WordPress/src/main/res/layout/activity_mysite_menu.xml @@ -11,6 +11,6 @@ android:name="org.wordpress.android.ui.mysite.tabs.MySiteTabFragment" android:layout_width="match_parent" android:layout_height="match_parent" - tools:layout="@layout/my_site_tab_fragment" /> + tools:layout="@layout/my_site_menu_fragment" /> diff --git a/WordPress/src/main/res/layout/my_site_tab_fragment.xml b/WordPress/src/main/res/layout/my_site_menu_fragment.xml similarity index 100% rename from WordPress/src/main/res/layout/my_site_tab_fragment.xml rename to WordPress/src/main/res/layout/my_site_menu_fragment.xml From 38bb42b0f2a74a241ca0127f65eb9e56b85e30a4 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Fri, 22 Sep 2023 17:17:09 -0400 Subject: [PATCH 03/22] Refactor: Rename MySiteTabFragment to MySiteMenuFragment --- .../org/wordpress/android/modules/AppComponent.java | 4 ++-- .../{MySiteTabFragment.kt => MySiteMenuFragment.kt} | 10 +++++----- .../android/ui/mysite/tabs/MySiteTabsAdapter.kt | 2 +- WordPress/src/main/res/layout/activity_mysite_menu.xml | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) rename WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/{MySiteTabFragment.kt => MySiteMenuFragment.kt} (98%) diff --git a/WordPress/src/main/java/org/wordpress/android/modules/AppComponent.java b/WordPress/src/main/java/org/wordpress/android/modules/AppComponent.java index 4f5e0fd1c3e2..36397474af15 100644 --- a/WordPress/src/main/java/org/wordpress/android/modules/AppComponent.java +++ b/WordPress/src/main/java/org/wordpress/android/modules/AppComponent.java @@ -57,7 +57,7 @@ import org.wordpress.android.ui.mediapicker.MediaPickerFragment; import org.wordpress.android.ui.mlp.ModalLayoutPickerFragment; import org.wordpress.android.ui.mysite.MySiteFragment; -import org.wordpress.android.ui.mysite.tabs.MySiteTabFragment; +import org.wordpress.android.ui.mysite.tabs.MySiteMenuFragment; import org.wordpress.android.ui.notifications.DismissNotificationReceiver; import org.wordpress.android.ui.notifications.NotificationsDetailActivity; import org.wordpress.android.ui.notifications.NotificationsDetailListFragment; @@ -503,7 +503,7 @@ public interface AppComponent { void inject(MySiteFragment object); - void inject(MySiteTabFragment object); + void inject(MySiteMenuFragment object); void inject(BackupDownloadActivity object); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteMenuFragment.kt similarity index 98% rename from WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt rename to WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteMenuFragment.kt index a3f7775a63d2..4b4119a4cc5f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteMenuFragment.kt @@ -104,7 +104,7 @@ import android.R as AndroidR import com.google.android.material.R as MaterialR @Suppress("LargeClass") -class MySiteTabFragment : Fragment(R.layout.my_site_menu_fragment), +class MySiteMenuFragment : Fragment(R.layout.my_site_menu_fragment), TextInputDialogFragment.Callback, QuickStartPromptClickInterface, OnConfirmListener, @@ -288,7 +288,7 @@ class MySiteTabFragment : Fragment(R.layout.my_site_menu_fragment), model.isInputEnabled, model.callbackId ) - inputDialog.setTargetFragment(this@MySiteTabFragment, 0) + inputDialog.setTargetFragment(this@MySiteMenuFragment, 0) inputDialog.show(parentFragmentManager, TextInputDialogFragment.TAG) }) viewModel.onNavigation.observeEvent(viewLifecycleOwner, { handleNavigationAction(it) }) @@ -318,7 +318,7 @@ class MySiteTabFragment : Fragment(R.layout.my_site_menu_fragment), is SiteNavigationAction.OpenSitePicker -> ActivityLauncher.showSitePickerForResult(activity, action.site) is SiteNavigationAction.OpenSite -> ActivityLauncher.viewCurrentSite(activity, action.site, true) is SiteNavigationAction.OpenMediaPicker -> - mediaPickerLauncher.showSiteIconPicker(this@MySiteTabFragment, action.site) + mediaPickerLauncher.showSiteIconPicker(this@MySiteMenuFragment, action.site) is SiteNavigationAction.OpenCropActivity -> startCropActivity(action.imageUri) is SiteNavigationAction.OpenActivityLog -> ActivityLauncher.viewActivityLogList(activity, action.site) is SiteNavigationAction.OpenBackup -> ActivityLauncher.viewBackupList(activity, action.site) @@ -345,7 +345,7 @@ class MySiteTabFragment : Fragment(R.layout.my_site_menu_fragment), is SiteNavigationAction.ConnectJetpackForStats -> ActivityLauncher.viewConnectJetpackForStats(activity, action.site) is SiteNavigationAction.StartWPComLoginForJetpackStats -> - ActivityLauncher.loginForJetpackStats(this@MySiteTabFragment) + ActivityLauncher.loginForJetpackStats(this@MySiteMenuFragment) is SiteNavigationAction.OpenStories -> ActivityLauncher.viewStories(activity, action.site, action.event) is SiteNavigationAction.AddNewStory -> ActivityLauncher.addNewStoryForResult(activity, action.site, action.source) @@ -776,7 +776,7 @@ class MySiteTabFragment : Fragment(R.layout.my_site_menu_fragment), private const val FIRST_ITEM = 0 @JvmStatic - fun newInstance(mySiteTabType: MySiteTabType) = MySiteTabFragment().apply { + fun newInstance(mySiteTabType: MySiteTabType) = MySiteMenuFragment().apply { arguments = Bundle().apply { putString(KEY_MY_SITE_TAB_TYPE, mySiteTabType.label) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabsAdapter.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabsAdapter.kt index a67821e54e7b..b64aeac6dcf2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabsAdapter.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabsAdapter.kt @@ -10,5 +10,5 @@ class MySiteTabsAdapter( ) : FragmentStateAdapter(parent) { override fun getItemCount(): Int = tabUiStates.size - override fun createFragment(position: Int) = MySiteTabFragment.newInstance(tabUiStates[position].tabType) + override fun createFragment(position: Int) = MySiteMenuFragment.newInstance(tabUiStates[position].tabType) } diff --git a/WordPress/src/main/res/layout/activity_mysite_menu.xml b/WordPress/src/main/res/layout/activity_mysite_menu.xml index 05ad1e0d53a2..9092d07b7c08 100644 --- a/WordPress/src/main/res/layout/activity_mysite_menu.xml +++ b/WordPress/src/main/res/layout/activity_mysite_menu.xml @@ -8,7 +8,7 @@ From a0ba64fa4385186cee4346d941b6e4c88f9d5f74 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Fri, 22 Sep 2023 17:21:35 -0400 Subject: [PATCH 04/22] Refactor: Remove MySiteTabsAdapter --- .../android/ui/mysite/tabs/MySiteTabsAdapter.kt | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabsAdapter.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabsAdapter.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabsAdapter.kt deleted file mode 100644 index b64aeac6dcf2..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabsAdapter.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.wordpress.android.ui.mysite.tabs - -import androidx.fragment.app.Fragment -import androidx.viewpager2.adapter.FragmentStateAdapter -import org.wordpress.android.ui.mysite.MySiteViewModel.TabsUiState.TabUiState - -class MySiteTabsAdapter( - parent: Fragment, - private val tabUiStates: List -) : FragmentStateAdapter(parent) { - override fun getItemCount(): Int = tabUiStates.size - - override fun createFragment(position: Int) = MySiteMenuFragment.newInstance(tabUiStates[position].tabType) -} From 62043ab5c08fc83d71abe05407d27e8a9e3aaaa0 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Fri, 22 Sep 2023 17:23:52 -0400 Subject: [PATCH 05/22] Refactor: Move MySiteMenuFragment out of tabs package. --- .../java/org/wordpress/android/modules/AppComponent.java | 2 +- .../org/wordpress/android/ui/main/WPMainActivity.java | 2 +- .../org/wordpress/android/ui/mysite/MySiteFragment.kt | 1 - .../android/ui/mysite/{tabs => }/MySiteMenuFragment.kt | 8 ++------ WordPress/src/main/res/layout/activity_mysite_menu.xml | 2 +- 5 files changed, 5 insertions(+), 10 deletions(-) rename WordPress/src/main/java/org/wordpress/android/ui/mysite/{tabs => }/MySiteMenuFragment.kt (99%) diff --git a/WordPress/src/main/java/org/wordpress/android/modules/AppComponent.java b/WordPress/src/main/java/org/wordpress/android/modules/AppComponent.java index 36397474af15..a601fb718d3f 100644 --- a/WordPress/src/main/java/org/wordpress/android/modules/AppComponent.java +++ b/WordPress/src/main/java/org/wordpress/android/modules/AppComponent.java @@ -57,7 +57,7 @@ import org.wordpress.android.ui.mediapicker.MediaPickerFragment; import org.wordpress.android.ui.mlp.ModalLayoutPickerFragment; import org.wordpress.android.ui.mysite.MySiteFragment; -import org.wordpress.android.ui.mysite.tabs.MySiteMenuFragment; +import org.wordpress.android.ui.mysite.MySiteMenuFragment; import org.wordpress.android.ui.notifications.DismissNotificationReceiver; import org.wordpress.android.ui.notifications.NotificationsDetailActivity; import org.wordpress.android.ui.notifications.NotificationsDetailListFragment; diff --git a/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainActivity.java index c069bc26b927..d36c2802f974 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainActivity.java @@ -99,7 +99,7 @@ import org.wordpress.android.ui.mysite.MySiteViewModel; import org.wordpress.android.ui.mysite.SelectedSiteRepository; import org.wordpress.android.ui.mysite.cards.quickstart.QuickStartRepository; -import org.wordpress.android.ui.mysite.tabs.BloggingPromptsOnboardingListener; +import org.wordpress.android.ui.mysite.BloggingPromptsOnboardingListener; import org.wordpress.android.ui.notifications.NotificationEvents; import org.wordpress.android.ui.notifications.NotificationsListFragment; import org.wordpress.android.ui.notifications.SystemNotificationsTracker; diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt index cf9195ed19ea..6b35eba747b9 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt @@ -47,7 +47,6 @@ import org.wordpress.android.ui.mysite.MySiteViewModel.SiteInfoToolbarViewParams import org.wordpress.android.ui.mysite.MySiteViewModel.State import org.wordpress.android.ui.mysite.cards.dashboard.bloggingprompts.BloggingPromptsCardAnalyticsTracker import org.wordpress.android.ui.mysite.jetpackbadge.JetpackPoweredBottomSheetFragment -import org.wordpress.android.ui.mysite.tabs.BloggingPromptsOnboardingListener import org.wordpress.android.ui.pages.SnackbarMessageHolder import org.wordpress.android.ui.photopicker.MediaPickerConstants import org.wordpress.android.ui.photopicker.MediaPickerLauncher diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteMenuFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteMenuFragment.kt similarity index 99% rename from WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteMenuFragment.kt rename to WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteMenuFragment.kt index 4b4119a4cc5f..c3a6a0e4a95c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteMenuFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteMenuFragment.kt @@ -1,6 +1,6 @@ @file:Suppress("DEPRECATION") -package org.wordpress.android.ui.mysite.tabs +package org.wordpress.android.ui.mysite import android.app.Activity import android.content.Intent @@ -47,16 +47,12 @@ import org.wordpress.android.ui.main.SitePickerActivity import org.wordpress.android.ui.main.WPMainActivity import org.wordpress.android.ui.main.jetpack.migration.JetpackMigrationActivity import org.wordpress.android.ui.main.utils.MeGravatarLoader -import org.wordpress.android.ui.mysite.BloggingPromptCardNavigationAction -import org.wordpress.android.ui.mysite.MySiteAdapter -import org.wordpress.android.ui.mysite.MySiteCardAndItemDecoration -import org.wordpress.android.ui.mysite.MySiteViewModel import org.wordpress.android.ui.mysite.MySiteViewModel.MySiteTrackWithTabSource import org.wordpress.android.ui.mysite.MySiteViewModel.State import org.wordpress.android.ui.mysite.SiteIconUploadHandler.ItemUploadedModel -import org.wordpress.android.ui.mysite.SiteNavigationAction import org.wordpress.android.ui.mysite.cards.dashboard.bloggingprompts.BloggingPromptsCardAnalyticsTracker import org.wordpress.android.ui.mysite.jetpackbadge.JetpackPoweredBottomSheetFragment +import org.wordpress.android.ui.mysite.tabs.MySiteTabType import org.wordpress.android.ui.pages.SnackbarMessageHolder import org.wordpress.android.ui.photopicker.MediaPickerConstants import org.wordpress.android.ui.photopicker.MediaPickerLauncher diff --git a/WordPress/src/main/res/layout/activity_mysite_menu.xml b/WordPress/src/main/res/layout/activity_mysite_menu.xml index 9092d07b7c08..753489087f5f 100644 --- a/WordPress/src/main/res/layout/activity_mysite_menu.xml +++ b/WordPress/src/main/res/layout/activity_mysite_menu.xml @@ -8,7 +8,7 @@ From 905f495220ae37edb055d7975b343f5e0751b7b3 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Fri, 22 Sep 2023 17:24:23 -0400 Subject: [PATCH 06/22] Remove call to viewModel.onCreateSiteResult --- .../java/org/wordpress/android/ui/mysite/MySiteViewModelTest.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/ui/mysite/MySiteViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/mysite/MySiteViewModelTest.kt index 88a746404076..3948b59c4f97 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/mysite/MySiteViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/mysite/MySiteViewModelTest.kt @@ -663,8 +663,6 @@ class MySiteViewModelTest : BaseUnitTest() { initialScreen = MySiteTabType.SITE_MENU.label ) - viewModel.onCreateSiteResult() - assertThat(tabNavigation).size().isEqualTo(2) /* First time default tab is set when My Site screen is shown and site is selected. When site is created then again it sets the default tab. */ From 525a06294e15d7d8d19e60007fdfad1171926f8e Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Fri, 22 Sep 2023 17:54:06 -0400 Subject: [PATCH 07/22] Remove initial screen for app settings view --- .../android/ui/prefs/AppSettingsFragment.java | 28 ------------------- WordPress/src/main/res/xml/app_settings.xml | 9 ------ 2 files changed, 37 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppSettingsFragment.java index e78303cd150e..85b4030fcf31 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppSettingsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppSettingsFragment.java @@ -49,7 +49,6 @@ import org.wordpress.android.ui.deeplinks.DeepLinkOpenWebLinksWithJetpackHelper; import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhaseHelper; import org.wordpress.android.ui.mysite.jetpackbadge.JetpackPoweredBottomSheetFragment; -import org.wordpress.android.ui.mysite.tabs.MySiteTabType; import org.wordpress.android.ui.prefs.language.LocalePickerBottomSheet; import org.wordpress.android.ui.prefs.language.LocalePickerBottomSheet.LocalePickerCallback; import org.wordpress.android.ui.reader.services.update.ReaderUpdateLogic; @@ -68,7 +67,6 @@ import org.wordpress.android.util.WPActivityUtils; import org.wordpress.android.util.WPPrefUtils; import org.wordpress.android.util.analytics.AnalyticsUtils; -import org.wordpress.android.util.config.MySiteDashboardTabsFeatureConfig; import org.wordpress.android.viewmodel.ContextProvider; import java.util.Collections; @@ -109,7 +107,6 @@ public class AppSettingsFragment extends PreferenceFragment @Inject ContextProvider mContextProvider; @Inject FeatureAnnouncementProvider mFeatureAnnouncementProvider; @Inject BuildConfigWrapper mBuildConfigWrapper; - @Inject MySiteDashboardTabsFeatureConfig mMySiteDashboardTabsFeatureConfig; @Inject JetpackBrandingUtils mJetpackBrandingUtils; @Inject LocaleProvider mLocaleProvider; @Inject DeepLinkOpenWebLinksWithJetpackHelper mOpenWebLinksWithJetpackHelper; @@ -156,9 +153,6 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { mAppThemePreference = (ListPreference) findPreference(getString(R.string.pref_key_app_theme)); mAppThemePreference.setOnPreferenceChangeListener(this); - mInitialScreenPreference = (ListPreference) findPreference(getString(R.string.pref_key_initial_screen)); - mInitialScreenPreference.setOnPreferenceChangeListener(this); - findPreference(getString(R.string.pref_key_language)) .setOnPreferenceClickListener(this); findPreference(getString(R.string.pref_key_device_settings)) @@ -231,18 +225,10 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { removeDebugSettingsCategory(); } - if (!mMySiteDashboardTabsFeatureConfig.isEnabled()) { - removeInitialScreen(); - } - if (!mOpenWebLinksWithJetpackHelper.shouldShowAppSetting()) { removeOpenWebLinksWithJetpack(); } - if (mJetpackFeatureRemovalPhaseHelper.shouldRemoveJetpackFeatures()) { - removeInitialScreen(); - } - final boolean showPrivacySettings = getActivity() .getIntent() .getBooleanExtra(EXTRA_SHOW_PRIVACY_SETTINGS, false); @@ -334,13 +320,6 @@ private void addWhatsNewPreference() { preferenceScreen.addPreference(mWhatsNew); } - private void removeInitialScreen() { - Preference initialScreenPreference = - findPreference(getString(R.string.pref_key_initial_screen)); - PreferenceScreen preferenceScreen = - (PreferenceScreen) findPreference(getString(R.string.pref_key_app_settings_root)); - preferenceScreen.removePreference(initialScreenPreference); - } private void removeOpenWebLinksWithJetpack() { Preference openWebLinksWithJetpackPreference = @@ -508,13 +487,6 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { .singletonMap(TRACK_STYLE, (String) newValue)); // restart activity to make sure changes are applied to PreferenceScreen getActivity().recreate(); - } else if (preference == mInitialScreenPreference) { - String trackValue = newValue.equals(MySiteTabType.SITE_MENU.getLabel()) - ? MySiteTabType.SITE_MENU.getTrackingLabel() - : MySiteTabType.DASHBOARD.getTrackingLabel(); - Map properties = new HashMap<>(); - properties.put("selected", trackValue); - AnalyticsTracker.track(Stat.APP_SETTINGS_INITIAL_SCREEN_CHANGED, properties); } else if (preference == mReportCrashPref) { AnalyticsTracker.track(Stat.PRIVACY_SETTINGS_REPORT_CRASHES_TOGGLED, Collections .singletonMap(TRACK_ENABLED, newValue)); diff --git a/WordPress/src/main/res/xml/app_settings.xml b/WordPress/src/main/res/xml/app_settings.xml index 8260541eae7e..7792d58ab475 100644 --- a/WordPress/src/main/res/xml/app_settings.xml +++ b/WordPress/src/main/res/xml/app_settings.xml @@ -67,15 +67,6 @@ android:key="@string/pref_key_device_settings" android:title="@string/preference_open_device_settings" /> - - Date: Sun, 24 Sep 2023 14:59:19 -0400 Subject: [PATCH 08/22] Add UnifiedMySiteMenuActivity entry --- WordPress/src/main/AndroidManifest.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/WordPress/src/main/AndroidManifest.xml b/WordPress/src/main/AndroidManifest.xml index ad67cb63494e..e8c210870ba4 100644 --- a/WordPress/src/main/AndroidManifest.xml +++ b/WordPress/src/main/AndroidManifest.xml @@ -102,6 +102,12 @@ android:label="@string/my_site_section_screen_title" android:exported="false" /> + + Date: Sun, 24 Sep 2023 15:00:26 -0400 Subject: [PATCH 09/22] Add openUnifiedMySiteMenu navigation action to launch UnifiedMySiteMenuActivity --- .../main/java/org/wordpress/android/ui/ActivityNavigator.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/ActivityNavigator.kt b/WordPress/src/main/java/org/wordpress/android/ui/ActivityNavigator.kt index 3dbafdc72bea..cd63cbc38a16 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/ActivityNavigator.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/ActivityNavigator.kt @@ -11,6 +11,7 @@ import org.wordpress.android.ui.blaze.blazecampaigns.campaignlisting.CampaignLis import org.wordpress.android.ui.blaze.blazepromote.ARG_BLAZE_FLOW_SOURCE import org.wordpress.android.ui.blaze.blazepromote.ARG_BLAZE_SHOULD_SHOW_OVERLAY import org.wordpress.android.ui.blaze.blazepromote.BlazePromoteParentActivity +import org.wordpress.android.ui.mysite.UnifiedMySiteMenuActivity import org.wordpress.android.ui.mysite.personalization.PersonalizationActivity import javax.inject.Inject import javax.inject.Singleton @@ -64,4 +65,8 @@ class ActivityNavigator @Inject constructor() { fun openDashboardPersonalization(context: Context) { context.startActivity(Intent(context, PersonalizationActivity::class.java)) } + + fun openUnifiedMySiteMenu(context: Context) { + context.startActivity(Intent(context, UnifiedMySiteMenuActivity::class.java)) + } } From 6c8adc80b49be068b301abd1d624477462be1b6f Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Sun, 24 Sep 2023 15:01:24 -0400 Subject: [PATCH 10/22] Add quick start focus into its own layout file so it can be used within the unified my site menu --- .../res/layout/quick_start_focus_point.xml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 WordPress/src/main/res/layout/quick_start_focus_point.xml diff --git a/WordPress/src/main/res/layout/quick_start_focus_point.xml b/WordPress/src/main/res/layout/quick_start_focus_point.xml new file mode 100644 index 000000000000..6a3b0107f021 --- /dev/null +++ b/WordPress/src/main/res/layout/quick_start_focus_point.xml @@ -0,0 +1,20 @@ + + + + From 3c77ba0378b731e91e471997daea6b1464d7e967 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Sun, 24 Sep 2023 15:03:40 -0400 Subject: [PATCH 11/22] [WIP] Route OpenMore to UnifiedMySiteMenu instead of MySiteMenuActivity --- .../java/org/wordpress/android/ui/mysite/MySiteFragment.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt index 6b35eba747b9..e4af8e2326e2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt @@ -646,7 +646,8 @@ class MySiteFragment : Fragment(R.layout.my_site_fragment), is SiteNavigationAction.OpenThemes -> ActivityLauncher.viewCurrentBlogThemes(activity, action.site) is SiteNavigationAction.OpenPlugins -> ActivityLauncher.viewPluginBrowser(activity, action.site) is SiteNavigationAction.OpenMedia -> ActivityLauncher.viewCurrentBlogMedia(activity, action.site) - is SiteNavigationAction.OpenMore -> ActivityLauncher.viewQuickLinkMoreMenu(activity, action.site) + // is SiteNavigationAction.OpenMore -> ActivityLauncher.viewQuickLinkMoreMenu(activity, action.site) + is SiteNavigationAction.OpenMore -> activityNavigator.openUnifiedMySiteMenu(requireActivity()) is SiteNavigationAction.OpenUnifiedComments -> ActivityLauncher.viewUnifiedComments(activity, action.site) is SiteNavigationAction.OpenStats -> ActivityLauncher.viewBlogStats(activity, action.site) is SiteNavigationAction.ConnectJetpackForStats -> From feafd586c5f93df0e7964a225ad6b1c6373a266a Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Sun, 24 Sep 2023 15:07:06 -0400 Subject: [PATCH 12/22] [WIP] Initial implementation of the unified my site menu activity --- .../ui/mysite/UnifiedMySiteMenuActivity.kt | 305 ++++++++++++++++++ 1 file changed, 305 insertions(+) create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt new file mode 100644 index 000000000000..6db145232900 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt @@ -0,0 +1,305 @@ +package org.wordpress.android.ui.mysite + +import android.annotation.SuppressLint +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.viewModels +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Scaffold +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView +import dagger.hilt.android.AndroidEntryPoint +import org.wordpress.android.R +import org.wordpress.android.ui.ActivityLauncher +import org.wordpress.android.ui.ActivityNavigator +import org.wordpress.android.ui.compose.components.MainTopAppBar +import org.wordpress.android.ui.compose.components.NavigationIcons +import org.wordpress.android.ui.compose.theme.AppTheme +import org.wordpress.android.ui.utils.ListItemInteraction +import org.wordpress.android.ui.utils.UiString +import javax.inject.Inject + +@AndroidEntryPoint +class UnifiedMySiteMenuActivity : ComponentActivity() { + @Inject + lateinit var activityNavigator: ActivityNavigator + private val viewModel: UnifiedMenuViewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initObservers() + setContent { + AppTheme { + viewModel.start() + UnifiedMenuScreen() + } + } + } + + private fun initObservers() { + viewModel.navigation.observe(this) { handleNavigationAction(it.getContentIfNotHandled()) } + } + + + @Suppress("ComplexMethod", "LongMethod") + private fun handleNavigationAction(action: SiteNavigationAction?) { + Log.i(javaClass.simpleName, "***=> handleNavigationAction") + when (action) { + is SiteNavigationAction.OpenActivityLog -> ActivityLauncher.viewActivityLogList(this, action.site) + is SiteNavigationAction.OpenBackup -> ActivityLauncher.viewBackupList(this, action.site) + is SiteNavigationAction.OpenScan -> ActivityLauncher.viewScan(this, action.site) + is SiteNavigationAction.OpenPlan -> ActivityLauncher.viewBlogPlans(this, action.site) + is SiteNavigationAction.OpenPosts -> ActivityLauncher.viewCurrentBlogPosts(this, action.site) + is SiteNavigationAction.OpenPages -> ActivityLauncher.viewCurrentBlogPages(this, action.site) + is SiteNavigationAction.OpenAdmin -> ActivityLauncher.viewBlogAdmin(this, action.site) + is SiteNavigationAction.OpenPeople -> ActivityLauncher.viewCurrentBlogPeople(this, action.site) + is SiteNavigationAction.OpenSharing -> ActivityLauncher.viewBlogSharing(this, action.site) + is SiteNavigationAction.OpenSiteSettings -> ActivityLauncher.viewBlogSettingsForResult(this, action.site) + is SiteNavigationAction.OpenThemes -> ActivityLauncher.viewCurrentBlogThemes(this, action.site) + is SiteNavigationAction.OpenPlugins -> ActivityLauncher.viewPluginBrowser(this, action.site) + is SiteNavigationAction.OpenMedia -> ActivityLauncher.viewCurrentBlogMedia(this, action.site) + is SiteNavigationAction.OpenMeScreen -> ActivityLauncher.viewMeActivityForResult(this) + is SiteNavigationAction.OpenUnifiedComments -> ActivityLauncher.viewUnifiedComments(this, action.site) + is SiteNavigationAction.OpenStats -> ActivityLauncher.viewBlogStats(this, action.site) + is SiteNavigationAction.OpenDomains -> ActivityLauncher.viewDomainsDashboardActivity( + this, + action.site + ) + is SiteNavigationAction.OpenCampaignListingPage -> activityNavigator.navigateToCampaignListingPage( + this, + action.campaignListingPageSource + ) + else -> {} + } + } + + @Composable + @SuppressLint("UnusedMaterialScaffoldPaddingParameter") + fun UnifiedMenuScreen() { + val uiState by viewModel.uiState.collectAsState() + + Scaffold( + topBar = { + MainTopAppBar( + title = stringResource(id = R.string.my_site_section_screen_title), + navigationIcon = NavigationIcons.BackIcon, + onNavigationIconClick = onBackPressedDispatcher::onBackPressed, + ) + }, + content = { + UnifiedMenuContent(uiState) + } + ) + } + + @Composable + fun UnifiedMenuContent(uiState: UnifiedMenuViewState) { + LazyColumn { + items(uiState.items) { viewState -> + when (viewState) { + is MySiteCardAndItem.Item.ListItem -> MySiteListItem(viewState) + is MySiteCardAndItem.Item.CategoryHeaderItem -> MySiteListItemHeader(viewState) + is MySiteCardAndItem.Item.CategoryEmptyHeaderItem -> MySiteListItemEmptyHeader() + else -> { + } + } + } + } + } + + @Composable + fun MySiteListItemHeader(headerItem: MySiteCardAndItem.Item.CategoryHeaderItem) { + val title = when (headerItem.title) { + is UiString.UiStringRes -> stringResource(id = headerItem.title.stringRes) + is UiString.UiStringText -> headerItem.title.text.toString() + is UiString.UiStringPluralRes -> TODO() + is UiString.UiStringResWithParams -> TODO() + } + Text( + modifier = Modifier.padding(16.dp), + text = title) + } + + @Composable + fun MySiteListItemEmptyHeader() { + // todo: this is just a spacer - could just use a spacer + Text( + modifier = Modifier.padding(16.dp), + text = "" + ) + } + + @Composable + fun MySiteListItem(item: MySiteCardAndItem.Item.ListItem) { + Row( + modifier = Modifier + .fillMaxWidth() + .wrapContentSize() + .padding(vertical = 8.dp) + .clickable { item.onClick.click() }, + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + painter = painterResource(id = item.primaryIcon), + contentDescription = null, // Add appropriate content description + contentScale = ContentScale.Fit, + modifier = Modifier + .size(24.dp) + .padding(end = 8.dp), + colorFilter = if (item.disablePrimaryIconTint) null else ColorFilter.tint(MaterialTheme.colors.onSurface) + ) + + Text( + text = stringResource(id = (item.primaryText as UiString.UiStringRes).stringRes), + modifier = Modifier + .weight(1f) + .padding(end = 8.dp) + ) + Spacer(modifier = Modifier.height(8.dp)) + + // todo: eventually we can take uiStringRes out of the state, but for now it's shared, so leave it + if (item.secondaryText != null) { + val secondaryStringResourceText = when (item.secondaryText) { + is UiString.UiStringRes -> stringResource(id = item.secondaryText.stringRes) + is UiString.UiStringText -> item.secondaryText.text.toString() + is UiString.UiStringPluralRes -> TODO() + is UiString.UiStringResWithParams -> TODO() + } + Text( + text = secondaryStringResourceText, + modifier = Modifier + .weight(1f) + .padding(end = 8.dp), + ) + } + + if (item.secondaryIcon != null) { + Image( + painter = painterResource(id = item.secondaryIcon), + contentDescription = null, // Add appropriate content description + contentScale = ContentScale.Fit, + modifier = Modifier + .size(24.dp) + .padding(end = 8.dp), + colorFilter = ColorFilter.tint(MaterialTheme.colors.onSurface) + ) + } + + if (item.showFocusPoint) { + AndroidView( + factory = { context -> + val view = ComposeView(context) + view.setContent { + CustomXMLWidgetView() + } + view + }, + modifier = Modifier.padding(16.dp) + ) + } + } + } + + @Composable + fun CustomXMLWidgetView() { + // Load the custom XML widget using AndroidView + AndroidView( + factory = { context -> + // Inflate the custom XML layout + val inflater = LayoutInflater.from(context) + val parent: ViewGroup? = null + val view = inflater.inflate(R.layout.quick_start_focus_point, parent, false) + view + }, + modifier = Modifier.wrapContentSize(Alignment.Center) + ) + } + + @Preview + @Composable + fun MySiteListItemPreviewBase() { + val onClick = remember { {} } + MySiteListItem( + MySiteCardAndItem.Item.ListItem( + primaryIcon = R.drawable.ic_posts_white_24dp, + primaryText = UiString.UiStringText("Blog Posts"), + secondaryIcon = null, + secondaryText = null, + showFocusPoint = false, + onClick = ListItemInteraction.create { onClick() }) + ) + } + + @Preview + @Composable + fun MySiteListItemPreviewWithFocusPoint() { + val onClick = remember { {} } + MySiteListItem( + MySiteCardAndItem.Item.ListItem( + primaryIcon = R.drawable.ic_posts_white_24dp, + primaryText = UiString.UiStringText("Blog Posts"), + secondaryIcon = null, + secondaryText = null, + showFocusPoint = true, + onClick = ListItemInteraction.create { onClick() }) + ) + } + + @Preview + @Composable + fun MySiteListItemPreviewWithSecondaryText() { + val onClick = remember { {} } + MySiteListItem( + MySiteCardAndItem.Item.ListItem( + primaryIcon = R.drawable.ic_posts_white_24dp, + primaryText = UiString.UiStringText("Plans"), + secondaryIcon = null, + secondaryText = UiString.UiStringText("Basic"), + showFocusPoint = false, + onClick = ListItemInteraction.create { onClick() }) + ) + } + + @Preview + @Composable + fun MySiteListItemPreviewWithSecondaryImage() { + val onClick = remember { {} } + MySiteListItem( + MySiteCardAndItem.Item.ListItem( + primaryIcon = R.drawable.ic_posts_white_24dp, + primaryText = UiString.UiStringText("Plans"), + secondaryIcon = R.drawable.ic_story_icon_24dp, + secondaryText = null, + showFocusPoint = false, + onClick = ListItemInteraction.create { onClick() }) + ) + } +} From 098614140d491692a497dc8247427f6011cd3892 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Sun, 24 Sep 2023 15:08:06 -0400 Subject: [PATCH 13/22] [WIP] Initial implementation of the unified my site menu view model --- .../android/ui/mysite/UnifiedMenuViewModel.kt | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMenuViewModel.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMenuViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMenuViewModel.kt new file mode 100644 index 000000000000..06576d8a1896 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMenuViewModel.kt @@ -0,0 +1,88 @@ +package org.wordpress.android.ui.mysite + +import android.util.Log +import androidx.lifecycle.MutableLiveData +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import org.wordpress.android.fluxc.model.SiteModel +import org.wordpress.android.modules.BG_THREAD +import org.wordpress.android.ui.jetpack.JetpackCapabilitiesUseCase +import org.wordpress.android.ui.mysite.items.listitem.SiteItemsBuilder +import org.wordpress.android.ui.mysite.items.listitem.SiteItemsViewModelSlice +import org.wordpress.android.ui.mysite.tabs.MySiteTabType +import javax.inject.Inject +import org.wordpress.android.util.merge +import org.wordpress.android.viewmodel.Event +import org.wordpress.android.viewmodel.ScopedViewModel +import javax.inject.Named + +data class UnifiedMenuViewState( + val items: List // cards and or items +) + +@HiltViewModel +class UnifiedMenuViewModel @Inject constructor( + private val selectedSiteRepository: SelectedSiteRepository, + @param:Named(BG_THREAD) private val bgDispatcher: CoroutineDispatcher, + private val siteItemsBuilder: SiteItemsBuilder, + private val siteItemsViewModelSlice: SiteItemsViewModelSlice, + private val jetpackCapabilitiesUseCase: JetpackCapabilitiesUseCase +) : ScopedViewModel(bgDispatcher) { + // todo: This is a placeholder; I would like to pass along the siteNavigationAction as a channel +// private val _actionEvents = Channel>(Channel.BUFFERED) +// val actionEvents = _actionEvents.receiveAsFlow() + + private val _onNavigation = MutableLiveData>() + val navigation = merge(_onNavigation, siteItemsViewModelSlice.onNavigation) + + private val _uiState = MutableStateFlow(UnifiedMenuViewState(items = emptyList())) + + val uiState: StateFlow = _uiState + + fun start() { + val site = selectedSiteRepository.getSelectedSite()!! + buildSiteMenu(site) + } + + private fun buildSiteMenu(site: SiteModel) { + _uiState.value = UnifiedMenuViewState( + items = siteItemsBuilder.build( + siteItemsViewModelSlice.buildItems( + defaultTab = MySiteTabType.SITE_MENU, + site = site, + activeTask = null, + backupAvailable = false, + scanAvailable = false + ) + ) + ) + updateSiteItemsForJetpackCapabilities(site) + } + + private fun updateSiteItemsForJetpackCapabilities(site: SiteModel) { + launch(bgDispatcher) { + jetpackCapabilitiesUseCase.getJetpackPurchasedProducts(site.siteId).collect { + Log.i(javaClass.simpleName, "***=> jp capabilities updated") + _uiState.value = UnifiedMenuViewState( + items = siteItemsBuilder.build( + siteItemsViewModelSlice.buildItems( + defaultTab = MySiteTabType.SITE_MENU, + site = site, + activeTask = null, + backupAvailable = it.backup, + scanAvailable = (it.scan && !site.isWPCom && !site.isWPComAtomic) + ) + ) + ) + } // end collect + } + } + + override fun onCleared() { + Log.i(javaClass.simpleName, "**=> onCleared()") + jetpackCapabilitiesUseCase.clear() + super.onCleared() + } +} From a4a56e55549a2f836e1e0e070f170b07457a88d6 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Sun, 24 Sep 2023 15:13:37 -0400 Subject: [PATCH 14/22] Refactor: rename view model to include MySite to match the activity --- .../wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt | 2 +- .../{UnifiedMenuViewModel.kt => UnifiedMySiteMenuViewModel.kt} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename WordPress/src/main/java/org/wordpress/android/ui/mysite/{UnifiedMenuViewModel.kt => UnifiedMySiteMenuViewModel.kt} (98%) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt index 6db145232900..0e0e717a1e20 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt @@ -51,7 +51,7 @@ import javax.inject.Inject class UnifiedMySiteMenuActivity : ComponentActivity() { @Inject lateinit var activityNavigator: ActivityNavigator - private val viewModel: UnifiedMenuViewModel by viewModels() + private val viewModel: UnifiedMySiteMenuViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMenuViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt similarity index 98% rename from WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMenuViewModel.kt rename to WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt index 06576d8a1896..649d06d9238a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMenuViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt @@ -23,7 +23,7 @@ data class UnifiedMenuViewState( ) @HiltViewModel -class UnifiedMenuViewModel @Inject constructor( +class UnifiedMySiteMenuViewModel @Inject constructor( private val selectedSiteRepository: SelectedSiteRepository, @param:Named(BG_THREAD) private val bgDispatcher: CoroutineDispatcher, private val siteItemsBuilder: SiteItemsBuilder, From 521b7135283d89c85bea5360578a4d731a272ef9 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Sun, 24 Sep 2023 16:26:09 -0400 Subject: [PATCH 15/22] [WIP] First styling pass --- .../ui/mysite/UnifiedMySiteMenuActivity.kt | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt index 0e0e717a1e20..e5bd1bf9d022 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt @@ -10,6 +10,7 @@ import androidx.activity.compose.setContent import androidx.activity.viewModels import androidx.compose.foundation.Image import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth @@ -19,6 +20,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.material.ContentAlpha import androidx.compose.material.MaterialTheme import androidx.compose.material.Scaffold import androidx.compose.material.Text @@ -33,8 +35,10 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.compose.ui.viewinterop.AndroidView import dagger.hilt.android.AndroidEntryPoint import org.wordpress.android.R @@ -122,7 +126,12 @@ class UnifiedMySiteMenuActivity : ComponentActivity() { @Composable fun UnifiedMenuContent(uiState: UnifiedMenuViewState) { - LazyColumn { + LazyColumn( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { items(uiState.items) { viewState -> when (viewState) { is MySiteCardAndItem.Item.ListItem -> MySiteListItem(viewState) @@ -144,7 +153,7 @@ class UnifiedMySiteMenuActivity : ComponentActivity() { is UiString.UiStringResWithParams -> TODO() } Text( - modifier = Modifier.padding(16.dp), + modifier = Modifier.padding(8.dp), text = title) } @@ -152,7 +161,7 @@ class UnifiedMySiteMenuActivity : ComponentActivity() { fun MySiteListItemEmptyHeader() { // todo: this is just a spacer - could just use a spacer Text( - modifier = Modifier.padding(16.dp), + modifier = Modifier.padding(8.dp), text = "" ) } @@ -163,7 +172,7 @@ class UnifiedMySiteMenuActivity : ComponentActivity() { modifier = Modifier .fillMaxWidth() .wrapContentSize() - .padding(vertical = 8.dp) + .padding(vertical = 8.dp, horizontal = 8.dp) .clickable { item.onClick.click() }, verticalAlignment = Alignment.CenterVertically, ) { @@ -179,11 +188,14 @@ class UnifiedMySiteMenuActivity : ComponentActivity() { Text( text = stringResource(id = (item.primaryText as UiString.UiStringRes).stringRes), + fontSize = 16.sp, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium), modifier = Modifier .weight(1f) - .padding(end = 8.dp) + .padding(end = 8.dp), ) - Spacer(modifier = Modifier.height(8.dp)) + Spacer(modifier = Modifier.height(4.dp)) // todo: eventually we can take uiStringRes out of the state, but for now it's shared, so leave it if (item.secondaryText != null) { @@ -195,6 +207,9 @@ class UnifiedMySiteMenuActivity : ComponentActivity() { } Text( text = secondaryStringResourceText, + fontSize = 12.sp, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium), modifier = Modifier .weight(1f) .padding(end = 8.dp), From 25b3bd175a638f3da977607cbbb23b2eb4d4da42 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Sun, 24 Sep 2023 16:32:56 -0400 Subject: [PATCH 16/22] Refactor: Use spacer for empty category header --- .../android/ui/mysite/UnifiedMySiteMenuActivity.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt index e5bd1bf9d022..f8bf422b3b65 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt @@ -154,16 +154,15 @@ class UnifiedMySiteMenuActivity : ComponentActivity() { } Text( modifier = Modifier.padding(8.dp), + fontSize = 14.sp, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium), text = title) } @Composable fun MySiteListItemEmptyHeader() { - // todo: this is just a spacer - could just use a spacer - Text( - modifier = Modifier.padding(8.dp), - text = "" - ) + Spacer(modifier = Modifier.height(4.dp)) } @Composable From 370ddcc1b327aced9e54b801defd410a0f8f4f32 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Sun, 24 Sep 2023 16:44:29 -0400 Subject: [PATCH 17/22] Remove some log lines and comments --- .../android/ui/mysite/UnifiedMySiteMenuViewModel.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt index 649d06d9238a..d1a6d072bc53 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt @@ -30,10 +30,6 @@ class UnifiedMySiteMenuViewModel @Inject constructor( private val siteItemsViewModelSlice: SiteItemsViewModelSlice, private val jetpackCapabilitiesUseCase: JetpackCapabilitiesUseCase ) : ScopedViewModel(bgDispatcher) { - // todo: This is a placeholder; I would like to pass along the siteNavigationAction as a channel -// private val _actionEvents = Channel>(Channel.BUFFERED) -// val actionEvents = _actionEvents.receiveAsFlow() - private val _onNavigation = MutableLiveData>() val navigation = merge(_onNavigation, siteItemsViewModelSlice.onNavigation) @@ -64,7 +60,6 @@ class UnifiedMySiteMenuViewModel @Inject constructor( private fun updateSiteItemsForJetpackCapabilities(site: SiteModel) { launch(bgDispatcher) { jetpackCapabilitiesUseCase.getJetpackPurchasedProducts(site.siteId).collect { - Log.i(javaClass.simpleName, "***=> jp capabilities updated") _uiState.value = UnifiedMenuViewState( items = siteItemsBuilder.build( siteItemsViewModelSlice.buildItems( @@ -81,7 +76,6 @@ class UnifiedMySiteMenuViewModel @Inject constructor( } override fun onCleared() { - Log.i(javaClass.simpleName, "**=> onCleared()") jetpackCapabilitiesUseCase.clear() super.onCleared() } From dddc46aec0478cf8d4c96fde79d1872774f956e5 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Sun, 24 Sep 2023 16:45:32 -0400 Subject: [PATCH 18/22] Remove unused import statement --- .../wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt index d1a6d072bc53..902bfa3ade24 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt @@ -1,6 +1,5 @@ package org.wordpress.android.ui.mysite -import android.util.Log import androidx.lifecycle.MutableLiveData import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineDispatcher From 95e11bb15e7ac2f9806f666a2ec1f498d3461786 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Mon, 25 Sep 2023 08:01:27 -0400 Subject: [PATCH 19/22] Fix detekt long line: --- .../wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt index f8bf422b3b65..dc1f412b59b3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt @@ -182,7 +182,8 @@ class UnifiedMySiteMenuActivity : ComponentActivity() { modifier = Modifier .size(24.dp) .padding(end = 8.dp), - colorFilter = if (item.disablePrimaryIconTint) null else ColorFilter.tint(MaterialTheme.colors.onSurface) + colorFilter = + if (item.disablePrimaryIconTint) null else ColorFilter.tint(MaterialTheme.colors.onSurface) ) Text( From cacf085d833596189823b360d564a89400c89c00 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Mon, 25 Sep 2023 09:10:39 -0400 Subject: [PATCH 20/22] Refactor: Rename the UnifiedMySiteMenu classes to drop the Unified and MySite words and move to a separate package under MySite --- WordPress/src/main/AndroidManifest.xml | 2 +- .../wordpress/android/ui/ActivityNavigator.kt | 4 ++-- .../MenuActivity.kt} | 16 ++++++++-------- .../MenuViewModel.kt} | 17 ++++++++++------- 4 files changed, 21 insertions(+), 18 deletions(-) rename WordPress/src/main/java/org/wordpress/android/ui/mysite/{UnifiedMySiteMenuActivity.kt => menu/MenuActivity.kt} (96%) rename WordPress/src/main/java/org/wordpress/android/ui/mysite/{UnifiedMySiteMenuViewModel.kt => menu/MenuViewModel.kt} (84%) diff --git a/WordPress/src/main/AndroidManifest.xml b/WordPress/src/main/AndroidManifest.xml index e8c210870ba4..c5342da71614 100644 --- a/WordPress/src/main/AndroidManifest.xml +++ b/WordPress/src/main/AndroidManifest.xml @@ -103,7 +103,7 @@ android:exported="false" /> diff --git a/WordPress/src/main/java/org/wordpress/android/ui/ActivityNavigator.kt b/WordPress/src/main/java/org/wordpress/android/ui/ActivityNavigator.kt index cd63cbc38a16..b94444b707de 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/ActivityNavigator.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/ActivityNavigator.kt @@ -11,7 +11,7 @@ import org.wordpress.android.ui.blaze.blazecampaigns.campaignlisting.CampaignLis import org.wordpress.android.ui.blaze.blazepromote.ARG_BLAZE_FLOW_SOURCE import org.wordpress.android.ui.blaze.blazepromote.ARG_BLAZE_SHOULD_SHOW_OVERLAY import org.wordpress.android.ui.blaze.blazepromote.BlazePromoteParentActivity -import org.wordpress.android.ui.mysite.UnifiedMySiteMenuActivity +import org.wordpress.android.ui.mysite.menu.MenuActivity import org.wordpress.android.ui.mysite.personalization.PersonalizationActivity import javax.inject.Inject import javax.inject.Singleton @@ -67,6 +67,6 @@ class ActivityNavigator @Inject constructor() { } fun openUnifiedMySiteMenu(context: Context) { - context.startActivity(Intent(context, UnifiedMySiteMenuActivity::class.java)) + context.startActivity(Intent(context, MenuActivity::class.java)) } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/menu/MenuActivity.kt similarity index 96% rename from WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt rename to WordPress/src/main/java/org/wordpress/android/ui/mysite/menu/MenuActivity.kt index dc1f412b59b3..2d871b077acb 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/menu/MenuActivity.kt @@ -1,8 +1,7 @@ -package org.wordpress.android.ui.mysite +package org.wordpress.android.ui.mysite.menu import android.annotation.SuppressLint import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.ViewGroup import androidx.activity.ComponentActivity @@ -47,15 +46,17 @@ import org.wordpress.android.ui.ActivityNavigator import org.wordpress.android.ui.compose.components.MainTopAppBar import org.wordpress.android.ui.compose.components.NavigationIcons import org.wordpress.android.ui.compose.theme.AppTheme +import org.wordpress.android.ui.mysite.MySiteCardAndItem +import org.wordpress.android.ui.mysite.SiteNavigationAction import org.wordpress.android.ui.utils.ListItemInteraction import org.wordpress.android.ui.utils.UiString import javax.inject.Inject @AndroidEntryPoint -class UnifiedMySiteMenuActivity : ComponentActivity() { +class MenuActivity : ComponentActivity() { @Inject lateinit var activityNavigator: ActivityNavigator - private val viewModel: UnifiedMySiteMenuViewModel by viewModels() + private val viewModel: MenuViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -75,7 +76,6 @@ class UnifiedMySiteMenuActivity : ComponentActivity() { @Suppress("ComplexMethod", "LongMethod") private fun handleNavigationAction(action: SiteNavigationAction?) { - Log.i(javaClass.simpleName, "***=> handleNavigationAction") when (action) { is SiteNavigationAction.OpenActivityLog -> ActivityLauncher.viewActivityLogList(this, action.site) is SiteNavigationAction.OpenBackup -> ActivityLauncher.viewBackupList(this, action.site) @@ -125,7 +125,7 @@ class UnifiedMySiteMenuActivity : ComponentActivity() { } @Composable - fun UnifiedMenuContent(uiState: UnifiedMenuViewState) { + fun UnifiedMenuContent(uiState: MenuViewState) { LazyColumn( modifier = Modifier .fillMaxWidth() @@ -264,8 +264,8 @@ class UnifiedMySiteMenuActivity : ComponentActivity() { val onClick = remember { {} } MySiteListItem( MySiteCardAndItem.Item.ListItem( - primaryIcon = R.drawable.ic_posts_white_24dp, - primaryText = UiString.UiStringText("Blog Posts"), + primaryIcon = R.drawable.ic_posts_white_24dp, + primaryText = UiString.UiStringText("Blog Posts"), secondaryIcon = null, secondaryText = null, showFocusPoint = false, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/menu/MenuViewModel.kt similarity index 84% rename from WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt rename to WordPress/src/main/java/org/wordpress/android/ui/mysite/menu/MenuViewModel.kt index 902bfa3ade24..cfc32f47d311 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/UnifiedMySiteMenuViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/menu/MenuViewModel.kt @@ -1,4 +1,4 @@ -package org.wordpress.android.ui.mysite +package org.wordpress.android.ui.mysite.menu import androidx.lifecycle.MutableLiveData import dagger.hilt.android.lifecycle.HiltViewModel @@ -8,6 +8,9 @@ import kotlinx.coroutines.flow.StateFlow import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.modules.BG_THREAD import org.wordpress.android.ui.jetpack.JetpackCapabilitiesUseCase +import org.wordpress.android.ui.mysite.MySiteCardAndItem +import org.wordpress.android.ui.mysite.SelectedSiteRepository +import org.wordpress.android.ui.mysite.SiteNavigationAction import org.wordpress.android.ui.mysite.items.listitem.SiteItemsBuilder import org.wordpress.android.ui.mysite.items.listitem.SiteItemsViewModelSlice import org.wordpress.android.ui.mysite.tabs.MySiteTabType @@ -17,12 +20,12 @@ import org.wordpress.android.viewmodel.Event import org.wordpress.android.viewmodel.ScopedViewModel import javax.inject.Named -data class UnifiedMenuViewState( +data class MenuViewState( val items: List // cards and or items ) @HiltViewModel -class UnifiedMySiteMenuViewModel @Inject constructor( +class MenuViewModel @Inject constructor( private val selectedSiteRepository: SelectedSiteRepository, @param:Named(BG_THREAD) private val bgDispatcher: CoroutineDispatcher, private val siteItemsBuilder: SiteItemsBuilder, @@ -32,9 +35,9 @@ class UnifiedMySiteMenuViewModel @Inject constructor( private val _onNavigation = MutableLiveData>() val navigation = merge(_onNavigation, siteItemsViewModelSlice.onNavigation) - private val _uiState = MutableStateFlow(UnifiedMenuViewState(items = emptyList())) + private val _uiState = MutableStateFlow(MenuViewState(items = emptyList())) - val uiState: StateFlow = _uiState + val uiState: StateFlow = _uiState fun start() { val site = selectedSiteRepository.getSelectedSite()!! @@ -42,7 +45,7 @@ class UnifiedMySiteMenuViewModel @Inject constructor( } private fun buildSiteMenu(site: SiteModel) { - _uiState.value = UnifiedMenuViewState( + _uiState.value = MenuViewState( items = siteItemsBuilder.build( siteItemsViewModelSlice.buildItems( defaultTab = MySiteTabType.SITE_MENU, @@ -59,7 +62,7 @@ class UnifiedMySiteMenuViewModel @Inject constructor( private fun updateSiteItemsForJetpackCapabilities(site: SiteModel) { launch(bgDispatcher) { jetpackCapabilitiesUseCase.getJetpackPurchasedProducts(site.siteId).collect { - _uiState.value = UnifiedMenuViewState( + _uiState.value = MenuViewState( items = siteItemsBuilder.build( siteItemsViewModelSlice.buildItems( defaultTab = MySiteTabType.SITE_MENU, From 3604177766fa7876a2dd73ce617884c2430decc3 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Mon, 25 Sep 2023 10:37:18 -0400 Subject: [PATCH 21/22] Remove test related to default tab pref --- .../android/ui/mysite/MySiteViewModelTest.kt | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/ui/mysite/MySiteViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/mysite/MySiteViewModelTest.kt index 3948b59c4f97..d6656e65643d 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/mysite/MySiteViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/mysite/MySiteViewModelTest.kt @@ -654,22 +654,6 @@ class MySiteViewModelTest : BaseUnitTest() { .containsOnly(TabNavigation(viewModel.orderedTabTypes.indexOf(MySiteTabType.SITE_MENU), false)) } - /* CREATE SITE - DEFAULT TAB */ - - @Test - fun `given tabs enabled, when site is created, then default tab is set`() { - initSelectedSite( - isMySiteTabsBuildConfigEnabled = true, - initialScreen = MySiteTabType.SITE_MENU.label - ) - - assertThat(tabNavigation).size().isEqualTo(2) - /* First time default tab is set when My Site screen is shown and site is selected. - When site is created then again it sets the default tab. */ - assertThat(tabNavigation.last()) - .isEqualTo(TabNavigation(viewModel.orderedTabTypes.indexOf(MySiteTabType.SITE_MENU), false)) - } - /* AVATAR */ @Test From 22d70df4277086d405dbe27b230c097eb4879141 Mon Sep 17 00:00:00 2001 From: Ajesh R Pai Date: Tue, 26 Sep 2023 11:43:31 +0530 Subject: [PATCH 22/22] - Removes: the unified naming from compose views --- .../org/wordpress/android/ui/mysite/menu/MenuActivity.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/menu/MenuActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/menu/MenuActivity.kt index 2d871b077acb..cef351a4e474 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/menu/MenuActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/menu/MenuActivity.kt @@ -64,7 +64,7 @@ class MenuActivity : ComponentActivity() { setContent { AppTheme { viewModel.start() - UnifiedMenuScreen() + MenuScreen() } } } @@ -107,7 +107,7 @@ class MenuActivity : ComponentActivity() { @Composable @SuppressLint("UnusedMaterialScaffoldPaddingParameter") - fun UnifiedMenuScreen() { + fun MenuScreen() { val uiState by viewModel.uiState.collectAsState() Scaffold( @@ -119,13 +119,13 @@ class MenuActivity : ComponentActivity() { ) }, content = { - UnifiedMenuContent(uiState) + MenuContent(uiState) } ) } @Composable - fun UnifiedMenuContent(uiState: MenuViewState) { + fun MenuContent(uiState: MenuViewState) { LazyColumn( modifier = Modifier .fillMaxWidth()